ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOGE5YWYKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNjYgQEAKKy9idWlsZAorL3NvdXJjZS9idWlsZAorKi5tb2RlMXYzCisqLnBieHVzZXIKKyoucGJ4aW5kZXgvCishdXNlci5wYnh1c2VyCisvKi5sb2cKKyoudXNlcgorKi5uY2IKKyouc3VvCisqLnBkYgorKi5wZGYKKyouaHRtbAorKi5pZGIKKyoubworKi5sbworKi5hCisqLnNvCisqLnNvLjAKKyoubGEKKy5kZXBzCisubGlicworKi5weWMKKy5EU19TdG9yZQorIyBFbWFjcyBhbmQgb3RoZXIgZWRpdG9yIGJhY2t1cCBmaWxlcworKn4KKworIyBidWlsZHMgb24gV2luZG93cworRGVidWcvCitSZWxlYXNlLworcmVsZWFzZS8KKworRGVidWcgTkFTTS8KK1JlbGVhc2UgTkFTTS8KKy9jb25maWcuaAorCisvQUNNL0FEYmcvTWFrZWZpbGUKKy9BQ00vTWFrZWZpbGUKKy9BQ00vZGRrL01ha2VmaWxlCisvQUNNL3Rpbnl4bWwvTWFrZWZpbGUKKy9EbGwvTWFrZWZpbGUKKy9NYWtlZmlsZQorL2NvbmZpZy5sb2cKKy9jb25maWcuc3RhdHVzCisvZGViaWFuL01ha2VmaWxlCisvZG9jL01ha2VmaWxlCisvZG9jL2h0bWwvTWFrZWZpbGUKKy9kb2MvbWFuL01ha2VmaWxlCisvZHNob3cvTWFrZWZpbGUKKy9mcm9udGVuZC9NYWtlZmlsZQorL2luY2x1ZGUvTWFrZWZpbGUKKy9sYW1lLnNwZWMKKy9saWJtcDNsYW1lLy5saWJzLworL2xpYm1wM2xhbWUvTWFrZWZpbGUKKy9saWJtcDNsYW1lL01ha2VmaWxlLmluCisvbGlibXAzbGFtZS9pMzg2L01ha2VmaWxlCisvbGlibXAzbGFtZS92ZWN0b3IvTWFrZWZpbGUKKy9saWJ0b29sCisvbWFjL01ha2VmaWxlCisvbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUKKy9tYWNvc3gvTEFNRS54Y29kZXByb2ovTWFrZWZpbGUKKy9tYWNvc3gvTWFrZWZpbGUKKy9taXNjL01ha2VmaWxlCisvbXBnbGliL01ha2VmaWxlCisvc3RhbXAtaDEKKy94ODYtdW5rbm93bi1saW51eC8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9BQ00vQUNNLmNwcCBiL0FDTS9BQ00uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzVkODgKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vQUNNLmNwcApAQCAtMCwwICsxLDE0MDUgQEAKKy8qKgorICoKKyAqIExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lIGF0IGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisgCisvKiEKKwlcYXV0aG9yIFN0ZXZlIExob21tZQorCVx2ZXJzaW9uIFwkSWQ6IEFDTS5jcHAsdiAxLjIwLjguMSAyMDA4LzExLzAxIDIwOjQxOjQ3IHJvYmVydCBFeHAgJAorKi8KKworI2lmICFkZWZpbmVkKFNUUklDVCkKKyNkZWZpbmUgU1RSSUNUCisjZW5kaWYgLy8gU1RSSUNUCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luZG93c3guaD4KKyNpbmNsdWRlIDxpbnRzaGN1dC5oPgorCisjaW5jbHVkZSA8bW1yZWcuaD4KKyNpbmNsdWRlIDxtc2FjbS5oPgorI2luY2x1ZGUgPG1zYWNtZHJ2Lmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPGxhbWUuaD4KKworI2luY2x1ZGUgImFkZWJ1Zy5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCisjaW5jbHVkZSAiQUNNU3RyZWFtLmgiCisKKyNpZmRlZiBFTkFCTEVfREVDT0RJTkcKKyNpbmNsdWRlICJEZWNvZGVTdHJlYW0uaCIKKyNlbmRpZiAvLyBFTkFCTEVfREVDT0RJTkcKKworI2luY2x1ZGUgIkFDTS5oIgorCisjaWZuZGVmIElEQ19IQU5ECisjZGVmaW5lIElEQ19IQU5EICAgICAgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNjQ5KQorI2VuZGlmIC8vIElEQ19IQU5ECisKK2NoYXIgQUNNOjpWZXJzaW9uU3RyaW5nWzEyMF07CisKK2NvbnN0IGNoYXIgQUNNX1ZFUlNJT05bXSA9ICIwLjkuMiI7CisKKyNpZmRlZiBXSU4zMgorLy8KKy8vICAzMi1iaXQgdmVyc2lvbnMKKy8vCisjaWYgKFdJTlZFUiA+PSAweDA0MDApCisgI2RlZmluZSBWRVJTSU9OX0FDTV9EUklWRVIgIE1BS0VfQUNNX1ZFUlNJT04oNCwgIDAsIDApCisjZWxzZQorI2RlZmluZSBWRVJTSU9OX0FDTV9EUklWRVIgIE1BS0VfQUNNX1ZFUlNJT04oMywgNTEsIDApCisjZW5kaWYKKyNkZWZpbmUgVkVSU0lPTl9NU0FDTSBNQUtFX0FDTV9WRVJTSU9OKDMsIDUwLCAwKQorCisjZWxzZQorLy8KKy8vICAxNi1iaXQgdmVyc2lvbnMKKy8vCisjZGVmaW5lIFZFUlNJT05fQUNNX0RSSVZFUiBNQUtFX0FDTV9WRVJTSU9OKDEsIDAsIDApCisjZGVmaW5lIFZFUlNJT05fTVNBQ00gTUFLRV9BQ01fVkVSU0lPTigyLCAxLCAwKQorCisjZW5kaWYKKworI2RlZmluZSBQRVJTT05BTF9GT1JNQVQgV0FWRV9GT1JNQVRfTVBFR0xBWUVSMworI2RlZmluZSBTSVpFX0ZPUk1BVF9TVFJVQ1Qgc2l6ZW9mKE1QRUdMQVlFUjNXQVZFRk9STUFUKQorLy8jZGVmaW5lIFNJWkVfRk9STUFUX1NUUlVDVCAwCisKKy8vc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbF9tb2RlW11bMTNdID0geyJtb25vIiwic3RlcmVvIiwiam9pbnQgc3RlcmVvIiwiZHVhbCBjaGFubmVsIn07CitzdGF0aWMgY29uc3QgY2hhciBjaGFubmVsX21vZGVbXVsxM10gPSB7Im1vbm8iLCJzdGVyZW8ifTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXBlZzFfZnJlcVtdID0gezQ4MDAwLDQ0MTAwLDMyMDAwfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXBlZzJfZnJlcVtdID0gezI0MDAwLDIyMDUwLDE2MDAwLDEyMDAwLDExMDI1LDgwMDB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtcGVnMV9iaXRyYXRlW10gPSB7MzIwLCAyNTYsIDIyNCwgMTkyLCAxNjAsIDEyOCwgMTEyLCA5NiwgODAsIDY0LCA1NiwgNDgsIDQwLCAzMn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1wZWcyX2JpdHJhdGVbXSA9IHsxNjAsIDE0NCwgMTI4LCAxMTIsICA5NiwgIDgwLCAgNjQsIDU2LCA0OCwgNDAsIDMyLCAyNCwgMTYsICA4fTsKKworI2RlZmluZSBTSVpFX0NIQU5ORUxfTU9ERSAoc2l6ZW9mKGNoYW5uZWxfbW9kZSkgIC8gKHNpemVvZihjaGFyKSAqIDEzKSkKKyNkZWZpbmUgU0laRV9GUkVRX01QRUcxIChzaXplb2YobXBlZzFfZnJlcSkgICAgLyBzaXplb2YodW5zaWduZWQgaW50KSkKKyNkZWZpbmUgU0laRV9GUkVRX01QRUcyIChzaXplb2YobXBlZzJfZnJlcSkgICAgLyBzaXplb2YodW5zaWduZWQgaW50KSkKKyNkZWZpbmUgU0laRV9CSVRSQVRFX01QRUcxIChzaXplb2YobXBlZzFfYml0cmF0ZSkgLyBzaXplb2YodW5zaWduZWQgaW50KSkKKyNkZWZpbmUgU0laRV9CSVRSQVRFX01QRUcyIChzaXplb2YobXBlZzJfYml0cmF0ZSkgLyBzaXplb2YodW5zaWduZWQgaW50KSkKKworc3RhdGljIGNvbnN0IGludCBGT1JNQVRfVEFHX01BWF9OQiA9IDI7IC8vIFBDTSBhbmQgUEVSU09OQUwgKG1hbmRhdG9yeSB0byBoYXZlIGF0IGxlYXN0IFBDTSBhbmQgeW91ciBmb3JtYXQpCitzdGF0aWMgY29uc3QgaW50IEZJTFRFUl9UQUdfTUFYX05CID0gMDsgLy8gdGhpcyBpcyBhIGNvZGVjLCBub3QgYSBmaWx0ZXIKKworLy8gbnVtYmVyIG9mIHN1cHBvcnRlZCBQQ00gZm9ybWF0cworc3RhdGljIGNvbnN0IGludCBGT1JNQVRfTUFYX05CX1BDTSA9CisJMiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBQQ00gY2hhbm5lbCBtb2RlIChzdGVyZW8vbW9ubykKKwkJKFNJWkVfRlJFUV9NUEVHMSArIC8vIG51bWJlciBvZiBNUEVHIDEgc2FtcGxpbmcgZnJlcQorCQlTSVpFX0ZSRVFfTVBFRzIpOyAvLyBudW1iZXIgb2YgTVBFRyAyIHNhbXBsaW5nIGZyZXEKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2Jvb2wgYml0cmF0ZV9pdGVtOjpvcGVyYXRvcjwoY29uc3QgYml0cmF0ZV9pdGVtICYgb3RoZXJfYml0cmF0ZSkgY29uc3QKK3sKKwlyZXR1cm4gKG90aGVyX2JpdHJhdGUuZnJlcXVlbmN5IDwgZnJlcXVlbmN5IHx8CisJCSAgICAob3RoZXJfYml0cmF0ZS5mcmVxdWVuY3kgPT0gZnJlcXVlbmN5ICYmCisJCQkgKG90aGVyX2JpdHJhdGUuYml0cmF0ZSA8IGJpdHJhdGUgfHwKKwkJCSAgKG90aGVyX2JpdHJhdGUuYml0cmF0ZSA9PSBiaXRyYXRlICYmCisJCQkgICAob3RoZXJfYml0cmF0ZS5jaGFubmVscyA8IGNoYW5uZWxzKSkpKSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbmZpZ3VyYXRpb24gRGlhbG9nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorc3RhdGljIENBTExCQUNLIENvbmZpZ1Byb2MoCisgIEhXTkQgaHduZERsZywgIC8vIGhhbmRsZSB0byBkaWFsb2cgYm94CitVSU5UIHVNc2csICAgICAvLyBtZXNzYWdlCitXUEFSQU0gd1BhcmFtLCAvLyBmaXJzdCBtZXNzYWdlIHBhcmFtZXRlcgorTFBBUkFNIGxQYXJhbSAgLy8gc2Vjb25kIG1lc3NhZ2UgcGFyYW1ldGVyCispCit7CisJQk9PTCBiUmVzdWx0OworCisJc3dpdGNoICh1TXNnKSB7CisJCWNhc2UgV01fQ09NTUFORDoKKwkJCVVJTlQgY29tbWFuZDsKKwkJCWNvbW1hbmQgPSBHRVRfV01fQ09NTUFORF9JRCh3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgICBpZiAoSURPSyA9PSBjb21tYW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVuZERpYWxvZyhod25kRGxnLCAoSURPSyA9PSBjb21tYW5kKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKElEQ0FOQ0VMID09IGNvbW1hbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5kRGlhbG9nKGh3bmREbGcsIChJRE9LID09IGNvbW1hbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJSZXN1bHQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYlJlc3VsdCA9IEZBTFNFOyAvLyB3aWxsIGJlIHRyZWF0ZWQgYnkgRGVmV2luZG93UHJvYworfQorCXJldHVybiBiUmVzdWx0OworfQorCisKK2lubGluZSBEV09SRCBBQ006OkNvbmZpZ3VyZShIV05EIGhQYXJlbnRXaW5kb3csIExQRFJWQ09ORklHSU5GTyBwQ29uZmlnKQoreworCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX1NUQVJULCAiQUNNIDogQ29uZmlndXJlIChQYXJlbnQgV2luZG93ID0gMHglMDhYKSIsaFBhcmVudFdpbmRvdyk7CisKKwlEaWFsb2dCb3hQYXJhbSggbXlfaE1vZHVsZSwgTUFLRUlOVFJFU09VUkNFKElERF9DT05GSUcpLCBoUGFyZW50V2luZG93LCA6OkNvbmZpZ1Byb2MgLCAoTFBBUkFNKXRoaXMpOworCisJcmV0dXJuIERSVkNORl9PSzsgLy8gQ2FuIGFsc28gcmV0dXJuCisJCQkJCS8vIERSVkNORl9DQU5DRUwKKwkJCQkJLy8gYW5kIERSVkNORl9SRVNUQVJUCit9CisqLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQWJvdXQgRGlhbG9nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBCT09MIENBTExCQUNLIEFib3V0UHJvYygKKyAgSFdORCBod25kRGxnLCAgLy8gaGFuZGxlIHRvIGRpYWxvZyBib3gKK1VJTlQgdU1zZywgICAgIC8vIG1lc3NhZ2UKK1dQQVJBTSB3UGFyYW0sIC8vIGZpcnN0IG1lc3NhZ2UgcGFyYW1ldGVyCitMUEFSQU0gbFBhcmFtICAvLyBzZWNvbmQgbWVzc2FnZSBwYXJhbWV0ZXIKKykKK3sKKwlzdGF0aWMgSEJSVVNIIGhCcnVzaFN0YXRpYyA9IE5VTEw7CisvLwlzdGF0aWMgTE9HRk9OVCBsZjsgIC8vIHN0cnVjdHVyZSBmb3IgZm9udCBpbmZvcm1hdGlvbiAgCisvLwlzdGF0aWMgSEZPTlQgaGZudDsKKwlzdGF0aWMgSENVUlNPUiBoY092ZXJDdXJzb3IgPSBOVUxMOworCUJPT0wgYlJlc3VsdDsKKworCXN3aXRjaCAodU1zZykgeworCQljYXNlIFdNX0lOSVRESUFMT0c6CisJCQljaGFyIHRtcFsxNTBdOworCQkJd3NwcmludGYodG1wLCJMQU1FIE1QMyBjb2RlYyB2JXMiLCBBQ006OkdldFZlcnNpb25TdHJpbmcoKSk7CisJCQk6OlNldFdpbmRvd1RleHQoR2V0RGxnSXRlbSggaHduZERsZywgSURDX1NUQVRJQ19BQk9VVF9USVRMRSksIHRtcCk7CisKKy8qCisJCQk6OkdldE9iamVjdCg6OkdldFN0b2NrT2JqZWN0KERFRkFVTFRfR1VJX0ZPTlQpLCBzaXplb2YoTE9HRk9OVCksICZsZik7IAorCQkJbGYubGZVbmRlcmxpbmUgPSBUUlVFOworCisJCQloZm50ID0gOjpDcmVhdGVGb250SW5kaXJlY3QoJmxmKTsKKworCQkJOjpTZW5kTWVzc2FnZSg6OkdldERsZ0l0ZW0oaHduZERsZyxJRENfU1RBVElDX0FCT1VUX1VSTCksIFdNX1NFVEZPTlQsIChXUEFSQU0pIGhmbnQsIFRSVUUpOworKiAvCisJCQloQnJ1c2hTdGF0aWMgPSA6OkNyZWF0ZVNvbGlkQnJ1c2goOjpHZXRTeXNDb2xvciAoQ09MT1JfQlRORkFDRSkpOworKi8JCQloY092ZXJDdXJzb3IgPSA6OkxvYWRDdXJzb3IoTlVMTCwoTFBDVFNUUilJRENfSEFORCk7IAorCQkJaWYgKGhjT3ZlckN1cnNvciA9PSBOVUxMKQorCQkJCWhjT3ZlckN1cnNvciA9IDo6TG9hZEN1cnNvcihOVUxMLChMUENUU1RSKUlEQ19DUk9TUyk7IAorCisJCQliUmVzdWx0ID0gVFJVRTsKKwkJCWJyZWFrOworLyoKKwkJY2FzZSBXTV9DVExDT0xPUlNUQVRJQzoKKwkJCS8vLyBcdG9kbyBvbmx5IGlmIHRoZXJlIGFyZSBVUkxzCisJCQlpZiAoKEhXTkQpbFBhcmFtID09IDo6R2V0RGxnSXRlbShod25kRGxnLElEQ19TVEFUSUNfQUJPVVRfVVJMKSkKKwkJCXsKKwkJCQk6OlNldFRleHRDb2xvcigoSERDKXdQYXJhbSwgOjpHZXRTeXNDb2xvciAoQ09MT1JfSElHSExJR0hUKSk7CisJCQkJOjpTZXRCa0NvbG9yKChIREMpd1BhcmFtLCA6OkdldFN5c0NvbG9yIChDT0xPUl9CVE5GQUNFKSk7CisKKwkJCQlyZXR1cm4gKExSRVNVTFQpIGhCcnVzaFN0YXRpYzsKKwkJCX0KKwkJCWVsc2UKKwkJCQlyZXR1cm4gKExSRVNVTFQpIE5VTEw7CisqLworCQljYXNlIFdNX01PVVNFTU9WRToKKwkJCXsKKwkJCQlQT0lOVCBwbnQ7CisJCQkJOjpHZXRDdXJzb3JQb3MoJnBudCk7CisKKwkJCQlSRUNUIHJlY3Q7CisJCQkJOjpHZXRXaW5kb3dSZWN0KCA6OkdldERsZ0l0ZW0oaHduZERsZyxJRENfU1RBVElDX0FCT1VUX1VSTCksICZyZWN0KTsKKworCQkJCWlmICggIDo6UHRJblJlY3QoJnJlY3QscG50KSAgKQorCQkJCXsKKwkJCQkJOjpTZXRDdXJzb3IoaGNPdmVyQ3Vyc29yKTsKKwkJCQl9CisKKworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBXTV9MQlVUVE9OVVA6CisJCQl7CisJCQkJUE9JTlQgcG50OworCQkJCTo6R2V0Q3Vyc29yUG9zKCZwbnQpOworCisJCQkJUkVDVCByZWN0OworCQkJCTo6R2V0V2luZG93UmVjdCggOjpHZXREbGdJdGVtKGh3bmREbGcsSURDX1NUQVRJQ19BQk9VVF9VUkwpLCAmcmVjdCk7CisKKwkJCQlUQ0hBUiBVcmxbMjAwXTsKKwkJCQlib29sIGJVcmwgPSBmYWxzZTsKKwkJCQlpZiAoOjpQdEluUmVjdCgmcmVjdCxwbnQpKQorCQkJCXsKKwkJCQkJd3NwcmludGYoVXJsLGdldF9sYW1lX3VybCgpKTsKKwkJCQkJYlVybCA9IHRydWU7CisJCQkJfQorCisJCQkJaWYgKGJVcmwpCisJCQkJeworCQkJCQlMUFNUUiB0bXBTdHI7CisJCQkJCUhSRVNVTFQgaHJlc3VsdCA9IDo6VHJhbnNsYXRlVVJMKFVybCwgVFJBTlNMQVRFVVJMX0ZMX0dVRVNTX1BST1RPQ09MfFRSQU5TTEFURVVSTF9GTF9HVUVTU19QUk9UT0NPTCwgJnRtcFN0cik7CisJCQkJCWlmIChocmVzdWx0ID09IFNfT0spCisJCQkJCQk6OlNoZWxsRXhlY3V0ZShod25kRGxnLCJvcGVuIix0bXBTdHIsTlVMTCwiIixTV19TSE9XTUFYSU1JWkVEICk7CisJCQkJCWVsc2UgaWYgKGhyZXN1bHQgPT0gU19GQUxTRSkKKwkJCQkJCTo6U2hlbGxFeGVjdXRlKGh3bmREbGcsIm9wZW4iLFVybCxOVUxMLCIiLFNXX1NIT1dNQVhJTUlaRUQgKTsKKwkJCQl9CisKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgV01fQ09NTUFORDoKKwkJCVVJTlQgY29tbWFuZDsKKwkJCWNvbW1hbmQgPSBHRVRfV01fQ09NTUFORF9JRCh3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgICBpZiAoSURPSyA9PSBjb21tYW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVuZERpYWxvZyhod25kRGxnLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJSZXN1bHQgPSBGQUxTRTsKKwkJCWJyZWFrOworCisJCWNhc2UgSURDX1NUQVRJQ19BQk9VVF9VUkw6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJSZXN1bHQgPSBGQUxTRTsgLy8gd2lsbCBiZSB0cmVhdGVkIGJ5IERlZldpbmRvd1Byb2MKK30KKwlyZXR1cm4gYlJlc3VsdDsKK30KKworaW5saW5lIERXT1JEIEFDTTo6QWJvdXQoSFdORCBoUGFyZW50V2luZG93KQoreworCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX1NUQVJULCAiQUNNIDogQWJvdXQgKFBhcmVudCBXaW5kb3cgPSAweCUwOFgpIixoUGFyZW50V2luZG93KTsKKworCURpYWxvZ0JveFBhcmFtKCBteV9oTW9kdWxlLCBNQUtFSU5UUkVTT1VSQ0UoSUREX0FCT1VUKSwgaFBhcmVudFdpbmRvdywgOjpBYm91dFByb2MgLCAoTFBBUkFNKXRoaXMpOworCisJcmV0dXJuIERSVkNORl9PSzsgLy8gQ2FuIGFsc28gcmV0dXJuCisvLyBEUlZDTkZfQ0FOQ0VMCisvLyBhbmQgRFJWQ05GX1JFU1RBUlQKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQUNNOjpBQ00oIEhNT0RVTEUgaE1vZHVsZSApCisgOm15X2hNb2R1bGUoaE1vZHVsZSksCisgIG15X2hJY29uKE5VTEwpLAorICBteV9kZWJ1ZyhBRGJnKERFQlVHX0xFVkVMX0NSRUFUSU9OKSksCisgIG15X0VuY29kaW5nUHJvcGVydGllcyhoTW9kdWxlKQoreworCW15X0VuY29kaW5nUHJvcGVydGllcy5QYXJhbXNSZXN0b3JlKCk7CisKKwkvLy8gXHRvZG8gZ2V0IHRoZSBkZWJ1ZyBsZXZlbCBmcm9tIHRoZSByZWdpc3RyeQorCXVuc2lnbmVkIGNoYXIgRGVidWdGaWxlTmFtZVs1MTJdOworCisJY2hhciB0bXBbMTI4XTsKKwl3c3ByaW50Zih0bXAsIkxBTUVhY20gMHglMDhYIix0aGlzKTsKKwlteV9kZWJ1Zy5zZXRQcmVmaXgodG1wKTsgLy8vIFx0b2RvIGdldCBpdCBmcm9tIHRoZSByZWdpc3RyeQorCW15X2RlYnVnLnNldEluY2x1ZGVUaW1lKHRydWUpOyAgLy8vIFx0b2RvIGdldCBpdCBmcm9tIHRoZSByZWdpc3RyeQorCisJLy8gQ2hlY2sgaW4gdGhlIHJlZ2lzdHJ5IGlmIHdlIGhhdmUgdG8gT3V0cHV0IERlYnVnIGluZm9ybWF0aW9uCisJRGVidWdGaWxlTmFtZVswXSA9ICdcMCc7CisKKwlIS0VZIE9zc0tleTsKKwlpZiAoUmVnT3BlbktleUV4KCBIS0VZX0xPQ0FMX01BQ0hJTkUsICJTT0ZUV0FSRVxcTVVLT0xJIiwgMCwgS0VZX1JFQUQgLCAmT3NzS2V5ICkgPT0gRVJST1JfU1VDQ0VTUykgeworCQlEV09SRCBEYXRhVHlwZTsKKwkJRFdPUkQgRGVidWdGaWxlTmFtZVNpemUgPSA1MTI7CisJCWlmIChSZWdRdWVyeVZhbHVlRXgoIE9zc0tleSwgIkRlYnVnRmlsZSIsIE5VTEwsICZEYXRhVHlwZSwgRGVidWdGaWxlTmFtZSwgJkRlYnVnRmlsZU5hbWVTaXplICkgPT0gRVJST1JfU1VDQ0VTUykgeworCQkJaWYgKERhdGFUeXBlID09IFJFR19TWikgeworCQkJCW15X2RlYnVnLnNldFVzZUZpbGUodHJ1ZSk7CisJCQkJbXlfZGVidWcuc2V0RGVidWdGaWxlKChjaGFyICopRGVidWdGaWxlTmFtZSk7CisJCQkJbXlfZGVidWcuT3V0UHV0KCJEZWJ1ZyBmaWxlIGlzICVzIiwoY2hhciAqKURlYnVnRmlsZU5hbWUpOworCQkJfQorCQl9CisJfQorICAgICAgICB3c3ByaW50ZihWZXJzaW9uU3RyaW5nLCIlcyAtICVzIiwgQUNNX1ZFUlNJT04sIGdldF9sYW1lX3ZlcnNpb24oKSApOworCUJ1aWxkQml0cmF0ZVRhYmxlKCk7CisJCisJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfU1RBUlQsICJOZXcgQUNNIENyZWF0aW9uICgweCUwOFgpIix0aGlzKTsKK30KKworQUNNOjp+QUNNKCkKK3sKKy8vIG5vdCB1c2VkLCBpdCdzIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIGNsb3NpbmcgdGhlIGRyaXZlcglpZiAobXlfaEljb24gIT0gTlVMTCkKKy8vCQlDbG9zZUhhbmRsZShteV9oSWNvbik7CisKKwliaXRyYXRlX3RhYmxlLmNsZWFyKCk7CisKKwlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19TVEFSVCwgIkFDTSBEZWxldGVkICgweCUwOFgpIix0aGlzKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTWFpbiBtZXNzYWdlIGhhbmRsZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTE9ORyBBQ006OkRyaXZlclByb2NlZHVyZShjb25zdCBIRFJWUiBoZHJ2ciwgY29uc3QgVUlOVCBtc2csIExPTkcgbFBhcmFtMSwgTE9ORyBsUGFyYW0yKQoreworICAgIERXT1JEIGR3UmVzID0gMEw7CisKKy8vbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX01TRywgIm1lc3NhZ2UgMHglMDhYIGZvciBUaGlzQUNNIDB4JTA4WCIsIG1zZywgdGhpcyk7CisKK3N3aXRjaCAobXNnKSB7CisgICAgY2FzZSBEUlZfSU5TVEFMTDoKKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkRSVl9JTlNUQUxMIik7CisJCS8vIFNlbnQgd2hlbiB0aGUgZHJpdmVyIGlzIGluc3RhbGxlZC4KKwkJZHdSZXMgPSBEUlZDTkZfT0s7ICAvLyBDYW4gYWxzbyByZXR1cm4gCisJCWJyZWFrOyAgICAgICAgICAgICAgLy8gRFJWQ05GX0NBTkNFTAorCQkJCQkJCS8vIGFuZCBEUlZfUkVTVEFSVAorCisJY2FzZSBEUlZfUkVNT1ZFOgorCQkvLyBTZW50IHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkLgorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiRFJWX1JFTU9WRSIpOworCQlkd1JlcyA9IDFMOyAgLy8gcmV0dXJuIHZhbHVlIGlnbm9yZWQKKwkJYnJlYWs7CisKKyAgICBjYXNlIERSVl9RVUVSWUNPTkZJR1VSRToKKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkRSVl9RVUVSWUNPTkZJR1VSRSIpOworCQkvLyBTZW50IHRvIGRldGVybWluZSBpZiB0aGUgZHJpdmVyIGNhbiBiZQorCQkvLyBjb25maWd1cmVkLgorCQlkd1JlcyA9IDFMOyAgLy8gWmVybyBpbmRpY2F0ZXMgY29uZmlndXJhdGlvbgorCQlicmVhazsgICAgICAgLy8gTk9UIHN1cHBvcnRlZAorCisJY2FzZSBEUlZfQ09ORklHVVJFOgorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiRFJWX0NPTkZJR1VSRSIpOworCQkvLyBTZW50IHRvIGRpc3BsYXkgdGhlIGNvbmZpZ3VyYXRpb24KKwkJLy8gZGlhbG9nIGJveCBmb3IgdGhlIGRyaXZlci4KKy8vCQlkd1JlcyA9IENvbmZpZ3VyZSggKEhXTkQpIGxQYXJhbTEsIChMUERSVkNPTkZJR0lORk8pIGxQYXJhbTIgKTsKKwkJaWYgKG15X0VuY29kaW5nUHJvcGVydGllcy5Db25maWcobXlfaE1vZHVsZSwgKEhXTkQpIGxQYXJhbTEpKQorCQl7CisJCQlkd1JlcyA9IERSVkNORl9PSzsgLy8gQ2FuIGFsc28gcmV0dXJuCisJCQkJCS8vIERSVkNORl9DQU5DRUwKKwkJCQkJLy8gYW5kIERSVkNORl9SRVNUQVJUCisJCX0gZWxzZSB7CisJCQlkd1JlcyA9IERSVkNORl9DQU5DRUw7CisJCX0KKwkJYnJlYWs7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyBBQ00gYWRkaXRpb25hbCBtZXNzYWdlcworCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWNhc2UgQUNNRE1fRFJJVkVSX0FCT1VUOgorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiQUNNRE1fRFJJVkVSX0FCT1VUIik7CisKKwkJZHdSZXMgPSBBYm91dCggKEhXTkQpIGxQYXJhbTEgKTsKKworICAgICAgICBicmVhazsKKworCWNhc2UgQUNNRE1fRFJJVkVSX0RFVEFJTFM6IC8vIGFjbURyaXZlckRldGFpbHMKKwkJLy8gRmlsbC1pbiBnZW5lcmFsIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgZHJpdmVyL2NvZGVjCisJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9NU0csICJBQ01ETV9EUklWRVJfREVUQUlMUyIpOworCisJCWR3UmVzID0gT25Ecml2ZXJEZXRhaWxzKGhkcnZyLCAoTFBBQ01EUklWRVJERVRBSUxTKSBsUGFyYW0xKTsKKyAgICAgICAgCisJCWJyZWFrOworCisJY2FzZSBBQ01ETV9GT1JNQVRUQUdfREVUQUlMUzogLy8gYWNtRm9ybWF0VGFnRGV0YWlscworCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiQUNNRE1fRk9STUFUVEFHX0RFVEFJTFMiKTsKKworCQlkd1JlcyA9IE9uRm9ybWF0VGFnRGV0YWlscygoTFBBQ01GT1JNQVRUQUdERVRBSUxTKSBsUGFyYW0xLCBsUGFyYW0yKTsKKworICAgICAgICBicmVhazsKKworCWNhc2UgQUNNRE1fRk9STUFUX0RFVEFJTFM6IC8vIGFjbUZvcm1hdERldGFpbHMKKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkFDTURNX0ZPUk1BVF9ERVRBSUxTIik7CisKKwkJZHdSZXMgPSBPbkZvcm1hdERldGFpbHMoKExQQUNNRk9STUFUREVUQUlMUykgbFBhcmFtMSwgbFBhcmFtMik7CisJCQorICAgICAgICBicmVhazsgICAgICAgICAgIAorCisgICAgY2FzZSBBQ01ETV9GT1JNQVRfU1VHR0VTVDogLy8gYWNtRm9ybWF0U3VnZ2VzdAorCQkvLyBTZW50IHRvIGRldGVybWluZSBpZiB0aGUgZHJpdmVyIGNhbiBiZQorCQkvLyBjb25maWd1cmVkLgorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiQUNNRE1fRk9STUFUX1NVR0dFU1QiKTsKKwkJZHdSZXMgPSBPbkZvcm1hdFN1Z2dlc3QoKExQQUNNRFJWRk9STUFUU1VHR0VTVCkgbFBhcmFtMSk7CisgICAgICAgIGJyZWFrOyAKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCS8vIEFDTSBzdHJlYW0gbWVzc2FnZXMKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwljYXNlIEFDTURNX1NUUkVBTV9PUEVOOgorCS8vIFNlbnQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkcml2ZXIgY2FuIGJlCisJLy8gY29uZmlndXJlZC4KKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkFDTURNX1NUUkVBTV9PUEVOIik7CisJCWR3UmVzID0gT25TdHJlYW1PcGVuKChMUEFDTURSVlNUUkVBTUlOU1RBTkNFKSBsUGFyYW0xKTsKKyAgICAgICAgYnJlYWs7IAorCisJY2FzZSBBQ01ETV9TVFJFQU1fU0laRToKKwkvLyByZXR1cm5zIGEgcmVjb21tZW5kZWQgc2l6ZSBmb3IgYSBzb3VyY2UgCisJLy8gb3IgZGVzdGluYXRpb24gYnVmZmVyIG9uIGFuIEFDTSBzdHJlYW0KKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkFDTURNX1NUUkVBTV9TSVpFIik7CisJCWR3UmVzID0gT25TdHJlYW1TaXplKChMUEFDTURSVlNUUkVBTUlOU1RBTkNFKWxQYXJhbTEsIChMUEFDTURSVlNUUkVBTVNJWkUpbFBhcmFtMik7CisgICAgICAgIGJyZWFrOyAKKworCWNhc2UgQUNNRE1fU1RSRUFNX1BSRVBBUkU6CisJLy8gcHJlcGFyZXMgYW4gQUNNU1RSRUFNSEVBREVSIHN0cnVjdHVyZSBmb3IKKwkvLyBhbiBBQ00gc3RyZWFtIGNvbnZlcnNpb24KKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkFDTURNX1NUUkVBTV9QUkVQQVJFIik7CisJCWR3UmVzID0gT25TdHJlYW1QcmVwYXJlSGVhZGVyKChMUEFDTURSVlNUUkVBTUlOU1RBTkNFKWxQYXJhbTEsIChMUEFDTVNUUkVBTUhFQURFUikgbFBhcmFtMik7CisgICAgICAgIGJyZWFrOyAKKworCWNhc2UgQUNNRE1fU1RSRUFNX1VOUFJFUEFSRToKKwkvLyBjbGVhbnMgdXAgdGhlIHByZXBhcmF0aW9uIHBlcmZvcm1lZCBieQorCS8vIHRoZSBBQ01ETV9TVFJFQU1fUFJFUEFSRSBtZXNzYWdlIGZvciBhbiBBQ00gc3RyZWFtCisJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9NU0csICJBQ01ETV9TVFJFQU1fVU5QUkVQQVJFIik7CisJCWR3UmVzID0gT25TdHJlYW1VblByZXBhcmVIZWFkZXIoKExQQUNNRFJWU1RSRUFNSU5TVEFOQ0UpbFBhcmFtMSwgKExQQUNNU1RSRUFNSEVBREVSKSBsUGFyYW0yKTsKKyAgICAgICAgYnJlYWs7IAorCisJY2FzZSBBQ01ETV9TVFJFQU1fQ09OVkVSVDoKKwkvLyBwZXJmb3JtIGEgY29udmVyc2lvbiBvbiB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gc3RyZWFtCisJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9NU0csICJBQ01ETV9TVFJFQU1fQ09OVkVSVCIpOworCQlkd1JlcyA9IE9uU3RyZWFtQ29udmVydCgoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSlsUGFyYW0xLCAoTFBBQ01EUlZTVFJFQU1IRUFERVIpIGxQYXJhbTIpOworCQkKKyAgICAgICAgYnJlYWs7IAorCisJY2FzZSBBQ01ETV9TVFJFQU1fQ0xPU0U6CisJLy8gY2xvc2VzIGFuIEFDTSBjb252ZXJzaW9uIHN0cmVhbQorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiQUNNRE1fU1RSRUFNX0NMT1NFIik7CisJCWR3UmVzID0gT25TdHJlYW1DbG9zZSgoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSlsUGFyYW0xKTsKKyAgICAgICAgYnJlYWs7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyBVbmtub3duIG1lc3NhZ2UKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlkZWZhdWx0OgorCS8vIFByb2Nlc3MgYW55IG90aGVyIG1lc3NhZ2VzLgorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiQUNNOjpEcml2ZXJQcm9jIHVua25vd24gbWVzc2FnZSAoMHglMDhYKSwgbFBhcmFtMSA9IDB4JTA4WCwgbFBhcmFtMiA9IDB4JTA4WCIsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CisJCXJldHVybiBEZWZEcml2ZXJQcm9jICgoRFdPUkQpdGhpcywgaGRydnIsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CisgICAgfQorCisgICAgcmV0dXJuIGR3UmVzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTcGVjaWFsIG1lc3NhZ2UgaGFuZGxlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qIQorCVJldHJlaXZlIHRoZSBjb25maWcgZGV0YWlscyBvZiB0aGlzIEFDTSBkcml2ZXIKKwlUaGUgaW5kZXggcmVwcmVzZW50IHRoZSBzcGVjaWZpZWQgZm9ybWF0CisKKwlccGFyYW0gYV9Gb3JtYXREZXRhaWxzIHdpbGwgYmUgZmlsbGVkIHdpdGggYWxsIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEKKyovCitpbmxpbmUgRFdPUkQgQUNNOjpPbkZvcm1hdERldGFpbHMoTFBBQ01GT1JNQVRERVRBSUxTIGFfRm9ybWF0RGV0YWlscywgY29uc3QgTFBBUkFNIGFfUXVlcnkpCit7CisJRFdPUkQgUmVzdWx0ID0gQUNNRVJSX05PVFBPU1NJQkxFOworCisJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIkFDTV9GT1JNQVRERVRBSUxTIGFfUXVlcnkgPSAweCUwOFgiLGFfUXVlcnkpOworCXN3aXRjaCAoYV9RdWVyeSAmIEFDTV9GT1JNQVRERVRBSUxTRl9RVUVSWU1BU0spIHsKKworCQkvLyBGaWxsLWluIHRoZSBpbmZvcm1hdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgRm9ybWF0RGV0YWlscy0+ZHdGb3JtYXRUYWdJbmRleAorCQljYXNlIEFDTV9GT1JNQVRERVRBSUxTRl9JTkRFWCA6CisJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiZW50ZXIgQUNNX0ZPUk1BVERFVEFJTFNGX0lOREVYIGZvciBpbmRleCAweCUwNFg6JTAzZCIsYV9Gb3JtYXREZXRhaWxzLT5kd0Zvcm1hdFRhZyxhX0Zvcm1hdERldGFpbHMtPmR3Rm9ybWF0SW5kZXgpOworCQkJaWYgKGFfRm9ybWF0RGV0YWlscy0+ZHdGb3JtYXRUYWcgPT0gUEVSU09OQUxfRk9STUFUKSB7CisJCQkJaWYgKGFfRm9ybWF0RGV0YWlscy0+ZHdGb3JtYXRJbmRleCA8IEdldE51bWJlckVuY29kaW5nRm9ybWF0cygpKSB7CisJCQkJCUxQV0FWRUZPUk1BVEVYIFdhdmVFeHQ7CisJCQkJCVdhdmVFeHQgPSBhX0Zvcm1hdERldGFpbHMtPnB3Zng7CisKKwkJCQkJV2F2ZUV4dC0+d0Zvcm1hdFRhZyA9IFBFUlNPTkFMX0ZPUk1BVDsKKworCQkJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiZm9ybWF0IGluICA6IGNoYW5uZWxzICVkLCBzYW1wbGUgcmF0ZSAlZCIsIFdhdmVFeHQtPm5DaGFubmVscywgV2F2ZUV4dC0+blNhbXBsZXNQZXJTZWMpOworCQkJCQlHZXRNUDNGb3JtYXRGb3JJbmRleChhX0Zvcm1hdERldGFpbHMtPmR3Rm9ybWF0SW5kZXgsICpXYXZlRXh0LCBhX0Zvcm1hdERldGFpbHMtPnN6Rm9ybWF0KTsKKwkJCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgImZvcm1hdCBvdXQgOiBjaGFubmVscyAlZCwgc2FtcGxlIHJhdGUgJWQiLCBXYXZlRXh0LT5uQ2hhbm5lbHMsIFdhdmVFeHQtPm5TYW1wbGVzUGVyU2VjKTsKKwkJCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIkFDTV9GT1JNQVRERVRBSUxTRl9JTkRFWCB1bmtub3duIGluZGV4IDB4JTA0WDolMDNkIixhX0Zvcm1hdERldGFpbHMtPmR3Rm9ybWF0VGFnLGFfRm9ybWF0RGV0YWlscy0+ZHdGb3JtYXRJbmRleCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoYV9Gb3JtYXREZXRhaWxzLT5kd0Zvcm1hdFRhZyA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKKwkJCQlpZiAoYV9Gb3JtYXREZXRhaWxzLT5kd0Zvcm1hdEluZGV4IDwgRk9STUFUX01BWF9OQl9QQ00pIHsKKwkJCQkJTFBXQVZFRk9STUFURVggV2F2ZUV4dDsKKwkJCQkJV2F2ZUV4dCA9IGFfRm9ybWF0RGV0YWlscy0+cHdmeDsKKworCQkJCQlXYXZlRXh0LT53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOworCisJCQkJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJmb3JtYXQgaW4gIDogY2hhbm5lbHMgJWQsIHNhbXBsZSByYXRlICVkIiwgV2F2ZUV4dC0+bkNoYW5uZWxzLCBXYXZlRXh0LT5uU2FtcGxlc1BlclNlYyk7CisJCQkJCUdldFBDTUZvcm1hdEZvckluZGV4KGFfRm9ybWF0RGV0YWlscy0+ZHdGb3JtYXRJbmRleCwgKldhdmVFeHQsIGFfRm9ybWF0RGV0YWlscy0+c3pGb3JtYXQpOworCQkJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiZm9ybWF0IG91dCA6IGNoYW5uZWxzICVkLCBzYW1wbGUgcmF0ZSAlZCIsIFdhdmVFeHQtPm5DaGFubmVscywgV2F2ZUV4dC0+blNhbXBsZXNQZXJTZWMpOworCQkJCQlSZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiQUNNX0ZPUk1BVERFVEFJTFNGX0lOREVYIHVua25vd24gaW5kZXggMHglMDRYOiUwM2QiLGFfRm9ybWF0RGV0YWlscy0+ZHdGb3JtYXRUYWcsYV9Gb3JtYXREZXRhaWxzLT5kd0Zvcm1hdEluZGV4KTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIlVua25vd24gYV9Gb3JtYXREZXRhaWxzLT5kd0Zvcm1hdFRhZyA9IDB4JTA4WCIsYV9Gb3JtYXREZXRhaWxzLT5kd0Zvcm1hdFRhZyk7CisJCQl9CisKKwkJY2FzZSBBQ01fRk9STUFUREVUQUlMU0ZfRk9STUFUIDoKKwkJCS8vLyBcdG9kbyB3ZSBtYXkgb3V0cHV0IHRoZSBjb3JyZXNwb25kaW5nIHN0cm9uZyAob25seSBmb3IgcGVyc29uYWwgZm9ybWF0KQorCQkJTFBXQVZFRk9STUFURVggV2F2ZUV4dDsKKwkJCVdhdmVFeHQgPSBhX0Zvcm1hdERldGFpbHMtPnB3Zng7CisKKwkJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJlbnRlciBBQ01fRk9STUFUREVUQUlMU0ZfRk9STUFUIDogMHglMDRYOiUwM2QsIGZvcm1hdCBpbiA6IGNoYW5uZWxzICVkLCBzYW1wbGUgcmF0ZSAlZCIsYV9Gb3JtYXREZXRhaWxzLT5kd0Zvcm1hdFRhZyxhX0Zvcm1hdERldGFpbHMtPmR3Rm9ybWF0SW5kZXgsIFdhdmVFeHQtPm5DaGFubmVscywgV2F2ZUV4dC0+blNhbXBsZXNQZXJTZWMpOworCisJCQlSZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJUmVzdWx0ID0gQUNNRVJSX05PVFBPU1NJQkxFOworCQkJYnJlYWs7CisJfQorCisJYV9Gb3JtYXREZXRhaWxzLT5mZHdTdXBwb3J0ID0gQUNNRFJJVkVSREVUQUlMU19TVVBQT1JURl9DT0RFQzsKKworCXJldHVybiBSZXN1bHQ7Cit9CisKKy8qIQorCVJldHJlaXZlIHRoZSBkZXRhaWxzIG9mIGVhY2gga25vd24gZm9ybWF0IGJ5IHRoaXMgQUNNIGRyaXZlcgorCVRoZSBpbmRleCByZXByZXNlbnQgdGhlIHNwZWNpZmllZCBmb3JtYXQgKDAgPSBNUDMgLyAxID0gUENNKQorCisJXHBhcmFtIGFfRm9ybWF0VGFnRGV0YWlscyB3aWxsIGJlIGZpbGxlZCB3aXRoIGFsbCB0aGUgY29ycmVzcG9uZGluZyBkYXRhCisqLworaW5saW5lIERXT1JEIEFDTTo6T25Gb3JtYXRUYWdEZXRhaWxzKExQQUNNRk9STUFUVEFHREVUQUlMUyBhX0Zvcm1hdFRhZ0RldGFpbHMsIGNvbnN0IExQQVJBTSBhX1F1ZXJ5KQoreworCURXT1JEIFJlc3VsdDsKKwlEV09SRCB0aGVfZm9ybWF0ID0gV0FWRV9GT1JNQVRfVU5LTk9XTjsgLy8gdGhlIGZvcm1hdCB0byBnaXZlIGRldGFpbHMKKworCWlmIChhX0Zvcm1hdFRhZ0RldGFpbHMtPmNiU3RydWN0ID49IHNpemVvZigqYV9Gb3JtYXRUYWdEZXRhaWxzKSkgeworCisJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJBQ01ETV9GT1JNQVRUQUdfREVUQUlMUywgYV9RdWVyeSA9IDB4JTA4WCIsYV9RdWVyeSk7CisJCXN3aXRjaChhX1F1ZXJ5ICYgQUNNX0ZPUk1BVFRBR0RFVEFJTFNGX1FVRVJZTUFTSykgeworCisJCQljYXNlIEFDTV9GT1JNQVRUQUdERVRBSUxTRl9JTkRFWDoKKwkJCS8vIEZpbGwtaW4gdGhlIGluZm9ybWF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhX0Zvcm1hdERldGFpbHMtPmR3Rm9ybWF0VGFnSW5kZXgKKwkJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiZ2V0IEFDTV9GT1JNQVRUQUdERVRBSUxTRl9JTkRFWCBmb3IgaW5kZXggJTAzZCIsYV9Gb3JtYXRUYWdEZXRhaWxzLT5kd0Zvcm1hdFRhZ0luZGV4KTsKKworCQkJCWlmIChhX0Zvcm1hdFRhZ0RldGFpbHMtPmR3Rm9ybWF0VGFnSW5kZXggPCBGT1JNQVRfVEFHX01BWF9OQikgeworCQkJCQlzd2l0Y2ggKGFfRm9ybWF0VGFnRGV0YWlscy0+ZHdGb3JtYXRUYWdJbmRleCkKKwkJCQkJeworCQkJCQljYXNlIDA6CisJCQkJCQl0aGVfZm9ybWF0ID0gUEVSU09OQUxfRk9STUFUOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQgOgorCQkJCQkJdGhlX2Zvcm1hdCA9IFdBVkVfRk9STUFUX1BDTTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJBQ01fRk9STUFUVEFHREVUQUlMU0ZfSU5ERVggZm9yIHVuc3VwcG9ydGVkIGluZGV4ICUwM2QiLGFfRm9ybWF0VGFnRGV0YWlscy0+ZHdGb3JtYXRUYWdJbmRleCk7CisJCQkJCVJlc3VsdCA9IEFDTUVSUl9OT1RQT1NTSUJMRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNNX0ZPUk1BVFRBR0RFVEFJTFNGX0ZPUk1BVFRBRzoKKwkJCS8vIEZpbGwtaW4gdGhlIGluZm9ybWF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhX0Zvcm1hdERldGFpbHMtPmR3Rm9ybWF0VGFnSW5kZXggYW5kIGhkcnZyIGdpdmVuCisJCQkJc3dpdGNoIChhX0Zvcm1hdFRhZ0RldGFpbHMtPmR3Rm9ybWF0VGFnKQorCQkJCXsKKwkJCQljYXNlIFdBVkVfRk9STUFUX1BDTToKKwkJCQkJdGhlX2Zvcm1hdCA9IFdBVkVfRk9STUFUX1BDTTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQRVJTT05BTF9GT1JNQVQ6CisJCQkJCXRoZV9mb3JtYXQgPSBQRVJTT05BTF9GT1JNQVQ7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQUNNRVJSX05PVFBPU1NJQkxFKTsKKwkJCQl9CisJCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgImdldCBBQ01fRk9STUFUVEFHREVUQUlMU0ZfRk9STUFUVEFHIGZvciBpbmRleCAweCUwMlgsIGNTdGFuZGFyZEZvcm1hdHMgPSAlZCIsYV9Gb3JtYXRUYWdEZXRhaWxzLT5kd0Zvcm1hdFRhZ0luZGV4LGFfRm9ybWF0VGFnRGV0YWlscy0+Y1N0YW5kYXJkRm9ybWF0cyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTV9GT1JNQVRUQUdERVRBSUxTRl9MQVJHRVNUU0laRToKKwkJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiQUNNX0ZPUk1BVFRBR0RFVEFJTFNGX0xBUkdFU1RTSVpFIG5vdCB1c2VkIik7CisJCQkJUmVzdWx0ID0gMEw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJPbkZvcm1hdFRhZ0RldGFpbHMgVW5rbm93biBGb3JtYXQgdGFnIHF1ZXJ5Iik7CisJCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOworCQkJCWJyZWFrOworCQl9CisKKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIk9uRm9ybWF0VGFnRGV0YWlscyB0aGVfZm9ybWF0ID0gMHglMDhYIix0aGVfZm9ybWF0KTsKKwkJc3dpdGNoKHRoZV9mb3JtYXQpCisJCXsKKwkJCWNhc2UgV0FWRV9GT1JNQVRfUENNOgorCQkJCWFfRm9ybWF0VGFnRGV0YWlscy0+ZHdGb3JtYXRUYWcgICAgICA9IFdBVkVfRk9STUFUX1BDTTsKKwkJCQlhX0Zvcm1hdFRhZ0RldGFpbHMtPmR3Rm9ybWF0VGFnSW5kZXggPSAwOworCQkJCWFfRm9ybWF0VGFnRGV0YWlscy0+Y2JGb3JtYXRTaXplICAgICA9IHNpemVvZihQQ01XQVZFRk9STUFUKTsKKwkJCQkvLy8gXG5vdGUgMCBtYXkgbWVhbiB3ZSBkb24ndCBrbm93IGhvdyB0byBkZWNvZGUKKwkJCQlhX0Zvcm1hdFRhZ0RldGFpbHMtPmZkd1N1cHBvcnQgICAgICAgPSBBQ01EUklWRVJERVRBSUxTX1NVUFBPUlRGX0NPREVDOworCQkJCWFfRm9ybWF0VGFnRGV0YWlscy0+Y1N0YW5kYXJkRm9ybWF0cyA9IEZPUk1BVF9NQVhfTkJfUENNOworCQkJCS8vIHNob3VsZCBiZSBmaWxsZWQgYnkgV2luZG93cwkJCQlhX0Zvcm1hdFRhZ0RldGFpbHMtPnN6Rm9ybWF0VGFnWzBdID0gJ1wwJzsKKwkJCQlSZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOworCQkJCWJyZWFrOworCQkJY2FzZSBQRVJTT05BTF9GT1JNQVQ6CisJCQkJYV9Gb3JtYXRUYWdEZXRhaWxzLT5kd0Zvcm1hdFRhZyAgICAgID0gUEVSU09OQUxfRk9STUFUOworCQkJCWFfRm9ybWF0VGFnRGV0YWlscy0+ZHdGb3JtYXRUYWdJbmRleCA9IDE7CisJCQkJYV9Gb3JtYXRUYWdEZXRhaWxzLT5jYkZvcm1hdFNpemUgICAgID0gU0laRV9GT1JNQVRfU1RSVUNUOworCQkJCWFfRm9ybWF0VGFnRGV0YWlscy0+ZmR3U3VwcG9ydCAgICAgICA9IEFDTURSSVZFUkRFVEFJTFNfU1VQUE9SVEZfQ09ERUM7CisJCQkJYV9Gb3JtYXRUYWdEZXRhaWxzLT5jU3RhbmRhcmRGb3JtYXRzID0gR2V0TnVtYmVyRW5jb2RpbmdGb3JtYXRzKCk7CisJCQkJbHN0cmNweVcoIGFfRm9ybWF0VGFnRGV0YWlscy0+c3pGb3JtYXRUYWcsIEwiTGFtZSBNUDMiICk7CisJCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIk9uRm9ybWF0VGFnRGV0YWlscyBVbmtub3duIGZvcm1hdCAweCUwOFgiLHRoZV9mb3JtYXQpOworCQkJCXJldHVybiAoQUNNRVJSX05PVFBPU1NJQkxFKTsKKwkJfQorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiT25Gb3JtYXRUYWdEZXRhaWxzICVkIHBvc3NpYmlsaXRpZXMgZm9yIGZvcm1hdCAweCUwOFgiLGFfRm9ybWF0VGFnRGV0YWlscy0+Y1N0YW5kYXJkRm9ybWF0cyx0aGVfZm9ybWF0KTsKKwl9CisJZWxzZQorCXsKKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgImFfRm9ybWF0VGFnRGV0YWlscy0+Y2JTdHJ1Y3QgPCBzaXplb2YoKmFfRm9ybWF0RGV0YWlscykiKTsKKwkJUmVzdWx0ID0gQUNNRVJSX05PVFBPU1NJQkxFOworCX0KKworCXJldHVybiBSZXN1bHQ7Cit9CisKKy8qIQorCVJldHJlaXZlIHRoZSBnbG9iYWwgZGV0YWlscyBvZiB0aGlzIEFDTSBkcml2ZXIKKworCVxwYXJhbSBhX0RyaXZlckRldGFpbCB3aWxsIGJlIGZpbGxlZCB3aXRoIGFsbCB0aGUgY29ycmVzcG9uZGluZyBkYXRhCisqLworaW5saW5lIERXT1JEIEFDTTo6T25Ecml2ZXJEZXRhaWxzKGNvbnN0IEhEUlZSIGhkcnZyLCBMUEFDTURSSVZFUkRFVEFJTFMgYV9Ecml2ZXJEZXRhaWwpCit7CisJaWYgKG15X2hJY29uID09IE5VTEwpCisJCW15X2hJY29uID0gTG9hZEljb24oR2V0RHJpdmVyTW9kdWxlSGFuZGxlKGhkcnZyKSwgTUFLRUlOVFJFU09VUkNFKElESV9JQ09OKSk7CisJYV9Ecml2ZXJEZXRhaWwtPmhpY29uICAgICAgID0gbXlfaEljb247CisKKwlhX0RyaXZlckRldGFpbC0+ZmNjVHlwZSAgICAgPSBBQ01EUklWRVJERVRBSUxTX0ZDQ1RZUEVfQVVESU9DT0RFQzsKKwlhX0RyaXZlckRldGFpbC0+ZmNjQ29tcCAgICAgPSBBQ01EUklWRVJERVRBSUxTX0ZDQ0NPTVBfVU5ERUZJTkVEOworCisJLy8vIFxub3RlIHRoaXMgaXMgYW4gZXhwbGljaXQgaGFjayBvZiB0aGUgRmhHIHZhbHVlcworCS8vLyBcbm90ZSBsYXRlciBpdCBjb3VsZCBiZSBhIG5ldyB2YWx1ZSB3aGVuIHRoZSBkZWNvZGluZyBpcyBkb25lCisJYV9Ecml2ZXJEZXRhaWwtPndNaWQgICAgICAgID0gTU1fRlJBVU5IT0ZFUl9JSVM7CisJYV9Ecml2ZXJEZXRhaWwtPndQaWQgICAgICAgID0gTU1fRkhHSUlTX01QRUdMQVlFUjM7CisKKwlhX0RyaXZlckRldGFpbC0+dmR3QUNNICAgICAgPSBWRVJTSU9OX01TQUNNOworCWFfRHJpdmVyRGV0YWlsLT52ZHdEcml2ZXIgICA9IFZFUlNJT05fQUNNX0RSSVZFUjsKKwlhX0RyaXZlckRldGFpbC0+ZmR3U3VwcG9ydCAgPSBBQ01EUklWRVJERVRBSUxTX1NVUFBPUlRGX0NPREVDOworCWFfRHJpdmVyRGV0YWlsLT5jRm9ybWF0VGFncyA9IEZPUk1BVF9UQUdfTUFYX05COyAvLyAyIDogTVAzIGFuZCBQQ00KKy8vCWFfRHJpdmVyRGV0YWlsLT5jRm9ybWF0VGFncyA9IDE7IC8vIDIgOiBNUDMgYW5kIFBDTQorCWFfRHJpdmVyRGV0YWlsLT5jRmlsdGVyVGFncyA9IEZJTFRFUl9UQUdfTUFYX05COworCisJbHN0cmNweVcoIGFfRHJpdmVyRGV0YWlsLT5zelNob3J0TmFtZSwgTCJMQU1FIE1QMyIgKTsKKwljaGFyIHRtcFN0clsxMjhdOworCXdzcHJpbnRmKHRtcFN0ciwgIkxBTUUgTVAzIENvZGVjIHYlcyIsIEdldFZlcnNpb25TdHJpbmcoKSk7CisJaW50IHUgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgTUJfUFJFQ09NUE9TRUQsIHRtcFN0ciwgLTEsIGFfRHJpdmVyRGV0YWlsLT5zekxvbmdOYW1lLCAwKTsKKwlNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgTUJfUFJFQ09NUE9TRUQsIHRtcFN0ciwgLTEsIGFfRHJpdmVyRGV0YWlsLT5zekxvbmdOYW1lLCB1KTsKKwlsc3RyY3B5VyggYV9Ecml2ZXJEZXRhaWwtPnN6Q29weXJpZ2h0LCBMIjIwMDIgU3RldmUgTGhvbW1lIiApOworCWxzdHJjcHlXKCBhX0RyaXZlckRldGFpbC0+c3pMaWNlbnNpbmcsIEwiTEdQTCAoc2VlIGdudS5vcmcpIiApOworCS8vLyBcdG9kbyB1cGRhdGUgdGhpcyBwYXJ0IHdoZW4gdGhlIGNvZGUgY2hhbmdlcworCWxzdHJjcHlXKCBhX0RyaXZlckRldGFpbC0+c3pGZWF0dXJlcyAsIEwib25seSBDQlIgaW1wbGVtZW50YXRpb24iICk7CisKKyAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsgIC8vIENhbiBhbHNvIHJldHVybiBEUlZDTkZfQ0FOQ0VMCit9CisKKy8qIQorCVN1Z2dlc3QgYW4gb3V0cHV0IGZvcm1hdCBmb3IgdGhlIHNwZWNpZmllZCBpbnB1dCBmb3JtYXQKKworCVxwYXJhbSBhX0Zvcm1hdFN1Z2dlc3Qgd2lsbCBiZSBmaWxsZWQgd2l0aCBhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YQorKi8KK2lubGluZSBEV09SRCBBQ006Ok9uRm9ybWF0U3VnZ2VzdChMUEFDTURSVkZPUk1BVFNVR0dFU1QgYV9Gb3JtYXRTdWdnZXN0KQoreworCURXT1JEIFJlc3VsdCA9IE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKKyAgICBEV09SRCBmZHdTdWdnZXN0ID0gKEFDTV9GT1JNQVRTVUdHRVNURl9UWVBFTUFTSyAmIGFfRm9ybWF0U3VnZ2VzdC0+ZmR3U3VnZ2VzdCk7CisKK215X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJTdWdnZXN0ICVzJXMlcyVzICgweCUwOFgpIiwKKwkJCQkgKGZkd1N1Z2dlc3QgJiBBQ01fRk9STUFUU1VHR0VTVEZfTkNIQU5ORUxTKSA/ICJjaGFubmVscywgIjoiIiwKKwkJCQkgKGZkd1N1Z2dlc3QgJiBBQ01fRk9STUFUU1VHR0VTVEZfTlNBTVBMRVNQRVJTRUMpID8gInNhbXBsZXMvc2VjLCAiOiIiLAorCQkJCSAoZmR3U3VnZ2VzdCAmIEFDTV9GT1JNQVRTVUdHRVNURl9XQklUU1BFUlNBTVBMRSkgPyAiYml0cy9zYW1wbGUsICI6IiIsCisJCQkJIChmZHdTdWdnZXN0ICYgQUNNX0ZPUk1BVFNVR0dFU1RGX1dGT1JNQVRUQUcpID8gImZvcm1hdCwgIjoiIiwKKwkJCQkgZmR3U3VnZ2VzdCk7CisKK215X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJTdWdnZXN0IGZvciBzb3VyY2UgZm9ybWF0ID0gMHglMDRYLCBjaGFubmVscyA9ICVkLCBTYW1wbGVzL3MgPSAlZCwgQXZnQi9zID0gJWQsIEJsb2NrQWxpZ24gPSAlZCwgYi9zYW1wbGUgPSAlZCIsCisJCQkJIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeFNyYy0+d0Zvcm1hdFRhZywKKwkJCQkgYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4U3JjLT5uQ2hhbm5lbHMsCisJCQkJIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeFNyYy0+blNhbXBsZXNQZXJTZWMsCisJCQkJIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeFNyYy0+bkF2Z0J5dGVzUGVyU2VjLAorCQkJCSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPm5CbG9ja0FsaWduLAorCQkJCSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPndCaXRzUGVyU2FtcGxlKTsKKworbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIlN1Z2dlc3RlZCBkZXN0aW5hdGlvbiBmb3JtYXQgPSAweCUwNFgsIGNoYW5uZWxzID0gJWQsIFNhbXBsZXMvcyA9ICVkLCBBdmdCL3MgPSAlZCwgQmxvY2tBbGlnbiA9ICVkLCBiL3NhbXBsZSA9ICVkIiwKKwkJCSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPndGb3JtYXRUYWcsCisJCQkgYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uQ2hhbm5lbHMsCisJCQkgYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uU2FtcGxlc1BlclNlYywKKwkJCSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5BdmdCeXRlc1BlclNlYywKKwkJCSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5CbG9ja0FsaWduLAorCQkJIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0JpdHNQZXJTYW1wbGUpOworCisJc3dpdGNoIChhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPndGb3JtYXRUYWcpCisJeworICAgICAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKKwkJCS8vLyBcdG9kbyBoYW5kbGUgaGVyZSB0aGUgZGVjb2RpbmcgPworCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIlN1Z2dlc3QgZm9yIFBDTSBzb3VyY2UiKTsKKyAgICAgICAgICAgIC8vCisJCQkvLyAgaWYgdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCB0YWcgaXMgcmVzdHJpY3RlZCwgdmVyaWZ5IHRoYXQKKwkJCS8vICBpdCBpcyB3aXRoaW4gb3VyIGNhcGFiaWxpdGllcy4uLgorCQkJLy8KKwkJCS8vICB0aGlzIGRyaXZlciBpcyBhYmxlIHRvIGRlY29kZSB0byBQQ00KKwkJCS8vCisJCQlpZiAoQUNNX0ZPUk1BVFNVR0dFU1RGX1dGT1JNQVRUQUcgJiBmZHdTdWdnZXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChQRVJTT05BTF9GT1JNQVQgIT0gYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT53Rm9ybWF0VGFnKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEFDTUVSUl9OT1RQT1NTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisJCQl7CisgICAgICAgICAgICAgICAgYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT53Rm9ybWF0VGFnID0gUEVSU09OQUxfRk9STUFUOworICAgICAgICAgICAgfQorCisKK215X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJTdWdnZXN0IHN1Y2NlZWQgQSIpOworICAgICAgICAgICAgLy8KKwkJCS8vICBpZiB0aGUgZGVzdGluYXRpb24gY2hhbm5lbCBjb3VudCBpcyByZXN0cmljdGVkLCB2ZXJpZnkgdGhhdAorCQkJLy8gIGl0IGlzIHdpdGhpbiBvdXIgY2FwYWJpbGl0aWVzLi4uCisJCQkvLworCQkJLy8gIHRoaXMgZHJpdmVyIGlzIG5vdCBhYmxlIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisJCQkvLworCQkJaWYgKEFDTV9GT1JNQVRTVUdHRVNURl9OQ0hBTk5FTFMgJiBmZHdTdWdnZXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPm5DaGFubmVscyAhPSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5DaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBQ01FUlJfTk9UUE9TU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorCQkJeworICAgICAgICAgICAgICAgIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+bkNoYW5uZWxzID0gYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4U3JjLT5uQ2hhbm5lbHM7CisgICAgICAgICAgICB9CisKKwkJCWlmIChhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPm5DaGFubmVscyAhPSAxICYmIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeFNyYy0+bkNoYW5uZWxzICE9IDIpCisJCQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CisKKworbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIlN1Z2dlc3Qgc3VjY2VlZCBCIik7CisgICAgICAgICAgICAvLworCQkJLy8gIGlmIHRoZSBkZXN0aW5hdGlvbiBzYW1wbGVzIHBlciBzZWNvbmQgaXMgcmVzdHJpY3RlZCwgdmVyaWZ5CisJCQkvLyAgdGhhdCBpdCBpcyB3aXRoaW4gb3VyIGNhcGFiaWxpdGllcy4uLgorCQkJLy8KKwkJCS8vICB0aGlzIGRyaXZlciBpcyBub3QgYWJsZSB0byBjaGFuZ2UgdGhlIHNhbXBsZSByYXRlCisJCQkvLworCQkJaWYgKEFDTV9GT1JNQVRTVUdHRVNURl9OU0FNUExFU1BFUlNFQyAmIGZkd1N1Z2dlc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFfRm9ybWF0U3VnZ2VzdC0+cHdmeFNyYy0+blNhbXBsZXNQZXJTZWMgIT0gYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uU2FtcGxlc1BlclNlYykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBQ01FUlJfTk9UUE9TU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorCQkJeworICAgICAgICAgICAgICAgIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+blNhbXBsZXNQZXJTZWMgPSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPm5TYW1wbGVzUGVyU2VjOworICAgICAgICAgICAgfQorCisKK215X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJTdWdnZXN0IHN1Y2NlZWQgQyIpOworICAgICAgICAgICAgLy8KKwkJCS8vICBpZiB0aGUgZGVzdGluYXRpb24gYml0cyBwZXIgc2FtcGxlIGlzIHJlc3RyaWN0ZWQsIHZlcmlmeQorCQkJLy8gIHRoYXQgaXQgaXMgd2l0aGluIG91ciBjYXBhYmlsaXRpZXMuLi4KKwkJCS8vCisJCQkvLyAgV2UgcHJlZmVyIGRlY29kaW5nIHRvIDE2LWJpdCBQQ00uCisJCQkvLworCQkJaWYgKEFDTV9GT1JNQVRTVUdHRVNURl9XQklUU1BFUlNBTVBMRSAmIGZkd1N1Z2dlc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAoMTYgIT0gYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT53Qml0c1BlclNhbXBsZSkgJiYgKDggIT0gYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT53Qml0c1BlclNhbXBsZSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEFDTUVSUl9OT1RQT1NTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisJCQl7CisgICAgICAgICAgICAgICAgYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT53Qml0c1BlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgfQorCisJCQkvLwkJCWFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+bkJsb2NrQWxpZ24gPSBGT1JNQVRfQkxPQ0tfQUxJR047CisJCQlhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5CbG9ja0FsaWduID0gYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uQ2hhbm5lbHMgKiBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPndCaXRzUGVyU2FtcGxlIC8gODsKKwkJCQorCQkJYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uQXZnQnl0ZXNQZXJTZWMgPSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5DaGFubmVscyAqIDY0MDAwIC8gODsKKworCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIlN1Z2dlc3Qgc3VjY2VlZCIpOworCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKworCisJCQlicmVhazsKKwkJY2FzZSBQRVJTT05BTF9GT1JNQVQ6CisJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiU3VnZ2VzdCBmb3IgUEVSU09OQUwgc291cmNlIik7CisgICAgICAgICAgICAvLworCQkJLy8gIGlmIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgdGFnIGlzIHJlc3RyaWN0ZWQsIHZlcmlmeSB0aGF0CisJCQkvLyAgaXQgaXMgd2l0aGluIG91ciBjYXBhYmlsaXRpZXMuLi4KKwkJCS8vCisJCQkvLyAgdGhpcyBkcml2ZXIgaXMgYWJsZSB0byBkZWNvZGUgdG8gUENNCisJCQkvLworCQkJaWYgKEFDTV9GT1JNQVRTVUdHRVNURl9XRk9STUFUVEFHICYgZmR3U3VnZ2VzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoV0FWRV9GT1JNQVRfUENNICE9IGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0Zvcm1hdFRhZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBQ01FUlJfTk9UUE9TU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorCQkJeworICAgICAgICAgICAgICAgIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0Zvcm1hdFRhZyA9IFdBVkVfRk9STUFUX1BDTTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLworCQkJLy8gIGlmIHRoZSBkZXN0aW5hdGlvbiBjaGFubmVsIGNvdW50IGlzIHJlc3RyaWN0ZWQsIHZlcmlmeSB0aGF0CisJCQkvLyAgaXQgaXMgd2l0aGluIG91ciBjYXBhYmlsaXRpZXMuLi4KKwkJCS8vCisJCQkvLyAgdGhpcyBkcml2ZXIgaXMgbm90IGFibGUgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKwkJCS8vCisJCQlpZiAoQUNNX0ZPUk1BVFNVR0dFU1RGX05DSEFOTkVMUyAmIGZkd1N1Z2dlc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFfRm9ybWF0U3VnZ2VzdC0+cHdmeFNyYy0+bkNoYW5uZWxzICE9IGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+bkNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEFDTUVSUl9OT1RQT1NTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisJCQl7CisgICAgICAgICAgICAgICAgYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uQ2hhbm5lbHMgPSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPm5DaGFubmVsczsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLworCQkJLy8gIGlmIHRoZSBkZXN0aW5hdGlvbiBzYW1wbGVzIHBlciBzZWNvbmQgaXMgcmVzdHJpY3RlZCwgdmVyaWZ5CisJCQkvLyAgdGhhdCBpdCBpcyB3aXRoaW4gb3VyIGNhcGFiaWxpdGllcy4uLgorCQkJLy8KKwkJCS8vICB0aGlzIGRyaXZlciBpcyBub3QgYWJsZSB0byBjaGFuZ2UgdGhlIHNhbXBsZSByYXRlCisJCQkvLworCQkJaWYgKEFDTV9GT1JNQVRTVUdHRVNURl9OU0FNUExFU1BFUlNFQyAmIGZkd1N1Z2dlc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFfRm9ybWF0U3VnZ2VzdC0+cHdmeFNyYy0+blNhbXBsZXNQZXJTZWMgIT0gYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uU2FtcGxlc1BlclNlYykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBQ01FUlJfTk9UUE9TU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorCQkJeworICAgICAgICAgICAgICAgIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+blNhbXBsZXNQZXJTZWMgPSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhTcmMtPm5TYW1wbGVzUGVyU2VjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vCisJCQkvLyAgaWYgdGhlIGRlc3RpbmF0aW9uIGJpdHMgcGVyIHNhbXBsZSBpcyByZXN0cmljdGVkLCB2ZXJpZnkKKwkJCS8vICB0aGF0IGl0IGlzIHdpdGhpbiBvdXIgY2FwYWJpbGl0aWVzLi4uCisJCQkvLworCQkJLy8gIFdlIHByZWZlciBkZWNvZGluZyB0byAxNi1iaXQgUENNLgorCQkJLy8KKwkJCWlmIChBQ01fRk9STUFUU1VHR0VTVEZfV0JJVFNQRVJTQU1QTEUgJiBmZHdTdWdnZXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggKDE2ICE9IGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0JpdHNQZXJTYW1wbGUpICYmICg4ICE9IGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0JpdHNQZXJTYW1wbGUpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBQ01FUlJfTk9UUE9TU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorCQkJeworICAgICAgICAgICAgICAgIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0JpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIH0KKworCQkJLy8JCQlhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5CbG9ja0FsaWduID0gRk9STUFUX0JMT0NLX0FMSUdOOworCQkJYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uQmxvY2tBbGlnbiA9IGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+bkNoYW5uZWxzICogYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT53Qml0c1BlclNhbXBsZSAvIDg7CisJCQkKKwkJCS8vLyBcdG9kbyB0aGlzIHZhbHVlIG11c3QgYmUgYSBjb3JyZWN0IG9uZSAhCisJCQlhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5BdmdCeXRlc1BlclNlYyA9IGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+blNhbXBsZXNQZXJTZWMgKiBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5DaGFubmVscyAqIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0JpdHNQZXJTYW1wbGUgLyA4OworCisJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiU3VnZ2VzdCBzdWNjZWVkIik7CisJCQlSZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOworCisKKwkJCWJyZWFrOworCX0KKworCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJTdWdnZXN0ZWQgZGVzdGluYXRpb24gZm9ybWF0ID0gMHglMDRYLCBjaGFubmVscyA9ICVkLCBTYW1wbGVzL3MgPSAlZCwgQXZnQi9zID0gJWQsIEJsb2NrQWxpZ24gPSAlZCwgYi9zYW1wbGUgPSAlZCIsCisJCQkJIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+d0Zvcm1hdFRhZywKKwkJCQkgYV9Gb3JtYXRTdWdnZXN0LT5wd2Z4RHN0LT5uQ2hhbm5lbHMsCisJCQkJIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+blNhbXBsZXNQZXJTZWMsCisJCQkJIGFfRm9ybWF0U3VnZ2VzdC0+cHdmeERzdC0+bkF2Z0J5dGVzUGVyU2VjLAorCQkJCSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPm5CbG9ja0FsaWduLAorCQkJCSBhX0Zvcm1hdFN1Z2dlc3QtPnB3ZnhEc3QtPndCaXRzUGVyU2FtcGxlKTsKKworCXJldHVybiBSZXN1bHQ7Cit9CisKKy8qIQorCUNyZWF0ZSBhIHN0cmVhbSBpbnN0YW5jZSBmb3IgZGVjb2RpbmcvZW5jb2RpbmcKKworCVxwYXJhbSBhX1N0cmVhbUluc3RhbmNlIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmVhbSBkZXNpcmVkCisqLworaW5saW5lIERXT1JEIEFDTTo6T25TdHJlYW1PcGVuKExQQUNNRFJWU1RSRUFNSU5TVEFOQ0UgYV9TdHJlYW1JbnN0YW5jZSkKK3sKKwlEV09SRCBSZXN1bHQgPSBBQ01FUlJfTk9UUE9TU0lCTEU7CisKKwkvLworCS8vICB0aGUgbW9zdCBpbXBvcnRhbnQgY29uZGl0aW9uIHRvIGNoZWNrIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlCisJLy8gIGlzIHRoYXQgdGhpcyBBQ00gZHJpdmVyIGNhbiBhY3R1YWxseSBwZXJmb3JtIHRoZSBjb252ZXJzaW9uIHdlIGFyZQorCS8vICBiZWluZyBvcGVuZWQgZm9yLiB0aGlzIGNoZWNrIHNob3VsZCBmYWlsIGFzIHF1aWNrbHkgYXMgcG9zc2libGUKKwkvLyAgaWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHBvc3NpYmxlIGJ5IHRoaXMgZHJpdmVyLgorCS8vCisJLy8gIGl0IGlzIFZFUlkgaW1wb3J0YW50IHRvIGZhaWwgcXVpY2tseSBzbyB0aGUgQUNNIGNhbiBhdHRlbXB0IHRvCisJLy8gIGZpbmQgYSBkcml2ZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IgdGhlIGNvbnZlcnNpb24uIGFsc28gbm90ZSB0aGF0CisJLy8gIHRoZSBBQ00gbWF5IGNhbGwgdGhpcyBkcml2ZXIgc2V2ZXJhbCB0aW1lcyB3aXRoIHNsaWdodGx5IGRpZmZlcmVudAorCS8vICBmb3JtYXQgc3BlY2lmaWNhdGlvbnMgYmVmb3JlIGdpdmluZyB1cC4KKwkvLworCS8vICB0aGlzIGRyaXZlciBmaXJzdCB2ZXJpZmllcyB0aGF0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZvcm1hdHMKKwkvLyAgYXJlIGFjY2VwdGFibGUuLi4KKwkvLworCXN3aXRjaCAoYV9TdHJlYW1JbnN0YW5jZS0+cHdmeFNyYy0+d0Zvcm1hdFRhZykKKwl7CisgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfUENNOgorCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIk9wZW4gc3RyZWFtIGZvciBQQ00gc291cmNlICglMDVkIHNhbXBsZXMgJWQgY2hhbm5lbHMgJWQgYml0cy9zYW1wbGUpIixhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT5uU2FtcGxlc1BlclNlYyxhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT5uQ2hhbm5lbHMsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeFNyYy0+d0JpdHNQZXJTYW1wbGUpOworCQkJaWYgKGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPndGb3JtYXRUYWcgPT0gUEVSU09OQUxfRk9STUFUKQorCQkJeworCQkJCXVuc2lnbmVkIGludCBPdXRwdXRGcmVxdWVuY3k7CisKKwkJCQkvLy8gXHRvZG8gU21hcnQgbW9kZQorCQkJCWlmIChteV9FbmNvZGluZ1Byb3BlcnRpZXMuR2V0U21hcnRPdXRwdXRNb2RlKCkpCisJCQkJCU91dHB1dEZyZXF1ZW5jeSA9IEFDTVN0cmVhbTo6R2V0T3V0cHV0U2FtcGxlUmF0ZShhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT5uU2FtcGxlc1BlclNlYyxhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT5uQXZnQnl0ZXNQZXJTZWMsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+bkNoYW5uZWxzKTsKKwkJCQllbHNlCisJCQkJCU91dHB1dEZyZXF1ZW5jeSA9IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPm5TYW1wbGVzUGVyU2VjOworCisJCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIk9wZW4gc3RyZWFtIGZvciBQRVJTT05BTCBvdXRwdXQgKCUwNWQgc2FtcGxlcyAlZCBjaGFubmVscyAlZCBiaXRzL3NhbXBsZSAlZCBrYnBzKSIsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+blNhbXBsZXNQZXJTZWMsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+bkNoYW5uZWxzLGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPndCaXRzUGVyU2FtcGxlLDggKiBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT5uQXZnQnl0ZXNQZXJTZWMpOworCisJCQkJLy8vIFx0b2RvIGFkZCB0aGUgcG9zc2liaWxpdHkgdG8gaGF2ZSBjaGFubmVsIHJlc2FtcGxpbmcgKG1vbm8gdG8gc3RlcmVvIC8gc3RlcmVvIHRvIG1vbm8pCisJCQkJLy8vIFx0b2RvIHN1cHBvcnQgcmVzYW1wbGluZyA/CisJCQkJLy8vIFx0b2RvIG9ubHkgZG8gdGhlIHRlc3Qgb24gT3V0cHV0RnJlcXVlbmN5IGluICJTbWFydCBPdXRwdXQiIG1vZGUKKwkJCQlpZiAoYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+blNhbXBsZXNQZXJTZWMgIT0gT3V0cHV0RnJlcXVlbmN5IHx8CisvLwkJCQkJYV9TdHJlYW1JbnN0YW5jZS0+cHdmeFNyYy0+blNhbXBsZXNQZXJTZWMgIT0gYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+blNhbXBsZXNQZXJTZWMgfHwKKwkJCQkJYV9TdHJlYW1JbnN0YW5jZS0+cHdmeFNyYy0+bkNoYW5uZWxzICE9IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPm5DaGFubmVscyB8fAorCQkJCQlhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT53Qml0c1BlclNhbXBsZSAhPSAxNikKKwkJCQl7CisJCQkJCVJlc3VsdCA9IEFDTUVSUl9OT1RQT1NTSUJMRTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKGFfU3RyZWFtSW5zdGFuY2UtPmZkd09wZW4gJiBBQ01fU1RSRUFNT1BFTkZfUVVFUlkpID09IDApCisJCQkJCXsKKwkJCQkJCUFDTVN0cmVhbSAqIHRoZV9zdHJlYW0gPSBBQ01TdHJlYW06OkNyZWF0ZSgpOworCQkJCQkJYV9TdHJlYW1JbnN0YW5jZS0+ZHdJbnN0YW5jZSA9IChEV09SRCkgdGhlX3N0cmVhbTsKKworCQkJCQkJaWYgKHRoZV9zdHJlYW0gIT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlNUEVHTEFZRVIzV0FWRUZPUk1BVCAqIGNhc3RlZCA9IChNUEVHTEFZRVIzV0FWRUZPUk1BVCAqKSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0OworCQkJCQkJCXZicl9tb2RlIGFfbW9kZSA9IChjYXN0ZWQtPmZkd0ZsYWdzLTIgPT0gMCk/dmJyX2Ficjp2YnJfb2ZmOworCQkJCQkJCWlmICh0aGVfc3RyZWFtLT5pbml0KGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPm5TYW1wbGVzUGVyU2VjLAorCQkJCQkJCQkJCQkJIE91dHB1dEZyZXF1ZW5jeSwKKwkJCQkJCQkJCQkJCSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT5uQ2hhbm5lbHMsCisJCQkJCQkJCQkJCQkgYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+bkF2Z0J5dGVzUGVyU2VjLAorCQkJCQkJCQkJCQkJIGFfbW9kZSkpCisJCQkJCQkJCVJlc3VsdCA9IE1NU1lTRVJSX05PRVJST1I7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlBQ01TdHJlYW06OkVyYXNlKCB0aGVfc3RyZWFtICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUEVSU09OQUxfRk9STUFUOgorCQkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIk9wZW4gc3RyZWFtIGZvciBQRVJTT05BTCBzb3VyY2UgKCUwNWQgc2FtcGxlcyAlZCBjaGFubmVscyAlZCBiaXRzL3NhbXBsZSAlZCBrYnBzKSIsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeFNyYy0+blNhbXBsZXNQZXJTZWMsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeFNyYy0+bkNoYW5uZWxzLGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPndCaXRzUGVyU2FtcGxlLDggKiBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT5uQXZnQnl0ZXNQZXJTZWMpOworCQkJaWYgKGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPndGb3JtYXRUYWcgPT0gV0FWRV9GT1JNQVRfUENNKQorCQkJeworI2lmZGVmIEVOQUJMRV9ERUNPRElORworCQkJCWlmICgoYV9TdHJlYW1JbnN0YW5jZS0+ZmR3T3BlbiAmIEFDTV9TVFJFQU1PUEVORl9RVUVSWSkgPT0gMCkKKwkJCQl7CisJCQkJCS8vLyBcdG9kbyBjcmVhdGUgdGhlIGRlY29kaW5nIHN0cmVhbQorCQkJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiT3BlbiBzdHJlYW0gZm9yIFBDTSBvdXRwdXQgKCUwNWQgc2FtcGxlcyAlZCBjaGFubmVscyAlZCBiaXRzL3NhbXBsZSAlZCBCL3MpIixhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT5uU2FtcGxlc1BlclNlYyxhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT5uQ2hhbm5lbHMsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+d0JpdHNQZXJTYW1wbGUsYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+bkF2Z0J5dGVzUGVyU2VjKTsKKworCQkJCQlEZWNvZGVTdHJlYW0gKiB0aGVfc3RyZWFtID0gRGVjb2RlU3RyZWFtOjpDcmVhdGUoKTsKKwkJCQkJYV9TdHJlYW1JbnN0YW5jZS0+ZHdJbnN0YW5jZSA9IChEV09SRCkgdGhlX3N0cmVhbTsKKworCQkJCQlpZiAodGhlX3N0cmVhbSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlpZiAodGhlX3N0cmVhbS0+aW5pdChhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT5uU2FtcGxlc1BlclNlYywKKwkJCQkJCQkJCQkJIGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPm5DaGFubmVscywKKwkJCQkJCQkJCQkJIGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPm5BdmdCeXRlc1BlclNlYywKKwkJCQkJCQkJCQkJIGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPm5BdmdCeXRlc1BlclNlYykpCisJCQkJCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKwkJCQkJCWVsc2UKKwkJCQkJCQlEZWNvZGVTdHJlYW06OkVyYXNlKCB0aGVfc3RyZWFtICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8vIFx0b2RvIGRlY29kaW5nIHZlcmlmaWNhdGlvbgorCQkJCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiT3BlbiBzdHJlYW0gaXMgdmFsaWQiKTsKKwkJCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKwkJCQl9CisjZW5kaWYgLy8gRU5BQkxFX0RFQ09ESU5HCisJCQl9CisJCQlicmVhazsKKwl9CisKKwlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiT3BlbiBzdHJlYW0gUmVzdWx0ID0gJWQiLFJlc3VsdCk7CisJcmV0dXJuIFJlc3VsdDsKK30KKworaW5saW5lIERXT1JEIEFDTTo6T25TdHJlYW1TaXplKExQQUNNRFJWU1RSRUFNSU5TVEFOQ0UgYV9TdHJlYW1JbnN0YW5jZSwgTFBBQ01EUlZTVFJFQU1TSVpFIHRoZV9TdHJlYW1TaXplKQoreworCURXT1JEIFJlc3VsdCA9IEFDTUVSUl9OT1RQT1NTSUJMRTsKKworICAgIHN3aXRjaCAoQUNNX1NUUkVBTVNJWkVGX1FVRVJZTUFTSyAmIHRoZV9TdHJlYW1TaXplLT5mZHdTaXplKQorICAgIHsKKwljYXNlIEFDTV9TVFJFQU1TSVpFRl9ERVNUSU5BVElPTjoKKwkJbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIkdldCBzb3VyY2UgYnVmZmVyIHNpemUgZm9yIGRlc3RpbmF0aW9uIHNpemUgPSAlZCIsdGhlX1N0cmVhbVNpemUtPmNiRHN0TGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBBQ01fU1RSRUFNU0laRUZfU09VUkNFOgorCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiR2V0IGRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplIGZvciBzb3VyY2Ugc2l6ZSA9ICVkIix0aGVfU3RyZWFtU2l6ZS0+Y2JTcmNMZW5ndGgpOworICAgICAgICBpZiAoV0FWRV9GT1JNQVRfUENNID09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPndGb3JtYXRUYWcgJiYKKwkJCVBFUlNPTkFMX0ZPUk1BVCA9PSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT53Rm9ybWF0VGFnKQorICAgICAgICB7CisJCQlBQ01TdHJlYW0gKiB0aGVfc3RyZWFtID0gKEFDTVN0cmVhbSAqKSBhX1N0cmVhbUluc3RhbmNlLT5kd0luc3RhbmNlOworCQkJaWYgKHRoZV9zdHJlYW0gIT0gTlVMTCkKKwkJCXsKKwkJCQl0aGVfU3RyZWFtU2l6ZS0+Y2JEc3RMZW5ndGggPSB0aGVfc3RyZWFtLT5HZXRPdXRwdXRTaXplRm9ySW5wdXQodGhlX1N0cmVhbVNpemUtPmNiU3JjTGVuZ3RoKTsKKwkJCQlSZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOworCQkJfQorCQl9CisgICAgICAgIGVsc2UgaWYgKFBFUlNPTkFMX0ZPUk1BVCA9PSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT53Rm9ybWF0VGFnICYmCisJCQkgV0FWRV9GT1JNQVRfUENNPT0gYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+d0Zvcm1hdFRhZykKKwkJeworI2lmZGVmIEVOQUJMRV9ERUNPRElORworCQkJRGVjb2RlU3RyZWFtICogdGhlX3N0cmVhbSA9IChEZWNvZGVTdHJlYW0gKikgYV9TdHJlYW1JbnN0YW5jZS0+ZHdJbnN0YW5jZTsKKwkJCWlmICh0aGVfc3RyZWFtICE9IE5VTEwpCisJCQl7CisJCQkJdGhlX1N0cmVhbVNpemUtPmNiRHN0TGVuZ3RoID0gdGhlX3N0cmVhbS0+R2V0T3V0cHV0U2l6ZUZvcklucHV0KHRoZV9TdHJlYW1TaXplLT5jYlNyY0xlbmd0aCk7CisJCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKwkJCX0KKyNlbmRpZiAvLyBFTkFCTEVfREVDT0RJTkcKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlSZXN1bHQgPSBNTVNZU0VSUl9JTlZBTEZMQUc7CisJCWJyZWFrOworCX0KKworCXJldHVybiBSZXN1bHQ7Cit9CisKK2lubGluZSBEV09SRCBBQ006Ok9uU3RyZWFtQ2xvc2UoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSBhX1N0cmVhbUluc3RhbmNlKQoreworCURXT1JEIFJlc3VsdCA9IEFDTUVSUl9OT1RQT1NTSUJMRTsKKworCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJPblN0cmVhbUNsb3NlIHRoZSBzdHJlYW0gMHglWCIsYV9TdHJlYW1JbnN0YW5jZS0+ZHdJbnN0YW5jZSk7CisgICAgaWYgKFdBVkVfRk9STUFUX1BDTSA9PSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT53Rm9ybWF0VGFnICYmCisJCVBFUlNPTkFMX0ZPUk1BVCA9PSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT53Rm9ybWF0VGFnKQorICAgIHsKKwlBQ01TdHJlYW06OkVyYXNlKCAoQUNNU3RyZWFtICopIGFfU3RyZWFtSW5zdGFuY2UtPmR3SW5zdGFuY2UgKTsKKwl9CisgICAgZWxzZSBpZiAoUEVSU09OQUxfRk9STUFUID09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPndGb3JtYXRUYWcgJiYKKwkJIFdBVkVfRk9STUFUX1BDTT09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPndGb3JtYXRUYWcpCisgICAgeworI2lmZGVmIEVOQUJMRV9ERUNPRElORworCQlEZWNvZGVTdHJlYW06OkVyYXNlKCAoRGVjb2RlU3RyZWFtICopIGFfU3RyZWFtSW5zdGFuY2UtPmR3SW5zdGFuY2UgKTsKKyNlbmRpZiAvLyBFTkFCTEVfREVDT0RJTkcKKwl9CisKKwkvLyBub3RoaW5nIHRvIGRvIHlldAorCVJlc3VsdCA9IE1NU1lTRVJSX05PRVJST1I7CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitpbmxpbmUgRFdPUkQgQUNNOjpPblN0cmVhbVByZXBhcmVIZWFkZXIoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSBhX1N0cmVhbUluc3RhbmNlLCBMUEFDTVNUUkVBTUhFQURFUiBhX1N0cmVhbUhlYWRlcikKK3sKKwlEV09SRCBSZXN1bHQgPSBBQ01FUlJfTk9UUE9TU0lCTEU7CisKKwlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiICBwcmVwYXJlIDogU3JjIDogJWQgKDB4JTA4WCkgLyAlZCAtIERzdCA6ICVkICgweCUwOFgpIC8gJWQiCisJCQkJCQkJCQkJCQksIGFfU3RyZWFtSGVhZGVyLT5jYlNyY0xlbmd0aAorCQkJCQkJCQkJCQkJLCBhX1N0cmVhbUhlYWRlci0+cGJTcmMKKwkJCQkJCQkJCQkJCSwgYV9TdHJlYW1IZWFkZXItPmNiU3JjTGVuZ3RoVXNlZAorCQkJCQkJCQkJCQkJLCBhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGgKKwkJCQkJCQkJCQkJCSwgYV9TdHJlYW1IZWFkZXItPnBiRHN0CisJCQkJCQkJCQkJCQksIGFfU3RyZWFtSGVhZGVyLT5jYkRzdExlbmd0aFVzZWQKKwkJCQkJCQkJCQkJICApOworCisJaWYgKFdBVkVfRk9STUFUX1BDTSA9PSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT53Rm9ybWF0VGFnICYmCisJCVBFUlNPTkFMX0ZPUk1BVCA9PSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4RHN0LT53Rm9ybWF0VGFnKQorCXsKKwkJQUNNU3RyZWFtICogdGhlX3N0cmVhbSA9IChBQ01TdHJlYW0gKilhX1N0cmVhbUluc3RhbmNlLT5kd0luc3RhbmNlOworCQkKKwkJaWYgKHRoZV9zdHJlYW0tPm9wZW4obXlfRW5jb2RpbmdQcm9wZXJ0aWVzKSkKKwkJCVJlc3VsdCA9IE1NU1lTRVJSX05PRVJST1I7CisJfQorCWVsc2UgaWYgKFBFUlNPTkFMX0ZPUk1BVCA9PSBhX1N0cmVhbUluc3RhbmNlLT5wd2Z4U3JjLT53Rm9ybWF0VGFnICYmCisJCSAgICAgV0FWRV9GT1JNQVRfUENNID09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPndGb3JtYXRUYWcpCisJeworI2lmZGVmIEVOQUJMRV9ERUNPRElORworCQlEZWNvZGVTdHJlYW0gKiB0aGVfc3RyZWFtID0gKERlY29kZVN0cmVhbSAqKWFfU3RyZWFtSW5zdGFuY2UtPmR3SW5zdGFuY2U7CisJCQorCQlpZiAodGhlX3N0cmVhbS0+b3BlbigpKQorCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKyNlbmRpZiAvLyBFTkFCTEVfREVDT0RJTkcKKwl9CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitpbmxpbmUgRFdPUkQgQUNNOjpPblN0cmVhbVVuUHJlcGFyZUhlYWRlcihMUEFDTURSVlNUUkVBTUlOU1RBTkNFIGFfU3RyZWFtSW5zdGFuY2UsIExQQUNNU1RSRUFNSEVBREVSIGFfU3RyZWFtSGVhZGVyKQoreworCURXT1JEIFJlc3VsdCA9IEFDTUVSUl9OT1RQT1NTSUJMRTsKKworCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJ1bnByZXBhcmUgOiBTcmMgOiAlZCAvICVkIC0gRHN0IDogJWQgLyAlZCIKKwkJCQkJCQkJCQkJLCBhX1N0cmVhbUhlYWRlci0+Y2JTcmNMZW5ndGgKKwkJCQkJCQkJCQkJLCBhX1N0cmVhbUhlYWRlci0+Y2JTcmNMZW5ndGhVc2VkCisJCQkJCQkJCQkJCSwgYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoCisJCQkJCQkJCQkJCSwgYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoVXNlZAorCQkJCQkJCQkJCQkpOworICAgIGlmIChXQVZFX0ZPUk1BVF9QQ00gPT0gYV9TdHJlYW1JbnN0YW5jZS0+cHdmeFNyYy0+d0Zvcm1hdFRhZyAmJgorCQlQRVJTT05BTF9GT1JNQVQgPT0gYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+d0Zvcm1hdFRhZykKKyAgICB7CisJQUNNU3RyZWFtICogdGhlX3N0cmVhbSA9IChBQ01TdHJlYW0gKilhX1N0cmVhbUluc3RhbmNlLT5kd0luc3RhbmNlOworCURXT1JEIE91dHB1dFNpemUgPSBhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGg7CisJCisJaWYgKHRoZV9zdHJlYW0tPmNsb3NlKGFfU3RyZWFtSGVhZGVyLT5wYkRzdCwgJk91dHB1dFNpemUpICYmIChPdXRwdXRTaXplIDw9IGFfU3RyZWFtSGVhZGVyLT5jYkRzdExlbmd0aCkpCisJeworCQlhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGhVc2VkID0gT3V0cHV0U2l6ZTsKKwkJCVJlc3VsdCA9IE1NU1lTRVJSX05PRVJST1I7CisJCX0KKwl9CisgICAgZWxzZSBpZiAoUEVSU09OQUxfRk9STUFUID09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPndGb3JtYXRUYWcgJiYKKwkJIFdBVkVfRk9STUFUX1BDTT09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPndGb3JtYXRUYWcpCisgICAgeworI2lmZGVmIEVOQUJMRV9ERUNPRElORworCQlEZWNvZGVTdHJlYW0gKiB0aGVfc3RyZWFtID0gKERlY29kZVN0cmVhbSAqKWFfU3RyZWFtSW5zdGFuY2UtPmR3SW5zdGFuY2U7CisJCURXT1JEIE91dHB1dFNpemUgPSBhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGg7CisJCQorCQlpZiAodGhlX3N0cmVhbS0+Y2xvc2UoYV9TdHJlYW1IZWFkZXItPnBiRHN0LCAmT3V0cHV0U2l6ZSkgJiYgKE91dHB1dFNpemUgPD0gYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoKSkKKwkJeworCQkJYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoVXNlZCA9IE91dHB1dFNpemU7CisJCQlSZXN1bHQgPSBNTVNZU0VSUl9OT0VSUk9SOworCX0KKyNlbmRpZiAvLyBFTkFCTEVfREVDT0RJTkcKKwl9CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitpbmxpbmUgRFdPUkQgQUNNOjpPblN0cmVhbUNvbnZlcnQoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSBhX1N0cmVhbUluc3RhbmNlLCBMUEFDTURSVlNUUkVBTUhFQURFUiBhX1N0cmVhbUhlYWRlcikKK3sKKwlEV09SRCBSZXN1bHQgPSBBQ01FUlJfTk9UUE9TU0lCTEU7CisKKwlpZiAoV0FWRV9GT1JNQVRfUENNID09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPndGb3JtYXRUYWcgJiYKKwkJUEVSU09OQUxfRk9STUFUID09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhEc3QtPndGb3JtYXRUYWcpCisJeworCQlteV9kZWJ1Zy5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiT25TdHJlYW1Db252ZXJ0IFNSQyA9IFBDTSAoZW5jb2RlKSIpOworCisJCUFDTVN0cmVhbSAqIHRoZV9zdHJlYW0gPSAoQUNNU3RyZWFtICopIGFfU3RyZWFtSW5zdGFuY2UtPmR3SW5zdGFuY2U7CisJCWlmICh0aGVfc3RyZWFtICE9IE5VTEwpCisJCXsKKwkJCWlmICh0aGVfc3RyZWFtLT5Db252ZXJ0QnVmZmVyKCBhX1N0cmVhbUhlYWRlciApKQorCQkJCVJlc3VsdCA9IE1NU1lTRVJSX05PRVJST1I7CisJCX0KKwl9CisJZWxzZSBpZiAoUEVSU09OQUxfRk9STUFUID09IGFfU3RyZWFtSW5zdGFuY2UtPnB3ZnhTcmMtPndGb3JtYXRUYWcgJiYKKwkJICAgICBXQVZFX0ZPUk1BVF9QQ00gPT0gYV9TdHJlYW1JbnN0YW5jZS0+cHdmeERzdC0+d0Zvcm1hdFRhZykKKwl7CisJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJPblN0cmVhbUNvbnZlcnQgU1JDID0gTVAzIChkZWNvZGUpIik7CisKKyNpZmRlZiBFTkFCTEVfREVDT0RJTkcKKwkJRGVjb2RlU3RyZWFtICogdGhlX3N0cmVhbSA9IChEZWNvZGVTdHJlYW0gKikgYV9TdHJlYW1JbnN0YW5jZS0+ZHdJbnN0YW5jZTsKKwkJaWYgKHRoZV9zdHJlYW0gIT0gTlVMTCkKKwkJeworCQkJaWYgKHRoZV9zdHJlYW0tPkNvbnZlcnRCdWZmZXIoIGFfU3RyZWFtSGVhZGVyICkpCisJCQkJUmVzdWx0ID0gTU1TWVNFUlJfTk9FUlJPUjsKKwkJfQorI2VuZGlmIC8vIEVOQUJMRV9ERUNPRElORworCX0KKwllbHNlCisJCW15X2RlYnVnLk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJPblN0cmVhbUNvbnZlcnQgdW5zdXBwb3J0ZWQgY29udmVyc2lvbiIpOworCisJcmV0dXJuIFJlc3VsdDsKK30KKworCit2b2lkIEFDTTo6R2V0TVAzRm9ybWF0Rm9ySW5kZXgoY29uc3QgRFdPUkQgdGhlX0luZGV4LCBXQVZFRk9STUFURVggJiB0aGVfRm9ybWF0LCB1bnNpZ25lZCBzaG9ydCB0aGVfU3RyaW5nW0FDTUZPUk1BVERFVEFJTFNfRk9STUFUX0NIQVJTXSkgY29uc3QKK3sKKwlpbnQgQmxvY2tfc2l6ZTsKKyAgICBjaGFyIHRlbXBbQUNNRk9STUFUREVUQUlMU19GT1JNQVRfQ0hBUlNdOworCisKKwlpZiAodGhlX0luZGV4IDwgYml0cmF0ZV90YWJsZS5zaXplKCkpCisJeworCS8vCXRoZV9Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPSAxNjsKKwkJdGhlX0Zvcm1hdC53Qml0c1BlclNhbXBsZSA9IDA7CisJCisJCS8vLyBcdG9kbyBoYW5kbGUgbW9yZSBjaGFubmVsIG1vZGVzIChtb25vLCBzdGVyZW8sIGpvaW50LXN0ZXJlbywgZHVhbC1jaGFubmVsKQorCS8vCXRoZV9Gb3JtYXQubkNoYW5uZWxzID0gU0laRV9DSEFOTkVMX01PREUgLSBpbnQodGhlX0luZGV4ICUgU0laRV9DSEFOTkVMX01PREUpOworCQorCQl0aGVfRm9ybWF0Lm5CbG9ja0FsaWduID0gMTsKKworCQl0aGVfRm9ybWF0Lm5TYW1wbGVzUGVyU2VjID0gYml0cmF0ZV90YWJsZVt0aGVfSW5kZXhdLmZyZXF1ZW5jeTsKKwkJdGhlX0Zvcm1hdC5uQXZnQnl0ZXNQZXJTZWMgPSBiaXRyYXRlX3RhYmxlW3RoZV9JbmRleF0uYml0cmF0ZSAqIDEwMDAgLyA4OworCQlpZiAoYml0cmF0ZV90YWJsZVt0aGVfSW5kZXhdLmZyZXF1ZW5jeSA+PSBtcGVnMV9mcmVxW1NJWkVfRlJFUV9NUEVHMS0xXSkKKwkJCUJsb2NrX3NpemUgPSAxMTUyOworCQllbHNlCisJCQlCbG9ja19zaXplID0gNTc2OworCQorCQl0aGVfRm9ybWF0Lm5DaGFubmVscyA9IGJpdHJhdGVfdGFibGVbdGhlX0luZGV4XS5jaGFubmVsczsKKworCQl0aGVfRm9ybWF0LmNiU2l6ZSA9IHNpemVvZihNUEVHTEFZRVIzV0FWRUZPUk1BVCkgLSBzaXplb2YoV0FWRUZPUk1BVEVYKTsKKwkJTVBFR0xBWUVSM1dBVkVGT1JNQVQgKiB0bXBGb3JtYXQgPSAoTVBFR0xBWUVSM1dBVkVGT1JNQVQgKikgJnRoZV9Gb3JtYXQ7CisJCXRtcEZvcm1hdC0+d0lEICAgICAgICAgICAgID0gMTsKKwkJLy8gdGhpcyBpcyB0aGUgb25seSB3YXkgSSBmb3VuZCB0byBrbm93IGlmIHdlIGRvIENCUiBvciBBQlIKKwkJdG1wRm9ybWF0LT5mZHdGbGFncyAgICAgICAgPSAyICsgKChiaXRyYXRlX3RhYmxlW3RoZV9JbmRleF0ubW9kZSA9PSB2YnJfYWJyKT8wOjIpOworCQl0bXBGb3JtYXQtPm5CbG9ja1NpemUgICAgICA9IFdPUkQoQmxvY2tfc2l6ZSAqIHRoZV9Gb3JtYXQubkF2Z0J5dGVzUGVyU2VjIC8gdGhlX0Zvcm1hdC5uU2FtcGxlc1BlclNlYyk7CisJCXRtcEZvcm1hdC0+bkZyYW1lc1BlckJsb2NrID0gMTsKKwkJdG1wRm9ybWF0LT5uQ29kZWNEZWxheSAgICAgPSAwOyAvLyAweDA1NzEgb24gRkhHCisJCisgICAgICAgICAvLy8gXHRvZG8gOiBnZW5lcmF0ZSB0aGUgc3RyaW5nIHdpdGggdGhlIGFwcHJvcHJpYXRlIHN0ZXJlbyBtb2RlCisgICAgICAgICBpZiAoYml0cmF0ZV90YWJsZVt0aGVfSW5kZXhdLm1vZGUgPT0gdmJyX2FicikKKyAgICAgICAgICAgICB3c3ByaW50ZkEoIHRlbXAsICIlZCBIeiwgJWQga2JwcyBBQlIsICVzIiwgdGhlX0Zvcm1hdC5uU2FtcGxlc1BlclNlYywgdGhlX0Zvcm1hdC5uQXZnQnl0ZXNQZXJTZWMgKiA4IC8gMTAwMCwgKHRoZV9Gb3JtYXQubkNoYW5uZWxzID09IDEpPyJNb25vIjoiU3RlcmVvIik7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgd3NwcmludGZBKCB0ZW1wLCAiJWQgSHosICVkIGticHMgQ0JSLCAlcyIsIHRoZV9Gb3JtYXQublNhbXBsZXNQZXJTZWMsIHRoZV9Gb3JtYXQubkF2Z0J5dGVzUGVyU2VjICogOCAvIDEwMDAsICh0aGVfRm9ybWF0Lm5DaGFubmVscyA9PSAxKT8iTW9ubyI6IlN0ZXJlbyIpOworCisgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgTUJfUFJFQ09NUE9TRUQsIHRlbXAsIC0xLCB0aGVfU3RyaW5nLCBBQ01GT1JNQVRERVRBSUxTX0ZPUk1BVF9DSEFSUyk7CisgICAgIH0KKyB9CisKK3ZvaWQgQUNNOjpHZXRQQ01Gb3JtYXRGb3JJbmRleChjb25zdCBEV09SRCB0aGVfSW5kZXgsIFdBVkVGT1JNQVRFWCAmIHRoZV9Gb3JtYXQsIHVuc2lnbmVkIHNob3J0IHRoZV9TdHJpbmdbQUNNRk9STUFUREVUQUlMU19GT1JNQVRfQ0hBUlNdKSBjb25zdAoreworCXRoZV9Gb3JtYXQubkNoYW5uZWxzID0gU0laRV9DSEFOTkVMX01PREUgLSBpbnQodGhlX0luZGV4ICUgU0laRV9DSEFOTkVMX01PREUpOworCXRoZV9Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPSAxNjsKKwl0aGVfRm9ybWF0Lm5CbG9ja0FsaWduID0gdGhlX0Zvcm1hdC5uQ2hhbm5lbHMgKiB0aGVfRm9ybWF0LndCaXRzUGVyU2FtcGxlIC8gODsKKworCisJRFdPUkQgYV9DaGFubmVsX0luZGVwZW5kZW50ID0gdGhlX0luZGV4IC8gU0laRV9DSEFOTkVMX01PREU7CisKKwkvLyBmaXJzdCBNUEVHMSBmcmVxdWVuY2llcworCWlmIChhX0NoYW5uZWxfSW5kZXBlbmRlbnQgPCBTSVpFX0ZSRVFfTVBFRzEpCisJeworCQl0aGVfRm9ybWF0Lm5TYW1wbGVzUGVyU2VjID0gbXBlZzFfZnJlcVthX0NoYW5uZWxfSW5kZXBlbmRlbnRdOworCX0KKwllbHNlCisJeworCQlhX0NoYW5uZWxfSW5kZXBlbmRlbnQgLT0gU0laRV9GUkVRX01QRUcxOworCQl0aGVfRm9ybWF0Lm5TYW1wbGVzUGVyU2VjID0gbXBlZzJfZnJlcVthX0NoYW5uZWxfSW5kZXBlbmRlbnRdOworCX0KKworCXRoZV9Gb3JtYXQubkF2Z0J5dGVzUGVyU2VjID0gdGhlX0Zvcm1hdC5uU2FtcGxlc1BlclNlYyAqIHRoZV9Gb3JtYXQubkNoYW5uZWxzICogdGhlX0Zvcm1hdC53Qml0c1BlclNhbXBsZSAvIDg7Cit9CisKK0RXT1JEIEFDTTo6R2V0TnVtYmVyRW5jb2RpbmdGb3JtYXRzKCkgY29uc3QKK3sKKwlyZXR1cm4gYml0cmF0ZV90YWJsZS5zaXplKCk7Cit9CisKK2Jvb2wgQUNNOjpJc1NtYXJ0T3V0cHV0KGNvbnN0IGludCBmcmVxdWVuY3ksIGNvbnN0IGludCBiaXRyYXRlLCBjb25zdCBpbnQgY2hhbm5lbHMpIGNvbnN0Cit7CisJZG91YmxlIGNvbXByZXNzaW9uX3JhdGlvID0gZG91YmxlKGZyZXF1ZW5jeSAqIDIgKiBjaGFubmVscykgLyBkb3VibGUoYml0cmF0ZSAqIDEwMCk7CisKKy8vbXlfZGVidWcuT3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJjb21wcmVzc2lvbl9yYXRpbyAlZiwgZnJlcSAlZCwgYml0cmF0ZSAlZCwgY2hhbm5lbHMgJWQiLCBjb21wcmVzc2lvbl9yYXRpbywgZnJlcXVlbmN5LCBiaXRyYXRlLCBjaGFubmVscyk7CisKKwlpZihteV9FbmNvZGluZ1Byb3BlcnRpZXMuR2V0U21hcnRPdXRwdXRNb2RlKCkpCisJCXJldHVybiAoY29tcHJlc3Npb25fcmF0aW8gPD0gbXlfRW5jb2RpbmdQcm9wZXJ0aWVzLkdldFNtYXJ0UmF0aW8oKSk7CisJZWxzZSByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBQ006OkJ1aWxkQml0cmF0ZVRhYmxlKCkKK3sKKwlteV9kZWJ1Zy5PdXRQdXQoImVudGVyaW5nIEJ1aWxkQml0cmF0ZVRhYmxlIik7CisKKwkvLyBmaWxsIHRoZSB0YWJsZQorCXVuc2lnbmVkIGludCBjaGFubmVsLGJpdHJhdGUsZnJlcTsKKwkKKwliaXRyYXRlX3RhYmxlLmNsZWFyKCk7CisKKwkvLyBDQlIgYml0cmF0ZXMKKwlmb3IgKGNoYW5uZWwgPSAwO2NoYW5uZWwgPCBTSVpFX0NIQU5ORUxfTU9ERTtjaGFubmVsKyspCisJeworCQkvLyBNUEVHIEkKKwkJZm9yIChmcmVxID0gMDtmcmVxIDwgU0laRV9GUkVRX01QRUcxO2ZyZXErKykKKwkJeworCQkJZm9yIChiaXRyYXRlID0gMDtiaXRyYXRlIDwgU0laRV9CSVRSQVRFX01QRUcxO2JpdHJhdGUrKykKKwkJCXsKKworCQkJCWlmICghbXlfRW5jb2RpbmdQcm9wZXJ0aWVzLkdldFNtYXJ0T3V0cHV0TW9kZSgpIHx8IElzU21hcnRPdXRwdXQobXBlZzFfZnJlcVtmcmVxXSwgbXBlZzFfYml0cmF0ZVtiaXRyYXRlXSwgY2hhbm5lbCsxKSkKKwkJCQl7CisJCQkJCWJpdHJhdGVfaXRlbSBiaXRyYXRlX3RhYmxlX3RtcDsKKwkJCQkJCisJCQkJCWJpdHJhdGVfdGFibGVfdG1wLmZyZXF1ZW5jeSA9IG1wZWcxX2ZyZXFbZnJlcV07CisJCQkJCWJpdHJhdGVfdGFibGVfdG1wLmJpdHJhdGUgPSBtcGVnMV9iaXRyYXRlW2JpdHJhdGVdOworCQkJCQliaXRyYXRlX3RhYmxlX3RtcC5jaGFubmVscyA9IGNoYW5uZWwrMTsKKwkJCQkJYml0cmF0ZV90YWJsZV90bXAubW9kZSA9IHZicl9vZmY7CisJCQkJCWJpdHJhdGVfdGFibGUucHVzaF9iYWNrKGJpdHJhdGVfdGFibGVfdG1wKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gTVBFRyBJSSAvIElJLjUKKwkJZm9yIChmcmVxID0gMDtmcmVxIDwgU0laRV9GUkVRX01QRUcyO2ZyZXErKykKKwkJeworCQkJZm9yIChiaXRyYXRlID0gMDtiaXRyYXRlIDwgU0laRV9CSVRSQVRFX01QRUcyO2JpdHJhdGUrKykKKwkJCXsKKwkJCQlpZiAoIW15X0VuY29kaW5nUHJvcGVydGllcy5HZXRTbWFydE91dHB1dE1vZGUoKSB8fCBJc1NtYXJ0T3V0cHV0KG1wZWcyX2ZyZXFbZnJlcV0sIG1wZWcyX2JpdHJhdGVbYml0cmF0ZV0sIGNoYW5uZWwrMSkpCisJCQkJeworCQkJCQliaXRyYXRlX2l0ZW0gYml0cmF0ZV90YWJsZV90bXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlX3RhYmxlX3RtcC5mcmVxdWVuY3kgPSBtcGVnMl9mcmVxW2ZyZXFdOworCQkJCQliaXRyYXRlX3RhYmxlX3RtcC5iaXRyYXRlID0gbXBlZzJfYml0cmF0ZVtiaXRyYXRlXTsKKwkJCQkJYml0cmF0ZV90YWJsZV90bXAuY2hhbm5lbHMgPSBjaGFubmVsKzE7CisJCQkJCWJpdHJhdGVfdGFibGVfdG1wLm1vZGUgPSB2YnJfYWJyOworCQkJCQliaXRyYXRlX3RhYmxlLnB1c2hfYmFjayhiaXRyYXRlX3RhYmxlX3RtcCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKG15X0VuY29kaW5nUHJvcGVydGllcy5HZXRBYnJPdXRwdXRNb2RlKCkpCisJLy8gQUJSIGJpdHJhdGVzCisJeworCQlmb3IgKGNoYW5uZWwgPSAwO2NoYW5uZWwgPCBTSVpFX0NIQU5ORUxfTU9ERTtjaGFubmVsKyspCisJCXsKKwkJCS8vIE1QRUcgSQorCQkJZm9yIChmcmVxID0gMDtmcmVxIDwgU0laRV9GUkVRX01QRUcxO2ZyZXErKykKKwkJCXsKKwkJCQlmb3IgKGJpdHJhdGUgPSBteV9FbmNvZGluZ1Byb3BlcnRpZXMuR2V0QWJyQml0cmF0ZU1heCgpOworCQkJCQkgICBiaXRyYXRlID49IG15X0VuY29kaW5nUHJvcGVydGllcy5HZXRBYnJCaXRyYXRlTWluKCk7IAorCQkJCSAgICAgYml0cmF0ZSAtPSBteV9FbmNvZGluZ1Byb3BlcnRpZXMuR2V0QWJyQml0cmF0ZVN0ZXAoKSkKKwkJCQl7CisJCQkJCWlmIChiaXRyYXRlID49IG1wZWcxX2JpdHJhdGVbU0laRV9CSVRSQVRFX01QRUcxLTFdICYmICghbXlfRW5jb2RpbmdQcm9wZXJ0aWVzLkdldFNtYXJ0T3V0cHV0TW9kZSgpIHx8IElzU21hcnRPdXRwdXQobXBlZzFfZnJlcVtmcmVxXSwgYml0cmF0ZSwgY2hhbm5lbCsxKSkpCisJCQkJCXsKKwkJCQkJCWJpdHJhdGVfaXRlbSBiaXRyYXRlX3RhYmxlX3RtcDsKKwkJCQkJCQorCQkJCQkJYml0cmF0ZV90YWJsZV90bXAuZnJlcXVlbmN5ID0gbXBlZzFfZnJlcVtmcmVxXTsKKwkJCQkJCWJpdHJhdGVfdGFibGVfdG1wLmJpdHJhdGUgPSBiaXRyYXRlOworCQkJCQkJYml0cmF0ZV90YWJsZV90bXAuY2hhbm5lbHMgPSBjaGFubmVsKzE7CisJCQkJCQliaXRyYXRlX3RhYmxlX3RtcC5tb2RlID0gdmJyX2FicjsKKwkJCQkJCWJpdHJhdGVfdGFibGUucHVzaF9iYWNrKGJpdHJhdGVfdGFibGVfdG1wKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIE1QRUcgSUkgLyBJSS41CisJCQlmb3IgKGZyZXEgPSAwO2ZyZXEgPCBTSVpFX0ZSRVFfTVBFRzI7ZnJlcSsrKQorCQkJeworCQkJCWZvciAoYml0cmF0ZSA9IG15X0VuY29kaW5nUHJvcGVydGllcy5HZXRBYnJCaXRyYXRlTWF4KCk7CisJCQkJCSAgIGJpdHJhdGUgPj0gbXlfRW5jb2RpbmdQcm9wZXJ0aWVzLkdldEFickJpdHJhdGVNaW4oKTsgCisJCQkJICAgICBiaXRyYXRlIC09IG15X0VuY29kaW5nUHJvcGVydGllcy5HZXRBYnJCaXRyYXRlU3RlcCgpKQorCQkJCXsKKwkJCQkJaWYgKGJpdHJhdGUgPj0gbXBlZzJfYml0cmF0ZVtTSVpFX0JJVFJBVEVfTVBFRzItMV0gJiYgKCFteV9FbmNvZGluZ1Byb3BlcnRpZXMuR2V0U21hcnRPdXRwdXRNb2RlKCkgfHwgSXNTbWFydE91dHB1dChtcGVnMl9mcmVxW2ZyZXFdLCBiaXRyYXRlLCBjaGFubmVsKzEpKSkKKwkJCQkJeworCQkJCQkJYml0cmF0ZV9pdGVtIGJpdHJhdGVfdGFibGVfdG1wOworCQkJCQkJCisJCQkJCQliaXRyYXRlX3RhYmxlX3RtcC5mcmVxdWVuY3kgPSBtcGVnMl9mcmVxW2ZyZXFdOworCQkJCQkJYml0cmF0ZV90YWJsZV90bXAuYml0cmF0ZSA9IGJpdHJhdGU7CisJCQkJCQliaXRyYXRlX3RhYmxlX3RtcC5jaGFubmVscyA9IGNoYW5uZWwrMTsKKwkJCQkJCWJpdHJhdGVfdGFibGVfdG1wLm1vZGUgPSB2YnJfYWJyOworCQkJCQkJYml0cmF0ZV90YWJsZS5wdXNoX2JhY2soYml0cmF0ZV90YWJsZV90bXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gc29ydGluZyBieSBmcmVxdWVuY3kvYml0cmF0ZS9jaGFubmVsCisJc3RkOjpzb3J0KGJpdHJhdGVfdGFibGUuYmVnaW4oKSwgYml0cmF0ZV90YWJsZS5lbmQoKSk7CisKKy8qCXsKKwkJLy8gZGlzcGxheSB0ZXN0CisJCWludCBpPTA7CisJCWZvciAoaT0wOyBpPGJpdHJhdGVfdGFibGUuc2l6ZSgpO2krKykKKwkJeworCQkJbXlfZGVidWcuT3V0UHV0KCJiaXRyYXRlX3RhYmxlWyVkXS5mcmVxdWVuY3kgPSAlZCIsaSxiaXRyYXRlX3RhYmxlW2ldLmZyZXF1ZW5jeSk7CisJCQlteV9kZWJ1Zy5PdXRQdXQoImJpdHJhdGVfdGFibGVbJWRdLmJpdHJhdGUgPSAlZCIsaSxiaXRyYXRlX3RhYmxlW2ldLmJpdHJhdGUpOworCQkJbXlfZGVidWcuT3V0UHV0KCJiaXRyYXRlX3RhYmxlWyVkXS5jaGFubmVsID0gJWQiLGksYml0cmF0ZV90YWJsZVtpXS5jaGFubmVscyk7CisJCQlteV9kZWJ1Zy5PdXRQdXQoImJpdHJhdGVfdGFibGVbJWRdLkFCUiA9ICVzXG4iLGksKGJpdHJhdGVfdGFibGVbaV0ubW9kZSA9PSB2YnJfYWJyKT8iQUJSIjoiQ0JSIik7CisJCX0KKwl9Ki8KKworCW15X2RlYnVnLk91dFB1dCgibGVhdmluZyBCdWlsZEJpdHJhdGVUYWJsZSIpOworfQpkaWZmIC0tZ2l0IGEvQUNNL0FDTS5oIGIvQUNNL0FDTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWUyODAKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vQUNNLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qKgorICoKKyAqIExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lIGF0IGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisgCisvKiEKKwlcYXV0aG9yIFN0ZXZlIExob21tZQorCVx2ZXJzaW9uIFwkSWQ6IEFDTS5oLHYgMS44IDIwMDYvMTIvMjUgMjE6Mzc6MzQgcm9iZXJ0IEV4cCAkCisqLworCisjaWYgIWRlZmluZWQoX0FDTV9IX19JTkNMVURFRF8pCisjZGVmaW5lIF9BQ01fSF9fSU5DTFVERURfCisKKyNpZiBfTVNDX1ZFUiA+PSAxMDAwCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUiA+PSAxMDAwCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKyNpbmNsdWRlIDxtbXJlZy5oPgorI2luY2x1ZGUgPG1zYWNtLmg+CisjaW5jbHVkZSA8bXNhY21kcnYuaD4KKworCisjaW5jbHVkZSAiQURiZy9BRGJnLmgiCisKK2NsYXNzIEFFbmNvZGVQcm9wZXJ0aWVzOworCit0eXBlZGVmIGVudW0gdmJyX21vZGVfZSB2YnJfbW9kZTsKKworY2xhc3MgYml0cmF0ZV9pdGVtIHsKKwlwdWJsaWM6CisJCXVuc2lnbmVkIGludCBmcmVxdWVuY3k7CisJCXVuc2lnbmVkIGludCBiaXRyYXRlOworCQl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7CisJCXZicl9tb2RlICAgICBtb2RlOworCQorCQlib29sIG9wZXJhdG9yPChjb25zdCBiaXRyYXRlX2l0ZW0gJiBiaXRyYXRlKSBjb25zdDsKK307CisKK2NsYXNzIEFDTSAgCit7CitwdWJsaWM6CisJQUNNKCBITU9EVUxFIGhNb2R1bGUgKTsKKwl2aXJ0dWFsIH5BQ00oKTsKKworCUxPTkcgRHJpdmVyUHJvY2VkdXJlKGNvbnN0IEhEUlZSIGhkcnZyLCBjb25zdCBVSU5UIG1zZywgTE9ORyBsUGFyYW0xLCBMT05HIGxQYXJhbTIpOworCisJc3RhdGljIGNvbnN0IGNoYXIgKiBHZXRWZXJzaW9uU3RyaW5nKHZvaWQpIHtyZXR1cm4gVmVyc2lvblN0cmluZzt9CisKK3Byb3RlY3RlZDoKKy8vCWlubGluZSBEV09SRCBDb25maWd1cmUoIEhXTkQgaFBhcmVudFdpbmRvdywgTFBEUlZDT05GSUdJTkZPIHBDb25maWcgKTsKKwlpbmxpbmUgRFdPUkQgQWJvdXQoIEhXTkQgaFBhcmVudFdpbmRvdyApOworCisJaW5saW5lIERXT1JEIE9uRHJpdmVyRGV0YWlscyhjb25zdCBIRFJWUiBoZHJ2ciwgTFBBQ01EUklWRVJERVRBSUxTIGFfRHJpdmVyRGV0YWlsKTsKKwlpbmxpbmUgRFdPUkQgT25Gb3JtYXRUYWdEZXRhaWxzKExQQUNNRk9STUFUVEFHREVUQUlMUyBhX0Zvcm1hdFRhZ0RldGFpbHMsIGNvbnN0IExQQVJBTSBhX1F1ZXJ5KTsKKwlpbmxpbmUgRFdPUkQgT25Gb3JtYXREZXRhaWxzKExQQUNNRk9STUFUREVUQUlMUyBhX0Zvcm1hdERldGFpbHMsIGNvbnN0IExQQVJBTSBhX1F1ZXJ5KTsKKwlpbmxpbmUgRFdPUkQgT25Gb3JtYXRTdWdnZXN0KExQQUNNRFJWRk9STUFUU1VHR0VTVCBhX0Zvcm1hdFN1Z2dlc3QpOworCWlubGluZSBEV09SRCBPblN0cmVhbU9wZW4oTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSBhX1N0cmVhbUluc3RhbmNlKTsKKwlpbmxpbmUgRFdPUkQgT25TdHJlYW1DbG9zZShMUEFDTURSVlNUUkVBTUlOU1RBTkNFIGFfU3RyZWFtSW5zdGFuY2UpOworCWlubGluZSBEV09SRCBPblN0cmVhbVNpemUoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSBhX1N0cmVhbUluc3RhbmNlLCBMUEFDTURSVlNUUkVBTVNJWkUgdGhlX1N0cmVhbVNpemUpOworCWlubGluZSBEV09SRCBPblN0cmVhbVByZXBhcmVIZWFkZXIoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSBhX1N0cmVhbUluc3RhbmNlLCBMUEFDTVNUUkVBTUhFQURFUiBhX1N0cmVhbUhlYWRlcik7CisJaW5saW5lIERXT1JEIE9uU3RyZWFtVW5QcmVwYXJlSGVhZGVyKExQQUNNRFJWU1RSRUFNSU5TVEFOQ0UgYV9TdHJlYW1JbnN0YW5jZSwgTFBBQ01TVFJFQU1IRUFERVIgYV9TdHJlYW1IZWFkZXIpOworCWlubGluZSBEV09SRCBPblN0cmVhbUNvbnZlcnQoTFBBQ01EUlZTVFJFQU1JTlNUQU5DRSBhX1N0cmVhbUluc3RhbmNlLCBMUEFDTURSVlNUUkVBTUhFQURFUiBhX1N0cmVhbUhlYWRlcik7CisKKwl2b2lkIEdldE1QM0Zvcm1hdEZvckluZGV4KGNvbnN0IERXT1JEIHRoZV9JbmRleCwgV0FWRUZPUk1BVEVYICYgdGhlX0Zvcm1hdCwgdW5zaWduZWQgc2hvcnQgdGhlX1N0cmluZ1tBQ01GT1JNQVRERVRBSUxTX0ZPUk1BVF9DSEFSU10pIGNvbnN0OworCXZvaWQgR2V0UENNRm9ybWF0Rm9ySW5kZXgoY29uc3QgRFdPUkQgdGhlX0luZGV4LCBXQVZFRk9STUFURVggJiB0aGVfRm9ybWF0LCB1bnNpZ25lZCBzaG9ydCB0aGVfU3RyaW5nW0FDTUZPUk1BVERFVEFJTFNfRk9STUFUX0NIQVJTXSkgY29uc3Q7CisJRFdPUkQgR2V0TnVtYmVyRW5jb2RpbmdGb3JtYXRzKCkgY29uc3Q7CisJYm9vbCBJc1NtYXJ0T3V0cHV0KGNvbnN0IGludCBmcmVxdWVuY3ksIGNvbnN0IGludCBiaXRyYXRlLCBjb25zdCBpbnQgY2hhbm5lbHMpIGNvbnN0OworCXZvaWQgQnVpbGRCaXRyYXRlVGFibGUoKTsKKworCUhNT0RVTEUgbXlfaE1vZHVsZTsKKwlISUNPTiAgIG15X2hJY29uOworCUFEYmcgICAgbXlfZGVidWc7CisJQUVuY29kZVByb3BlcnRpZXMgbXlfRW5jb2RpbmdQcm9wZXJ0aWVzOworCXN0ZDo6dmVjdG9yPGJpdHJhdGVfaXRlbT4gYml0cmF0ZV90YWJsZTsKKworCXN0YXRpYyBjaGFyIFZlcnNpb25TdHJpbmdbMTIwXTsKK307CisKKyNlbmRpZiAvLyAhZGVmaW5lZChfQUNNX0hfX0lOQ0xVREVEXykKKwpkaWZmIC0tZ2l0IGEvQUNNL0FDTVN0cmVhbS5jcHAgYi9BQ00vQUNNU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2Q2NDcwCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL0FDTVN0cmVhbS5jcHAKQEAgLTAsMCArMSwzOTcgQEAKKy8qKgorICoKKyAqIExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lIGF0IGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisgCisvKiEKKwlcYXV0aG9yIFN0ZXZlIExob21tZQorCVx2ZXJzaW9uIFwkSWQ6IEFDTVN0cmVhbS5jcHAsdiAxLjEyLjIuMSAyMDA4LzExLzAxIDIwOjQxOjQ3IHJvYmVydCBFeHAgJAorKi8KKworI2lmICFkZWZpbmVkKFNUUklDVCkKKyNkZWZpbmUgU1RSSUNUCisjZW5kaWYgLy8gU1RSSUNUCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJhZGVidWcuaCIKKworI2luY2x1ZGUgIkFDTVN0cmVhbS5oIgorCisjaW5jbHVkZSA8bGFtZS5oPgorCisvLyBzdGF0aWMgbWV0aG9kcworCitBQ01TdHJlYW0gKiBBQ01TdHJlYW06OkNyZWF0ZSgpCit7CisJQUNNU3RyZWFtICogUmVzdWx0OworCisJUmVzdWx0ID0gbmV3IEFDTVN0cmVhbTsKKworCXJldHVybiBSZXN1bHQ7Cit9CisKK2NvbnN0IGJvb2wgQUNNU3RyZWFtOjpFcmFzZShjb25zdCBBQ01TdHJlYW0gKiBhX0FDTVN0cmVhbSkKK3sKKwlkZWxldGUgYV9BQ01TdHJlYW07CisJcmV0dXJuIHRydWU7Cit9CisKKy8vIGNsYXNzIG1ldGhvZHMKKworQUNNU3RyZWFtOjpBQ01TdHJlYW0oKSA6CisgbV9Xb3JraW5nQnVmZmVyVXNlU2l6ZSgwKSwKKyBnZnAoTlVMTCkKK3sKKwkgLy8vIFx0b2RvIGdldCB0aGUgZGVidWcgbGV2ZWwgZnJvbSB0aGUgcmVnaXN0cnkKK215X2RlYnVnID0gbmV3IEFEYmcoREVCVUdfTEVWRUxfQ1JFQVRJT04pOworCWlmIChteV9kZWJ1ZyAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgRGVidWdGaWxlTmFtZVs1MTJdOworCisJCW15X2RlYnVnLT5zZXRQcmVmaXgoIkxBTUVzdHJlYW0iKTsgLy8vIFx0b2RvIGdldCBpdCBmcm9tIHRoZSByZWdpc3RyeQorbXlfZGVidWctPnNldEluY2x1ZGVUaW1lKHRydWUpOyAgLy8vIFx0b2RvIGdldCBpdCBmcm9tIHRoZSByZWdpc3RyeQorCisvLyBDaGVjayBpbiB0aGUgcmVnaXN0cnkgaWYgd2UgaGF2ZSB0byBPdXRwdXQgRGVidWcgaW5mb3JtYXRpb24KK0RlYnVnRmlsZU5hbWVbMF0gPSAnXDAnOworCisJCUhLRVkgT3NzS2V5OworCQlpZiAoUmVnT3BlbktleUV4KCBIS0VZX0xPQ0FMX01BQ0hJTkUsICJTT0ZUV0FSRVxcTVVLT0xJIiwgMCwgS0VZX1JFQUQgLCAmT3NzS2V5ICkgPT0gRVJST1JfU1VDQ0VTUykgeworCQkJRFdPUkQgRGF0YVR5cGU7CisJCQlEV09SRCBEZWJ1Z0ZpbGVOYW1lU2l6ZSA9IDUxMjsKKwkJCWlmIChSZWdRdWVyeVZhbHVlRXgoIE9zc0tleSwgIkRlYnVnRmlsZSIsIE5VTEwsICZEYXRhVHlwZSwgRGVidWdGaWxlTmFtZSwgJkRlYnVnRmlsZU5hbWVTaXplICkgPT0gRVJST1JfU1VDQ0VTUykgeworCQkJCWlmIChEYXRhVHlwZSA9PSBSRUdfU1opIHsKKwkJCQkJbXlfZGVidWctPnNldFVzZUZpbGUodHJ1ZSk7CisJCQkJCW15X2RlYnVnLT5zZXREZWJ1Z0ZpbGUoKGNoYXIgKilEZWJ1Z0ZpbGVOYW1lKTsKKwkJCQkJbXlfZGVidWctPk91dFB1dCgiRGVidWcgZmlsZSBpcyAlcyIsKGNoYXIgKilEZWJ1Z0ZpbGVOYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX1NUQVJULCAiQUNNU3RyZWFtIENyZWF0aW9uICgwWCUwOFgpIix0aGlzKTsKKwl9CisJZWxzZSB7CisJCUFEYmcgZGVidWc7CisJCWRlYnVnLk91dFB1dCgiQUNNU3RyZWFtOjpBQ01BQ01TdHJlYW0gOiBJbXBvc3NpYmxlIHRvIGNyZWF0ZSBteV9kZWJ1ZyIpOworCX0KKworfQorCitBQ01TdHJlYW06On5BQ01TdHJlYW0oKQoreworICAgICAgICAvLyByZWxlYXNlIG1lbW9yeSAtIGVuY29kaW5nIGlzIGZpbmlzaGVkCisJaWYgKGdmcCkgbGFtZV9jbG9zZSggZ2ZwICk7CisKKwlpZiAobXlfZGVidWcgIT0gTlVMTCkKKwl7CisJCW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19TVEFSVCwgIkFDTVN0cmVhbSBEZWxldGlvbiAoMFglMDhYKSIsdGhpcyk7CisJCWRlbGV0ZSBteV9kZWJ1ZzsKKwl9Cit9CisKK2Jvb2wgQUNNU3RyZWFtOjppbml0KGNvbnN0IGludCBuU2FtcGxlc1BlclNlYywgY29uc3QgaW50IG5PdXRwdXRTYW1wbGVzUGVyU2VjLCBjb25zdCBpbnQgbkNoYW5uZWxzLCBjb25zdCBpbnQgbkF2Z0J5dGVzUGVyU2VjLCBjb25zdCB2YnJfbW9kZSBtb2RlKQoreworCWJvb2wgYlJlc3VsdCA9IGZhbHNlOworCisJbXlfU2FtcGxlc1BlclNlYyAgPSBuU2FtcGxlc1BlclNlYzsKKwlteV9PdXRCeXRlc1BlclNlYyA9IG5PdXRwdXRTYW1wbGVzUGVyU2VjOworCW15X0NoYW5uZWxzICAgICAgID0gbkNoYW5uZWxzOworCW15X0F2Z0J5dGVzUGVyU2VjID0gbkF2Z0J5dGVzUGVyU2VjOworCW15X1ZCUk1vZGUgPSBtb2RlOworCisJYlJlc3VsdCA9IHRydWU7CisKKwlyZXR1cm4gYlJlc3VsdDsKKworfQorCitib29sIEFDTVN0cmVhbTo6b3Blbihjb25zdCBBRW5jb2RlUHJvcGVydGllcyAmIHRoZV9Qcm9wZXJ0aWVzKQoreworCWJvb2wgYlJlc3VsdCA9IGZhbHNlOworCisJLy8gSW5pdCB0aGUgTVAzIFN0cmVhbQorCS8vIEluaXQgdGhlIGdsb2JhbCBmbGFncyBzdHJ1Y3R1cmUKKwlnZnAgPSBsYW1lX2luaXQoKTsKKworCS8vIFNldCBpbnB1dCBzYW1wbGUgZnJlcXVlbmN5CisJbGFtZV9zZXRfaW5fc2FtcGxlcmF0ZSggZ2ZwLCBteV9TYW1wbGVzUGVyU2VjICk7CisKKwkvLyBTZXQgb3V0cHV0IHNhbXBsZSBmcmVxdWVuY3kKKwlsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZSggZ2ZwLCBteV9PdXRCeXRlc1BlclNlYyApOworCisJbGFtZV9zZXRfbnVtX2NoYW5uZWxzKCBnZnAsIG15X0NoYW5uZWxzICk7CisJaWYgKG15X0NoYW5uZWxzID09IDEpCisJCWxhbWVfc2V0X21vZGUoIGdmcCwgTU9OTyApOworCWVsc2UKKwkJbGFtZV9zZXRfbW9kZSggZ2ZwLCAoTVBFR19tb2RlX2UpdGhlX1Byb3BlcnRpZXMuR2V0Q2hhbm5lbE1vZGVWYWx1ZSgpKSA7IC8vLyBcdG9kbyBHZXQgdGhlIG1vZGUgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisKKy8vCWxhbWVfc2V0X1ZCUiggZ2ZwLCB2YnJfb2ZmICk7IC8vLyBcbm90ZSBWQlIgbm90IHN1cHBvcnRlZCBmb3IgdGhlIG1vbWVudAorCWxhbWVfc2V0X1ZCUiggZ2ZwLCBteV9WQlJNb2RlICk7IC8vLyBcbm90ZSBWQlIgbm90IHN1cHBvcnRlZCBmb3IgdGhlIG1vbWVudAorCQorCWlmIChteV9WQlJNb2RlID09IHZicl9hYnIpCisJeworCQlsYW1lX3NldF9WQlJfcSggZ2ZwLCAxICk7CisKKwkJbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKCBnZnAsIChteV9BdmdCeXRlc1BlclNlYyAqIDggKyA1MDApIC8gMTAwMCApOworCisJCWlmICgyNDAwMCA+IGxhbWVfZ2V0X2luX3NhbXBsZXJhdGUoIGdmcCApKQorCQl7CisJCQkvLyBGb3IgTVBFRy1JSQorCQkJbGFtZV9zZXRfVkJSX21pbl9iaXRyYXRlX2ticHMoIGdmcCwgOCk7CisKKwkJCWxhbWVfc2V0X1ZCUl9tYXhfYml0cmF0ZV9rYnBzKCBnZnAsIDE2MCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBGb3IgTVBFRy1JCisJCQlsYW1lX3NldF9WQlJfbWluX2JpdHJhdGVfa2JwcyggZ2ZwLCAzMik7CisKKwkJCWxhbWVfc2V0X1ZCUl9tYXhfYml0cmF0ZV9rYnBzKCBnZnAsIDMyMCk7CisJCX0KKwl9CisKKwkvLyBTZXQgYml0cmF0ZQorCWxhbWVfc2V0X2JyYXRlKCBnZnAsIG15X0F2Z0J5dGVzUGVyU2VjICogOCAvIDEwMDAgKTsKKworCS8vLyBcdG9kbyBHZXQgdGhlIG1vZGUgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisJLy8gU2V0IGNvcHlyaWdodCBmbGFnPworCWxhbWVfc2V0X2NvcHlyaWdodCggZ2ZwLCB0aGVfUHJvcGVydGllcy5HZXRDb3B5cmlnaHRNb2RlKCk/MTowICk7CisJLy8gRG8gd2UgaGF2ZSB0byB0YWcgIGl0IGFzIG5vbiBvcmlnaW5hbCAKKwlsYW1lX3NldF9vcmlnaW5hbCggZ2ZwLCB0aGVfUHJvcGVydGllcy5HZXRPcmlnaW5hbE1vZGUoKT8xOjAgKTsKKwkvLyBBZGQgQ1JDPworCWxhbWVfc2V0X2Vycm9yX3Byb3RlY3Rpb24oIGdmcCwgdGhlX1Byb3BlcnRpZXMuR2V0Q1JDTW9kZSgpPzE6MCApOworCS8vIFNldCBwcml2YXRlIGJpdD8KKwlsYW1lX3NldF9leHRlbnNpb24oIGdmcCwgdGhlX1Byb3BlcnRpZXMuR2V0UHJpdmF0ZU1vZGUoKT8xOjAgKTsKKwkvLyBJTkZPIHRhZyBzdXBwb3J0IG5vdCBwb3NzaWJsZSBpbiBBQ00gLSBpdCByZXF1aXJlcyByZXdpbmRpbmcgCisgICAgICAgIC8vIG91dHB1dCBzdHJlYW0gdG8gdGhlIGJlZ2lubmluZyBhZnRlciBlbmNvZGluZyBpcyBmaW5pc2hlZC4gICAKKwlsYW1lX3NldF9iV3JpdGVWYnJUYWcoIGdmcCwgMCApOworCisJaWYgKDAgPT0gbGFtZV9pbml0X3BhcmFtcyggZ2ZwICkpCisJeworCQkvL0xBTUUgZW5jb2RpbmcgY2FsbCB3aWxsIGFjY2VwdCBhbnkgbnVtYmVyIG9mIHNhbXBsZXMuICAKKwkJaWYgKCAwID09IGxhbWVfZ2V0X3ZlcnNpb24oIGdmcCApICkKKwkJeworCQkJLy8gRm9yIE1QRUctSUksIG9ubHkgNTc2IHNhbXBsZXMgcGVyIGZyYW1lIHBlciBjaGFubmVsCisJCQlteV9TYW1wbGVzUGVyQmxvY2sgPSA1NzYgKiBsYW1lX2dldF9udW1fY2hhbm5lbHMoIGdmcCApOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gRm9yIE1QRUctSSwgMTE1MiBzYW1wbGVzIHBlciBmcmFtZSBwZXIgY2hhbm5lbAorCQkJbXlfU2FtcGxlc1BlckJsb2NrID0gMTE1MiAqIGxhbWVfZ2V0X251bV9jaGFubmVscyggZ2ZwICk7CisJCX0KKwl9CisKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJ2ZXJzaW9uICAgICAgICAgICAgICAgID0lZCIsbGFtZV9nZXRfdmVyc2lvbiggZ2ZwICkgKTsKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJMYXllciAgICAgICAgICAgICAgICAgID0zIik7CisJc3dpdGNoICggbGFtZV9nZXRfbW9kZSggZ2ZwICkgKQorCXsKKwkJY2FzZSBTVEVSRU86ICAgICAgIG15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgICJtb2RlICAgICAgICAgICAgICAgICAgID1TdGVyZW8iICk7IGJyZWFrOworCQljYXNlIEpPSU5UX1NURVJFTzogbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAgIm1vZGUgICAgICAgICAgICAgICAgICAgPUpvaW50LVN0ZXJlbyIgKTsgYnJlYWs7CisJCWNhc2UgRFVBTF9DSEFOTkVMOiBteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICAibW9kZSAgICAgICAgICAgICAgICAgICA9Rm9yY2VkIFN0ZXJlbyIgKTsgYnJlYWs7CisJCWNhc2UgTU9OTzogICAgICAgICBteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICAibW9kZSAgICAgICAgICAgICAgICAgICA9TW9ubyIgKTsgYnJlYWs7CisJCWNhc2UgTk9UX1NFVDogICAgICAvKiBGQUxMVFJPVUdIICovCisJCWRlZmF1bHQ6ICAgICAgICAgICBteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICAibW9kZSAgICAgICAgICAgICAgICAgICA9RXJyb3IgKHVua25vd24pIiApOyBicmVhazsKKwl9CisKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJzYW1wbGluZyBmcmVxdWVuY3kgICAgID0lLjFmIGtIeiIsIGxhbWVfZ2V0X2luX3NhbXBsZXJhdGUoIGdmcCApIC8xMDAwLjAgKTsKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJiaXRyYXRlICAgICAgICAgICAgICAgID0lZCBrYnBzIiwgbGFtZV9nZXRfYnJhdGUoIGdmcCApICk7CisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAiVmJyIE1pbiBiaXRyYXRlICAgICAgICA9JWQga2JwcyIsIGxhbWVfZ2V0X1ZCUl9taW5fYml0cmF0ZV9rYnBzKCBnZnAgKSApOworCW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgIlZiciBNYXggYml0cmF0ZSAgICAgICAgPSVkIGticHMiLCBsYW1lX2dldF9WQlJfbWF4X2JpdHJhdGVfa2JwcyggZ2ZwICkgKTsKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJRdWFsaXR5IFNldHRpbmcgICAgICAgID0lZCIsIGxhbWVfZ2V0X3F1YWxpdHkoIGdmcCApICk7CisKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJMb3cgcGFzcyBmcmVxdWVuY3kgICAgID0lZCIsIGxhbWVfZ2V0X2xvd3Bhc3NmcmVxKCBnZnAgKSApOworCW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgIkxvdyBwYXNzIHdpZHRoICAgICAgICAgPSVkIiwgbGFtZV9nZXRfbG93cGFzc3dpZHRoKCBnZnAgKSApOworCisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAiSGlnaCBwYXNzIGZyZXF1ZW5jeSAgICA9JWQiLCBsYW1lX2dldF9oaWdocGFzc2ZyZXEoIGdmcCApICk7CisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAiSGlnaCBwYXNzIHdpZHRoICAgICAgICA9JWQiLCBsYW1lX2dldF9oaWdocGFzc3dpZHRoKCBnZnAgKSApOworCisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAiTm8gU2hvcnQgQmxvY2tzICAgICAgICA9JWQiLCBsYW1lX2dldF9ub19zaG9ydF9ibG9ja3MoIGdmcCApICk7CisKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJkZS1lbXBoYXNpcyAgICAgICAgICAgID0lZCIsIGxhbWVfZ2V0X2VtcGhhc2lzKCBnZnAgKSApOworCW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgInByaXZhdGUgZmxhZyAgICAgICAgICAgPSVkIiwgbGFtZV9nZXRfZXh0ZW5zaW9uKCBnZnAgKSApOworCisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAiY29weXJpZ2h0IGZsYWcgICAgICAgICA9JWQiLCBsYW1lX2dldF9jb3B5cmlnaHQoIGdmcCApICk7CisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAib3JpZ2luYWwgZmxhZyAgICAgICAgICA9JWQiLAlsYW1lX2dldF9vcmlnaW5hbCggZ2ZwICkgKTsKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJDUkMgICAgICAgICAgICAgICAgICAgID0lcyIsIGxhbWVfZ2V0X2Vycm9yX3Byb3RlY3Rpb24oIGdmcCApID8gIm9uIiA6ICJvZmYiICk7CisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAiRmFzdCBtb2RlICAgICAgICAgICAgICA9JXMiLCAoIGxhbWVfZ2V0X3F1YWxpdHkoIGdmcCApICk/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIgKTsKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJGb3JjZSBtaWQvc2lkZSBzdGVyZW8gID0lcyIsICggbGFtZV9nZXRfZm9yY2VfbXMoIGdmcCApICk/ImVuYWJsZWQiOiJkaXNhYmxlZCIgKTsKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJEaXNhYmxlIFJlc29ydm9pciAgICAgID0lZCIsIGxhbWVfZ2V0X2Rpc2FibGVfcmVzZXJ2b2lyKCBnZnAgKSApOworCW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgIlZCUiAgICAgICAgICAgICAgICAgICAgPSVzLCBWQlJfcSA9JWQsIFZCUiBtZXRob2QgPSIsCisJCQkJCSggbGFtZV9nZXRfVkJSKCBnZnAgKSAhPXZicl9vZmYgKSA/ICJlbmFibGVkIjogImRpc2FibGVkIiwKKwkJICAgICAgICAgICAgbGFtZV9nZXRfVkJSX3EoIGdmcCApICk7CisKKwlzd2l0Y2ggKCBsYW1lX2dldF9WQlIoIGdmcCApICkKKwl7CisJCWNhc2UgdmJyX29mZjoJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAgInZicl9vZmYiICk7CWJyZWFrOworCQljYXNlIHZicl9tdCA6CW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgICJ2YnJfbXQiICk7CWJyZWFrOworCQljYXNlIHZicl9yaCA6CW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgICJ2YnJfcmgiICk7CWJyZWFrOworCQljYXNlIHZicl9tdHJoOglteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICAidmJyX210cmgiICk7CWJyZWFrOworCQljYXNlIHZicl9hYnI6IAorCQkJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0RFQlVHLCAgInZicl9hYnIgKGF2ZXJhZ2UgYml0cmF0ZSAlZCBrYnBzKSIsIGxhbWVfZ2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyggZ2ZwICkgKTsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJlcnJvciwgdW5rbm93biBWQlIgc2V0dGluZyIpOworCQlicmVhazsKKwl9CisKKwlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJXcml0ZSBWQlIgSGVhZGVyICAgICAgID0lc1xuIiwgKCBsYW1lX2dldF9iV3JpdGVWYnJUYWcoIGdmcCApICkgPyJZZXMiOiJObyIpOworCisjaWZkZWYgRlJPTV9ETEwKK2JlQ29uZmlnLmZvcm1hdC5MSFYxLmR3UmVTYW1wbGVSYXRlCQk9IG15X091dEJ5dGVzUGVyU2VjOwkgIC8vIGZvcmNlIHRoZSB1c2VyIHJlc2FtcGxpbmcKKyNlbmRpZiAvLyBGUk9NX0RMTAorCisJYlJlc3VsdCA9IHRydWU7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworYm9vbCBBQ01TdHJlYW06OmNsb3NlKExQQllURSBwT3V0cHV0QnVmZmVyLCBEV09SRCAqcE91dHB1dFNpemUpCit7CisKK2Jvb2wgYlJlc3VsdCA9IGZhbHNlOworCisJaW50IG5PdXRwdXRTYW1wbGVzID0gMDsKKworICAgIG5PdXRwdXRTYW1wbGVzID0gbGFtZV9lbmNvZGVfZmx1c2goIGdmcCwgcE91dHB1dEJ1ZmZlciwgMCApOworCisJaWYgKCBuT3V0cHV0U2FtcGxlcyA8IDAgKQorCXsKKwkJLy8gQlVGRkVSX1RPT19TTUFMTAorKnBPdXRwdXRTaXplID0gMDsKKwl9CisJZWxzZQoreworCQkqcE91dHB1dFNpemUgPSBuT3V0cHV0U2FtcGxlczsKKworCQliUmVzdWx0ID0gdHJ1ZTsKKwl9CisKKwkvLyBsYW1lIHdpbGwgYmUgY2xvc2VkIGluIGRlc3RydWN0b3IKKyAgICAgICAgLy9sYW1lX2Nsb3NlKCBnZnAgKTsKKworCXJldHVybiBiUmVzdWx0OworfQorCitEV09SRCBBQ01TdHJlYW06OkdldE91dHB1dFNpemVGb3JJbnB1dChjb25zdCBEV09SRCB0aGVfU3JjTGVuZ3RoKSBjb25zdAoreworLyoJZG91YmxlIE91dHB1dElucHV0UmF0aW87CisKKwlpZiAobXlfVkJSTW9kZSA9PSB2YnJfb2ZmKQorCQlPdXRwdXRJbnB1dFJhdGlvID0gZG91YmxlKG15X0F2Z0J5dGVzUGVyU2VjKSAvIGRvdWJsZShteV9PdXRCeXRlc1BlclNlYyAqIDIpOworCWVsc2UgLy8gcmVzZXJ2ZSB0aGUgc3BhY2UgZm9yIDMyMCBrYnBzCisJCU91dHB1dElucHV0UmF0aW8gPSA0MDAwMC4wIC8gZG91YmxlKG15X091dEJ5dGVzUGVyU2VjICogMik7CisKKwlPdXRwdXRJbnB1dFJhdGlvICo9IDEuMTU7IC8vIGFsbG93IDE1JSBtb3JlKi8KKworICAgIERXT1JEIFJlc3VsdDsKKworLy8JUmVzdWx0ID0gRFdPUkQoZG91YmxlKHRoZV9TcmNMZW5ndGgpICogT3V0cHV0SW5wdXRSYXRpbyk7CisgICAgUmVzdWx0ID0gRFdPUkQoMS4yNSp0aGVfU3JjTGVuZ3RoICsgNzIwMCk7CisKK215X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiUmVzdWx0ID0gJWQiLFJlc3VsdCk7CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitib29sIEFDTVN0cmVhbTo6Q29udmVydEJ1ZmZlcihMUEFDTURSVlNUUkVBTUhFQURFUiBhX1N0cmVhbUhlYWRlcikKK3sKKwlib29sIHJlc3VsdDsKKworaWYgKG15X2RlYnVnICE9IE5VTEwpCit7CitteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJlbnRlciBBQ01TdHJlYW06OkNvbnZlcnRCdWZmZXIiKTsKK30KKworCURXT1JEIEluU2l6ZSA9IGFfU3RyZWFtSGVhZGVyLT5jYlNyY0xlbmd0aCAvIDIsIE91dFNpemUgPSBhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGg7IC8vIDIgZm9yIDg8LT4xNiBiaXRzCisKKy8vIEVuY29kZSBpdAoraW50IGR3U2FtcGxlczsKKwlpbnQgbk91dHB1dFNhbXBsZXMgPSAwOworCisJZHdTYW1wbGVzID0gSW5TaXplIC8gbGFtZV9nZXRfbnVtX2NoYW5uZWxzKCBnZnAgKTsKKworCWlmICggMSA9PSBsYW1lX2dldF9udW1fY2hhbm5lbHMoIGdmcCApICkKKwl7CisJCW5PdXRwdXRTYW1wbGVzID0gbGFtZV9lbmNvZGVfYnVmZmVyKGdmcCwoUFNIT1JUKWFfU3RyZWFtSGVhZGVyLT5wYlNyYywoUFNIT1JUKWFfU3RyZWFtSGVhZGVyLT5wYlNyYyxkd1NhbXBsZXMsYV9TdHJlYW1IZWFkZXItPnBiRHN0LGFfU3RyZWFtSGVhZGVyLT5jYkRzdExlbmd0aCk7CisJfQorCWVsc2UKKwl7CisJCW5PdXRwdXRTYW1wbGVzID0gbGFtZV9lbmNvZGVfYnVmZmVyX2ludGVybGVhdmVkKGdmcCwoUFNIT1JUKWFfU3RyZWFtSGVhZGVyLT5wYlNyYyxkd1NhbXBsZXMsYV9TdHJlYW1IZWFkZXItPnBiRHN0LGFfU3RyZWFtSGVhZGVyLT5jYkRzdExlbmd0aCk7CisJfQorCisJYV9TdHJlYW1IZWFkZXItPmNiU3JjTGVuZ3RoVXNlZCA9IGFfU3RyZWFtSGVhZGVyLT5jYlNyY0xlbmd0aDsKKwlhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGhVc2VkID0gbk91dHB1dFNhbXBsZXM7CisKKwlyZXN1bHQgPSBhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGhVc2VkIDw9IGFfU3RyZWFtSGVhZGVyLT5jYkRzdExlbmd0aDsKKworCW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiVXNlZFNpemUgPSAlZCAvIEVuY29kZWRTaXplID0gJWQsIHJlc3VsdCA9ICVkICglZCA8PSAlZCkiLCBJblNpemUsIE91dFNpemUsIHJlc3VsdCwgYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoVXNlZCwgYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoKTsKKworaWYgKG15X2RlYnVnICE9IE5VTEwpCit7CitteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJBQ01TdHJlYW06OkNvbnZlcnRCdWZmZXIgcmVzdWx0ID0gJWQgKDB4JTAyWCAweCUwMlgpIixyZXN1bHQsYV9TdHJlYW1IZWFkZXItPnBiRHN0WzBdLGFfU3RyZWFtSGVhZGVyLT5wYkRzdFsxXSk7Cit9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBtYXAgZnJlcXVlbmN5IHRvIGEgdmFsaWQgTVAzIHNhbXBsZSBmcmVxdWVuY3kKKyAqCisgKiBSb2JlcnQgSGVnZW1hbm4gMjAwMC0wNy0wMQorICovCitzdGF0aWMgaW50CittYXAyTVAzRnJlcXVlbmN5KGludCBmcmVxKQoreworICAgIGlmIChmcmVxIDw9IDgwMDApCisgICAgICAgIHJldHVybiA4MDAwOworICAgIGlmIChmcmVxIDw9IDExMDI1KQorICAgICAgICByZXR1cm4gMTEwMjU7CisgICAgaWYgKGZyZXEgPD0gMTIwMDApCisgICAgICAgIHJldHVybiAxMjAwMDsKKyAgICBpZiAoZnJlcSA8PSAxNjAwMCkKKyAgICAgICAgcmV0dXJuIDE2MDAwOworICAgIGlmIChmcmVxIDw9IDIyMDUwKQorICAgICAgICByZXR1cm4gMjIwNTA7CisgICAgaWYgKGZyZXEgPD0gMjQwMDApCisgICAgICAgIHJldHVybiAyNDAwMDsKKyAgICBpZiAoZnJlcSA8PSAzMjAwMCkKKyAgICAgICAgcmV0dXJuIDMyMDAwOworICAgIGlmIChmcmVxIDw9IDQ0MTAwKQorICAgICAgICByZXR1cm4gNDQxMDA7CisKKyAgICByZXR1cm4gNDgwMDA7Cit9CisKKwordW5zaWduZWQgaW50IEFDTVN0cmVhbTo6R2V0T3V0cHV0U2FtcGxlUmF0ZShpbnQgc2FtcGxlc19wZXJfc2VjLCBpbnQgYml0cmF0ZSwgaW50IGNoYW5uZWxzKQoreworICAgIGlmIChiaXRyYXRlPT0wKQorICAgICAgICBiaXRyYXRlID0gKDY0MDAwKmNoYW5uZWxzKS84OworICAKKyAgICAgICAgLy8vIFx0b2RvIHBhc3MgdGhyb3VnaCB0aGUgc2FtZSBMQU1FIHJvdXRpbmUKKwl1bnNpZ25lZCBpbnQgT3V0cHV0RnJlcXVlbmN5OworCWRvdWJsZSBjb21wcmVzc2lvbl9yYXRpbyA9IGRvdWJsZShzYW1wbGVzX3Blcl9zZWMgKiAxNiAqIGNoYW5uZWxzIC8gKGJpdHJhdGUgKiA4KSk7CisJaWYgKGNvbXByZXNzaW9uX3JhdGlvID4gMTMuKQorCQlPdXRwdXRGcmVxdWVuY3kgPSBtYXAyTVAzRnJlcXVlbmN5KCBpbnQoKDEwLiAqIGJpdHJhdGUgKiA4KSAvICgxNiAqIGNoYW5uZWxzKSkpOworCWVsc2UKKwkJT3V0cHV0RnJlcXVlbmN5ID0gbWFwMk1QM0ZyZXF1ZW5jeSggaW50KDAuOTcgKiBzYW1wbGVzX3Blcl9zZWMpICk7CisKKwlyZXR1cm4gT3V0cHV0RnJlcXVlbmN5OworCit9CisKZGlmZiAtLWdpdCBhL0FDTS9BQ01TdHJlYW0uaCBiL0FDTS9BQ01TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2JhNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvQUNNL0FDTVN0cmVhbS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qKgorICoKKyAqIExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lIGF0IGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisgCisvKiEKKwlcYXV0aG9yIFN0ZXZlIExob21tZQorCVx2ZXJzaW9uIFwkSWQ6IEFDTVN0cmVhbS5oLHYgMS41IDIwMDYvMTIvMjUgMjE6Mzc6MzQgcm9iZXJ0IEV4cCAkCisqLworCisjaWYgIWRlZmluZWQoX0FDTVNUUkVBTV9IX19JTkNMVURFRF8pCisjZGVmaW5lIF9BQ01TVFJFQU1fSF9fSU5DTFVERURfCisKKyNpZiBfTVNDX1ZFUiA+PSAxMDAwCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUiA+PSAxMDAwCisKKyNpbmNsdWRlIDxtbXJlZy5oPgorI2luY2x1ZGUgPG1zYWNtLmg+CisjaW5jbHVkZSA8bXNhY21kcnYuaD4KKworI2luY2x1ZGUgIkFEYmcvQURiZy5oIgorCisjaW5jbHVkZSAiQUVuY29kZVByb3BlcnRpZXMuaCIKKworCit0eXBlZGVmIGVudW0gdmJyX21vZGVfZSB2YnJfbW9kZTsKK3R5cGVkZWYgc3RydWN0IGxhbWVfZ2xvYmFsX3N0cnVjdCBsYW1lX2dsb2JhbF9mbGFnczsKKworCitjbGFzcyBBQ01TdHJlYW0KK3sKK3B1YmxpYzoKKwlBQ01TdHJlYW0oICk7CisJdmlydHVhbCB+QUNNU3RyZWFtKCApOworCisJc3RhdGljIEFDTVN0cmVhbSAqIENyZWF0ZSgpOworCXN0YXRpYyBjb25zdCBib29sIEVyYXNlKGNvbnN0IEFDTVN0cmVhbSAqIGFfQUNNU3RyZWFtKTsKKworCWJvb2wgaW5pdChjb25zdCBpbnQgblNhbXBsZXNQZXJTZWMsIGNvbnN0IGludCBuT3V0cHV0U2FtcGxlc1BlclNlYywgY29uc3QgaW50IG5DaGFubmVscywgY29uc3QgaW50IG5BdmdCeXRlc1BlclNlYywgY29uc3QgdmJyX21vZGUgbW9kZSk7CisJYm9vbCBvcGVuKGNvbnN0IEFFbmNvZGVQcm9wZXJ0aWVzICYgdGhlX1Byb3BlcnRpZXMpOworCWJvb2wgY2xvc2UoTFBCWVRFIHBPdXRwdXRCdWZmZXIsIERXT1JEICpwT3V0cHV0U2l6ZSk7CisKKwlEV09SRCBHZXRPdXRwdXRTaXplRm9ySW5wdXQoY29uc3QgRFdPUkQgdGhlX1NyY0xlbmd0aCkgY29uc3Q7CisJYm9vbCAgQ29udmVydEJ1ZmZlcihMUEFDTURSVlNUUkVBTUhFQURFUiBhX1N0cmVhbUhlYWRlcik7CisKKwlzdGF0aWMgdW5zaWduZWQgaW50IEdldE91dHB1dFNhbXBsZVJhdGUoaW50IHNhbXBsZXNfcGVyX3NlYywgaW50IGJpdHJhdGUsIGludCBjaGFubmVscyk7CisKK3Byb3RlY3RlZDoKKwlsYW1lX2dsb2JhbF9mbGFncyAqIGdmcDsKKworCUFEYmcgKiBteV9kZWJ1ZzsKKwlpbnQgbXlfU2FtcGxlc1BlclNlYzsKKwlpbnQgbXlfQ2hhbm5lbHM7CisJaW50IG15X0F2Z0J5dGVzUGVyU2VjOworCWludCBteV9PdXRCeXRlc1BlclNlYzsKKwl2YnJfbW9kZSBteV9WQlJNb2RlOworCURXT1JEICBteV9TYW1wbGVzUGVyQmxvY2s7CisKK3Vuc2lnbmVkIGludCBtX1dvcmtpbmdCdWZmZXJVc2VTaXplOworCWNoYXIgbV9Xb3JraW5nQnVmZmVyWzIzMDQqMl07IC8vIHNob3VsZCBiZSBhdCBsZWFzdCB0d2ljZSBteV9TYW1wbGVzUGVyQmxvY2sKKworaW5saW5lIGludCBHZXRCeXRlc1BlckJsb2NrKERXT1JEIGJ5dGVzX3Blcl9zZWMsIERXT1JEIHNhbXBsZXNfcGVyX3NlYywgaW50IEJsb2NrQWxpZ24pIGNvbnN0OworCit9OworCisjZW5kaWYgLy8gIWRlZmluZWQoX0FDTVNUUkVBTV9IX19JTkNMVURFRF8pCisKZGlmZiAtLWdpdCBhL0FDTS9BRGJnL0FEYmcuY3BwIGIvQUNNL0FEYmcvQURiZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkYzkyZgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9BRGJnL0FEYmcuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQcm9qZWN0ICAgICAgICAgICAgICAgOiBDKysgZGVidWdnaW5nIGNsYXNzCitGaWxlIHZlcnNpb24gICAgICAgICAgOiAwLjQKKworQlNEIExpY2Vuc2UgcG9zdCAxOTk5IDogCisKK0NvcHlyaWdodCAoYykgMjAwMSwgU3RldmUgTGhvbW1lCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAKKworLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKK2xpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCistIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCit0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKy0gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgCitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIAorRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAKK0VYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKK09GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKK0lOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCitDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIAorSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIAorT0YgU1VDSCBEQU1BR0UuIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJBRGJnLmgiCisKKyNpZiAhZGVmaW5lZChOREVCVUcpCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdGlvbi9EZXN0cnVjdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBRGJnOjpBRGJnKGludCBsZXZlbCkKKzpteV9sZXZlbChsZXZlbCkKKyxteV90aW1lX2luY2x1ZGVkKGZhbHNlKQorLG15X3VzZV9maWxlKGZhbHNlKQorLG15X2RlYnVnX291dHB1dCh0cnVlKQorLGhGaWxlKE5VTEwpCit7CisJcHJlZml4WzBdID0gJ1wwJzsKKwlPdXRQdXQoLTEsIkFEYmcgQ3JlYXRpb24gYXQgZGVidWcgbGV2ZWwgPSAlZCAoMHglMDhYKSIsbXlfbGV2ZWwsdGhpcyk7Cit9CisKK0FEYmc6On5BRGJnKCkKK3sKKwl1bnNldERlYnVnRmlsZSgpOworCU91dFB1dCgtMSwiQURiZyBEZWxldGlvbiAoMHglMDhYKSIsdGhpcyk7Cit9CisKK2lubGluZSBpbnQgQURiZzo6X091dFB1dChjb25zdCBjaGFyICogZm9ybWF0LHZhX2xpc3QgcGFyYW1zKSBjb25zdAoreworCWludCByZXN1bHQ7CisKKwljaGFyIHRzdFsxMDAwXTsKKwljaGFyIG15Zm9ybWF0WzI1Nl07CisKKwlpZiAobXlfdGltZV9pbmNsdWRlZCkgeworCQlTWVNURU1USU1FIHRpbWU7CisJCUdldFN5c3RlbVRpbWUoJnRpbWUpOworCQlpZiAocHJlZml4WzBdID09ICdcMCcpCisJCQl3c3ByaW50ZihteWZvcm1hdCwiJTA0ZC8lMDJkLyUwMmQgJTAyZDolMDJkOiUwMmQuJTAzZCBVVEMgOiAlc1xyXG4iLAorCQkJCQkJCXRpbWUud1llYXIsCisJCQkJCQkJdGltZS53TW9udGgsCisJCQkJCQkJdGltZS53RGF5LAorCQkJCQkJCXRpbWUud0hvdXIsCisJCQkJCQkJdGltZS53TWludXRlLAorCQkJCQkJCXRpbWUud1NlY29uZCwKKwkJCQkJCQl0aW1lLndNaWxsaXNlY29uZHMsCisJCQkJCQkJZm9ybWF0KTsKKwkJZWxzZQorCQkJd3NwcmludGYobXlmb3JtYXQsIiUwNGQvJTAyZC8lMDJkICUwMmQ6JTAyZDolMDJkLiUwM2QgVVRDIDogJXMgLSAlc1xyXG4iLAorCQkJCQkJCXRpbWUud1llYXIsCisJCQkJCQkJdGltZS53TW9udGgsCisJCQkJCQkJdGltZS53RGF5LAorCQkJCQkJCXRpbWUud0hvdXIsCisJCQkJCQkJdGltZS53TWludXRlLAorCQkJCQkJCXRpbWUud1NlY29uZCwKKwkJCQkJCQl0aW1lLndNaWxsaXNlY29uZHMsCisJCQkJCQkJcHJlZml4LAorCQkJCQkJCWZvcm1hdCk7CisJfSBlbHNlIHsKKwkJaWYgKHByZWZpeFswXSA9PSAnXDAnKQorCQkJd3NwcmludGYoIG15Zm9ybWF0LCAiJXNcclxuIiwgZm9ybWF0KTsKKwkJZWxzZQorCQkJd3NwcmludGYoIG15Zm9ybWF0LCAiJXMgLSAlc1xyXG4iLCBwcmVmaXgsIGZvcm1hdCk7CisJfQorCisJcmVzdWx0ID0gdnNwcmludGYodHN0LG15Zm9ybWF0LHBhcmFtcyk7CisJCisJaWYgKG15X2RlYnVnX291dHB1dCkKKwkJT3V0cHV0RGVidWdTdHJpbmcodHN0KTsKKworCWlmIChteV91c2VfZmlsZSAmJiAoaEZpbGUgIT0gTlVMTCkpIHsKKwkJU2V0RmlsZVBvaW50ZXIoIGhGaWxlLCAwLCAwLCBGSUxFX0VORCApOworCQlEV09SRCB3cml0dGVuOworCQlXcml0ZUZpbGUoIGhGaWxlLCB0c3QsIGxzdHJsZW4odHN0KSwgJndyaXR0ZW4sIE5VTEwgKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgQURiZzo6T3V0UHV0KGludCBmb3JMZXZlbCwgY29uc3QgY2hhciAqIGZvcm1hdCwuLi4pIGNvbnN0Cit7CisJaW50IHJlc3VsdD0wOworCQorCWlmIChmb3JMZXZlbCA+PSBteV9sZXZlbCkgeworCQl2YV9saXN0IHRzdGxpc3Q7CisJCWludCByZXN1bHQ7CisKKwkJdmFfc3RhcnQodHN0bGlzdCwgZm9ybWF0KTsKKworCQlyZXN1bHQgPSBfT3V0UHV0KGZvcm1hdCx0c3RsaXN0KTsKKworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBBRGJnOjpPdXRQdXQoY29uc3QgY2hhciAqIGZvcm1hdCwuLi4pIGNvbnN0Cit7CisJdmFfbGlzdCB0c3RsaXN0OworCisJdmFfc3RhcnQodHN0bGlzdCwgZm9ybWF0KTsKKworCXJldHVybiBfT3V0UHV0KGZvcm1hdCx0c3RsaXN0KTsKK30KKworYm9vbCBBRGJnOjpzZXREZWJ1Z0ZpbGUoY29uc3QgY2hhciAqIE5ld0ZpbGVuYW1lKSB7CisJYm9vbCByZXN1bHQ7CisJcmVzdWx0ID0gdW5zZXREZWJ1Z0ZpbGUoKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcmVzdWx0ID0gZmFsc2U7CisKKwkJaEZpbGUgPSBDcmVhdGVGaWxlKE5ld0ZpbGVuYW1lLCBHRU5FUklDX1dSSVRFLCBGSUxFX1NIQVJFX1dSSVRFfEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwgT1BFTl9BTFdBWVMsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCApOworCQkKKwkJaWYgKGhGaWxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCQlTZXRGaWxlUG9pbnRlciggaEZpbGUsIDAsIDAsIEZJTEVfRU5EICk7CisKKwkJCXJlc3VsdCA9IHRydWU7CisKKwkJCU91dFB1dCgtMSwiRGVidWcgZmlsZSBPcGVuaW5nIHN1Y2NlZWRlZCIpOworCisJCX0KKwkJZWxzZQorCQkJT3V0UHV0KC0xLCJEZWJ1ZyBmaWxlICVzIE9wZW5pbmcgZmFpbGVkIixOZXdGaWxlbmFtZSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBBRGJnOjp1bnNldERlYnVnRmlsZSgpIHsKKwlib29sIHJlc3VsdCA9IChoRmlsZSA9PSBOVUxMKTsKKwkKKwlpZiAoaEZpbGUgIT0gTlVMTCkgeworCQlyZXN1bHQgPSAoQ2xvc2VIYW5kbGUoaEZpbGUpICE9IDApOworCQkKKwkJaWYgKHJlc3VsdCkgeworCQkJT3V0UHV0KC0xLCJEZWJ1ZyBmaWxlIENsb3Npbmcgc3VjY2VlZGVkIik7CisJCQloRmlsZSA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYgLy8gIWRlZmluZWQoTkRFQlVHKQpkaWZmIC0tZ2l0IGEvQUNNL0FEYmcvQURiZy5kc3AgYi9BQ00vQURiZy9BRGJnLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDMzNTJkCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL0FEYmcvQURiZy5kc3AKQEAgLTAsMCArMSwxMDIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQURiZyIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIE5JQ0hUIEJFQVJCRUlURU4gKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQorDQorQ0ZHPUFEYmcgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIERpZXMgaXN0IGtlaW4gZ/xsdGlnZXMgTWFrZWZpbGUuIFp1bSBFcnN0ZWxsZW4gZGllc2VzIFByb2pla3RzIG1pdCBOTUFLRQ0KKyFNRVNTQUdFIHZlcndlbmRlbiBTaWUgZGVuIEJlZmVobCAiTWFrZWZpbGUgZXhwb3J0aWVyZW4iIHVuZCBm/GhyZW4gU2llIGRlbiBCZWZlaGwNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiQURiZy5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIkFEYmcubWFrIiBDRkc9IkFEYmcgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJBRGJnIC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgIkFEYmcgLSBXaW4zMiBEZWJ1ZyIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFEYmcgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cb2JqXFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXG9ialxSZWxlYXNlXEFEYmciDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYw0KKyMgQUREIFJTQyAvbCAweDQwYw0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFEYmcgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cb2JqXERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlxvYmpcRGVidWdcQURiZyINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMNCisjIEFERCBSU0MgL2wgMHg0MGMNCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQorIyBBREQgTElCMzIgL25vbG9nbw0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiQURiZyAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJBRGJnIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQURiZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVycyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImgiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEFEYmcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvQUNNL0FEYmcvQURiZy5oIGIvQUNNL0FEYmcvQURiZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjQwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vQURiZy9BRGJnLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1Byb2plY3QgICAgICAgICAgICAgICA6IEMrKyBkZWJ1Z2dpbmcgY2xhc3MKK0ZpbGUgdmVyc2lvbiAgICAgICAgICA6IDAuNAorCitCU0QgTGljZW5zZSBwb3N0IDE5OTkgOiAKKworQ29weXJpZ2h0IChjKSAyMDAxLCBTdGV2ZSBMaG9tbWUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IAorCistIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKy0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKK3RoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworLSBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIAorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAorRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0NPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgCitJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgCitPRiBTVUNIIERBTUFHRS4gCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChfREJHX0hfX0lOQ0xVREVEXykKKyNkZWZpbmUgX0RCR19IX19JTkNMVURFRF8KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RhdGljIGNvbnN0IGludCBNQVhfUFJFRklYX0xFTkdUSCA9IDEyODsKKworI2lmICFkZWZpbmVkKE5ERUJVRykKKy8vIGRlZmluZSB0aGUgd29ya2luZyBkZWJ1Z2dpbmcgY2xhc3MKKworY2xhc3MgQURiZyAgCit7CitwdWJsaWM6CisJQURiZyhpbnQgbGV2ZWwgPSAwKTsKKwl2aXJ0dWFsIH5BRGJnKCk7CisKKwkvLy8gXHRvZG8gbWFrZSBhbiBpbmxpbmUgZnVuY3Rpb24gdG8gdGVzdCB0aGUgbGV2ZWwgZmlyc3QgYW5kIHRoZSBwcm9jZXNzCisJaW50IE91dFB1dChpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKiBmb3JtYXQsLi4uKSBjb25zdDsKKworCWludCBPdXRQdXQoY29uc3QgY2hhciAqIGZvcm1hdCwuLi4pIGNvbnN0OworCisJaW5saW5lIGludCBzZXRMZXZlbChjb25zdCBpbnQgbGV2ZWwpIHsKKwkJcmV0dXJuIG15X2xldmVsID0gbGV2ZWw7CisJfQorCisJaW5saW5lIGJvb2wgc2V0SW5jbHVkZVRpbWUoY29uc3QgYm9vbCBpbmNsdWRlZCA9IHRydWUpIHsKKwkJcmV0dXJuIG15X3RpbWVfaW5jbHVkZWQgPSBpbmNsdWRlZDsKKwl9CisKKwlib29sIHNldERlYnVnRmlsZShjb25zdCBjaGFyICogTmV3RmlsZW5hbWUpOworCWJvb2wgdW5zZXREZWJ1Z0ZpbGUoKTsKKworCWlubGluZSBib29sIHNldFVzZUZpbGUoY29uc3QgYm9vbCB1c2VmaWxlID0gdHJ1ZSkgeworCQlyZXR1cm4gbXlfdXNlX2ZpbGUgPSB1c2VmaWxlOworCX0KKworCWlubGluZSBjb25zdCBjaGFyICogc2V0UHJlZml4KGNvbnN0IGNoYXIgKiBzdHJpbmcpIHsKKwkJcmV0dXJuIHN0cm5jcHkocHJlZml4LCBzdHJpbmcsIE1BWF9QUkVGSVhfTEVOR1RIKTsKKwl9CisKK3ByaXZhdGU6CisJaW50IG15X2xldmVsOworCWJvb2wgbXlfdGltZV9pbmNsdWRlZDsKKwlib29sIG15X3VzZV9maWxlOworCWJvb2wgbXlfZGVidWdfb3V0cHV0OworCisJaW50IF9PdXRQdXQoY29uc3QgY2hhciAqIGZvcm1hdCx2YV9saXN0IHBhcmFtcykgY29uc3Q7CisKKwljaGFyIHByZWZpeFtNQVhfUFJFRklYX0xFTkdUSF07CisKKwlIQU5ETEUgaEZpbGU7Cit9OworCisjZWxzZSAvLyAhZGVmaW5lZChOREVCVUcpCisKKy8vIGRlZmluZSBhIGNsYXNzIHRoYXQgZG9lcyBub3RoaW5nIChubyBvdXRwdXQpCisKK2NsYXNzIEFEYmcgIAoreworcHVibGljOgorCUFEYmcoaW50IGxldmVsID0gMCl7fQorCXZpcnR1YWwgfkFEYmcoKSB7fQorCisJaW5saW5lIGludCBPdXRQdXQoaW50IGxldmVsLCBjb25zdCBjaGFyICogZm9ybWF0LC4uLikgY29uc3QgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpbmxpbmUgaW50IE91dFB1dChjb25zdCBjaGFyICogZm9ybWF0LC4uLikgY29uc3QgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpbmxpbmUgaW50IHNldExldmVsKGNvbnN0IGludCBsZXZlbCkgeworCQlyZXR1cm4gbGV2ZWw7CisJfQorCisJaW5saW5lIGJvb2wgc2V0SW5jbHVkZVRpbWUoY29uc3QgYm9vbCBpbmNsdWRlZCA9IHRydWUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJaW5saW5lIGJvb2wgc2V0RGVidWdGaWxlKGNvbnN0IGNoYXIgKiBOZXdGaWxlbmFtZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpbmxpbmUgYm9vbCB1bnNldERlYnVnRmlsZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJaW5saW5lIGJvb2wgc2V0VXNlRmlsZShjb25zdCBib29sIHVzZWZpbGUgPSB0cnVlKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCWlubGluZSBjb25zdCBjaGFyICogc2V0UHJlZml4KGNvbnN0IGNoYXIgKiBzdHJpbmcpIHsKKwkJcmV0dXJuIHN0cmluZzsKKwl9Cit9OworCisjZW5kaWYgLy8gIWRlZmluZWQoTkRFQlVHKQorCisjZW5kaWYgLy8gIWRlZmluZWQoX0RCR19IX19JTkNMVURFRF8pCmRpZmYgLS1naXQgYS9BQ00vQURiZy9BRGJnX3ZjNy52Y3Byb2ogYi9BQ00vQURiZy9BRGJnX3ZjNy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2N2RkYQotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9BRGJnL0FEYmdfdmM3LnZjcHJvagpAQCAtMCwwICsxLDQ2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9IkFEYmciDQorCVByb2plY3RHVUlEPSJ7NEE5RUJFRUQtQUNDQS00NTQ4LUIxMEEtOTA1MjRCMUNGQ0QxfSINCisJU2NjUHJvamVjdE5hbWU9IiINCisJU2NjTG9jYWxQYXRoPSIiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUyINCisJCQkJUnVudGltZUxpYnJhcnk9IjUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvQURiZy5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWdcQURiZy5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL0FEYmcucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2VcQURiZy5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iTEFNRSBkZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1MiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL0FEYmcucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIg0KKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWcvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnXEFEYmcubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkxBTUUgcmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1MiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL0FEYmcucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIg0KKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWcvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnXEFEYmcubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkxBTUUgcmVsZWFzZSBOYXNtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL0FEYmcucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2VcQURiZy5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iZGxsIGRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUyINCisJCQkJUnVudGltZUxpYnJhcnk9IjUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvQURiZy5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWdcQURiZy5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iZGxsIHJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy9BRGJnLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Z1xBRGJnLmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJkbGwgcmVsZWFzZSBOYXNtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL0FEYmcucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2VcQURiZy5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZXMiDQorCQkJRmlsdGVyPSJjcHAiPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iQURiZy5jcHAiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iTEFNRSBkZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJMQU1FIHJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iTEFNRSByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iZGxsIGRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9ImRsbCByZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9ImRsbCByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVycyINCisJCQlGaWx0ZXI9ImgiPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iQURiZy5oIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvQUNNL0FEYmcvTWFrZWZpbGUuYW0gYi9BQ00vQURiZy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRlNGMxCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL0FEYmcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMCBAQAorIyMgJElkOiBNYWtlZmlsZS5hbSx2IDEuMiAyMDA1LzA4LzIxIDE3OjMyOjA4IGJvdXZpZ25lIEV4cCAkCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKKworRVhUUkFfRElTVCA9IFwKKwlBRGJnLmNwcCBcCisJQURiZy5kc3AgXAorCUFEYmdfdmM3LnZjcHJvaiBcCisJQURiZy5oCisKZGlmZiAtLWdpdCBhL0FDTS9BRGJnL01ha2VmaWxlLmluIGIvQUNNL0FEYmcvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiYmI3NQotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9BRGJnL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzYxIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBnbG9iYWwgc2VjdGlvbiBmb3IgZXZlcnkgTWFrZWZpbGUuYW0KK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAorCSQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCitzdWJkaXIgPSBBQ00vQURiZworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NPTkZJR19ERUZTID0gQENPTkZJR19ERUZTQAorQ09ORklHX01BVEhfTElCID0gQENPTkZJR19NQVRIX0xJQkAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQVUNDT0RFID0gQENQVUNDT0RFQAorQ1BVVFlQRSA9IEBDUFVUWVBFQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRUNITyA9IEBFQ0hPQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRjc3ID0gQEY3N0AKK0ZGTEFHUyA9IEBGRkxBR1NACitGUk9OVEVORF9DRkxBR1MgPSBARlJPTlRFTkRfQ0ZMQUdTQAorRlJPTlRFTkRfTERBREQgPSBARlJPTlRFTkRfTERBRERACitGUk9OVEVORF9MREZMQUdTID0gQEZST05URU5EX0xERkxBR1NACitHUkVQID0gQEdSRVBACitHVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACitHVEtfQ09ORklHID0gQEdUS19DT05GSUdACitHVEtfTElCUyA9IEBHVEtfTElCU0AKK0lOQ0xVREVTID0gQElOQ0xVREVTQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREFERCA9IEBMREFEREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMSUJfTUFKT1JfVkVSU0lPTiA9IEBMSUJfTUFKT1JfVkVSU0lPTkAKK0xJQl9NSU5PUl9WRVJTSU9OID0gQExJQl9NSU5PUl9WRVJTSU9OQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRURFUCA9IEBNQUtFREVQQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOQVNNID0gQE5BU01ACitOQVNNX0ZPUk1BVCA9IEBOQVNNX0ZPUk1BVEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUk1fRiA9IEBSTV9GQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTTkRGSUxFX0NGTEFHUyA9IEBTTkRGSUxFX0NGTEFHU0AKK1NOREZJTEVfTElCUyA9IEBTTkRGSUxFX0xJQlNACitTVFJJUCA9IEBTVFJJUEAKK1UgPSBAVUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJVEhfRlJPTlRFTkQgPSBAV0lUSF9GUk9OVEVOREAKK1dJVEhfTVAzUlRQID0gQFdJVEhfTVAzUlRQQAorV0lUSF9NUDNYID0gQFdJVEhfTVAzWEAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FVVE9NQUtFX09QVElPTlMgPSAxLjkgZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCitFWFRSQV9ESVNUID0gXAorCUFEYmcuY3BwIFwKKwlBRGJnLmRzcCBcCisJQURiZ192YzcudmNwcm9qIFwKKwlBRGJnLmgKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgQUNNL0FEYmcvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIEFDTS9BRGJnL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9BQ00vQUVuY29kZVByb3BlcnRpZXMuY3BwIGIvQUNNL0FFbmNvZGVQcm9wZXJ0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGY0YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvQUNNL0FFbmNvZGVQcm9wZXJ0aWVzLmNwcApAQCAtMCwwICsxLDIwMjcgQEAKKy8qKgorICoKKyAqIExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lIGF0IGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisgCisvKiEKKwlcYXV0aG9yIFN0ZXZlIExob21tZQorCVx2ZXJzaW9uIFwkSWQ6IEFFbmNvZGVQcm9wZXJ0aWVzLmNwcCx2IDEuOS44LjEgMjAwOC8xMS8wMSAyMDo0MTo0NyByb2JlcnQgRXhwICQKKyovCisKKyNpZiAhZGVmaW5lZChTVFJJQ1QpCisjZGVmaW5lIFNUUklDVAorI2VuZGlmIC8vICFkZWZpbmVkKFNUUklDVCkKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5kb3dzeC5oPgorI2luY2x1ZGUgPHNobG9iai5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZkZWYgX01TQ19WRVIKKy8vIG5vIHByb2JsZW0gd2l0aCB1bmtub3duIHByYWdtYXMKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDY4KQorI2VuZGlmCisKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorI2luY2x1ZGUgPGxhbWUuaD4KKyNpbmNsdWRlICJhZGVidWcuaCIKKyNpbmNsdWRlICJBRW5jb2RlUHJvcGVydGllcy5oIgorI2luY2x1ZGUgIkFDTS5oIgorLy8jaW5jbHVkZSAiQVBhcmFtZXRlcnMvQVBhcmFtZXRlcnMuaCIKKworI2lmbmRlZiBUVFNfQkFMTE9PTgorI2RlZmluZSBUVFNfQkFMTE9PTiAgICAgICAgICAgIDB4NDAKKyNlbmRpZiAvLyBUVFNfQkFMTE9PTgorCitjb25zdCB1bnNpZ25lZCBpbnQgQUVuY29kZVByb3BlcnRpZXM6OnRoZV9CaXRyYXRlc1sxOF0gPSB7MzIwLCAyNTYsIDIyNCwgMTkyLCAxNjAsIDE0NCwgMTI4LCAxMTIsIDk2LCA4MCwgNjQsIDU2LCA0OCwgNDAsIDMyLCAyNCwgMTYsIDggfTsKK2NvbnN0IHVuc2lnbmVkIGludCBBRW5jb2RlUHJvcGVydGllczo6dGhlX01QRUcxX0JpdHJhdGVzWzE0XSA9IHszMjAsIDI1NiwgMjI0LCAxOTIsIDE2MCwgMTI4LCAxMTIsIDk2LCA4MCwgNjQsIDU2LCA0OCwgNDAsIDMyIH07Citjb25zdCB1bnNpZ25lZCBpbnQgQUVuY29kZVByb3BlcnRpZXM6OnRoZV9NUEVHMl9CaXRyYXRlc1sxNF0gPSB7MTYwLCAxNDQsIDEyOCwgMTEyLCA5NiwgODAsIDY0LCA1NiwgNDgsIDQwLCAzMiwgMjQsIDE2LCA4fTsKK2NvbnN0IHVuc2lnbmVkIGludCBBRW5jb2RlUHJvcGVydGllczo6dGhlX0NoYW5uZWxNb2Rlc1szXSA9IHsgU1RFUkVPLCBKT0lOVF9TVEVSRU8sIERVQUxfQ0hBTk5FTCB9OworLy9jb25zdCBjaGFyICAgICAgICAgQUVuY29kZVByb3BlcnRpZXM6OnRoZV9QcmVzZXRzW11bMTNdID0geyJOb25lIiwgIkNEIiwgIlN0dWRpbyIsICJIaS1GaSIsICJQaG9uZSIsICJWb2ljZSIsICJSYWRpbyIsICJUYXBlIiwgIkZNIiwgIkFNIiwgIlNXIn07CisvL2NvbnN0IExBTUVfUVVBTFRJWV9QUkVTRVQgQUVuY29kZVByb3BlcnRpZXM6OnRoZV9QcmVzZXRzW10gPSB7TFFQX05PUFJFU0VULCBMUVBfUjNNSVhfUVVBTElUWSwgTFFQX05PUk1BTF9RVUFMSVRZLCBMUVBfTE9XX1FVQUxJVFksIExRUF9ISUdIX1FVQUxJVFksIExRUF9WRVJZSElHSF9RVUFMSVRZLCBMUVBfVk9JQ0VfUVVBTElUWSwgTFFQX1BIT05FLCBMUVBfU1csIExRUF9BTSwgTFFQX0ZNLCBMUVBfVk9JQ0UsIExRUF9SQURJTywgTFFQX1RBUEUsIExRUF9ISUZJLCBMUVBfQ0QsIExRUF9TVFVESU99OworLy9jb25zdCB1bnNpZ25lZCBpbnQgQUVuY29kZVByb3BlcnRpZXM6OnRoZV9TYW1wbGluZ0ZyZXFzWzldID0geyA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAgfTsKKworVG9vbFRpcEl0ZW0gQUVuY29kZVByb3BlcnRpZXM6OlRvb2x0aXBzWzEzXT17CisJeyBJRENfQ0hFQ0tfRU5DX0FCUiwgIkFsbG93IGVuY29kaW5nIHdpdGggYW4gYXZlcmFnZSBiaXRyYXRlXHJcbmluc3RlYWQgb2YgYSBjb25zdGFudCBvbmUuXHJcblxyXG5JdCBjYW4gaW1wcm92ZSB0aGUgcXVhbGl0eSBmb3IgdGhlIHNhbWUgYml0cmF0ZS4iIH0sCisJeyBJRENfQ0hFQ0tfQ09QWVJJR0hULCAiTWFyayB0aGUgZW5jb2RlZCBkYXRhIGFzIGNvcHlyaWdodGVkLiIgfSwKKwl7IElEQ19DSEVDS19DSEVDS1NVTSwgIlB1dCBhIGNoZWNrc3VtIGluIHRoZSBlbmNvZGVkIGRhdGEuXHJcblxyXG5UaGlzIGNhbiBtYWtlIHRoZSBmaWxlIGxlc3Mgc2Vuc2l0aXZlIHRvIGRhdGEgbG9zcy4iIH0sCisJeyBJRENfQ0hFQ0tfT1JJR0lOQUwsICJNYXJrIHRoZSBlbmNvZGVkIGRhdGEgYXMgYW4gb3JpZ2luYWwgZmlsZS4iIH0sCisJeyBJRENfQ0hFQ0tfUFJJVkFURSwgIk1hcmsgdGhlIGVuY29kZWQgZGF0YSBhcyBwcml2YXRlLiIgfSwKKwl7IElEQ19DT01CT19FTkNfU1RFUkVPLCAiU2VsZWN0IHRoZSB0eXBlIG9mIHN0ZXJlbyBtb2RlIHVzZWQgZm9yIGVuY29kaW5nOlxyXG5cclxuLSBTdGVyZW8gOiB0aGUgdXN1YWwgb25lXHJcbi0gSm9pbnQtU3RlcmVvIDogbWl4IGJvdGggY2hhbm5lbCB0byBhY2hpZXZlIGJldHRlciBjb21wcmVzc2lvblxyXG4tIER1YWwgQ2hhbm5lbCA6IHRyZWF0IGJvdGggY2hhbm5lbCBhcyBzZXBhcmF0ZSIgfSwKKwl7IElEQ19TVEFUSUNfREVDT0RJTkcsICJEZWNvZGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgbW9tZW50IGJ5IHRoZSBjb2RlYy4iIH0sCisJeyBJRENfQ0hFQ0tfRU5DX1NNQVJULCAiRGlzYWJsZSBiaXRyYXRlIHdoZW4gdGhlcmUgaXMgdG9vIG11Y2ggY29tcHJlc3Npb24uXHJcbihkZWZhdWx0IDE6MTUgcmF0aW8pIiB9LAorCXsgSURDX1NUQVRJQ19DT05GSUdfVkVSU0lPTiwgIlZlcnNpb24gb2YgdGhpcyBjb2RlYy5cclxuXHJcbnZYLlguWCBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29kZWMgaW50ZXJmYWNlLlxyXG5YLlhYIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBlbmNvZGluZyBlbmdpbmUuIiB9LAorCXsgSURDX1NMSURFUl9BVkVSQUdFX01JTiwgIlNlbGVjdCB0aGUgbWluaW11bSBBdmVyYWdlIEJpdHJhdGUgYWxsb3dlZC4iIH0sCisJeyBJRENfU0xJREVSX0FWRVJBR0VfTUFYLCAiU2VsZWN0IHRoZSBtYXhpbXVtIEF2ZXJhZ2UgQml0cmF0ZSBhbGxvd2VkLiIgfSwKKwl7IElEQ19TTElERVJfQVZFUkFHRV9TVEVQLCAiU2VsZWN0IHRoZSBzdGVwIG9mIEF2ZXJhZ2UgQml0cmF0ZSBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heC5cclxuXHJcbkEgc3RlcCBvZiA1IGJldHdlZW4gMTUyIGFuZCAxNjUgbWVhbnMgeW91IGhhdmUgOlxyXG4xNjUsIDE2MCBhbmQgMTU1IiB9LAorCXsgSURDX1NMSURFUl9BVkVSQUdFX1NBTVBMRSwgIkNoZWNrIHRoZSByZXN1bHRpbmcgdmFsdWVzIG9mIHRoZSAobWluLG1heCxzdGVwKSBjb21iaW5hdGlvbi5cclxuXHJcblVzZSB0aGUga2V5Ym9hcmQgdG8gbmF2aWdhdGUgKHJpZ2h0IC0+IGxlZnQpLiIgfSwKK307CisvL2ludCBBRW5jb2RlUHJvcGVydGllczo6dHN0ID0gMDsKKworLyoKKyNwcmFnbWEgYXJnc3VzZWQKK3N0YXRpYyBVSU5UIENBTExCQUNLIERMTEZpbmRDYWxsYmFjaygKKyAgSFdORCBoZGxnLCAgICAgIC8vIGhhbmRsZSB0byBjaGlsZCBkaWFsb2cgYm94CisgIFVJTlQgdWlNc2csICAgICAvLyBtZXNzYWdlIGlkZW50aWZpZXIKKyAgV1BBUkFNIHdQYXJhbSwgIC8vIG1lc3NhZ2UgcGFyYW1ldGVyCisgIExQQVJBTSBsUGFyYW0gICAvLyBtZXNzYWdlIHBhcmFtZXRlcgorICApCit7CisJVUlOVCByZXN1bHQgPSAwOworCisJc3dpdGNoICh1aU1zZykKKwl7CisJCWNhc2UgV01fTk9USUZZOgorCQkJT0ZOT1RJRlkgKiBpbmZvID0gKE9GTk9USUZZICopbFBhcmFtOworCQkJaWYgKGluZm8tPmhkci5jb2RlID09IENETl9GSUxFT0spCisJCQl7CisJCQkJcmVzdWx0ID0gMTsgLy8gYnkgZGVmYXVsdCB3ZSBkb24ndCBhY2NlcHQgdGhlIGZpbGUKKworCQkJCS8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBmaWxlIGlzIGEgdmFsaWQgRExMIHdpdGggYWxsIHRoZSByZXF1aXJlZCBmdW5jdGlvbnMKKwkJCQlBTGFtZURMTCAqIHRzdEZpbGUgPSBuZXcgQUxhbWVETEw7CisJCQkJaWYgKHRzdEZpbGUgIT0gTlVMTCkKKwkJCQl7CisJCQkJCWlmICh0c3RGaWxlLT5Mb2FkKGluZm8tPmxwT0ZOLT5scHN0ckZpbGUpKQorCQkJCQl7CisJCQkJCQlyZXN1bHQgPSAwOworCQkJCQl9CisKKwkJCQkJZGVsZXRlIHRzdEZpbGU7CisJCQkJfQorCisJCQkJaWYgKHJlc3VsdCA9PSAxKQorCQkJCXsKKwkJCQkJVENIQVIgb3V0cHV0WzI1MF07CisJCQkJCTo6TG9hZFN0cmluZyhBT3V0OjpHZXRJbnN0YW5jZSgpLElEU19TVFJJTkdfRExMX1VOUkVDT0dOSVpFRCxvdXRwdXQsMjUwKTsKKwkJCQkJQU91dDo6TXlNZXNzYWdlQm94KCBvdXRwdXQsIE1CX09LfE1CX0lDT05FWENMQU1BVElPTiwgaGRsZyk7CisJCQkJCVNldFdpbmRvd0xvbmcoaGRsZywgRFdMX01TR1JFU1VMVCAsIC0xMDApOworCQkJCX0KKwkJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjcHJhZ21hIGFyZ3N1c2VkCitzdGF0aWMgaW50IENBTExCQUNLIEJyb3dzZUZvbGRlckNhbGxiYWNrcm9jKAorICAgIEhXTkQgaHduZCwKKyAgICBVSU5UIHVNc2csCisgICAgTFBBUkFNIGxQYXJhbSwKKyAgICBMUEFSQU0gbHBEYXRhCisgICAgKQoreworCUFFbmNvZGVQcm9wZXJ0aWVzICogdGhlX3Byb3A7CisJdGhlX3Byb3AgPSAoQUVuY29kZVByb3BlcnRpZXMgKikgbHBEYXRhOworCisKKwlpZiAodU1zZyA9PSBCRkZNX0lOSVRJQUxJWkVEKQorCXsKKy8vCQljaGFyIEZvbGRlck5hbWVbTUFYX1BBVEhdOworLy8JCVNIR2V0UGF0aEZyb21JRExpc3QoKExQSVRFTUlETElTVCkgbFBhcmFtLEZvbGRlck5hbWUpOworLy9BRGJnIHRzdDsKKy8vdHN0Lk91dFB1dCgiaW5pdCBmb2xkZXIgdG8gJXMgIix0aGVfcHJvcC0+R2V0T3V0cHV0RGlyZWN0b3J5KCkpOworLy8JCUNyZWF0ZUZpbGUoKTsKKwkJOjpTZW5kTWVzc2FnZShod25kLCBCRkZNX1NFVFNFTEVDVElPTiwgKFdQQVJBTSlUUlVFLCAoTFBBUkFNKXRoZV9wcm9wLT5HZXRPdXRwdXREaXJlY3RvcnkoKSk7CisJfS8qIGVsc2UgaWYgKHVNc2cgPT0gQkZGTV9TRUxDSEFOR0VEKQorCXsKKwkJLy8gdmVyaWZ5IHRoYXQgdGhlIGZvbGRlciBpcyB3cml0YWJsZQorLy8JCTo6U2VuZE1lc3NhZ2UoaHduZCwgQkZGTV9FTkFCTEVPSywgMCwgKExQQVJBTSkwKTsgLy8gZGlzYWJsZQorCQljaGFyIEZvbGRlck5hbWVbTUFYX1BBVEhdOworCQlTSEdldFBhdGhGcm9tSURMaXN0KChMUElURU1JRExJU1QpIGxQYXJhbSwgRm9sZGVyTmFtZSk7CisJCQorLy8JCWlmIChDcmVhdGVGaWxlKEZvbGRlck5hbWUsU1RBTkRBUkRfUklHSFRTX1dSSVRFLDAsTlVMTCxPUEVOX0VYSVNUSU5HLEZJTEVfQVRUUklCVVRFX05PUk1BTCxOVUxMKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkJaWYgKChHZXRGaWxlQXR0cmlidXRlcyhGb2xkZXJOYW1lKSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gMCkKKwkJCTo6U2VuZE1lc3NhZ2UoaHduZCwgQkZGTV9FTkFCTEVPSywgMCwgKExQQVJBTSkxKTsgLy8gZW5hYmxlCisJCWVsc2UKKwkJCTo6U2VuZE1lc3NhZ2UoaHduZCwgQkZGTV9FTkFCTEVPSywgMCwgKExQQVJBTSkwKTsgLy8gZGlzYWJsZQorLy9BRGJnIHRzdDsKKy8vdHN0Lk91dFB1dCgiY2hhbmdlIGZvbGRlciB0byAlcyAiLEZvbGRlck5hbWUpOworCX0qIC8KKworCXJldHVybiAwOworfQorKi8KKyNwcmFnbWEgYXJnc3VzZWQKK3N0YXRpYyBCT09MIENBTExCQUNLIENvbmZpZ1Byb2MoCisgIEhXTkQgaHduZERsZywgIC8vIGhhbmRsZSB0byBkaWFsb2cgYm94CisgIFVJTlQgdU1zZywgICAgIC8vIG1lc3NhZ2UKKyAgV1BBUkFNIHdQYXJhbSwgLy8gZmlyc3QgbWVzc2FnZSBwYXJhbWV0ZXIKKyAgTFBBUkFNIGxQYXJhbSAgLy8gc2Vjb25kIG1lc3NhZ2UgcGFyYW1ldGVyCisgICkKK3sKKwlCT09MIGJSZXN1bHQ7CisJQUVuY29kZVByb3BlcnRpZXMgKiB0aGVfcHJvcDsKKwl0aGVfcHJvcCA9IChBRW5jb2RlUHJvcGVydGllcyAqKSBHZXRQcm9wKGh3bmREbGcsICJBRW5jb2RlUHJvcGVydGllcy1Db25maWciKTsKKworCXN3aXRjaCAodU1zZykgeworCQljYXNlIFdNX0NPTU1BTkQ6CisJCQlpZiAodGhlX3Byb3AgIT0gTlVMTCkKKwkJCXsKKwkJCQliUmVzdWx0ID0gdGhlX3Byb3AtPkhhbmRsZURpYWxvZ0NvbW1hbmQoIGh3bmREbGcsIHdQYXJhbSwgbFBhcmFtKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdNX0lOSVRESUFMT0c6CisJCQlhc3NlcnQodGhlX3Byb3AgPT0gTlVMTCk7CisKKwkJCXRoZV9wcm9wID0gKEFFbmNvZGVQcm9wZXJ0aWVzICopIGxQYXJhbTsKKwkJCXRoZV9wcm9wLT5teV9kZWJ1Zy5PdXRQdXQoInRoZXJlIGh3bmQgPSAweCUwOFgiLGh3bmREbGcpOworCisJCQlhc3NlcnQodGhlX3Byb3AgIT0gTlVMTCk7CisKKwkJCVNldFByb3AoaHduZERsZywgIkFFbmNvZGVQcm9wZXJ0aWVzLUNvbmZpZyIsIHRoZV9wcm9wKTsKKworCQkJdGhlX3Byb3AtPkluaXRDb25maWdEbGcoaHduZERsZyk7CisKKwkJCWJSZXN1bHQgPSBUUlVFOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTV9IU0NST0xMOgorCQkJLy8gY2hlY2sgaWYgaXQncyB0aGUgQUJSIHNsaWRlcnMKKwkJCWlmICgoSFdORClsUGFyYW0gPT0gR2V0RGxnSXRlbShod25kRGxnLElEQ19TTElERVJfQVZFUkFHRV9NSU4pKQorCQkJeworCQkJCXRoZV9wcm9wLT5VcGRhdGVEbGdGcm9tU2xpZGVzKGh3bmREbGcpOworCQkJfQorCQkJZWxzZSBpZiAoKEhXTkQpbFBhcmFtID09IEdldERsZ0l0ZW0oaHduZERsZyxJRENfU0xJREVSX0FWRVJBR0VfTUFYKSkKKwkJCXsKKwkJCQl0aGVfcHJvcC0+VXBkYXRlRGxnRnJvbVNsaWRlcyhod25kRGxnKTsKKwkJCX0KKwkJCWVsc2UgaWYgKChIV05EKWxQYXJhbSA9PSBHZXREbGdJdGVtKGh3bmREbGcsSURDX1NMSURFUl9BVkVSQUdFX1NURVApKQorCQkJeworCQkJCXRoZV9wcm9wLT5VcGRhdGVEbGdGcm9tU2xpZGVzKGh3bmREbGcpOworCQkJfQorCQkJZWxzZSBpZiAoKEhXTkQpbFBhcmFtID09IEdldERsZ0l0ZW0oaHduZERsZyxJRENfU0xJREVSX0FWRVJBR0VfU0FNUExFKSkKKwkJCXsKKwkJCQl0aGVfcHJvcC0+VXBkYXRlRGxnRnJvbVNsaWRlcyhod25kRGxnKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgV01fTk9USUZZOgorCQkJaWYgKFRUTl9HRVRESVNQSU5GTyA9PSAoKExQTk1IRFIpbFBhcmFtKS0+Y29kZSkgeworCQkJCU5NVFRESVNQSU5GTyAqbHBoZHIgPSAoTk1UVERJU1BJTkZPICopbFBhcmFtOworCQkJCVVJTlQgaWQgPSAobHBoZHItPnVGbGFncyAmIFRURl9JRElTSFdORCkgPyBHZXRXaW5kb3dMb25nKChIV05EKWxwaGRyLT5oZHIuaWRGcm9tLCBHV0xfSUQpIDogbHBoZHItPmhkci5pZEZyb207CisKKwkJCQkqbHBoZHItPmxwc3pUZXh0ID0gMDsKKworCQkJCVNlbmRNZXNzYWdlKGxwaGRyLT5oZHIuaHduZEZyb20sIFRUTV9TRVRNQVhUSVBXSURUSCwgMCwgNTAwMCk7CisKKwkJCQlmb3IoaW50IGk9MDsgaTxzaXplb2YgQUVuY29kZVByb3BlcnRpZXM6OlRvb2x0aXBzL3NpemVvZiBBRW5jb2RlUHJvcGVydGllczo6VG9vbHRpcHNbMF07ICsraSkgeworCQkJCQlpZiAoaWQgPT0gQUVuY29kZVByb3BlcnRpZXM6OlRvb2x0aXBzW2ldLmlkKQorCQkJCQkJbHBoZHItPmxwc3pUZXh0ID0gY29uc3RfY2FzdDxjaGFyICo+KEFFbmNvZGVQcm9wZXJ0aWVzOjpUb29sdGlwc1tpXS50aXApOworCQkJCX0KKworCQkJCXJldHVybiBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJSZXN1bHQgPSBGQUxTRTsgLy8gd2lsbCBiZSB0cmVhdGVkIGJ5IERlZldpbmRvd1Byb2MKKwl9CisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdGlvbi9EZXN0cnVjdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoqCisJXGNsYXNzIEFFbmNvZGVQcm9wZXJ0aWVzCisqLworCisKK2NvbnN0IGNoYXIgKiBBRW5jb2RlUHJvcGVydGllczo6R2V0Q2hhbm5lbE1vZGVTdHJpbmcoaW50IGFfY2hhbm5lbElEKSBjb25zdAoreworCWFzc2VydChhX2NoYW5uZWxJRCA8IHNpemVvZih0aGVfQ2hhbm5lbE1vZGVzKSk7CisKKwlzd2l0Y2ggKGFfY2hhbm5lbElEKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAiU3RlcmVvIjsKKwkJY2FzZSAxOgorCQkJcmV0dXJuICJKb2ludC1zdGVyZW8iOworCQljYXNlIDI6CisJCQlyZXR1cm4gIkR1YWwgQ2hhbm5lbCI7CisJCWRlZmF1bHQ6CisJCQlhc3NlcnQoYV9jaGFubmVsSUQpOworCQkJcmV0dXJuIE5VTEw7CisJfQorfQorCitjb25zdCBpbnQgQUVuY29kZVByb3BlcnRpZXM6OkdldEJpdHJhdGVTdHJpbmcoY2hhciAqIHN0cmluZywgaW50IHN0cmluZ19zaXplLCBpbnQgYV9iaXRyYXRlSUQpIGNvbnN0Cit7CisJYXNzZXJ0KGFfYml0cmF0ZUlEIDwgc2l6ZW9mKHRoZV9CaXRyYXRlcykpOworCWFzc2VydChzdHJpbmcgIT0gTlVMTCk7CisKKwlpZiAoc3RyaW5nX3NpemUgPj0gNCkKKwkJcmV0dXJuIHdzcHJpbnRmKHN0cmluZywiJWQiLHRoZV9CaXRyYXRlc1thX2JpdHJhdGVJRF0pOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCitjb25zdCB1bnNpZ25lZCBpbnQgQUVuY29kZVByb3BlcnRpZXM6OkdldENoYW5uZWxNb2RlVmFsdWUoKSBjb25zdAoreworCWFzc2VydChuQ2hhbm5lbEluZGV4IDwgc2l6ZW9mKHRoZV9DaGFubmVsTW9kZXMpKTsKKworCXJldHVybiB0aGVfQ2hhbm5lbE1vZGVzW25DaGFubmVsSW5kZXhdOworfQorCitjb25zdCB1bnNpZ25lZCBpbnQgQUVuY29kZVByb3BlcnRpZXM6OkdldEJpdHJhdGVWYWx1ZSgpIGNvbnN0Cit7CisJYXNzZXJ0KG5NaW5CaXRyYXRlSW5kZXggPCBzaXplb2YodGhlX0JpdHJhdGVzKSk7CisKKwlyZXR1cm4gdGhlX0JpdHJhdGVzW25NaW5CaXRyYXRlSW5kZXhdOworfQorCitpbmxpbmUgY29uc3QgaW50IEFFbmNvZGVQcm9wZXJ0aWVzOjpHZXRCaXRyYXRlVmFsdWVNUEVHMihEV09SRCAmIGJpdHJhdGUpIGNvbnN0Cit7CisJaW50IGk7CisKKwlmb3IgKGk9MDtpPHNpemVvZih0aGVfTVBFRzJfQml0cmF0ZXMpL3NpemVvZih1bnNpZ25lZCBpbnQpO2krKykKKwl7CisJCWlmICh0aGVfTVBFRzJfQml0cmF0ZXNbaV0gPT0gdGhlX0JpdHJhdGVzW25NaW5CaXRyYXRlSW5kZXhdKQorCQl7CisJCQliaXRyYXRlID0gdGhlX01QRUcyX0JpdHJhdGVzW2ldOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZSBpZiAodGhlX01QRUcyX0JpdHJhdGVzW2ldIDwgdGhlX0JpdHJhdGVzW25NaW5CaXRyYXRlSW5kZXhdKQorCQl7CisJCQliaXRyYXRlID0gdGhlX01QRUcyX0JpdHJhdGVzW2ldOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCQorCWJpdHJhdGUgPSAxNjA7CisJcmV0dXJuIC0xOworfQorCitpbmxpbmUgY29uc3QgaW50IEFFbmNvZGVQcm9wZXJ0aWVzOjpHZXRCaXRyYXRlVmFsdWVNUEVHMShEV09SRCAmIGJpdHJhdGUpIGNvbnN0Cit7CisJaW50IGk7CisKKwlmb3IgKGk9c2l6ZW9mKHRoZV9NUEVHMV9CaXRyYXRlcykvc2l6ZW9mKHVuc2lnbmVkIGludCktMTtpPj0wO2ktLSkKKwl7CisJCWlmICh0aGVfTVBFRzFfQml0cmF0ZXNbaV0gPT0gdGhlX0JpdHJhdGVzW25NaW5CaXRyYXRlSW5kZXhdKQorCQl7CisJCQliaXRyYXRlID0gdGhlX01QRUcxX0JpdHJhdGVzW2ldOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZSBpZiAodGhlX01QRUcxX0JpdHJhdGVzW2ldID4gdGhlX0JpdHJhdGVzW25NaW5CaXRyYXRlSW5kZXhdKQorCQl7CisJCQliaXRyYXRlID0gdGhlX01QRUcxX0JpdHJhdGVzW2ldOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJCisJYml0cmF0ZSA9IDMyOworCXJldHVybiAxOworfQorLyoKK2NvbnN0IGludCBBRW5jb2RlUHJvcGVydGllczo6R2V0Qml0cmF0ZVZhbHVlKERXT1JEICYgYml0cmF0ZSwgY29uc3QgRFdPUkQgTVBFR19WZXJzaW9uKSBjb25zdAoreworCWFzc2VydCgoTVBFR19WZXJzaW9uID09IE1QRUcxKSB8fCAoTVBFR19WZXJzaW9uID09IE1QRUcyKSk7CisJYXNzZXJ0KG5NaW5CaXRyYXRlSW5kZXggPCBzaXplb2YodGhlX0JpdHJhdGVzKSk7CisKKwlpZiAoTVBFR19WZXJzaW9uID09IE1QRUcyKQorCQlyZXR1cm4gR2V0Qml0cmF0ZVZhbHVlTVBFRzIoYml0cmF0ZSk7CisJZWxzZQorCQlyZXR1cm4gR2V0Qml0cmF0ZVZhbHVlTVBFRzEoYml0cmF0ZSk7Cit9CisvKgorY29uc3QgY2hhciAqIEFFbmNvZGVQcm9wZXJ0aWVzOjpHZXRQcmVzZXRNb2RlU3RyaW5nKGNvbnN0IGludCBhX3ByZXNldElEKSBjb25zdAoreworCWFzc2VydChhX3ByZXNldElEIDwgc2l6ZW9mKHRoZV9QcmVzZXRzKSk7CisKKwlzd2l0Y2ggKGFfcHJlc2V0SUQpIHsKKwkJY2FzZSAxOgorCQkJcmV0dXJuICJyM21peCI7CisJCWNhc2UgMjoKKwkJCXJldHVybiAiTm9ybWFsIjsKKwkJY2FzZSAzOgorCQkJcmV0dXJuICJMb3ciOworCQljYXNlIDQ6CisJCQlyZXR1cm4gIkhpZ2giOworCQljYXNlIDU6CisJCQlyZXR1cm4gIlZlcnkgSGlnaCI7CisJCWNhc2UgNjoKKwkJCXJldHVybiAiVm9pY2UiOworCQljYXNlIDc6CisJCQlyZXR1cm4gIlBob25lIjsKKwkJY2FzZSA4OgorCQkJcmV0dXJuICJTVyI7CisJCWNhc2UgOToKKwkJCXJldHVybiAiQU0iOworCQljYXNlIDEwOgorCQkJcmV0dXJuICJGTSI7CisJCWNhc2UgMTE6CisJCQlyZXR1cm4gIlZvaWNlIjsKKwkJY2FzZSAxMjoKKwkJCXJldHVybiAiUmFkaW8iOworCQljYXNlIDEzOgorCQkJcmV0dXJuICJUYXBlIjsKKwkJY2FzZSAxNDoKKwkJCXJldHVybiAiSGktRmkiOworCQljYXNlIDE1OgorCQkJcmV0dXJuICJDRCI7CisJCWNhc2UgMTY6CisJCQlyZXR1cm4gIlN0dWRpbyI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIk5vbmUiOworCX0KK30KKworY29uc3QgTEFNRV9RVUFMVElZX1BSRVNFVCBBRW5jb2RlUHJvcGVydGllczo6R2V0UHJlc2V0TW9kZVZhbHVlKCkgY29uc3QKK3sKKwlhc3NlcnQoblByZXNldEluZGV4IDwgc2l6ZW9mKHRoZV9QcmVzZXRzKSk7CisKKwlyZXR1cm4gdGhlX1ByZXNldHNbblByZXNldEluZGV4XTsKK30KKyovCitib29sIEFFbmNvZGVQcm9wZXJ0aWVzOjpDb25maWcoY29uc3QgSElOU1RBTkNFIEhpbnN0YW5jZSwgY29uc3QgSFdORCBId25kUGFyZW50KQoreworCS8vV01fSU5JVERJQUxPRyA/CisKKwkvLyByZW1lbWJlciB0aGUgaW5zdGFuY2UgdG8gcmV0cmVpdmUgc3RyaW5ncworLy8JaERsbEluc3RhbmNlID0gSGluc3RhbmNlOworCisJbXlfZGVidWcuT3V0UHV0KCJoZXJlIik7CisJaW50IHJldCA9IDo6RGlhbG9nQm94UGFyYW0oSGluc3RhbmNlLCBNQUtFSU5UUkVTT1VSQ0UoSUREX0NPTkZJRyksIEh3bmRQYXJlbnQsIDo6Q29uZmlnUHJvYywgKExQQVJBTSkgdGhpcyk7CisvKglpZiAocmV0ID09IC0xKQorCXsKKwkJTFBWT0lEIGxwTXNnQnVmOworCQlGb3JtYXRNZXNzYWdlKCAKKwkJCUZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IAorCQkJRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCAKKwkJCUZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorCQkJTlVMTCwKKwkJCUdldExhc3RFcnJvcigpLAorCQkJTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksIC8vIERlZmF1bHQgbGFuZ3VhZ2UKKwkJCShMUFRTVFIpICZscE1zZ0J1ZiwKKwkJCTAsCisJCQlOVUxMIAorCQkpOworCQkvLyBQcm9jZXNzIGFueSBpbnNlcnRzIGluIGxwTXNnQnVmLgorCQkvLyAuLi4KKwkJLy8gRGlzcGxheSB0aGUgc3RyaW5nLgorCQlBT3V0OjpNeU1lc3NhZ2VCb3goIChMUENUU1RSKWxwTXNnQnVmLCBNQl9PSyB8IE1CX0lDT05JTkZPUk1BVElPTiApOworCQkvLyBGcmVlIHRoZSBidWZmZXIuCisJCUxvY2FsRnJlZSggbHBNc2dCdWYgKTsJCisJCXJldHVybiBmYWxzZTsKKwl9CisqLwkKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBRW5jb2RlUHJvcGVydGllczo6SW5pdENvbmZpZ0RsZyhIV05EIEh3bmREbGcpCit7CisJLy8gZ2V0IGFsbCB0aGUgcmVxdWlyZWQgc3RyaW5ncworLy8JVENIQVIgVmVyc2lvbls1XTsKKy8vCUxvYWRTdHJpbmcoaERsbEluc3RhbmNlLCBJRFNfU1RSSU5HX1ZFUlNJT04sIFZlcnNpb24sIDUpOworCisJaW50IGk7CisKKwkvLyBBZGQgcmVxdWlyZWQgY2hhbm5lbCBtb2RlcworCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19DT01CT19FTkNfU1RFUkVPKSwgQ0JfUkVTRVRDT05URU5UICwgTlVMTCwgTlVMTCk7CisJZm9yIChpPTA7aTxHZXRDaGFubmVsTGVudGdoKCk7aSsrKQorCQlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fRU5DX1NURVJFTyksIENCX0FERFNUUklORywgTlVMTCwgKExQQVJBTSkgR2V0Q2hhbm5lbE1vZGVTdHJpbmcoaSkpOworCisJY2hhciB0bXBbMjBdOworCXdzcHJpbnRmKHRtcCwgInYlcyIsQUNNOjpHZXRWZXJzaW9uU3RyaW5nKCkpOworCVNldFdpbmRvd1RleHQoIEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19TVEFUSUNfQ09ORklHX1ZFUlNJT04pLCB0bXApOworCisJLy8gQWRkIGFsbCBwb3NzaWJsZSByZS1zYW1wbGluZyBmcmVxCisvKglTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fU0FNUExFRlJFUSksIENCX1JFU0VUQ09OVEVOVCAsIE5VTEwsIE5VTEwpOworCWNoYXIgdG1wWzEwXTsKKwlmb3IgKGk9MDtpPHNpemVvZih0aGVfU2FtcGxpbmdGcmVxcykvc2l6ZW9mKHVuc2lnbmVkIGludCk7aSsrKQorCXsKKwkJd3NwcmludGYodG1wLCAiJWQiLCB0aGVfU2FtcGxpbmdGcmVxc1tpXSk7CisJCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19DT01CT19TQU1QTEVGUkVRKSwgQ0JfQUREU1RSSU5HLCBOVUxMLCAoTFBBUkFNKSB0bXAgKTsKKwl9CisqLwkKKworCS8vIEFkZCByZXF1aXJlZCBiaXRyYXRlcworLyoJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX0JJVFJBVEUpLCBDQl9SRVNFVENPTlRFTlQgLCBOVUxMLCBOVUxMKTsKKwlmb3IgKGk9MDtpPEdldEJpdHJhdGVMZW50Z2goKTtpKyspCisJeworCQlHZXRCaXRyYXRlU3RyaW5nKHRtcCwgNSwgaSk7CisJCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19DT01CT19CSVRSQVRFKSwgQ0JfQUREU1RSSU5HLCBOVUxMLCAoTFBBUkFNKSB0bXAgKTsKKwl9CisKKwkvLyBBZGQgYml0cmF0ZXMgdG8gdGhlIFZCUiBjb21ibyBib3ggdG9vCisJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX01BWEJJVFJBVEUpLCBDQl9SRVNFVENPTlRFTlQgLCBOVUxMLCBOVUxMKTsKKwlmb3IgKGk9MDtpPEdldEJpdHJhdGVMZW50Z2goKTtpKyspCisJeworCQlHZXRCaXRyYXRlU3RyaW5nKHRtcCwgNSwgaSk7CisJCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19DT01CT19NQVhCSVRSQVRFKSwgQ0JfQUREU1RSSU5HLCBOVUxMLCAoTFBBUkFNKSB0bXAgKTsKKwl9CisKKwkvLyBBZGQgVkJSIFF1YWxpdHkgU2xpZGVyCisJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9RVUFMSVRZKSwgVEJNX1NFVFJBTkdFLCBUUlVFLCBNQUtFTE9ORygwLDkpKTsKKworCS8vIEFkZCBwcmVzZXRzCisJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX1BSRVNFVCksIENCX1JFU0VUQ09OVEVOVCAsIE5VTEwsIE5VTEwpOworCWZvciAoaT0wO2k8R2V0UHJlc2V0TGVudGdoKCk7aSsrKQorCQlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fUFJFU0VUKSwgQ0JfQUREU1RSSU5HLCBOVUxMLCAoTFBBUkFNKSBHZXRQcmVzZXRNb2RlU3RyaW5nKGkpKTsKKyovCisKKwkvLyBBZGQgQUJSIFNsaWRlcnMKKwlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfU0xJREVSX0FWRVJBR0VfTUlOKSwgVEJNX1NFVFJBTkdFLCBUUlVFLCBNQUtFTE9ORyg4LDMyMCkpOworCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9NQVgpLCBUQk1fU0VUUkFOR0UsIFRSVUUsIE1BS0VMT05HKDgsMzIwKSk7CisJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9BVkVSQUdFX1NURVApLCBUQk1fU0VUUkFOR0UsIFRSVUUsIE1BS0VMT05HKDEsMTYpKTsKKworCS8vIFRvb2wtVGlwIGluaXRpYWxpYXNpYXRpb24KKwlUT09MSU5GTyB0aTsKKwlIV05EIFRvb2xUaXBXbmQ7CisJY2hhciBEaXNwbGF5U3RyWzMwXSA9ICJ0ZXN0IHRvb2x0aXAiOworCisJVG9vbFRpcFduZCA9IENyZWF0ZVdpbmRvd0V4KFdTX0VYX1RPUE1PU1QsCisgICAgICAgIFRPT0xUSVBTX0NMQVNTLAorICAgICAgICBOVUxMLAorICAgICAgICBXU19QT1BVUCB8IFRUU19OT1BSRUZJWCB8IFRUU19BTFdBWVNUSVB8VFRTX0JBTExPT04gLAkJCisgICAgICAgIENXX1VTRURFRkFVTFQsCisgICAgICAgIENXX1VTRURFRkFVTFQsCisgICAgICAgIENXX1VTRURFRkFVTFQsCisgICAgICAgIENXX1VTRURFRkFVTFQsCisgICAgICAgIEh3bmREbGcsCisgICAgICAgIE5VTEwsCisgICAgICAgIE5VTEwsCisgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKworCVNldFdpbmRvd1BvcyhUb29sVGlwV25kLAorICAgICAgICBIV05EX1RPUE1PU1QsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUpOworCisgICAgLyogSU5JVElBTElaRSBNRU1CRVJTIE9GIFRIRSBUT09MSU5GTyBTVFJVQ1RVUkUgKi8KKwl0aS5jYlNpemUJCT0gc2l6ZW9mKFRPT0xJTkZPKTsKKwl0aS51RmxhZ3MJCT0gVFRGX1NVQkNMQVNTIHwgVFRGX0lESVNIV05EOworCXRpLmh3bmQJCQk9IEh3bmREbGc7CisJdGkubHBzelRleHQJCT0gTFBTVFJfVEVYVENBTExCQUNLOworICAgIAorICAgIC8qIFNFTkQgQU4gQUREVE9PTCBNRVNTQUdFIFRPIFRIRSBUT09MVElQIENPTlRST0wgV0lORE9XICovCisJZm9yKGk9MDsgaTxzaXplb2YgVG9vbHRpcHMvc2l6ZW9mIFRvb2x0aXBzWzBdOyArK2kpIHsKKwkJdGkudUlkCQkJPSAoV1BBUkFNKUdldERsZ0l0ZW0oSHduZERsZywgVG9vbHRpcHNbaV0uaWQpOworCisJCWlmICh0aS51SWQpCisJCQlTZW5kTWVzc2FnZShUb29sVGlwV25kLCBUVE1fQUREVE9PTCwgMCwgKExQQVJBTSkmdGkpOworCX0KKworbXlfZGVidWcuT3V0UHV0KCJjYWxsIFVwZGF0ZUNvbmZpZ3MiKTsKKworCVVwZGF0ZUNvbmZpZ3MoSHduZERsZyk7CisKK215X2RlYnVnLk91dFB1dCgiY2FsbCBVcGRhdGVEbGdGcm9tVmFsdWUiKTsKKworCVVwZGF0ZURsZ0Zyb21WYWx1ZShId25kRGxnKTsKKworCisJbXlfZGVidWcuT3V0UHV0KCJmaW5pc2hlZCBJbml0Q29uZmlnRGxnIik7CisKKworCXJldHVybiB0cnVlOworfQorCitib29sIEFFbmNvZGVQcm9wZXJ0aWVzOjpVcGRhdGVEbGdGcm9tVmFsdWUoSFdORCBId25kRGxnKQoreworCS8vIGdldCBhbGwgdGhlIHJlcXVpcmVkIHN0cmluZ3MKKy8vCVRDSEFSIFZlcnNpb25bNV07CisvLwlMb2FkU3RyaW5nKGhEbGxJbnN0YW5jZSwgSURTX1NUUklOR19WRVJTSU9OLCBWZXJzaW9uLCA1KTsKKworCWludCBpOworCisJLy8gQ2hlY2sgYm94ZXMgaWYgcmVxdWlyZWQKKwk6OkNoZWNrRGxnQnV0dG9uKCBId25kRGxnLCBJRENfQ0hFQ0tfQ0hFQ0tTVU0sICAgICBHZXRDUkNNb2RlKCkgICAgICAgID9CU1RfQ0hFQ0tFRDpCU1RfVU5DSEVDS0VEICk7CisJOjpDaGVja0RsZ0J1dHRvbiggSHduZERsZywgSURDX0NIRUNLX09SSUdJTkFMLCAgICAgR2V0T3JpZ2luYWxNb2RlKCkgICA/QlNUX0NIRUNLRUQ6QlNUX1VOQ0hFQ0tFRCApOworCTo6Q2hlY2tEbGdCdXR0b24oIEh3bmREbGcsIElEQ19DSEVDS19QUklWQVRFLCAgICAgIEdldFByaXZhdGVNb2RlKCkgICAgP0JTVF9DSEVDS0VEOkJTVF9VTkNIRUNLRUQgKTsKKwk6OkNoZWNrRGxnQnV0dG9uKCBId25kRGxnLCBJRENfQ0hFQ0tfQ09QWVJJR0hULCAgICBHZXRDb3B5cmlnaHRNb2RlKCkgID9CU1RfQ0hFQ0tFRDpCU1RfVU5DSEVDS0VEICk7CisJOjpDaGVja0RsZ0J1dHRvbiggSHduZERsZywgSURDX0NIRUNLX0VOQ19TTUFSVCwgICAgR2V0U21hcnRPdXRwdXRNb2RlKCk/QlNUX0NIRUNLRUQ6QlNUX1VOQ0hFQ0tFRCApOworCTo6Q2hlY2tEbGdCdXR0b24oIEh3bmREbGcsIElEQ19DSEVDS19FTkNfQUJSLCAgICAgIEdldEFick91dHB1dE1vZGUoKSAgP0JTVF9DSEVDS0VEOkJTVF9VTkNIRUNLRUQgKTsKKy8vCTo6Q2hlY2tEbGdCdXR0b24oIEh3bmREbGcsIElEQ19DSEVDS19SRVNFUlZPSVIsICAgICFHZXROb0JpUmVzTW9kZSgpID9CU1RfQ0hFQ0tFRDpCU1RfVU5DSEVDS0VEICk7CisvLwk6OkNoZWNrRGxnQnV0dG9uKCBId25kRGxnLCBJRENfQ0hFQ0tfWElOR1ZCUiwgICAgICBHZXRYaW5nRnJhbWVNb2RlKCk/QlNUX0NIRUNLRUQ6QlNUX1VOQ0hFQ0tFRCApOworLy8JOjpDaGVja0RsZ0J1dHRvbiggSHduZERsZywgSURDX0NIRUNLX1JFU0FNUExFLCAgICAgR2V0UmVzYW1wbGVNb2RlKCkgP0JTVF9DSEVDS0VEOkJTVF9VTkNIRUNLRUQgKTsKKy8vCTo6Q2hlY2tEbGdCdXR0b24oIEh3bmREbGcsIElEQ19DSEVDS19DSEFOTkVMRk9SQ0UsIGJGb3JjZUNoYW5uZWwgICAgID9CU1RfQ0hFQ0tFRDpCU1RfVU5DSEVDS0VEICk7CisJCisJLy8gQWRkIHJlcXVpcmVkIGNoYW5uZWwgbW9kZXMKKwlmb3IgKGk9MDtpPEdldENoYW5uZWxMZW50Z2goKTtpKyspCisJeworCQlpZiAoaSA9PSBuQ2hhbm5lbEluZGV4KQorCQl7CisJCQlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fRU5DX1NURVJFTyksIENCX1NFVENVUlNFTCwgaSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIEFkZCBWQlIgUXVhbGl0eQorCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9NSU4pLCBUQk1fU0VUUE9TLCBUUlVFLCBBdmVyYWdlQml0cmF0ZV9NaW4pOworCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9NQVgpLCBUQk1fU0VUUE9TLCBUUlVFLCBBdmVyYWdlQml0cmF0ZV9NYXgpOworCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9TVEVQKSwgVEJNX1NFVFBPUywgVFJVRSwgQXZlcmFnZUJpdHJhdGVfU3RlcCk7CisJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9BVkVSQUdFX1NBTVBMRSksIFRCTV9TRVRQT1MsIFRSVUUsIEF2ZXJhZ2VCaXRyYXRlX01heCk7CisKKwlVcGRhdGVEbGdGcm9tU2xpZGVzKEh3bmREbGcpOworCisJRW5hYmxlQWJyT3B0aW9ucyhId25kRGxnLCBHZXRBYnJPdXRwdXRNb2RlKCkpOworLy8JVXBkYXRlQWJyU3RlcHMoQXZlcmFnZUJpdHJhdGVfTWluLCBBdmVyYWdlQml0cmF0ZV9NYXgsIEF2ZXJhZ2VCaXRyYXRlX1N0ZXApOworCS8vIEFkZCBhbGwgcG9zc2libGUgcmUtc2FtcGxpbmcgZnJlcQorLyoJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX1NBTVBMRUZSRVEpLCBDQl9TRVRDVVJTRUwsIG5TYW1wbGluZ0ZyZXFJbmRleCwgTlVMTCk7CisJCisKKwkvLyBBZGQgcmVxdWlyZWQgYml0cmF0ZXMKKwlmb3IgKGk9MDtpPEdldEJpdHJhdGVMZW50Z2goKTtpKyspCisJeworCQlpZiAoaSA9PSBuTWluQml0cmF0ZUluZGV4KQorCQl7CisJCQlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fQklUUkFURSksIENCX1NFVENVUlNFTCwgaSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIEFkZCBiaXRyYXRlcyB0byB0aGUgVkJSIGNvbWJvIGJveCB0b28KKwlmb3IgKGk9MDtpPEdldEJpdHJhdGVMZW50Z2goKTtpKyspCisJeworCQlpZiAoaSA9PSBuTWF4Qml0cmF0ZUluZGV4KQorCQl7CisJCQlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fTUFYQklUUkFURSksIENCX1NFVENVUlNFTCwgaSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKworLy8JU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9RVUFMSVRZKSwgVEJNX1NFVFJBTkdFLCBUUlVFLCBNQUtFTE9ORygwLDkpKTsKKworCWNoYXIgdG1wWzNdOworCXdzcHJpbnRmKHRtcCwiJWQiLFZiclF1YWxpdHkpOworCVNldFdpbmRvd1RleHQoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTkZJR19RVUFMSVRZKSwgdG1wKTsKKwlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfU0xJREVSX1FVQUxJVFkpLCBUQk1fU0VUUE9TLCBUUlVFLCBWYnJRdWFsaXR5KTsKKwkKKwl3c3ByaW50Zih0bXAsIiVkIixBdmVyYWdlQml0cmF0ZSk7CisJU2V0V2luZG93VGV4dChHZXREbGdJdGVtKCBId25kRGxnLCBJRENfRURJVF9BVkVSQUdFKSwgdG1wKTsKKwkKKwkvLyBEaXNwbGF5IFZCUiBzZXR0aW5ncyBpZiBuZWVkZWQKKwlBRW5jb2RlUHJvcGVydGllczo6RGlzcGxheVZick9wdGlvbnMoSHduZERsZywgbUJSbW9kZSk7CisKKwkvLyBEaXNwbGF5IFJlc2FtcGxlIHNldHRpbmdzIGlmIG5lZWRlZAorCWlmIChHZXRSZXNhbXBsZU1vZGUoKSkKKwl7CisJCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbShId25kRGxnLElEQ19DT01CT19TQU1QTEVGUkVRKSwgVFJVRSk7CisJfQorCWVsc2UKKwl7CisJCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbShId25kRGxnLElEQ19DT01CT19TQU1QTEVGUkVRKSwgRkFMU0UpOworCX0KKworCisJLy8gQWRkIHByZXNldHMKKwlmb3IgKGk9MDtpPEdldFByZXNldExlbnRnaCgpO2krKykKKwl7CisJCWlmIChpID09IG5QcmVzZXRJbmRleCkKKwkJeworCQkJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX1BSRVNFVCksIENCX1NFVENVUlNFTCwgaSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIEFkZCBVc2VyIGNvbmZpZ3MKKy8vCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19DT01CT19TRVRUSU5HUyksIENCX1JFU0VUQ09OVEVOVCAsIE5VTEwsIE5VTEwpOworCTo6U2V0V2luZG93VGV4dCg6OkdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19FRElUX09VVFBVVERJUiksIE91dHB1dERpci5jX3N0cigpKTsKKyovCisJLyoqCisJCVx0b2RvIFNlbGVjdCB0aGUgcmlnaHQgc2F2ZWQgY29uZmlnCisJKi8KKworCXJldHVybiB0cnVlOworfQorCitib29sIEFFbmNvZGVQcm9wZXJ0aWVzOjpVcGRhdGVWYWx1ZUZyb21EbGcoSFdORCBId25kRGxnKQoreworCW5DaGFubmVsSW5kZXggICAgICA9IFNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIEh3bmREbGcsIElEQ19DT01CT19FTkNfU1RFUkVPKSwgICBDQl9HRVRDVVJTRUwsIE5VTEwsIE5VTEwpOworLy8Jbk1pbkJpdHJhdGVJbmRleCAgID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX0JJVFJBVEUpLCAgICBDQl9HRVRDVVJTRUwsIE5VTEwsIE5VTEwpOworLy8Jbk1heEJpdHJhdGVJbmRleCAgID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX01BWEJJVFJBVEUpLCBDQl9HRVRDVVJTRUwsIE5VTEwsIE5VTEwpOworLy8JblByZXNldEluZGV4ICAgICAgID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX1BSRVNFVCksICAgICBDQl9HRVRDVVJTRUwsIE5VTEwsIE5VTEwpOworLy8JVmJyUXVhbGl0eSAgICAgICAgID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9RVUFMSVRZKSwgVEJNX0dFVFBPUyAsIE5VTEwsIE5VTEwpOworLy8JblNhbXBsaW5nRnJlcUluZGV4ID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX1NBTVBMRUZSRVEpLCBDQl9HRVRDVVJTRUwsIE5VTEwsIE5VTEwpOworCisJYkNSQyAgICAgICAgICA9ICg6OklzRGxnQnV0dG9uQ2hlY2tlZCggSHduZERsZywgSURDX0NIRUNLX0NIRUNLU1VNKSAgICAgPT0gQlNUX0NIRUNLRUQpOworCWJDb3B5cmlnaHQgICAgPSAoOjpJc0RsZ0J1dHRvbkNoZWNrZWQoIEh3bmREbGcsIElEQ19DSEVDS19DT1BZUklHSFQpICAgID09IEJTVF9DSEVDS0VEKTsKKwliT3JpZ2luYWwgICAgID0gKDo6SXNEbGdCdXR0b25DaGVja2VkKCBId25kRGxnLCBJRENfQ0hFQ0tfT1JJR0lOQUwpICAgICA9PSBCU1RfQ0hFQ0tFRCk7CisJYlByaXZhdGUgICAgICA9ICg6OklzRGxnQnV0dG9uQ2hlY2tlZCggSHduZERsZywgSURDX0NIRUNLX1BSSVZBVEUpICAgICAgPT0gQlNUX0NIRUNLRUQpOworCWJTbWFydE91dHB1dCAgPSAoOjpJc0RsZ0J1dHRvbkNoZWNrZWQoIEh3bmREbGcsIElEQ19DSEVDS19FTkNfU01BUlQpICAgID09IEJTVF9DSEVDS0VEKTsKKwliQWJyT3V0cHV0ICAgID0gKDo6SXNEbGdCdXR0b25DaGVja2VkKCBId25kRGxnLCBJRENfQ0hFQ0tfRU5DX0FCUikgICAgICA9PSBCU1RfQ0hFQ0tFRCk7CisvLwliTm9CaXRSZXMgICAgID0hKDo6SXNEbGdCdXR0b25DaGVja2VkKCBId25kRGxnLCBJRENfQ0hFQ0tfUkVTRVJWT0lSKSAgICA9PSBCU1RfQ0hFQ0tFRCk7CisvLwliWGluZ0ZyYW1lICAgID0gKDo6SXNEbGdCdXR0b25DaGVja2VkKCBId25kRGxnLCBJRENfQ0hFQ0tfWElOR1ZCUikgICAgICA9PSBCU1RfQ0hFQ0tFRCk7CisvLwliUmVzYW1wbGUgICAgID0gKDo6SXNEbGdCdXR0b25DaGVja2VkKCBId25kRGxnLCBJRENfQ0hFQ0tfUkVTQU1QTEUpICAgICA9PSBCU1RfQ0hFQ0tFRCk7CisvLwliRm9yY2VDaGFubmVsID0gKDo6SXNEbGdCdXR0b25DaGVja2VkKCBId25kRGxnLCBJRENfQ0hFQ0tfQ0hBTk5FTEZPUkNFKSA9PSBCU1RfQ0hFQ0tFRCk7CisKKwlBdmVyYWdlQml0cmF0ZV9NaW4gID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9BVkVSQUdFX01JTiksIFRCTV9HRVRQT1MgLCBOVUxMLCBOVUxMKTsKKwlBdmVyYWdlQml0cmF0ZV9NYXggID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9BVkVSQUdFX01BWCksIFRCTV9HRVRQT1MgLCBOVUxMLCBOVUxMKTsKKwlBdmVyYWdlQml0cmF0ZV9TdGVwID0gU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX1NMSURFUl9BVkVSQUdFX1NURVApLCBUQk1fR0VUUE9TICwgTlVMTCwgTlVMTCk7CisKKwlFbmFibGVBYnJPcHRpb25zKEh3bmREbGcsIGJBYnJPdXRwdXQpOworCitteV9kZWJ1Zy5PdXRQdXQoIm5DaGFubmVsSW5kZXggJWQsIGJDUkMgJWQsIGJDb3B5cmlnaHQgJWQsIGJPcmlnaW5hbCAlZCwgYlByaXZhdGUgJWQiLG5DaGFubmVsSW5kZXgsIGJDUkMsIGJDb3B5cmlnaHQsIGJPcmlnaW5hbCwgYlByaXZhdGUpOworCisvKgljaGFyIHRtcFBhdGhbTUFYX1BBVEhdOworCTo6R2V0V2luZG93VGV4dCggOjpHZXREbGdJdGVtKCBId25kRGxnLCBJRENfRURJVF9PVVRQVVRESVIpLCB0bXBQYXRoLCBNQVhfUEFUSCk7CisJT3V0cHV0RGlyID0gdG1wUGF0aDsKKworCWlmICg6OklzRGxnQnV0dG9uQ2hlY2tlZChId25kRGxnLCBJRENfUkFESU9fQklUUkFURV9DQlIpID09IEJTVF9DSEVDS0VEKQorCQltQlJtb2RlID0gQlJfQ0JSOworCWVsc2UgaWYgKDo6SXNEbGdCdXR0b25DaGVja2VkKEh3bmREbGcsIElEQ19SQURJT19CSVRSQVRFX1ZCUikgPT0gQlNUX0NIRUNLRUQpCisJCW1CUm1vZGUgPSBCUl9WQlI7CisJZWxzZQorCQltQlJtb2RlID0gQlJfQUJSOworCQorCTo6R2V0V2luZG93VGV4dCggOjpHZXREbGdJdGVtKCBId25kRGxnLCBJRENfRURJVF9BVkVSQUdFKSwgdG1wUGF0aCwgTUFYX1BBVEgpOworCUF2ZXJhZ2VCaXRyYXRlID0gYXRvaSh0bXBQYXRoKTsKKwlpZiAoQXZlcmFnZUJpdHJhdGUgPCA4KQorCQlBdmVyYWdlQml0cmF0ZSA9IDg7CisJaWYgKEF2ZXJhZ2VCaXRyYXRlID4gMzIwKQorCQlBdmVyYWdlQml0cmF0ZSA9IDMyMDsKKyovCisJcmV0dXJuIHRydWU7Cit9CisvKgorVkJSTUVUSE9EIEFFbmNvZGVQcm9wZXJ0aWVzOjpHZXRWQlJWYWx1ZShEV09SRCAmIE1heEJpdHJhdGUsIGludCAmIFF1YWxpdHksIERXT1JEICYgQWJyQml0cmF0ZSwgQk9PTCAmIFZCUkhlYWRlciwgY29uc3QgRFdPUkQgTVBFR19WZXJzaW9uKSBjb25zdAoreworCWFzc2VydCgoTVBFR19WZXJzaW9uID09IE1QRUcxKSB8fCAoTVBFR19WZXJzaW9uID09IE1QRUcyKSk7CisJYXNzZXJ0KG5NYXhCaXRyYXRlSW5kZXggPCBzaXplb2YodGhlX0JpdHJhdGVzKSk7CisKKwlpZiAobUJSbW9kZSA9PSBCUl9WQlIpCisJeworCQlNYXhCaXRyYXRlID0gdGhlX0JpdHJhdGVzW25NYXhCaXRyYXRlSW5kZXhdOworCisJCWlmIChNUEVHX1ZlcnNpb24gPT0gTVBFRzEpCisJCQlNYXhCaXRyYXRlID0gTWF4Qml0cmF0ZT50aGVfTVBFRzFfQml0cmF0ZXNbc2l6ZW9mKHRoZV9NUEVHMV9CaXRyYXRlcykvc2l6ZW9mKHVuc2lnbmVkIGludCktMV0/TWF4Qml0cmF0ZTp0aGVfTVBFRzFfQml0cmF0ZXNbc2l6ZW9mKHRoZV9NUEVHMV9CaXRyYXRlcykvc2l6ZW9mKHVuc2lnbmVkIGludCktMV07CisJCWVsc2UKKwkJCU1heEJpdHJhdGUgPSBNYXhCaXRyYXRlPHRoZV9NUEVHMl9CaXRyYXRlc1swXT9NYXhCaXRyYXRlOnRoZV9NUEVHMl9CaXRyYXRlc1swXTsKKworCQlWQlJIZWFkZXIgPSBiWGluZ0ZyYW1lOworCQlRdWFsaXR5ID0gVmJyUXVhbGl0eTsKKwkJQWJyQml0cmF0ZSA9IDA7CisKKwkJcmV0dXJuIFZCUl9NRVRIT0RfREVGQVVMVDsgLy8gZm9yIHRoZSBtb21lbnQKKwl9IAorCWVsc2UgaWYgKG1CUm1vZGUgPT0gQlJfQUJSKQorCXsKKwkJTWF4Qml0cmF0ZSA9IHRoZV9CaXRyYXRlc1tuTWF4Qml0cmF0ZUluZGV4XTsKKworCQlpZiAoTVBFR19WZXJzaW9uID09IE1QRUcxKQorCQkJTWF4Qml0cmF0ZSA9IE1heEJpdHJhdGU+dGhlX01QRUcxX0JpdHJhdGVzW3NpemVvZih0aGVfTVBFRzFfQml0cmF0ZXMpL3NpemVvZih1bnNpZ25lZCBpbnQpLTFdP01heEJpdHJhdGU6dGhlX01QRUcxX0JpdHJhdGVzW3NpemVvZih0aGVfTVBFRzFfQml0cmF0ZXMpL3NpemVvZih1bnNpZ25lZCBpbnQpLTFdOworCQllbHNlCisJCQlNYXhCaXRyYXRlID0gTWF4Qml0cmF0ZTx0aGVfTVBFRzJfQml0cmF0ZXNbMF0/TWF4Qml0cmF0ZTp0aGVfTVBFRzJfQml0cmF0ZXNbMF07CisKKwkJVkJSSGVhZGVyID0gYlhpbmdGcmFtZTsKKwkJUXVhbGl0eSA9IDA7CisJCUFickJpdHJhdGUgPSBBdmVyYWdlQml0cmF0ZSoxMDAwOworCQlyZXR1cm4gVkJSX01FVEhPRF9BQlI7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiBWQlJfTUVUSE9EX05PTkU7CisJfQorfQorKi8KK3ZvaWQgQUVuY29kZVByb3BlcnRpZXM6OlBhcmFtc1Jlc3RvcmUoKQoreworCS8vIHVzZSB0aGVzZSBkZWZhdWx0IHBhcmFtZXRlcnMgaW4gY2FzZSBvbmUgaXMgbm90IGZvdW5kCisJYkNvcHlyaWdodCAgICA9IHRydWU7CisJYkNSQyAgICAgICAgICA9IHRydWU7CisJYk9yaWdpbmFsICAgICA9IHRydWU7CisJYlByaXZhdGUgICAgICA9IHRydWU7CisJYk5vQml0UmVzICAgICA9IGZhbHNlOyAvLyBlbmFibGUgYml0IHJlc2Vydm9pcgorCWJYaW5nRnJhbWUgICAgPSB0cnVlOworCWJSZXNhbXBsZSAgICAgPSBmYWxzZTsKKwliRm9yY2VDaGFubmVsID0gZmFsc2U7CisJYlNtYXJ0T3V0cHV0ICA9IHRydWU7CisJYkFick91dHB1dCAgICA9IHRydWU7CisJCisJQXZlcmFnZUJpdHJhdGVfTWluID0gODA7IC8vIGEgYml0IGxhbWUKKwlBdmVyYWdlQml0cmF0ZV9NYXggPSAxNjA7IC8vIGEgYml0IGxhbWUKKwlBdmVyYWdlQml0cmF0ZV9TdGVwID0gODsgLy8gYSBiaXQgbGFtZQorCVNtYXJ0UmF0aW9NYXggPSAxNS4wOworCisJbkNoYW5uZWxJbmRleCA9IDI7IC8vIGpvaW50LXN0ZXJlbworCW1CUm1vZGUgICAgICAgPSBCUl9DQlI7CisJbk1pbkJpdHJhdGVJbmRleCA9IDY7IC8vIDEyOCBrYnBzICh3b3JrcyBmb3IgYm90aCBNUEVHSSBhbmQgSUkpCisJbk1heEJpdHJhdGVJbmRleCA9IDQ7IC8vIDE2MCBrYnBzICh3b3JrcyBmb3IgYm90aCBNUEVHSSBhbmQgSUkpCisJblByZXNldEluZGV4ID0gMDsgLy8gTm9uZQorCVZiclF1YWxpdHkgPSAxOyAvLyBRdWl0ZSBIaWdoCisvLwlBdmVyYWdlQml0cmF0ZSA9IDEyODsgLy8gYSBiaXQgbGFtZQorCW5TYW1wbGluZ0ZyZXFJbmRleCA9IDE7IC8vIDQ0MTAwCisKKy8vCU91dHB1dERpciA9ICJjOlxcIjsKKworLy8JRGxsTG9jYXRpb24gPSAicGx1Z2luc1xcbGFtZV9lbmMuZGxsIjsKKworCS8vIGdldCB0aGUgdmFsdWVzIGZyb20gdGhlIHNhdmVkIGZpbGUgaWYgcG9zc2libGUKKwlpZiAobXlfc3RvcmVkX2RhdGEuTG9hZEZpbGUobXlfc3RvcmVfbG9jYXRpb24pKQorCXsKKwkJVGlYbWxOb2RlKiBub2RlOworCisJCW5vZGUgPSBteV9zdG9yZWRfZGF0YS5GaXJzdENoaWxkKCJsYW1lX2FjbSIpOworCisJCVRpWG1sRWxlbWVudCogQ3VycmVudE5vZGUgPSBub2RlLT5GaXJzdENoaWxkRWxlbWVudCgiZW5jb2RpbmdzIik7CisKKwkJc3RkOjpzdHJpbmcgQ3VycmVudENvbmZpZyA9ICIiOworCisJCWlmIChDdXJyZW50Tm9kZS0+QXR0cmlidXRlKCJkZWZhdWx0IikgIT0gTlVMTCkKKwkJeworCQkJQ3VycmVudENvbmZpZyA9ICpDdXJyZW50Tm9kZS0+QXR0cmlidXRlKCJkZWZhdWx0Iik7CisJCX0KKworLyoJCS8vIG91dHB1dCBwYXJhbWV0ZXJzCisJCVRpWG1sRWxlbWVudCogaXRlcmF0ZUVsbXQgPSBub2RlLT5GaXJzdENoaWxkRWxlbWVudCgiRExMIik7CisJCWlmIChpdGVyYXRlRWxtdCAhPSBOVUxMKQorCQl7CisJCQljb25zdCBzdGQ6OnN0cmluZyAqIHRtcG5hbWUgPSBpdGVyYXRlRWxtdC0+QXR0cmlidXRlKCJsb2NhdGlvbiIpOworCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCXsKKwkJCQlEbGxMb2NhdGlvbiA9ICp0bXBuYW1lOworCQkJfQorCQl9CisqLworCQlHZXRWYWx1ZXNGcm9tS2V5KEN1cnJlbnRDb25maWcsICpDdXJyZW50Tm9kZSk7CisJfQorCWVsc2UKKwl7CisJCS8qKgorCQkJXHRvZG8gc2F2ZSB0aGUgZGF0YSBpbiB0aGUgZmlsZSAhCisJCSovCisJfQorfQorCit2b2lkIEFFbmNvZGVQcm9wZXJ0aWVzOjpQYXJhbXNTYXZlKCkKK3sKKy8qCisKKworCXNhdmUgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyBpbiB0aGUgY29ycmVzcG9uZGluZyBzdWJrZXkKKwkKKworCisKKwlIS0VZIE9zc0tleTsKKworCWlmIChSZWdDcmVhdGVLZXlFeCAoIEhLRVlfTE9DQUxfTUFDSElORSwgIlNPRlRXQVJFXFxNVUtPTElcXG91dF9sYW1lIiwgMCwgIiIsIFJFR19PUFRJT05fTk9OX1ZPTEFUSUxFLCBLRVlfV1JJVEUgLCBOVUxMLCAmT3NzS2V5LCBOVUxMICkgPT0gRVJST1JfU1VDQ0VTUykgeworCisJCWlmIChSZWdTZXRWYWx1ZUV4KE9zc0tleSwgIkRMTCBMb2NhdGlvbiIsIDAsIFJFR19FWFBBTkRfU1osIChDT05TVCBCWVRFICopRGxsTG9jYXRpb24sIHN0cmxlbihEbGxMb2NhdGlvbikrMSApICE9IEVSUk9SX1NVQ0NFU1MpCisJCQlyZXR1cm47CisJCQorCQlSZWdDbG9zZUtleShPc3NLZXkpOyAKKwl9CisqLworfQorLyoKK3ZvaWQgQUVuY29kZVByb3BlcnRpZXM6OkRpc3BsYXlWYnJPcHRpb25zKGNvbnN0IEhXTkQgaERpYWxvZywgY29uc3QgQlJNb2RlIHRoZV9tb2RlKQoreworCWJvb2wgYlZCUiA9IGZhbHNlOworCWJvb2wgYkFCUiA9IGZhbHNlOworCisJc3dpdGNoICggdGhlX21vZGUgKQorCXsKKwkJY2FzZSBCUl9DQlI6CisJCQk6OkNoZWNrUmFkaW9CdXR0b24oaERpYWxvZywgSURDX1JBRElPX0JJVFJBVEVfQ0JSLCBJRENfUkFESU9fQklUUkFURV9BQlIsIElEQ19SQURJT19CSVRSQVRFX0NCUik7CisJCQlicmVhazsKKwkJY2FzZSBCUl9WQlI6CisJCQk6OkNoZWNrUmFkaW9CdXR0b24oaERpYWxvZywgSURDX1JBRElPX0JJVFJBVEVfQ0JSLCBJRENfUkFESU9fQklUUkFURV9BQlIsIElEQ19SQURJT19CSVRSQVRFX1ZCUik7CisJCQliVkJSID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIEJSX0FCUjoKKwkJCTo6Q2hlY2tSYWRpb0J1dHRvbihoRGlhbG9nLCBJRENfUkFESU9fQklUUkFURV9DQlIsIElEQ19SQURJT19CSVRSQVRFX0FCUiwgSURDX1JBRElPX0JJVFJBVEVfQUJSKTsKKwkJCWJBQlIgPSB0cnVlOworCQkJYnJlYWs7CisKKwl9CisKKwlpZihiVkJSfGJBQlIpCisJeworCQk6OlNldFdpbmRvd1RleHQoOjpHZXREbGdJdGVtKGhEaWFsb2csSURDX1NUQVRJQ19NSU5CSVRSQVRFKSwgIk1pbiBCaXRyYXRlIik7CisJfQorCWVsc2UKKwl7CisJCTo6U2V0V2luZG93VGV4dCg6OkdldERsZ0l0ZW0oaERpYWxvZyxJRENfU1RBVElDX01JTkJJVFJBVEUpLCAiQml0cmF0ZSIpOworCX0KKworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX0NIRUNLX1hJTkdWQlIpLCBiVkJSfGJBQlIpOworCisJOjpFbmFibGVXaW5kb3coOjpHZXREbGdJdGVtKCBoRGlhbG9nLCBJRENfQ09NQk9fTUFYQklUUkFURSksIGJWQlJ8YkFCUik7CisKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TVEFUSUNfTUFYQklUUkFURSksIGJWQlJ8YkFCUik7CisKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TTElERVJfUVVBTElUWSksIGJWQlIpOworCisJOjpFbmFibGVXaW5kb3coOjpHZXREbGdJdGVtKCBoRGlhbG9nLCBJRENfQ09ORklHX1FVQUxJVFkpLCBiVkJSKTsKKworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX1NUQVRJQ19WQlJRVUFMSVRZKSwgYlZCUik7CisKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TVEFUSUNfVkJSUVVBTElUWV9MT1cpLCBiVkJSKTsKKworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX1NUQVRJQ19WQlJRVUFMSVRZX0hJR0gpLCBiVkJSKTsKKworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX1NUQVRJQ19BQlIpLCBiQUJSKTsKKworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX0VESVRfQVZFUkFHRSksIGJBQlIpOworfQorKi8KK0FFbmNvZGVQcm9wZXJ0aWVzOjpBRW5jb2RlUHJvcGVydGllcyhITU9EVUxFIGhNb2R1bGUpCisgOm15X2RlYnVnKEFEYmcoREVCVUdfTEVWRUxfQ1JFQVRJT04pKSwKKyBteV9oTW9kdWxlKGhNb2R1bGUpCit7CisJc3RkOjpzdHJpbmcgcGF0aCA9ICIiOworLy8JSE1PRFVMRSBodG1wID0gTG9hZExpYnJhcnkoIm91dF9sYW1lLmRsbCIpOworCWlmIChoTW9kdWxlICE9IE5VTEwpCisJeworCQljaGFyIG91dHB1dFtNQVhfUEFUSF07CisJCTo6R2V0TW9kdWxlRmlsZU5hbWUoaE1vZHVsZSwgb3V0cHV0LCBNQVhfUEFUSCk7CisvLwkJOjpGcmVlTGlicmFyeShodG1wKTsKKworCQlwYXRoID0gb3V0cHV0OworCX0KKwlteV9zdG9yZV9sb2NhdGlvbiA9IHBhdGguc3Vic3RyKDAscGF0aC5maW5kX2xhc3Rfb2YoJ1xcJykrMSk7CisJbXlfc3RvcmVfbG9jYXRpb24gKz0gImxhbWVfYWNtLnhtbCI7CisKKwlteV9kZWJ1Zy5PdXRQdXQoInN0b3JlIHBhdGggPSAlcyIsbXlfc3RvcmVfbG9jYXRpb24uY19zdHIoKSk7CisvLyNpZmRlZiBPTEQKKy8vCTo6T3V0cHV0RGVidWdTdHJpbmcobXlfc3RvcmVfbG9jYXRpb24uY19zdHIoKSk7CisKKwkvLyBtYWtlIHN1cmUgdGhlIFhNTCBmaWxlIGlzIHByZXNlbnQKKwlIQU5ETEUgaEZpbGUgPSA6OkNyZWF0ZUZpbGUobXlfc3RvcmVfbG9jYXRpb24uY19zdHIoKSwgMCwgRklMRV9TSEFSRV9SRUFEfEZJTEVfU0hBUkVfV1JJVEUsIE5VTEwsIE9QRU5fQUxXQVlTLCBGSUxFX0FUVFJJQlVURV9BUkNISVZFLCBOVUxMICk7CisJOjpDbG9zZUhhbmRsZShoRmlsZSk7CisvLyNlbmRpZiAvLyBPTEQKKwlteV9kZWJ1Zy5PdXRQdXQoIkFFbmNvZGVQcm9wZXJ0aWVzIGNyZWF0aW9uIGNvbXBsZXRlZCAoMHglMDhYKSIsdGhpcyk7Cit9CisKKy8vIFNhdmUgdGhlIHZhbHVlcyB0byB0aGUgcmlnaHQgWE1MIHNhdmVkIGNvbmZpZwordm9pZCBBRW5jb2RlUHJvcGVydGllczo6U2F2ZVZhbHVlc1RvU3RyaW5nS2V5KGNvbnN0IHN0ZDo6c3RyaW5nICYgY29uZmlnX25hbWUpCit7CisJLy8gZ2V0IHRoZSBjdXJyZW50IGRhdGEgaW4gdGhlIGZpbGUgdG8ga2VlcCB0aGVtCisJaWYgKG15X3N0b3JlZF9kYXRhLkxvYWRGaWxlKG15X3N0b3JlX2xvY2F0aW9uKSkKKwl7CisJCS8vIGNoZWNrIGlmIHRoZSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbmZpZ19uYW1lIGFscmVhZHkgZXhpc3QuCisJCVRpWG1sTm9kZSogbm9kZSA9IG15X3N0b3JlZF9kYXRhLkZpcnN0Q2hpbGQoImxhbWVfYWNtIik7CisKKwkJaWYgKG5vZGUgIT0gTlVMTCkKKwkJeworCQkJVGlYbWxFbGVtZW50KiBDb25maWdOb2RlID0gbm9kZS0+Rmlyc3RDaGlsZEVsZW1lbnQoImVuY29kaW5ncyIpOworCisJCQlpZiAoQ29uZmlnTm9kZSAhPSBOVUxMKQorCQkJeworCQkJCS8vIGxvb2sgYWxsIHRoZSA8Y29uZmlnPiB0YWdzCisJCQkJVGlYbWxFbGVtZW50KiB0bXBOb2RlID0gQ29uZmlnTm9kZS0+Rmlyc3RDaGlsZEVsZW1lbnQoImNvbmZpZyIpOworCQkJCXdoaWxlICh0bXBOb2RlICE9IE5VTEwpCisJCQkJeworCQkJCQljb25zdCBzdGQ6OnN0cmluZyAqIHRtcG5hbWUgPSB0bXBOb2RlLT5BdHRyaWJ1dGUoIm5hbWUiKTsKKwkJCQkJaWYgKHRtcG5hbWUtPmNvbXBhcmUoY29uZmlnX25hbWUpID09IDApCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXRtcE5vZGUgPSB0bXBOb2RlLT5OZXh0U2libGluZ0VsZW1lbnQoImNvbmZpZyIpOworCQkJCX0KKworCQkJCWlmICh0bXBOb2RlID09IE5VTEwpCisJCQkJeworCQkJCQkvLyBDcmVhdGUgdGhlIG5vZGUKKwkJCQkJdG1wTm9kZSA9IG5ldyBUaVhtbEVsZW1lbnQoImNvbmZpZyIpOworCQkJCQl0bXBOb2RlLT5TZXRBdHRyaWJ1dGUoIm5hbWUiLGNvbmZpZ19uYW1lKTsKKworCQkJCQkvLyBzYXZlIGRhdGEgaW4gdGhlIG5vZGUKKwkJCQkJU2F2ZVZhbHVlc1RvRWxlbWVudCh0bXBOb2RlKTsKKworCQkJCQlDb25maWdOb2RlLT5JbnNlcnRFbmRDaGlsZCgqdG1wTm9kZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIHNhdmUgZGF0YSBpbiB0aGUgbm9kZQorCQkJCQlTYXZlVmFsdWVzVG9FbGVtZW50KHRtcE5vZGUpOworCQkJCX0KKworCisJCQkJLy8gYW5kIHNhdmUgdGhlIGZpbGUKKwkJCQlteV9zdG9yZWRfZGF0YS5TYXZlRmlsZShteV9zdG9yZV9sb2NhdGlvbik7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgQUVuY29kZVByb3BlcnRpZXM6OkdldFZhbHVlc0Zyb21LZXkoY29uc3Qgc3RkOjpzdHJpbmcgJiBjb25maWdfbmFtZSwgY29uc3QgVGlYbWxOb2RlICYgcGFyZW50Tm9kZSkKK3sKKwlUaVhtbEVsZW1lbnQqIHRtcEVsdDsKKwlUaVhtbEVsZW1lbnQqIGl0ZXJhdGVFbG10OworCisJLy8gZmluZCB0aGUgY29uZmlnIHRoYXQgY29ycmVzcG9uZCB0byBDdXJyZW50Q29uZmlnCisJaXRlcmF0ZUVsbXQgPSBwYXJlbnROb2RlLkZpcnN0Q2hpbGRFbGVtZW50KCJjb25maWciKTsKKwl3aGlsZSAoaXRlcmF0ZUVsbXQgIT0gTlVMTCkKKwl7CisJCWNvbnN0IHN0ZDo6c3RyaW5nICogdG1wbmFtZSA9IGl0ZXJhdGVFbG10LT5BdHRyaWJ1dGUoIm5hbWUiKTsKKwkJaWYgKCh0bXBuYW1lICE9IE5VTEwpICYmICh0bXBuYW1lLT5jb21wYXJlKGNvbmZpZ19uYW1lKSA9PSAwKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJaXRlcmF0ZUVsbXQgPSBpdGVyYXRlRWxtdC0+TmV4dFNpYmxpbmdFbGVtZW50KCJjb25maWciKTsKKwl9CisKKwlpZiAoaXRlcmF0ZUVsbXQgIT0gTlVMTCkKKwl7CisJCS8vIGdldCBhbGwgdGhlIHBhcmFtZXRlcnMgc2F2ZWQgaW4gdGhpcyBFbGVtZW50CisJCWNvbnN0IHN0ZDo6c3RyaW5nICogdG1wbmFtZTsKKworCQkvLyBTbWFydCBvdXRwdXQgcGFyYW1ldGVyCisJCXRtcEVsdCA9IGl0ZXJhdGVFbG10LT5GaXJzdENoaWxkRWxlbWVudCgiU21hcnQiKTsKKwkJaWYgKHRtcEVsdCAhPSBOVUxMKQorCQl7CisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoInVzZSIpOworCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCQliU21hcnRPdXRwdXQgPSAodG1wbmFtZS0+Y29tcGFyZSgidHJ1ZSIpID09IDApOworCQkJCisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoInJhdGlvIik7CisJCQlpZiAodG1wbmFtZSAhPSBOVUxMKQorCQkJCVNtYXJ0UmF0aW9NYXggPSBhdG9mKHRtcG5hbWUtPmNfc3RyKCkpOworCQl9CisKKwkJLy8gU21hcnQgb3V0cHV0IHBhcmFtZXRlcgorCQl0bXBFbHQgPSBpdGVyYXRlRWxtdC0+Rmlyc3RDaGlsZEVsZW1lbnQoIkFCUiIpOworCQlpZiAodG1wRWx0ICE9IE5VTEwpCisJCXsKKwkJCXRtcG5hbWUgPSB0bXBFbHQtPkF0dHJpYnV0ZSgidXNlIik7CisJCQlpZiAodG1wbmFtZSAhPSBOVUxMKQorCQkJCWJBYnJPdXRwdXQgPSAodG1wbmFtZS0+Y29tcGFyZSgidHJ1ZSIpID09IDApOworCQkJCisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoIm1pbiIpOworCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCQlBdmVyYWdlQml0cmF0ZV9NaW4gPSBhdG9pKHRtcG5hbWUtPmNfc3RyKCkpOworCisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoIm1heCIpOworCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCQlBdmVyYWdlQml0cmF0ZV9NYXggPSBhdG9pKHRtcG5hbWUtPmNfc3RyKCkpOworCisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoInN0ZXAiKTsKKwkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQkJQXZlcmFnZUJpdHJhdGVfU3RlcCA9IGF0b2kodG1wbmFtZS0+Y19zdHIoKSk7CisJCX0KKworCQkvLyBDb3B5cmlnaHQgcGFyYW1ldGVyCisJCXRtcEVsdCA9IGl0ZXJhdGVFbG10LT5GaXJzdENoaWxkRWxlbWVudCgiQ29weXJpZ2h0Iik7CisJCWlmICh0bXBFbHQgIT0gTlVMTCkKKwkJeworCQkJdG1wbmFtZSA9IHRtcEVsdC0+QXR0cmlidXRlKCJ1c2UiKTsKKwkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQkJYkNvcHlyaWdodCA9ICh0bXBuYW1lLT5jb21wYXJlKCJ0cnVlIikgPT0gMCk7CisJCX0KKworCQkvLyBDb3B5cmlnaHQgcGFyYW1ldGVyCisJCXRtcEVsdCA9IGl0ZXJhdGVFbG10LT5GaXJzdENoaWxkRWxlbWVudCgiQ1JDIik7CisJCWlmICh0bXBFbHQgIT0gTlVMTCkKKwkJeworCQkJdG1wbmFtZSA9IHRtcEVsdC0+QXR0cmlidXRlKCJ1c2UiKTsKKwkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQkJYkNSQyA9ICh0bXBuYW1lLT5jb21wYXJlKCJ0cnVlIikgPT0gMCk7CisJCX0KKworCQkvLyBDb3B5cmlnaHQgcGFyYW1ldGVyCisJCXRtcEVsdCA9IGl0ZXJhdGVFbG10LT5GaXJzdENoaWxkRWxlbWVudCgiT3JpZ2luYWwiKTsKKwkJaWYgKHRtcEVsdCAhPSBOVUxMKQorCQl7CisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoInVzZSIpOworCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCQliT3JpZ2luYWwgPSAodG1wbmFtZS0+Y29tcGFyZSgidHJ1ZSIpID09IDApOworCQl9CisKKwkJLy8gQ29weXJpZ2h0IHBhcmFtZXRlcgorCQl0bXBFbHQgPSBpdGVyYXRlRWxtdC0+Rmlyc3RDaGlsZEVsZW1lbnQoIlByaXZhdGUiKTsKKwkJaWYgKHRtcEVsdCAhPSBOVUxMKQorCQl7CisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoInVzZSIpOworCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCQliUHJpdmF0ZSA9ICh0bXBuYW1lLT5jb21wYXJlKCJ0cnVlIikgPT0gMCk7CisJCX0KKy8qCisJCS8vIENvcHlyaWdodCBwYXJhbWV0ZXIKKwkJdG1wRWx0ID0gaXRlcmF0ZUVsbXQtPkZpcnN0Q2hpbGRFbGVtZW50KCJCaXRfcmVzZXJ2b2lyIik7CisJCWlmICh0bXBFbHQgIT0gTlVMTCkKKwkJeworCQkJdG1wbmFtZSA9IHRtcEVsdC0+QXR0cmlidXRlKCJ1c2UiKTsKKwkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQkJYk5vQml0UmVzID0gISh0bXBuYW1lLT5jb21wYXJlKCJ0cnVlIikgPT0gMCk7CisJCX0KKworCQkvLyBiaXRyYXRlcworCQl0bXBFbHQgPSBpdGVyYXRlRWxtdC0+Rmlyc3RDaGlsZEVsZW1lbnQoImJpdHJhdGUiKTsKKwkJdG1wbmFtZSA9IHRtcEVsdC0+QXR0cmlidXRlKCJtaW4iKTsKKwkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJeworCQkJdW5zaWduZWQgaW50IHVpdG1wID0gYXRvaSh0bXBuYW1lLT5jX3N0cigpKTsKKwkJCWZvciAoaW50IGk9MDtpPHNpemVvZih0aGVfQml0cmF0ZXMpL3NpemVvZih1bnNpZ25lZCBpbnQpO2krKykKKwkJCXsKKwkJCQlpZiAodGhlX0JpdHJhdGVzW2ldID09IHVpdG1wKQorCQkJCXsKKwkJCQkJbk1pbkJpdHJhdGVJbmRleCA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXRtcG5hbWUgPSB0bXBFbHQtPkF0dHJpYnV0ZSgibWF4Iik7CisJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCXsKKwkJCXVuc2lnbmVkIGludCB1aXRtcCA9IGF0b2kodG1wbmFtZS0+Y19zdHIoKSk7CisJCQlmb3IgKGludCBpPTA7aTxzaXplb2YodGhlX0JpdHJhdGVzKS9zaXplb2YodW5zaWduZWQgaW50KTtpKyspCisJCQl7CisJCQkJaWYgKHRoZV9CaXRyYXRlc1tpXSA9PSB1aXRtcCkKKwkJCQl7CisJCQkJCW5NYXhCaXRyYXRlSW5kZXggPSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKyovCisvKgorCQkvLyByZXNhbXBsaW5nIHBhcmFtZXRlcnMKKwkJdG1wRWx0ID0gaXRlcmF0ZUVsbXQtPkZpcnN0Q2hpbGRFbGVtZW50KCJyZXNhbXBsaW5nIik7CisJCWlmICh0bXBFbHQgIT0gTlVMTCkKKwkJeworCQkJdG1wbmFtZSA9IHRtcEVsdC0+QXR0cmlidXRlKCJ1c2UiKTsKKwkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQkJYlJlc2FtcGxlID0gKHRtcG5hbWUtPmNvbXBhcmUoInRydWUiKSA9PSAwKTsKKworCQkJdW5zaWduZWQgaW50IHVpdG1wID0gYXRvaSh0bXBFbHQtPkF0dHJpYnV0ZSgiZnJlcSIpLT5jX3N0cigpKTsKKwkJCWZvciAoaW50IGk9MDtpPHNpemVvZih0aGVfU2FtcGxpbmdGcmVxcykvc2l6ZW9mKHVuc2lnbmVkIGludCk7aSsrKQorCQkJeworCQkJCWlmICh0aGVfU2FtcGxpbmdGcmVxc1tpXSA9PSB1aXRtcCkKKwkJCQl7CisJCQkJCW5TYW1wbGluZ0ZyZXFJbmRleCA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIFZCUiBwYXJhbWV0ZXJzCisJCXRtcEVsdCA9IGl0ZXJhdGVFbG10LT5GaXJzdENoaWxkRWxlbWVudCgiVkJSIik7CisJCWlmICh0bXBFbHQgIT0gTlVMTCkKKwkJeworCQkJdG1wbmFtZSA9IHRtcEVsdC0+QXR0cmlidXRlKCJ1c2UiKTsKKwkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQl7CisJCQkJaWYgKHRtcG5hbWUtPmNvbXBhcmUoIkFCUiIpID09IDApCisJCQkJCW1CUm1vZGUgPSBCUl9BQlI7CisJCQkJZWxzZSBpZiAodG1wbmFtZS0+Y29tcGFyZSgidHJ1ZSIpID09IDApCisJCQkJCW1CUm1vZGUgPSBCUl9WQlI7CisJCQkJZWxzZQorCQkJCQltQlJtb2RlID0gQlJfQ0JSOworCQkJfQorCisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoImhlYWRlciIpOworCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCQliWGluZ0ZyYW1lID0gKHRtcG5hbWUtPmNvbXBhcmUoInRydWUiKSA9PSAwKTsKKworCQkJdG1wbmFtZSA9IHRtcEVsdC0+QXR0cmlidXRlKCJxdWFsaXR5Iik7CisJCQlpZiAodG1wbmFtZSAhPSBOVUxMKQorCQkJeworCQkJCVZiclF1YWxpdHkgPSBhdG9pKHRtcG5hbWUtPmNfc3RyKCkpOworCQkJfQorCisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoImF2ZXJhZ2UiKTsKKwkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQl7CisJCQkJQXZlcmFnZUJpdHJhdGUgPSBhdG9pKHRtcG5hbWUtPmNfc3RyKCkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJfQorCQl9CisKKwkJLy8gb3V0cHV0IHBhcmFtZXRlcnMKKwkJdG1wRWx0ID0gaXRlcmF0ZUVsbXQtPkZpcnN0Q2hpbGRFbGVtZW50KCJvdXRwdXQiKTsKKwkJaWYgKHRtcEVsdCAhPSBOVUxMKQorCQl7CisJCQlPdXRwdXREaXIgPSAqdG1wRWx0LT5BdHRyaWJ1dGUoInBhdGgiKTsKKwkJfQorKi8KKy8vI2lmZGVmIE9MRAorCQkvLyBDaGFubmVsIG1vZGUgcGFyYW1ldGVyCisJCXRtcEVsdCA9IGl0ZXJhdGVFbG10LT5GaXJzdENoaWxkRWxlbWVudCgiQ2hhbm5lbCIpOworCQlpZiAodG1wRWx0ICE9IE5VTEwpCisJCXsKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICogdG1wU3RyID0gdG1wRWx0LT5BdHRyaWJ1dGUoIm1vZGUiKTsKKwkJCWlmICh0bXBTdHIgIT0gTlVMTCkKKwkJCXsKKwkJCQlmb3IgKGludCBpPTA7aTxHZXRDaGFubmVsTGVudGdoKCk7aSsrKQorCQkJCXsKKwkJCQkJaWYgKHRtcFN0ci0+Y29tcGFyZShHZXRDaGFubmVsTW9kZVN0cmluZyhpKSkgPT0gMCkKKwkJCQkJeworCQkJCQkJbkNoYW5uZWxJbmRleCA9IGk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKy8qCisJCQl0bXBuYW1lID0gdG1wRWx0LT5BdHRyaWJ1dGUoImZvcmNlIik7CisJCQlpZiAodG1wbmFtZSAhPSBOVUxMKQorCQkJCWJGb3JjZUNoYW5uZWwgPSAodG1wbmFtZS0+Y29tcGFyZSgidHJ1ZSIpID09IDApOworKi8KKwkJfQorLy8jZW5kaWYgLy8gT0xECisKKwkJLy8gUHJlc2V0IHBhcmFtZXRlcgorLyoKKwkJdG1wRWx0ID0gaXRlcmF0ZUVsbXQtPkZpcnN0Q2hpbGRFbGVtZW50KCJQcmVzZXQiKTsKKwkJaWYgKHRtcEVsdCAhPSBOVUxMKQorCQl7CisJCQljb25zdCBzdGQ6OnN0cmluZyAqIHRtcFN0ciA9IHRtcEVsdC0+QXR0cmlidXRlKCJ0eXBlIik7CisJCQlmb3IgKGludCBpPTA7aTxHZXRQcmVzZXRMZW50Z2goKTtpKyspCisJCQl7CisJCQkJaWYgKHRtcFN0ci0+Y29tcGFyZShHZXRQcmVzZXRNb2RlU3RyaW5nKGkpKSA9PSAwKQorCQkJCXsKKwkJCQkJblByZXNldEluZGV4ID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCX0KKyovCisJfQorfQorCisvKioKKwlcdG9kbyBzYXZlIHRoZSBwYXJhbWV0ZXJzCisqIC8KK3ZvaWQgQUVuY29kZVByb3BlcnRpZXM6OlNhdmVQYXJhbXMoY29uc3QgSFdORCBoUGFyZW50V25kKQoreworCWNoYXIgc3RyaW5nW01BWF9QQVRIXTsKKy8qCWludCBuSWR4ID0gU2VuZE1lc3NhZ2UoOjpHZXREbGdJdGVtKCBoUGFyZW50V25kICxJRENfQ09NQk9fU0VUVElOR1MgKSwgQ0JfR0VUQ1VSU0VMLCBOVUxMLCBOVUxMKTsKKwk6OlNlbmRNZXNzYWdlKDo6R2V0RGxnSXRlbSggaFBhcmVudFduZCAsSURDX0NPTUJPX1NFVFRJTkdTICksIENCX0dFVExCVEVYVCAsIG5JZHgsIChMUEFSQU0pIHN0cmluZyk7CisqIC8KK30qLworCitib29sIEFFbmNvZGVQcm9wZXJ0aWVzOjpvcGVyYXRvciAhPShjb25zdCBBRW5jb2RlUHJvcGVydGllcyAmIHRoZV9pbnN0YW5jZSkgY29uc3QKK3sKKy8qCisJOjpPdXRwdXREZWJ1Z1N0cmluZyhiQ29weXJpZ2h0ICE9IHRoZV9pbnN0YW5jZS5iQ29weXJpZ2h0PyIxIjoiLSIpOworCTo6T3V0cHV0RGVidWdTdHJpbmcoYkNSQyAhPSB0aGVfaW5zdGFuY2UuYkNSQyAgICAgICAgICAgID8iMiI6Ii0iKTsKKwk6Ok91dHB1dERlYnVnU3RyaW5nKGJPcmlnaW5hbCAhPSB0aGVfaW5zdGFuY2UuYk9yaWdpbmFsICA/IjMiOiItIik7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyhiUHJpdmF0ZSAhPSB0aGVfaW5zdGFuY2UuYlByaXZhdGUgICAgPyI0IjoiLSIpOworCTo6T3V0cHV0RGVidWdTdHJpbmcoYk5vQml0UmVzICE9IHRoZV9pbnN0YW5jZS5iTm9CaXRSZXMgID8iNSI6Ii0iKTsKKwk6Ok91dHB1dERlYnVnU3RyaW5nKG1CUm1vZGUgIT0gdGhlX2luc3RhbmNlLm1CUm1vZGUgICAgICA/IjYiOiItIik7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyhiWGluZ0ZyYW1lICE9IHRoZV9pbnN0YW5jZS5iWGluZ0ZyYW1lPyI3IjoiLSIpOworCTo6T3V0cHV0RGVidWdTdHJpbmcoYkZvcmNlQ2hhbm5lbCAhPSB0aGVfaW5zdGFuY2UuYkZvcmNlQ2hhbm5lbD8iOCI6Ii0iKTsKKwk6Ok91dHB1dERlYnVnU3RyaW5nKGJSZXNhbXBsZSAhPSB0aGVfaW5zdGFuY2UuYlJlc2FtcGxlICA/IjkiOiItIik7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyhuQ2hhbm5lbEluZGV4ICE9IHRoZV9pbnN0YW5jZS5uQ2hhbm5lbEluZGV4PyIxMCI6Ii0iKTsKKwk6Ok91dHB1dERlYnVnU3RyaW5nKG5NaW5CaXRyYXRlSW5kZXggIT0gdGhlX2luc3RhbmNlLm5NaW5CaXRyYXRlSW5kZXg/IjExIjoiLSIpOworCTo6T3V0cHV0RGVidWdTdHJpbmcobk1heEJpdHJhdGVJbmRleCAhPSB0aGVfaW5zdGFuY2Uubk1heEJpdHJhdGVJbmRleD8iMTIiOiItIik7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyhuUHJlc2V0SW5kZXggIT0gdGhlX2luc3RhbmNlLm5QcmVzZXRJbmRleD8iMTMiOiItIik7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyhWYnJRdWFsaXR5ICE9IHRoZV9pbnN0YW5jZS5WYnJRdWFsaXR5PyIxNCI6Ii0iKTsKKwk6Ok91dHB1dERlYnVnU3RyaW5nKEF2ZXJhZ2VCaXRyYXRlICE9IHRoZV9pbnN0YW5jZS5BdmVyYWdlQml0cmF0ZT8iMTUiOiItIik7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyhuU2FtcGxpbmdGcmVxSW5kZXggIT0gdGhlX2luc3RhbmNlLm5TYW1wbGluZ0ZyZXFJbmRleD8iMTYiOiItIik7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyhPdXRwdXREaXIuY29tcGFyZSh0aGVfaW5zdGFuY2UuT3V0cHV0RGlyKSAhPSAwPyIxNyI6Ii0iKTsKKworCXN0ZDo6c3RyaW5nIHRtcCA9ICIiOworCWNoYXIgdG1wSVsxMF07CisJX2l0b2EoQXZlcmFnZUJpdHJhdGUsdG1wSSwxMCk7CisJdG1wICs9IHRtcEk7CisJdG1wICs9ICIgIT0gIjsKKwlfaXRvYSh0aGVfaW5zdGFuY2UuQXZlcmFnZUJpdHJhdGUsdG1wSSwxMCk7CisJdG1wICs9IHRtcEk7CisJOjpPdXRwdXREZWJ1Z1N0cmluZyh0bXAuY19zdHIoKSk7CisqLworCXJldHVybiAoKGJDb3B5cmlnaHQgIT0gdGhlX2luc3RhbmNlLmJDb3B5cmlnaHQpCisJCSB8fCAoYkNSQyAhPSB0aGVfaW5zdGFuY2UuYkNSQykKKwkJIHx8IChiT3JpZ2luYWwgIT0gdGhlX2luc3RhbmNlLmJPcmlnaW5hbCkKKwkJIHx8IChiUHJpdmF0ZSAhPSB0aGVfaW5zdGFuY2UuYlByaXZhdGUpCisJCSB8fCAoYlNtYXJ0T3V0cHV0ICE9IHRoZV9pbnN0YW5jZS5iU21hcnRPdXRwdXQpCisJCSB8fCAoU21hcnRSYXRpb01heCAhPSB0aGVfaW5zdGFuY2UuU21hcnRSYXRpb01heCkKKwkJIHx8IChiQWJyT3V0cHV0ICE9IHRoZV9pbnN0YW5jZS5iQWJyT3V0cHV0KQorCQkgfHwgKEF2ZXJhZ2VCaXRyYXRlX01pbiAhPSB0aGVfaW5zdGFuY2UuQXZlcmFnZUJpdHJhdGVfTWluKQorCQkgfHwgKEF2ZXJhZ2VCaXRyYXRlX01heCAhPSB0aGVfaW5zdGFuY2UuQXZlcmFnZUJpdHJhdGVfTWF4KQorCQkgfHwgKEF2ZXJhZ2VCaXRyYXRlX1N0ZXAgIT0gdGhlX2luc3RhbmNlLkF2ZXJhZ2VCaXRyYXRlX1N0ZXApCisJCSB8fCAoYk5vQml0UmVzICE9IHRoZV9pbnN0YW5jZS5iTm9CaXRSZXMpCisJCSB8fCAobUJSbW9kZSAhPSB0aGVfaW5zdGFuY2UubUJSbW9kZSkKKwkJIHx8IChiWGluZ0ZyYW1lICE9IHRoZV9pbnN0YW5jZS5iWGluZ0ZyYW1lKQorCQkgfHwgKGJGb3JjZUNoYW5uZWwgIT0gdGhlX2luc3RhbmNlLmJGb3JjZUNoYW5uZWwpCisJCSB8fCAoYlJlc2FtcGxlICE9IHRoZV9pbnN0YW5jZS5iUmVzYW1wbGUpCisJCSB8fCAobkNoYW5uZWxJbmRleCAhPSB0aGVfaW5zdGFuY2UubkNoYW5uZWxJbmRleCkKKwkJIHx8IChuTWluQml0cmF0ZUluZGV4ICE9IHRoZV9pbnN0YW5jZS5uTWluQml0cmF0ZUluZGV4KQorCQkgfHwgKG5NYXhCaXRyYXRlSW5kZXggIT0gdGhlX2luc3RhbmNlLm5NYXhCaXRyYXRlSW5kZXgpCisJCSB8fCAoblByZXNldEluZGV4ICE9IHRoZV9pbnN0YW5jZS5uUHJlc2V0SW5kZXgpCisJCSB8fCAoVmJyUXVhbGl0eSAhPSB0aGVfaW5zdGFuY2UuVmJyUXVhbGl0eSkKKy8vCQkgfHwgKEF2ZXJhZ2VCaXRyYXRlICE9IHRoZV9pbnN0YW5jZS5BdmVyYWdlQml0cmF0ZSkKKwkJIHx8IChuU2FtcGxpbmdGcmVxSW5kZXggIT0gdGhlX2luc3RhbmNlLm5TYW1wbGluZ0ZyZXFJbmRleCkKKy8vCQkgfHwgKE91dHB1dERpci5jb21wYXJlKHRoZV9pbnN0YW5jZS5PdXRwdXREaXIpICE9IDApCisJCSk7Cit9CisKK3ZvaWQgQUVuY29kZVByb3BlcnRpZXM6OlNlbGVjdFNhdmVkUGFyYW1zKGNvbnN0IHN0ZDo6c3RyaW5nIHRoZV9zdHJpbmcpCit7CisJLy8gZ2V0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgc2F2ZWQgZmlsZSBpZiBwb3NzaWJsZQorCWlmIChteV9zdG9yZWRfZGF0YS5Mb2FkRmlsZShteV9zdG9yZV9sb2NhdGlvbikpCisJeworCQlUaVhtbE5vZGUqIG5vZGU7CisKKwkJbm9kZSA9IG15X3N0b3JlZF9kYXRhLkZpcnN0Q2hpbGQoImxhbWVfYWNtIik7CisKKwkJVGlYbWxFbGVtZW50KiBDdXJyZW50Tm9kZSA9IG5vZGUtPkZpcnN0Q2hpbGRFbGVtZW50KCJlbmNvZGluZ3MiKTsKKworCQlpZiAoQ3VycmVudE5vZGUgIT0gTlVMTCkKKwkJeworCQkJQ3VycmVudE5vZGUtPlNldEF0dHJpYnV0ZSgiZGVmYXVsdCIsdGhlX3N0cmluZyk7CisJCQlHZXRWYWx1ZXNGcm9tS2V5KHRoZV9zdHJpbmcsICpDdXJyZW50Tm9kZSk7CisJCQlteV9zdG9yZWRfZGF0YS5TYXZlRmlsZShteV9zdG9yZV9sb2NhdGlvbik7CisJCX0KKwl9Cit9CisKK2lubGluZSB2b2lkIEFFbmNvZGVQcm9wZXJ0aWVzOjpTZXRBdHRyaWJ1dGVCb29sKFRpWG1sRWxlbWVudCAqIHRoZV9lbHQsY29uc3Qgc3RkOjpzdHJpbmcgJiB0aGVfc3RyaW5nLCBjb25zdCBib29sIHRoZV92YWx1ZSkgY29uc3QKK3sKKwlpZiAodGhlX3ZhbHVlID09IGZhbHNlKQorCQl0aGVfZWx0LT5TZXRBdHRyaWJ1dGUodGhlX3N0cmluZywgImZhbHNlIik7CisJZWxzZQorCQl0aGVfZWx0LT5TZXRBdHRyaWJ1dGUodGhlX3N0cmluZywgInRydWUiKTsKK30KKwordm9pZCBBRW5jb2RlUHJvcGVydGllczo6U2F2ZVZhbHVlc1RvRWxlbWVudChUaVhtbEVsZW1lbnQgKiB0aGVfZWxlbWVudCkgY29uc3QKK3sKKwkvLyBnZXQgYWxsIHRoZSBwYXJhbWV0ZXJzIHNhdmVkIGluIHRoaXMgRWxlbWVudAorCVRpWG1sRWxlbWVudCAqIHRtcEVsdDsKKworCS8vIEJpdCBSZXNlcnZvaXIgcGFyYW1ldGVyCisvKgorCXRtcEVsdCA9IHRoZV9lbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgiQml0X3Jlc2Vydm9pciIpOworCWlmICh0bXBFbHQgPT0gTlVMTCkKKwl7CisJCXRtcEVsdCA9IG5ldyBUaVhtbEVsZW1lbnQoIkJpdF9yZXNlcnZvaXIiKTsKKwkJU2V0QXR0cmlidXRlQm9vbCh0bXBFbHQsICJ1c2UiLCAhYk5vQml0UmVzKTsKKwkJdGhlX2VsZW1lbnQtPkluc2VydEVuZENoaWxkKCp0bXBFbHQpOworCX0KKwllbHNlCisJeworCQlTZXRBdHRyaWJ1dGVCb29sKHRtcEVsdCwgInVzZSIsICFiTm9CaXRSZXMpOworCX0KKyovCisJLy8gQ29weXJpZ2h0IHBhcmFtZXRlcgorCXRtcEVsdCA9IHRoZV9lbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgiQ29weXJpZ2h0Iik7CisJaWYgKHRtcEVsdCA9PSBOVUxMKQorCXsKKwkJdG1wRWx0ID0gbmV3IFRpWG1sRWxlbWVudCgiQ29weXJpZ2h0Iik7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJDb3B5cmlnaHQpOworCQl0aGVfZWxlbWVudC0+SW5zZXJ0RW5kQ2hpbGQoKnRtcEVsdCk7CisJfQorCWVsc2UKKwl7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJDb3B5cmlnaHQpOworCX0KKworCS8vIFNtYXJ0IE91dHB1dCBwYXJhbWV0ZXIKKwl0bXBFbHQgPSB0aGVfZWxlbWVudC0+Rmlyc3RDaGlsZEVsZW1lbnQoIlNtYXJ0Iik7CisJaWYgKHRtcEVsdCA9PSBOVUxMKQorCXsKKwkJdG1wRWx0ID0gbmV3IFRpWG1sRWxlbWVudCgiU21hcnQiKTsKKwkJU2V0QXR0cmlidXRlQm9vbCggdG1wRWx0LCAidXNlIiwgYlNtYXJ0T3V0cHV0KTsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoInJhdGlvIiwgaW50KFNtYXJ0UmF0aW9NYXgpKTsKKwkJdGhlX2VsZW1lbnQtPkluc2VydEVuZENoaWxkKCp0bXBFbHQpOworCX0KKwllbHNlCisJeworCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJ1c2UiLCBiU21hcnRPdXRwdXQpOworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgicmF0aW8iLCBpbnQoU21hcnRSYXRpb01heCkpOworCX0KKworCS8vIFNtYXJ0IE91dHB1dCBwYXJhbWV0ZXIKKwl0bXBFbHQgPSB0aGVfZWxlbWVudC0+Rmlyc3RDaGlsZEVsZW1lbnQoIkFCUiIpOworCWlmICh0bXBFbHQgPT0gTlVMTCkKKwl7CisJCXRtcEVsdCA9IG5ldyBUaVhtbEVsZW1lbnQoIkFCUiIpOworCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJ1c2UiLCBiQWJyT3V0cHV0KTsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoIm1pbiIsIEF2ZXJhZ2VCaXRyYXRlX01pbik7CisJCXRtcEVsdC0+U2V0QXR0cmlidXRlKCJtYXgiLCBBdmVyYWdlQml0cmF0ZV9NYXgpOworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgic3RlcCIsIEF2ZXJhZ2VCaXRyYXRlX1N0ZXApOworCQl0aGVfZWxlbWVudC0+SW5zZXJ0RW5kQ2hpbGQoKnRtcEVsdCk7CisJfQorCWVsc2UKKwl7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJBYnJPdXRwdXQpOworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgibWluIiwgQXZlcmFnZUJpdHJhdGVfTWluKTsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoIm1heCIsIEF2ZXJhZ2VCaXRyYXRlX01heCk7CisJCXRtcEVsdC0+U2V0QXR0cmlidXRlKCJzdGVwIiwgQXZlcmFnZUJpdHJhdGVfU3RlcCk7CisJfQorCisJLy8gQ1JDIHBhcmFtZXRlcgorCXRtcEVsdCA9IHRoZV9lbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgiQ1JDIik7CisJaWYgKHRtcEVsdCA9PSBOVUxMKQorCXsKKwkJdG1wRWx0ID0gbmV3IFRpWG1sRWxlbWVudCgiQ1JDIik7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJDUkMpOworCQl0aGVfZWxlbWVudC0+SW5zZXJ0RW5kQ2hpbGQoKnRtcEVsdCk7CisJfQorCWVsc2UKKwl7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJDUkMpOworCX0KKworCS8vIE9yaWdpbmFsIHBhcmFtZXRlcgorCXRtcEVsdCA9IHRoZV9lbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgiT3JpZ2luYWwiKTsKKwlpZiAodG1wRWx0ID09IE5VTEwpCisJeworCQl0bXBFbHQgPSBuZXcgVGlYbWxFbGVtZW50KCJPcmlnaW5hbCIpOworCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJ1c2UiLCBiT3JpZ2luYWwpOworCQl0aGVfZWxlbWVudC0+SW5zZXJ0RW5kQ2hpbGQoKnRtcEVsdCk7CisJfQorCWVsc2UKKwl7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJPcmlnaW5hbCk7CisJfQorCisJLy8gUHJpdmF0ZSBwYXJhbWV0ZXIKKwl0bXBFbHQgPSB0aGVfZWxlbWVudC0+Rmlyc3RDaGlsZEVsZW1lbnQoIlByaXZhdGUiKTsKKwlpZiAodG1wRWx0ID09IE5VTEwpCisJeworCQl0bXBFbHQgPSBuZXcgVGlYbWxFbGVtZW50KCJQcml2YXRlIik7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJQcml2YXRlKTsKKwkJdGhlX2VsZW1lbnQtPkluc2VydEVuZENoaWxkKCp0bXBFbHQpOworCX0KKwllbHNlCisJeworCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJ1c2UiLCBiUHJpdmF0ZSk7CisJfQorCisJLy8gQ2hhbm5lbCBNb2RlIHBhcmFtZXRlcgorCXRtcEVsdCA9IHRoZV9lbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgiQ2hhbm5lbCIpOworCWlmICh0bXBFbHQgPT0gTlVMTCkKKwl7CisJCXRtcEVsdCA9IG5ldyBUaVhtbEVsZW1lbnQoIkNoYW5uZWwiKTsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoIm1vZGUiLCBHZXRDaGFubmVsTW9kZVN0cmluZyhuQ2hhbm5lbEluZGV4KSk7CisvLwkJU2V0QXR0cmlidXRlQm9vbCggdG1wRWx0LCAiZm9yY2UiLCBiRm9yY2VDaGFubmVsKTsKKwkJdGhlX2VsZW1lbnQtPkluc2VydEVuZENoaWxkKCp0bXBFbHQpOworCX0KKwllbHNlCisJeworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgibW9kZSIsIEdldENoYW5uZWxNb2RlU3RyaW5nKG5DaGFubmVsSW5kZXgpKTsKKy8vCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJmb3JjZSIsIGJGb3JjZUNoYW5uZWwpOworCX0KKy8qCisJLy8gUHJlc2V0IHBhcmFtZXRlcgorCXRtcEVsdCA9IHRoZV9lbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgiUHJlc2V0Iik7CisJaWYgKHRtcEVsdCA9PSBOVUxMKQorCXsKKwkJdG1wRWx0ID0gbmV3IFRpWG1sRWxlbWVudCgiUHJlc2V0Iik7CisJCXRtcEVsdC0+U2V0QXR0cmlidXRlKCJ0eXBlIiwgR2V0UHJlc2V0TW9kZVN0cmluZyhuUHJlc2V0SW5kZXgpKTsKKwkJdGhlX2VsZW1lbnQtPkluc2VydEVuZENoaWxkKCp0bXBFbHQpOworCX0KKwllbHNlCisJeworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgidHlwZSIsIEdldFByZXNldE1vZGVTdHJpbmcoblByZXNldEluZGV4KSk7CisJfQorCisJLy8gQml0cmF0ZSBwYXJhbWV0ZXIKKwl0bXBFbHQgPSB0aGVfZWxlbWVudC0+Rmlyc3RDaGlsZEVsZW1lbnQoImJpdHJhdGUiKTsKKwlpZiAodG1wRWx0ID09IE5VTEwpCisJeworCQl0bXBFbHQgPSBuZXcgVGlYbWxFbGVtZW50KCJiaXRyYXRlIik7CisJCXRtcEVsdC0+U2V0QXR0cmlidXRlKCJtaW4iLCB0aGVfQml0cmF0ZXNbbk1pbkJpdHJhdGVJbmRleF0pOworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgibWF4IiwgdGhlX0JpdHJhdGVzW25NYXhCaXRyYXRlSW5kZXhdKTsKKwkJdGhlX2VsZW1lbnQtPkluc2VydEVuZENoaWxkKCp0bXBFbHQpOworCX0KKwllbHNlCisJeworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgibWluIiwgdGhlX0JpdHJhdGVzW25NaW5CaXRyYXRlSW5kZXhdKTsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoIm1heCIsIHRoZV9CaXRyYXRlc1tuTWF4Qml0cmF0ZUluZGV4XSk7CisJfQorCisJLy8gT3V0cHV0IERpcmVjdG9yeSBwYXJhbWV0ZXIKKwl0bXBFbHQgPSB0aGVfZWxlbWVudC0+Rmlyc3RDaGlsZEVsZW1lbnQoIm91dHB1dCIpOworCWlmICh0bXBFbHQgPT0gTlVMTCkKKwl7CisJCXRtcEVsdCA9IG5ldyBUaVhtbEVsZW1lbnQoIm91dHB1dCIpOworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgicGF0aCIsIE91dHB1dERpcik7CisJCXRoZV9lbGVtZW50LT5JbnNlcnRFbmRDaGlsZCgqdG1wRWx0KTsKKwl9CisJZWxzZQorCXsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoInBhdGgiLCBPdXRwdXREaXIpOworCX0KKyovCisvKgorCS8vIFJlc2FtcGxpbmcgcGFyYW1ldGVyCisJdG1wRWx0ID0gdGhlX2VsZW1lbnQtPkZpcnN0Q2hpbGRFbGVtZW50KCJyZXNhbXBsaW5nIik7CisJaWYgKHRtcEVsdCA9PSBOVUxMKQorCXsKKwkJdG1wRWx0ID0gbmV3IFRpWG1sRWxlbWVudCgicmVzYW1wbGluZyIpOworCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJ1c2UiLCBiUmVzYW1wbGUpOworCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgiZnJlcSIsIHRoZV9TYW1wbGluZ0ZyZXFzW25TYW1wbGluZ0ZyZXFJbmRleF0pOworCQl0aGVfZWxlbWVudC0+SW5zZXJ0RW5kQ2hpbGQoKnRtcEVsdCk7CisJfQorCWVsc2UKKwl7CisJCVNldEF0dHJpYnV0ZUJvb2woIHRtcEVsdCwgInVzZSIsIGJSZXNhbXBsZSk7CisJCXRtcEVsdC0+U2V0QXR0cmlidXRlKCJmcmVxIiwgdGhlX1NhbXBsaW5nRnJlcXNbblNhbXBsaW5nRnJlcUluZGV4XSk7CisJfQorCisJLy8gVkJSIHBhcmFtZXRlcgorCXRtcEVsdCA9IHRoZV9lbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgiVkJSIik7CisJaWYgKHRtcEVsdCA9PSBOVUxMKQorCXsKKwkJdG1wRWx0ID0gbmV3IFRpWG1sRWxlbWVudCgiVkJSIik7CisJCQorCQlpZiAobUJSbW9kZSA9PSBCUl9BQlIpCisJCQl0bXBFbHQtPlNldEF0dHJpYnV0ZSgidXNlIiwgIkFCUiIpOworCQllbHNlCisJCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJ1c2UiLCAobUJSbW9kZSAhPSBCUl9DQlIpKTsKKworCQlTZXRBdHRyaWJ1dGVCb29sKCB0bXBFbHQsICJoZWFkZXIiLCBiWGluZ0ZyYW1lKTsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoInF1YWxpdHkiLCBWYnJRdWFsaXR5KTsKKwkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoImF2ZXJhZ2UiLCBBdmVyYWdlQml0cmF0ZSk7CisJCXRoZV9lbGVtZW50LT5JbnNlcnRFbmRDaGlsZCgqdG1wRWx0KTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG1CUm1vZGUgPT0gQlJfQUJSKQorCQkJdG1wRWx0LT5TZXRBdHRyaWJ1dGUoInVzZSIsICJBQlIiKTsKKwkJZWxzZQorCQkJU2V0QXR0cmlidXRlQm9vbCggdG1wRWx0LCAidXNlIiwgKG1CUm1vZGUgIT0gQlJfQ0JSKSk7CisKKwkJU2V0QXR0cmlidXRlQm9vbCggdG1wRWx0LCAiaGVhZGVyIiwgYlhpbmdGcmFtZSk7CisJCXRtcEVsdC0+U2V0QXR0cmlidXRlKCJxdWFsaXR5IiwgVmJyUXVhbGl0eSk7CisJCXRtcEVsdC0+U2V0QXR0cmlidXRlKCJhdmVyYWdlIiwgQXZlcmFnZUJpdHJhdGUpOworCX0KKyovCit9CisKK2Jvb2wgQUVuY29kZVByb3BlcnRpZXM6OkhhbmRsZURpYWxvZ0NvbW1hbmQoY29uc3QgSFdORCBwYXJlbnRXbmQsIGNvbnN0IFdQQVJBTSB3UGFyYW0sIGNvbnN0IExQQVJBTSBsUGFyYW0pCit7CisJVUlOVCBjb21tYW5kOworCWNvbW1hbmQgPSBHRVRfV01fQ09NTUFORF9JRCh3UGFyYW0sIGxQYXJhbSk7CisKKwlzd2l0Y2ggKGNvbW1hbmQpCisJeworCWNhc2UgSURPSyA6CisJeworCQlib29sIGJTaG91bGRFbmQgPSB0cnVlOworCisJCS8vIHNhdmUgcGFyYW1ldGVycworCQljaGFyIHN0cmluZ1tNQVhfUEFUSF07CisvLwkJOjpHZXRXaW5kb3dUZXh0KDo6R2V0RGxnSXRlbSggcGFyZW50V25kLCBJRENfQ09NQk9fU0VUVElOR1MpLCBzdHJpbmcsIE1BWF9QQVRIKTsKKworCQl3c3ByaW50ZihzdHJpbmcsIkN1cnJlbnQiKTsgLy8gb25seSB0aGUgQ3VycmVudCBjb25maWcgaXMgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQKKwkJCisJCW15X2RlYnVnLk91dFB1dCgibXlfaE1vZHVsZSA9IDB4JTA4WCIsbXlfaE1vZHVsZSk7CisvKgorCQlBRW5jb2RlUHJvcGVydGllcyB0bXBEbGdQcm9wcyhteV9oTW9kdWxlKTsKKwkJQUVuY29kZVByb3BlcnRpZXMgdG1wU2F2ZWRQcm9wcyhteV9oTW9kdWxlKTsKKy8vI2lmZGVmIE9MRAorCQl0bXBEbGdQcm9wcy5VcGRhdGVWYWx1ZUZyb21EbGcocGFyZW50V25kKTsKKwkJdG1wU2F2ZWRQcm9wcy5TZWxlY3RTYXZlZFBhcmFtcyhzdHJpbmcpOworCQl0bXBTYXZlZFByb3BzLlBhcmFtc1Jlc3RvcmUoKTsKKwkJLy8gY2hlY2sgaWYgdGhlIHZhbHVlcyBmcm9tIHRoZSBETEcgYXJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgc2F2ZWQgaW4gdGhlIGNvbmZpZyBmaWxlCisJCS8vIGlmIHllcywganVzdCBkbyBub3RoaW5nCisvKgorCQlpZiAodG1wRGxnUHJvcHMgIT0gdG1wU2F2ZWRQcm9wcykKKwkJeworCQkJaW50IHNhdmU7CisKKwkJCWlmIChzdHJjbXAoc3RyaW5nLCJDdXJyZW50IikgPT0gMCkKKwkJCXsKKwkJCQkvLyBvdGhlcndpc2UsIHByb21wdCB0aGUgdXNlciBpZiBoZSB3YW50cyB0byBvdmVyd3JpdGUgdGhlIHNldHRpbmdzCisJCQkJVENIQVIgdG1wU3RyWzI1MF07CisJCQkJOjpMb2FkU3RyaW5nKEFPdXQ6OkdldEluc3RhbmNlKCksSURTX1NUUklOR19QUk9NUFRfUkVQTEFDRV9DVVJSRU5ULHRtcFN0ciwyNTApOworCisJCQkJc2F2ZSA9IEFPdXQ6Ok15TWVzc2FnZUJveCggdG1wU3RyLCBNQl9PS0NBTkNFTHxNQl9JQ09OUVVFU1RJT04sIHBhcmVudFduZCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gb3RoZXJ3aXNlLCBwcm9tcHQgdGhlIHVzZXIgaWYgaGUgd2FudHMgdG8gb3ZlcndyaXRlIHRoZSBzZXR0aW5ncworCQkJCVRDSEFSIHRtcFN0clsyNTBdOworCQkJCTo6TG9hZFN0cmluZyhBT3V0OjpHZXRJbnN0YW5jZSgpLElEU19TVFJJTkdfUFJPTVBUX1JFUExBQ0VfU0VUSU5HLHRtcFN0ciwyNTApOworCQkJCVRDSEFSIHRtcERzcFs1MDBdOworCQkJCXdzcHJpbnRmKHRtcERzcCx0bXBTdHIsc3RyaW5nKTsKKworCQkJCXNhdmUgPSBBT3V0OjpNeU1lc3NhZ2VCb3goIHRtcERzcCwgTUJfWUVTTk9DQU5DRUx8TUJfSUNPTlFVRVNUSU9OLCBwYXJlbnRXbmQpOworCQkJfQorCisJCQlpZiAoc2F2ZSA9PSBJRENBTkNFTCkKKwkJCQliU2hvdWxkRW5kID0gZmFsc2U7CisJCQllbHNlIGlmIChzYXZlID09IElETk8pCisJCQl7CisJCQkJLy8gc2F2ZSB0aGUgdmFsdWVzIGluICdjdXJyZW50JworCQkJCVVwZGF0ZVZhbHVlRnJvbURsZyhwYXJlbnRXbmQpOworCQkJCVNhdmVWYWx1ZXNUb1N0cmluZ0tleSgiQ3VycmVudCIpOworCQkJCVNlbGVjdFNhdmVkUGFyYW1zKCJDdXJyZW50Iik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gZG8gc28gYW5kIHNhdmUgaW4gWE1MCisJCQkJVXBkYXRlVmFsdWVGcm9tRGxnKHBhcmVudFduZCk7CisJCQkJU2F2ZVZhbHVlc1RvU3RyaW5nS2V5KHN0cmluZyk7CisJCQl9CisJCX0KKyovCisvLyNlbmRpZiAvLyBPTEQKK215X2RlYnVnLk91dFB1dCgiYmVmb3JlIDogbkNoYW5uZWxJbmRleCAlZCwgYkNSQyAlZCwgYkNvcHlyaWdodCAlZCwgYk9yaWdpbmFsICVkLCBiUHJpdmF0ZSAlZCIsbkNoYW5uZWxJbmRleCwgYkNSQywgYkNvcHlyaWdodCwgYk9yaWdpbmFsLCBiUHJpdmF0ZSk7CisKK215X2RlYnVnLk91dFB1dCgiY2FsbCBVcGRhdGVWYWx1ZUZyb21EbGciKTsKKworCQlVcGRhdGVWYWx1ZUZyb21EbGcocGFyZW50V25kKTsKKworbXlfZGVidWcuT3V0UHV0KCJjYWxsIFNhdmVWYWx1ZXNUb1N0cmluZ0tleSIpOworCisJCVNhdmVWYWx1ZXNUb1N0cmluZ0tleSgiQ3VycmVudCIpOyAvLyBvbmx5IEN1cnJlbnQgY29uZmlnIGlzIHN1cHBvcnRlZCBub3cKKworLy8JCVNhdmVQYXJhbXMocGFyZW50V25kKTsKKworLy9teV9kZWJ1Zy5PdXRQdXQoImNhbGwgU2VsZWN0U2F2ZWRQYXJhbXMiKTsKKworLy8JCVNlbGVjdFNhdmVkUGFyYW1zKHN0cmluZyk7CisvLwkJVXBkYXRlRGxnRnJvbVZhbHVlKHBhcmVudFduZCk7CisKK215X2RlYnVnLk91dFB1dCgiZmluaXNoZWQgc2F2aW5nIik7CisKKwkJaWYgKGJTaG91bGRFbmQpCisJCXsKKwkJCVJlbW92ZVByb3AocGFyZW50V25kLCAiQUVuY29kZVByb3BlcnRpZXMtQ29uZmlnIik7CisJCQorCQkJRW5kRGlhbG9nKHBhcmVudFduZCwgdHJ1ZSk7CisJCX0KKwl9CisJYnJlYWs7CisKKwljYXNlIElEQ0FOQ0VMOgorCQlSZW1vdmVQcm9wKHBhcmVudFduZCwgIkFFbmNvZGVQcm9wZXJ0aWVzLUNvbmZpZyIpOworICAgICAgICBFbmREaWFsb2cocGFyZW50V25kLCBmYWxzZSk7CisJCWJyZWFrOworCisvKgljYXNlIElEQ19GSU5EX0RMTDoKKwl7CisJCU9QRU5GSUxFTkFNRSBmaWxlOworCQljaGFyIERsbExvY2F0aW9uWzUxMl07CisJCXdzcHJpbnRmKERsbExvY2F0aW9uLCIlcyIsR2V0RGxsTG9jYXRpb24oKSk7CisKKwkJbWVtc2V0KCZmaWxlLCAwLCBzaXplb2YoZmlsZSkpOworCQlmaWxlLmxTdHJ1Y3RTaXplID0gc2l6ZW9mKGZpbGUpOyAKKwkJZmlsZS5od25kT3duZXIgID0gcGFyZW50V25kOworCQlmaWxlLkZsYWdzID0gT0ZOX0ZJTEVNVVNURVhJU1QgfCBPRk5fTk9ERVJFRkVSRU5DRUxJTktTIHwgT0ZOX0VOQUJMRUhPT0sgfCBPRk5fRVhQTE9SRVIgOworLy8vCQkJCWZpbGUubHBzdHJGaWxlID0gQU91dDo6dGhlX0FPdXQtPkRsbExvY2F0aW9uOworCQlmaWxlLmxwc3RyRmlsZSA9IERsbExvY2F0aW9uOworCQlmaWxlLmxwc3RyRmlsdGVyID0gIkxhbWUgRExMIChsYW1lX2VuYy5kbGwpXDBMQU1FX0VOQy5ETExcMERMTCAoKi5kbGwpXDAqLkRMTFwwQWxsICgqLiopXDAqLipcMCI7CisJCWZpbGUubkZpbHRlckluZGV4ID0gMTsKKwkJZmlsZS5uTWF4RmlsZSAgPSBzaXplb2YoRGxsTG9jYXRpb24pOworCQlmaWxlLmxwZm5Ib29rICA9IERMTEZpbmRDYWxsYmFjazsgLy8gdXNlIHRvIHZhbGlkYXRlIHRoZSBETEwgY2hvc2VuCisKKwkJR2V0T3BlbkZpbGVOYW1lKCZmaWxlKTsKKworCQlTZXREbGxMb2NhdGlvbihEbGxMb2NhdGlvbik7CisJCS8vIHVzZSB0aGlzIGZpbGVuYW1lIGlmIG5lY2Vzc2FyeQorCX0KKwlicmVhazsKKyovCisvKgljYXNlIElEQ19CVVRUT05fT1VUUFVUOgorCXsKKyNpZm5kZWYgU0lNUExFX0ZPTERFUgorCQlCUk9XU0VJTkZPIGluZm87CisJCW1lbXNldCgmaW5mbywwLHNpemVvZihpbmZvKSk7CisKKwkJY2hhciBGb2xkZXJOYW1lW01BWF9QQVRIXTsKKworCQlpbmZvLmh3bmRPd25lciA9IHBhcmVudFduZDsKKwkJaW5mby5wc3pEaXNwbGF5TmFtZSAgPSBGb2xkZXJOYW1lOworCQlpbmZvLmxwZm4gPSBCcm93c2VGb2xkZXJDYWxsYmFja3JvYzsKKwkJaW5mby5sUGFyYW0gPSAoTFBBUkFNKSB0aGlzOworCisJCS8vIGdldCB0aGUgbG9jYWxpc2VkIHdpbmRvdyB0aXRsZQorCQlUQ0hBUiBvdXRwdXRbMjUwXTsKKwkJOjpMb2FkU3RyaW5nKEFPdXQ6OkdldEluc3RhbmNlKCksSURTX1NUUklOR19ESVJfU0VMRUNULG91dHB1dCwyNTApOworCQlpbmZvLmxwc3pUaXRsZSA9IG91dHB1dDsKKworI2lmZGVmIEJJRl9FRElUQk9YCisJCWluZm8udWxGbGFncyB8PSBCSUZfRURJVEJPWDsKKyNlbHNlIC8vIEJJRl9FRElUQk9YCisJCWluZm8udWxGbGFncyB8PSAweDAwMTA7CisjZW5kaWYgLy8gQklGX0VESVRCT1gKKworI2lmZGVmIEJJRl9WQUxJREFURQorCQlpbmZvLnVsRmxhZ3MgfD0gQklGX1ZBTElEQVRFOworI2Vsc2UgLy8gQklGX1ZBTElEQVRFCisJCWluZm8udWxGbGFncyB8PSAweDAwMjA7CisjZW5kaWYgLy8gQklGX1ZBTElEQVRFCisKKyNpZmRlZiBCSUZfTkVXRElBTE9HU1RZTEUKKwkJaW5mby51bEZsYWdzIHw9IEJJRl9ORVdESUFMT0dTVFlMRTsKKyNlbHNlIC8vIEJJRl9ORVdESUFMT0dTVFlMRQorCQlpbmZvLnVsRmxhZ3MgfD0gMHgwMDQwOworI2VuZGlmIC8vIEJJRl9ORVdESUFMT0dTVFlMRQorCisJCUlURU1JRExJU1QgKml0ZW0gPSBTSEJyb3dzZUZvckZvbGRlcigmaW5mbyk7CisKKyAgICAJaWYgKGl0ZW0gIT0gTlVMTCkKKwkJeworCQkJY2hhciB0bXBPdXRwdXREaXJbTUFYX1BBVEhdOworCQkJd3NwcmludGYodG1wT3V0cHV0RGlyLCIlcyIsR2V0T3V0cHV0RGlyZWN0b3J5KCkpOworCisJCQlTSEdldFBhdGhGcm9tSURMaXN0KCBpdGVtLHRtcE91dHB1dERpciApOworCQkJU2V0T3V0cHV0RGlyZWN0b3J5KCB0bXBPdXRwdXREaXIgKTsKKwkJCTo6U2V0V2luZG93VGV4dChHZXREbGdJdGVtKCBwYXJlbnRXbmQsIElEQ19FRElUX09VVFBVVERJUiksIHRtcE91dHB1dERpcik7CisvLwkJCQkJd3NwcmludGYoT3V0cHV0RGlyLEZvbGRlck5hbWUpOworCQl9CisjZWxzZSAvLyBTSU1QTEVfRk9MREVSCisJCU9QRU5GSUxFTkFNRSBmaWxlOworCisJCW1lbXNldCgmZmlsZSwgMCwgc2l6ZW9mKGZpbGUpKTsKKwkJZmlsZS5sU3RydWN0U2l6ZSA9IHNpemVvZihmaWxlKTsgCisJCWZpbGUuaHduZE93bmVyICA9IHBhcmVudFduZDsKKwkJZmlsZS5GbGFncyA9IE9GTl9GSUxFTVVTVEVYSVNUIHwgT0ZOX05PREVSRUZFUkVOQ0VMSU5LUyB8IE9GTl9FTkFCTEVIT09LIHwgT0ZOX0VYUExPUkVSIDsKKy8vCQkJCWZpbGUubHBzdHJGaWxlID0gR2V0RGxsTG9jYXRpb24oKTsKKy8vCQkJCWZpbGUubHBzdHJGaWxlID0gR2V0T3V0cHV0RGlyZWN0b3J5KCk7CisJCWZpbGUubHBzdHJJbml0aWFsRGlyID0gR2V0T3V0cHV0RGlyZWN0b3J5KCk7CisJCWZpbGUubHBzdHJGaWx0ZXIgPSAiQSBEaXJlY3RvcnlcMC4qXDAiOworLy8JCQkJZmlsZS5uRmlsdGVySW5kZXggPSAxOworCQlmaWxlLm5NYXhGaWxlICA9IE1BWF9QQVRIOworLy8JCQkJZmlsZS5scGZuSG9vayAgPSBETExGaW5kQ2FsbGJhY2s7IC8vIHVzZSB0byB2YWxpZGF0ZSB0aGUgRExMIGNob3NlbgorLy8JCQkJZmlsZS5GbGFncyA9IE9GTl9FTkFCTEVTSVpJTkcgfCBPRk5fTk9SRUFET05MWVJFVFVSTiB8IE9GTl9ISURFUkVBRE9OTFk7CisJCWZpbGUuRmxhZ3MgPSBPRk5fTk9SRUFET05MWVJFVFVSTiB8IE9GTl9ISURFUkVBRE9OTFkgfCBPRk5fRVhQTE9SRVI7CisKKwkJVENIQVIgb3V0cHV0WzI1MF07CisJCTo6TG9hZFN0cmluZyhBT3V0OjpHZXRJbnN0YW5jZSgpLElEU19TVFJJTkdfRElSX1NFTEVDVCxvdXRwdXQsMjUwKTsKKwkJZmlsZS5scHN0clRpdGxlID0gb3V0cHV0OworCisJCUdldFNhdmVGaWxlTmFtZSgmZmlsZSk7CisjZW5kaWYgLy8gU0lNUExFX0ZPTERFUgorCX0KKwlicmVhazsKKyovCisJCWNhc2UgSURDX0NIRUNLX0VOQ19BQlI6CisJCQlFbmFibGVBYnJPcHRpb25zKHBhcmVudFduZCwgOjpJc0RsZ0J1dHRvbkNoZWNrZWQoIHBhcmVudFduZCwgSURDX0NIRUNLX0VOQ19BQlIpID09IEJTVF9DSEVDS0VEKTsKKwkJCWJyZWFrOworLyoJY2FzZSBJRENfUkFESU9fQklUUkFURV9DQlI6CisJCUFFbmNvZGVQcm9wZXJ0aWVzOjpEaXNwbGF5VmJyT3B0aW9ucyhwYXJlbnRXbmQsIEFFbmNvZGVQcm9wZXJ0aWVzOjpCUl9DQlIpOworCQlicmVhazsKKworCWNhc2UgSURDX1JBRElPX0JJVFJBVEVfVkJSOgorCQlBRW5jb2RlUHJvcGVydGllczo6RGlzcGxheVZick9wdGlvbnMocGFyZW50V25kLCBBRW5jb2RlUHJvcGVydGllczo6QlJfVkJSKTsKKwkJYnJlYWs7CisKKwljYXNlIElEQ19SQURJT19CSVRSQVRFX0FCUjoKKwkJQUVuY29kZVByb3BlcnRpZXM6OkRpc3BsYXlWYnJPcHRpb25zKHBhcmVudFduZCwgQUVuY29kZVByb3BlcnRpZXM6OkJSX0FCUik7CisJCWJyZWFrOworCisJY2FzZSBJRENfQ0hFQ0tfUkVTQU1QTEU6CisJeworCQlib29sIHRtcF9iUmVzYW1wbGVVc2VkID0gKDo6SXNEbGdCdXR0b25DaGVja2VkKCBwYXJlbnRXbmQsIElEQ19DSEVDS19SRVNBTVBMRSkgPT0gQlNUX0NIRUNLRUQpOworCQlpZiAodG1wX2JSZXNhbXBsZVVzZWQpCisJCXsKKwkJCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbShwYXJlbnRXbmQsSURDX0NPTUJPX1NBTVBMRUZSRVEpLCBUUlVFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbShwYXJlbnRXbmQsSURDX0NPTUJPX1NBTVBMRUZSRVEpLCBGQUxTRSk7CisJCX0KKwl9CisJYnJlYWs7CisqLworLyoJY2FzZSBJRENfQ09NQk9fU0VUVElOR1M6CisvLwkJCQlpZiAoQ0JOX1NFTENIQU5HRSA9PSBHRVRfV01fQ09NTUFORF9DTUQod1BhcmFtLCBsUGFyYW0pKQorCQlpZiAoQ0JOX1NFTEVORE9LID09IEdFVF9XTV9DT01NQU5EX0NNRCh3UGFyYW0sIGxQYXJhbSkpCisJCXsKKwkJCWNoYXIgc3RyaW5nW01BWF9QQVRIXTsKKwkJCWludCBuSWR4ID0gU2VuZE1lc3NhZ2UoSFdORChsUGFyYW0pLCBDQl9HRVRDVVJTRUwsIE5VTEwsIE5VTEwpOworCQkJU2VuZE1lc3NhZ2UoSFdORChsUGFyYW0pLCBDQl9HRVRMQlRFWFQgLCBuSWR4LCAoTFBBUkFNKSBzdHJpbmcpOworCisJCQkvLyBnZXQgdGhlIGluZm8gY29ycmVzcG9uZGluZyB0byB0aGUgbmV3IHNlbGVjdGVkIGl0ZW0KKwkJCVNlbGVjdFNhdmVkUGFyYW1zKHN0cmluZyk7CisJCQlVcGRhdGVEbGdGcm9tVmFsdWUocGFyZW50V25kKTsKKwkJfQorCQlicmVhazsKKyovCisvKgljYXNlIElEQ19CVVRUT05fQ09ORklHX1NBVkU6CisJeworCQkvLyBzYXZlIHRoZSBkYXRhIGluIHRoZSBjdXJyZW50IGNvbmZpZworCQljaGFyIHN0cmluZ1tNQVhfUEFUSF07CisJCTo6R2V0V2luZG93VGV4dCg6OkdldERsZ0l0ZW0oIHBhcmVudFduZCwgSURDX0NPTUJPX1NFVFRJTkdTKSwgc3RyaW5nLCBNQVhfUEFUSCk7CisKKwkJVXBkYXRlVmFsdWVGcm9tRGxnKHBhcmVudFduZCk7CisJCVNhdmVWYWx1ZXNUb1N0cmluZ0tleShzdHJpbmcpOworCQlTZWxlY3RTYXZlZFBhcmFtcyhzdHJpbmcpOworCQlVcGRhdGVDb25maWdzKHBhcmVudFduZCk7CisJCVVwZGF0ZURsZ0Zyb21WYWx1ZShwYXJlbnRXbmQpOworCX0KKwlicmVhazsKKworCWNhc2UgSURDX0JVVFRPTl9DT05GSUdfUkVOQU1FOgorCXsKKwkJY2hhciBzdHJpbmdbTUFYX1BBVEhdOworCQk6OkdldFdpbmRvd1RleHQoOjpHZXREbGdJdGVtKCBwYXJlbnRXbmQsIElEQ19DT01CT19TRVRUSU5HUyksIHN0cmluZywgTUFYX1BBVEgpOworCisJCWlmIChSZW5hbWVDdXJyZW50VG8oc3RyaW5nKSkKKwkJeworCQkJLy8gVXBkYXRlIHRoZSBuYW1lcyBkaXNwbGF5ZWQKKwkJCVVwZGF0ZUNvbmZpZ3MocGFyZW50V25kKTsKKwkJfQorCisJfQorCWJyZWFrOworCisJY2FzZSBJRENfQlVUVE9OX0NPTkZJR19ERUxFVEU6CisJeworCQljaGFyIHN0cmluZ1tNQVhfUEFUSF07CisJCTo6R2V0V2luZG93VGV4dCg6OkdldERsZ0l0ZW0oIHBhcmVudFduZCwgSURDX0NPTUJPX1NFVFRJTkdTKSwgc3RyaW5nLCBNQVhfUEFUSCk7CisJCQorCQlpZiAoRGVsZXRlQ29uZmlnKHN0cmluZykpCisJCXsKKwkJCS8vIFVwZGF0ZSB0aGUgbmFtZXMgZGlzcGxheWVkCisJCQlVcGRhdGVDb25maWdzKHBhcmVudFduZCk7CisJCQlVcGRhdGVEbGdGcm9tVmFsdWUocGFyZW50V25kKTsKKwkJfQorCX0KKwlicmVhazsKKyovCisJfQorCQorICAgIHJldHVybiBGQUxTRTsKK30KKworYm9vbCBBRW5jb2RlUHJvcGVydGllczo6UmVuYW1lQ3VycmVudFRvKGNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3X2NvbmZpZ19uYW1lKQoreworCWJvb2wgYlJlc3VsdCA9IGZhbHNlOworCisJLy8gZGlzcGxheSBhbGwgdGhlIG5hbWVzIG9mIHRoZSBzYXZlZCBjb25maWdzCisJLy8gZ2V0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgc2F2ZWQgZmlsZSBpZiBwb3NzaWJsZQorCWlmIChteV9zdG9yZWRfZGF0YS5Mb2FkRmlsZShteV9zdG9yZV9sb2NhdGlvbikpCisJeworCQlUaVhtbE5vZGUqIG5vZGU7CisKKwkJbm9kZSA9IG15X3N0b3JlZF9kYXRhLkZpcnN0Q2hpbGQoImxhbWVfYWNtIik7CisKKwkJVGlYbWxFbGVtZW50KiBDdXJyZW50Tm9kZSA9IG5vZGUtPkZpcnN0Q2hpbGRFbGVtZW50KCJlbmNvZGluZ3MiKTsKKworCQlpZiAoQ3VycmVudE5vZGUtPkF0dHJpYnV0ZSgiZGVmYXVsdCIpICE9IE5VTEwpCisJCXsKKwkJCXN0ZDo6c3RyaW5nIEN1cnJlbnRDb25maWdOYW1lID0gKkN1cnJlbnROb2RlLT5BdHRyaWJ1dGUoImRlZmF1bHQiKTsKKworCQkJLy8gbm8gcmVuYW1lIHBvc3NpYmxlIGZvciBDdXJyZW50CisJCQlpZiAoQ3VycmVudENvbmZpZ05hbWUgPT0gIiIpCisJCQl7CisJCQkJYlJlc3VsdCA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmIChDdXJyZW50Q29uZmlnTmFtZSAhPSAiQ3VycmVudCIpCisJCQl7CisJCQkJLy8gZmluZCB0aGUgY29uZmlnIHRoYXQgY29ycmVzcG9uZCB0byBDdXJyZW50Q29uZmlnCisJCQkJVGlYbWxFbGVtZW50KiBpdGVyYXRlRWxtdCA9IEN1cnJlbnROb2RlLT5GaXJzdENoaWxkRWxlbWVudCgiY29uZmlnIik7CisvLwkJCQlpbnQgSWR4ID0gMDsKKwkJCQl3aGlsZSAoaXRlcmF0ZUVsbXQgIT0gTlVMTCkKKwkJCQl7CisJCQkJCWNvbnN0IHN0ZDo6c3RyaW5nICogdG1wbmFtZSA9IGl0ZXJhdGVFbG10LT5BdHRyaWJ1dGUoIm5hbWUiKTsKKwkJCQkJLyoqCisJCQkJCQlcdG9kbyBzdXBwb3J0IGxhbmd1YWdlIG5hbWVzCisJCQkJCSovCisJCQkJCWlmICh0bXBuYW1lICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCWlmICh0bXBuYW1lLT5jb21wYXJlKEN1cnJlbnRDb25maWdOYW1lKSA9PSAwKQorCQkJCQkJeworCQkJCQkJCWl0ZXJhdGVFbG10LT5TZXRBdHRyaWJ1dGUoIm5hbWUiLG5ld19jb25maWdfbmFtZSk7CQorCQkJCQkJCWJSZXN1bHQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisvLwkJCQkJSWR4Kys7CisJCQkJCWl0ZXJhdGVFbG10ID0gaXRlcmF0ZUVsbXQtPk5leHRTaWJsaW5nRWxlbWVudCgiY29uZmlnIik7CisJCQkJfQorCQkJfQorCisJCQlpZiAoYlJlc3VsdCkKKwkJCXsKKwkJCQlDdXJyZW50Tm9kZS0+U2V0QXR0cmlidXRlKCJkZWZhdWx0IixuZXdfY29uZmlnX25hbWUpOworCisJCQkJbXlfc3RvcmVkX2RhdGEuU2F2ZUZpbGUobXlfc3RvcmVfbG9jYXRpb24pOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKK2Jvb2wgQUVuY29kZVByb3BlcnRpZXM6OkRlbGV0ZUNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyAmIGNvbmZpZ19uYW1lKQoreworCWJvb2wgYlJlc3VsdCA9IGZhbHNlOworCisJaWYgKGNvbmZpZ19uYW1lICE9ICJDdXJyZW50IikKKwl7CisJCS8vIGRpc3BsYXkgYWxsIHRoZSBuYW1lcyBvZiB0aGUgc2F2ZWQgY29uZmlncworCQkvLyBnZXQgdGhlIHZhbHVlcyBmcm9tIHRoZSBzYXZlZCBmaWxlIGlmIHBvc3NpYmxlCisJCWlmIChteV9zdG9yZWRfZGF0YS5Mb2FkRmlsZShteV9zdG9yZV9sb2NhdGlvbikpCisJCXsKKwkJCVRpWG1sTm9kZSogbm9kZTsKKworCQkJbm9kZSA9IG15X3N0b3JlZF9kYXRhLkZpcnN0Q2hpbGQoImxhbWVfYWNtIik7CisKKwkJCVRpWG1sRWxlbWVudCogQ3VycmVudE5vZGUgPSBub2RlLT5GaXJzdENoaWxkRWxlbWVudCgiZW5jb2RpbmdzIik7CisKKwkJCVRpWG1sRWxlbWVudCogaXRlcmF0ZUVsbXQgPSBDdXJyZW50Tm9kZS0+Rmlyc3RDaGlsZEVsZW1lbnQoImNvbmZpZyIpOworLy8JCQlpbnQgSWR4ID0gMDsKKwkJCXdoaWxlIChpdGVyYXRlRWxtdCAhPSBOVUxMKQorCQkJeworCQkJCWNvbnN0IHN0ZDo6c3RyaW5nICogdG1wbmFtZSA9IGl0ZXJhdGVFbG10LT5BdHRyaWJ1dGUoIm5hbWUiKTsKKwkJCQkvKioKKwkJCQkJXHRvZG8gc3VwcG9ydCBsYW5ndWFnZSBuYW1lcworCQkJCSovCisJCQkJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwkJCQl7CisJCQkJCWlmICh0bXBuYW1lLT5jb21wYXJlKGNvbmZpZ19uYW1lKSA9PSAwKQorCQkJCQl7CisJCQkJCQlDdXJyZW50Tm9kZS0+UmVtb3ZlQ2hpbGQoaXRlcmF0ZUVsbXQpOworCQkJCQkJYlJlc3VsdCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKy8vCQkJCUlkeCsrOworCQkJCWl0ZXJhdGVFbG10ID0gaXRlcmF0ZUVsbXQtPk5leHRTaWJsaW5nRWxlbWVudCgiY29uZmlnIik7CisJCQl9CisJCX0KKworCQlpZiAoYlJlc3VsdCkKKwkJeworCQkJbXlfc3RvcmVkX2RhdGEuU2F2ZUZpbGUobXlfc3RvcmVfbG9jYXRpb24pOworCisJCQkvLyBzZWxlY3QgYSBuZXcgZGVmYXVsdCBjb25maWcgOiAiQ3VycmVudCIKKwkJCVNlbGVjdFNhdmVkUGFyYW1zKCJDdXJyZW50Iik7CisKKwkJfQorCX0KKworCXJldHVybiBiUmVzdWx0OworfQorCit2b2lkIEFFbmNvZGVQcm9wZXJ0aWVzOjpVcGRhdGVDb25maWdzKGNvbnN0IEhXTkQgSHduZERsZykKK3sKKwkvLyBBZGQgVXNlciBjb25maWdzCisvLwlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fU0VUVElOR1MpLCBDQl9SRVNFVENPTlRFTlQgLCBOVUxMLCBOVUxMKTsKKworCS8vIGRpc3BsYXkgYWxsIHRoZSBuYW1lcyBvZiB0aGUgc2F2ZWQgY29uZmlncworCS8vIGdldCB0aGUgdmFsdWVzIGZyb20gdGhlIHNhdmVkIGZpbGUgaWYgcG9zc2libGUKKwlpZiAobXlfc3RvcmVkX2RhdGEuTG9hZEZpbGUobXlfc3RvcmVfbG9jYXRpb24pKQorCXsKKwkJVGlYbWxOb2RlKiBub2RlOworCisJCW5vZGUgPSBteV9zdG9yZWRfZGF0YS5GaXJzdENoaWxkKCJsYW1lX2FjbSIpOworCisJCVRpWG1sRWxlbWVudCogQ3VycmVudE5vZGUgPSBub2RlLT5GaXJzdENoaWxkRWxlbWVudCgiZW5jb2RpbmdzIik7CisKKwkJc3RkOjpzdHJpbmcgQ3VycmVudENvbmZpZyA9ICIiOworCisJCWlmIChDdXJyZW50Tm9kZS0+QXR0cmlidXRlKCJkZWZhdWx0IikgIT0gTlVMTCkKKwkJeworCQkJQ3VycmVudENvbmZpZyA9ICpDdXJyZW50Tm9kZS0+QXR0cmlidXRlKCJkZWZhdWx0Iik7CisJCX0KKworCQlUaVhtbEVsZW1lbnQqIGl0ZXJhdGVFbG10OworCitteV9kZWJ1Zy5PdXRQdXQoImFyZSB3ZSBoZXJlID8iKTsKKworCQkvLyBmaW5kIHRoZSBjb25maWcgdGhhdCBjb3JyZXNwb25kIHRvIEN1cnJlbnRDb25maWcKKwkJaXRlcmF0ZUVsbXQgPSBDdXJyZW50Tm9kZS0+Rmlyc3RDaGlsZEVsZW1lbnQoImNvbmZpZyIpOworCQlpbnQgSWR4ID0gMDsKKwkJd2hpbGUgKGl0ZXJhdGVFbG10ICE9IE5VTEwpCisJCXsKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICogdG1wbmFtZSA9IGl0ZXJhdGVFbG10LT5BdHRyaWJ1dGUoIm5hbWUiKTsKKwkJCS8qKgorCQkJCVx0b2RvIHN1cHBvcnQgbGFuZ3VhZ2UgbmFtZXMKKwkJCSovCisJCQlpZiAodG1wbmFtZSAhPSBOVUxMKQorCQkJeworLy8JCQkJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggSHduZERsZywgSURDX0NPTUJPX1NFVFRJTkdTKSwgQ0JfQUREU1RSSU5HLCBOVUxMLCAoTFBBUkFNKSB0bXBuYW1lLT5jX3N0cigpKTsKKwkJCQlpZiAodG1wbmFtZS0+Y29tcGFyZShDdXJyZW50Q29uZmlnKSA9PSAwKQorCQkJCXsKKy8vCQkJCQlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBId25kRGxnLCBJRENfQ09NQk9fU0VUVElOR1MpLCBDQl9TRVRDVVJTRUwsIElkeCwgTlVMTCk7CisJCQkJCVNlbGVjdFNhdmVkUGFyYW1zKCp0bXBuYW1lKTsKKwkJCQkJVXBkYXRlRGxnRnJvbVZhbHVlKEh3bmREbGcpOworCQkJCX0KKwkJCX0KK215X2RlYnVnLk91dFB1dCgiSWR4ID0gJWQiLElkeCk7CisKKwkJCUlkeCsrOworCQkJLy8gb25seSBDdXJyZW50IGNvbmZpZyBzdXBwb3J0ZWQgbm93CisvLwkJCWl0ZXJhdGVFbG10ID0gaXRlcmF0ZUVsbXQtPk5leHRTaWJsaW5nRWxlbWVudCgiY29uZmlnIik7CisJCQlpdGVyYXRlRWxtdCA9IE5VTEw7CitteV9kZWJ1Zy5PdXRQdXQoIml0ZXJhdGVFbG10ID0gMHglMDhYIixpdGVyYXRlRWxtdCk7CisKKwkJfQorCX0KK30KKy8qCit2b2lkIEFFbmNvZGVQcm9wZXJ0aWVzOjpVcGRhdGVBYnJTdGVwcyh1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4LCB1bnNpZ25lZCBpbnQgc3RlcCkgY29uc3QKK3sKK30KKyovCit2b2lkIEFFbmNvZGVQcm9wZXJ0aWVzOjpVcGRhdGVEbGdGcm9tU2xpZGVzKEhXTkQgaHduZERsZykgY29uc3QKK3sKKwlVSU5UIHZhbHVlX21pbiwgdmFsdWVfbWF4LCB2YWx1ZV9zdGVwLCB2YWx1ZTsKKwljaGFyIHRtcFs0XTsKKworCXZhbHVlX21pbiA9IFNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIGh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9NSU4pLCBUQk1fR0VUUE9TLCBOVUxMLCBOVUxMKTsKKwl2YWx1ZV9tYXggPSBTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU0xJREVSX0FWRVJBR0VfTUFYKSwgVEJNX0dFVFBPUywgTlVMTCwgTlVMTCk7CisKKwlpZiAodmFsdWVfbWluPnZhbHVlX21heCkKKwl7CisJCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIGh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9NSU4pLCBUQk1fU0VUUE9TLCBUUlVFLCB2YWx1ZV9tYXgpOworCQlVcGRhdGVEbGdGcm9tU2xpZGVzKGh3bmREbGcpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZhbHVlX21heDx2YWx1ZV9taW4pCisJeworCQlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU0xJREVSX0FWRVJBR0VfTUFYKSwgVEJNX1NFVFBPUywgVFJVRSwgdmFsdWVfbWluKTsKKwkJVXBkYXRlRGxnRnJvbVNsaWRlcyhod25kRGxnKTsKKwkJcmV0dXJuOworCX0KKworCXdzcHJpbnRmKHRtcCwiJTNkIix2YWx1ZV9taW4pOworCTo6U2V0V2luZG93VGV4dChHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU1RBVElDX0FWRVJBR0VfTUlOX1ZBTFVFKSwgdG1wKTsKKwkKKwlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU0xJREVSX0FWRVJBR0VfU0FNUExFKSwgVEJNX1NFVFJBTkdFTUlOLCBUUlVFLCB2YWx1ZV9taW4pOworCisJd3NwcmludGYodG1wLCIlM2QiLHZhbHVlX21heCk7CisJOjpTZXRXaW5kb3dUZXh0KEdldERsZ0l0ZW0oIGh3bmREbGcsIElEQ19TVEFUSUNfQVZFUkFHRV9NQVhfVkFMVUUpLCB0bXApOworCQorCVNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIGh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9TQU1QTEUpLCBUQk1fU0VUUkFOR0VNQVgsIFRSVUUsIHZhbHVlX21heCk7CisJCisJdmFsdWVfc3RlcCA9IFNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIGh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9TVEVQKSwgVEJNX0dFVFBPUywgTlVMTCwgTlVMTCk7CisJd3NwcmludGYodG1wLCIlM2QiLHZhbHVlX3N0ZXApOworCTo6U2V0V2luZG93VGV4dChHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU1RBVElDX0FWRVJBR0VfU1RFUF9WQUxVRSksIHRtcCk7CisKKwlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU0xJREVSX0FWRVJBR0VfU0FNUExFKSwgVEJNX0NMRUFSVElDUywgVFJVRSwgMCk7CisJZm9yKFVJTlQgaT12YWx1ZV9tYXg7IGk+PXZhbHVlX21pbjtpLT12YWx1ZV9zdGVwKQorCXsKKwkJU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbSggaHduZERsZywgSURDX1NMSURFUl9BVkVSQUdFX1NBTVBMRSksIFRCTV9TRVRUSUMsIDAsIGkpOworCX0KKwlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU0xJREVSX0FWRVJBR0VfU0FNUExFKSwgVEJNX1NFVExJTkVTSVpFLCAwLCB2YWx1ZV9zdGVwKTsKKwlTZW5kTWVzc2FnZShHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU0xJREVSX0FWRVJBR0VfU0FNUExFKSwgVEJNX1NFVFBBR0VTSVpFLCAwLCB2YWx1ZV9zdGVwKTsKKwkKKwl2YWx1ZSA9IFNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oIGh3bmREbGcsIElEQ19TTElERVJfQVZFUkFHRV9TQU1QTEUpLCBUQk1fR0VUUE9TLCBOVUxMLCBOVUxMKTsKKwl3c3ByaW50Zih0bXAsIiUzZCIsdmFsdWUpOworCTo6U2V0V2luZG93VGV4dChHZXREbGdJdGVtKCBod25kRGxnLCBJRENfU1RBVElDX0FWRVJBR0VfU0FNUExFX1ZBTFVFKSwgdG1wKTsKK30KKwordm9pZCBBRW5jb2RlUHJvcGVydGllczo6RW5hYmxlQWJyT3B0aW9ucyhIV05EIGhEaWFsb2csIGJvb2wgZW5hYmxlKQoreworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX1NMSURFUl9BVkVSQUdFX01JTiksIGVuYWJsZSk7CisJOjpFbmFibGVXaW5kb3coOjpHZXREbGdJdGVtKCBoRGlhbG9nLCBJRENfU0xJREVSX0FWRVJBR0VfTUFYKSwgZW5hYmxlKTsKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TTElERVJfQVZFUkFHRV9TVEVQKSwgZW5hYmxlKTsKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TTElERVJfQVZFUkFHRV9TQU1QTEUpLCBlbmFibGUpOworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX1NUQVRJQ19BVkVSQUdFX01JTiksIGVuYWJsZSk7CisJOjpFbmFibGVXaW5kb3coOjpHZXREbGdJdGVtKCBoRGlhbG9nLCBJRENfU1RBVElDX0FWRVJBR0VfTUFYKSwgZW5hYmxlKTsKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TVEFUSUNfQVZFUkFHRV9TVEVQKSwgZW5hYmxlKTsKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TVEFUSUNfQVZFUkFHRV9TQU1QTEUpLCBlbmFibGUpOworCTo6RW5hYmxlV2luZG93KDo6R2V0RGxnSXRlbSggaERpYWxvZywgSURDX1NUQVRJQ19BVkVSQUdFX01JTl9WQUxVRSksIGVuYWJsZSk7CisJOjpFbmFibGVXaW5kb3coOjpHZXREbGdJdGVtKCBoRGlhbG9nLCBJRENfU1RBVElDX0FWRVJBR0VfTUFYX1ZBTFVFKSwgZW5hYmxlKTsKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TVEFUSUNfQVZFUkFHRV9TVEVQX1ZBTFVFKSwgZW5hYmxlKTsKKwk6OkVuYWJsZVdpbmRvdyg6OkdldERsZ0l0ZW0oIGhEaWFsb2csIElEQ19TVEFUSUNfQVZFUkFHRV9TQU1QTEVfVkFMVUUpLCBlbmFibGUpOworfQorCmRpZmYgLS1naXQgYS9BQ00vQUVuY29kZVByb3BlcnRpZXMuaCBiL0FDTS9BRW5jb2RlUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmUxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vQUVuY29kZVByb3BlcnRpZXMuaApAQCAtMCwwICsxLDQ0OCBAQAorLyoqCisgKgorICogTGFtZSBBQ00gd3JhcHBlciwgZW5jb2RlL2RlY29kZSBNUDMgYmFzZWQgUklGRi9BVkkgZmlsZXMgaW4gTVMgV2luZG93cworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgU3RldmUgTGhvbW1lIDxzdGV2ZS5saG9tbWUgYXQgZnJlZS5mcj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKyAKKy8qIQorCVxhdXRob3IgU3RldmUgTGhvbW1lCisJXHZlcnNpb24gXCRJZDogQUVuY29kZVByb3BlcnRpZXMuaCx2IDEuNSAyMDAyLzA0LzA3IDEzOjMxOjM1IHJvYnV4NCBFeHAgJAorKi8KKworI2lmICFkZWZpbmVkKF9BRU5DT0RFUFJPUEVSVElFU19IX19JTkNMVURFRF8pCisjZGVmaW5lIF9BRU5DT0RFUFJPUEVSVElFU19IX19JTkNMVURFRF8KKworI2lmIF9NU0NfVkVSID4gMTAwMAorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIgPiAxMDAwCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQURiZy9BRGJnLmgiCisvLyNpbmNsdWRlICJCbGFkZU1QM0VuY0RMTC5oIgorI2luY2x1ZGUgInRpbnl4bWwvdGlueXhtbC5oIgorLy8jaW5jbHVkZSAiQVBhcmFtZXRlcnMvQVBhcmFtZXRlcnMuaCIKKwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgeworCVVJTlQgaWQ7CisJY29uc3QgY2hhciAqdGlwOworfSBUb29sVGlwSXRlbTsKKy8qKgorICBcY2xhc3MgQUVuY29kZVByb3BlcnRpZXMKKyAgXGJyaWVmIHRoZSBBRW5jb2RlUHJvcGVydGllcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgYWxsIHRoZSBlbmNvZGluZyBwcm9wZXJ0aWVzCisqLworY2xhc3MgQUVuY29kZVByb3BlcnRpZXMgIAoreworcHVibGljOgorCS8qKgorCQlcYnJpZWYgZGVmYXVsdCBjb25zdHJ1Y3RvcgorCisJCVxwYXJhbSB0aGUgd2luZG93cyBtb2R1bGUgd2l0aCB3aGljaCB5b3UgY2FuIHJldHJpZXZlIG1hbnkgaW5mb3JtYXRpb25zCisJKi8KKwlBRW5jb2RlUHJvcGVydGllcyhITU9EVUxFIGhNb2R1bGUpOworCisJLyoqCisJCVxicmllZiBkZWZhdWx0IGRlc3RydWN0b3IKKwkqLworCXZpcnR1YWwgfkFFbmNvZGVQcm9wZXJ0aWVzKCkge30KKworCS8qKgorCQlcZW51bSBCUk1vZGUKKwkJXGJyaWVmIEEgYml0cmF0ZSBtb2RlIChDQlIsIFZCUiwgQUJSKQorCSovCisJZW51bSBCUk1vZGUgeyBCUl9DQlIsIEJSX1ZCUiwgQlJfQUJSIH07CisKKwkvKioKKwkJXGJyaWVmIEhhbmRsZSBhbGwgdGhlIGNvbW1hbmRzIHRoYXQgb2NjdXIgaW4gdGhlIENvbmZpZyBkaWFsb2cgYm94CisJKi8KKwlib29sIEhhbmRsZURpYWxvZ0NvbW1hbmQoY29uc3QgSFdORCBwYXJlbnRXbmQsIGNvbnN0IFdQQVJBTSB3UGFyYW0sIGNvbnN0IExQQVJBTSBsUGFyYW0pOworCS8qKgorCQlcYnJpZWYgY2hlY2sgd2V0aGVyIDIgaW5zdGFuY2VzIGFyZSBlcXVhbCwgaWUgaGF2ZSB0aGUgc2FtZSBlbmNvZGluZyBwYXJhbWV0ZXJzCisJKi8KKwlib29sIG9wZXJhdG9yICE9IChjb25zdCBBRW5jb2RlUHJvcGVydGllcyAmIHRoZV9pbnN0YW5jZSkgY29uc3Q7CisKKwkvKioKKwkJXGJyaWVmIENoZWNrIHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgQ29weXJpZ2h0IGJpdAorCSovCisJaW5saW5lIGNvbnN0IGJvb2wgR2V0Q29weXJpZ2h0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIGJDb3B5cmlnaHQ7IH0KKwkvKioKKwkJXGJyaWVmIENoZWNrIHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgQ1JDIGJpdAorCSovCisJaW5saW5lIGNvbnN0IGJvb2wgR2V0Q1JDTW9kZSgpIGNvbnN0IHsgcmV0dXJuIGJDUkM7IH0KKwkvKioKKwkJXGJyaWVmIENoZWNrIHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgT3JpZ2luYWwgYml0CisJKi8KKwlpbmxpbmUgY29uc3QgYm9vbCBHZXRPcmlnaW5hbE1vZGUoKSBjb25zdCB7IHJldHVybiBiT3JpZ2luYWw7IH0KKwkvKioKKwkJXGJyaWVmIENoZWNrIHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgUHJpdmF0ZSBiaXQKKwkqLworCWlubGluZSBjb25zdCBib29sIEdldFByaXZhdGVNb2RlKCkgY29uc3QgeyByZXR1cm4gYlByaXZhdGU7IH0KKwkvKioKKwkJXGJyaWVmIENoZWNrIHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgU21hcnQgQml0cmF0ZSBvdXRwdXQKKwkqLworCWlubGluZSBjb25zdCBib29sIEdldFNtYXJ0T3V0cHV0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIGJTbWFydE91dHB1dDsgfQorCS8qKgorCQlcYnJpZWYgQ2hlY2sgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGQgYWxsb3cgQXZlcmFnZSBCaXRyYXRlIG91dHB1dAorCSovCisJaW5saW5lIGNvbnN0IGJvb2wgR2V0QWJyT3V0cHV0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIGJBYnJPdXRwdXQ7IH0KKworCS8qKgorCQlcYnJpZWYgQ2hlY2sgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGRuJ3QgdXNlIHRoZSBCaXQgUmVzZXJ2b2lyCisJKi8KKwlpbmxpbmUgY29uc3QgYm9vbCBHZXROb0JpUmVzTW9kZSgpIGNvbnN0IHsgcmV0dXJuIGJOb0JpdFJlczsgfQorCisJLyoqCisJCVxicmllZiBDaGVjayB3ZXRoZXIgdGhlIEVuY29kZSBwcm9jZXNzIHNob3VsZCBmb3JjZSB0aGUgY2hhbm5lbCBtb2RlIChzdGVyZW8gb3IgbW9ubyByZXNhbXBsaW5nKQorCSovCisJaW5saW5lIGNvbnN0IGJvb2wgR2V0Rm9yY2VDaGFubmVsTW9kZSgpIGNvbnN0IHsgcmV0dXJuIGJGb3JjZUNoYW5uZWw7IH0KKworCS8qKgorCQlcYnJpZWYgQ2hlY2sgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGQgdXNlIHRoZSBWQlIgbW9kZQorCSovCisJaW5saW5lIGNvbnN0IEJSTW9kZSBHZXRWQlJVc2VNb2RlKCkgY29uc3QgeyByZXR1cm4gbUJSbW9kZTsgfQorCS8qKgorCQlcYnJpZWYgQ2hlY2sgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGQgdXNlIHRoZSBYaW5nIGZyYW1lIGluIHRoZSBWQlIgbW9kZQorCQlcbm90ZSB0aGUgWGluZyBmcmFtZSBpcyBhIHNpbGVudCBmcmFtZSBhdCB0aGUgYmVnaW5uaW5nIHRoYXQgY29udGFpbiBWQlIgc3RhdGlzdGljcyBhYm91dCB0aGUgZmlsZS4KKwkqLworCWlubGluZSBjb25zdCBib29sIEdldFhpbmdGcmFtZU1vZGUoKSBjb25zdCB7IHJldHVybiBiWGluZ0ZyYW1lOyB9CisKKwkvKioKKwkJXGJyaWVmIENoZWNrIHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHJlc2FtcGxlIGJlZm9yZSBlbmNvZGluZworCSovCisJaW5saW5lIGNvbnN0IGJvb2wgR2V0UmVzYW1wbGVNb2RlKCkgY29uc3QgeyByZXR1cm4gYlJlc2FtcGxlOyB9CisJCisJLyoqCisJCVxicmllZiBTZXQgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGQgdXNlIHRoZSBDb3B5cmlnaHQgYml0CisJKi8KKwlpbmxpbmUgdm9pZCBTZXRDb3B5cmlnaHRNb2RlKGNvbnN0IGJvb2wgYk1vZGUpIHsgYkNvcHlyaWdodCA9IGJNb2RlOyB9CisJLyoqCisJCVxicmllZiBTZXQgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGQgdXNlIHRoZSBDUkMgYml0CisJKi8KKwlpbmxpbmUgdm9pZCBTZXRDUkNNb2RlKGNvbnN0IGJvb2wgYk1vZGUpIHsgYkNSQyA9IGJNb2RlOyB9CisJLyoqCisJCVxicmllZiBTZXQgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGQgdXNlIHRoZSBPcmlnaW5hbCBiaXQKKwkqLworCWlubGluZSB2b2lkIFNldE9yaWdpbmFsTW9kZShjb25zdCBib29sIGJNb2RlKSB7IGJPcmlnaW5hbCA9IGJNb2RlOyB9CisJLyoqCisJCVxicmllZiBTZXQgd2V0aGVyIHRoZSBFbmNvZGUgcHJvY2VzcyBzaG91bGQgdXNlIHRoZSBQcml2YXRlIGJpdAorCSovCisJaW5saW5lIHZvaWQgU2V0UHJpdmF0ZU1vZGUoY29uc3QgYm9vbCBiTW9kZSkgeyBiUHJpdmF0ZSA9IGJNb2RlOyB9CisKKwkvKioKKwkJXGJyaWVmIFNldCB3ZXRoZXIgdGhlIEVuY29kZSBwcm9jZXNzIHNob3VsZCB1c2UgdGhlIFNtYXJ0IEJpdHJhdGUgb3V0cHV0CisJKi8KKwlpbmxpbmUgdm9pZCBTZXRTbWFydE91dHB1dE1vZGUoY29uc3QgYm9vbCBiTW9kZSkgeyBiU21hcnRPdXRwdXQgPSBiTW9kZTsgfQorCS8qKgorCQlcYnJpZWYgU2V0IHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgQXZlcmFnZSBCaXRyYXRlIG91dHB1dAorCSovCisJaW5saW5lIHZvaWQgU2V0QWJyT3V0cHV0TW9kZShjb25zdCBib29sIGJNb2RlKSB7IGJBYnJPdXRwdXQgPSBiTW9kZTsgfQorCisKKwkvKioKKwkJXGJyaWVmIFNldCB3ZXRoZXIgdGhlIEVuY29kZSBwcm9jZXNzIHNob3VsZG4ndCB1c2UgdGhlIEJpdCBSZXNlcnZvaXIKKwkqLworCWlubGluZSB2b2lkIFNldE5vQmlSZXNNb2RlKGNvbnN0IGJvb2wgYk1vZGUpIHsgYk5vQml0UmVzID0gYk1vZGU7IH0KKwkKKwkvKioKKwkJXGJyaWVmIFNldCB3ZXRoZXIgdGhlIEVuY29kZSBwcm9jZXNzIHNob3VsZCBmb3JjZSB0aGUgY2hhbm5lbCBtb2RlIChzdGVyZW8gb3IgbW9ubyByZXNhbXBsaW5nKQorCSovCisJaW5saW5lIHZvaWQgU2V0Rm9yY2VDaGFubmVsTW9kZShjb25zdCBib29sIGJNb2RlKSB7IGJGb3JjZUNoYW5uZWwgPSBiTW9kZTsgfQorCQorCS8qKgorCQlcYnJpZWYgU2V0IHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgVkJSIG1vZGUKKwkqLworCWlubGluZSB2b2lkIFNldFZCUlVzZU1vZGUoY29uc3QgQlJNb2RlIG1vZGUpIHsgbUJSbW9kZSA9IG1vZGU7IH0KKworCS8qKgorCQlcYnJpZWYgU2V0IHdldGhlciB0aGUgRW5jb2RlIHByb2Nlc3Mgc2hvdWxkIHVzZSB0aGUgWGluZyBmcmFtZSBpbiB0aGUgVkJSIG1vZGUKKwkJXG5vdGUgdGhlIFhpbmcgZnJhbWUgaXMgYSBzaWxlbnQgZnJhbWUgYXQgdGhlIGJlZ2lubmluZyB0aGF0IGNvbnRhaW4gVkJSIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGZpbGUuCisJKi8KKwlpbmxpbmUgdm9pZCBTZXRYaW5nRnJhbWVNb2RlKGNvbnN0IGJvb2wgYk1vZGUpIHsgYlhpbmdGcmFtZSA9IGJNb2RlOyB9CisKKwkvKioKKwkJXGJyaWVmIENCUiA6IEdldCB0aGUgYml0cmF0ZSB0byB1c2UgICAgICAgICAvIAorCQkgICAgICAgVkJSIDogR2V0IHRoZSBtaW5pbXVtIGJpdHJhdGUgdmFsdWUKKwkqLworCWNvbnN0IHVuc2lnbmVkIGludCBHZXRCaXRyYXRlVmFsdWUoKSBjb25zdDsKKworCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBjdXJyZW50IChWQlI6bWluKSBiaXRyYXRlIGZvciB0aGUgc3BlY2lmaWVkIE1QRUcgdmVyc2lvbgorCisJCVxwYXJhbSBiaXRyYXRlIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgYml0cmF0ZQorCQlccGFyYW0gTVBFR19WZXJzaW9uIFRoZSBNUEVHIHZlcnNpb24gKE1QRUcxIG9yIE1QRUcyKQorCisJCVxyZXR1cm4gMCBpZiB0aGUgYml0cmF0ZSBpcyBub3QgZm91bmQsIDEgaWYgdGhlIGJpdHJhdGUgaXMgZm91bmQKKwkqLworCWNvbnN0IGludCBHZXRCaXRyYXRlVmFsdWUoRFdPUkQgJiBiaXRyYXRlLCBjb25zdCBEV09SRCBNUEVHX1ZlcnNpb24pIGNvbnN0OworCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBjdXJyZW50IChWQlI6bWluKSBiaXRyYXRlIGZvciBNUEVHIEkKKworCQlccGFyYW0gYml0cmF0ZSB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGJpdHJhdGUKKworCQlccmV0dXJuIDAgaWYgdGhlIGJpdHJhdGUgaXMgbm90IGZvdW5kLCAxIGlmIHRoZSBiaXRyYXRlIGlzIGZvdW5kCisJKi8KKwljb25zdCBpbnQgR2V0Qml0cmF0ZVZhbHVlTVBFRzEoRFdPUkQgJiBiaXRyYXRlKSBjb25zdDsKKwkvKioKKwkJXGJyaWVmIEdldCB0aGUgY3VycmVudCAoVkJSOm1pbikgYml0cmF0ZSBmb3IgTVBFRyBJSQorCisJCVxwYXJhbSBiaXRyYXRlIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgYml0cmF0ZQorCisJCVxyZXR1cm4gMCBpZiB0aGUgYml0cmF0ZSBpcyBub3QgZm91bmQsIDEgaWYgdGhlIGJpdHJhdGUgaXMgZm91bmQKKwkqLworCWNvbnN0IGludCBHZXRCaXRyYXRlVmFsdWVNUEVHMihEV09SRCAmIGJpdHJhdGUpIGNvbnN0OworCisJLyoqCisJCVxicmllZiBHZXQgdGhlIGN1cnJlbnQgKFZCUjptaW4pIGJpdHJhdGUgaW4gdGhlIGZvcm0gb2YgYSBzdHJpbmcKKworCQlccGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdGhhdCB3aWxsIGJlIGZpbGxlZAorCQlccGFyYW0gc3RyaW5nX3NpemUgdGhlIHNpemUgb2YgdGhlIHN0cmluZworCisJCVxyZXR1cm4gLTEgaWYgdGhlIGJpdHJhdGUgaXMgbm90IGZvdW5kLCBhbmQgdGhlIG51bWJlciBvZiBjaGFyIGNvcGllZCBvdGhlcndpc2UKKwkqLworCWlubGluZSBjb25zdCBpbnQgR2V0Qml0cmF0ZVN0cmluZyhjaGFyICogc3RyaW5nLCBpbnQgc3RyaW5nX3NpemUpIGNvbnN0IHtyZXR1cm4gR2V0Qml0cmF0ZVN0cmluZyhzdHJpbmcsc3RyaW5nX3NpemUsbk1pbkJpdHJhdGVJbmRleCk7IH0KKworCS8qKgorCQlcYnJpZWYgR2V0IHRoZSAoVkJSOm1pbikgYml0cmF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGZvcm0gb2YgYSBzdHJpbmcKKworCQlccGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdGhhdCB3aWxsIGJlIGZpbGxlZAorCQlccGFyYW0gc3RyaW5nX3NpemUgdGhlIHNpemUgb2YgdGhlIHN0cmluZworCQlccGFyYW0gYV9iaXRyYXRlSUQgdGhlIGluZGV4IGluIHRoZSBCaXRyYXRlIHRhYmxlCisKKwkJXHJldHVybiAtMSBpZiB0aGUgYml0cmF0ZSBpcyBub3QgZm91bmQsIGFuZCB0aGUgbnVtYmVyIG9mIGNoYXIgY29waWVkIG90aGVyd2lzZQorCSovCisJY29uc3QgaW50IEdldEJpdHJhdGVTdHJpbmcoY2hhciAqIHN0cmluZywgaW50IHN0cmluZ19zaXplLCBpbnQgYV9iaXRyYXRlSUQpIGNvbnN0OworCisJLyoqCisJCVxicmllZiBHZXQgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBiaXRyYXRlcworCSovCisJaW5saW5lIGNvbnN0IGludCBHZXRCaXRyYXRlTGVudGdoKCkgY29uc3QgeyByZXR1cm4gc2l6ZW9mKHRoZV9CaXRyYXRlcykgLyBzaXplb2YodW5zaWduZWQgaW50KTsgfQorCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgcG9zc2libGUgc2FtcGxpbmcgZnJlcXVlbmNpZXMKKwkqLworCWlubGluZSBjb25zdCB1bnNpZ25lZCBpbnQgR2V0UmVzYW1wbGVGcmVxKCkgY29uc3QgeyByZXR1cm4gdGhlX1NhbXBsaW5nRnJlcXNbblNhbXBsaW5nRnJlcUluZGV4XTsgfQorCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBtYXggY29tcHJlc3Npb24gcmF0aW8gYWxsb3dlZCAoMToxNSBkZWZhdWx0KQorCSovCisJaW5saW5lIGRvdWJsZSBHZXRTbWFydFJhdGlvKCkgY29uc3QgeyByZXR1cm4gU21hcnRSYXRpb01heDt9CisJLyoqCisJCVxicmllZiBHZXQgdGhlIG1pbiBBQlIgYml0cmF0ZSBwb3NzaWJsZQorCSovCisJaW5saW5lIHVuc2lnbmVkIGludCBHZXRBYnJCaXRyYXRlTWluKCkgY29uc3QgeyByZXR1cm4gQXZlcmFnZUJpdHJhdGVfTWluO30KKwkvKioKKwkJXGJyaWVmIEdldCB0aGUgbWF4IEFCUiBiaXRyYXRlIHBvc3NpYmxlCisJKi8KKwlpbmxpbmUgdW5zaWduZWQgaW50IEdldEFickJpdHJhdGVNYXgoKSBjb25zdCB7IHJldHVybiBBdmVyYWdlQml0cmF0ZV9NYXg7fQorCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBzdGVwIGJldHdlZW4gQUJSIGJpdHJhdGVzCisJKi8KKwlpbmxpbmUgdW5zaWduZWQgaW50IEdldEFickJpdHJhdGVTdGVwKCkgY29uc3QgeyByZXR1cm4gQXZlcmFnZUJpdHJhdGVfU3RlcDt9CisKKwkvKioKKwkJXGJyaWVmIEdldCB0aGUgVkJSIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWVkIE1QRUcgdmVyc2lvbgorCisJCVxwYXJhbSBNYXhCaXRyYXRlIHJlY2VpdmUgdGhlIG1heGltdW0gYml0cmF0ZSBwb3NzaWJsZSBpbiB0aGUgVkJSIG1vZGUKKwkJXHBhcmFtIFF1YWxpdHkgcmVjZWl2ZSB0aGUgcXVhbGl0eSB2YWx1ZSAoMCB0byA5IHNlZSBMYW1lIGRvYyBmb3IgbW9yZSBpbmZvKQorCQlccGFyYW0gVkJSSGVhZGVyIHJlY2VpdmUgdGhlIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdldGhlciB0aGUgVkJSL1hpbmcgaGVhZGVyIHNob3VsZCBiZSBmaWxsZWQKKwkJXHBhcmFtIE1QRUdfVmVyc2lvbiBUaGUgTVBFRyB2ZXJzaW9uIChNUEVHMSBvciBNUEVHMikKKworCQlccmV0dXJuIHRoZSBWQlIgbW9kZSAoT2xkLCBOZXcsIEFCUiwgTVRSSCwgRGVmYXVsdCBvciBOb25lKQorCSovCisvLwlWQlJNRVRIT0QgR2V0VkJSVmFsdWUoRFdPUkQgJiBNYXhCaXRyYXRlLCBpbnQgJiBRdWFsaXR5LCBEV09SRCAmIEFickJpdHJhdGUsIEJPT0wgJiBWQlJIZWFkZXIsIGNvbnN0IERXT1JEIE1QRUdfVmVyc2lvbikgY29uc3Q7CisKKwkvKioKKwkJXGJyaWVmIEdldCB0aGUgTGFtZSBETEwgTG9jYXRpb24KKwkqLworLy8JY29uc3QgY2hhciAqIEdldERsbExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gRGxsTG9jYXRpb24uY19zdHIoKTsgfQorCS8qKgorCQlcYnJpZWYgU2V0IHRoZSBMYW1lIERMTCBMb2NhdGlvbgorCSovCisvLwl2b2lkIFNldERsbExvY2F0aW9uKCBjb25zdCBjaGFyICogdGhlX3N0cmluZyApIHsgRGxsTG9jYXRpb24gPSB0aGVfc3RyaW5nOyB9CisKKwkvKioKKwkJXGJyaWVmIEdldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZW5jb2RpbmcKKwkqLworLy8JY29uc3QgY2hhciAqIEdldE91dHB1dERpcmVjdG9yeSgpIGNvbnN0IHsgcmV0dXJuIE91dHB1dERpci5jX3N0cigpOyB9CisJLyoqCisJCVxicmllZiBTZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIGVuY29kaW5nCisJKi8KKy8vCXZvaWQgU2V0T3V0cHV0RGlyZWN0b3J5KCBjb25zdCBjaGFyICogdGhlX3N0cmluZyApIHsgT3V0cHV0RGlyID0gdGhlX3N0cmluZzsgfQorCisJLyoqCisJCVxicmllZiBHZXQgdGhlIGN1cnJlbnQgY2hhbm5lbCBtb2RlIHRvIHVzZQorCSovCisJY29uc3QgdW5zaWduZWQgaW50IEdldENoYW5uZWxNb2RlVmFsdWUoKSBjb25zdDsKKwkvKioKKwkJXGJyaWVmIEdldCB0aGUgY3VycmVudCBjaGFubmVsIG1vZGUgaW4gdGhlIGZvcm0gb2YgYSBzdHJpbmcKKwkqLworCWlubGluZSBjb25zdCBjaGFyICogR2V0Q2hhbm5lbE1vZGVTdHJpbmcoKSBjb25zdCB7cmV0dXJuIEdldENoYW5uZWxNb2RlU3RyaW5nKG5DaGFubmVsSW5kZXgpOyB9CisJLyoqCisJCVxicmllZiBHZXQgdGhlIGNoYW5uZWwgbW9kZSBpbiB0aGUgZm9ybSBvZiBhIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBDaGFubmVsIG1vZGUgaW5kZXgKKworCQlccGFyYW0gYV9jaGFubmVsSUQgdGhlIENoYW5uZWwgbW9kZSBpbmRleCAoc2VlIEdldENoYW5uZWxMZW50Z2goKSkKKwkqLworCWNvbnN0IGNoYXIgKiBHZXRDaGFubmVsTW9kZVN0cmluZyhjb25zdCBpbnQgYV9jaGFubmVsSUQpIGNvbnN0OworCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgcG9zc2libGUgY2hhbm5lbCBtb2RlCisJKi8KKwlpbmxpbmUgY29uc3QgaW50IEdldENoYW5uZWxMZW50Z2goKSBjb25zdCB7IHJldHVybiAzOyB9CisKKwkvKioKKwkJXGJyaWVmIEdldCB0aGUgY3VycmVudCBwcmVzZXQgdG8gdXNlLCBzZWUgbGFtZSBkb2N1bWVudGF0aW9uL2NvZGUgZm9yIG1vcmUgaW5mbyBvbiB0aGUgcG9zc2libGUgcHJlc2V0cworCSovCisvLwljb25zdCBMQU1FX1FVQUxUSVlfUFJFU0VUIEdldFByZXNldE1vZGVWYWx1ZSgpIGNvbnN0OworCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBwcmVzZXQgaW4gdGhlIGZvcm0gb2YgYSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgQ2hhbm5lbCBtb2RlIGluZGV4CisKKwkJXHBhcmFtIGFfcHJlc2V0SUQgdGhlIHByZXNldCBpbmRleCAoc2VlIEdldFByZXNldExlbnRnaCgpKQorCSovCisJY29uc3QgY2hhciAqIEdldFByZXNldE1vZGVTdHJpbmcoY29uc3QgaW50IGFfcHJlc2V0SUQpIGNvbnN0OworCS8qKgorCQlcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcHJlc2V0cworCSovCisvLwlpbmxpbmUgY29uc3QgaW50IEdldFByZXNldExlbnRnaCgpIGNvbnN0IHsgcmV0dXJuIHNpemVvZih0aGVfUHJlc2V0cykgLyBzaXplb2YoTEFNRV9RVUFMVElZX1BSRVNFVCk7IH0KKworCS8qKgorCQlcYnJpZWYgU3RhcnQgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBwcm9jZXNzIChjYWxsZWQgYnkgQU91dDo6Y29uZmlnKCkpCisJKi8KKwlib29sIENvbmZpZyhjb25zdCBISU5TVEFOQ0UgaEluc3RhbmNlLCBjb25zdCBIV05EIEh3bmRQYXJlbnQpOworCisJLyoqCisJCVxicmllZiBJbml0IHRoZSBjb25maWcgZGlhbG9nIGJveCB3aXRoIHRoZSByaWdodCB0ZXh0cyBhbmQgY2hvaWNlcworCSovCisJYm9vbCBJbml0Q29uZmlnRGxnKEhXTkQgaERpYWxvZyk7CisKKwkvKioKKwkJXGJyaWVmIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyBmcm9tIHRoZSBjb25maWcgZGlhbG9nIGJveAorCSovCisJYm9vbCBVcGRhdGVWYWx1ZUZyb21EbGcoSFdORCBoRGlhbG9nKTsKKwkvKioKKwkJXGJyaWVmIFVwZGF0ZSB0aGUgY29uZmlnIGRpYWxvZyBib3ggZnJvbSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworCSovCisJYm9vbCBVcGRhdGVEbGdGcm9tVmFsdWUoSFdORCBoRGlhbG9nKTsKKworCS8qKgorCQlcYnJpZWYgVXBkYXRlIHRoZSBjb25maWcgZGlhbG9nIGJveCB3aXRoIHRoZSBCaXRSYXRlIG1vZGUKKwkqLworCXN0YXRpYyB2b2lkIERpc3BsYXlWYnJPcHRpb25zKGNvbnN0IEhXTkQgaERpYWxvZywgY29uc3QgQlJNb2RlIHRoZV9tb2RlKTsKKworCS8qKgorCQlcYnJpZWYgSGFuZGxlIHRoZSBzYXZpbmcgb2YgcGFyYW1ldGVycyB3aGVuIHNvbWV0aGluZyBoYXMgY2hhbmdlZCBpbiB0aGUgY29uZmlnIGRpYWxvZyBib3gKKwkqLworCXZvaWQgU2F2ZVBhcmFtcyhjb25zdCBIV05EIGhEaWFsb2cpOworCisJLyoqCisJCVxicmllZiBTYXZlIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMgKGN1cnJlbnQgY29uZmlnIGluIHVzZSkKKwkqLworCXZvaWQgUGFyYW1zU2F2ZSh2b2lkKTsKKwkvKioKKwkJXGJyaWVmIExvYWQgdGhlIHBhcmFtZXRlcnMgKGN1cnJlbnQgY29uZmlnIGluIHVzZSkKKwkqLworCXZvaWQgUGFyYW1zUmVzdG9yZSh2b2lkKTsKKworCS8qKgorCQlcYnJpZWYgU2VsZWN0IHRoZSBzcGVjaWZpZWQgY29uZmlnIG5hbWUgYXMgdGhlIG5ldyBkZWZhdWx0IG9uZQorCSovCisJdm9pZCBTZWxlY3RTYXZlZFBhcmFtcyhjb25zdCBzdGQ6OnN0cmluZyBjb25maWdfbmFtZSk7CisJLyoqCisJCVxicmllZiBTYXZlIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMgdG8gdGhlIHNwZWNpZmllZCBjb25maWcgbmFtZQorCSovCisJdm9pZCBTYXZlVmFsdWVzVG9TdHJpbmdLZXkoY29uc3Qgc3RkOjpzdHJpbmcgJiBjb25maWdfbmFtZSk7CisJLyoqCisJCVxicmllZiBSZW5hbWUgdGhlIGN1cnJlbnQgY29uZmlnIG5hbWUgdG8gc29tZXRoaW5nIGVsc2UKKwkqLworCWJvb2wgUmVuYW1lQ3VycmVudFRvKGNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3X2NvbmZpZ19uYW1lKTsKKwkvKioKKwkJXGJyaWVmIERlbGV0ZSB0aGUgY29uZmlnIG5hbWUgZnJvbSB0aGUgc2F2ZWQgY29uZmlncworCSovCisJYm9vbCBEZWxldGVDb25maWcoY29uc3Qgc3RkOjpzdHJpbmcgJiBjb25maWdfbmFtZSk7CisKKwlBRGJnICAgICAgICAgICAgICBteV9kZWJ1ZzsKKworCS8qKgorCQlcYnJpZWYgVXBkYXRlIHRoZSBzbGlkZXMgdmFsdWUgKG9uIHNjcm9sbCkKKwkqLworCXZvaWQgVXBkYXRlRGxnRnJvbVNsaWRlcyhIV05EIHBhcmVudF93aW5kb3cpIGNvbnN0OworCisJc3RhdGljIFRvb2xUaXBJdGVtIFRvb2x0aXBzWzEzXTsKK3ByaXZhdGU6CisKKwlib29sIGJDb3B5cmlnaHQ7CisJYm9vbCBiQ1JDOworCWJvb2wgYk9yaWdpbmFsOworCWJvb2wgYlByaXZhdGU7CisJYm9vbCBiTm9CaXRSZXM7CisJQlJNb2RlIG1CUm1vZGU7CisJYm9vbCBiWGluZ0ZyYW1lOworCWJvb2wgYkZvcmNlQ2hhbm5lbDsKKwlib29sIGJSZXNhbXBsZTsKKwlib29sIGJTbWFydE91dHB1dDsKKwlib29sIGJBYnJPdXRwdXQ7CisKKwlpbnQgVmJyUXVhbGl0eTsKKwl1bnNpZ25lZCBpbnQgQXZlcmFnZUJpdHJhdGVfTWluOworCXVuc2lnbmVkIGludCBBdmVyYWdlQml0cmF0ZV9NYXg7CisJdW5zaWduZWQgaW50IEF2ZXJhZ2VCaXRyYXRlX1N0ZXA7CisKKwlkb3VibGUgU21hcnRSYXRpb01heDsKKworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGhlX0NoYW5uZWxNb2Rlc1szXTsKKwlpbnQgbkNoYW5uZWxJbmRleDsKKworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGhlX0JpdHJhdGVzWzE4XTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRoZV9NUEVHMV9CaXRyYXRlc1sxNF07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0aGVfTVBFRzJfQml0cmF0ZXNbMTRdOworCWludCBuTWluQml0cmF0ZUluZGV4OyAvLyBDQlIgYW5kIFZCUgorCWludCBuTWF4Qml0cmF0ZUluZGV4OyAvLyBvbmx5IHVzZWQgaW4gVkJSIG1vZGUKKworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGhlX1NhbXBsaW5nRnJlcXNbOV07CisJaW50IG5TYW1wbGluZ0ZyZXFJbmRleDsKKworLy8Jc3RhdGljIGNvbnN0IExBTUVfUVVBTFRJWV9QUkVTRVQgdGhlX1ByZXNldHNbMTddOworCWludCBuUHJlc2V0SW5kZXg7CisKKy8vCWNoYXIgRGxsTG9jYXRpb25bNTEyXTsKKy8vCXN0ZDo6c3RyaW5nIERsbExvY2F0aW9uOworLy8JY2hhciBPdXRwdXREaXJbTUFYX1BBVEhdOworLy8Jc3RkOjpzdHJpbmcgT3V0cHV0RGlyOworCisvLwlBUGFyYW1ldGVycyBteV9iYXNlX3BhcmFtZXRlcnM7CisJVGlYbWxEb2N1bWVudCBteV9zdG9yZWRfZGF0YTsKKwlzdGQ6OnN0cmluZyBteV9zdG9yZV9sb2NhdGlvbjsKKwlzdGQ6OnN0cmluZyBteV9jdXJyZW50X2NvbmZpZzsKKworLy8JSElOU1RBTkNFIGhEbGxJbnN0YW5jZTsKKworCXZvaWQgU2F2ZVZhbHVlc1RvRWxlbWVudChUaVhtbEVsZW1lbnQgKiB0aGVfZWxlbWVudCkgY29uc3Q7CisJaW5saW5lIHZvaWQgU2V0QXR0cmlidXRlQm9vbChUaVhtbEVsZW1lbnQgKiB0aGVfZWx0LGNvbnN0IHN0ZDo6c3RyaW5nICYgdGhlX3N0cmluZywgY29uc3QgYm9vbCB0aGVfdmFsdWUpIGNvbnN0OworCXZvaWQgVXBkYXRlQ29uZmlncyhjb25zdCBIV05EIEh3bmREbGcpOworCXZvaWQgRW5hYmxlQWJyT3B0aW9ucyhIV05EIGhEaWFsb2csIGJvb2wgZW5hYmxlKTsKKworCUhNT0RVTEUgbXlfaE1vZHVsZTsKKworCS8qKgorCQlcYnJpZWYKKworCQlccGFyYW0gY29uZmlnX25hbWUKKwkJXHBhcmFtIHBhcmVudE5vZGUKKwkqLworCXZvaWQgR2V0VmFsdWVzRnJvbUtleShjb25zdCBzdGQ6OnN0cmluZyAmIGNvbmZpZ19uYW1lLCBjb25zdCBUaVhtbE5vZGUgJiBwYXJlbnROb2RlKTsKK307CisKKyNlbmRpZiAvLyAhZGVmaW5lZChfQUVOQ09ERVBST1BFUlRJRVNfSF9fSU5DTFVERURfKQpkaWZmIC0tZ2l0IGEvQUNNL0RlY29kZVN0cmVhbS5jcHAgYi9BQ00vRGVjb2RlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmM3NTNjCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL0RlY29kZVN0cmVhbS5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qKgorICoKKyAqIExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lIGF0IGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisgCisvKiEKKwlcYXV0aG9yIFN0ZXZlIExob21tZQorCVx2ZXJzaW9uIFwkSWQ6IERlY29kZVN0cmVhbS5jcHAsdiAxLjMgMjAwMi8wMS8yNSAxNzo1MTo0MiByb2J1eDQgRXhwICQKKyovCisKKyNpZiAhZGVmaW5lZChTVFJJQ1QpCisjZGVmaW5lIFNUUklDVAorI2VuZGlmIC8vIFNUUklDVAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaWZkZWYgRU5BQkxFX0RFQ09ESU5HCisKKyNpbmNsdWRlICJhZGVidWcuaCIKKworI2luY2x1ZGUgIkRlY29kZVN0cmVhbS5oIgorCisvLyBzdGF0aWMgbWV0aG9kcworCitEZWNvZGVTdHJlYW0gKiBEZWNvZGVTdHJlYW06OkNyZWF0ZSgpCit7CisJRGVjb2RlU3RyZWFtICogUmVzdWx0OworCisJUmVzdWx0ID0gbmV3IERlY29kZVN0cmVhbTsKKworCXJldHVybiBSZXN1bHQ7Cit9CisKK2NvbnN0IGJvb2wgRGVjb2RlU3RyZWFtOjpFcmFzZShjb25zdCBEZWNvZGVTdHJlYW0gKiBhX0FDTVN0cmVhbSkKK3sKKwlkZWxldGUgYV9BQ01TdHJlYW07CisJcmV0dXJuIHRydWU7Cit9CisKKy8vIGNsYXNzIG1ldGhvZHMKKworRGVjb2RlU3RyZWFtOjpEZWNvZGVTdHJlYW0oKSA6CisgbV9Xb3JraW5nQnVmZmVyVXNlU2l6ZSgwKSwKKyBnZnAoTlVMTCkKK3sKKwkgLy8vIFx0b2RvIGdldCB0aGUgZGVidWcgbGV2ZWwgZnJvbSB0aGUgcmVnaXN0cnkKK215X2RlYnVnID0gbmV3IEFEYmcoREVCVUdfTEVWRUxfQ1JFQVRJT04pOworCWlmIChteV9kZWJ1ZyAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgRGVidWdGaWxlTmFtZVs1MTJdOworCisJCW15X2RlYnVnLT5zZXRQcmVmaXgoIk1QRzEyM3N0cmVhbSIpOyAvLy8gXHRvZG8gZ2V0IGl0IGZyb20gdGhlIHJlZ2lzdHJ5CitteV9kZWJ1Zy0+c2V0SW5jbHVkZVRpbWUodHJ1ZSk7ICAvLy8gXHRvZG8gZ2V0IGl0IGZyb20gdGhlIHJlZ2lzdHJ5CisKKy8vIENoZWNrIGluIHRoZSByZWdpc3RyeSBpZiB3ZSBoYXZlIHRvIE91dHB1dCBEZWJ1ZyBpbmZvcm1hdGlvbgorRGVidWdGaWxlTmFtZVswXSA9ICdcMCc7CisKKwkJSEtFWSBPc3NLZXk7CisJCWlmIChSZWdPcGVuS2V5RXgoIEhLRVlfTE9DQUxfTUFDSElORSwgIlNPRlRXQVJFXFxNVUtPTEkiLCAwLCBLRVlfUkVBRCAsICZPc3NLZXkgKSA9PSBFUlJPUl9TVUNDRVNTKSB7CisJCQlEV09SRCBEYXRhVHlwZTsKKwkJCURXT1JEIERlYnVnRmlsZU5hbWVTaXplID0gNTEyOworCQkJaWYgKFJlZ1F1ZXJ5VmFsdWVFeCggT3NzS2V5LCAiRGVidWdGaWxlIiwgTlVMTCwgJkRhdGFUeXBlLCBEZWJ1Z0ZpbGVOYW1lLCAmRGVidWdGaWxlTmFtZVNpemUgKSA9PSBFUlJPUl9TVUNDRVNTKSB7CisJCQkJaWYgKERhdGFUeXBlID09IFJFR19TWikgeworCQkJCQlteV9kZWJ1Zy0+c2V0VXNlRmlsZSh0cnVlKTsKKwkJCQkJbXlfZGVidWctPnNldERlYnVnRmlsZSgoY2hhciAqKURlYnVnRmlsZU5hbWUpOworCQkJCQlteV9kZWJ1Zy0+T3V0UHV0KCJEZWJ1ZyBmaWxlIGlzICVzIiwoY2hhciAqKURlYnVnRmlsZU5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfU1RBUlQsICJEZWNvZGVTdHJlYW0gQ3JlYXRpb24gKDBYJTA4WCkiLHRoaXMpOworCX0KKwllbHNlIHsKKwkJQURiZyBkZWJ1ZzsKKwkJZGVidWcuT3V0UHV0KCJEZWNvZGVTdHJlYW06OkFDTUFDTVN0cmVhbSA6IEltcG9zc2libGUgdG8gY3JlYXRlIG15X2RlYnVnIik7CisJfQorCit9CisKK0RlY29kZVN0cmVhbTo6fkRlY29kZVN0cmVhbSgpCit7CisvLwlsYW1lX2Nsb3NlKCBnZnAgKTsKKworCWlmIChteV9kZWJ1ZyAhPSBOVUxMKQorCXsKKwkJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX1NUQVJULCAiRGVjb2RlU3RyZWFtIERlbGV0aW9uICgwWCUwOFgpIix0aGlzKTsKKwkJZGVsZXRlIG15X2RlYnVnOworCX0KK30KKworYm9vbCBEZWNvZGVTdHJlYW06OmluaXQoY29uc3QgaW50IG5TYW1wbGVzUGVyU2VjLCBjb25zdCBpbnQgbkNoYW5uZWxzLCBjb25zdCBpbnQgbkF2Z0J5dGVzUGVyU2VjLCBjb25zdCBpbnQgblNvdXJjZUJpdHJhdGUpCit7CisJYm9vbCBiUmVzdWx0ID0gZmFsc2U7CisKKwlteV9TYW1wbGVzUGVyU2VjICA9IG5TYW1wbGVzUGVyU2VjOworCW15X0NoYW5uZWxzICAgICAgID0gbkNoYW5uZWxzOworCW15X0F2Z0J5dGVzUGVyU2VjID0gbkF2Z0J5dGVzUGVyU2VjOworCW15X1NvdXJjZUJpdHJhdGUgID0gblNvdXJjZUJpdHJhdGU7CisKKwliUmVzdWx0ID0gdHJ1ZTsKKworCXJldHVybiBiUmVzdWx0OworfQorCitib29sIERlY29kZVN0cmVhbTo6b3BlbigpCit7CisJYm9vbCBiUmVzdWx0ID0gZmFsc2U7CisKKwliUmVzdWx0ID0gYm9vbChJbml0TVAzKCZteV9EZWNvZGVEYXRhKSAhPSAwKTsKKworCXJldHVybiBiUmVzdWx0OworfQorCitib29sIERlY29kZVN0cmVhbTo6Y2xvc2UoTFBCWVRFIHBPdXRwdXRCdWZmZXIsIERXT1JEICpwT3V0cHV0U2l6ZSkKK3sKKworCWJvb2wgYlJlc3VsdCA9IGZhbHNlOworLyoKKwlpbnQgbk91dHB1dFNhbXBsZXMgPSAwOworCisgICAgbk91dHB1dFNhbXBsZXMgPSBsYW1lX2VuY29kZV9mbHVzaCggZ2ZwLCBwT3V0cHV0QnVmZmVyLCAwICk7CisKKwlpZiAoIG5PdXRwdXRTYW1wbGVzIDwgMCApCisJeworCQkvLyBCVUZGRVJfVE9PX1NNQUxMCisJCSpwT3V0cHV0U2l6ZSA9IDA7CisJfQorCWVsc2UKKwl7CisJCSpwT3V0cHV0U2l6ZSA9IG5PdXRwdXRTYW1wbGVzOworCisJCWJSZXN1bHQgPSB0cnVlOworCX0KKy8qCisJLy8gbGFtZSB3aWxsIGJlIGNsb3NlIGluIFZicldyaXRlVGFnIGZ1bmN0aW9uCisJaWYgKCAhbGFtZV9nZXRfYldyaXRlVmJyVGFnKCBnZnAgKSApCisJeworCQkvLyBjbGVhbiB1cCBvZiBhbGxvY2F0ZWQgbWVtb3J5CisJCWxhbWVfY2xvc2UoIGdmcCApOworCX0KKyovCisgICAgCisJRXhpdE1QMygmbXlfRGVjb2RlRGF0YSk7CisKKwliUmVzdWx0ID0gdHJ1ZTsKKyAgICAKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworRFdPUkQgRGVjb2RlU3RyZWFtOjpHZXRPdXRwdXRTaXplRm9ySW5wdXQoY29uc3QgRFdPUkQgdGhlX1NyY0xlbmd0aCkgY29uc3QKK3sKKwlEV09SRCBSZXN1bHQ7CisKKwlkb3VibGUgT3V0cHV0SW5wdXRSYXRpbyA9IGRvdWJsZShteV9TYW1wbGVzUGVyU2VjICogMiAqIG15X0NoYW5uZWxzKSAvIGRvdWJsZShteV9Tb3VyY2VCaXRyYXRlKTsKKworCU91dHB1dElucHV0UmF0aW8gKj0gMS4xNTsgLy8gYWxsb3cgMTUlIG1vcmUKKworCVJlc3VsdCA9IERXT1JEKGRvdWJsZSh0aGVfU3JjTGVuZ3RoKSAqIE91dHB1dElucHV0UmF0aW8pOworCisJbXlfZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJSZXN1bHQgPSAlZCAoT3V0cHV0SW5wdXRSYXRpbyA9ICVmKSIsUmVzdWx0LE91dHB1dElucHV0UmF0aW8pOworCisJcmV0dXJuIFJlc3VsdDsKK30KKworYm9vbCBEZWNvZGVTdHJlYW06OkNvbnZlcnRCdWZmZXIoTFBBQ01EUlZTVFJFQU1IRUFERVIgYV9TdHJlYW1IZWFkZXIpCit7CisJYm9vbCByZXN1bHQgPSBmYWxzZTsKKworaWYgKG15X2RlYnVnICE9IE5VTEwpCit7CitteV9kZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfREVCVUcsICJlbnRlciBEZWNvZGVTdHJlYW06OkNvbnZlcnRCdWZmZXIiKTsKK30KKworCWludCBQcm9jZXNzZWRCeXRlczsKKworCWludCByZXQgPSBkZWNvZGVNUDMoJm15X0RlY29kZURhdGEsIGFfU3RyZWFtSGVhZGVyLT5wYlNyYywgYV9TdHJlYW1IZWFkZXItPmNiU3JjTGVuZ3RoLCAoY2hhciAqKWFfU3RyZWFtSGVhZGVyLT5wYkRzdCwgYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoLCAmUHJvY2Vzc2VkQnl0ZXMpOworCisJc3dpdGNoIChyZXQpCisJeworCSAgICBjYXNlIE1QM19PSzoKKwkJCWFfU3RyZWFtSGVhZGVyLT5jYlNyY0xlbmd0aFVzZWQgPSBhX1N0cmVhbUhlYWRlci0+Y2JTcmNMZW5ndGg7CisJCQlhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGhVc2VkID0gUHJvY2Vzc2VkQnl0ZXM7CisJCQlyZXN1bHQgPSB0cnVlOworCQkJYnJlYWs7CisJICAgIGNhc2UgTVAzX05FRURfTU9SRToKKwkJCWFfU3RyZWFtSGVhZGVyLT5jYlNyY0xlbmd0aFVzZWQgPSAwOworCWFfU3RyZWFtSGVhZGVyLT5jYkRzdExlbmd0aFVzZWQgPSAwOworCQkJYnJlYWs7CisJICAgIGNhc2UgTVAzX0VSUjoKKwkJCWJyZWFrOworCX0KKworLyoKKwlEV09SRCBJblNpemUgPSBhX1N0cmVhbUhlYWRlci0+Y2JTcmNMZW5ndGggLyAyLCBPdXRTaXplID0gYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoOyAvLyAyIGZvciA4PC0+MTYgYml0cworCisvLyBFbmNvZGUgaXQKK2ludCBkd1NhbXBsZXM7CisJaW50IG5PdXRwdXRTYW1wbGVzID0gMDsKKworCWR3U2FtcGxlcyA9IEluU2l6ZSAvIGxhbWVfZ2V0X251bV9jaGFubmVscyggZ2ZwICk7CisKKwlpZiAoIDEgPT0gbGFtZV9nZXRfbnVtX2NoYW5uZWxzKCBnZnAgKSApCisJeworCQluT3V0cHV0U2FtcGxlcyA9IGxhbWVfZW5jb2RlX2J1ZmZlcihnZnAsKFBTSE9SVClhX1N0cmVhbUhlYWRlci0+cGJTcmMsKFBTSE9SVClhX1N0cmVhbUhlYWRlci0+cGJTcmMsZHdTYW1wbGVzLGFfU3RyZWFtSGVhZGVyLT5wYkRzdCxhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGgpOworCX0KKwllbHNlCisJeworCQluT3V0cHV0U2FtcGxlcyA9IGxhbWVfZW5jb2RlX2J1ZmZlcl9pbnRlcmxlYXZlZChnZnAsKFBTSE9SVClhX1N0cmVhbUhlYWRlci0+cGJTcmMsZHdTYW1wbGVzLGFfU3RyZWFtSGVhZGVyLT5wYkRzdCxhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGgpOworCX0KKworCWFfU3RyZWFtSGVhZGVyLT5jYlNyY0xlbmd0aFVzZWQgPSBhX1N0cmVhbUhlYWRlci0+Y2JTcmNMZW5ndGg7CisJYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoVXNlZCA9IG5PdXRwdXRTYW1wbGVzOworCisJcmVzdWx0ID0gYV9TdHJlYW1IZWFkZXItPmNiRHN0TGVuZ3RoVXNlZCA8PSBhX1N0cmVhbUhlYWRlci0+Y2JEc3RMZW5ndGg7CisqLworCW15X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAiVXNlZFNpemUgPSAlZCAvIEVuY29kZWRTaXplID0gJWQsIHJlc3VsdCA9ICVkLCByZXQgPSAlcyIsIGFfU3RyZWFtSGVhZGVyLT5jYlNyY0xlbmd0aFVzZWQsIGFfU3RyZWFtSGVhZGVyLT5jYkRzdExlbmd0aFVzZWQsIHJlc3VsdCwKKwkJKHJldCA9PSBNUDNfT0spPyJNUDNfT0siOihyZXQgPT0gTVAzX05FRURfTU9SRSk/Ik1QM19ORUVEX01PUkUiOiJlcnJvciIpOworCitpZiAobXlfZGVidWcgIT0gTlVMTCkKK3sKK215X2RlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19ERUJVRywgIkRlY29kZVN0cmVhbTo6Q29udmVydEJ1ZmZlciByZXN1bHQgPSAlZCIscmVzdWx0KTsKK30KKworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gRU5BQkxFX0RFQ09ESU5HCmRpZmYgLS1naXQgYS9BQ00vRGVjb2RlU3RyZWFtLmggYi9BQ00vRGVjb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1Y2UyMQotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9EZWNvZGVTdHJlYW0uaApAQCAtMCwwICsxLDgzIEBACisvKioKKyAqCisgKiBMYW1lIEFDTSB3cmFwcGVyLCBlbmNvZGUvZGVjb2RlIE1QMyBiYXNlZCBSSUZGL0FWSSBmaWxlcyBpbiBNUyBXaW5kb3dzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBTdGV2ZSBMaG9tbWUgPHN0ZXZlLmxob21tZSBhdCBmcmVlLmZyPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworIAorLyohCisJXGF1dGhvciBTdGV2ZSBMaG9tbWUKKwlcdmVyc2lvbiBcJElkOiBEZWNvZGVTdHJlYW0uaCx2IDEuMiAyMDA2LzEyLzI1IDIxOjM3OjM0IHJvYmVydCBFeHAgJAorKi8KKworI2lmICFkZWZpbmVkKF9ERUNPREVTVFJFQU1fSF9fSU5DTFVERURfKQorI2RlZmluZSBfREVDT0RFU1RSRUFNX0hfX0lOQ0xVREVEXworCisjaWYgX01TQ19WRVIgPj0gMTAwMAorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIgPj0gMTAwMAorCisjaW5jbHVkZSA8bW1yZWcuaD4KKyNpbmNsdWRlIDxtc2FjbS5oPgorI2luY2x1ZGUgPG1zYWNtZHJ2Lmg+CisKKyNpbmNsdWRlICJBRGJnL0FEYmcuaCIKKworCitzdHJ1Y3QgbGFtZV9nbG9iYWxfZmxhZ3M7CisKKworY2xhc3MgRGVjb2RlU3RyZWFtCit7CitwdWJsaWM6CisJRGVjb2RlU3RyZWFtKCApOworCXZpcnR1YWwgfkRlY29kZVN0cmVhbSggKTsKKworCXN0YXRpYyBEZWNvZGVTdHJlYW0gKiBDcmVhdGUoKTsKKwlzdGF0aWMgY29uc3QgYm9vbCBFcmFzZShjb25zdCBEZWNvZGVTdHJlYW0gKiBhX0FDTVN0cmVhbSk7CisKKwlib29sIGluaXQoY29uc3QgaW50IG5TYW1wbGVzUGVyU2VjLCBjb25zdCBpbnQgbkNoYW5uZWxzLCBjb25zdCBpbnQgbkF2Z0J5dGVzUGVyU2VjLCBjb25zdCBpbnQgblNvdXJjZUJpdHJhdGUpOworCWJvb2wgb3BlbigpOworCWJvb2wgY2xvc2UoTFBCWVRFIHBPdXRwdXRCdWZmZXIsIERXT1JEICpwT3V0cHV0U2l6ZSk7CisKKwlEV09SRCBHZXRPdXRwdXRTaXplRm9ySW5wdXQoY29uc3QgRFdPUkQgdGhlX1NyY0xlbmd0aCkgY29uc3Q7CisJYm9vbCAgQ29udmVydEJ1ZmZlcihMUEFDTURSVlNUUkVBTUhFQURFUiBhX1N0cmVhbUhlYWRlcik7CisKKwlzdGF0aWMgdW5zaWduZWQgaW50IEdldE91dHB1dFNhbXBsZVJhdGUoaW50IHNhbXBsZXNfcGVyX3NlYywgaW50IGJpdHJhdGUsIGludCBjaGFubmVscyk7CisKK3Byb3RlY3RlZDoKKwlsYW1lX2dsb2JhbF9mbGFncyAqIGdmcDsKKworCUFEYmcgKiBteV9kZWJ1ZzsKKwlpbnQgbXlfU2FtcGxlc1BlclNlYzsKKwlpbnQgbXlfQ2hhbm5lbHM7CisJaW50IG15X0F2Z0J5dGVzUGVyU2VjOworCURXT1JEICBteV9TYW1wbGVzUGVyQmxvY2s7CisJaW50IG15X1NvdXJjZUJpdHJhdGU7CisKKwlNUFNUUiBteV9EZWNvZGVEYXRhOworCisJdW5zaWduZWQgaW50IG1fV29ya2luZ0J1ZmZlclVzZVNpemU7CisJY2hhciBtX1dvcmtpbmdCdWZmZXJbMjMwNCoyXTsgLy8gc2hvdWxkIGJlIGF0IGxlYXN0IHR3aWNlIG15X1NhbXBsZXNQZXJCbG9jaworCisJaW5saW5lIGludCBHZXRCeXRlc1BlckJsb2NrKERXT1JEIGJ5dGVzX3Blcl9zZWMsIERXT1JEIHNhbXBsZXNfcGVyX3NlYywgaW50IEJsb2NrQWxpZ24pIGNvbnN0OworCit9OworCisjZW5kaWYgLy8gIWRlZmluZWQoX0RFQ09ERVNUUkVBTV9IX19JTkNMVURFRF8pCisKZGlmZiAtLWdpdCBhL0FDTS9MYW1lQUNNLmluZiBiL0FDTS9MYW1lQUNNLmluZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTcwNDMwCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL0xhbWVBQ00uaW5mCkBAIC0wLDAgKzEsOTEgQEAKKzsgTGFtZSBjb2RlYworOyBlbmFibGUgTVAzIGNvbXByZXNzaW9uIGluIFdpbmRvd3MKKworOyBVc2FnZSA6IHJpZ2h0LWNsaWNrIG9uIHRoaXMgZmlsZSBhbmQgY2hvb3NlICJJbnN0YWxsIiBpbiB0aGUgcG9wIHVwIG1lbnUKKworW1ZlcnNpb25dCitTaWduYXR1cmUgPSAiJENISUNBR08kIgorQ2xhc3MgPSBNRURJQQorCitbU291cmNlRGlza3NOYW1lc10KKzE9IkxhbWUgTVAzIEluc3RhbGwgRGlzayIsLCAwMDAxCisKK1tTb3VyY2VEaXNrc0ZpbGVzXQorTGFtZUFDTS5pbmY9MQorTGFtZUFDTS5hY209MQorbGFtZV9hY20ueG1sPTEKKworW0luc3RhbGxhYmxlLkRyaXZlcnNdCitsYW1lYWNtICA9IDE6TGFtZUFDTS5hY20sICJtc2FjbS5sYW1lYWNtIiwgJURpc3BsYXlOYW1lV2luJSAsICwgLAorCitbRGVmYXVsdEluc3RhbGxdCitDb3B5RmlsZXMgID0gTGFtZUFDTS5Db3B5LExhbWVBQ00uQ29weS5JbmYKK1VwZGF0ZWluaXMgPSBMYW1lQUNNLlVwZGF0ZWluaQorO2FkZHJlZyAgICAgPSBMYW1lQUNNLkFkZFJlZyxMYW1lQUNNLkFkZFJlZzl4LExhbWVBQ00uRG9SZWcKK2FkZHJlZyAgICAgPSBMYW1lQUNNLkFkZFJlZyxMYW1lQUNNLkFkZFJlZzl4CitNZWRpYVR5cGUgID0gU09GVFdBUkUKKworW0RlZmF1bHRJbnN0YWxsLm50eDg2XQorQ29weUZpbGVzICA9IExhbWVBQ00uQ29weSxMYW1lQUNNLkNvcHkuSW5mCis7YWRkcmVnICAgICA9IExhbWVBQ00uQWRkUmVnLExhbWVBQ00uQWRkUmVnTlQsTGFtZUFDTS5Eb1JlZworYWRkcmVnICAgICA9IExhbWVBQ00uQWRkUmVnLExhbWVBQ00uQWRkUmVnTlQKK01lZGlhVHlwZSAgPSBTT0ZUV0FSRQorCitbUmVtb3ZlX0xhbWVNUDNdCis7QWRkUmVnICAgICA9IExhbWVBQ00uVW5yZWdpc3RlcgorRGVsUmVnICAgICA9IExhbWVBQ00uRGVsUmVnCitEZWxGaWxlcyAgID0gTGFtZUFDTS5Db3B5LExhbWVBQ00uQ29weS5JbmYKK1VwZGF0ZUluaXMgPSBMYW1lQUNNLlVwZGF0ZUluaQorCitbTGFtZUFDTS5Db3B5XQorTGFtZUFDTS5hY20KK2xhbWVfYWNtLnhtbAorCitbTGFtZUFDTS5Db3B5LkluZl0KK0xhbWVBQ00uaW5mCisKK1tMYW1lQUNNLlVwZGF0ZUluaV0KK3N5c3RlbS5pbmksIGRyaXZlcnMzMiwsIm1zYWNtLmxhbWVhY209TGFtZUFDTS5hY20iCisKK1tMYW1lQUNNLkFkZFJlZ10KK0hLTE0sICJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxEcml2ZXJzMzIiLCJtc2FjbS5sYW1lYWNtIiwsIkxhbWVBQ00uYWNtIgorSEtMTSwgIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXERyaXZlcnMuZGVzYyIsIkxhbWVBQ00uYWNtIiwsJURpc3BsYXlOYW1lV2luJQorCisKK1tMYW1lQUNNLkFkZFJlZzl4XQorSEtMTSxTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxNZWRpYVJlc291cmNlc1xtc2FjbVxtc2FjbS5sYW1lYWNtLERlc2NyaXB0aW9uLCwlRGlzcGxheU5hbWVXaW4lCitIS0xNLFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXE1lZGlhUmVzb3VyY2VzXG1zYWNtXG1zYWNtLmxhbWVhY20sRHJpdmVyLCxMYW1lQUNNLmFjbQorSEtMTSxTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxNZWRpYVJlc291cmNlc1xtc2FjbVxtc2FjbS5sYW1lYWNtLEZyaWVuZGx5TmFtZSwsJURpc3BsYXlOYW1lV2luJQorSEtMTSwlVW5JbnN0YWxsUGF0aCUsRGlzcGxheU5hbWUsLCVEaXNwbGF5TmFtZVdpbiUKK0hLTE0sJVVuSW5zdGFsbFBhdGglLFVuaW5zdGFsbFN0cmluZywsIiUxMCVccnVuZGxsLmV4ZSBzZXR1cHguZGxsLEluc3RhbGxIaW5mU2VjdGlvbiBSZW1vdmVfTGFtZU1QMyAxMzIgJTE3JVwlSW5mRmlsZSUiCisKK1tMYW1lQUNNLkFkZFJlZ05UXQorSEtMTSwiU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cZHJpdmVyczMyIiwibXNhY20ubGFtZWFjbSIsLCJMYW1lQUNNLmFjbSIKK0hLTE0sIlNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXGRyaXZlcnMuZGVzYyIsIkxhbWVBQ00uYWNtIiwsJURpc3BsYXlOYW1lV2luJQorSEtMTSwlVW5JbnN0YWxsUGF0aCUsRGlzcGxheU5hbWUsLCVEaXNwbGF5TmFtZVdpbiUKK0hLTE0sJVVuSW5zdGFsbFBhdGglLFVuaW5zdGFsbFN0cmluZywsIiUxMSVccnVuZGxsMzIuZXhlIHNldHVwYXBpLEluc3RhbGxIaW5mU2VjdGlvbiBSZW1vdmVfTGFtZU1QMyAxMzIgJTE3JVwlSW5mRmlsZSUiCisKKztbTGFtZUFDTS5Eb1JlZ10KKztIS0xNLFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFJ1bk9uY2VcU2V0dXAsIkxhbWUgQUNNIE1QMyBDb2RlYyIsLCIlMTElXHJlZ3N2cjMyLmV4ZSAvcyAlMTElXExhbWVDb20uYWNtIgorCitbTGFtZUFDTS5EZWxSZWddCitIS0xNLCJTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxNZWRpYVJlc291cmNlc1xtc2FjbVxtc2FjbS5sYW1lYWNtIgorSEtMTSwiU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cZHJpdmVycy5kZXNjIiwiTGFtZUFDTS5hY20iLCwiIgorSEtMTSwiU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cZHJpdmVyczMyIiwibXNhY20ubGFtZWFjbSIsLCIiCitIS0xNLCVVbkluc3RhbGxQYXRoJQorCis7W0xhbWVBQ00uVW5yZWdpc3Rlcl0KKztIS0xNLCJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxSdW5PbmNlXFNldHVwIiwiTGFtZSBBQ00gTVAzIENvZGVjIiwsIiUxMSVccmVnc3ZyMzIuZXhlIC9zIC91ICUxMSVcTGFtZUNvbS5hY20iCisKK1tEZXN0aW5hdGlvbkRpcnNdCitEZWZhdWx0RGVzdERpciAgID0gMTEJOyBMRElEX1NZUworTGFtZUFDTS5Db3B5ICAgICA9IDExCitMYW1lQUNNLkNvcHkuSW5mID0gMTcKKworW1N0cmluZ3NdCitJbmZGaWxlPSJMYW1lQUNNLmluZiIKK0Rpc3BsYXlOYW1lV2luPSJMYW1lIEFDTSBNUDMgQ29kZWMiCitVbkluc3RhbGxQYXRoPSJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcTGFtZUFDTSIKK01lZGlhQ2xhc3NOYW1lPSJNZWRpYSBEZXZpY2VzIgorbWZnbmFtZT0iU3RldmUgTGhvbW1lIgorCmRpZmYgLS1naXQgYS9BQ00vTWFrZWZpbGUuYW0gYi9BQ00vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1YTFjZgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI4IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS42IDIwMDUvMDgvMjEgMTc6MzI6MDcgYm91dmlnbmUgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCitTVUJESVJTID0gQURiZyBkZGsgdGlueXhtbAorCitFWFRSQV9ESVNUID0gXAorCUFDTS5jcHAgXAorCUFDTS5oIFwKKwlBQ01TdHJlYW0uY3BwIFwKKwlBQ01TdHJlYW0uaCBcCisJQUVuY29kZVByb3BlcnRpZXMuY3BwIFwKKwlBRW5jb2RlUHJvcGVydGllcy5oIFwKKwlEZWNvZGVTdHJlYW0uY3BwIFwKKwlEZWNvZGVTdHJlYW0uaCBcCisJTGFtZUFDTS5pbmYgXAorCVRPRE8gXAorCWFjbS5yYyBcCisJYWRlYnVnLmggXAorCWxhbWUuaWNvIFwKKwlsYW1lQUNNLmRlZiBcCisJbGFtZUFDTV92YzYuZHNwIFwKKwlsYW1lQUNNX3ZjNy52Y3Byb2ogXAorCWxhbWVfYWNtLnhtbCBcCisJbWFpbi5jcHAgXAorCXJlYWRtZS50eHQgXAorCXJlc291cmNlLmgKKwpkaWZmIC0tZ2l0IGEvQUNNL01ha2VmaWxlLmluIGIvQUNNL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDVjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MzcgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwgVE9ETworc3ViZGlyID0gQUNNCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKKwlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAorCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAorCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCitSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAorICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNUX1NVQkRJUlMgPSAkKFNVQkRJUlMpCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gMS45IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorU1VCRElSUyA9IEFEYmcgZGRrIHRpbnl4bWwKK0VYVFJBX0RJU1QgPSBcCisJQUNNLmNwcCBcCisJQUNNLmggXAorCUFDTVN0cmVhbS5jcHAgXAorCUFDTVN0cmVhbS5oIFwKKwlBRW5jb2RlUHJvcGVydGllcy5jcHAgXAorCUFFbmNvZGVQcm9wZXJ0aWVzLmggXAorCURlY29kZVN0cmVhbS5jcHAgXAorCURlY29kZVN0cmVhbS5oIFwKKwlMYW1lQUNNLmluZiBcCisJVE9ETyBcCisJYWNtLnJjIFwKKwlhZGVidWcuaCBcCisJbGFtZS5pY28gXAorCWxhbWVBQ00uZGVmIFwKKwlsYW1lQUNNX3ZjNi5kc3AgXAorCWxhbWVBQ01fdmM3LnZjcHJvaiBcCisJbGFtZV9hY20ueG1sIFwKKwltYWluLmNwcCBcCisJcmVhZG1lLnR4dCBcCisJcmVzb3VyY2UuaAorCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgQUNNL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduICBBQ00vTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKKyQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKK2N0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD0uOyBcCisJZWxzZSBcCisJICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD07IFwKKwlmaTsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAorCSAgICAgIHRhZ3M9IiQkdGFncyAkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICBkaXN0ZGlyPWAkKGFtX19jZCkgJChkaXN0ZGlyKSAmJiBwd2RgOyBcCisJICAgIHRvcF9kaXN0ZGlyPWAkKGFtX19jZCkgJCh0b3BfZGlzdGRpcikgJiYgcHdkYDsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJHRvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJGRpc3RkaXIvJCRzdWJkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtcmVjdXJzaXZlCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06CisKK3BzOiBwcy1yZWN1cnNpdmUKKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGluc3RhbGwtYW0gXAorCWluc3RhbGwtc3RyaXAKKworLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCisJYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBlbmQgZ2xvYmFsIHNlY3Rpb24KKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL0FDTS9UT0RPIGIvQUNNL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4YWJhMgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9UT0RPCkBAIC0wLDAgKzEsOSBAQAorLSBrbm93biBidWcgOiB3aGVuIHJlY29yZGluZywgY29udmVydGluZywgYW5kIHJlY29yZGluZyBhIGxhbWVfY2xvc2UoKSBjYWxsIGZhaWwKKy0gYWxsb3cgZGVjb21wcmVzc2lvbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIGNvbW1hbmQtbGluZQorLSBhbGxvdyBWQlIgbW9kZQorLSBhbGxvdyBjaGFubmVsIHJlc2FtcGxpbmcgKG1vbm8gdG8gc3RlcmVvIC8gc3RlcmVvIHRvIG1vbm8pCistIGFsbG93IGludGVybmFsIHJlc2FtcGxpbmcgKGRpZmZlcmVuY2UgaW4gdGhlIGZvcm1hdCBzdWdnZXN0aW9uKQorLSB1c2UgZ2xvYmFsIHBvaW50ZXJzIGZvciBzdHJpbmcKKy0gdXNlIHRoZSBiaXRyYXRlL2ZyZXEgdGFibGVzIGZyb20gTEFNRQorCisvIGFkZCB0aGUgZGVjb2RpbmcgZW5naW5lCmRpZmYgLS1naXQgYS9BQ00vYWNtLnJjIGIvQUNNL2FjbS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTdhNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvQUNNL2FjbS5yYwpAQCAtMCwwICsxLDIxOSBAQAorLy9NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0LgorLy8KKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorCisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDIgcmVzb3VyY2UuCisvLworI2luY2x1ZGUgImFmeHJlcy5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZyYW569nNpc2NoIChGcmFua3JlaWNoKSByZXNvdXJjZXMKKworI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRlJBKQorI2lmZGVmIF9XSU4zMgorTEFOR1VBR0UgTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNICisjcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQorI2VuZGlmIC8vX1dJTjMyCisKKyNpZmRlZiBBUFNUVURJT19JTlZPS0VECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFRFWFRJTkNMVURFCisvLworCisxIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICAicmVzb3VyY2UuaFwwIgorRU5ECisKKzIgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgCitCRUdJTgorICAgICIjaW5jbHVkZSAiImFmeHJlcy5oIiJcclxuIgorICAgICJcMCIKK0VORAorCiszIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICAiXHJcbiIKKyAgICAiXDAiCitFTkQKKworI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQKKworCisjaWZuZGVmIF9NQUMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gVmVyc2lvbgorLy8KKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gMCw5LDEsMAorIFBST0RVQ1RWRVJTSU9OIDAsOSwxLDAKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MUwKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyAweDRMCisgRklMRVRZUEUgMHgzTAorIEZJTEVTVUJUWVBFIDB4OEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsICJUaGlzIGlzIGFuIEFDTSBkcml2ZXIgZm9yIFdpbjMyIHVzaW5nIExhbWUgdG8gZW5jb2RlXDAiCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiaHR0cDovL3d3dy5tcDNkZXYub3JnL1wwIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJMYW1lIE1QMyBjb2RlYyBlbmdpbmVcMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIwLjkuMlwwIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJsYW1lQUNNXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwMiBTdGV2ZSBMaG9tbWUsIENvcHlyaWdodCCpIDIwMDItMjAwNyBUaGUgTEFNRSBQcm9qZWN0XDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIkxHUEwgKHNlZSBnbnUub3JnKVwwIgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAibGFtZUFDTS5hY21cMCIKKyAgICAgICAgICAgIFZBTFVFICJQcml2YXRlQnVpbGQiLCAiXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiTGFtZSBNUDMgY29kZWNcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIwLjkuMlwwIgorICAgICAgICAgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsICJcMCIKKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCisgICAgRU5ECitFTkQKKworI2VuZGlmICAgIC8vICFfTUFDCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBJY29uCisvLworCisvLyBJY29uIHdpdGggbG93ZXN0IElEIHZhbHVlIHBsYWNlZCBmaXJzdCB0byBlbnN1cmUgYXBwbGljYXRpb24gaWNvbgorLy8gcmVtYWlucyBjb25zaXN0ZW50IG9uIGFsbCBzeXN0ZW1zLgorSURJX0lDT04gICAgICAgICAgICAgICAgSUNPTiAgICBESVNDQVJEQUJMRSAgICAgImxhbWUuaWNvIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIERpYWxvZworLy8KKworSUREX0NPTkZJRyBESUFMT0dFWCAwLCAwLCAyMzEsIDIwNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkxhbWUgTVAzIGNvZGVjIDogQWJvdXQiCitGT05UIDgsICJNUyBTYW5zIFNlcmlmIiwgMCwgMCwgMHgxCitCRUdJTgorICAgIERFRlBVU0hCVVRUT04gICAiT0siLElET0ssNjUsMTgzLDUwLDE0CisgICAgUFVTSEJVVFRPTiAgICAgICJDYW5jZWwiLElEQ0FOQ0VMLDEyNSwxODMsNTAsMTQKKyAgICBHUk9VUEJPWCAgICAgICAgIkVuY29kaW5nIixJRENfU1RBVElDLDcsNywxNDIsMTY2CisgICAgR1JPVVBCT1ggICAgICAgICJEZWNvZGluZyIsSURDX1NUQVRJQ19ERUNPRElORywxNTQsNyw3MCwxMTMsV1NfRElTQUJMRUQKKyAgICBHUk9VUEJPWCAgICAgICAgIkJpdHMiLElEQ19TVEFUSUMsMTYsMTIxLDEyNCw0MgorICAgIENPTlRST0wgICAgICAgICAiQ29weXJpZ2h0IixJRENfQ0hFQ0tfQ09QWVJJR0hULCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8IAorICAgICAgICAgICAgICAgICAgICBCU19GTEFUIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDIzLDEzMiw0NSwxMAorICAgIENPTlRST0wgICAgICAgICAiQ2hlY2tzdW0iLElEQ19DSEVDS19DSEVDS1NVTSwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKKyAgICAgICAgICAgICAgICAgICAgQlNfRkxBVCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCw4NCwxMzIsNDksMTAKKyAgICBDT05UUk9MICAgICAgICAgIk9yaWdpbmFsIixJRENfQ0hFQ0tfT1JJR0lOQUwsIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YIHwgCisgICAgICAgICAgICAgICAgICAgIEJTX0ZMQVQgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsMjMsMTQ4LDM5LDEwCisgICAgQ09OVFJPTCAgICAgICAgICJQcml2YXRlIixJRENfQ0hFQ0tfUFJJVkFURSwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKKyAgICAgICAgICAgICAgICAgICAgQlNfRkxBVCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCw4NCwxNDgsMzgsMTAKKyAgICBDT01CT0JPWCAgICAgICAgSURDX0NPTUJPX0VOQ19TVEVSRU8sNzAsMjEsNjAsNTMsQ0JTX0RST1BET1dOTElTVCB8IAorICAgICAgICAgICAgICAgICAgICBXU19WU0NST0xMIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgICAgTFRFWFQgICAgICAgICAgICJTdGVyZW8gbW9kZSIsSURDX1NUQVRJQywyMywyNCw0MSw4CisgICAgQ09OVFJPTCAgICAgICAgICJTbWFydCBFbmNvZGUiLElEQ19DSEVDS19FTkNfU01BUlQsIkJ1dHRvbiIsCisgICAgICAgICAgICAgICAgICAgIEJTX0FVVE9DSEVDS0JPWCB8IEJTX0ZMQVQgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsNDksMzksCisgICAgICAgICAgICAgICAgICAgIDYxLDEwCisgICAgSUNPTiAgICAgICAgICAgIElESV9JQ09OLElEQ19TVEFUSUNfRU5DX0lDT04sMTc5LDEyOSwyMCwyMAorICAgIENURVhUICAgICAgICAgICAidjAuMC4wIC0gMC4wMCIsSURDX1NUQVRJQ19DT05GSUdfVkVSU0lPTiwxNjgsMTU1LDQzLDE3CisgICAgQ09OVFJPTCAgICAgICAgICJBdmVyYWdlIEJpdFJhdGUiLElEQ19DSEVDS19FTkNfQUJSLCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPQ0hFQ0tCT1ggfCBCU19GTEFUIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDQ5LDUzLAorICAgICAgICAgICAgICAgICAgICA2OCwxMAorICAgIExURVhUICAgICAgICAgICAiTWluIixJRENfU1RBVElDX0FWRVJBR0VfTUlOLDE5LDY3LDEyLDgKKyAgICBMVEVYVCAgICAgICAgICAgIk1heCIsSURDX1NUQVRJQ19BVkVSQUdFX01BWCwxNyw3OSwxNCw4CisgICAgTFRFWFQgICAgICAgICAgICJTdGVwIixJRENfU1RBVElDX0FWRVJBR0VfU1RFUCwxNSw5MSwxNiw4CisgICAgTFRFWFQgICAgICAgICAgICJ0ZXN0IixJRENfU1RBVElDX0FWRVJBR0VfU0FNUExFLDE5LDEwNSwxMiw4CisgICAgQ09OVFJPTCAgICAgICAgICJTbGlkZXIyIixJRENfU0xJREVSX0FWRVJBR0VfTUlOLCJtc2N0bHNfdHJhY2tiYXIzMiIsCisgICAgICAgICAgICAgICAgICAgIFRCU19BVVRPVElDS1MgfCBUQlNfQk9USCB8IFRCU19OT1RJQ0tTIHwgV1NfR1JPVVAgfCAKKyAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUCwzMyw2Nyw5MiwxMQorICAgIENPTlRST0wgICAgICAgICAiU2xpZGVyMyIsSURDX1NMSURFUl9BVkVSQUdFX01BWCwibXNjdGxzX3RyYWNrYmFyMzIiLAorICAgICAgICAgICAgICAgICAgICBUQlNfQVVUT1RJQ0tTIHwgVEJTX0JPVEggfCBUQlNfTk9USUNLUyB8IFdTX0dST1VQIHwgCisgICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AsMzMsNzksOTIsMTEKKyAgICBDT05UUk9MICAgICAgICAgIlNsaWRlcjEiLElEQ19TTElERVJfQVZFUkFHRV9TVEVQLCJtc2N0bHNfdHJhY2tiYXIzMiIsCisgICAgICAgICAgICAgICAgICAgIFRCU19BVVRPVElDS1MgfCBUQlNfQk9USCB8IFRCU19OT1RJQ0tTIHwgV1NfR1JPVVAgfCAKKyAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUCwzMyw5MSw5MiwxMQorICAgIENPTlRST0wgICAgICAgICAiU2xpZGVyNCIsSURDX1NMSURFUl9BVkVSQUdFX1NBTVBMRSwibXNjdGxzX3RyYWNrYmFyMzIiLAorICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QLDMzLDEwNCw5MiwxMgorICAgIENURVhUICAgICAgICAgICAiMDAwIixJRENfU1RBVElDX0FWRVJBR0VfU0FNUExFX1ZBTFVFLDEyNSwxMDUsMTUsOSwwLAorICAgICAgICAgICAgICAgICAgICBXU19FWF9TVEFUSUNFREdFCisgICAgQ1RFWFQgICAgICAgICAgICIwMDAiLElEQ19TVEFUSUNfQVZFUkFHRV9TVEVQX1ZBTFVFLDEyNSw5MiwxNSw5LDAsCisgICAgICAgICAgICAgICAgICAgIFdTX0VYX1NUQVRJQ0VER0UKKyAgICBDVEVYVCAgICAgICAgICAgIjAwMCIsSURDX1NUQVRJQ19BVkVSQUdFX01BWF9WQUxVRSwxMjUsODAsMTUsOSwwLAorICAgICAgICAgICAgICAgICAgICBXU19FWF9TVEFUSUNFREdFCisgICAgQ1RFWFQgICAgICAgICAgICIwMDAiLElEQ19TVEFUSUNfQVZFUkFHRV9NSU5fVkFMVUUsMTI1LDY3LDE1LDksMCwKKyAgICAgICAgICAgICAgICAgICAgV1NfRVhfU1RBVElDRURHRQorRU5ECisKK0lERF9BQk9VVCBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDE4NywgNzcKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJMYW1lIE1QMyBjb2RlYyA6IEFib3V0IgorRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKK0JFR0lOCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywxMzAsNTYsNTAsMTQKKyAgICBMVEVYVCAgICAgICAgICAgIlN0ZXZlIExob21tZSArIExBTUUgZGV2ZWxvcGVycyIsSURDX1NUQVRJQyw3LDMzLDExMiw4CisgICAgTFRFWFQgICAgICAgICAgICJMR1BMIGxpY2Vuc2UiLElEQ19TVEFUSUMsNywyMCw0Myw4CisgICAgSUNPTiAgICAgICAgICAgIElESV9JQ09OLElEQ19TVEFUSUMsMTQ1LDE2LDIwLDIwCisgICAgTFRFWFQgICAgICAgICAgICJTdGF0aWMiLElEQ19TVEFUSUNfQUJPVVRfVElUTEUsNyw3LDE3Myw4CisgICAgTFRFWFQgICAgICAgICAgICJodHRwOi8vd3d3Lm1wM2Rldi5vcmcvIixJRENfU1RBVElDX0FCT1VUX1VSTCw3LDQ3LDgwLDgKKyAgICBMVEVYVCAgICAgICAgICAgImljb24gOiBMdWNhcyBHcmFuaXRvIixJRENfU1RBVElDLDcsNjEsNjQsOAorRU5ECisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBERVNJR05JTkZPCisvLworCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorR1VJREVMSU5FUyBERVNJR05JTkZPIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICBJRERfQ09ORklHLCBESUFMT0cKKyAgICBCRUdJTgorICAgICAgICBMRUZUTUFSR0lOLCA3CisgICAgICAgIFJJR0hUTUFSR0lOLCAyMjQKKyAgICAgICAgVE9QTUFSR0lOLCA3CisgICAgICAgIEJPVFRPTU1BUkdJTiwgMTk3CisgICAgRU5ECisKKyAgICBJRERfQUJPVVQsIERJQUxPRworICAgIEJFR0lOCisgICAgICAgIExFRlRNQVJHSU4sIDcKKyAgICAgICAgUklHSFRNQVJHSU4sIDE4MAorICAgICAgICBUT1BNQVJHSU4sIDcKKyAgICAgICAgQk9UVE9NTUFSR0lOLCA3MAorICAgIEVORAorRU5ECisjZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRAorCisjZW5kaWYgICAgLy8gRnJhbnr2c2lzY2ggKEZyYW5rcmVpY2gpIHJlc291cmNlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisKKyNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4KKy8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNlbmRpZiAgICAvLyBub3QgQVBTVFVESU9fSU5WT0tFRAorCmRpZmYgLS1naXQgYS9BQ00vYWRlYnVnLmggYi9BQ00vYWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlYzE5MgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9hZGVidWcuaApAQCAtMCwwICsxLDM5IEBACisvKioKKyAqCisgKiBMYW1lIEFDTSB3cmFwcGVyLCBlbmNvZGUvZGVjb2RlIE1QMyBiYXNlZCBSSUZGL0FWSSBmaWxlcyBpbiBNUyBXaW5kb3dzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBTdGV2ZSBMaG9tbWUgPHN0ZXZlLmxob21tZSBhdCBmcmVlLmZyPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworIAorLyohCisJXGF1dGhvciBTdGV2ZSBMaG9tbWUKKwlcdmVyc2lvbiBcJElkOiBhZGVidWcuaCx2IDEuMiAyMDAyLzAxLzIyIDE5OjQ1OjAyIHJvYnV4NCBFeHAgJAorKi8KKworI2lmICFkZWZpbmVkKF9ERUJVR19IX19JTkNMVURFRF8pCisjZGVmaW5lIF9ERUJVR19IX19JTkNMVURFRF8KKworI2RlZmluZSBERUJVR19MRVZFTF9DUkVBVElPTiAwCisKKyNkZWZpbmUgREVCVUdfTEVWRUxfTVNHIDAKKyNkZWZpbmUgREVCVUdfTEVWRUxfRlVOQ19TVEFSVCAxCisjZGVmaW5lIERFQlVHX0xFVkVMX0ZVTkNfREVCVUcgMgorI2RlZmluZSBERUJVR19MRVZFTF9GVU5DX0NPREUgMworCisjZW5kaWYgLyogIWRlZmluZWQoX0RFQlVHX0hfX0lOQ0xVREVEXykgKi8KKwpkaWZmIC0tZ2l0IGEvQUNNL2Rkay9NYWtlZmlsZS5hbSBiL0FDTS9kZGsvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4ODk5NwotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9kZGsvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS4xIDIwMDMvMTIvMDkgMTU6NDg6MzcgYWxlaWRpbmdlciBFeHAgJAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCisKK0VYVFJBX0RJU1QgPSBcCisJbXNhY21kcnYuaApkaWZmIC0tZ2l0IGEvQUNNL2Rkay9NYWtlZmlsZS5pbiBiL0FDTS9kZGsvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwOTRjMQotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9kZGsvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNTggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKK3N1YmRpciA9IEFDTS9kZGsKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gMS45IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRVhUUkFfRElTVCA9IFwKKwltc2FjbWRydi5oCisKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIEFDTS9kZGsvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIEFDTS9kZGsvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCisJaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAorCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBlbmQgZ2xvYmFsIHNlY3Rpb24KKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL0FDTS9kZGsvbXNhY21kcnYuaCBiL0FDTS9kZGsvbXNhY21kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNjMjAwCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL2Rkay9tc2FjbWRydi5oCkBAIC0wLDAgKzEsMTg1IEBACisvKioKKyAqCisgKiBBbHRlcm5hdGl2ZSBtc2FjbWRydi5oIGZpbGUsIGZvciB1c2UgaW4gdGhlIExhbWUgcHJvamVjdC4KKyAqIEZpbGUgZnJvbSB0aGUgRkZEc2hvdyBwcm9qZWN0LCByZWxlYXNlZCB1bmRlciBMR1BMIGJ5IHBlcm1pc3Npb24KKyAqIGZyb20gTWlsYW4gQ3V0a2EuCisgKiBNb2RpZmllZCBieSBHYWJyaWVsIEJvdXZpZ25lIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9mIExhbWUuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBNaWxhbiBDdXRrYQorICogIENvcHlyaWdodCAoYykgMjAwMyBHYWJyaWVsIEJvdXZpZ25lCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX01TQUNNRFJWX0hfCisjZGVmaW5lIF9NU0FDTURSVl9IXworCisKKyNpbmNsdWRlIDxtbXJlZy5oPgorI2luY2x1ZGUgPG1zYWNtLmg+CisKKworCit0eXBlZGVmICB1bnNpZ25lZCBsb25nIFVMT05HX1BUUiwgKlBVTE9OR19QVFI7CisKKworCit0eXBlZGVmIFVMT05HX1BUUiBEV09SRF9QVFIsICpQRFdPUkRfUFRSOworCisKKyN1bmRlZiBBQ01EUklWRVJERVRBSUxTCisjdW5kZWYgUEFDTURSSVZFUkRFVEFJTFMKKyN1bmRlZiBMUEFDTURSSVZFUkRFVEFJTFMKKworI2RlZmluZSBBQ01EUklWRVJERVRBSUxTICAgICAgICBBQ01EUklWRVJERVRBSUxTVworI2RlZmluZSBQQUNNRFJJVkVSREVUQUlMUyAgICAgICBQQUNNRFJJVkVSREVUQUlMU1cKKyNkZWZpbmUgTFBBQ01EUklWRVJERVRBSUxTICAgICAgTFBBQ01EUklWRVJERVRBSUxTVworCisjdW5kZWYgQUNNRk9STUFUVEFHREVUQUlMUworI3VuZGVmIFBBQ01GT1JNQVRUQUdERVRBSUxTCisjdW5kZWYgTFBBQ01GT1JNQVRUQUdERVRBSUxTCisKKyNkZWZpbmUgQUNNRk9STUFUVEFHREVUQUlMUyAgICAgQUNNRk9STUFUVEFHREVUQUlMU1cKKyNkZWZpbmUgUEFDTUZPUk1BVFRBR0RFVEFJTFMgICAgUEFDTUZPUk1BVFRBR0RFVEFJTFNXCisjZGVmaW5lIExQQUNNRk9STUFUVEFHREVUQUlMUyAgIExQQUNNRk9STUFUVEFHREVUQUlMU1cKKworI3VuZGVmIEFDTUZPUk1BVERFVEFJTFMKKyN1bmRlZiBQQUNNRk9STUFUREVUQUlMUworI3VuZGVmIExQQUNNRk9STUFUREVUQUlMUworCisjZGVmaW5lIEFDTUZPUk1BVERFVEFJTFMJQUNNRk9STUFUREVUQUlMU1cKKyNkZWZpbmUgUEFDTUZPUk1BVERFVEFJTFMJUEFDTUZPUk1BVERFVEFJTFNXCisjZGVmaW5lIExQQUNNRk9STUFUREVUQUlMUwlMUEFDTUZPUk1BVERFVEFJTFNXCisKKworI2RlZmluZSBNQUtFX0FDTV9WRVJTSU9OKG1qciwgbW5yLCBibGQpICgoKGxvbmcpKG1qcik8PDI0KXwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKG1ucik8PDE2KXwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcpYmxkKSkKKworI2RlZmluZSBWRVJTSU9OX01TQUNNICAgICAgIE1BS0VfQUNNX1ZFUlNJT04oMywgNTAsIDApCisjZGVmaW5lIFZFUlNJT05fQUNNX0RSSVZFUiAgTUFLRV9BQ01fVkVSU0lPTig0LCAgMCwgMCkKKworCisjZGVmaW5lIEFDTURNX0RSSVZFUl9OT1RJRlkgICAgICAgICAgICAgKEFDTURNX0JBU0UgKyAxKQorI2RlZmluZSBBQ01ETV9EUklWRVJfREVUQUlMUyAgICAgICAgICAgIChBQ01ETV9CQVNFICsgMTApCisKKyNkZWZpbmUgQUNNRE1fSEFSRFdBUkVfV0FWRV9DQVBTX0lOUFVUICAoQUNNRE1fQkFTRSArIDIwKQorI2RlZmluZSBBQ01ETV9IQVJEV0FSRV9XQVZFX0NBUFNfT1VUUFVUIChBQ01ETV9CQVNFICsgMjEpCisKKyNkZWZpbmUgQUNNRE1fRk9STUFUVEFHX0RFVEFJTFMgICAgICAgICAoQUNNRE1fQkFTRSArIDI1KQorI2RlZmluZSBBQ01ETV9GT1JNQVRfREVUQUlMUyAgICAgICAgICAgIChBQ01ETV9CQVNFICsgMjYpCisjZGVmaW5lIEFDTURNX0ZPUk1BVF9TVUdHRVNUICAgICAgICAgICAgKEFDTURNX0JBU0UgKyAyNykKKworI2RlZmluZSBBQ01ETV9GSUxURVJUQUdfREVUQUlMUyAgICAgICAgIChBQ01ETV9CQVNFICsgNTApCisjZGVmaW5lIEFDTURNX0ZJTFRFUl9ERVRBSUxTICAgICAgICAgICAgKEFDTURNX0JBU0UgKyA1MSkKKworI2RlZmluZSBBQ01ETV9TVFJFQU1fT1BFTiAgICAgICAgICAgICAgIChBQ01ETV9CQVNFICsgNzYpCisjZGVmaW5lIEFDTURNX1NUUkVBTV9DTE9TRSAgICAgICAgICAgICAgKEFDTURNX0JBU0UgKyA3NykKKyNkZWZpbmUgQUNNRE1fU1RSRUFNX1NJWkUgICAgICAgICAgICAgICAoQUNNRE1fQkFTRSArIDc4KQorI2RlZmluZSBBQ01ETV9TVFJFQU1fQ09OVkVSVCAgICAgICAgICAgIChBQ01ETV9CQVNFICsgNzkpCisjZGVmaW5lIEFDTURNX1NUUkVBTV9SRVNFVCAgICAgICAgICAgICAgKEFDTURNX0JBU0UgKyA4MCkKKyNkZWZpbmUgQUNNRE1fU1RSRUFNX1BSRVBBUkUgICAgICAgICAgICAoQUNNRE1fQkFTRSArIDgxKQorI2RlZmluZSBBQ01ETV9TVFJFQU1fVU5QUkVQQVJFICAgICAgICAgIChBQ01ETV9CQVNFICsgODIpCisKK3R5cGVkZWYgc3RydWN0IHRBQ01EUlZGT1JNQVRTVUdHRVNUCit7CisgICAgRFdPUkQgICAgICAgICAgICAgICBjYlN0cnVjdDsgICAgICAgICAgIC8vIHNpemVvZihBQ01EUlZGT1JNQVRTVUdHRVNUKQorICAgIERXT1JEICAgICAgICAgICAgICAgZmR3U3VnZ2VzdDsgICAgICAgICAvLyBTdWdnZXN0IGZsYWdzCisgICAgTFBXQVZFRk9STUFURVggICAgICBwd2Z4U3JjOyAgICAgICAgICAgIC8vIFNvdXJjZSBGb3JtYXQKKyAgICBEV09SRCAgICAgICAgICAgICAgIGNid2Z4U3JjOyAgICAgICAgICAgLy8gU291cmNlIFNpemUKKyAgICBMUFdBVkVGT1JNQVRFWCAgICAgIHB3ZnhEc3Q7ICAgICAgICAgICAgLy8gRGVzdCBmb3JtYXQKKyAgICBEV09SRCAgICAgICAgICAgICAgIGNid2Z4RHN0OyAgICAgICAgICAgLy8gRGVzdCBTaXplCisKK30gQUNNRFJWRk9STUFUU1VHR0VTVCwgKlBBQ01EUlZGT1JNQVRTVUdHRVNULCBGQVIgKkxQQUNNRFJWRk9STUFUU1VHR0VTVDsKKworCisKKwordHlwZWRlZiBzdHJ1Y3QgdEFDTURSVk9QRU5ERVNDCit7CisgICAgRFdPUkQgICAgICAgICAgIGNiU3RydWN0OyAgICAgICAvLyBzaXplb2YoQUNNRFJWT1BFTkRFU0MpCisgICAgRk9VUkNDICAgICAgICAgIGZjY1R5cGU7ICAgICAgICAvLyAnYXVkYycKKyAgICBGT1VSQ0MgICAgICAgICAgZmNjQ29tcDsgICAgICAgIC8vIHN1Yi10eXBlIChub3QgdXNlZC0tbXVzdCBiZSAwKQorICAgIERXT1JEICAgICAgICAgICBkd1ZlcnNpb247ICAgICAgLy8gY3VycmVudCB2ZXJzaW9uIG9mIEFDTSBvcGVuaW5nIHlvdQorICAgIERXT1JEICAgICAgICAgICBkd0ZsYWdzOyAgICAgICAgLy8KKyAgICBEV09SRCAgICAgICAgICAgZHdFcnJvcjsgICAgICAgIC8vIHJlc3VsdCBmcm9tIERSVl9PUEVOIHJlcXVlc3QKKyAgICBMUENXU1RSICAgICAgICAgcHN6U2VjdGlvbk5hbWU7IC8vIHNlZSBEUlZDT05GSUdJTkZPLmxwc3pEQ0lTZWN0aW9uTmFtZQorICAgIExQQ1dTVFIgICAgICAgICBwc3pBbGlhc05hbWU7ICAgLy8gc2VlIERSVkNPTkZJR0lORk8ubHBzekRDSUFsaWFzTmFtZQorICAgIERXT1JEICAgICAgICAgICBkbkRldk5vZGU7CSAgICAvLyBkZXZub2RlIGlkIGZvciBwbnAgZHJpdmVycy4KKworfSBBQ01EUlZPUEVOREVTQywgKlBBQ01EUlZPUEVOREVTQywgRkFSICpMUEFDTURSVk9QRU5ERVNDOworCisKK3R5cGVkZWYgc3RydWN0IHRBQ01EUlZTVFJFQU1JTlNUQU5DRQoreworICAgIERXT1JEICAgICAgICAgICAgICAgY2JTdHJ1Y3Q7CisgICAgTFBXQVZFRk9STUFURVggICAgICBwd2Z4U3JjOworICAgIExQV0FWRUZPUk1BVEVYICAgICAgcHdmeERzdDsKKyAgICBMUFdBVkVGSUxURVIgICAgICAgIHB3Zmx0cjsKKyAgICBEV09SRF9QVFIgICAgICAgICAgIGR3Q2FsbGJhY2s7CisgICAgRFdPUkRfUFRSICAgICAgICAgICBkd0luc3RhbmNlOworICAgIERXT1JEICAgICAgICAgICAgICAgZmR3T3BlbjsKKyAgICBEV09SRCAgICAgICAgICAgICAgIGZkd0RyaXZlcjsKKyAgICBEV09SRF9QVFIgICAgICAgICAgIGR3RHJpdmVyOworICAgIEhBQ01TVFJFQU0gICAgICAgICAgaGFzOworCit9IEFDTURSVlNUUkVBTUlOU1RBTkNFLCAqUEFDTURSVlNUUkVBTUlOU1RBTkNFLCBGQVIgKkxQQUNNRFJWU1RSRUFNSU5TVEFOQ0U7CisKK3R5cGVkZWYgc3RydWN0IHRBQ01EUlZTVFJFQU1TSVpFCit7CisgICAgRFdPUkQgICAgICAgICAgICAgICBjYlN0cnVjdDsKKyAgICBEV09SRCAgICAgICAgICAgICAgIGZkd1NpemU7CisgICAgRFdPUkQgICAgICAgICAgICAgICBjYlNyY0xlbmd0aDsKKyAgICBEV09SRCAgICAgICAgICAgICAgIGNiRHN0TGVuZ3RoOworCit9IEFDTURSVlNUUkVBTVNJWkUsICpQQUNNRFJWU1RSRUFNU0laRSwgRkFSICpMUEFDTURSVlNUUkVBTVNJWkU7CisKK3R5cGVkZWYgc3RydWN0IHRBQ01EUlZTVFJFQU1IRUFERVIgRkFSICpMUEFDTURSVlNUUkVBTUhFQURFUjsKK3R5cGVkZWYgc3RydWN0IHRBQ01EUlZTVFJFQU1IRUFERVIKK3sKKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICBjYlN0cnVjdDsKKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICBmZHdTdGF0dXM7CisgICAgRFdPUkRfUFRSICAgICAgICAgICAgICAgZHdVc2VyOworICAgIExQQllURSAgICAgICAgICAgICAgICAgIHBiU3JjOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGNiU3JjTGVuZ3RoOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGNiU3JjTGVuZ3RoVXNlZDsKKyAgICBEV09SRF9QVFIgICAgICAgICAgICAgICBkd1NyY1VzZXI7CisgICAgTFBCWVRFICAgICAgICAgICAgICAgICAgcGJEc3Q7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgY2JEc3RMZW5ndGg7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgY2JEc3RMZW5ndGhVc2VkOworICAgIERXT1JEX1BUUiAgICAgICAgICAgICAgIGR3RHN0VXNlcjsKKworICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGZkd0NvbnZlcnQ7ICAgICAvLyBmbGFncyBwYXNzZWQgZnJvbSBjb252ZXJ0IGZ1bmMKKyAgICBMUEFDTURSVlNUUkVBTUhFQURFUiAgICBwYWRzaE5leHQ7ICAgICAgLy8gZm9yIGFzeW5jIGRyaXZlciBxdWV1ZWluZworICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGZkd0RyaXZlcjsgICAgICAvLyBkcml2ZXIgaW5zdGFuY2UgZmxhZ3MKKyAgICBEV09SRF9QVFIgICAgICAgICAgICAgICBkd0RyaXZlcjsgICAgICAgLy8gZHJpdmVyIGluc3RhbmNlIGRhdGEKKworICAgIC8vCisgICAgLy8gIGFsbCByZW1haW5pbmcgZmllbGRzIGFyZSB1c2VkIGJ5IHRoZSBBQ00gZm9yIGJvb2trZWVwaW5nIHB1cnBvc2VzLgorICAgIC8vICBhbiBBQ00gZHJpdmVyIHNob3VsZCBuZXZlciB1c2UgdGhlc2UgZmllbGRzICh0aG91Z2ggdGhhbiBjYW4gYmUKKyAgICAvLyAgaGVscGZ1bCBmb3IgZGVidWdnaW5nKS0tbm90ZSB0aGF0IHRoZSBtZWFuaW5nIG9mIHRoZXNlIGZpZWxkcworICAgIC8vICBtYXkgY2hhbmdlLCBzbyBkbyBOT1QgcmVseSBvbiB0aGVtIGluIHNoaXBwaW5nIGNvZGUuCisgICAgLy8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICBmZHdQcmVwYXJlZDsKKyAgICBEV09SRF9QVFIgICAgICAgICAgICAgICBkd1ByZXBhcmVkOworICAgIExQQllURSAgICAgICAgICAgICAgICAgIHBiUHJlcGFyZWRTcmM7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgY2JQcmVwYXJlZFNyY0xlbmd0aDsKKyAgICBMUEJZVEUgICAgICAgICAgICAgICAgICBwYlByZXBhcmVkRHN0OworICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGNiUHJlcGFyZWREc3RMZW5ndGg7CisKK30gQUNNRFJWU1RSRUFNSEVBREVSLCAqUEFDTURSVlNUUkVBTUhFQURFUjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9BQ00vbGFtZS5pY28gYi9BQ00vbGFtZS5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxMGI4YwotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9sYW1lLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9BQ00vbGFtZUFDTS5kZWYgYi9BQ00vbGFtZUFDTS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlMDMxZgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9sYW1lQUNNLmRlZgpAQCAtMCwwICsxLDI1IEBACis7IExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKzsKKzsgIENvcHlyaWdodCAoYykgMjAwMiBTdGV2ZSBMaG9tbWUgPHN0ZXZlLmxob21tZSBhdCBmcmVlLmZyPgorOworOyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOworOyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsKKzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7IEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworTElCUkFSWSAgICAgbGFtZUFDTS5BQ00KKworOyBERVNDUklQVElPTiAnbGFtZUFDTS5hY206IE1QMyBMYW1lIEFDTSBDb2RlYycKKworRVhQT1JUUyAgICAgRHJpdmVyUHJvYworCis7IEVPRgpkaWZmIC0tZ2l0IGEvQUNNL2xhbWVBQ01fdmM2LmRzcCBiL0FDTS9sYW1lQUNNX3ZjNi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1NTY1OAotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9sYW1lQUNNX3ZjNi5kc3AKQEAgLTAsMCArMSwxODcgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibGFtZUFDTSIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIE5JQ0hUIEJFQVJCRUlURU4gKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyDQorDQorQ0ZHPUxBTUVBQ00gLSBXSU4zMiBSRUxFQVNFDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJsYW1lQUNNX3ZjNi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImxhbWVBQ01fdmM2Lm1hayIgQ0ZHPSJMQU1FQUNNIC0gV0lOMzIgUkVMRUFTRSINCishTUVTU0FHRSANCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJsYW1lQUNNIC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgImxhbWVBQ00gLSBXaW4zMiBEZWJ1ZyIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorTVRMPW1pZGwuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxhbWVBQ00gLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlXGxhbWVBQ00iDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDENCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1pwMiAvTVQgL1czIC9HWCAvT2IyIC9JICIuLi9saWJtcDNsYW1lIiAvSSAiLi4vaW5jbHVkZSIgL0kgIi4uIiAvSSAiLi4vLi4iIC9JICIuLi9tcGdsaWIiIC9JICIuLyIgL0kgIi4vZGRrIiAvRCAiTkRFQlVHIiAvRCAiX0JMQURFRExMIiAvRCAiX1dJTkRPV1MiIC9EICJXSU4zMiIgL0QgIk5PQU5BTFlTSVMiIC9EICJMQU1FX0FDTSIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIC93aW4zMiAiTlVMIg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyAvd2luMzIgIk5VTCINCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBsaWJtcDNsYW1lLmxpYiBzaGVsbDMyLmxpYiB1cmwubGliIGdkaTMyLmxpYiB3aW5tbS5saWIgYWR2YXBpMzIubGliIHVzZXIzMi5saWIga2VybmVsMzIubGliIGxpYmMubGliIGxpYmNwLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2IC9ub2RlZmF1bHRsaWIgL2RlZjoiLlxsYW1lQUNNLmRlZiIgL291dDoiLi5cb3V0cHV0XFJlbGVhc2VcbGFtZUFDTS5hY20iIC9saWJwYXRoOiIuLlxvdXRwdXRcUmVsZWFzZSIgL29wdDpOT1dJTjk4DQorIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCitUYXJnZXREaXI9XGN2c1xsYW1lLTM5OGI0XGxhbWVcb3V0cHV0XFJlbGVhc2UNCitTT1VSQ0U9IiQoSW5wdXRQYXRoKSINCitQb3N0QnVpbGRfRGVzYz1BQ00gY29uZmlnIGZpbGVzDQorUG9zdEJ1aWxkX0NtZHM9Y29weSBsYW1lYWNtLmluZiAkKFRhcmdldERpcilcKi4qCWNvcHkgbGFtZV9hY20ueG1sICQoVGFyZ2V0RGlyKVwqLioNCisjIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGFtZUFDTSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxvdXRwdXRcRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxEZWJ1Z1xsYW1lQUNNIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAxDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9acDIgL01UZCAvVzMgL0dYIC9aSSAvT2QgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4iIC9JICIuLi8uLiIgL0kgIi4uL21wZ2xpYiIgL0kgIi4vIiAvSSAiLi9kZGsiIC9EICJfREVCVUciIC9EICJfQkxBREVETEwiIC9EICJfV0lORE9XUyIgL0QgIldJTjMyIiAvRCAiTk9BTkFMWVNJUyIgL0QgIkxBTUVfQUNNIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gL3dpbjMyICJOVUwiDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIC93aW4zMiAiTlVMIg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGxpYm1wM2xhbWUubGliIHNoZWxsMzIubGliIHVybC5saWIgZ2RpMzIubGliIHdpbm1tLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiBrZXJuZWwzMi5saWIgbGliY2QubGliIGxpYmNwZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvbm9kZWZhdWx0bGliIC9kZWY6Ii5cbGFtZUFDTS5kZWYiIC9vdXQ6Ii4uXG91dHB1dFxEZWJ1Z1xsYW1lQUNNLmFjbSIgL3BkYnR5cGU6c2VwdCAvbGlicGF0aDoiLi5cb3V0cHV0XERlYnVnIiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUgL2luY3JlbWVudGFsOm5vDQorIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCitUYXJnZXREaXI9XGN2c1xsYW1lLTM5OGI0XGxhbWVcb3V0cHV0XERlYnVnDQorU09VUkNFPSIkKElucHV0UGF0aCkiDQorUG9zdEJ1aWxkX0Rlc2M9QUNNIGNvbmZpZyBmaWxlcw0KK1Bvc3RCdWlsZF9DbWRzPWNvcHkgbGFtZWFjbS5pbmYgJChUYXJnZXREaXIpXCouKgljb3B5IGxhbWVfYWNtLnhtbCAkKFRhcmdldERpcilcKi4qDQorIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJsYW1lQUNNIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgImxhbWVBQ00gLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjO2NwcCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQUNNLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEFDTVN0cmVhbS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxBRW5jb2RlUHJvcGVydGllcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxEZWNvZGVTdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGFtZUFDTS5kZWYNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxtYWluLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJJbmNsdWRlIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQUNNLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxBQ01TdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGFkZWJ1Zy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQUVuY29kZVByb3BlcnRpZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXERlY29kZVN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAicmMiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGFjbS5yYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxhbWUuaWNvDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkluc3RhbGwiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpbmY7YWNtIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxMYW1lQUNNLmluZg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVhZG1lLnR4dA0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFRPRE8NCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9BQ00vbGFtZUFDTV92YzcudmNwcm9qIGIvQUNNL2xhbWVBQ01fdmM3LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJjNTVmCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL2xhbWVBQ01fdmM3LnZjcHJvagpAQCAtMCwwICsxLDExOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJsYW1lQUNNIg0KKwlQcm9qZWN0R1VJRD0iezg4QTBDRDcwLUU1NzYtNDU2Qi05QzEzLTFENkFEODM4Qjg3RX0iDQorCVNjY1Byb2plY3ROYW1lPSIiDQorCVNjY0xvY2FsUGF0aD0iIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnIE5BU018V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnX05BU00iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnX05BU00iDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2xpYm1wM2xhbWUsLi4vaW5jbHVkZSwuLiwuLi8uLiwuLi9tcGdsaWIsLi8iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7SEFWRV9OQVNNO01NWF9jaG9vc2VfdGFibGU7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ00iDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlTdHJ1Y3RNZW1iZXJBbGlnbm1lbnQ9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWdfTkFTTS9sYW1lQUNNX3ZjNi5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Z19OQVNNLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Z19OQVNNLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWdfTkFTTS8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ig0KKwkJCQlDb21waWxlQXM9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0idXJsLmxpYiB3aW5tbS5saWIgbGliY2QubGliIGxpYmNwZC5saWIgQURiZy9EZWJ1Zy9hZGJnLmxpYiB0aW55eG1sL0RlYnVnL3Rpbnl4bWwubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxvdXRwdXRcbGFtZUFDTS5hY20iDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlxsYW1lQUNNLmRlZiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnX05BU00vbGFtZUFDTS5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxEZWJ1Z19OQVNNL2xhbWVBQ00ubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWdfTkFTTS9sYW1lQUNNX3ZjNi50bGIiDQorCQkJCUhlYWRlckZpbGVOYW1lPSIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgbGFtZWFjbS5pbmYgLi5cb3V0cHV0XCouKg0KK2NvcHkgbGFtZV9hY20ueG1sIC4uXG91dHB1dFwqLioNCisiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQlHbG9iYWxPcHRpbWl6YXRpb25zPSJUUlVFIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiINCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSwuLi9pbmNsdWRlLC4uLC4uLy4uLC4uL21wZ2xpYiwuLyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVN0cnVjdE1lbWJlckFsaWdubWVudD0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL2xhbWVBQ01fdmM2LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ1cmwubGliIHdpbm1tLmxpYiBsaWJjLmxpYiBsaWJjcC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXG91dHB1dFxsYW1lQUNNLmFjbSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9IlRSVUUiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXGxhbWVBQ00uZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2UvbGFtZUFDTS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0iVFJVRSINCisJCQkJTWFwRmlsZU5hbWU9Ii5cUmVsZWFzZS9sYW1lQUNNLm1hcCINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXFJlbGVhc2UvbGFtZUFDTS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9IlRSVUUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL2xhbWVBQ01fdmM2LnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iY29weSBsYW1lYWNtLmluZiAuLlxvdXRwdXRcKi4qDQorY29weSBsYW1lX2FjbS54bWwgLi5cb3V0cHV0XCouKg0KKyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZV9OQVNNIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlX05BU00iDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCUdsb2JhbE9wdGltaXphdGlvbnM9IlRSVUUiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIg0KKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4sLi4vLi4sLi4vbXBnbGliLC4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2VfTkFTTS9sYW1lQUNNX3ZjNi5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlX05BU00vIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2VfTkFTTS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2VfTkFTTS8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlDb21waWxlQXM9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0idXJsLmxpYiB3aW5tbS5saWIgbGliYy5saWIgbGliY3AubGliIEFEYmdcUmVsZWFzZVxhZGJnLmxpYiB0aW55eG1sL1JlbGVhc2UvdGlueXhtbC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXG91dHB1dFxsYW1lQUNNLmFjbSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9IlRSVUUiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXGxhbWVBQ00uZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2VfTkFTTS9sYW1lQUNNLnBkYiINCisJCQkJR2VuZXJhdGVNYXBGaWxlPSJUUlVFIg0KKwkJCQlNYXBGaWxlTmFtZT0iLlxSZWxlYXNlX05BU00vbGFtZUFDTS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxSZWxlYXNlX05BU00vbGFtZUFDTS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9IlRSVUUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlX05BU00vbGFtZUFDTV92YzYudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5IGxhbWVhY20uaW5mIC4uXG91dHB1dFwqLioNCitjb3B5IGxhbWVfYWNtLnhtbCAuLlxvdXRwdXRcKi4qDQorIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSwuLi9pbmNsdWRlLC4uLC4uLy4uLC4uL21wZ2xpYiwuLyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTSINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCVN0cnVjdE1lbWJlckFsaWdubWVudD0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy9sYW1lQUNNX3ZjNi5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ig0KKwkJCQlDb21waWxlQXM9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0idXJsLmxpYiB3aW5tbS5saWIgbGliY2QubGliIGxpYmNwZC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXG91dHB1dFxsYW1lQUNNLmFjbSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9IlRSVUUiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXGxhbWVBQ00uZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvbGFtZUFDTS5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxEZWJ1Zy9sYW1lQUNNLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0iVFJVRSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL2xhbWVBQ01fdmM2LnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iY29weSBsYW1lYWNtLmluZiAuLlxvdXRwdXRcKi4qDQorY29weSBsYW1lX2FjbS54bWwgLi5cb3V0cHV0XCouKg0KKyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkxBTUUgZGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4sLi4vLi4sLi4vbXBnbGliLC4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL2xhbWVBQ01fdmM2LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ1cmwubGliIHdpbm1tLmxpYiBsaWJjZC5saWIgbGliY3BkLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cb3V0cHV0XGxhbWVBQ00uYWNtIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii5cbGFtZUFDTS5kZWYiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy9sYW1lQUNNLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXERlYnVnL2xhbWVBQ00ubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvbGFtZUFDTV92YzYudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5IGxhbWVhY20uaW5mIC4uXG91dHB1dFwqLioNCitjb3B5IGxhbWVfYWNtLnhtbCAuLlxvdXRwdXRcKi4qDQorIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iTEFNRSByZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSwuLi9pbmNsdWRlLC4uLC4uLy4uLC4uL21wZ2xpYiwuLyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTSINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCVN0cnVjdE1lbWJlckFsaWdubWVudD0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy9sYW1lQUNNX3ZjNi5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ig0KKwkJCQlDb21waWxlQXM9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0idXJsLmxpYiB3aW5tbS5saWIgbGliY2QubGliIGxpYmNwZC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXG91dHB1dFxsYW1lQUNNLmFjbSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9IlRSVUUiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXGxhbWVBQ00uZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvbGFtZUFDTS5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxEZWJ1Zy9sYW1lQUNNLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0iVFJVRSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL2xhbWVBQ01fdmM2LnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iY29weSBsYW1lYWNtLmluZiAuLlxvdXRwdXRcKi4qDQorY29weSBsYW1lX2FjbS54bWwgLi5cb3V0cHV0XCouKg0KKyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkxBTUUgcmVsZWFzZSBOYXNtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMyINCisJCQkJR2xvYmFsT3B0aW1pemF0aW9ucz0iVFJVRSINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiDQorCQkJCUZhdm9yU2l6ZU9yU3BlZWQ9IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2xpYm1wM2xhbWUsLi4vaW5jbHVkZSwuLiwuLi8uLiwuLi9tcGdsaWIsLi8iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ00iDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlTdHJ1Y3RNZW1iZXJBbGlnbm1lbnQ9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9sYW1lQUNNX3ZjNi5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyINCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlDb21waWxlQXM9IjAiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0idXJsLmxpYiB3aW5tbS5saWIgbGliYy5saWIgbGliY3AubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxvdXRwdXRcbGFtZUFDTS5hY20iDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJUUlVFIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlxsYW1lQUNNLmRlZiINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL2xhbWVBQ00ucGRiIg0KKwkJCQlHZW5lcmF0ZU1hcEZpbGU9IlRSVUUiDQorCQkJCU1hcEZpbGVOYW1lPSIuXFJlbGVhc2UvbGFtZUFDTS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iLlxSZWxlYXNlL2xhbWVBQ00ubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cUmVsZWFzZS9sYW1lQUNNX3ZjNi50bGIiDQorCQkJCUhlYWRlckZpbGVOYW1lPSIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgbGFtZWFjbS5pbmYgLi5cb3V0cHV0XCouKg0KK2NvcHkgbGFtZV9hY20ueG1sIC4uXG91dHB1dFwqLioNCisiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJkbGwgZGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4sLi4vLi4sLi4vbXBnbGliLC4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL2xhbWVBQ01fdmM2LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ1cmwubGliIHdpbm1tLmxpYiBsaWJjZC5saWIgbGliY3BkLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cb3V0cHV0XGxhbWVBQ00uYWNtIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii5cbGFtZUFDTS5kZWYiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy9sYW1lQUNNLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXERlYnVnL2xhbWVBQ00ubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvbGFtZUFDTV92YzYudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5IGxhbWVhY20uaW5mIC4uXG91dHB1dFwqLioNCitjb3B5IGxhbWVfYWNtLnhtbCAuLlxvdXRwdXRcKi4qDQorIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iZGxsIHJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4sLi4vLi4sLi4vbXBnbGliLC4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL2xhbWVBQ01fdmM2LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJCUNvbXBpbGVBcz0iMCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ1cmwubGliIHdpbm1tLmxpYiBsaWJjZC5saWIgbGliY3BkLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cb3V0cHV0XGxhbWVBQ00uYWNtIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii5cbGFtZUFDTS5kZWYiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy9sYW1lQUNNLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXERlYnVnL2xhbWVBQ00ubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJUUlVFIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvbGFtZUFDTV92YzYudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5IGxhbWVhY20uaW5mIC4uXG91dHB1dFwqLioNCitjb3B5IGxhbWVfYWNtLnhtbCAuLlxvdXRwdXRcKi4qDQorIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iZGxsIHJlbGVhc2UgTmFzbXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCUdsb2JhbE9wdGltaXphdGlvbnM9IlRSVUUiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIg0KKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4sLi4vLi4sLi4vbXBnbGliLC4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIyIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvbGFtZUFDTV92YzYucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJQ29tcGlsZUFzPSIwIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9InVybC5saWIgd2lubW0ubGliIGxpYmMubGliIGxpYmNwLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cb3V0cHV0XGxhbWVBQ00uYWNtIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iVFJVRSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii5cbGFtZUFDTS5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS9sYW1lQUNNLnBkYiINCisJCQkJR2VuZXJhdGVNYXBGaWxlPSJUUlVFIg0KKwkJCQlNYXBGaWxlTmFtZT0iLlxSZWxlYXNlL2xhbWVBQ00ubWFwIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cUmVsZWFzZS9sYW1lQUNNLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0iVFJVRSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvbGFtZUFDTV92YzYudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5IGxhbWVhY20uaW5mIC4uXG91dHB1dFwqLioNCitjb3B5IGxhbWVfYWNtLnhtbCAuLlxvdXRwdXRcKi4qDQorIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSINCisJCQlGaWx0ZXI9ImM7Y3BwIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9IkFDTS5jcHAiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnIE5BU018V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztIQVZFX05BU007TU1YX2Nob29zZV90YWJsZTtfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZSBOQVNNfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7SEFWRV9OQVNNO01NWF9jaG9vc2VfdGFibGU7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJMQU1FIGRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iTEFNRSByZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iTEFNRSByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMyINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJkbGwgZGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJkbGwgcmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9ImRsbCByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMyINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJBQ01TdHJlYW0uY3BwIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBOQVNNfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7SEFWRV9OQVNNO01NWF9jaG9vc2VfdGFibGU7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iTEFNRSBkZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkxBTUUgcmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkxBTUUgcmVsZWFzZSBOYXNtfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iZGxsIGRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iZGxsIHJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJkbGwgcmVsZWFzZSBOYXNtfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iQUVuY29kZVByb3BlcnRpZXMuY3BwIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBOQVNNfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7SEFWRV9OQVNNO01NWF9jaG9vc2VfdGFibGU7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iTEFNRSBkZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkxBTUUgcmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkxBTUUgcmVsZWFzZSBOYXNtfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iZGxsIGRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iZGxsIHJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJkbGwgcmVsZWFzZSBOYXNtfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjMiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iRGVjb2RlU3RyZWFtLmNwcCI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWcgTkFTTXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMyINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlIE5BU018V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMyINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztIQVZFX05BU007TU1YX2Nob29zZV90YWJsZTtfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkxBTUUgZGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJMQU1FIHJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJMQU1FIHJlbGVhc2UgTmFzbXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9ImRsbCBkZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9ImRsbCByZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iZGxsIHJlbGVhc2UgTmFzbXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9ImxhbWVBQ00uZGVmIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJtYWluLmNwcCI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWcgTkFTTXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMyINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlIE5BU018V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMyINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztIQVZFX05BU007TU1YX2Nob29zZV90YWJsZTtfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkxBTUUgZGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJMQU1FIHJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQkxBREVETEw7VEFLRUhJUk9fSUVFRTc1NF9IQUNLO0hBVkVfQ09ORklHX0g7SEFWRV9NUEdMSUI7X1dJTkRPV1M7V0lOMzI7Tk9BTkFMWVNJUztMQU1FX0FDTTskKE5vSW5oZXJpdCkiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJMQU1FIHJlbGVhc2UgTmFzbXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9ImRsbCBkZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9ImRsbCByZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X0JMQURFRExMO1RBS0VISVJPX0lFRUU3NTRfSEFDSztIQVZFX0NPTkZJR19IO0hBVkVfTVBHTElCO19XSU5ET1dTO1dJTjMyO05PQU5BTFlTSVM7TEFNRV9BQ007JChOb0luaGVyaXQpIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iZGxsIHJlbGVhc2UgTmFzbXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT3B0aW1pemF0aW9uPSIzIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19CTEFERURMTDtUQUtFSElST19JRUVFNzU0X0hBQ0s7SEFWRV9DT05GSUdfSDtIQVZFX01QR0xJQjtfV0lORE9XUztXSU4zMjtOT0FOQUxZU0lTO0xBTUVfQUNNOyQoTm9Jbmhlcml0KSIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkluY2x1ZGUiDQorCQkJRmlsdGVyPSJoIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9IkFDTS5oIj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJBQ01TdHJlYW0uaCI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iYWRlYnVnLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9IkFFbmNvZGVQcm9wZXJ0aWVzLmgiPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9IkRlY29kZVN0cmVhbS5oIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSINCisJCQlGaWx0ZXI9InJjIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9ImFjbS5yYyI+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ibGFtZS5pY28iPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9Ikluc3RhbGwiDQorCQkJRmlsdGVyPSJpbmY7YWNtIj4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9IkxhbWVBQ00uaW5mIj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSJyZWFkbWUudHh0Ij4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSJUT0RPIj4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvQUNNL2xhbWVfYWNtLnhtbCBiL0FDTS9sYW1lX2FjbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjNTE4NgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9sYW1lX2FjbS54bWwKQEAgLTAsMCArMSwxMyBAQAorPGxhbWVfYWNtPgorICAgIDxlbmNvZGluZ3MgZGVmYXVsdD0iQ3VycmVudCI+CisgICAgICAgIDxjb25maWcgbmFtZT0iQ3VycmVudCI+CisgICAgICAgICAgICA8U21hcnQgdXNlPSJ0cnVlIiAvPgorICAgICAgICAgICAgPENvcHlyaWdodCB1c2U9InRydWUiIC8+CisgICAgICAgICAgICA8Q1JDIHVzZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgIDxPcmlnaW5hbCB1c2U9ImZhbHNlIiAvPgorICAgICAgICAgICAgPFByaXZhdGUgdXNlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgIDxDaGFubmVsIG1vZGU9IkpvaW50LXN0ZXJlbyIgLz4KKyAgICAgICAgICAgIDxBQlIgdXNlPSJ0cnVlIiBtaW49Ijg4IiBtYXg9IjE2MCIgc3RlcD0iNiIgLz4KKyAgICAgICAgPC9jb25maWc+CisgICAgPC9lbmNvZGluZ3M+Cis8L2xhbWVfYWNtPgpkaWZmIC0tZ2l0IGEvQUNNL21haW4uY3BwIGIvQUNNL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTQ3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vbWFpbi5jcHAKQEAgLTAsMCArMSwyMTYgQEAKKy8qKgorICoKKyAqIExhbWUgQUNNIHdyYXBwZXIsIGVuY29kZS9kZWNvZGUgTVAzIGJhc2VkIFJJRkYvQVZJIGZpbGVzIGluIE1TIFdpbmRvd3MKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lIGF0IGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisgCisvKiEKKwlcYXV0aG9yIFN0ZXZlIExob21tZQorCVx2ZXJzaW9uIFwkSWQ6IG1haW4uY3BwLHYgMS41IDIwMDYvMTIvMjUgMjE6Mzc6MzQgcm9iZXJ0IEV4cCAkCisqLworCisjaWYgIWRlZmluZWQoU1RSSUNUKQorI2RlZmluZSBTVFJJQ1QKKyNlbmRpZiAvLyBTVFJJQ1QKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLy8vIFRoZSBBQ00gaXMgY29uc2lkZXJlZCBhcyBhIGRyaXZlciBhbmQgcnVuIGluIEtlcm5lbC1Nb2RlCisvLy8gU28gdGhlIG5ldy9kZWxldGUgb3BlcmF0b3JzIGhhdmUgdG8gYmUgb3ZlcnJpZGVuIGluIG9yZGVyIHRvIHVzZSBtZW1vcnkKKy8vLyByZWFkYWJsZSBvdXQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcworCit2b2lkICogb3BlcmF0b3IgbmV3KCB1bnNpZ25lZCBpbnQgY2IgKQoreworCXJldHVybiBMb2NhbEFsbG9jKExQVFIsIGNiKTsgLy8gVmlydHVhbEFsbG9jCit9CisKK3ZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKmJsb2NrKSB7CisJTG9jYWxGcmVlKGJsb2NrKTsKK30KKworZXh0ZXJuICJDIiB7CisKKwl2b2lkICphY21fQ2FsbG9jKCBzaXplX3QgbnVtLCBzaXplX3Qgc2l6ZSApCisJeworCQlyZXR1cm4gTG9jYWxBbGxvYyhMUFRSLCBudW0gKiBzaXplKTsgLy8gVmlydHVhbEFsbG9jCisJfQorCisJdm9pZCAqYWNtX01hbGxvYyggc2l6ZV90IHNpemUgKQorCXsKKwkJcmV0dXJuIExvY2FsQWxsb2MoTFBUUiwgc2l6ZSk7IC8vIFZpcnR1YWxBbGxvYworCX0KKworCXZvaWQgYWNtX0ZyZWUoIHZvaWQgKiBtZW0pCisJeworCQlMb2NhbEZyZWUobWVtKTsKKwl9Cit9OworCisvLy8vLy8gRW5kIG9mIG1lbW9yeSBpbnN0cnVtZW50YXRpb24KKworI2luY2x1ZGUgPG1tcmVnLmg+CisjaW5jbHVkZSA8bXNhY20uaD4KKyNpbmNsdWRlIDxtc2FjbWRydi5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJBRW5jb2RlUHJvcGVydGllcy5oIgorI2luY2x1ZGUgIkFDTS5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCisjaW5jbHVkZSAiYWRlYnVnLmgiCisKKworQURiZyAqIGRlYnVnID0gTlVMTDsKKworTE9ORyBXSU5BUEkgRHJpdmVyUHJvYyhEV09SRCBkd0RyaXZlcklkLCBIRFJWUiBoZHJ2ciwgVUlOVCBtc2csIExPTkcgbFBhcmFtMSwgTE9ORyBsUGFyYW0yKQoreworCisJc3dpdGNoIChtc2cpCisJeworCQljYXNlIERSVl9PUEVOOiAvLyBhY21Ecml2ZXJPcGVuCisJCXsKKwkJCWlmIChkZWJ1ZyA9PSBOVUxMKSB7CisJCQkJZGVidWcgPSBuZXcgQURiZyhERUJVR19MRVZFTF9DUkVBVElPTik7CisJCQkJZGVidWctPnNldFByZWZpeCgiTEFNRWRydiIpOworCQkJfQorCisJCQlpZiAoZGVidWcgIT0gTlVMTCkKKwkJCXsKKwkJCQkvLyBTZW50IHdoZW4gdGhlIGRyaXZlciBpcyBvcGVuZWQuCisJCQkJaWYgKGxQYXJhbTIgIT0gTlVMTCkKKwkJCQkJZGVidWctPk91dFB1dChERUJVR19MRVZFTF9NU0csICJEUlZfT1BFTiAoSUQgMHglMDhYKSwgcERlc2MgPSAweCUwOFgiLGR3RHJpdmVySWQsbFBhcmFtMik7CisJCQkJZWxzZQorCQkJCQlkZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkRSVl9PUEVOIChJRCAweCUwOFgpLCBwRGVzYyA9IE5VTEwiLGR3RHJpdmVySWQpOworCQkJfQorCisJCQlpZiAobFBhcmFtMiAhPSBOVUxMKSB7CisJCQkJTFBBQ01EUlZPUEVOREVTQyBwRGVzYyA9IChMUEFDTURSVk9QRU5ERVNDKWxQYXJhbTI7CisKKwkJCQlpZiAocERlc2MtPmZjY1R5cGUgIT0gQUNNRFJJVkVSREVUQUlMU19GQ0NUWVBFX0FVRElPQ09ERUMpIHsKKwkJCQkJaWYgKGRlYnVnICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCWRlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfRlVOQ19DT0RFLCAid3JvbmcgcERlc2MtPmZjY1R5cGUgKDB4JTA4WCkiLHBEZXNjLT5mY2NUeXBlKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChkZWJ1ZyAhPSBOVUxMKQorCQkJCXsKKwkJCQkJZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJwRGVzYyA9PSBOVUxMIik7CisJCQkJfQorCQkJfQorCisJCQlBQ00gKiBUaGlzQUNNID0gbmV3IEFDTShHZXREcml2ZXJNb2R1bGVIYW5kbGUoaGRydnIpKTsKKworCQkJaWYgKGRlYnVnICE9IE5VTEwpCisJCQl7CisJCQkJZGVidWctPk91dFB1dChERUJVR19MRVZFTF9GVU5DX0NPREUsICJPUEVORUQgaW5zdGFuY2UgMHglMDhYIixUaGlzQUNNKTsKKwkJCX0KKworCQkJcmV0dXJuIChMT05HKVRoaXNBQ007Ly8gcmV0dXJucyAwTCB0byBmYWlsCisJCQkJCQkJCS8vIHZhbHVlIHN1YnNlcXVlbnRseSB1c2VkCisJCQkJCQkJCS8vIGZvciBkd0RyaXZlcklkLgorCQl9CisJCWJyZWFrOworCisJCWNhc2UgRFJWX0NMT1NFOiAvLyBhY21Ecml2ZXJDbG9zZQorCQl7CisJCQlpZiAoZGVidWcgIT0gTlVMTCkKKwkJCXsKKwkJCQkvLyBTZW50IHdoZW4gdGhlIGRyaXZlciBpcyBjbG9zZWQuIERyaXZlcnMgYXJlCisJCQkJLy8gdW5sb2FkZWQgd2hlbiB0aGUgb3BlbiBjb3VudCByZWFjaGVzIHplcm8uCisJCQkJZGVidWctPk91dFB1dChERUJVR19MRVZFTF9NU0csICJEUlZfQ0xPU0UiKTsKKwkJCX0KKworCQkJQUNNICogVGhpc0FDTSA9IChBQ00gKilkd0RyaXZlcklkOworCQkJZGVsZXRlIFRoaXNBQ007CisJCQlpZiAoZGVidWcgIT0gTlVMTCkKKwkJCXsKKwkJCQlkZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX0ZVTkNfQ09ERSwgIkNMT1NFRCBpbnN0YW5jZSAweCUwOFgiLFRoaXNBQ00pOworCQkJCWRlbGV0ZSBkZWJ1ZzsKKwkJCQlkZWJ1ZyA9IE5VTEw7CisJCQl9CisJCQlyZXR1cm4gMUw7ICAvLyByZXR1cm5zIDBMIHRvIGZhaWwKKwkJfQorCQlicmVhazsKKworCQljYXNlIERSVl9MT0FEOgorCQl7CisJCQkvLyBub3RoaW5nIHRvIGRvCisJCQlpZiAoZGVidWcgIT0gTlVMTCkKKwkJCXsKKy8vCQkJCWRlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiRFJWX0xPQUQsIHZlcnNpb24gJXMgJXMgJXMiLCBBQ01fVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fKTsKKwkJCQlkZWJ1Zy0+T3V0UHV0KERFQlVHX0xFVkVMX01TRywgIkRSVl9MT0FELCAlcyAlcyIsICBfX0RBVEVfXywgX19USU1FX18pOworCQkJfQorCQkJcmV0dXJuIDFMOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgRFJWX0VOQUJMRToKKwkJeworCQkJLy8gbm90aGluZyB0byBkbworCQkJaWYgKGRlYnVnICE9IE5VTEwpCisJCQl7CisJCQkJZGVidWctPk91dFB1dChERUJVR19MRVZFTF9NU0csICJEUlZfRU5BQkxFIik7CisJCQl9CisJCQlyZXR1cm4gMUw7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBEUlZfRElTQUJMRToKKwkJeworCQkJLy8gbm90aGluZyB0byBkbworCQkJaWYgKGRlYnVnICE9IE5VTEwpCisJCQl7CisJCQkJZGVidWctPk91dFB1dChERUJVR19MRVZFTF9NU0csICJEUlZfRElTQUJMRSIpOworCQkJfQorCQkJcmV0dXJuIDFMOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgRFJWX0ZSRUU6CisJCXsKKwkJCWlmIChkZWJ1ZyAhPSBOVUxMKQorCQkJeworCQkJCWRlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiRFJWX0ZSRUUiKTsKKwkJCX0KKwkJCXJldHVybiAxTDsKKwkJfQorCQlicmVhazsKKworCQlkZWZhdWx0OgorCQl7CisJCQlBQ00gKiBUaGlzQUNNID0gKEFDTSAqKWR3RHJpdmVySWQ7CisKKwkJCWlmIChUaGlzQUNNICE9IE5VTEwpCisJCQkJcmV0dXJuIFRoaXNBQ00tPkRyaXZlclByb2NlZHVyZShoZHJ2ciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoZGVidWcgIT0gTlVMTCkKKwkJCQl7CisJCQkJCWRlYnVnLT5PdXRQdXQoREVCVUdfTEVWRUxfTVNHLCAiRHJpdmVyIG5vdCBvcGVuZWQsIHVua25vd24gbWVzc2FnZSAoMHglMDhYKSwgbFBhcmFtMSA9IDB4JTA4WCwgbFBhcmFtMiA9IDB4JTA4WCIsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CisJCQkJfQorCisJCQkJcmV0dXJuIERlZkRyaXZlclByb2MgKGR3RHJpdmVySWQsIGhkcnZyLCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KK30KKyAKZGlmZiAtLWdpdCBhL0FDTS9yZWFkbWUudHh0IGIvQUNNL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhNjQyMgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMjkgQEAKK0luIG9yZGVyIHRvIGJ1aWxkIHRoaXMgY29kZWMsIHlvdSBuZWVkIHRoZSBXaW5kb3dzOTggRERLIGZyb20gTWljcm9zb2Z0LiBJdCBjYW4gYWxzbyB3b3JrCit3aXRoIHRoZSBXaW5kb3dzMjAwMC9NRS9YUC8yMDAzIERESzoKKworaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2Rkay8KKworQWx0ZXJuYXRpdmVseSwgdGhlIHJlcXVpcmVkIGhlYWRlcnMgYXJlIGFsc28gYXZhaWxhYmxlIGluIENZR1dJTit3MzJhcGksIE1JTkdXMzIgb3IgV2luZSA6CisKK2h0dHA6Ly93d3cuY3lnd2luLmNvbS8KK2h0dHA6Ly93d3cubWluZ3cub3JnLworaHR0cDovL3d3dy53aW5laHEuY29tLworCisKK0lmIHlvdSBkbyBub3QgaGF2ZSBhIGRkaywgeW91IHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGUgYWx0ZXJuYXRpdmUgbXNhY21kcnYuaCBwcm92aWRlZAord2l0aCB0aGlzIEFDTSBjb2RlYy4gSXQgaXMgbm90IHVzZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IHdvdWxkIHByb2JhYmx5IGJyb2tlIGFueSByZWFsCitEREsgYWxyZWFkeSBpbnN0YWxsZWQuCisKKworCistLS0tLS0tLS0tLS0tLS0KKworRGVmaW5lIEVOQUJMRV9ERUNPRElORyBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGRlY29kaW5nIChhbHBoYSBzdGF0ZSwgZG9lc24ndCBkZWNvZGUgYXQgdGhlCisgbW9tZW50LCBzbyB1c2UgaXQgb25seSBpZiB5b3UgcGxhbiB0byBkZXZlbG9wKQorCistLS0tLS0tLS0tLS0tLS0KKworVG8gcmVsZWFzZSB0aGlzIGNvZGVjIHlvdSB3aWxsIG5lZWQgOgorLSBsYW1lQUNNLmFjbSAocmVzdWx0IG9mIHRoZSBidWlsZCBwcm9jZXNzKQorLSBsYW1lQUNNLmluZgorLSBsYW1lX2FjbS54bWwgKHdoZXJlIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMgc3RvcmVkKQpkaWZmIC0tZ2l0IGEvQUNNL3Jlc291cmNlLmggYi9BQ00vcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDUyMDMyCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL3Jlc291cmNlLmgKQEAgLTAsMCArMSw0MiBAQAorLy97e05PX0RFUEVOREVOQ0lFU319CisvLyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgorLy8gVXNlZCBieSBhY20ucmMKKy8vCisjZGVmaW5lIElESV9JQ09OICAgICAgICAgICAgICAgICAgICAgICAgMTAxCisjZGVmaW5lIElERF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgMTAyCisjZGVmaW5lIElERF9BQk9VVCAgICAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIElEQ19TVEFUSUNfREVDT0RJTkcgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBJRENfQ0hFQ0tfQ09QWVJJR0hUICAgICAgICAgICAgIDEwMDEKKyNkZWZpbmUgSURDX0NIRUNLX0NIRUNLU1VNICAgICAgICAgICAgICAxMDAyCisjZGVmaW5lIElEQ19DSEVDS19PUklHSU5BTCAgICAgICAgICAgICAgMTAwMworI2RlZmluZSBJRENfQ0hFQ0tfUFJJVkFURSAgICAgICAgICAgICAgIDEwMDQKKyNkZWZpbmUgSURDX0NPTUJPX0VOQ19TVEVSRU8gICAgICAgICAgICAxMDA1CisjZGVmaW5lIElEQ19DSEVDS19FTkNfU01BUlQgICAgICAgICAgICAgMTAwNgorI2RlZmluZSBJRENfU1RBVElDX0VOQ19JQ09OICAgICAgICAgICAgIDEwMDcKKyNkZWZpbmUgSURDX1NUQVRJQ19BQk9VVF9USVRMRSAgICAgICAgICAxMDA4CisjZGVmaW5lIElEQ19TVEFUSUNfQUJPVVRfVVJMICAgICAgICAgICAgMTAwOQorI2RlZmluZSBJRENfU1RBVElDX0NPTkZJR19WRVJTSU9OICAgICAgIDEwMTAKKyNkZWZpbmUgSURDX0NIRUNLX0VOQ19BQlIgICAgICAgICAgICAgICAxMDExCisjZGVmaW5lIElEQ19TTElERVJfQVZFUkFHRV9NSU4gICAgICAgICAgMTAxMgorI2RlZmluZSBJRENfU0xJREVSX0FWRVJBR0VfTUFYICAgICAgICAgIDEwMTMKKyNkZWZpbmUgSURDX1NMSURFUl9BVkVSQUdFX1NURVAgICAgICAgICAxMDE0CisjZGVmaW5lIElEQ19TTElERVJfQVZFUkFHRV9TQU1QTEUgICAgICAgMTAxNQorI2RlZmluZSBJRENfU1RBVElDX0FWRVJBR0VfTUlOICAgICAgICAgIDEwMTYKKyNkZWZpbmUgSURDX1NUQVRJQ19BVkVSQUdFX01BWCAgICAgICAgICAxMDE3CisjZGVmaW5lIElEQ19TVEFUSUNfQVZFUkFHRV9TVEVQICAgICAgICAgMTAxOAorI2RlZmluZSBJRENfU1RBVElDX0FWRVJBR0VfU0FNUExFICAgICAgIDEwMTkKKyNkZWZpbmUgSURDX1NUQVRJQ19BVkVSQUdFX01JTl9WQUxVRSAgICAxMDIwCisjZGVmaW5lIElEQ19TVEFUSUNfQVZFUkFHRV9NQVhfVkFMVUUgICAgMTAyMQorI2RlZmluZSBJRENfU1RBVElDX0FWRVJBR0VfU1RFUF9WQUxVRSAgIDEwMjIKKyNkZWZpbmUgSURDX1NUQVRJQ19BVkVSQUdFX1NBTVBMRV9WQUxVRSAxMDIzCisKKy8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCisvLyAKKyNpZmRlZiBBUFNUVURJT19JTlZPS0VECisjaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxMDUKKyNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICA0MDAwMQorI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwMjQKKyNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMDEKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9BQ00vdGlueXhtbC9NYWtlZmlsZS5hbSBiL0FDTS90aW55eG1sL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYmQ2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vdGlueXhtbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIwIEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS4yIDIwMDUvMDgvMjEgMTc6MzI6MDggYm91dmlnbmUgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCitFWFRSQV9ESVNUID0gXAorCU1ha2VmaWxlLnRpbnl4bWwgXAorCWNoYW5nZXMudHh0IFwKKwlkb3ggXAorCW1ha2VkaXN0bGludXggXAorCW1ha2VkaXN0d2luLmJhdCBcCisJcmVhZG1lLnR4dCBcCisJdGVzdC5kc3AgXAorCXRlc3QuZHN3IFwKKwl0aW55eG1sLmNwcCBcCisJdGlueXhtbC5kc3AgXAorCXRpbnl4bWxfdmM3LnZjcHJvaiBcCisJdGlueXhtbC5oIFwKKwl0aW55eG1sZXJyb3IuY3BwIFwKKwl0aW55eG1scGFyc2VyLmNwcCBcCisJeG1sdGVzdC5jcHAKZGlmZiAtLWdpdCBhL0FDTS90aW55eG1sL01ha2VmaWxlLmluIGIvQUNNL3Rpbnl4bWwvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyYTUxMgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS90aW55eG1sL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzcyIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBnbG9iYWwgc2VjdGlvbiBmb3IgZXZlcnkgTWFrZWZpbGUuYW0KK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAorCSQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCitzdWJkaXIgPSBBQ00vdGlueXhtbAorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NPTkZJR19ERUZTID0gQENPTkZJR19ERUZTQAorQ09ORklHX01BVEhfTElCID0gQENPTkZJR19NQVRIX0xJQkAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQVUNDT0RFID0gQENQVUNDT0RFQAorQ1BVVFlQRSA9IEBDUFVUWVBFQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRUNITyA9IEBFQ0hPQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRjc3ID0gQEY3N0AKK0ZGTEFHUyA9IEBGRkxBR1NACitGUk9OVEVORF9DRkxBR1MgPSBARlJPTlRFTkRfQ0ZMQUdTQAorRlJPTlRFTkRfTERBREQgPSBARlJPTlRFTkRfTERBRERACitGUk9OVEVORF9MREZMQUdTID0gQEZST05URU5EX0xERkxBR1NACitHUkVQID0gQEdSRVBACitHVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACitHVEtfQ09ORklHID0gQEdUS19DT05GSUdACitHVEtfTElCUyA9IEBHVEtfTElCU0AKK0lOQ0xVREVTID0gQElOQ0xVREVTQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREFERCA9IEBMREFEREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMSUJfTUFKT1JfVkVSU0lPTiA9IEBMSUJfTUFKT1JfVkVSU0lPTkAKK0xJQl9NSU5PUl9WRVJTSU9OID0gQExJQl9NSU5PUl9WRVJTSU9OQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRURFUCA9IEBNQUtFREVQQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOQVNNID0gQE5BU01ACitOQVNNX0ZPUk1BVCA9IEBOQVNNX0ZPUk1BVEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUk1fRiA9IEBSTV9GQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTTkRGSUxFX0NGTEFHUyA9IEBTTkRGSUxFX0NGTEFHU0AKK1NOREZJTEVfTElCUyA9IEBTTkRGSUxFX0xJQlNACitTVFJJUCA9IEBTVFJJUEAKK1UgPSBAVUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJVEhfRlJPTlRFTkQgPSBAV0lUSF9GUk9OVEVOREAKK1dJVEhfTVAzUlRQID0gQFdJVEhfTVAzUlRQQAorV0lUSF9NUDNYID0gQFdJVEhfTVAzWEAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FVVE9NQUtFX09QVElPTlMgPSAxLjkgZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCitFWFRSQV9ESVNUID0gXAorCU1ha2VmaWxlLnRpbnl4bWwgXAorCWNoYW5nZXMudHh0IFwKKwlkb3ggXAorCW1ha2VkaXN0bGludXggXAorCW1ha2VkaXN0d2luLmJhdCBcCisJcmVhZG1lLnR4dCBcCisJdGVzdC5kc3AgXAorCXRlc3QuZHN3IFwKKwl0aW55eG1sLmNwcCBcCisJdGlueXhtbC5kc3AgXAorCXRpbnl4bWxfdmM3LnZjcHJvaiBcCisJdGlueXhtbC5oIFwKKwl0aW55eG1sZXJyb3IuY3BwIFwKKwl0aW55eG1scGFyc2VyLmNwcCBcCisJeG1sdGVzdC5jcHAKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgQUNNL3Rpbnl4bWwvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIEFDTS90aW55eG1sL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9BQ00vdGlueXhtbC9NYWtlZmlsZS50aW55eG1sIGIvQUNNL3Rpbnl4bWwvTWFrZWZpbGUudGlueXhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY0NjkzCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL3Rpbnl4bWwvTWFrZWZpbGUudGlueXhtbApAQCAtMCwwICsxLDE1MCBAQAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMKKyMgTWFrZWZpbCBmb3IgVGlueVhtbCB0ZXN0LgorIyBMZWUgVGhvbWFzb24KKyMgd3d3LmdyaW5uaW5nbGl6YXJkLmNvbQorIworIyBUaGlzIGlzIGEgR05VIG1ha2UgKGdtYWtlKSBtYWtlZmlsZQorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyBERUJVRyBjYW4gYmUgc2V0IHRvIFlFUyB0byBpbmNsdWRlIGRlYnVnZ2luZyBpbmZvLCBvciBOTyBvdGhlcndpc2UKK0RFQlVHICAgICAgICAgIDo9IFlFUworCisjIFBST0ZJTEUgY2FuIGJlIHNldCB0byBZRVMgdG8gaW5jbHVkZSBwcm9maWxpbmcgaW5mbywgb3IgTk8gb3RoZXJ3aXNlCitQUk9GSUxFICAgICAgICA6PSBOTworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDQyAgICAgOj0gZ2NjCitDWFggICAgOj0gZysrCitMRCAgICAgOj0gZysrCitBUiAgICAgOj0gYXIgcmMKK1JBTkxJQiA6PSByYW5saWIKKworREVCVUdfQ0ZMQUdTICAgICA6PSAtV2FsbCAtV25vLXVua25vd24tcHJhZ21hcyAtV25vLWZvcm1hdCAtZyAtRERFQlVHCitSRUxFQVNFX0NGTEFHUyAgIDo9IC1XYWxsIC1Xbm8tdW5rbm93bi1wcmFnbWFzIC1Xbm8tZm9ybWF0IC1PMgorCitMSUJTCQkgOj0KKworREVCVUdfQ1hYRkxBR1MgICA6PSAke0RFQlVHX0NGTEFHU30gCitSRUxFQVNFX0NYWEZMQUdTIDo9ICR7UkVMRUFTRV9DRkxBR1N9CisKK0RFQlVHX0xERkxBR1MgICAgOj0gLWcKK1JFTEVBU0VfTERGTEFHUyAgOj0KKworaWZlcSAoWUVTLCAke0RFQlVHfSkKKyAgIENGTEFHUyAgICAgICA6PSAke0RFQlVHX0NGTEFHU30KKyAgIENYWEZMQUdTICAgICA6PSAke0RFQlVHX0NYWEZMQUdTfQorICAgTERGTEFHUyAgICAgIDo9ICR7REVCVUdfTERGTEFHU30KK2Vsc2UKKyAgIENGTEFHUyAgICAgICA6PSAke1JFTEVBU0VfQ0ZMQUdTfQorICAgQ1hYRkxBR1MgICAgIDo9ICR7UkVMRUFTRV9DWFhGTEFHU30KKyAgIExERkxBR1MgICAgICA6PSAke1JFTEVBU0VfTERGTEFHU30KK2VuZGlmCisKK2lmZXEgKFlFUywgJHtQUk9GSUxFfSkKKyAgIENGTEFHUyAgIDo9ICR7Q0ZMQUdTfSAtcGcKKyAgIENYWEZMQUdTIDo9ICR7Q1hYRkxBR1N9IC1wZworICAgTERGTEFHUyAgOj0gJHtMREZMQUdTfSAtcGcKK2VuZGlmCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFByZXByb2Nlc3NvciBkaXJlY3RpdmVzCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitpZmVxIChZRVMsICR7UFJPRklMRX0pCisgIERFRlMgOj0KK2Vsc2UKKyAgREVGUyA6PQorZW5kaWYKKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgSW5jbHVkZSBwYXRocworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworI0lOQ1MgOj0gLUkvdXNyL2luY2x1ZGUvZysrLTIgLUkvdXNyL2xvY2FsL2luY2x1ZGUKK0lOQ1MgOj0KKworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBNYWtlZmlsZSBjb2RlIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDRkxBR1MgICA6PSAke0NGTEFHU30gICAke0RFRlN9CitDWFhGTEFHUyA6PSAke0NYWEZMQUdTfSAke0RFRlN9CisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFRhcmdldHMgb2YgdGhlIGJ1aWxkCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitPVVRQVVQgOj0geG1sdGVzdAorCithbGw6ICR7T1VUUFVUfQorCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFNvdXJjZSBmaWxlcworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworU1JDUyA6PSB0aW55eG1sLmNwcCB0aW55eG1scGFyc2VyLmNwcCB4bWx0ZXN0LmNwcCB0aW55eG1sZXJyb3IuY3BwCisKKyMgQWRkIG9uIHRoZSBzb3VyY2VzIGZvciBsaWJyYXJpZXMKK1NSQ1MgOj0gJHtTUkNTfQorCitPQkpTIDo9ICQoYWRkc3VmZml4IC5vLCQoYmFzZW5hbWUgJHtTUkNTfSkpCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE91dHB1dAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJHtPVVRQVVR9OiAke09CSlN9CisJJHtMRH0gLW8gJEAgJHtMREZMQUdTfSAke09CSlN9ICR7TElCU30gJHtFWFRSQV9MSUJTfQorCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBjb21tb24gcnVsZXMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgUnVsZXMgZm9yIGNvbXBpbGluZyBzb3VyY2UgZmlsZXMgdG8gb2JqZWN0IGZpbGVzCislLm8gOiAlLmNwcAorCSR7Q1hYfSAtYyAke0NYWEZMQUdTfSAke0lOQ1N9ICQ8IC1vICRACisKKyUubyA6ICUuYworCSR7Q0N9IC1jICR7Q0ZMQUdTfSAke0lOQ1N9ICQ8IC1vICRACisKK2NsZWFuOgorCS1ybSAtZiBjb3JlICR7T0JKU30gJHtPVVRQVVR9CisKK2RlcGVuZDoKKwltYWtlZGVwZW5kICR7SU5DU30gJHtTUkNTfQorIyBETyBOT1QgREVMRVRFCisKK3Rpbnl4bWwubzogdGlueXhtbC5oIC91c3IvaW5jbHVkZS9zdGRpby5oIC91c3IvaW5jbHVkZS9mZWF0dXJlcy5oCit0aW55eG1sLm86IC91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaCAvdXNyL2luY2x1ZGUvZ251L3N0dWJzLmgKK3Rpbnl4bWwubzogL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCAvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaAordGlueXhtbC5vOiAvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIC91c3IvaW5jbHVkZS9saWJpby5oCit0aW55eG1sLm86IC91c3IvaW5jbHVkZS9fR19jb25maWcuaCAvdXNyL2luY2x1ZGUvd2NoYXIuaAordGlueXhtbC5vOiAvdXNyL2luY2x1ZGUvYml0cy93Y2hhci5oIC91c3IvaW5jbHVkZS9nY29udi5oCit0aW55eG1sLm86IC91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvX2xpbS5oIC91c3IvaW5jbHVkZS9hc3NlcnQuaAordGlueXhtbHBhcnNlci5vOiB0aW55eG1sLmggL3Vzci9pbmNsdWRlL3N0ZGlvLmggL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgKK3Rpbnl4bWxwYXJzZXIubzogL3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oIC91c3IvaW5jbHVkZS9nbnUvc3R1YnMuaAordGlueXhtbHBhcnNlci5vOiAvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIC91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oCit0aW55eG1scGFyc2VyLm86IC91c3IvaW5jbHVkZS9iaXRzL3NjaGVkLmggL3Vzci9pbmNsdWRlL2xpYmlvLmgKK3Rpbnl4bWxwYXJzZXIubzogL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIC91c3IvaW5jbHVkZS93Y2hhci5oCit0aW55eG1scGFyc2VyLm86IC91c3IvaW5jbHVkZS9iaXRzL3djaGFyLmggL3Vzci9pbmNsdWRlL2djb252LmgKK3Rpbnl4bWxwYXJzZXIubzogL3Vzci9pbmNsdWRlL2JpdHMvc3RkaW9fbGltLmggL3Vzci9pbmNsdWRlL2Fzc2VydC5oCit0aW55eG1scGFyc2VyLm86IC91c3IvaW5jbHVkZS9jdHlwZS5oIC91c3IvaW5jbHVkZS9lbmRpYW4uaAordGlueXhtbHBhcnNlci5vOiAvdXNyL2luY2x1ZGUvYml0cy9lbmRpYW4uaAoreG1sdGVzdC5vOiB0aW55eG1sLmggL3Vzci9pbmNsdWRlL3N0ZGlvLmggL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgKK3htbHRlc3QubzogL3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oIC91c3IvaW5jbHVkZS9nbnUvc3R1YnMuaAoreG1sdGVzdC5vOiAvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIC91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oCit4bWx0ZXN0Lm86IC91c3IvaW5jbHVkZS9iaXRzL3NjaGVkLmggL3Vzci9pbmNsdWRlL2xpYmlvLmgKK3htbHRlc3QubzogL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIC91c3IvaW5jbHVkZS93Y2hhci5oCit4bWx0ZXN0Lm86IC91c3IvaW5jbHVkZS9iaXRzL3djaGFyLmggL3Vzci9pbmNsdWRlL2djb252LmgKK3htbHRlc3QubzogL3Vzci9pbmNsdWRlL2JpdHMvc3RkaW9fbGltLmggL3Vzci9pbmNsdWRlL2Fzc2VydC5oCit0aW55eG1sZXJyb3IubzogdGlueXhtbC5oIC91c3IvaW5jbHVkZS9zdGRpby5oIC91c3IvaW5jbHVkZS9mZWF0dXJlcy5oCit0aW55eG1sZXJyb3IubzogL3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oIC91c3IvaW5jbHVkZS9nbnUvc3R1YnMuaAordGlueXhtbGVycm9yLm86IC91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmggL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgKK3Rpbnl4bWxlcnJvci5vOiAvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIC91c3IvaW5jbHVkZS9saWJpby5oCit0aW55eG1sZXJyb3IubzogL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIC91c3IvaW5jbHVkZS93Y2hhci5oCit0aW55eG1sZXJyb3IubzogL3Vzci9pbmNsdWRlL2JpdHMvd2NoYXIuaCAvdXNyL2luY2x1ZGUvZ2NvbnYuaAordGlueXhtbGVycm9yLm86IC91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvX2xpbS5oIC91c3IvaW5jbHVkZS9hc3NlcnQuaApkaWZmIC0tZ2l0IGEvQUNNL3Rpbnl4bWwvY2hhbmdlcy50eHQgYi9BQ00vdGlueXhtbC9jaGFuZ2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI0Y2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvQUNNL3Rpbnl4bWwvY2hhbmdlcy50eHQKQEAgLTAsMCArMSw4MSBAQAorQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMC4xOgorLSBGaXhlZCBjb21tZW50IHRhZ3Mgd2hpY2ggd2VyZSBvdXRwdXRpbmcgYXMgJzw/LS0nIGluc3RlYWQgb2YgCisgIHRoZSBjb3JyZWN0ICc8IS0tJy4KKy0gSW1wbGVtZW50ZWQgdGhlIE5leHQgYW5kIFByZXYgbWV0aG9kcyBvZiB0aGUgVGlYbWxBdHRyaWJ1dGUgY2xhc3MuCistIFJlbmFtZWQgJ0xhc3RBdHRyaWJ0dXRlJyB0byAnTGFzdEF0dHJpYnV0ZScKKy0gRml4ZWQgYmFkIHBvaW50ZXIgdG8gJ2lzc3BhY2UnIHRoYXQgY291bGQgb2NjdXIgd2hpbGUgcGFyc2luZyB0ZXh0LgorLSBFcnJvcnMgZmluZGluZyBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0YWdzIG5vIGxvbmdlciB0aHJvdyBpdCBpbnRvIGFuCisgIGluZmluaXRlIGxvb3AuIChIb3BlZnVsbHkuKQorCitDaGFuZ2VzIGluIHZlcnNpb24gMS4wLjIKKy0gTWlub3IgZG9jdW1lbnRhdGlvbiBmaXhlcy4KKworQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMC4zCistIEFmdGVyIG5vZGVzIGFyZSBhZGRlZCB0byBhIGRvY3VtZW50LCB0aGV5IHJldHVybiBhIHBvaW50ZXIKKyAgdG8gdGhlIG5ldyBub2RlIGluc3RlYWQgb2YgYSBib29sIGZvciBzdWNjZXNzLgorLSBFbGVtZW50cyBjYW4gYmUgY29uc3RydWN0ZWQgd2l0aCBhIHZhbHVlLCB3aGljaCBpcyB0aGUKKyAgZWxlbWVudCBuYW1lLiBFdmVyeSBlbGVtZW50IG11c3QgaGF2ZSBhIHZhbHVlIG9yIGl0IHdpbGwgYmUKKyAgaW52YWxpZCwgYnV0IHRoZSBjb2RlIGNoYW5nZXMgdG8gZW5mb3JjZSB0aGlzIGFyZSBub3QgZnVsbHkKKyAgaW4gcGxhY2UuCisKK0NoYW5nZXMgaW4gdmVyc2lvbiAxLjEuMAorLSBBZGRlZCB0aGUJVGlYbWxBdHRyaWJ1dGVTZXQgY2xhc3MgdG8gcHVsbCB0aGUgYXR0cmlidXRlcyBpbnRvCisgIGEgc2VwZXJhdGUgY29udGFpbmVyLgorLSBNb3ZlZCB0aGUgZG91Ymx5IGxpa2VkIGxpc3Qgb3V0IG9mIFhtbEJhc2UuIE5vdyBYbWxCYXNlIG9ubHkKKyAgcmVxdWlyZXMgdGhlIFByaW50KCkgZnVuY3Rpb24gYW5kIGRlZmluZXMgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKy0gTW92ZWQgZXJyb3JzIGludG8gYSBzZXBlcmF0ZSBmaWxlLiAoV2l0aCB0aGUgaWRlYSBvZiBpbnRlcm5hdGlvbmFsaXphdGlvbgorICB0byB0aGUgb3RoZXIgbGF0aW4tMSBsYW5ndWFnZXMuKQorLSBBZGRlZCB0aGUgIk5vZGVUeXBlIgorLSBGaXhlZCB3aGl0ZSBzcGFjZSBwYXJzaW5nIGluIHRleHQgdG8gY29uZm9ybSB3aXRoIHRoZSBzdGFuZGFyZC4gCisgIEJhc2ljYWxseSwgYWxsIHdoaXRlIHNwYWNlIGJlY29tZXMganVzdCBvbmUgc3BhY2UuCistIEFkZGVkIHRoZSBUaVhtbERlY2xhcmF0aW9uIGNsYXNzIHRvIHJlYWQgeG1sIGRlY2xhcmF0aW9ucy4KKworQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMi4wCistIFJlbW92ZWQgdGhlIGZhY3RvcnkuIFRoZSBmYWN0b3J5IHdhcyBub3QgcmVhbGx5IGluIHRoZSBzcGlyaXQgCisgIG9mIHNtYWxsIGFuZCBzaW1wbGUsIGNvbmZ1c2VkIHRoZSBjb2RlLCBhbmQgd2FzIG9mIGxpbWl0ZWQgdmFsdWUuCistIEFkZGVkIEZpcnN0Q2hpbGRFbGVtZW50IGFuZCBOZXh0U2libGluZ0VsZW1lbnQsIGJlY2F1c2UgdGhleQorICBhcmUgc3VjaCBjb21tb24gZnVuY3Rpb25zLgorLSBSZS13cm90ZSB0aGUgZXhhbXBsZSB0byB0ZXN0IGFuZCBkZW1vbnN0cmF0ZSBtb3JlIGZ1bmN0aW9uYWxpdHkuCisKK0NoYW5nZXMgaW4gdmVyc2lvbiAxLjIuMQorLSBGaXhlZCBhIGJ1ZyB3aGVyZSBjb21tZW50cyBjb3VsZG4ndCBiZSBpbnNpZGUgZWxlbWVudHMuCistIExvYWRpbmcgbm93IGNsZWFycyBvdXQgZXhpc3RpbmcgWE1MIHJhdGhlciB0aGFuIGFwcGVuZGluZy4KKy0gQWRkZWQgdGhlICJDbGVhciIgbWV0aG9kIG9uIGEgbm9kZSB0byBkZWxldGUgYWxsIGl0cyBjaGlsZHJlbi4KKworQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMi4yCistIEZpeGVkIFRpWG1sQXR0cmlidXRlOjpQcmV2aW91cyBhY3R1YWxseSByZXR1cm5pbmcgIm5leHQuIiBUaGFua3MKKyAgdG8gUmlja2FyZCBUcm9lZHNzb24gZm9yIHRoZSBidWcgZml4LgorCitDaGFuZ2VzIGluIHZlcnNpb24gMS4yLjMKKy0gQWRkZWQgdGhlIFRJWE1MIHByZWZpeCB0byB0aGUgZXJyb3Igc3RyaW5ncyB0byByZXNvbHZlIGNvbmZsaWN0cworICB3aXRoICNkZWZpbmVzIGluIE9TIGhlYWRlcnMuIFRoYW5rcyB0byBTdGV2ZSBMaG9tbWUuCistIEZpeGVkIGEgZGVsZXRlIGJ1ZiB0aGF0IHNob3VsZCBiZSBhIGRlbGV0ZSBbXSBidWYuIAorICBUaGFua3MgdG8gRXBoaSBTaW5vd2l0ei4KKworQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMi40CistIFJlcGxhY2VDaGlsZCgpIHdhcyBhbG1vc3QgZ3VhcmVudGVlZCB0byBmYWlsLiBTaG91bGQgYmUgZml4ZWQsCisgIHRoYW5rcyB0byBKb2UgU21pdGguIEpvZSBhbHNvIHBvaW50ZWQgb3V0IHRoYXQgdGhlIFByaW50KCkgZnVuY3Rpb25zCisgIHNob3VsZCB0YWtlIHN0cmVhbSByZWZlcmVuY2VzOiBJIGFncmVlLCBhbmQgd291bGQgbGlrZSB0byBvdmVybG9hZAorICB0aGUgUHJpbnQoKSBtZXRob2QgdG8gdGFrZSBlaXRoZXIgZm9ybWF0LCBidXQgSSBkb24ndCB3YW50IHRvIGRvIAorICB0aGlzIGluIGEgZG90IHJlbGVhc2UuCistIFNvbWUgY29tcGlsZXJzIHNlZW0gdG8gbmVlZCBhbiBleHRyYSA8Y3R5cGUuaD4gaW5jbHVkZS4gVGhhbmtzCisgIHRvIFN0ZXZlIExob21tZSBmb3IgdGhhdC4KKworQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMC4wCistIE1hZGUgdGhlIFRvWFhYKCkgY2FzdHMgc2FmZSBpZiAndGhpcycgaXMgbnVsbC4gCisgIFdoZW4gIkxvYWRGaWxlIiBpcyBjYWxsZWQgd2l0aCBhIGZpbGVuYW1lLCB0aGUgdmFsdWUgd2lsbCBjb3JyZWN0bHkgZ2V0IHNldC4KKyAgVGhhbmtzIHRvIEJyaWFuIFlvZGVyLgorLSBGaXhlZCBidWcgd2hlcmUgaXNhbHBoYSgpIGFuZCBpc2FsbnVtKCkgd291bGQgZ2V0IGNhbGxlZCB3aXRoIGEgbmVnYXRpdmUgdmFsdWUgZm9yIAorICBoaWdoIGFzY2lpIG51bWJlcnMuIFRoYW5rcyB0byBBbGVza3kgQWtzZW5vdi4KKy0gRml4ZWQgc29tZSBlcnJvcnMgY29kZXMgdGhhdCB3ZXJlIG5vdCBnZXR0aW5nIHNldC4KKy0gTWFkZSBtZXRob2RzICJjb25zdCIgdGhhdCB3ZXJlIG5vdC4KKy0gQWRkZWQgYSBzd2l0Y2ggdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGlnbm9yaW5nIG9mIHdoaXRlIHNwYWNlLiAoIFRpWG1sRG9jdW1lbnQ6OlNldElnbm9yZVdoaXRlU3BhY2UoKSApCistIEdyZWF0ZXIgc3RhbmRhcmRpemF0aW9uIGFuZCBjb2RlIHJlLXVzZSBpbiB0aGUgcGFyc2VyLgorLSBBZGRlZCBhIHN0cmVhbSBvdXQgb3BlcmF0b3IuCistIEFkZGVkIGEgc3RyZWFtIGluIG9wZXJhdG9yLgorLSBFbnRpdHkgc3VwcG9ydC4KKworVE9ETworQ0RBVEEuCitTdXBwb3J0IGZvciAiZ2VuZXJpYyBlbnRpdHkiICN4eHggdGhpbmcuCisKZGlmZiAtLWdpdCBhL0FDTS90aW55eG1sL2RveCBiL0FDTS90aW55eG1sL2RveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDMxODc3Ci0tLSAvZGV2L251bGwKKysrIGIvQUNNL3Rpbnl4bWwvZG94CkBAIC0wLDAgKzEsNzA4IEBACisjIERveHlmaWxlIDEuMi4yCisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSBkb3h5Z2VuIGZvciBhIHByb2plY3QKKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkCisjIFRoZSBmb3JtYXQgaXM6CisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEdlbmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIAorIyBieSBxdW90ZXMpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZSBwcm9qZWN0LiAKKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IFRpbnlYbWwKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIAorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yIAorIyBpZiBzb21lIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IC4vZG9jcworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsIAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcyAKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLiAKKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IAorIyBEdXRjaCwgRnJlbmNoLCBJdGFsaWFuLCBDemVjaCwgU3dlZGlzaCwgR2VybWFuLCBGaW5uaXNoLCBKYXBhbmVzZSwgCisjIEtvcmVhbiwgSHVuZ2FyaWFuLCBTcGFuaXNoLCBSb21hbmlhbiwgUnVzc2lhbiwgQ3JvYXRpYW4sIFBvbGlzaCwgYW5kIAorIyBQb3J0dWd1ZXNlLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbiAKKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIAorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIAorIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTIAorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyAKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIAorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAKKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIAorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIAorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuIAorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIAorIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4gCisKK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGluY2x1ZGUgYnJpZWYgbWVtYmVyIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLiAKKyMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4gCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIHByZXBlbmQgCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLiAKKyMgTm90ZTogaWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZSAKKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLiAKKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4gCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYgCisjIGRlc2NyaXB0aW9uLiAKKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIAorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCAKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuIAorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcgCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlciBkZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcyAKKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YgCisjIHRoZSBwYXRoLiBJdCBpcyBhbGxvd2VkIHRvIHVzZSByZWxhdGl2ZSBwYXRocyBpbiB0aGUgYXJndW1lbnQgbGlzdC4KKworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IAorCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gCisjIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYSBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgCisjIHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiB0aGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGV4Y2x1ZGVkLiAKKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLiAKKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIGNsYXNzIGRpYWdyYW0gKGluIEh0bWwgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2Ugb3IgCisjIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0byBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiAKKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCAKKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuIAorCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSAKKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLiAKKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBpbnN0cnVjdCAKKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIAorIyBmcmFnbWVudHMuIE5vcm1hbCBDIGFuZCBDKysgY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuIAorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIAorIyBmaWxlIG5hbWVzIGluIGxvd2VyIGNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlciBjYXNlIGxldHRlcnMgYXJlIGFsc28gCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIgCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cyAKKyMgdXNlcnMgYXJlIGFkdmljZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSAKKyMgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUgc2NvcGUgd2lsbCBiZSBoaWRkZW4uIAorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciAKKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuIAorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBwdXQgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIAorIyBvZiB0aGF0IGZpbGUuIAorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuIAorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlIAorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIAorIyBiZWhhdmUganVzdCBsaWtlIHRoZSBRdC1zdHlsZSBjb21tZW50cy4gCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQgCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IAorIyByZWltcGxlbWVudHMuIAorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXSAKKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLiAKKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIAorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzIAorIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIAorIyBkZWNsYXJhdGlvbiBvcmRlci4gCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DIAorIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0IAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQgCisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiAKKyMgRG94eWdlbiB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4gCisKK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA0CisKKyMgVGhlIEVOQUJMRV9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsIAorIyBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIHNlY3Rpb25uYW1lIC4uLiBcZW5kaWYuIAorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgCisjIGRpc2FibGUgKE5PKSB0aGUgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIAorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIAorIyBkaXNhYmxlIChOTykgdGhlIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdCAKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3RzIAorIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8gCisjIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaCAKKyMgd2lsbCByZXN1bHQgaW4gYSB1c2VyIGRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuIAorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4gCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCAKKyMgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuIAorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlIAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIAorIyBOTyBpcyB1c2VkLiAKKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIFdBUk5fSUZfVU5ET0NVTUVOVEVEIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIAorIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbCAKKyMgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4gCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IAorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dCAKKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gCisKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiAKKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvciAKKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIAorIyB3aXRoIHNwYWNlcy4gCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSAuICJyZWFkbWUudHh0IgorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUgCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCAKKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4gCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmgKKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgCisjIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiAKKyMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLiAKKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIAorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYSAKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuIAorCitFWENMVURFICAgICAgICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZSAKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlIAorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuIAorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciAKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSAKKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLiAKKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgCisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuIAorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIAorIyB0aGUgXGltYWdlIGNvbW1hbmQpLiAKKworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorCisjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQgCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0gCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxmaWx0ZXI+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGZpbHRlcj4gCisjIGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiAKKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzIAorIyB0byBzdGFuZGFyZCBvdXRwdXQuIAorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCAKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgCisjIGNvbnRhaW5zIGEgbG90IG9mIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBvciBpbnRlcmZhY2VzLiAKKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IE5PCisKKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuIAorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pIAorCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQorCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwgCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIAorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0IAorIyBzaG91bGQgYmUgaWdub3JlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLiAKKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4gCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSAKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4gCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSAuCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yIAorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgCisjIHN0YW5kYXJkIGhlYWRlci4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvciAKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIAorIyBzdGFuZGFyZCBmb290ZXIuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlciBkZWZpbmVkIGNhc2NhZGluZyAKKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0byAKKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0IAorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCisKKyMgSWYgdGhlIEhUTUxfQUxJR05fTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgY2xhc3NlcywgCisjIGZpbGVzIG9yIG5hbWVzcGFjZXMgd2lsbCBiZSBhbGlnbmVkIGluIEhUTUwgdXNpbmcgdGFibGVzLiBJZiBzZXQgdG8gCisjIE5PIGEgYnVsbGV0IGxpc3Qgd2lsbCBiZSB1c2VkLiAKKworSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyAKKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUgCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21wcmVzc2VkIEhUTUwgaGVscCBmaWxlICguY2htKSAKKyMgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uIAorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBUaGUgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCBhdCAKKyMgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQgCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuIAorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBMYXRleCBvdXRwdXQuIAorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4gCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCAKKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byAKKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuIAorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCAKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBhNHdpZGUsIGxldHRlciwgbGVnYWwgYW5kIAorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4gCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG5hbWVzIG9mIExhVGVYIAorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LiAKKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIAorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwgCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIAorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISAKKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIAorIyBpcyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBwZGYgKHVzaW5nIHBzMnBkZikuIFRoZSBwZGYgZmlsZSB3aWxsIAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcyAKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLiAKKworUERGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgCisjIHBsYWluIGxhdGV4IGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGEgCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLiAKKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXFxiYXRjaG1vZGUuIAorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwIAorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIAorIyBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuIAorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQgCisjIFRoZSBSVEYgb3V0cHV0IGlzIG9wdGltaXNlZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHZlcnkgcHJldHR5IHdpdGggCisjIG90aGVyIFJURiByZWFkZXJzIG9yIGVkaXRvcnMuCisKK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSAKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBydGYnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLiAKKworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgCisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIAorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4gCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCAKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgV09SRCBvciBvdGhlci4gCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLiAKKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuIAorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSAKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4gCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzIAorCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8KKworIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguIAorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIAorIyB0aGUgZ2VuZXJhdGVkIG1hbiBwYWdlcyAoZGVmYXVsdCBpcyB0aGUgc3Vicm91dGluZSdzIHNlY3Rpb24gLjMpIAorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gV2FybmluZzogVGhpcyBmZWF0dXJlIAorIyBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHZlcnkgaW5jb21wbGV0ZS4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgCisjIGZpbGVzLiAKKworRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbCAKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgCisjIHdheSBieSBzZXR0aW5nIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuIAorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIAorIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSAKKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX1BSRURFRklORUQgdGFncy4gCisKK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBOTworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMgCisjIGluIHRoZSBJTkNMVURFX1BBVEggKHNlZSBiZWxvdykgd2lsbCBiZSBzZWFyY2ggaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4gCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQgCisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgCisjIHRoZSBwcmVwcm9jZXNzb3IuIAorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gCisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCAKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZSAKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgCisjIGJlIHVzZWQuIAorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCAKKyMgYXJlIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mIAorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIAorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUgCisjIG9taXR0ZWQgPTEgaXMgYXNzdW1lZC4gCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfUFJFREVGX09OTFkgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIAorIyB0aGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gCisjIFRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLiAKKyMgVXNlIHRoZSBQUkVERUZJTkVEIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbi4gCisKK0VYUEFORF9BU19ERUZJTkVEICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGR0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnZmlsZXMuIAorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gCisKKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZSAKKyMgYSB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkIAorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcyAKKyMgd2lsbCBiZSBsaXN0ZWQuIAorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQgCisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgYHdoaWNoIHBlcmwnKS4gCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzIAorIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbiAKKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiAKKyMgaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgCisjIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuIAorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIAorIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyAKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciAKKyMgZG9jdW1lbnRlZCBmaWxlcy4gCisKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIAorIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgCisjIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZSAKKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiAKKyMgd2lsbCBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4gCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZSAKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBvbiB0aGUgcGF0aC4gCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9XSURUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgd2lkdGggCisjIChpbiBwaXhlbHMpIG9mIHRoZSBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gSWYgYSBncmFwaCBiZWNvbWVzIGxhcmdlciB0aGFuIAorIyB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHRydW5jYXRlIHRoZSBncmFwaCwgc28gdGhhdCBpdCBmaXRzIHdpdGhpbiAKKyMgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50LiBCZXdhcmUgdGhhdCBtb3N0IGJyb3dzZXJzIGNhbm5vdCBjb3BlIHdpdGggdmVyeSAKKyMgbGFyZ2UgaW1hZ2VzLiAKKworTUFYX0RPVF9HUkFQSF9XSURUSCAgICA9IDEwMjQKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9IRUlHSFQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBhbGxvd3MgaGVpZ2h0IAorIyAoaW4gcGl4ZWxzKSBvZiB0aGUgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIElmIGEgZ3JhcGggYmVjb21lcyBsYXJnZXIgdGhhbiAKKyMgdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRyeSB0byB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHNvIHRoYXQgaXQgZml0cyB3aXRoaW4gCisjIHRoZSBzcGVjaWZpZWQgY29uc3RyYWludC4gQmV3YXJlIHRoYXQgbW9zdCBicm93c2VycyBjYW5ub3QgY29wZSB3aXRoIHZlcnkgCisjIGxhcmdlIGltYWdlcy4gCisKK01BWF9ET1RfR1JBUEhfSEVJR0hUICAgPSAxMDI0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkdGlvbnMgcmVsYXRlZCB0byB0aGUgc2VhcmNoIGVuZ2luZSAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBTRUFSQ0hFTkdJTkUgdGFnIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBhIHNlYXJjaCBlbmdpbmUgc2hvdWxkIGJlIAorIyB1c2VkLiBJZiBzZXQgdG8gTk8gdGhlIHZhbHVlcyBvZiBhbGwgdGFncyBiZWxvdyB0aGlzIG9uZSB3aWxsIGJlIGlnbm9yZWQuIAorCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0dJX05BTUUgdGFnIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgQ0dJIHNjcmlwdCB0aGF0IAorIyBzdGFydHMgdGhlIHNlYXJjaCBlbmdpbmUgKGRveHlzZWFyY2gpIHdpdGggdGhlIGNvcnJlY3QgcGFyYW1ldGVycy4gCisjIEEgc2NyaXB0IHdpdGggdGhpcyBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIAorCitDR0lfTkFNRSAgICAgICAgICAgICAgID0gc2VhcmNoLmNnaQorCisjIFRoZSBDR0lfVVJMIHRhZyBzaG91bGQgYmUgdGhlIGFic29sdXRlIFVSTCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSAKKyMgY2dpIGJpbmFyaWVzIGFyZSBsb2NhdGVkLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBodHRwIGRhZW1vbiBmb3IgCisjIGRldGFpbHMuIAorCitDR0lfVVJMICAgICAgICAgICAgICAgID0gCisKKyMgVGhlIERPQ19VUkwgdGFnIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgVVJMIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIAorIyBkb2N1bWVudGF0aW9uIGlzIGxvY2F0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIAorIyBkb2N1bWVudGF0aW9uLCB3aXRoIGZpbGU6Ly8gcHJlcGVuZGVkIHRvIGl0LCB3aWxsIGJlIHVzZWQuIAorCitET0NfVVJMICAgICAgICAgICAgICAgID0gCisKKyMgVGhlIERPQ19BQlNQQVRIIHRhZyBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgCisjIGRvY3VtZW50YXRpb24gaXMgbG9jYXRlZC4gSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IG9uIHRoZSBsb2NhbCBtYWNoaW5lIAorIyB3aWxsIGJlIHVzZWQuIAorCitET0NfQUJTUEFUSCAgICAgICAgICAgID0gCisKKyMgVGhlIEJJTl9BQlNQQVRIIHRhZyBtdXN0IHBvaW50IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRveHlzZWFyY2ggYmluYXJ5IAorIyBpcyBpbnN0YWxsZWQuIAorCitCSU5fQUJTUEFUSCAgICAgICAgICAgID0gL3Vzci9sb2NhbC9iaW4vCisKKyMgVGhlIEVYVF9ET0NfUEFUSFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcGF0aHMgdG8gCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGZvciBvdGhlciBwcm9qZWN0cy4gVGhpcyBhbGxvd3MgZG94eXNlYXJjaCB0byBzZWFyY2ggCisjIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBwcm9qZWN0cyBhcyB3ZWxsLiAKKworRVhUX0RPQ19QQVRIUyAgICAgICAgICA9IApkaWZmIC0tZ2l0IGEvQUNNL3Rpbnl4bWwvbWFrZWRpc3RsaW51eCBiL0FDTS90aW55eG1sL21ha2VkaXN0bGludXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmZjE1MAotLS0gL2Rldi9udWxsCisrKyBiL0FDTS90aW55eG1sL21ha2VkaXN0bGludXgKQEAgLTAsMCArMSwzNCBAQAorZWNobyAiTWFraW5nIHZlcnNpb246ICIKK2VjaG8gJDEgCitlY2hvICQyIAorZWNobyAkMworCitybSAuL2RvY3MvKgorCitkb3h5Z2VuIGRveAorcm0gLXJmIC4vdGlueXhtbC8qCisKK3JtIHRpbnl4bWxfJDFfJDJfJDMuemlwCitybSB0aW55eG1sXyQxXyQyXyQzLnRhci5negorCitybWRpciB0aW55eG1sCitta2RpciB0aW55eG1sCisKK2NwIHJlYWRtZS50eHQgLi90aW55eG1sCitjcCBjaGFuZ2VzLnR4dCAuL3Rpbnl4bWwKK2NwIE1ha2VmaWxlIC4vdGlueXhtbAorCitjcCB0aW55eG1sLmNwcCB0aW55eG1sCitjcCB0aW55eG1sZXJyb3IuY3BwIHRpbnl4bWwKK2NwIHRpbnl4bWxwYXJzZXIuY3BwIHRpbnl4bWwKK2NwIHhtbHRlc3QuY3BwIHRpbnl4bWwKKworY3AgdGlueXhtbC5oIHRpbnl4bWwKK2NwIHRpbnl4bWwuZHNwIHRpbnl4bWwKKworbWtkaXIgLi90aW55eG1sL2RvY3MKK2NwIC4vZG9jcy8qIC4vdGlueXhtbC9kb2NzCisKK3RhciAtemNmIHRpbnl4bWxfJDFfJDJfJDMudGFyLmd6IHRpbnl4bWwKK3ppcCAtciAtcSAtOSB0aW55eG1sXyQxXyQyXyQzLnppcCAgIHRpbnl4bWwKKwpkaWZmIC0tZ2l0IGEvQUNNL3Rpbnl4bWwvbWFrZWRpc3R3aW4uYmF0IGIvQUNNL3Rpbnl4bWwvbWFrZWRpc3R3aW4uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5YTdiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vdGlueXhtbC9tYWtlZGlzdHdpbi5iYXQKQEAgLTAsMCArMSwxOSBAQAorZGVsIC5cdGlueXhtbF93aW5cKi4qCitkZWwgLlxkb2NzXCouKgorCitkb3h5Z2VuIGRveAorbWtkaXIgdGlueXhtbF93aW4KKworY29weSByZWFkbWUudHh0IHRpbnl4bWxfd2luCitjb3B5IGNoYW5nZXMudHh0IHRpbnl4bWxfd2luCisKK2NvcHkgKi5jcHAgdGlueXhtbF93aW4KK2NvcHkgKi5oIHRpbnl4bWxfd2luCitjb3B5ICouZHNwIHRpbnl4bWxfd2luCitjb3B5IHRlc3QwLnhtbCB0aW55eG1sX3dpbgorY29weSB0ZXN0MS54bWwgdGlueXhtbF93aW4KK2NvcHkgdGVzdDIueG1sIHRpbnl4bWxfd2luCisKK21rZGlyIC5cdGlueXhtbF93aW5cZG9jcworY29weSBkb2NzIC5cdGlueXhtbF93aW5cZG9jcworCmRpZmYgLS1naXQgYS9BQ00vdGlueXhtbC9yZWFkbWUudHh0IGIvQUNNL3Rpbnl4bWwvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThjMGYzCi0tLSAvZGV2L251bGwKKysrIGIvQUNNL3Rpbnl4bWwvcmVhZG1lLnR4dApAQCAtMCwwICsxLDMwOSBAQAorLyoqIEBtYWlucGFnZQorCis8aDE+IFRpbnlYbWwgPC9oMT4KKworVGlueVhtbCBpcyBhIHNpbXBsZSwgc21hbGwsIEMrKyBYTUwgcGFyc2VyIHRoYXQgY2FuIGJlIGVhc2lseSAKK2ludGVncmF0aW5nIGludG8gb3RoZXIgcHJvZ3JhbXMuCisKKworPGgyPiBXaGF0IGl0IGRvZXMuIDwvaDI+CisJCitJbiBicmllZiwgVGlueVhtbCBwYXJzZXMgYW4gWE1MIGRvY3VtZW50LCBhbmQgYnVpbGRzIGZyb20gdGhhdCBhIAorRG9jdW1lbnQgT2JqZWN0IE1vZGVsIHRoYXQgY2FuIGJlIHJlYWQsIG1vZGlmaWVkLCBhbmQgc2F2ZWQuCisKK1hNTCBzdGFuZHMgZm9yICJlWHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZS4iIEl0IGFsbG93cyB5b3UgdG8gY3JlYXRlIAoreW91ciBvd24gZG9jdW1lbnQgbWFya3Vwcy4gV2hlcmUgSFRNTCBkb2VzIGEgdmVyeSBnb29kIGpvYiBvZiBtYXJraW5nIAorZG9jdW1lbnRzIGZvciBicm93c2VycywgWE1MIGFsbG93cyB5b3UgdG8gZGVmaW5lIGFueSBraW5kIG9mIGRvY3VtZW50IAorbWFya3VwLCBmb3IgZXhhbXBsZSBhIGRvY3VtZW50IHRoYXQgZGVzY3JpYmVzIGEgInRvIGRvIiBsaXN0IGZvciBhbiAKK29yZ2FuaXplciBhcHBsaWNhdGlvbi4gWE1MIGlzIGEgdmVyeSBzdHJ1Y3R1cmVkIGFuZCBjb252ZW5pZW50IGZvcm1hdC4KK0FsbCB0aG9zZSByYW5kb20gZmlsZSBmb3JtYXRzIGNyZWF0ZWQgdG8gc3RvcmUgYXBwbGljYXRpb24gZGF0YSBjYW4gCithbGwgYmUgcmVwbGFjZWQgd2l0aCBYTUwuIE9uZSBwYXJzZXIgZm9yIGV2ZXJ5dGhpbmcuCisKK1RoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyB0byBhY2Nlc3MgYW5kIGludGVyYWN0IHdpdGggWE1MIGRhdGEuCitUaW55WG1sIHVzZXMgYSBEb2N1bWVudCBPYmplY3QgTW9kZWwsIG1lYW5pbmcgdGhlIFhNTCBkYXRhIGlzIHBhcnNlZAoraW50byBhIHRyZWUgb2JqZWN0cyB0aGF0IGNhbiBiZSBicm93c2VkIGFuZCBtYW5pcHVsYXRlZCwgYW5kIHRoZW4gCit3cml0dGVuIGJhY2sgdG8gZGlzay4gWW91IGNhbiBhbHNvIGNvbnN0cnVjdCBhbiBYTUwgZG9jdW1lbnQgZnJvbSAKK3NjcmF0Y2ggd2l0aCBDKysgb2JqZWN0cyBhbmQgd3JpdGUgdGhpcyB0byBkaXNrLgorCitUaW55WG1sIGlzIGRlc2lnbmVkIHRvIGJlIGVhc3kgYW5kIGZhc3QuIEl0IGlzIG9uZSBoZWFkZXIgYW5kIHRocmVlIGNwcCAKK2ZpbGVzLiBTaW1wbHkgYWRkIHRoZXNlIHRvIHlvdXIgcHJvamVjdCBhbmQgb2ZmIHlvdSBnby4gVGhlcmUgaXMgYW4gCitleGFtcGxlIHRvIGdldCB5b3Ugc3RhcnRlZC4gSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIFpMaWIgbGljZW5zZSwgCitzbyB5b3UgY2FuIHVzZSBpdCBpbiBvcGVuIHNvdXJjZSBvciBjb21tZXJjaWFsIGNvZGUuCisKK0l0IGF0dGVtcHRzIHRvIGJlIGEgZmxleGlibGUgcGFyc2VyLCBidXQgd2l0aCB0cnVseSBjb3JyZWN0IGFuZCAKK2NvbXBsaWFudCBYTUwgb3V0cHV0ICh3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGNoYXJhY3RlciBzZXQsCitiZWxvdy4pIFRpbnlYbWwgc2hvdWxkIGNvbXBpbGUgb24gYW55IHJlYXNvbmFibHkgQysrIAorc3lzdGVtLiBJdCBkb2VzIG5vdCByZWx5IG9uIGV4Y2VwdGlvbnMgb3IgUlRUSSwgYW5kIG9ubHkgdXNlcyB0aGUgU1RMCitzdHJpbmcgY2xhc3MuCisKKworPGgyPiBXaGF0IGl0IGRvZXNuJ3QgZG8uIDwvaDI+CisKK0l0IGRvZXNuknQgcGFyc2Ugb3IgdXNlIERURHMgKERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbnMpIG9yIFhTTJJzIAorKGVYdGVuc2libGUgU3R5bGVzaGVldCBMYW5ndWFnZS4pIEl0IGlzIGxpbWl0ZWQgdG8gdGhlIEFTQ0lJIAorY2hhcmFjdGVyIHNldC4gVGhlcmUgYXJlIG90aGVyIHBhcnNlcnMgb3V0IHRoZXJlIChjaGVjayBvdXQgCit3d3cuc291cmNlZm9yZ2Uub3JnLCBzZWFyY2ggZm9yIFhNTCkgdGhhdCBhcmUgbXVjaCBtb3JlIGZ1bGx5IAorZmVhdHVyZWQuIEJ1dCB0aGV5IGFyZSBhbHNvIG11Y2ggYmlnZ2VyLCB0YWtlIGxvbmdlciB0byBzZXQgdXAgaW4gCit5b3VyIHByb2plY3QsIGhhdmUgYSBoaWdoZXIgbGVhcm5pbmcgY3VydmUsIGFuZCBvZnRlbiBoYXZlIGEgbW9yZSAKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UuIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIGJyb3dzZXJzIG9yIGhhdmUgbW9yZSAKK2NvbXBsZXRlIFhNTCBuZWVkcywgVGlueVhtbCBpcyBub3QgdGhlIHBhcnNlciBmb3IgeW91LiAKKworCis8aDI+IENvZGUgU3RhdHVzLiAgPC9oMj4KKworQ3VycmVudGx5IGluIHVzZSwgVGlueVhtbCBpcyBsb29raW5nIHByZXR0eSBzdGFibGUuIElmIHlvdSBmaW5kCitidWdzLCBzZW5kIHRoZW0gaW4gYW5kIHdlJ2xsIGdldCB0aGVtIHN0cmFpZ2h0ZW5lZCBvdXQgYXMgc29vbiBhcyBwb3NzaWJsZS4KKworVGhlcmUgYXJlIHNvbWUgYXJlYXMgb2YgaW1wcm92ZW1lbnQ7IHBsZWFzZSBjaGVjayBzb3VyY2Vmb3JnZSBpZiB5b3UgYXJlIAoraW50ZXJlc3RlZCBpbiB3b3JraW5nIG9uIFRpbnhYbWwuCisKKworPGgyPiBDaGFuZ2VzIGJldHdlZW4gdmVyc2lvbiAxIGFuZCAyIDwvaDI+CisKKworPGgzPiBFbnRpdGllcyA8L2gzPgorVGlueVhtbCByZWNvZ25pemVzIHRoZSBwcmUtZGVmaW5lZCAiZW50aXR5IHJlZmVyZW5jZXMiLCBtZWFuaW5nIHNwZWNpYWwgCitjaGFyYWN0ZXJzLiBOYW1lbHk6CisKK0B2ZXJiYXRpbQorCSZhbXA7CSYKKwkmbHQ7CTwKKwkmZ3Q7CT4KKwkmcXVvdDsJIgorCSZhcG9zOwmRCitAZW5kdmVyYmF0aW0KKworVGhlc2UgYXJlIHJlY29nbml6ZWQgd2hlbiB0aGUgWE1MIGRvY3VtZW50IGlzIHJlYWQsIGFuZCB0cmFuc2xhdGVkIHRvIHRoZXJlCitBU0NJSSBlcXVpdmFsZW50cy4gRm9yIGluc3RhbmNlLCB0ZXh0IHdpdGggdGhlIFhNTCBvZjoKKworQHZlcmJhdGltCisJRmFyICZhbXA7IEF3YXkKK0BlbmR2ZXJiYXRpbQorCit3aWxsIGhhdmUgdGhlIFZhbHVlKCkgb2YgIkZhciAmIEF3YXkiIHdoZW4gcXVlcmllZCBmcm9tIHRoZSBUaVhtbFRleHQgb2JqZWN0LCAKK2J1dCB3aWxsIGJlIHdyaXR0ZW4gYmFjayB0byB0aGUgWE1MIHN0cmVhbS9maWxlIGFzIGFuIGVudGl0aXR5LgorCitUaVhtbCB3aWxsIGlnbm9yZSB1bmtub3duIGVudGl0aWVzIGFuZCB0aGUgCitAdmVyYmF0aW0KKyImI3giCitAZW5kdmVyYmF0aW0KK2VudGl0aWVzLCBhbmQgbGVhdmUgdGhlbSB1bnByb2Nlc3NlZC4KKworCis8aDM+IFN0cmVhbXMgPC9oMz4KK1RpWG1sIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHN1cHBvcnQgYm90aCBDIChGSUxFKSBhbmQgQysrIChvcGVyYXRvciA8PCw+PikgCitzdHJlYW1zLiBUaGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlcyB0aGF0IHlvdSBtYXkgbmVlZCB0byBiZSBhd2FyZSBvZi4KKworQyBzdHlsZSBvdXRwdXQ6CisJLSBiYXNlZCBvbiBGSUxFKgorCS0gdGhlIFByaW50KCkgYW5kIFNhdmVGaWxlKCkgbWV0aG9kcworCisJR2VuZXJhdGVzIGZvcm1hdHRlZCBvdXRwdXQsIHdpdGggcGxlbnR5IG9mIHdoaXRlIHNwYWNlLCBpbnRlbmRlZCB0byBiZSBhcyAKKwlodW1hbi1yZWFkYWJsZSBhcyBwb3NzaWJsZS4gVGhleSBhcmUgdmVyeSBmYXN0LCBhbmQgdG9sZXJhbnQgb2YgaWxsIGZvcm1lZCAKKwlYTUwgZG9jdW1lbnRzLiBGb3IgZXhhbXBsZSwgYW4gWE1MIGRvY3VtZW50IHRoYXQgY29udGFpbnMgMiByb290IGVsZW1lbnRzIAorCWFuZCAyIGRlY2xhcmF0aW9ucywgd2lsbCBwcmludC4KKworQyBzdHlsZSBpbnB1dDoKKwktIGJhc2VkIG9uIEZJTEUqCisJLSB0aGUgUGFyc2UoKSBhbmQgTG9hZEZpbGUoKSBtZXRob2RzCisKKwlBIGZhc3QsIHRvbGVyYW50IHJlYWQuIFVzZSB3aGVuZXZlciB5b3UgZG9uJ3QgbmVlZCB0aGUgQysrIHN0cmVhbXMuCisKK0MrKyBzdHlsZSBvdXB1dDoKKwktIGJhc2VkIG9uIHN0ZDo6b3N0cmVhbQorCS0gb3BlcmF0b3I8PAorCisJR2VuZXJhdGVzIGNvbmRlbnNlZCBvdXRwdXQsIGludGVuZGVkIGZvciBuZXR3b3JrIHRyYW5zbWlzc2lvbiByYXRoZXIgdGhhbgorCXJlYWRhYmlsaXR5LiBEZXBlbmRpbmcgb24geW91ciBzeXN0ZW0ncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3N0cmVhbSBjbGFzcywKKwl0aGVzZSBtYXkgYmUgc29tZXdoYXQgc2xvd2VyLiAoT3IgbWF5IG5vdC4pIE5vdCB0b2xlcmFudCBvZiBpbGwgZm9ybWVkIFhNTDoKKwlhIGRvY3VtZW50IHNob3VsZCBjb250YWluIHRoZSBjb3JyZWN0IG9uZSByb290IGVsZW1lbnQuIEFkZGl0aW9uYWwgcm9vdCBsZXZlbAorCWVsZW1lbnRzIHdpbGwgbm90IGJlIHN0cmVhbWVkIG91dC4KKworQysrIHN0eWxlIGlucHV0OgorCS0gYmFzZWQgb24gc3RkOjppc3RyZWFtCisJLSBvcGVyYXRvcj4+CisKKwlSZWFkcyBYTUwgZnJvbSBhIHN0cmVhbSwgbWFraW5nIGl0IHVzZWZ1bCBmb3IgbmV0d29yayB0cmFuc21pc3Npb24uIFRoZSB0cmlja3kKKwlwYXJ0IGlzIGtub3dpbmcgd2hlbiB0aGUgWE1MIGRvY3VtZW50IGlzIGNvbXBsZXRlLCBzaW5jZSB0aGVyZSB3aWxsIGFsbW9zdAorCWNlcnRhaW5seSBiZSBvdGhlciBkYXRhIGluIHRoZSBzdHJlYW0uIFRpbnlYbWwgd2lsbCBhc3N1bWUgdGhlIFhNTCBkYXRhIGlzCisJY29tcGxldGUgYWZ0ZXIgaXQgcmVhZHMgdGhlIHJvb3QgZWxlbWVudC4gQWxzbyBub3QgdGhhdCBvcGVyYXRvcj4+IGlzIHNvbWV3aGF0CisJc2xvd2VyIHRoYW4gUGFyc2UsIGR1ZSB0byBib3RoIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTVEwgYW5kIGxpbWl0YXRpb25zIG9mCisJVGlueVhtbC4KKworPGgzPiBXaGl0ZSBzcGFjZSA8L2gzPgorVGhlIHdvcmxkIHNpbXBseSBkb2VzIG5vdCBhZ3JlZSBvbiB3aGV0aGVyIHdoaXRlIHNwYWNlIHNob3VsZCBiZSBrZXB0LCBvciBjb25kZW5zZWQuCitGb3IgZXhhbXBsZSwgcHJldGVuZCB0aGUgJ18nIGlzIGEgc3BhY2UsIGFuZCBsb29rIGF0ICJIZWxsb19fX193b3JsZCIuIEhUTUwsIGFuZCAKK2F0IGxlYXN0IHNvbWUgWE1MIHBhcnNlcnMsIHdpbGwgaW50ZXJwcmV0IHRoaXMgYXMgIkhlbGxvX3dvcmxkIi4gVGhleSBjb25kZW5zZSB3aGl0ZQorc3BhY2UuIFNvbWUgWE1MIHBhcnNlcnMgZG8gbm90LCBhbmQgd2lsbCBsZWF2ZSBpdCBhcyAiSGVsbG9fX19fd29ybGQiLiAoUmVtZW1iZXIKK3RvIGtlZXAgcHJldGVuZGluZyB0aGUgXyBpcyBhIHNwYWNlLikKKworSXQncyBhbiBpc3N1ZSB0aGF0IGhhc24ndCBiZWVuIHJlc29sdmVkIHRvIG15IHNhdGlzZmFjdGlvbi4gVGlueVhtbCBzdXBwb3J0cyBib3RoCittb3RpZnMuIENhbGwgVGlYbWxCYXNlOjpTZXRDb25kZW5zZVdoaXRlU3BhY2UoIGJvb2wgKSB0byBzZXQgdGhlIGRlc2lyZWQgYmVoYXZpb3IuCitUaGUgZGVmYXVsdCBpcyB0byBjb25kZW5zZSB3aGl0ZSBzcGFjZS4KKworSWYgeW91IGNoYW5nZSB0aGUgZGVmYXVsdCwgeW91IHNob3VsZCBjYWxsIFRpWG1sQmFzZTo6U2V0Q29uZGVuc2VXaGl0ZVNwYWNlKCBib29sICkKK2JlZm9yZSBtYWtpbmcgYW55IGNhbGxzIHRvIFBhcnNlIFhNTCBkYXRhLCBhbmQgSSBkb24ndCByZWNvbW1lbmQgY2hhbmdpbmcgaXQgYWZ0ZXIKK2l0IGhhcyBiZWVuIHNldC4KKworCis8aDI+IFVzaW5nIGFuZCBJbnN0YWxsaW5nIDwvaDI+CisKK1RvIENvbXBpbGUgYW5kIFJ1biB4bWx0ZXN0OgorCitBIExpbnV4IE1ha2VmaWxlIGFuZCBhIFdpbmRvd3MgVmlzdWFsIEMrKyAuZHNwIGZpbGUgaXMgcHJvdmlkZWQuIAorU2ltcGx5IGNvbXBpbGUgYW5kIHJ1bi4gSXQgd2lsbCB3cml0ZSB0aGUgZmlsZSBkZW1vdGVzdC54bWwgdG8geW91ciAKK2Rpc2sgYW5kIGdlbmVyYXRlIG91dHB1dCBvbiB0aGUgc2NyZWVuLiBJdCBhbHNvIHRlc3RzIHdhbGtpbmcgdGhlCitET00gYnkgcHJpbnRpbmcgb3V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgZm91bmQgdXNpbmcgZGlmZmVyZW50IAordGVjaG5pcXVlcy4KKworVGhlIExpbnV4IG1ha2VmaWxlIGlzIHZlcnkgZ2VuZXJpYyBhbmQgd2lsbAorcHJvYmFibHkgcnVuIG9uIG90aGVyIHN5c3RlbXMsIGJ1dCBpcyBvbmx5IHRlc3RlZCBvbiBMaW51eC4gWW91IG5vCitsb25nZXIgbmVlZCB0byBydW4gJ21ha2UgZGVwZW5kJy4gVGhlIGRlcGVuZGVjaWVzIGhhdmUgYmVlbgoraGFyZCBjb2RlZC4KKworCitUbyBVc2UgaW4gYW4gQXBwbGljYXRpb246CisKK0FkZCB0aW55eG1sLmNwcCwgdGlueXhtbC5oLCB0aW55eG1sZXJyb3IuY3BwLCBhbmQgdGlueXhtbHBhcnNlci5jcHAgdG8geW91ciAKK3Byb2plY3Qgb3IgbWFrZSBmaWxlLiBUaGF0J3MgaXQhIEl0IHNob3VsZCBjb21waWxlIG9uIGFueSByZWFzb25hYmx5Citjb21wbGlhbnQgQysrIHN5c3RlbS4gWW91IGRvIG5vdCBuZWVkIHRvIGVuYWJsZSBleGNlcHRpb25zIG9yCitSVFRJIGZvciBUaW55WG1sLgorCisKKzxoMj4gV2hlcmUgaXQgbWF5IGdvLiAgPC9oMj4KKworQXQgdGhpcyBwb2ludCwgSSdtIGZvY3VzaW5nIG9uIHRpZ2h0ZW5pbmcgdXAgcmVtYWluaW5nIGlzc3Vlcy4KK0J1ZyBmaXhlcyAodGhvdWdoIGNvbWZvcnRhYmx5IHJhcmUpIGFuZCBtaW5vciBpbnRlcmZhY2UgCitjb3JyZWN0aW9ucy4gCisKK1RoZXJlIGFyZSBzb21lICJpdCB3b3VsZCBiZSBuaWNlIGlmLi4uIiBpdGVtcy4gSSdsbCBrZWVwIHRob3NlCitwb3N0ZWQgYXMgdGFza3Mgb24gU291cmNlRm9yZ2UuICh3d3cuc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3Rpbnl4bWwpCisKKworPGgyPiBIb3cgVGlueVhtbCB3b3Jrcy4gIDwvaDI+CisKK0FuIGV4YW1wbGUgaXMgcHJvYmFibHkgdGhlIGJlc3Qgd2F5IHRvIGdvLiBUYWtlOgorQHZlcmJhdGltCisJPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPZFub5I+CisJPD8tLSBPdXIgdG8gZG8gbGlzdCBkYXRhIC0tPgorCTxUb0RvPgorCQk8SXRlbSBwcmlvcml0eT0iMSI+IEdvIHRvIHRoZSA8Ym9sZD5Ub3kgc3RvcmUhPC9ib2xkPjwvSXRlbT4KKwkJPEl0ZW0gcHJpb3JpdHk9IjIiPiBEbyBiaWxsczwvSXRlbT4KKwk8L1RvRG8+CitAZW5kdmVyYmF0aW0KKworSXSScyBub3QgbXVjaCBvZiBhIFRvIERvIGxpc3QsIGJ1dCBpdCB3aWxsIGRvLiBUbyByZWFkIHRoaXMgZmlsZSAKKyhzYXkgImRlbW8ueG1sIikgeW91IHdvdWxkIGNyZWF0ZSBhIGRvY3VtZW50LCBhbmQgcGFyc2UgaXQgaW46CitAdmVyYmF0aW0KKwlUaVhtbERvY3VtZW50IGRvYyggImRlbW8ueG1sIiApOworCWRvYy5Mb2FkRmlsZSgpOworQGVuZHZlcmJhdGltCisKK0FuZCBpdJJzIHJlYWR5IHRvIGdvLiBOb3cgbGV0knMgbG9vayBhdCBzb21lIGxpbmVzIGFuZCBob3cgdGhleSAKK3JlbGF0ZSB0byB0aGUgRE9NLgorCis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9kW5vkj4KKworCVRoZSBmaXJzdCBsaW5lIGlzIGEgZGVjbGFyYXRpb24sIGFuZCBnZXRzIHR1cm5lZCBpbnRvIHRoZQorCVRpWG1sRGVjbGFyYXRpb24gY2xhc3MuIEl0IHdpbGwgYmUgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZQorCWRvY3VtZW50IG5vZGUuCisJCisJVGhpcyBpcyB0aGUgb25seSBkaXJlY3RpdmUvc3BlY2lhbCB0YWcgcGFyc2VkIGJ5IGJ5IFRpbnlYbWwuCisJR2VuZXJhbGx5IGRpcmVjdGl2ZSB0YXJncyBhcmUgc3RvcmVkIGluIFRpWG1sVW5rbm93biBzbyB0aGUgCisJY29tbWFuZHMgd29uknQgYmUgbG9zdCB3aGVuIGl0IGlzIHNhdmVkIGJhY2sgdG8gZGlzay4KKworPD8tLSBPdXIgdG8gZG8gbGlzdCBkYXRhIC0tPgorCisJQSBjb21tZW50LiBXaWxsIGJlY29tZSBhIFRpWG1sQ29tbWVudCBvYmplY3QuCisKKzxUb0RvPgorCisJVGhlIFRvRG8gdGFnIGRlZmluZXMgYSBUaVhtbEVsZW1lbnQgb2JqZWN0LiBUaGlzIG9uZSBkb2VzIG5vdCBoYXZlIAorCWFueSBhdHRyaWJ1dGVzLCBidXQgd2lsbCBjb250YWluIDIgb3RoZXIgZWxlbWVudHMsIGJvdGggb2Ygd2hpY2ggCisJYXJlIGl0ZW1zLgorCis8SXRlbSBwcmlvcml0eT0iMSI+IAorCisJQ3JlYXRlcyBhbm90aGVyIFRpWG1sRWxlbWVudCB3aGljaCBpcyBhIGNoaWxkIG9mIHRoZSAiVG9EbyIgZWxlbWVudC4gCisJVGhpcyBlbGVtZW50IGhhcyAxIGF0dHJpYnV0ZSwgd2l0aCB0aGUgbmFtZSCRcHJpb3JpdHmSIGFuZCB0aGUgdmFsdWUgCisJkTGSLgorCitHbyB0byB0aGUgCisKKwlBIFRpWG1sVGV4dC4gVGhpcyBpcyBhIGxlYWYgbm9kZSBhbmQgY2Fubm90IGNvbnRhaW4gb3RoZXIgbm9kZXMuIAorCUl0IGlzIGEgY2hpbGQgb2YgdGhlIJFJdGVtIiBFbGVtZW50LgorCis8Ym9sZD4KKwkKKwlBbm90aGVyIFRpWG1sRWxlbWVudCwgdGhpcyBvbmUgYSBjaGlsZCBvZiB0aGUgIkl0ZW0iIGVsZW1lbnQuCisKK0V0Yy4KKworTG9va2luZyBhdCB0aGUgZW50aXJlIG9iamVjdCB0cmVlLCB5b3UgZW5kIHVwIHdpdGg6CitAdmVyYmF0aW0KK1RpWG1sRG9jdW1lbnQJCQkJImRlbW8ueG1sIgorCVRpWG1sRGVjbGFyYXRpb24JCSJ2ZXJzaW9uPScxLjAnIiAic3RhbmRhbG9uZT2Rbm+SIgorCVRpWG1sQ29tbWVudAkJCSIgT3VyIHRvIGRvIGxpc3QgZGF0YSIKKwlUaVhtbEVsZW1lbnQJCQkiVG9EbyIKKwkJVGlYbWxFbGVtZW50CQkiSXRlbSIJCUF0dHJpYnR1dGVzOiBwcmlvcml0eSA9IDEKKwkJCVRpWG1sVGV4dAkJIkdvIHRvIHRoZSAiCisJCQlUaVhtbEVsZW1lbnQgICAgImJvbGQiCisJCQkJVGlYbWxUZXh0CSJUb3kgc3RvcmUhIgorCVRpWG1sRWxlbWVudAkJCSJJdGVtIgkJQXR0cmlidXRlczogcHJpb3JpdHk9MgorCQlUaVhtbFRleHQJCQkiYmlsbHMiCitAZW5kdmVyYmF0aW0KKworPGgyPiBDb250cmlidXRvcnMgPC9oMj4KKworVGhhbmtzIHZlcnkgbXVjaCB0byBldmVyeW9uZSB3aG8gc2VuZHMgc3VnZ2VzdGlvbnMsIGJ1Z3MsIGlkZWFzLCBhbmQgCitlbmNvdXJhZ2VtZW50LiBJdCBhbGwgaGVscHMsIGFuZCBtYWtlcyB0aGlzIHByb2plY3QgZnVuLiBBIHNwZWNpYWwgdGhhbmtzCit0byB0aGUgY29udHJpYnV0b3JzIG9uIHRoZSB3ZWIgcGFnZXMgdGhhdCBrZWVwIGl0IGxpdmVseS4KKworU28gbWFueSBwZW9wbGUgaGF2ZSBzZW50IGluIGJ1Z3MgYW5kIGlkZWFzLCB0aGF0IHJhdGhlciB0aGFuIGxpc3QgaGVyZSBJCit0cnkgdG8gZ2l2ZSBjcmVkaXQgZHVlIGluIHRoZSAiY2hhbmdlcy50eHQiIGZpbGUuCisKKzxoMj4gRG9jdW1lbnRhdGlvbiA8L2gyPgorCitUaGUgZG9jdW1lbnRhdGlvbiBpcyBidWlsZCB3aXRoIERveHlnZW4sIHVzaW5nIHRoZSAnZG94JyAKK2NvbmZpZ3VyYXRpb24gZmlsZS4KKworPGgyPiBMaWNlbnNlIDwvaDI+CisKK1RpbnlYbWwgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHpsaWIgbGljZW5zZToKKworVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgCit3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IAorZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgCitwdXJwb3NlLCBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgCityZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIAorc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIAord291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKworMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgCittdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisKKzMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSAKK2Rpc3RyaWJ1dGlvbi4KKworPGgyPiBSZWZlcmVuY2VzICA8L2gyPgorCitUaGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBpcyB0aGUgZGVmaW5pdGl2ZSBzdGFuZGFyZCBib2R5IGZvciAKK1hNTCwgYW5kIHRoZXJlIHdlYiBwYWdlcyBjb250YWluIGh1Z2UgYW1vdW50cyBvZiBpbmZvcm1hdGlvbi4gSSBhbHNvIAorcmVjb21tZW5kICJYTUwgUG9ja2V0IFJlZmVyZW5jZSIgYnkgUm9iZXJ0IEVja3N0ZWluIGFuZCBwdWJsaXNoZWQgYnkgCitPklJlaWxseS4KKworPGgyPiBDb250YWN0IE1lOiA8L2gyPgorCitJkmQgYXBwcmVjaWF0ZXMgeW91ciBzdWdnZXN0aW9ucywgYW5kIHdvdWxkIGxvdmUgdG8ga25vdyBpZiB5b3UgCit1c2UgVGlueVhtbC4gSSBob3BlIHlvdSBlbmpveSBpdCBhbmQgZmluZCBpdCB1c2VmdWwuIFBsZWFzZSBwb3N0CitxdWVzdGlvbnMsIGNvbW1lbnRzLCBmaWxlIGJ1Z3MsIG9yIGNvbnRhY3QgbWUgYXQ6CisKK3d3dy5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdGlueXhtbAorCitMZWUgVGhvbWFzb24KKyovCmRpZmYgLS1naXQgYS9BQ00vdGlueXhtbC90ZXN0LmRzcCBiL0FDTS90aW55eG1sL3Rlc3QuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjQ0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vdGlueXhtbC90ZXN0LmRzcApAQCAtMCwwICsxLDk1IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InRlc3QiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz10ZXN0IC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3QubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInRlc3QubWFrIiBDRkc9InRlc3QgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAidGVzdCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgInRlc3QgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gInRlc3QgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJ0ZXN0IC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAidGVzdF9fX1ciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVzdF9fX1ciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgInRlc3RfX19XIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZXN0X19fVyINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgInRlc3QgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAidGVzdCAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxkZW1vdGVzdC54bWwNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxzbWFsbHRlc3QueG1sDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sdGVzdC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9BQ00vdGlueXhtbC90ZXN0LmRzdyBiL0FDTS90aW55eG1sL3Rlc3QuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmQ5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vdGlueXhtbC90ZXN0LmRzdwpAQCAtMCwwICsxLDQ0IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJ0ZXN0Ij0uXHRlc3QuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHRpbnl4bWwNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAidGlueXhtbCI9Llx0aW55eG1sLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9BQ00vdGlueXhtbC90aW55eG1sLmNwcCBiL0FDTS90aW55eG1sL3Rpbnl4bWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTEzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vdGlueXhtbC90aW55eG1sLmNwcApAQCAtMCwwICsxLDEwMDcgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDAgTGVlIFRob21hc29uICh3d3cuZ3Jpbm5pbmdsaXphcmQuY29tKQorCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCAKK3dhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgCitkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSAKK3B1cnBvc2UsIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCAKK3JlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKzEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3QKK25vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcworc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uCit3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorCisyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZAorbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCiszLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbi4KKyovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSAidGlueXhtbC5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCitib29sIFRpWG1sQmFzZTo6Y29uZGVuc2VXaGl0ZVNwYWNlID0gdHJ1ZTsKKworCit2b2lkIFRpWG1sQmFzZTo6UHV0U3RyaW5nKCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6Om9zdHJlYW0qIHN0cmVhbSApCit7CisJLy8gU2NhbiBmb3IgdGhlIGFsbCBpbXBvcnRhbnQgJyYnCisJdW5zaWduZWQgaW50IGk9MCwgaj0wOworCisJd2hpbGUgKCBpIDwgc3RyLmxlbmd0aCgpICkKKwl7CisJCXVuc2lnbmVkIG5leHQgPSBzdHIuZmluZCggJyYnLCBpICk7CisKKwkJaWYgKCBuZXh0ID09IHN0cmluZzo6bnBvcyApCisJCXsKKwkJCXN0cmVhbS0+d3JpdGUoICZzdHIuYXQoIGkgKSwgc3RyLmxlbmd0aCgpIC0gaSApOworCQkJcmV0dXJuOworICAgCQl9CisKKwkJLy8gV2UgZm91bmQgYW4gZW50aXR5LgorCQlpZiAoIG5leHQgLSBpID4gMCApCisJCQlzdHJlYW0tPndyaXRlKCAmc3RyLmF0KCBpICksIG5leHQgLSBpICk7CisJCWkgPSBuZXh0OworCisJCS8vIENoZWNrIGZvciB0aGUgc3BlY2lhbCAiJiN4IiBlbnRpdGl0eQorCQlpZiAoICAgIGkgPCBzdHIubGVuZ3RoKCkgLSAyCisJCSAgICAgJiYgc3RyW2ldID09ICcmJworCQkJICYmIHN0cltpKzFdID09ICcjJworCQkJICYmIHN0cltpKzJdID09ICd4JyApCisJCXsKKwkJCXN0cmVhbS0+cHV0KCBzdHJbaV0gKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZvciAoIGo9MDsgajxOVU1fRU5USVRZOyArK2ogKQorCQkJeworCQkJCWlmICggc3RyW2ldID09IGVudGl0eVtqXS5jaHIgKQorCQkJCXsKKwkJCQkJc3RyZWFtLT53cml0ZSggZW50aXR5W2pdLnN0ciwgZW50aXR5W2pdLnN0ckxlbmd0aCApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIGogPT0gTlVNX0VOVElUWSApCisJCQl7CisJCQkJc3RyZWFtLT5wdXQoIHN0cltpXSApOworCQkJfQorCQl9CisJCSsraTsKKwl9Cit9CisKKworVGlYbWxOb2RlOjpUaVhtbE5vZGUoIE5vZGVUeXBlIF90eXBlICkKK3sKKwlwYXJlbnQgPSAwOworCXR5cGUgPSBfdHlwZTsKKwlmaXJzdENoaWxkID0gMDsKKwlsYXN0Q2hpbGQgPSAwOworCXByZXYgPSAwOworCW5leHQgPSAwOworfQorCisKK1RpWG1sTm9kZTo6flRpWG1sTm9kZSgpCit7CisJVGlYbWxOb2RlKiBub2RlID0gZmlyc3RDaGlsZDsKKwlUaVhtbE5vZGUqIHRlbXAgPSAwOworCisJd2hpbGUgKCBub2RlICkKKwl7CisJCXRlbXAgPSBub2RlOworCQlub2RlID0gbm9kZS0+bmV4dDsKKwkJZGVsZXRlIHRlbXA7CisJfQkKK30KKworCit2b2lkIFRpWG1sTm9kZTo6Q2xlYXIoKQoreworCVRpWG1sTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQ7CisJVGlYbWxOb2RlKiB0ZW1wID0gMDsKKworCXdoaWxlICggbm9kZSApCisJeworCQl0ZW1wID0gbm9kZTsKKwkJbm9kZSA9IG5vZGUtPm5leHQ7CisJCWRlbGV0ZSB0ZW1wOworCX0JCisKKwlmaXJzdENoaWxkID0gMDsKKwlsYXN0Q2hpbGQgPSAwOworfQorCisKK1RpWG1sTm9kZSogVGlYbWxOb2RlOjpMaW5rRW5kQ2hpbGQoIFRpWG1sTm9kZSogbm9kZSApCit7CisJbm9kZS0+cGFyZW50ID0gdGhpczsKKwkKKwlub2RlLT5wcmV2ID0gbGFzdENoaWxkOworCW5vZGUtPm5leHQgPSAwOworCisJaWYgKCBsYXN0Q2hpbGQgKQorCQlsYXN0Q2hpbGQtPm5leHQgPSBub2RlOworCWVsc2UKKwkJZmlyc3RDaGlsZCA9IG5vZGU7CQkJLy8gaXQgd2FzIGFuIGVtcHR5IGxpc3QuCisKKwlsYXN0Q2hpbGQgPSBub2RlOworCXJldHVybiBub2RlOworfQorCQorCitUaVhtbE5vZGUqIFRpWG1sTm9kZTo6SW5zZXJ0RW5kQ2hpbGQoIGNvbnN0IFRpWG1sTm9kZSYgYWRkVGhpcyApCit7CisJVGlYbWxOb2RlKiBub2RlID0gYWRkVGhpcy5DbG9uZSgpOworCWlmICggIW5vZGUgKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBMaW5rRW5kQ2hpbGQoIG5vZGUgKTsKK30KKworCitUaVhtbE5vZGUqIFRpWG1sTm9kZTo6SW5zZXJ0QmVmb3JlQ2hpbGQoIFRpWG1sTm9kZSogYmVmb3JlVGhpcywgY29uc3QgVGlYbWxOb2RlJiBhZGRUaGlzICkKK3sKKwlpZiAoIGJlZm9yZVRoaXMtPnBhcmVudCAhPSB0aGlzICkKKwkJcmV0dXJuIDA7CisJCisJVGlYbWxOb2RlKiBub2RlID0gYWRkVGhpcy5DbG9uZSgpOworCWlmICggIW5vZGUgKQorCQlyZXR1cm4gMDsKKwlub2RlLT5wYXJlbnQgPSB0aGlzOworCQorCW5vZGUtPm5leHQgPSBiZWZvcmVUaGlzOworCW5vZGUtPnByZXYgPSBiZWZvcmVUaGlzLT5wcmV2OworCWJlZm9yZVRoaXMtPnByZXYtPm5leHQgPSBub2RlOworCWJlZm9yZVRoaXMtPnByZXYgPSBub2RlOworCXJldHVybiBub2RlOworfQorCisKK1RpWG1sTm9kZSogVGlYbWxOb2RlOjpJbnNlcnRBZnRlckNoaWxkKCBUaVhtbE5vZGUqIGFmdGVyVGhpcywgY29uc3QgVGlYbWxOb2RlJiBhZGRUaGlzICkKK3sKKwlpZiAoIGFmdGVyVGhpcy0+cGFyZW50ICE9IHRoaXMgKQorCQlyZXR1cm4gMDsKKwkKKwlUaVhtbE5vZGUqIG5vZGUgPSBhZGRUaGlzLkNsb25lKCk7CisJaWYgKCAhbm9kZSApCisJCXJldHVybiAwOworCW5vZGUtPnBhcmVudCA9IHRoaXM7CisJCisJbm9kZS0+cHJldiA9IGFmdGVyVGhpczsKKwlub2RlLT5uZXh0ID0gYWZ0ZXJUaGlzLT5uZXh0OworCWFmdGVyVGhpcy0+bmV4dC0+cHJldiA9IG5vZGU7CisJYWZ0ZXJUaGlzLT5uZXh0ID0gbm9kZTsKKwlyZXR1cm4gbm9kZTsKK30KKworCitUaVhtbE5vZGUqIFRpWG1sTm9kZTo6UmVwbGFjZUNoaWxkKCBUaVhtbE5vZGUqIHJlcGxhY2VUaGlzLCBjb25zdCBUaVhtbE5vZGUmIHdpdGhUaGlzICkKK3sKKwlpZiAoIHJlcGxhY2VUaGlzLT5wYXJlbnQgIT0gdGhpcyApCisJCXJldHVybiAwOworCQorCVRpWG1sTm9kZSogbm9kZSA9IHdpdGhUaGlzLkNsb25lKCk7CisJaWYgKCAhbm9kZSApCisJCXJldHVybiAwOworCisJbm9kZS0+bmV4dCA9IHJlcGxhY2VUaGlzLT5uZXh0OworCW5vZGUtPnByZXYgPSByZXBsYWNlVGhpcy0+cHJldjsKKworCWlmICggcmVwbGFjZVRoaXMtPm5leHQgKQorCQlyZXBsYWNlVGhpcy0+bmV4dC0+cHJldiA9IG5vZGU7CisJZWxzZQorCQlsYXN0Q2hpbGQgPSBub2RlOworCisJaWYgKCByZXBsYWNlVGhpcy0+cHJldiApCisJCXJlcGxhY2VUaGlzLT5wcmV2LT5uZXh0ID0gbm9kZTsKKwllbHNlCisJCWZpcnN0Q2hpbGQgPSBub2RlOworCisJZGVsZXRlIHJlcGxhY2VUaGlzOworCW5vZGUtPnBhcmVudCA9IHRoaXM7CisJcmV0dXJuIG5vZGU7Cit9CisKKworYm9vbCBUaVhtbE5vZGU6OlJlbW92ZUNoaWxkKCBUaVhtbE5vZGUqIHJlbW92ZVRoaXMgKQoreworCWlmICggcmVtb3ZlVGhpcy0+cGFyZW50ICE9IHRoaXMgKQorCXsJCisJCWFzc2VydCggMCApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCWlmICggcmVtb3ZlVGhpcy0+bmV4dCApCisJCXJlbW92ZVRoaXMtPm5leHQtPnByZXYgPSByZW1vdmVUaGlzLT5wcmV2OworCWVsc2UKKwkJbGFzdENoaWxkID0gcmVtb3ZlVGhpcy0+cHJldjsKKworCWlmICggcmVtb3ZlVGhpcy0+cHJldiApCisJCXJlbW92ZVRoaXMtPnByZXYtPm5leHQgPSByZW1vdmVUaGlzLT5uZXh0OworCWVsc2UKKwkJZmlyc3RDaGlsZCA9IHJlbW92ZVRoaXMtPm5leHQ7CisKKwlkZWxldGUgcmVtb3ZlVGhpczsKKwlyZXR1cm4gdHJ1ZTsKK30KKworCitUaVhtbE5vZGUqIFRpWG1sTm9kZTo6Rmlyc3RDaGlsZCggY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlICkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisJZm9yICggbm9kZSA9IGZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0ICkKKwl7CisJCWlmICggbm9kZS0+VmFsdWUoKSA9PSB2YWx1ZSApCisJCQlyZXR1cm4gbm9kZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworVGlYbWxOb2RlKiBUaVhtbE5vZGU6Okxhc3RDaGlsZCggY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlICkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisJZm9yICggbm9kZSA9IGxhc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUtPnByZXYgKQorCXsKKwkJaWYgKCBub2RlLT5WYWx1ZSgpID09IHZhbHVlICkKKwkJCXJldHVybiBub2RlOworCX0KKwlyZXR1cm4gMDsKK30KKworCitUaVhtbE5vZGUqIFRpWG1sTm9kZTo6SXRlcmF0ZUNoaWxkcmVuKCBUaVhtbE5vZGUqIHByZXZpb3VzICkgY29uc3QKK3sKKwlpZiAoICFwcmV2aW91cyApCisJeworCQlyZXR1cm4gRmlyc3RDaGlsZCgpOworCX0KKwllbHNlCisJeworCQlhc3NlcnQoIHByZXZpb3VzLT5wYXJlbnQgPT0gdGhpcyApOworCQlyZXR1cm4gcHJldmlvdXMtPk5leHRTaWJsaW5nKCk7CisJfQorfQorCisKK1RpWG1sTm9kZSogVGlYbWxOb2RlOjpJdGVyYXRlQ2hpbGRyZW4oIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwsIFRpWG1sTm9kZSogcHJldmlvdXMgKSBjb25zdAoreworCWlmICggIXByZXZpb3VzICkKKwl7CisJCXJldHVybiBGaXJzdENoaWxkKCB2YWwgKTsKKwl9CisJZWxzZQorCXsKKwkJYXNzZXJ0KCBwcmV2aW91cy0+cGFyZW50ID09IHRoaXMgKTsKKwkJcmV0dXJuIHByZXZpb3VzLT5OZXh0U2libGluZyggdmFsICk7CisJfQorfQorCisKK1RpWG1sTm9kZSogVGlYbWxOb2RlOjpOZXh0U2libGluZyggY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlICkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisJZm9yICggbm9kZSA9IG5leHQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0ICkKKwl7CisJCWlmICggbm9kZS0+VmFsdWUoKSA9PSB2YWx1ZSApCisJCQlyZXR1cm4gbm9kZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworVGlYbWxOb2RlKiBUaVhtbE5vZGU6OlByZXZpb3VzU2libGluZyggY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlICkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisJZm9yICggbm9kZSA9IHByZXY7IG5vZGU7IG5vZGUgPSBub2RlLT5wcmV2ICkKKwl7CisJCWlmICggbm9kZS0+VmFsdWUoKSA9PSB2YWx1ZSApCisJCQlyZXR1cm4gbm9kZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBUaVhtbEVsZW1lbnQ6OlJlbW92ZUF0dHJpYnV0ZSggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgKQoreworCVRpWG1sQXR0cmlidXRlKiBub2RlID0gYXR0cmlidXRlU2V0LkZpbmQoIG5hbWUgKTsKKwlpZiAoIG5vZGUgKQorCXsKKwkJYXR0cmlidXRlU2V0LlJlbW92ZSggbm9kZSApOworCQlkZWxldGUgbm9kZTsKKwl9Cit9CisKKworVGlYbWxFbGVtZW50KiBUaVhtbE5vZGU6OkZpcnN0Q2hpbGRFbGVtZW50KCkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisKKwlmb3IgKAlub2RlID0gRmlyc3RDaGlsZCgpOworCQkJbm9kZTsKKwkJCW5vZGUgPSBub2RlLT5OZXh0U2libGluZygpICkKKwl7CisJCWlmICggbm9kZS0+VG9FbGVtZW50KCkgKQorCQkJcmV0dXJuIG5vZGUtPlRvRWxlbWVudCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitUaVhtbEVsZW1lbnQqIFRpWG1sTm9kZTo6Rmlyc3RDaGlsZEVsZW1lbnQoIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSApIGNvbnN0Cit7CisJVGlYbWxOb2RlKiBub2RlOworCisJZm9yICgJbm9kZSA9IEZpcnN0Q2hpbGQoIHZhbHVlICk7CisJCQlub2RlOworCQkJbm9kZSA9IG5vZGUtPk5leHRTaWJsaW5nKCB2YWx1ZSApICkKKwl7CisJCWlmICggbm9kZS0+VG9FbGVtZW50KCkgKQorCQkJcmV0dXJuIG5vZGUtPlRvRWxlbWVudCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitUaVhtbEVsZW1lbnQqIFRpWG1sTm9kZTo6TmV4dFNpYmxpbmdFbGVtZW50KCkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisKKwlmb3IgKAlub2RlID0gTmV4dFNpYmxpbmcoKTsKKwkJCW5vZGU7CisJCQlub2RlID0gbm9kZS0+TmV4dFNpYmxpbmcoKSApCisJeworCQlpZiAoIG5vZGUtPlRvRWxlbWVudCgpICkKKwkJCXJldHVybiBub2RlLT5Ub0VsZW1lbnQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworVGlYbWxFbGVtZW50KiBUaVhtbE5vZGU6Ok5leHRTaWJsaW5nRWxlbWVudCggY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlICkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisKKwlmb3IgKAlub2RlID0gTmV4dFNpYmxpbmcoIHZhbHVlICk7CisJCQlub2RlOworCQkJbm9kZSA9IG5vZGUtPk5leHRTaWJsaW5nKCB2YWx1ZSApICkKKwl7CisJCWlmICggbm9kZS0+VG9FbGVtZW50KCkgKQorCQkJcmV0dXJuIG5vZGUtPlRvRWxlbWVudCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKK1RpWG1sRG9jdW1lbnQqIFRpWG1sTm9kZTo6R2V0RG9jdW1lbnQoKSBjb25zdAoreworCWNvbnN0IFRpWG1sTm9kZSogbm9kZTsKKworCWZvciggbm9kZSA9IHRoaXM7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnQgKQorCXsKKwkJaWYgKCBub2RlLT5Ub0RvY3VtZW50KCkgKQorCQkJcmV0dXJuIG5vZGUtPlRvRG9jdW1lbnQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLy8gVGlYbWxFbGVtZW50OjpUaVhtbEVsZW1lbnQoKSAKKy8vIAk6IFRpWG1sTm9kZSggVGlYbWxOb2RlOjpFTEVNRU5UICkKKy8vIHsKKy8vIH0KKworVGlYbWxFbGVtZW50OjpUaVhtbEVsZW1lbnQoIGNvbnN0IHN0ZDo6c3RyaW5nJiBfdmFsdWUgKSAKKwk6IFRpWG1sTm9kZSggVGlYbWxOb2RlOjpFTEVNRU5UICkKK3sKKwlmaXJzdENoaWxkID0gbGFzdENoaWxkID0gMDsKKwl2YWx1ZSA9IF92YWx1ZTsKK30KKworVGlYbWxFbGVtZW50Ojp+VGlYbWxFbGVtZW50KCkKK3sKKwl3aGlsZSggYXR0cmlidXRlU2V0LkZpcnN0KCkgKQorCXsKKwkJVGlYbWxBdHRyaWJ1dGUqIG5vZGUgPSBhdHRyaWJ1dGVTZXQuRmlyc3QoKTsKKwkJYXR0cmlidXRlU2V0LlJlbW92ZSggbm9kZSApOworCQlkZWxldGUgbm9kZTsKKwl9Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nKiBUaVhtbEVsZW1lbnQ6OkF0dHJpYnV0ZSggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgKSBjb25zdAoreworCVRpWG1sQXR0cmlidXRlKiBub2RlID0gYXR0cmlidXRlU2V0LkZpbmQoIG5hbWUgKTsKKworCWlmICggbm9kZSApCisJCXJldHVybiAmKG5vZGUtPlZhbHVlKCkgKTsKKworCXJldHVybiAwOworfQorCisKK2NvbnN0IHN0ZDo6c3RyaW5nKiBUaVhtbEVsZW1lbnQ6OkF0dHJpYnV0ZSggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCogaSApIGNvbnN0Cit7CisJY29uc3Qgc3RkOjpzdHJpbmcqIHMgPSBBdHRyaWJ1dGUoIG5hbWUgKTsKKwlpZiAoIHMgKQorCQkqaSA9IGF0b2koIHMtPmNfc3RyKCkgKTsKKwllbHNlCisJCSppID0gMDsKKwlyZXR1cm4gczsKK30KKworCit2b2lkIFRpWG1sRWxlbWVudDo6U2V0QXR0cmlidXRlKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50IHZhbCApCit7CQorCWNoYXIgYnVmWzY0XTsKKwlzcHJpbnRmKCBidWYsICIlZCIsIHZhbCApOworCisJc3RkOjpzdHJpbmcgdiA9IGJ1ZjsKKworCVNldEF0dHJpYnV0ZSggbmFtZSwgdiApOworfQorCisKK3ZvaWQgVGlYbWxFbGVtZW50OjpTZXRBdHRyaWJ1dGUoIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgKQoreworCVRpWG1sQXR0cmlidXRlKiBub2RlID0gYXR0cmlidXRlU2V0LkZpbmQoIG5hbWUgKTsKKwlpZiAoIG5vZGUgKQorCXsKKwkJbm9kZS0+U2V0VmFsdWUoIHZhbHVlICk7CisJCXJldHVybjsKKwl9CisKKwlUaVhtbEF0dHJpYnV0ZSogYXR0cmliID0gbmV3IFRpWG1sQXR0cmlidXRlKCBuYW1lLCB2YWx1ZSApOworCWlmICggYXR0cmliICkKKwl7CisJCWF0dHJpYnV0ZVNldC5BZGQoIGF0dHJpYiApOworCX0KKwllbHNlCisJeworCQlUaVhtbERvY3VtZW50KiBkb2N1bWVudCA9IEdldERvY3VtZW50KCk7CisJCWlmICggZG9jdW1lbnQgKSBkb2N1bWVudC0+U2V0RXJyb3IoIFRJWE1MX0VSUk9SX09VVF9PRl9NRU1PUlkgKTsKKwl9Cit9CisKKwordm9pZCBUaVhtbEVsZW1lbnQ6OlByaW50KCBGSUxFKiBjZmlsZSwgaW50IGRlcHRoICkgY29uc3QKK3sKKwlpbnQgaTsKKwlmb3IgKCBpPTA7IGk8ZGVwdGg7IGkrKyApCisJeworCQlmcHJpbnRmKCBjZmlsZSwgIiAgICAiICk7CisJfQorCisJZnByaW50ZiggY2ZpbGUsICI8JXMiLCB2YWx1ZS5jX3N0cigpICk7CisKKwlUaVhtbEF0dHJpYnV0ZSogYXR0cmliOworCWZvciAoIGF0dHJpYiA9IGF0dHJpYnV0ZVNldC5GaXJzdCgpOyBhdHRyaWI7IGF0dHJpYiA9IGF0dHJpYi0+TmV4dCgpICkKKwl7CisJCWZwcmludGYoIGNmaWxlLCAiICIgKTsKKwkJYXR0cmliLT5QcmludCggY2ZpbGUsIGRlcHRoICk7CisJfQorCisJLy8gVGhlcmUgYXJlIDMgZGlmZmVyZW50IGZvcm1hdHRpbmcgYXBwcm9hY2hlczoKKwkvLyAxKSBBbiBlbGVtZW50IHdpdGhvdXQgY2hpbGRyZW4gaXMgcHJpbnRlZCBhcyBhIDxmb28gLz4gbm9kZQorCS8vIDIpIEFuIGVsZW1lbnQgd2l0aCBvbmx5IGEgdGV4dCBjaGlsZCBpcyBwcmludGVkIGFzIDxmb28+IHRleHQgPC9mb28+CisJLy8gMykgQW4gZWxlbWVudCB3aXRoIGNoaWxkcmVuIGlzIHByaW50ZWQgb24gbXVsdGlwbGUgbGluZXMuCisJVGlYbWxOb2RlKiBub2RlOworCWlmICggIWZpcnN0Q2hpbGQgKQorCXsKKwkJZnByaW50ZiggY2ZpbGUsICIgLz4iICk7CisgIAl9CisJZWxzZSBpZiAoIGZpcnN0Q2hpbGQgPT0gbGFzdENoaWxkICYmIGZpcnN0Q2hpbGQtPlRvVGV4dCgpICkKKwl7CisJCWZwcmludGYoIGNmaWxlLCAiPiIgKTsKKwkJZmlyc3RDaGlsZC0+UHJpbnQoIGNmaWxlLCBkZXB0aCArIDEgKTsKKwkJZnByaW50ZiggY2ZpbGUsICI8LyVzPiIsIHZhbHVlLmNfc3RyKCkgKTsKKyAgCX0KKwllbHNlCisJeworCQlmcHJpbnRmKCBjZmlsZSwgIj4iICk7CisKKwkJZm9yICggbm9kZSA9IGZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGU9bm9kZS0+TmV4dFNpYmxpbmcoKSApCisJCXsKKwkgCQlpZiAoICFub2RlLT5Ub1RleHQoKSApCisJCQl7CisJCQkJZnByaW50ZiggY2ZpbGUsICJcbiIgKTsKKwkJCX0KKwkJCW5vZGUtPlByaW50KCBjZmlsZSwgZGVwdGgrMSApOworCQl9CisJCWZwcmludGYoIGNmaWxlLCAiXG4iICk7CisJCWZvciggaT0wOyBpPGRlcHRoOyArK2kgKQorCQkJZnByaW50ZiggY2ZpbGUsICIgICAgIiApOworCQlmcHJpbnRmKCBjZmlsZSwgIjwvJXM+IiwgdmFsdWUuY19zdHIoKSApOworCX0KK30KKworCit2b2lkIFRpWG1sRWxlbWVudDo6U3RyZWFtT3V0KCBzdGQ6Om9zdHJlYW0qIHN0cmVhbSApIGNvbnN0Cit7CisJKCpzdHJlYW0pIDw8ICI8IiA8PCB2YWx1ZTsKKworCVRpWG1sQXR0cmlidXRlKiBhdHRyaWI7CisJZm9yICggYXR0cmliID0gYXR0cmlidXRlU2V0LkZpcnN0KCk7IGF0dHJpYjsgYXR0cmliID0gYXR0cmliLT5OZXh0KCkgKQorCXsJCisJCSgqc3RyZWFtKSA8PCAiICI7CisJCWF0dHJpYi0+U3RyZWFtT3V0KCBzdHJlYW0gKTsKKwl9CisKKwkvLyBJZiB0aGlzIG5vZGUgaGFzIGNoaWxkcmVuLCBnaXZlIGl0IGEgY2xvc2luZyB0YWcuIEVsc2UKKwkvLyBtYWtlIGl0IGFuIGVtcHR5IHRhZy4KKwlUaVhtbE5vZGUqIG5vZGU7CisJaWYgKCBmaXJzdENoaWxkICkKKwl7IAkJCisJCSgqc3RyZWFtKSA8PCAiPiI7CisKKwkJZm9yICggbm9kZSA9IGZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGU9bm9kZS0+TmV4dFNpYmxpbmcoKSApCisJCXsKKwkJCW5vZGUtPlN0cmVhbU91dCggc3RyZWFtICk7CisJCX0KKwkJKCpzdHJlYW0pIDw8ICI8LyIgPDwgdmFsdWUgPDwgIj4iOworCX0KKwllbHNlCisJeworCQkoKnN0cmVhbSkgPDwgIiAvPiI7CisJfQorfQorCisKK1RpWG1sTm9kZSogVGlYbWxFbGVtZW50OjpDbG9uZSgpIGNvbnN0Cit7CisJVGlYbWxFbGVtZW50KiBjbG9uZSA9IG5ldyBUaVhtbEVsZW1lbnQoIFZhbHVlKCkgKTsKKworCWlmICggIWNsb25lICkKKwkJcmV0dXJuIDA7CisJCisJQ29weVRvQ2xvbmUoIGNsb25lICk7CisKKwkvLyBDbG9uZSB0aGUgYXR0cmlidXRlcywgdGhlbiBjbG9uZSB0aGUgY2hpbGRyZW4uCisJVGlYbWxBdHRyaWJ1dGUqIGF0dHJpYnV0ZSA9IDA7CisJZm9yKAlhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVTZXQuRmlyc3QoKTsgCisJCQlhdHRyaWJ1dGU7IAorCQkJYXR0cmlidXRlID0gYXR0cmlidXRlLT5OZXh0KCkgKQorCXsKKwkJY2xvbmUtPlNldEF0dHJpYnV0ZSggYXR0cmlidXRlLT5OYW1lKCksIGF0dHJpYnV0ZS0+VmFsdWUoKSApOworCX0KKwkKKwlUaVhtbE5vZGUqIG5vZGUgPSAwOworCWZvciAoIG5vZGUgPSBmaXJzdENoaWxkOyBub2RlOyBub2RlID0gbm9kZS0+TmV4dFNpYmxpbmcoKSApCisJeworCQljbG9uZS0+TGlua0VuZENoaWxkKCBub2RlLT5DbG9uZSgpICk7CisJfQorCXJldHVybiBjbG9uZTsKK30KKworCitUaVhtbERvY3VtZW50OjpUaVhtbERvY3VtZW50KCkgOiBUaVhtbE5vZGUoIFRpWG1sTm9kZTo6RE9DVU1FTlQgKQoreworCWVycm9yID0gZmFsc2U7CisvLwlpZ25vcmVXaGl0ZVNwYWNlID0gdHJ1ZTsKK30KKworCitUaVhtbERvY3VtZW50OjpUaVhtbERvY3VtZW50KCBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnROYW1lICkgOiBUaVhtbE5vZGUoIFRpWG1sTm9kZTo6RE9DVU1FTlQgKQoreworLy8JaWdub3JlV2hpdGVTcGFjZSA9IHRydWU7CisJdmFsdWUgPSBkb2N1bWVudE5hbWU7CisJZXJyb3IgPSBmYWxzZTsKK30KKworCitib29sIFRpWG1sRG9jdW1lbnQ6OkxvYWRGaWxlKCkKK3sKKwlyZXR1cm4gTG9hZEZpbGUoIHZhbHVlICk7Cit9CisKKworYm9vbCBUaVhtbERvY3VtZW50OjpTYXZlRmlsZSgpIGNvbnN0Cit7CisgCXJldHVybiBTYXZlRmlsZSggdmFsdWUgKTsKK30KKworCitib29sIFRpWG1sRG9jdW1lbnQ6OkxvYWRGaWxlKCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUgKQorewkKKwkvLyBEZWxldGUgdGhlIGV4aXN0aW5nIGRhdGE6CisJQ2xlYXIoKTsKKwl2YWx1ZSA9IGZpbGVuYW1lOworCQorCUZJTEUqIGZpbGUgPSBmb3BlbiggZmlsZW5hbWUuY19zdHIoKSwgInIiICk7CisKKwlpZiAoIGZpbGUgKQorCXsKKwkJLy8gR2V0IHRoZSBmaWxlIHNpemUsIHNvIHdlIGNhbiBwcmUtYWxsb2NhdGUgdGhlIHN0cmluZy4gSFVHRSBzcGVlZCBpbXBhY3QuCisJCWxvbmcgbGVuZ3RoID0gMDsKKwkJZnNlZWsoIGZpbGUsIDAsIFNFRUtfRU5EICk7CisJCWxlbmd0aCA9IGZ0ZWxsKCBmaWxlICk7CisJCWZzZWVrKCBmaWxlLCAwLCBTRUVLX1NFVCApOworCisJCS8vIElmIHdlIGhhdmUgYSBmaWxlLCBhc3N1bWUgaXQgaXMgYWxsIG9uZSBiaWcgWE1MIGZpbGUsIGFuZCByZWFkIGl0IGluLgorCQkvLyBUaGUgZG9jdW1lbnQgcGFyc2VyIG1heSBkZWNpZGUgdGhlIGRvY3VtZW50IGVuZHMgc29vbmVyIHRoYW4gdGhlIGVudGlyZSBmaWxlLCBob3dldmVyLgorCQlzdGQ6OnN0cmluZyBkYXRhOworCQlkYXRhLnJlc2VydmUoIGxlbmd0aCApOworCisJCWNvbnN0IGludCBCVUZfU0laRSA9IDIwNDg7CisJCWNoYXIgYnVmW0JVRl9TSVpFXTsKKworCQl3aGlsZSggZmdldHMoIGJ1ZiwgQlVGX1NJWkUsIGZpbGUgKSApCisJCXsKKwkJCWRhdGEgKz0gYnVmOworCQl9CisJCWZjbG9zZSggZmlsZSApOworCisJCVBhcnNlKCBkYXRhLmNfc3RyKCkgKTsKKwkJaWYgKCAgIUVycm9yKCkgKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlTZXRFcnJvciggVElYTUxfRVJST1JfT1BFTklOR19GSUxFICk7CisJcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgVGlYbWxEb2N1bWVudDo6U2F2ZUZpbGUoIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSApIGNvbnN0Cit7CisJLy8gVGhlIG9sZCBjIHN0dWZmIGxpdmVzIG9uLi4uCisJRklMRSogZnAgPSBmb3BlbiggZmlsZW5hbWUuY19zdHIoKSwgInciICk7CisJaWYgKCBmcCApCisJeworCQlQcmludCggZnAsIDAgKTsKKwkJZmNsb3NlKCBmcCApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisKK1RpWG1sTm9kZSogVGlYbWxEb2N1bWVudDo6Q2xvbmUoKSBjb25zdAoreworCVRpWG1sRG9jdW1lbnQqIGNsb25lID0gbmV3IFRpWG1sRG9jdW1lbnQoKTsKKwlpZiAoICFjbG9uZSApCisJCXJldHVybiAwOworCisJQ29weVRvQ2xvbmUoIGNsb25lICk7CisJY2xvbmUtPmVycm9yID0gZXJyb3I7CisJY2xvbmUtPmVycm9yRGVzYyA9IGVycm9yRGVzYzsKKworCVRpWG1sTm9kZSogbm9kZSA9IDA7CisJZm9yICggbm9kZSA9IGZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLT5OZXh0U2libGluZygpICkKKwl7CisJCWNsb25lLT5MaW5rRW5kQ2hpbGQoIG5vZGUtPkNsb25lKCkgKTsKKwl9CisJcmV0dXJuIGNsb25lOworfQorCisKK3ZvaWQgVGlYbWxEb2N1bWVudDo6UHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdAoreworCVRpWG1sTm9kZSogbm9kZTsKKwlmb3IgKCBub2RlPUZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZT1ub2RlLT5OZXh0U2libGluZygpICkKKwl7CisJCW5vZGUtPlByaW50KCBjZmlsZSwgZGVwdGggKTsKKwkJZnByaW50ZiggY2ZpbGUsICJcbiIgKTsKKwl9Cit9CisKKwordm9pZCBUaVhtbERvY3VtZW50OjpTdHJlYW1PdXQoIHN0ZDo6b3N0cmVhbSogb3V0ICkgY29uc3QKK3sKKwlUaVhtbE5vZGUqIG5vZGU7CisJZm9yICggbm9kZT1GaXJzdENoaWxkKCk7IG5vZGU7IG5vZGU9bm9kZS0+TmV4dFNpYmxpbmcoKSApCisJeworCQlub2RlLT5TdHJlYW1PdXQoIG91dCApOworCisJCS8vIFNwZWNpYWwgcnVsZSBmb3Igc3RyZWFtczogc3RvcCBhZnRlciB0aGUgcm9vdCBlbGVtZW50LgorCQkvLyBUaGUgc3RyZWFtIGluIGNvZGUgd2lsbCBvbmx5IHJlYWQgb25lIGVsZW1lbnQsIHNvIGRvbid0IAorCQkvLyB3cml0ZSBtb3JlIHRoYW4gb25lLgorCQlpZiAoIG5vZGUtPlRvRWxlbWVudCgpICkKKwkJCWJyZWFrOworCX0KK30KKworCitUaVhtbEF0dHJpYnV0ZSogVGlYbWxBdHRyaWJ1dGU6Ok5leHQoKSBjb25zdAoreworCS8vIFdlIGFyZSB1c2luZyBrbm93bGVkZ2Ugb2YgdGhlIHNlbnRpbmVsLiBUaGUgc2VudGluZWwKKwkvLyBoYXZlIGEgdmFsdWUgb3IgbmFtZS4KKwlpZiAoIG5leHQtPnZhbHVlLmVtcHR5KCkgJiYgbmV4dC0+bmFtZS5lbXB0eSgpICkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIG5leHQ7Cit9CisKKworVGlYbWxBdHRyaWJ1dGUqIFRpWG1sQXR0cmlidXRlOjpQcmV2aW91cygpIGNvbnN0Cit7CisJLy8gV2UgYXJlIHVzaW5nIGtub3dsZWRnZSBvZiB0aGUgc2VudGluZWwuIFRoZSBzZW50aW5lbAorCS8vIGhhdmUgYSB2YWx1ZSBvciBuYW1lLgorCWlmICggcHJldi0+dmFsdWUuZW1wdHkoKSAmJiBwcmV2LT5uYW1lLmVtcHR5KCkgKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcHJldjsKK30KKworCit2b2lkIFRpWG1sQXR0cmlidXRlOjpQcmludCggRklMRSogY2ZpbGUsIGludCAvKmRlcHRoKi8gKSBjb25zdAoreworCW9zdHJpbmdzdHJlYW0gc3RyZWFtKCBvc3RyaW5nc3RyZWFtOjpvdXQgKTsKKwlzdHJlYW0uc3RyKCkucmVzZXJ2ZSggNTAwICk7CisJCisJU3RyZWFtT3V0KCAmc3RyZWFtICk7CisJZnByaW50ZiggY2ZpbGUsICIlcyIsIHN0cmVhbS5zdHIoKS5jX3N0cigpICk7Cit9CisKKwordm9pZCBUaVhtbEF0dHJpYnV0ZTo6U3RyZWFtT3V0KCBzdGQ6Om9zdHJlYW0qIHN0cmVhbSApIGNvbnN0Cit7CisJaWYgKCB2YWx1ZS5maW5kKCAnXCInICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCXsKKwkJUHV0U3RyaW5nKCBuYW1lLCBzdHJlYW0gKTsKKwkJKCpzdHJlYW0pIDw8ICI9IiA8PCAiJyI7CisJCVB1dFN0cmluZyggdmFsdWUsIHN0cmVhbSApOworCQkoKnN0cmVhbSkgPDwgIiciOworCX0KKwllbHNlCisJeworCQlQdXRTdHJpbmcoIG5hbWUsIHN0cmVhbSApOworCQkoKnN0cmVhbSkgPDwgIj0iIDw8ICJcIiI7CisJCVB1dFN0cmluZyggdmFsdWUsIHN0cmVhbSApOworCQkoKnN0cmVhbSkgPDwgIlwiIjsKKwl9Cit9CisKKwordm9pZCBUaVhtbEF0dHJpYnV0ZTo6U2V0SW50VmFsdWUoIGludCB2YWx1ZSApCit7CisJc3RkOjpzdHJpbmcgczsKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyZWFtKCBzICk7CisJc3RyZWFtIDw8IHZhbHVlOworCVNldFZhbHVlKCBzdHJlYW0uc3RyKCkgKTsKK30KKworCit2b2lkIFRpWG1sQXR0cmlidXRlOjpTZXREb3VibGVWYWx1ZSggZG91YmxlIHZhbHVlICkKK3sKKwlzdGQ6OnN0cmluZyBzOworCXN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJlYW0oIHMgKTsKKwlzdHJlYW0gPDwgdmFsdWU7CisJU2V0VmFsdWUoIHN0cmVhbS5zdHIoKSApOworfQorCisKK2NvbnN0IGludCBUaVhtbEF0dHJpYnV0ZTo6SW50VmFsdWUoKSBjb25zdAoreworCWludCB2OworCXN0ZDo6aXN0cmluZ3N0cmVhbSBzdHJpbmcoIHZhbHVlICk7CisJc3RyaW5nID4+IHY7CisJcmV0dXJuIHY7Cit9CisKKworY29uc3QgZG91YmxlICBUaVhtbEF0dHJpYnV0ZTo6RG91YmxlVmFsdWUoKSBjb25zdAoreworCWRvdWJsZSB2OworCXN0ZDo6aXN0cmluZ3N0cmVhbSBzdHJpbmcoIHZhbHVlICk7CisJc3RyaW5nID4+IHY7CisJcmV0dXJuIHY7Cit9CisKKwordm9pZCBUaVhtbENvbW1lbnQ6OlByaW50KCBGSUxFKiBjZmlsZSwgaW50IGRlcHRoICkgY29uc3QKK3sKKwlvc3RyaW5nc3RyZWFtIHN0cmVhbSggb3N0cmluZ3N0cmVhbTo6b3V0ICk7CisJc3RyZWFtLnN0cigpLnJlc2VydmUoIDEwMDAgKTsKKwkKKwlmb3IgKCBpbnQgaT0wOyBpPGRlcHRoOyBpKysgKQorCXsKKwkJZnByaW50ZiggY2ZpbGUsICIgICAgIiApOworCX0KKwlTdHJlYW1PdXQoICZzdHJlYW0gKTsKKwlmcHJpbnRmKCBjZmlsZSwgIiVzIiwgc3RyZWFtLnN0cigpLmNfc3RyKCkgKTsKK30KKworCit2b2lkIFRpWG1sQ29tbWVudDo6U3RyZWFtT3V0KCBzdGQ6Om9zdHJlYW0qIHN0cmVhbSApIGNvbnN0Cit7CisJKCpzdHJlYW0pIDw8ICI8IS0tIjsKKwlQdXRTdHJpbmcoIHZhbHVlLCBzdHJlYW0gKTsKKwkoKnN0cmVhbSkgPDwgIi0tPiI7Cit9CisKKworVGlYbWxOb2RlKiBUaVhtbENvbW1lbnQ6OkNsb25lKCkgY29uc3QKK3sKKwlUaVhtbENvbW1lbnQqIGNsb25lID0gbmV3IFRpWG1sQ29tbWVudCgpOworCisJaWYgKCAhY2xvbmUgKQorCQlyZXR1cm4gMDsKKworCUNvcHlUb0Nsb25lKCBjbG9uZSApOworCXJldHVybiBjbG9uZTsKK30KKworCit2b2lkIFRpWG1sVGV4dDo6UHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdAoreworCW9zdHJpbmdzdHJlYW0gc3RyZWFtKCBvc3RyaW5nc3RyZWFtOjpvdXQgKTsKKwlzdHJlYW0uc3RyKCkucmVzZXJ2ZSggMTAwMCApOworCVN0cmVhbU91dCggJnN0cmVhbSApOworCWZwcmludGYoIGNmaWxlLCAiJXMiLCBzdHJlYW0uc3RyKCkuY19zdHIoKSApOworfQorCisKK3ZvaWQgVGlYbWxUZXh0OjpTdHJlYW1PdXQoIHN0ZDo6b3N0cmVhbSogc3RyZWFtICkgY29uc3QKK3sKKwlQdXRTdHJpbmcoIHZhbHVlLCBzdHJlYW0gKTsKK30KKworCitUaVhtbE5vZGUqIFRpWG1sVGV4dDo6Q2xvbmUoKSBjb25zdAorewkKKwlUaVhtbFRleHQqIGNsb25lID0gMDsKKwljbG9uZSA9IG5ldyBUaVhtbFRleHQoICIiICk7CisJCisJaWYgKCAhY2xvbmUgKQorCQlyZXR1cm4gMDsKKworCUNvcHlUb0Nsb25lKCBjbG9uZSApOworCXJldHVybiBjbG9uZTsKK30KKworCitUaVhtbERlY2xhcmF0aW9uOjpUaVhtbERlY2xhcmF0aW9uKCBjb25zdCBzdGQ6OnN0cmluZyYgX3ZlcnNpb24sIAorCQkJCQkJCQkJY29uc3Qgc3RkOjpzdHJpbmcmIF9lbmNvZGluZywKKwkJCQkJCQkJCWNvbnN0IHN0ZDo6c3RyaW5nJiBfc3RhbmRhbG9uZSApCisJOiBUaVhtbE5vZGUoIFRpWG1sTm9kZTo6REVDTEFSQVRJT04gKSAKK3sKKwl2ZXJzaW9uID0gX3ZlcnNpb247CisJZW5jb2RpbmcgPSBfZW5jb2Rpbmc7CisJc3RhbmRhbG9uZSA9IF9zdGFuZGFsb25lOworfQorCisKK3ZvaWQgVGlYbWxEZWNsYXJhdGlvbjo6UHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdAoreworCW9zdHJpbmdzdHJlYW0gc3RyZWFtKCBvc3RyaW5nc3RyZWFtOjpvdXQgKTsKKwlzdHJlYW0uc3RyKCkucmVzZXJ2ZSggMjAwICk7CisJU3RyZWFtT3V0KCAmc3RyZWFtICk7CisJZnByaW50ZiggY2ZpbGUsICIlcyIsIHN0cmVhbS5zdHIoKS5jX3N0cigpICk7Cit9CisKKwordm9pZCBUaVhtbERlY2xhcmF0aW9uOjpTdHJlYW1PdXQoIHN0ZDo6b3N0cmVhbSogc3RyZWFtICkgY29uc3QKK3sKKwkoKnN0cmVhbSkgPDwgIjw/eG1sICI7CisKKwlpZiAoICF2ZXJzaW9uLmVtcHR5KCkgKQorCXsKKwkJKCpzdHJlYW0pIDw8ICJ2ZXJzaW9uPVwiIjsKKwkJUHV0U3RyaW5nKCB2ZXJzaW9uLCBzdHJlYW0gKTsKKwkJKCpzdHJlYW0pIDw8ICJcIiAiOworCX0KKwlpZiAoICFlbmNvZGluZy5lbXB0eSgpICkKKwl7CisJCSgqc3RyZWFtKSA8PCAiZW5jb2Rpbmc9XCIiOworCQlQdXRTdHJpbmcoIGVuY29kaW5nLCBzdHJlYW0gKTsKKwkJKCpzdHJlYW0gKSA8PCAiXCIgIjsKKwl9CisJaWYgKCAhc3RhbmRhbG9uZS5lbXB0eSgpICkKKwl7CisJCSgqc3RyZWFtKSA8PCAic3RhbmRhbG9uZT1cIiI7CisJCVB1dFN0cmluZyggc3RhbmRhbG9uZSwgc3RyZWFtICk7CisJCSgqc3RyZWFtKSA8PCAiXCIgIjsKKwl9CisJKCpzdHJlYW0pIDw8ICI/PiI7Cit9CisKKworVGlYbWxOb2RlKiBUaVhtbERlY2xhcmF0aW9uOjpDbG9uZSgpIGNvbnN0Cit7CQorCVRpWG1sRGVjbGFyYXRpb24qIGNsb25lID0gbmV3IFRpWG1sRGVjbGFyYXRpb24oKTsKKworCWlmICggIWNsb25lICkKKwkJcmV0dXJuIDA7CisKKwlDb3B5VG9DbG9uZSggY2xvbmUgKTsKKwljbG9uZS0+dmVyc2lvbiA9IHZlcnNpb247CisJY2xvbmUtPmVuY29kaW5nID0gZW5jb2Rpbmc7CisJY2xvbmUtPnN0YW5kYWxvbmUgPSBzdGFuZGFsb25lOworCXJldHVybiBjbG9uZTsKK30KKworCit2b2lkIFRpWG1sVW5rbm93bjo6UHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdAoreworCW9zdHJpbmdzdHJlYW0gc3RyZWFtKCBvc3RyaW5nc3RyZWFtOjpvdXQgKTsKKwlzdHJlYW0uc3RyKCkucmVzZXJ2ZSggMjAwICk7CisJU3RyZWFtT3V0KCAmc3RyZWFtICk7CisKKwlmb3IgKCBpbnQgaT0wOyBpPGRlcHRoOyBpKysgKQorCQlmcHJpbnRmKCBjZmlsZSwgIiAgICAiICk7CisJZnByaW50ZiggY2ZpbGUsICIlcyIsIHN0cmVhbS5zdHIoKS5jX3N0cigpICk7Cit9CisKKwordm9pZCBUaVhtbFVua25vd246OlN0cmVhbU91dCggc3RkOjpvc3RyZWFtKiBzdHJlYW0gKSBjb25zdAoreworCSgqc3RyZWFtKSA8PCAiPCIgPDwgdmFsdWUgPDwgIj4iOwkJLy8gRG9uJ3QgdXNlIGVudGl0aWVzIGhlYXIhIEl0IGlzIHVua25vd24uCit9CisKKworVGlYbWxOb2RlKiBUaVhtbFVua25vd246OkNsb25lKCkgY29uc3QKK3sKKwlUaVhtbFVua25vd24qIGNsb25lID0gbmV3IFRpWG1sVW5rbm93bigpOworCisJaWYgKCAhY2xvbmUgKQorCQlyZXR1cm4gMDsKKworCUNvcHlUb0Nsb25lKCBjbG9uZSApOworCXJldHVybiBjbG9uZTsKK30KKworCitUaVhtbEF0dHJpYnV0ZVNldDo6VGlYbWxBdHRyaWJ1dGVTZXQoKQoreworCXNlbnRpbmVsLm5leHQgPSAmc2VudGluZWw7CisJc2VudGluZWwucHJldiA9ICZzZW50aW5lbDsKK30KKworCitUaVhtbEF0dHJpYnV0ZVNldDo6flRpWG1sQXR0cmlidXRlU2V0KCkKK3sKKwlhc3NlcnQoIHNlbnRpbmVsLm5leHQgPT0gJnNlbnRpbmVsICk7CisJYXNzZXJ0KCBzZW50aW5lbC5wcmV2ID09ICZzZW50aW5lbCApOworfQorCisKK3ZvaWQgVGlYbWxBdHRyaWJ1dGVTZXQ6OkFkZCggVGlYbWxBdHRyaWJ1dGUqIGFkZE1lICkKK3sKKwlhc3NlcnQoICFGaW5kKCBhZGRNZS0+TmFtZSgpICkgKTsJLy8gU2hvdWxkbid0IGJlIG11bHRpcGx5IGFkZGluZyB0byB0aGUgc2V0LgorCQorCWFkZE1lLT5uZXh0ID0gJnNlbnRpbmVsOworCWFkZE1lLT5wcmV2ID0gc2VudGluZWwucHJldjsKKworCXNlbnRpbmVsLnByZXYtPm5leHQgPSBhZGRNZTsKKwlzZW50aW5lbC5wcmV2ICAgICAgPSBhZGRNZTsKK30KKwordm9pZCBUaVhtbEF0dHJpYnV0ZVNldDo6UmVtb3ZlKCBUaVhtbEF0dHJpYnV0ZSogcmVtb3ZlTWUgKQoreworCVRpWG1sQXR0cmlidXRlKiBub2RlOworCisJZm9yKCBub2RlID0gc2VudGluZWwubmV4dDsgbm9kZSAhPSAmc2VudGluZWw7IG5vZGUgPSBub2RlLT5uZXh0ICkKKwl7CisJCWlmICggbm9kZSA9PSByZW1vdmVNZSApCisJCXsKKwkJCW5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OworCQkJbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisJCQlub2RlLT5uZXh0ID0gMDsKKwkJCW5vZGUtPnByZXYgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCWFzc2VydCggMCApOwkJLy8gd2UgdHJpZWQgdG8gcmVtb3ZlIGEgbm9uLWxpbmtlZCBhdHRyaWJ1dGUuCit9CisKKworVGlYbWxBdHRyaWJ1dGUqCVRpWG1sQXR0cmlidXRlU2V0OjpGaW5kKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSApIGNvbnN0Cit7CisJVGlYbWxBdHRyaWJ1dGUqIG5vZGU7CisKKwlmb3IoIG5vZGUgPSBzZW50aW5lbC5uZXh0OyBub2RlICE9ICZzZW50aW5lbDsgbm9kZSA9IG5vZGUtPm5leHQgKQorCXsKKwkJaWYgKCBub2RlLT5OYW1lKCkgPT0gbmFtZSApCisJCQlyZXR1cm4gbm9kZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL0FDTS90aW55eG1sL3Rpbnl4bWwuZHNwIGIvQUNNL3Rpbnl4bWwvdGlueXhtbC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2OWEzZgotLS0gL2Rldi9udWxsCisrKyBiL0FDTS90aW55eG1sL3Rpbnl4bWwuZHNwCkBAIC0wLDAgKzEsMTE1IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InRpbnl4bWwiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNA0KKw0KK0NGRz10aW55eG1sIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBEaWVzIGlzdCBrZWluIGf8bHRpZ2VzIE1ha2VmaWxlLiBadW0gRXJzdGVsbGVuIGRpZXNlcyBQcm9qZWt0cyBtaXQgTk1BS0UNCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZvxocmVuIFNpZSBkZW4gQmVmZWhsDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInRpbnl4bWwubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBTaWUga/ZubmVuIGJlaW0gQXVzZvxocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbg0KKyFNRVNTQUdFIGR1cmNoIERlZmluaWVyZW4gZGVzIE1ha3JvcyBDRkcgaW4gZGVyIEJlZmVobHN6ZWlsZS4gWnVtIEJlaXNwaWVsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJ0aW55eG1sLm1hayIgQ0ZHPSJ0aW55eG1sIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgRvxyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoNCishTUVTU0FHRSANCishTUVTU0FHRSAidGlueXhtbCAtIFdpbjMyIFJlbGVhc2UiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJ0aW55eG1sIC0gV2luMzIgRGVidWciIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJ0aW55eG1sIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXG9ialxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlxvYmpcUmVsZWFzZVx0aW55WE1MIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgTElCMzIgL25vbG9nbw0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJ0aW55eG1sIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXG9ialxEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cLi5cb2JqXERlYnVnXHRpbnlYTUwiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgInRpbnl4bWwgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAidGlueXhtbCAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxjaGFuZ2VzLnR4dA0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlYWRtZS50eHQNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx0aW55eG1sLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHRpbnl4bWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHRpbnl4bWxlcnJvci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx0aW55eG1scGFyc2VyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL0FDTS90aW55eG1sL3Rpbnl4bWwuaCBiL0FDTS90aW55eG1sL3Rpbnl4bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWYxMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvQUNNL3Rpbnl4bWwvdGlueXhtbC5oCkBAIC0wLDAgKzEsODA0IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAwIExlZSBUaG9tYXNvbiAod3d3LmdyaW5uaW5nbGl6YXJkLmNvbSkKKworVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgCit3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IAorZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgCitwdXJwb3NlLCBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgCityZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIAorc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIAord291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKworMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQKK211c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKworMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIAorZGlzdHJpYnV0aW9uLgorKi8KKworCisjaWZuZGVmIFRJTllYTUxfSU5DTFVERUQKKyNkZWZpbmUgVElOWVhNTF9JTkNMVURFRAorCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTMwICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3ODYgKQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK2NsYXNzIFRpWG1sRG9jdW1lbnQ7CitjbGFzcyBUaVhtbEVsZW1lbnQ7CitjbGFzcyBUaVhtbENvbW1lbnQ7CitjbGFzcyBUaVhtbFVua25vd247CitjbGFzcyBUaVhtbEF0dHJpYnV0ZTsKK2NsYXNzIFRpWG1sVGV4dDsKK2NsYXNzIFRpWG1sRGVjbGFyYXRpb247CisKKworLy8gSGVscCBvdXQgd2luZG93czoKKyNpZiBkZWZpbmVkKCBfREVCVUcgKSAmJiAhZGVmaW5lZCggREVCVUcgKQorCSNkZWZpbmUgREVCVUcKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggREVCVUcgKSAmJiBkZWZpbmVkKCBfTVNDX1ZFUiApCisJI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwkjZGVmaW5lIFRJWE1MX0xPRyBPdXRwdXREZWJ1Z1N0cmluZworI2Vsc2UKKwkjZGVmaW5lIFRJWE1MX0xPRyBwcmludGYKKyNlbmRpZiAKKworCisvKiogVGlYbWxCYXNlIGlzIGEgYmFzZSBjbGFzcyBmb3IgZXZlcnkgY2xhc3MgaW4gVGlueVhtbC4KKwlJdCBkb2VzIGxpdHRsZSBleGNlcHQgdG8gZXN0YWJsaXNoIHRoYXQgVGlueVhtbCBjbGFzc2VzCisJY2FuIGJlIHByaW50ZWQgYW5kIHByb3ZpZGUgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKworCUluIFhNTCwgdGhlIGRvY3VtZW50IGFuZCBlbGVtZW50cyBjYW4gY29udGFpbgorCW90aGVyIGVsZW1lbnRzIGFuZCBvdGhlciB0eXBlcyBvZiBub2Rlcy4KKworCUB2ZXJiYXRpbQorCUEgRG9jdW1lbnQgY2FuIGNvbnRhaW46CUVsZW1lbnQJKGNvbnRhaW5lciBvciBsZWFmKQorCQkJCQkJCUNvbW1lbnQgKGxlYWYpCisJCQkJCQkJVW5rbm93biAobGVhZikKKwkJCQkJCQlEZWNsYXJhdGlvbiggbGVhZiApCisKKwlBbiBFbGVtZW50IGNhbiBjb250YWluOglFbGVtZW50IChjb250YWluZXIgb3IgbGVhZikKKwkJCQkJCQlUZXh0CShsZWFmKQorCQkJCQkJCUF0dHJpYnV0ZXMgKG5vdCBvbiB0cmVlKQorCQkJCQkJCUNvbW1lbnQgKGxlYWYpCisJCQkJCQkJVW5rbm93biAobGVhZikKKworCUEgRGVjbGVyYXRpb24gY29udGFpbnM6IEF0dHJpYnV0ZXMgKG5vdCBvbiB0cmVlKQorCUBlbmR2ZXJiYXRpbQorKi8KK2NsYXNzIFRpWG1sQmFzZQoreworCWZyaWVuZCBjbGFzcyBUaVhtbE5vZGU7CisJZnJpZW5kIGNsYXNzIFRpWG1sRWxlbWVudDsKKwlmcmllbmQgY2xhc3MgVGlYbWxEb2N1bWVudDsKKyAKKyAgcHVibGljOgorCVRpWG1sQmFzZSgpCQkJCQkJCQl7fQkKKwl2aXJ0dWFsIH5UaVhtbEJhc2UoKQkJCQkJe30KKwkKKwkvKioJQWxsIFRpbnlYbWwgY2xhc3NlcyBjYW4gcHJpbnQgdGhlbXNlbHZlcyB0byBhIGZpbGVzdHJlYW0uCisJCVRoaXMgaXMgYSBmb3JtYXR0ZWQgcHJpbnQsIGFuZCB3aWxsIGluc2VydCB0YWJzIGFuZCBuZXdsaW5lcy4KKwkJCisJCShGb3IgYW4gdW5mb3JtYXR0ZWQgc3RyZWFtLCB1c2UgdGhlIDw8IG9wZXJhdG9yLikKKwkqLworIAl2aXJ0dWFsIHZvaWQgUHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdCA9IDA7CisKKwkvLyBbaW50ZXJuYWxdIFVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIG9wZXJhdG9yIDw8CisJdmlydHVhbCB2b2lkIFN0cmVhbU91dCAoIHN0ZDo6b3N0cmVhbSogb3V0ICkgY29uc3QgPSAwOworCisJLyoqCVRoZSB3b3JsZCBkb2VzIG5vdCBhZ3JlZSBvbiB3aGV0aGVyIHdoaXRlIHNwYWNlIHNob3VsZCBiZSBrZXB0IG9yCisJCW5vdC4gSW4gb3JkZXIgdG8gbWFrZSBldmVyeW9uZSBoYXBweSwgdGhlc2UgZ2xvYmFsLCBzdGF0aWMgZnVuY3Rpb25zCisJCWFyZSBwcm92aWRlZCB0byBzZXQgd2hldGhlciBvciBub3QgVGlueVhtbCB3aWxsIGNvbmRlbnNlIGFsbCB3aGl0ZSBzcGFjZQorCQlpbnRvIGEgc2luZ2xlIHNwYWNlIG9yIG5vdC4gVGhlIGRlZmF1bHQgaXMgdG8gY29uZGVuc2UuIE5vdGUgY2hhbmdpbmcgdGhlc2UKKwkJdmFsdWVzIGlzIG5vdCB0aHJlYWQgc2FmZS4KKwkqLworCXN0YXRpYyB2b2lkIFNldENvbmRlbnNlV2hpdGVTcGFjZSggYm9vbCBjb25kZW5zZSApCQl7IGNvbmRlbnNlV2hpdGVTcGFjZSA9IGNvbmRlbnNlOyB9CisKKwkvLy8gUmV0dXJuIHRoZSBjdXJyZW50IHdoaXRlIHNwYWNlIHNldHRpbmcuCisJc3RhdGljIGJvb2wgSXNXaGl0ZVNwYWNlQ29uZGVuc2VkKCkJCQkJCQl7IHJldHVybiBjb25kZW5zZVdoaXRlU3BhY2U7IH0KKworICBwcm90ZWN0ZWQ6CisJc3RhdGljIGNvbnN0IGNoYXIqIFNraXBXaGl0ZVNwYWNlKCBjb25zdCBjaGFyKiApOworCXN0YXRpYyBib29sIFN0cmVhbVdoaXRlU3BhY2UoIHN0ZDo6aXN0cmVhbSogaW4sIHN0ZDo6c3RyaW5nKiB0YWcgKTsKKwlzdGF0aWMgYm9vbCBJc1doaXRlU3BhY2UoIGludCBjICkJCXsgcmV0dXJuICggaXNzcGFjZSggYyApIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgKTsgfQorCisJLyoJUmVhZCB0byB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KKwkJUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgZm91bmQgYW5kIG5vIGVycm9yLgorCSovCisJc3RhdGljIGJvb2wgU3RyZWFtVG8oIHN0ZDo6aXN0cmVhbSogaW4sIGludCBjaGFyYWN0ZXIsIHN0ZDo6c3RyaW5nKiB0YWcgKTsKKworCS8qCVJlYWRzIGFuIFhNTCBuYW1lIGludG8gdGhlIHN0cmluZyBwcm92aWRlZC4gUmV0dXJucworCQlhIHBvaW50ZXIganVzdCBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbmFtZSwgCisJCW9yIDAgaWYgdGhlIGZ1bmN0aW9uIGhhcyBhbiBlcnJvci4KKwkqLworCXN0YXRpYyBjb25zdCBjaGFyKiBSZWFkTmFtZSggY29uc3QgY2hhciosIHN0ZDo6c3RyaW5nKiBuYW1lICk7CisKKwkvKglSZWFkcyB0ZXh0LiBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBnaXZlbiBlbmQgdGFnLgorCQlXaWNrZWRseSBjb21wbGV4IG9wdGlvbnMsIGJ1dCBpdCBrZWVwcyB0aGUgKHNlbnNpdGl2ZSkgY29kZSBpbiBvbmUgcGxhY2UuCisJKi8KKwlzdGF0aWMgY29uc3QgY2hhciogUmVhZFRleHQoCWNvbnN0IGNoYXIqIGluLAkJCQkvLyB3aGVyZSB0byBzdGFydAorCQkJCQkJCQkJc3RkOjpzdHJpbmcqIHRleHQsCQkJLy8gdGhlIHN0cmluZyByZWFkCisJCQkJCQkJCQlib29sIGlnbm9yZVdoaXRlU3BhY2UsCQkvLyB3aGV0aGVyIHRvIGtlZXAgdGhlIHdoaXRlIHNwYWNlCisJCQkJCQkJCQljb25zdCBjaGFyKiBlbmRUYWcsCQkJLy8gd2hhdCBlbmRzIHRoaXMgdGV4dAorCQkJCQkJCQkJYm9vbCBpZ25vcmVDYXNlICk7CQkJLy8gd2hldGhlciB0byBpZ25vcmUgY2FzZSBpbiB0aGUgZW5kIHRhZworCisJdmlydHVhbCBjb25zdCBjaGFyKiBQYXJzZSggY29uc3QgY2hhciogcCApID0gMDsKKworCS8vIElmIGFuIGVudGl0eSBoYXMgYmVlbiBmb3VuZCwgdHJhbnNmb3JtIGl0IGludG8gYSBjaGFyYWN0ZXIuCisJc3RhdGljIGNvbnN0IGNoYXIqIEdldEVudGl0eSggY29uc3QgY2hhciogaW4sIGNoYXIqIHZhbHVlICk7CisKKwkvLyBHZXQgYSBjaGFyYWN0ZXIsIHdoaWxlIGludGVycHJldGluZyBlbnRpdGllcy4KKwlpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIqIEdldENoYXIoIGNvbnN0IGNoYXIqIHAsIGNoYXIqIHZhbHVlICkJCQorCQkJCQkJCQkJCQl7CQkKKwkJCQkJCQkJCQkJCWFzc2VydCggcCApOworCQkJCQkJCQkJCQkJaWYgKCAqcCA9PSAnJicgKSAKKwkJCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJCQlyZXR1cm4gR2V0RW50aXR5KCBwLCB2YWx1ZSApOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJZWxzZSAKKwkJCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJCQkqdmFsdWUgPSAqcDsKKwkJCQkJCQkJCQkJCQlyZXR1cm4gcCsxOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisKKwkvLyBQdXRzIGEgc3RyaW5nIHRvIGEgc3RyZWFtLCBleHBhbmRpbmcgZW50aXRpZXMgYXMgaXQgZ29lcy4KKwkvLyBOb3RlIHRoaXMgc2hvdWxkIG5vdCBjb250aWFuIHRoZSAnPCcsICc+JywgZXRjLCBvciB0aGV5IHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byBlbnRpdGllcyEKKwlzdGF0aWMgdm9pZCBQdXRTdHJpbmcoIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6b3N0cmVhbSogc3RyZWFtICk7CisKKwkvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJlYW0gYXJlIGFueSBvZiB0aGUgZW5kVGFnIHNlcXVlbmNlcy4KKwlib29sIHN0YXRpYyBTdHJpbmdFcXVhbCgJY29uc3QgY2hhciogcCwgCisJCQkJCQkJCWNvbnN0IGNoYXIqIGVuZFRhZywgCisJCQkJCQkJCWJvb2wgaWdub3JlQ2FzZSApOworCQkJCQkJCQkJCQkJCQorCisJZW51bQorCXsKKwkJVElYTUxfTk9fRVJST1IgPSAwLAorCQlUSVhNTF9FUlJPUiwKKwkJVElYTUxfRVJST1JfT1BFTklOR19GSUxFLAorCQlUSVhNTF9FUlJPUl9PVVRfT0ZfTUVNT1JZLAorCQlUSVhNTF9FUlJPUl9QQVJTSU5HX0VMRU1FTlQsCisJCVRJWE1MX0VSUk9SX0ZBSUxFRF9UT19SRUFEX0VMRU1FTlRfTkFNRSwKKwkJVElYTUxfRVJST1JfUkVBRElOR19FTEVNRU5UX1ZBTFVFLAorCQlUSVhNTF9FUlJPUl9SRUFESU5HX0FUVFJJQlVURVMsCisJCVRJWE1MX0VSUk9SX1BBUlNJTkdfRU1QVFksCisJCVRJWE1MX0VSUk9SX1JFQURJTkdfRU5EX1RBRywKKwkJVElYTUxfRVJST1JfUEFSU0lOR19VTktOT1dOLAorCQlUSVhNTF9FUlJPUl9QQVJTSU5HX0NPTU1FTlQsCisJCVRJWE1MX0VSUk9SX1BBUlNJTkdfREVDTEFSQVRJT04sCisJCVRJWE1MX0VSUk9SX0RPQ1VNRU5UX0VNUFRZLAorCisJCVRJWE1MX0VSUk9SX1NUUklOR19DT1VOVAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIqIGVycm9yU3RyaW5nWyBUSVhNTF9FUlJPUl9TVFJJTkdfQ09VTlQgXTsKKworICBwcml2YXRlOgorCXN0cnVjdCBFbnRpdHkKKwl7CisJCWNvbnN0IGNoYXIqICAgICBzdHI7CisJCXVuc2lnbmVkIGludAlzdHJMZW5ndGg7CisJCWludAkJCSAgICBjaHI7CisJfTsKKwllbnVtCisJeworCQlOVU1fRU5USVRZID0gNSwKKwkJTUFYX0VOVElUWV9MRU5HVEggPSA2CisKKwl9OworCXN0YXRpYyBFbnRpdHkgZW50aXR5WyBOVU1fRU5USVRZIF07CisJc3RhdGljIGJvb2wgY29uZGVuc2VXaGl0ZVNwYWNlOworfTsKKworCisvKiogVGhlIHBhcmVudCBjbGFzcyBmb3IgZXZlcnl0aGluZyBpbiB0aGUgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLgorCShFeGNlcHQgZm9yIGF0dHJpYnV0ZXMsIHdoaWNoIGFyZSBjb250YWluZWQgaW4gZWxlbWVudHMuKQorCU5vZGVzIGhhdmUgc2libGluZ3MsIGEgcGFyZW50LCBhbmQgY2hpbGRyZW4uIEEgbm9kZSBjYW4gYmUKKwlpbiBhIGRvY3VtZW50LCBvciBzdGFuZCBvbiBpdHMgb3duLiBUaGUgdHlwZSBvZiBhIFRpWG1sTm9kZQorCWNhbiBiZSBxdWVyaWVkLCBhbmQgaXQgY2FuIGJlIGNhc3QgdG8gaXRzIG1vcmUgZGVmaW5lZCB0eXBlLgorKi8KK2NsYXNzIFRpWG1sTm9kZSA6IHB1YmxpYyBUaVhtbEJhc2UKK3sKKyAgcHVibGljOgorCisJLyoqIEFuIG91dHB1dCBzdHJlYW0gb3BlcmF0b3IsIGZvciBldmVyeSBjbGFzcy4gTm90ZSB0aGF0IHRoaXMgb3V0cHV0cworCQl3aXRob3V0IGFueSBuZXdsaW5lcyBvciBmb3JtYXR0aW5nLCBhcyBvcHBvc2VkIHRvIFByaW50KCksIHdoaWNoCisJCWluY2x1ZGVzIHRhYnMgYW5kIG5ldyBsaW5lcy4KKworCQlUaGUgb3BlcmF0b3I8PCBhbmQgb3BlcmF0b3I+PiBhcmUgbm90IGNvbXBsZXRlbHkgc3ltbWV0cmljLiBXcml0aW5nCisJCWEgbm9kZSB0byBhIHN0cmVhbSBpcyB2ZXJ5IHdlbGwgZGVmaW5lZC4gWW91J2xsIGdldCBhIG5pY2Ugc3RyZWFtCisJCW9mIG91dHB1dCwgd2l0aG91dCBhbnkgZXh0cmEgd2hpdGVzcGFjZSBvciBuZXdsaW5lcy4gCisJCQorCQlCdXQgcmVhZGluZyBpcyBub3QgYXMgd2VsbCBkZWZpbmVkLiAoQXMgaXQgYWx3YXlzIGlzLikgSWYgeW91IGNyZWF0ZQorCQlhIFRpWG1sRWxlbWVudCAoZm9yIGV4YW1wbGUpIGFuZCByZWFkIHRoYXQgZnJvbSBhbiBpbnB1dCBzdHJlYW0sCisJCXRoZSB0ZXh0IG5lZWRzIHRvIGRlZmluZSBhbiBlbGVtZW50IG9yIGp1bmsgd2lsbCByZXN1bHQuIFRoaXMgaXMKKwkJdHJ1ZSBvZiBhbGwgaW5wdXQgc3RyZWFtcywgYnV0IGl0J3Mgd29ydGgga2VlcGluZyBpbiBtaW5kLgorCisJCUEgVGlYbWxEb2N1bWVudCB3aWxsIHJlYWQgbm9kZXMgdW50aWwgaXQgcmVhZHMgYSByb290IGVsZW1lbnQuCisJKi8KKwlmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8ICggc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IFRpWG1sTm9kZSYgYmFzZSApCisJeworCQliYXNlLlN0cmVhbU91dCggJm91dCApOworCQlyZXR1cm4gb3V0OworCX0KKworCS8qKiBBbiBpbnB1dCBzdHJlYW0gb3BlcmF0b3IsIGZvciBldmVyeSBjbGFzcy4gVG9sZXJhbnQgb2YgbmV3bGluZXMgYW5kCisJCWZvcm1hdHRpbmcsIGJ1dCBkb2Vzbid0IGV4cGVjdCB0aGVtLgorCSovCisJZnJpZW5kIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PiAoIHN0ZDo6aXN0cmVhbSYgaW4sIFRpWG1sTm9kZSYgYmFzZSApCisJeworCQlzdGQ6OnN0cmluZyB0YWc7CisJCXRhZy5yZXNlcnZlKCA4ICogMTAwMCApOworCQliYXNlLlN0cmVhbUluKCAmaW4sICZ0YWcgKTsKKwkJCisJCWJhc2UuUGFyc2UoIHRhZy5jX3N0cigpICk7CisJCXJldHVybiBpbjsKKwl9CisKKwkvKiogVGhlIHR5cGVzIG9mIFhNTCBub2RlcyBzdXBwb3J0ZWQgYnkgVGlueVhtbC4gKEFsbCB0aGUKKwkJdW5zdXBwb3J0ZWQgdHlwZXMgYXJlIHBpY2tlZCB1cCBieSBVTktOT1dOLikKKwkqLworCWVudW0gTm9kZVR5cGUgCisJeworCQlET0NVTUVOVCwgCisJCUVMRU1FTlQsIAorCQlDT01NRU5ULCAKKwkJVU5LTk9XTiwgCisJCVRFWFQsIAorCQlERUNMQVJBVElPTiwgCisJCVRZUEVDT1VOVAorCX07CisKKwl2aXJ0dWFsIH5UaVhtbE5vZGUoKTsKKworCS8qKiBUaGUgbWVhbmluZyBvZiAndmFsdWUnIGNoYW5nZXMgZm9yIHRoZSBzcGVjaWZpYyB0eXBlIG9mCisJCVRpWG1sTm9kZS4KKwkJQHZlcmJhdGltCisJCURvY3VtZW50OglmaWxlbmFtZSBvZiB0aGUgeG1sIGZpbGUKKwkJRWxlbWVudDoJbmFtZSBvZiB0aGUgZWxlbWVudAorCQlDb21tZW50Ogl0aGUgY29tbWVudCB0ZXh0CisJCVVua25vd246CXRoZSB0YWcgY29udGVudHMKKwkJVGV4dDoJCXRoZSB0ZXh0IHN0cmluZworCQlAZW5kdmVyYmF0aW0KKworCQlUaGUgc3ViY2xhc3NlcyB3aWxsIHdyYXAgdGhpcyBmdW5jdGlvbi4KKwkqLworCWNvbnN0IHN0ZDo6c3RyaW5nJiBWYWx1ZSgpCWNvbnN0CQkJeyByZXR1cm4gdmFsdWU7IH0KKworCS8qKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZS4gRGVmaW5lZCBhczoKKwkJQHZlcmJhdGltCisJCURvY3VtZW50OglmaWxlbmFtZSBvZiB0aGUgeG1sIGZpbGUKKwkJRWxlbWVudDoJbmFtZSBvZiB0aGUgZWxlbWVudAorCQlDb21tZW50Ogl0aGUgY29tbWVudCB0ZXh0CisJCVVua25vd246CXRoZSB0YWcgY29udGVudHMKKwkJVGV4dDoJCXRoZSB0ZXh0IHN0cmluZworCQlAZW5kdmVyYmF0aW0KKwkqLworCXZvaWQgU2V0VmFsdWUoIGNvbnN0IHN0ZDo6c3RyaW5nJiBfdmFsdWUgKQkJeyB2YWx1ZSA9IF92YWx1ZTsgfQorCisJLy8vIERlbGV0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4gRG9lcyBub3QgYWZmZWN0ICd0aGlzJy4KKwl2b2lkIENsZWFyKCk7CisKKwkvLy8gT25lIHN0ZXAgdXAgdGhlIERPTS4KKwlUaVhtbE5vZGUqIFBhcmVudCgpIGNvbnN0CQkJCQl7IHJldHVybiBwYXJlbnQ7IH0KKworCVRpWG1sTm9kZSogRmlyc3RDaGlsZCgpCWNvbnN0CXsgcmV0dXJuIGZpcnN0Q2hpbGQ7IH0JCS8vLzwgVGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgbm9kZS4gV2lsbCBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KKwlUaVhtbE5vZGUqIEZpcnN0Q2hpbGQoIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSApIGNvbnN0OwkvLy88IFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIG5vZGUgd2l0aCB0aGUgbWF0Y2hpbmcgJ3ZhbHVlJy4gV2lsbCBiZSBudWxsIGlmIG5vbmUgZm91bmQuCisJCisJVGlYbWxOb2RlKiBMYXN0Q2hpbGQoKSBjb25zdAl7IHJldHVybiBsYXN0Q2hpbGQ7IH0JCS8vLyBUaGUgbGFzdCBjaGlsZCBvZiB0aGlzIG5vZGUuIFdpbGwgYmUgbnVsbCBpZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4uCisJVGlYbWxOb2RlKiBMYXN0Q2hpbGQoIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSApIGNvbnN0OwkJLy8vIFRoZSBsYXN0IGNoaWxkIG9mIHRoaXMgbm9kZSBtYXRjaGluZyAndmFsdWUnLiBXaWxsIGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgorCisJLyoqIEFuIGFsdGVybmF0ZSB3YXkgdG8gd2FsayB0aGUgY2hpbGRyZW4gb2YgYSBub2RlLgorCQlPbmUgd2F5IHRvIGl0ZXJhdGUgb3ZlciBub2RlcyBpczoKKwkJQHZlcmJhdGltCisJCQlmb3IoIGNoaWxkID0gcGFyZW50LT5GaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5OZXh0U2libGluZygpICkKKwkJQGVuZHZlcmJhdGltCisKKwkJSXRlcmF0ZUNoaWxkcmVuIGRvZXMgdGhlIHNhbWUgdGhpbmcgd2l0aCB0aGUgc3ludGF4OgorCQlAdmVyYmF0aW0KKwkJCWNoaWxkID0gMDsKKwkJCXdoaWxlKCBjaGlsZCA9IHBhcmVudC0+SXRlcmF0ZUNoaWxkcmVuKCBjaGlsZCApICkKKwkJQGVuZHZlcmJhdGltCisKKwkJSXRlcmF0ZUNoaWxkcmVuIHRha2VzIHRoZSBwcmV2aW91cyBjaGlsZCBhcyBpbnB1dCBhbmQgZmluZHMKKwkJdGhlIG5leHQgb25lLiBJZiB0aGUgcHJldmlvdXMgY2hpbGQgaXMgbnVsbCwgaXQgcmV0dXJucyB0aGUKKwkJZmlyc3QuIEl0ZXJhdGVDaGlsZHJlbiB3aWxsIHJldHVybiBudWxsIHdoZW4gZG9uZS4KKwkqLworCVRpWG1sTm9kZSogSXRlcmF0ZUNoaWxkcmVuKCBUaVhtbE5vZGUqIHByZXZpb3VzICkgY29uc3Q7CisKKwkvLy8gVGhpcyBmbGF2b3Igb2YgSXRlcmF0ZUNoaWxkcmVuIHNlYXJjaGVzIGZvciBjaGlsZHJlbiB3aXRoIGEgcGFydGljdWxhciAndmFsdWUnCisJVGlYbWxOb2RlKiBJdGVyYXRlQ2hpbGRyZW4oIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgVGlYbWxOb2RlKiBwcmV2aW91cyApIGNvbnN0OworCQkKKwkvKiogQWRkIGEgbmV3IG5vZGUgcmVsYXRlZCB0byB0aGlzLiBBZGRzIGEgY2hpbGQgcGFzdCB0aGUgTGFzdENoaWxkLgorCQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IG9iamVjdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQuCisJKi8KKwlUaVhtbE5vZGUqIEluc2VydEVuZENoaWxkKCBjb25zdCBUaVhtbE5vZGUmIGFkZFRoaXMgKTsJCQkJCQorCisJLyoqIEFkZCBhIG5ldyBub2RlIHJlbGF0ZWQgdG8gdGhpcy4gQWRkcyBhIGNoaWxkIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNoaWxkLgorCQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IG9iamVjdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQuCisJKi8KKwlUaVhtbE5vZGUqIEluc2VydEJlZm9yZUNoaWxkKCBUaVhtbE5vZGUqIGJlZm9yZVRoaXMsIGNvbnN0IFRpWG1sTm9kZSYgYWRkVGhpcyApOworCisJLyoqIEFkZCBhIG5ldyBub2RlIHJlbGF0ZWQgdG8gdGhpcy4gQWRkcyBhIGNoaWxkIGFmdGVyIHRoZSBzcGVjaWZpZWQgY2hpbGQuCisJCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXcgb2JqZWN0IG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJlZC4KKwkqLworCVRpWG1sTm9kZSogSW5zZXJ0QWZ0ZXJDaGlsZCggIFRpWG1sTm9kZSogYWZ0ZXJUaGlzLCBjb25zdCBUaVhtbE5vZGUmIGFkZFRoaXMgKTsKKwkKKwkvKiogUmVwbGFjZSBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBvYmplY3Qgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkLgorCSovCisJVGlYbWxOb2RlKiBSZXBsYWNlQ2hpbGQoIFRpWG1sTm9kZSogcmVwbGFjZVRoaXMsIGNvbnN0IFRpWG1sTm9kZSYgd2l0aFRoaXMgKTsKKwkKKwkvLy8gRGVsZXRlIGEgY2hpbGQgb2YgdGhpcyBub2RlLgorCWJvb2wgUmVtb3ZlQ2hpbGQoIFRpWG1sTm9kZSogcmVtb3ZlVGhpcyApOworCisJLy8vIE5hdmlnYXRlIHRvIGEgc2libGluZyBub2RlLgorCVRpWG1sTm9kZSogUHJldmlvdXNTaWJsaW5nKCkgY29uc3QJCQl7IHJldHVybiBwcmV2OyB9CisKKwkvLy8gTmF2aWdhdGUgdG8gYSBzaWJsaW5nIG5vZGUuCisJVGlYbWxOb2RlKiBQcmV2aW91c1NpYmxpbmcoIGNvbnN0IHN0ZDo6c3RyaW5nJiApIGNvbnN0OworCQorCS8vLyBOYXZpZ2F0ZSB0byBhIHNpYmxpbmcgbm9kZS4KKwlUaVhtbE5vZGUqIE5leHRTaWJsaW5nKCkgY29uc3QJCQkJeyByZXR1cm4gbmV4dDsgfQorCisJLy8vIE5hdmlnYXRlIHRvIGEgc2libGluZyBub2RlIHdpdGggdGhlIGdpdmVuICd2YWx1ZScuCisJVGlYbWxOb2RlKiBOZXh0U2libGluZyggY29uc3Qgc3RkOjpzdHJpbmcmICkgY29uc3Q7CisKKwkvKiogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZ2V0IHRocm91Z2ggZWxlbWVudHMuIAorCQlDYWxscyBOZXh0U2libGluZyBhbmQgVG9FbGVtZW50LiBXaWxsIHNraXAgYWxsIG5vbi1FbGVtZW50CisJCW5vZGVzLiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm90IGFub3RoZXIgZWxlbWVudC4KKwkqLworCVRpWG1sRWxlbWVudCogTmV4dFNpYmxpbmdFbGVtZW50KCkgY29uc3Q7CisKKwkvKiogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZ2V0IHRocm91Z2ggZWxlbWVudHMuIAorCQlDYWxscyBOZXh0U2libGluZyBhbmQgVG9FbGVtZW50LiBXaWxsIHNraXAgYWxsIG5vbi1FbGVtZW50CisJCW5vZGVzLiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm90IGFub3RoZXIgZWxlbWVudC4KKwkqLworCVRpWG1sRWxlbWVudCogTmV4dFNpYmxpbmdFbGVtZW50KCBjb25zdCBzdGQ6OnN0cmluZyYgKSBjb25zdDsKKworCS8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBnZXQgdGhyb3VnaCBlbGVtZW50cy4KKwlUaVhtbEVsZW1lbnQqIEZpcnN0Q2hpbGRFbGVtZW50KCkJY29uc3Q7CisJCisJLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGdldCB0aHJvdWdoIGVsZW1lbnRzLgorCVRpWG1sRWxlbWVudCogRmlyc3RDaGlsZEVsZW1lbnQoIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSApIGNvbnN0OworCisJLy8vIFF1ZXJ5IHRoZSB0eXBlIChhcyBhbiBlbnVtZXJhdGVkIHZhbHVlLCBhYm92ZSkgb2YgdGhpcyBub2RlLgorCXZpcnR1YWwgaW50IFR5cGUoKSBjb25zdAl7IHJldHVybiB0eXBlOyB9CisKKwkvKiogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgRG9jdW1lbnQgdGhpcyBub2RlIGxpdmVzIGluLiAKKwkJUmV0dXJucyBudWxsIGlmIG5vdCBpbiBhIGRvY3VtZW50LgorCSovCisJVGlYbWxEb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdDsKKworCS8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBub2RlIGhhcyBubyBjaGlsZHJlbi4KKwlib29sIE5vQ2hpbGRyZW4oKSBjb25zdAkJCQkJCXsgcmV0dXJuICFmaXJzdENoaWxkOyB9CisKKwlUaVhtbERvY3VtZW50KiBUb0RvY3VtZW50KCkJY29uc3QJCXsgcmV0dXJuICggdGhpcyAmJiB0eXBlID09IERPQ1VNRU5UICkgPyAoVGlYbWxEb2N1bWVudCopIHRoaXMgOiAwOyB9IC8vLzwgQ2FzdCB0byBhIG1vcmUgZGVmaW5lZCB0eXBlLiBXaWxsIHJldHVybiBudWxsIG5vdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuCisJVGlYbWxFbGVtZW50KiAgVG9FbGVtZW50KCkgY29uc3QJCXsgcmV0dXJuICggdGhpcyAmJiB0eXBlID09IEVMRU1FTlQgICkgPyAoVGlYbWxFbGVtZW50KikgIHRoaXMgOiAwOyB9IC8vLzwgQ2FzdCB0byBhIG1vcmUgZGVmaW5lZCB0eXBlLiBXaWxsIHJldHVybiBudWxsIG5vdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuCisJVGlYbWxDb21tZW50KiAgVG9Db21tZW50KCkgY29uc3QJCXsgcmV0dXJuICggdGhpcyAmJiB0eXBlID09IENPTU1FTlQgICkgPyAoVGlYbWxDb21tZW50KikgIHRoaXMgOiAwOyB9IC8vLzwgQ2FzdCB0byBhIG1vcmUgZGVmaW5lZCB0eXBlLiBXaWxsIHJldHVybiBudWxsIG5vdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuCisJVGlYbWxVbmtub3duKiAgVG9Vbmtub3duKCkgY29uc3QJCXsgcmV0dXJuICggdGhpcyAmJiB0eXBlID09IFVOS05PV04gICkgPyAoVGlYbWxVbmtub3duKikgIHRoaXMgOiAwOyB9IC8vLzwgQ2FzdCB0byBhIG1vcmUgZGVmaW5lZCB0eXBlLiBXaWxsIHJldHVybiBudWxsIG5vdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUuCisJVGlYbWxUZXh0KgkgICBUb1RleHQoKSAgICBjb25zdAkJeyByZXR1cm4gKCB0aGlzICYmIHR5cGUgPT0gVEVYVCAgICAgKSA/IChUaVhtbFRleHQqKSAgICAgdGhpcyA6IDA7IH0gLy8vPCBDYXN0IHRvIGEgbW9yZSBkZWZpbmVkIHR5cGUuIFdpbGwgcmV0dXJuIG51bGwgbm90IG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKwlUaVhtbERlY2xhcmF0aW9uKiBUb0RlY2xhcmF0aW9uKCkgY29uc3QJeyByZXR1cm4gKCB0aGlzICYmIHR5cGUgPT0gREVDTEFSQVRJT04gKSA/IChUaVhtbERlY2xhcmF0aW9uKikgdGhpcyA6IDA7IH0gLy8vPCBDYXN0IHRvIGEgbW9yZSBkZWZpbmVkIHR5cGUuIFdpbGwgcmV0dXJuIG51bGwgbm90IG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKworCXZpcnR1YWwgVGlYbWxOb2RlKiBDbG9uZSgpIGNvbnN0ID0gMDsKKworCS8vIFRoZSByZWFsIHdvcmsgb2YgdGhlIGlucHV0IG9wZXJhdG9yLgorCXZpcnR1YWwgdm9pZCBTdHJlYW1Jbiggc3RkOjppc3RyZWFtKiBpbiwgc3RkOjpzdHJpbmcqIHRhZyApID0gMDsKKworICBwcm90ZWN0ZWQ6CisJVGlYbWxOb2RlKCBOb2RlVHlwZSB0eXBlICk7CisKKwkvLyBUaGUgbm9kZSBpcyBwYXNzZWQgaW4gYnkgb3duZXJzaGlwLiBUaGlzIG9iamVjdCB3aWxsIGRlbGV0ZSBpdC4KKwlUaVhtbE5vZGUqIExpbmtFbmRDaGlsZCggVGlYbWxOb2RlKiBhZGRUaGlzICk7CisKKwkvLyBGaWd1cmUgb3V0IHdoYXQgaXMgYXQgKnAsIGFuZCBwYXJzZSBpdC4gUmV0dXJucyBudWxsIGlmIGl0IGlzIG5vdCBhbiB4bWwgbm9kZS4KKwlUaVhtbE5vZGUqIElkZW50aWZ5KCBjb25zdCBjaGFyKiBzdGFydCApOworCisJdm9pZCBDb3B5VG9DbG9uZSggVGlYbWxOb2RlKiB0YXJnZXQgKSBjb25zdAl7IHRhcmdldC0+dmFsdWUgPSB2YWx1ZTsgfQorCisJVGlYbWxOb2RlKgkJcGFyZW50OwkJCisJTm9kZVR5cGUJCXR5cGU7CisJCisJVGlYbWxOb2RlKgkJZmlyc3RDaGlsZDsKKwlUaVhtbE5vZGUqCQlsYXN0Q2hpbGQ7CisKKwlzdGQ6OnN0cmluZwkJdmFsdWU7CisJCisJVGlYbWxOb2RlKgkJcHJldjsKKwlUaVhtbE5vZGUqCQluZXh0OworfTsKKworCisvKiogQW4gYXR0cmlidXRlIGlzIGEgbmFtZS12YWx1ZSBwYWlyLiBFbGVtZW50cyBoYXZlIGFuIGFyYml0cmFyeQorCW51bWJlciBvZiBhdHRyaWJ1dGVzLCBlYWNoIHdpdGggYSB1bmlxdWUgbmFtZS4KKworCUBub3RlIFRoZSBhdHRyaWJ1dGVzIGFyZSBub3QgVGlYbWxOb2Rlcywgc2luY2UgdGhleSBhcmUgbm90CisJCSAgcGFydCBvZiB0aGUgdGlueVhNTCBkb2N1bWVudCBvYmplY3QgbW9kZWwuIFRoZXJlIGFyZSBvdGhlcgorCQkgIHN1Z2dlc3RlZCB3YXlzIHRvIGxvb2sgYXQgdGhpcyBwcm9ibGVtLgorCisJQG5vdGUgQXR0cmlidXRlcyBoYXZlIGEgcGFyZW50CisqLworY2xhc3MgVGlYbWxBdHRyaWJ1dGUgOiBwdWJsaWMgVGlYbWxCYXNlCit7CisJZnJpZW5kIGNsYXNzIFRpWG1sQXR0cmlidXRlU2V0OworCisgIHB1YmxpYzoKKwkvLy8gQ29uc3RydWN0IGFuIGVtcHR5IGF0dHJpYnV0ZS4KKwlUaVhtbEF0dHJpYnV0ZSgpIDogcHJldiggMCApLCBuZXh0KCAwICkJe30KKworCS8vLyBDb25zdHJ1Y3QgYW4gYXR0cmlidXRlIHdpdGggYSBuYW1lIGFuZCB2YWx1ZS4KKwlUaVhtbEF0dHJpYnV0ZSggY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgX3ZhbHVlICkJOiBuYW1lKCBfbmFtZSApLCB2YWx1ZSggX3ZhbHVlICksIHByZXYoIDAgKSwgbmV4dCggMCApIHt9CisKKwljb25zdCBzdGQ6OnN0cmluZyYgTmFtZSgpICBjb25zdCB7IHJldHVybiBuYW1lOyB9CQkvLy88IFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKworCWNvbnN0IHN0ZDo6c3RyaW5nJiBWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CQkvLy88IFJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisJY29uc3QgaW50ICAgICAgICAgIEludFZhbHVlKCkgY29uc3Q7CQkJCQkvLy88IFJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyLgorCWNvbnN0IGRvdWJsZQkgICBEb3VibGVWYWx1ZSgpIGNvbnN0OwkJCQkJLy8vPCBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBjb252ZXJ0ZWQgdG8gYSBkb3VibGUuCisKKwl2b2lkIFNldE5hbWUoIGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSApCXsgbmFtZSA9IF9uYW1lOyB9CQkvLy88IFNldCB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKwl2b2lkIFNldFZhbHVlKCBjb25zdCBzdGQ6OnN0cmluZyYgX3ZhbHVlICkJeyB2YWx1ZSA9IF92YWx1ZTsgfQkJLy8vPCBTZXQgdGhlIHZhbHVlLgorCXZvaWQgU2V0SW50VmFsdWUoIGludCB2YWx1ZSApOwkJCQkJCQkJCQkvLy88IFNldCB0aGUgdmFsdWUgZnJvbSBhbiBpbnRlZ2VyLgorCXZvaWQgU2V0RG91YmxlVmFsdWUoIGRvdWJsZSB2YWx1ZSApOwkJCQkJCQkJLy8vPCBTZXQgdGhlIHZhbHVlIGZyb20gYSBkb3VibGUuCisKKwkvLy8gR2V0IHRoZSBuZXh0IHNpYmxpbmcgYXR0cmlidXRlIGluIHRoZSBET00uIFJldHVybnMgbnVsbCBhdCBlbmQuCisJVGlYbWxBdHRyaWJ1dGUqIE5leHQoKSBjb25zdDsKKwkvLy8gR2V0IHRoZSBwcmV2aW91cyBzaWJsaW5nIGF0dHJpYnV0ZSBpbiB0aGUgRE9NLiBSZXR1cm5zIG51bGwgYXQgYmVnaW5uaW5nLgorCVRpWG1sQXR0cmlidXRlKiBQcmV2aW91cygpIGNvbnN0OworCisJYm9vbCBvcGVyYXRvcj09KCBjb25zdCBUaVhtbEF0dHJpYnV0ZSYgcmhzICkgY29uc3QgeyByZXR1cm4gcmhzLm5hbWUgPT0gbmFtZTsgfQorCWJvb2wgb3BlcmF0b3I8KCBjb25zdCBUaVhtbEF0dHJpYnV0ZSYgcmhzICkJIGNvbnN0IHsgcmV0dXJuIG5hbWUgPCByaHMubmFtZTsgfQorCWJvb2wgb3BlcmF0b3I+KCBjb25zdCBUaVhtbEF0dHJpYnV0ZSYgcmhzICkgIGNvbnN0IHsgcmV0dXJuIG5hbWUgPiByaHMubmFtZTsgfQorCisJLyoJW2ludGVybmFsIHVzZV0gCisJCUF0dHJpYnR1ZSBwYXJzaW5nIHN0YXJ0czogZmlyc3QgbGV0dGVyIG9mIHRoZSBuYW1lCisJCQkJCQkgcmV0dXJuczogdGhlIG5leHQgY2hhciBhZnRlciB0aGUgdmFsdWUgZW5kIHF1b3RlCisJKi8JCisJdmlydHVhbCBjb25zdCBjaGFyKiBQYXJzZSggY29uc3QgY2hhciogcCApOworCisJLy8gW2ludGVybmFsIHVzZV0gCisgCXZpcnR1YWwgdm9pZCBQcmludCggRklMRSogY2ZpbGUsIGludCBkZXB0aCApIGNvbnN0OworCisJLy8gW2ludGVybmFsIHVzZV0gCisJdmlydHVhbCB2b2lkIFN0cmVhbU91dCggc3RkOjpvc3RyZWFtKiBvdXQgKSBjb25zdDsKKworCS8vIFtpbnRlcm5hbCB1c2VdCisJLy8gU2V0IHRoZSBkb2N1bWVudCBwb2ludGVyIHNvIHRoZSBhdHRyaWJ1dGUgY2FuIHJlcG9ydCBlcnJvcnMuCisJdm9pZCBTZXREb2N1bWVudCggVGlYbWxEb2N1bWVudCogZG9jICkJeyBkb2N1bWVudCA9IGRvYzsgfQorCisgIHByaXZhdGU6CisJVGlYbWxEb2N1bWVudCoJZG9jdW1lbnQ7CS8vIEEgcG9pbnRlciBiYWNrIHRvIGEgZG9jdW1lbnQsIGZvciBlcnJvciByZXBvcnRpbmcuCisJc3RkOjpzdHJpbmcJCW5hbWU7CisJc3RkOjpzdHJpbmcJCXZhbHVlOworCisJVGlYbWxBdHRyaWJ1dGUqCXByZXY7CisJVGlYbWxBdHRyaWJ1dGUqCW5leHQ7Cit9OworCisKKy8qCUEgY2xhc3MgdXNlZCB0byBtYW5hZ2UgYSBncm91cCBvZiBhdHRyaWJ1dGVzLgorCUl0IGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5LCBib3RoIGJ5IHRoZSBFTEVNRU5UIGFuZCB0aGUgREVDTEFSQVRJT04uCisJCisJVGhlIHNldCBjYW4gYmUgY2hhbmdlZCB0cmFuc3BhcmVudCB0byB0aGUgRWxlbWVudCBhbmQgRGVjbGFyYXRpb24KKwljbGFzc2VzIHRoYXQgdXNlIGl0LCBidXQgTk9UIHRyYW5zcGFyZW50IHRvIHRoZSBBdHRyaWJ1dGUgCisJd2hpY2ggaGFzIHRvIGltcGxlbWVudCBhIG5leHQoKSBhbmQgcHJldmlvdXMoKSBtZXRob2QuIFdoaWNoIG1ha2VzCisJaXQgYSBiaXQgcHJvYmxlbWF0aWMgYW5kIHByZXZlbnRzIHRoZSB1c2Ugb2YgU1RMLgorCisJVGhpcyB2ZXJzaW9uIGlzIGltcGxlbWVudGVkIHdpdGggY2lyY3VsYXIgbGlzdHMgYmVjYXVzZToKKwkJLSBJIGxpa2UgY2lyY3VsYXIgbGlzdHMKKwkJLSBpdCBkZW1vbnN0cmF0ZXMgc29tZSBpbmRlcGVuZGVuY2UgZnJvbSB0aGUgKHR5cGljYWwpIGRvdWJseSBsaW5rZWQgbGlzdC4KKyovCitjbGFzcyBUaVhtbEF0dHJpYnV0ZVNldAoreworICBwdWJsaWM6CisJVGlYbWxBdHRyaWJ1dGVTZXQoKTsKKwl+VGlYbWxBdHRyaWJ1dGVTZXQoKTsKKworCXZvaWQgQWRkKCBUaVhtbEF0dHJpYnV0ZSogYXR0cmlidXRlICk7CisJdm9pZCBSZW1vdmUoIFRpWG1sQXR0cmlidXRlKiBhdHRyaWJ1dGUgKTsKKworCVRpWG1sQXR0cmlidXRlKiBGaXJzdCgpIGNvbnN0CXsgcmV0dXJuICggc2VudGluZWwubmV4dCA9PSAmc2VudGluZWwgKSA/IDAgOiBzZW50aW5lbC5uZXh0OyB9CisJVGlYbWxBdHRyaWJ1dGUqIExhc3QoKSAgY29uc3QJeyByZXR1cm4gKCBzZW50aW5lbC5wcmV2ID09ICZzZW50aW5lbCApID8gMCA6IHNlbnRpbmVsLnByZXY7IH0KKwkKKwlUaVhtbEF0dHJpYnV0ZSoJRmluZCggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgKSBjb25zdDsKKworICBwcml2YXRlOgorCVRpWG1sQXR0cmlidXRlIHNlbnRpbmVsOworfTsKKworCisvKiogVGhlIGVsZW1lbnQgaXMgYSBjb250YWluZXIgY2xhc3MuIEl0IGhhcyBhIHZhbHVlLCB0aGUgZWxlbWVudCBuYW1lLAorCWFuZCBjYW4gY29udGFpbiBvdGhlciBlbGVtZW50cywgdGV4dCwgY29tbWVudHMsIGFuZCB1bmtub3ducy4KKwlFbGVtZW50cyBhbHNvIGNvbnRhaW4gYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhdHRyaWJ1dGVzLgorKi8KK2NsYXNzIFRpWG1sRWxlbWVudCA6IHB1YmxpYyBUaVhtbE5vZGUKK3sKKyAgcHVibGljOgorCS8vLyBDb25zdHJ1Y3QgYW4gZWxlbWVudC4KKwlUaVhtbEVsZW1lbnQoIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSApOworCisJdmlydHVhbCB+VGlYbWxFbGVtZW50KCk7CisKKwkvKiogR2l2ZW4gYW4gYXR0cmlidXRlIG5hbWUsIGF0dHJpYnV0ZSByZXR1cm5zIHRoZSB2YWx1ZQorCQlmb3IgdGhlIGF0dHJpYnV0ZSBvZiB0aGF0IG5hbWUsIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCisJKi8KKwljb25zdCBzdGQ6OnN0cmluZyogQXR0cmlidXRlKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSApIGNvbnN0OworCisJLyoqIEdpdmVuIGFuIGF0dHJpYnV0ZSBuYW1lLCBhdHRyaWJ1dGUgcmV0dXJucyB0aGUgdmFsdWUKKwkJZm9yIHRoZSBhdHRyaWJ1dGUgb2YgdGhhdCBuYW1lLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgorCSovCisJY29uc3Qgc3RkOjpzdHJpbmcqIEF0dHJpYnV0ZSggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCogaSApIGNvbnN0OworCisJLyoqIFNldHMgYW4gYXR0cmlidXRlIG9mIG5hbWUgdG8gYSBnaXZlbiB2YWx1ZS4gVGhlIGF0dHJpYnV0ZQorCQl3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGNoYW5nZWQgaWYgaXQgZG9lcy4KKwkqLworCXZvaWQgU2V0QXR0cmlidXRlKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgCisJCQkJCSAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSApOworCisJLyoqIFNldHMgYW4gYXR0cmlidXRlIG9mIG5hbWUgdG8gYSBnaXZlbiB2YWx1ZS4gVGhlIGF0dHJpYnV0ZQorCQl3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGNoYW5nZWQgaWYgaXQgZG9lcy4KKwkqLworCXZvaWQgU2V0QXR0cmlidXRlKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgCisJCQkJCSAgIGludCB2YWx1ZSApOworCisJLyoqIERlbGV0ZXMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJKi8KKwl2b2lkIFJlbW92ZUF0dHJpYnV0ZSggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgKTsKKworCVRpWG1sQXR0cmlidXRlKiBGaXJzdEF0dHJpYnV0ZSgpIGNvbnN0CXsgcmV0dXJuIGF0dHJpYnV0ZVNldC5GaXJzdCgpOyB9CQkvLy88IEFjY2VzcyB0aGUgZmlyc3QgYXR0cmlidXRlIGluIHRoaXMgZWxlbWVudC4KKwlUaVhtbEF0dHJpYnV0ZSogTGFzdEF0dHJpYnV0ZSgpCWNvbnN0IAl7IHJldHVybiBhdHRyaWJ1dGVTZXQuTGFzdCgpOyB9CQkvLy88IEFjY2VzcyB0aGUgbGFzdCBhdHRyaWJ1dGUgaW4gdGhpcyBlbGVtZW50LgorCisJLy8gW2ludGVybmFsIHVzZV0gQ3JlYXRlcyBhIG5ldyBFbGVtZW50IGFuZCByZXR1cnMgaXQuCisJdmlydHVhbCBUaVhtbE5vZGUqIENsb25lKCkgY29uc3Q7CisJLy8gW2ludGVybmFsIHVzZV0gCisgCXZpcnR1YWwgdm9pZCBQcmludCggRklMRSogY2ZpbGUsIGludCBkZXB0aCApIGNvbnN0OworCS8vIFtpbnRlcm5hbCB1c2VdIAorCXZpcnR1YWwgdm9pZCBTdHJlYW1PdXQgKCBzdGQ6Om9zdHJlYW0qIG91dCApIGNvbnN0OworCS8vIFtpbnRlcm5hbCB1c2VdIAorCXZpcnR1YWwgdm9pZCBTdHJlYW1Jbiggc3RkOjppc3RyZWFtKiBpbiwgc3RkOjpzdHJpbmcqIHRhZyApOworCisgIHByb3RlY3RlZDoKKwkvKglbaW50ZXJuYWwgdXNlXSAKKwkJQXR0cmlidHVlIHBhcnNpbmcgc3RhcnRzOiBuZXh0IGNoYXIgcGFzdCAnPCcKKwkJCQkJCSByZXR1cm5zOiBuZXh0IGNoYXIgcGFzdCAnPicKKwkqLwkKKwl2aXJ0dWFsIGNvbnN0IGNoYXIqIFBhcnNlKCBjb25zdCBjaGFyKiBwICk7CisKKwkvKglbaW50ZXJuYWwgdXNlXQorCQlSZWFkcyB0aGUgInZhbHVlIiBvZiB0aGUgZWxlbWVudCAtLSBhbm90aGVyIGVsZW1lbnQsIG9yIHRleHQuCisJCVRoaXMgc2hvdWxkIHRlcm1pbmF0ZSB3aXRoIHRoZSBjdXJyZW50IGVuZCB0YWcuCisJKi8KKwljb25zdCBjaGFyKiBSZWFkVmFsdWUoIGNvbnN0IGNoYXIqIGluICk7CisJYm9vbCBSZWFkVmFsdWUoIHN0ZDo6aXN0cmVhbSogaW4gKTsKKworICBwcml2YXRlOgorCVRpWG1sQXR0cmlidXRlU2V0IGF0dHJpYnV0ZVNldDsKK307CisKKworLyoqCUFuIFhNTCBjb21tZW50LgorKi8KK2NsYXNzIFRpWG1sQ29tbWVudCA6IHB1YmxpYyBUaVhtbE5vZGUKK3sKKyAgcHVibGljOgorCS8vLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IGNvbW1lbnQuCisJVGlYbWxDb21tZW50KCkgOiBUaVhtbE5vZGUoIFRpWG1sTm9kZTo6Q09NTUVOVCApIHt9CisJdmlydHVhbCB+VGlYbWxDb21tZW50KCkJe30KKworCS8vIFtpbnRlcm5hbCB1c2VdIENyZWF0ZXMgYSBuZXcgRWxlbWVudCBhbmQgcmV0dXJzIGl0LgorCXZpcnR1YWwgVGlYbWxOb2RlKiBDbG9uZSgpIGNvbnN0OworCS8vIFtpbnRlcm5hbCB1c2VdIAorIAl2aXJ0dWFsIHZvaWQgUHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAKKwl2aXJ0dWFsIHZvaWQgU3RyZWFtT3V0ICggc3RkOjpvc3RyZWFtKiBvdXQgKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAKKwl2aXJ0dWFsIHZvaWQgU3RyZWFtSW4oIHN0ZDo6aXN0cmVhbSogaW4sIHN0ZDo6c3RyaW5nKiB0YWcgKTsKKworICBwcm90ZWN0ZWQ6CisJLyoJW2ludGVybmFsIHVzZV0gCisJCUF0dHJpYnR1ZSBwYXJzaW5nIHN0YXJ0czogYXQgdGhlICEgb2YgdGhlICEtLQorCQkJCQkJIHJldHVybnM6IG5leHQgY2hhciBwYXN0ICc+JworCSovCQorCXZpcnR1YWwgY29uc3QgY2hhciogUGFyc2UoIGNvbnN0IGNoYXIqIHAgKTsKK307CisKKworLyoqIFhNTCB0ZXh0LiBDb250YWluZWQgaW4gYW4gZWxlbWVudC4KKyovCitjbGFzcyBUaVhtbFRleHQgOiBwdWJsaWMgVGlYbWxOb2RlCit7CisgIHB1YmxpYzoKKwlUaVhtbFRleHQoIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbml0VmFsdWUgKSAgOiBUaVhtbE5vZGUoIFRpWG1sTm9kZTo6VEVYVCApIHsgU2V0VmFsdWUoIGluaXRWYWx1ZSApOyB9CisJdmlydHVhbCB+VGlYbWxUZXh0KCkge30KKworCisJLy8gW2ludGVybmFsIHVzZV0gQ3JlYXRlcyBhIG5ldyBFbGVtZW50IGFuZCByZXR1cm5zIGl0LgorCXZpcnR1YWwgVGlYbWxOb2RlKiBDbG9uZSgpIGNvbnN0OworCS8vIFtpbnRlcm5hbCB1c2VdIAorIAl2aXJ0dWFsIHZvaWQgUHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAKKwl2aXJ0dWFsIHZvaWQgU3RyZWFtT3V0ICggc3RkOjpvc3RyZWFtKiBvdXQgKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAJCisJYm9vbCBCbGFuaygpIGNvbnN0OwkvLyByZXR1cm5zIHRydWUgaWYgYWxsIHdoaXRlIHNwYWNlIGFuZCBuZXcgbGluZXMKKwkvKglbaW50ZXJuYWwgdXNlXSAKKwkJQXR0cmlidHVlIHBhcnNpbmcgc3RhcnRzOiBGaXJzdCBjaGFyIG9mIHRoZSB0ZXh0CisJCQkJCQkgcmV0dXJuczogbmV4dCBjaGFyIHBhc3QgJz4nCisJKi8JCisJdmlydHVhbCBjb25zdCBjaGFyKiBQYXJzZSggY29uc3QgY2hhciogcCApOworCS8vIFtpbnRlcm5hbCB1c2VdCisJdmlydHVhbCB2b2lkIFN0cmVhbUluKCBzdGQ6OmlzdHJlYW0qIGluLCBzdGQ6OnN0cmluZyogdGFnICk7Cit9OworCisKKy8qKiBJbiBjb3JyZWN0IFhNTCB0aGUgZGVjbGFyYXRpb24gaXMgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBmaWxlLgorCUB2ZXJiYXRpbQorCQk8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9InllcyI/PgorCUBlbmR2ZXJiYXRpbQorCisJVGlueVhtbCB3aWxsIGhhcHBpbHkgcmVhZCBvciB3cml0ZSBmaWxlcyB3aXRob3V0IGEgZGVjbGFyYXRpb24sCisJaG93ZXZlci4gVGhlcmUgYXJlIDMgcG9zc2libGUgYXR0cmlidXRlcyB0byB0aGUgZGVjbGFyYXRpb246IAorCXZlcnNpb24sIGVuY29kaW5nLCBhbmQgc3RhbmRhbG9uZS4KKworCU5vdGU6IEluIHRoaXMgdmVyc2lvbiBvZiB0aGUgY29kZSwgdGhlIGF0dHJpYnV0ZXMgYXJlCisJaGFuZGxlZCBhcyBzcGVjaWFsIGNhc2VzLCBub3QgZ2VuZXJpYyBhdHRyaWJ1dGVzLCBzaW1wbHkKKwliZWNhdXNlIHRoZXJlIGNhbiBvbmx5IGJlIGF0IG1vc3QgMyBhbmQgdGhleSBhcmUgYWx3YXlzIHRoZSBzYW1lLgorKi8KK2NsYXNzIFRpWG1sRGVjbGFyYXRpb24gOiBwdWJsaWMgVGlYbWxOb2RlCit7CisgIHB1YmxpYzoKKwkvLy8gQ29uc3RydWN0IGFuIGVtcHR5IGRlY2xhcmF0aW9uLgorCVRpWG1sRGVjbGFyYXRpb24oKSAgIDogVGlYbWxOb2RlKCBUaVhtbE5vZGU6OkRFQ0xBUkFUSU9OICkge30KKworCS8vLyBDb25zdHJ1Y3QuCisJVGlYbWxEZWNsYXJhdGlvbiggY29uc3Qgc3RkOjpzdHJpbmcmIHZlcnNpb24sIAorCQkJCQkgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZywKKwkJCQkJICBjb25zdCBzdGQ6OnN0cmluZyYgc3RhbmRhbG9uZSApOworCisJdmlydHVhbCB+VGlYbWxEZWNsYXJhdGlvbigpCXt9CisKKwkvLy8gVmVyc2lvbi4gV2lsbCByZXR1cm4gZW1wdHkgaWYgbm9uZSB3YXMgZm91bmQuCisJY29uc3Qgc3RkOjpzdHJpbmcmIFZlcnNpb24oKSBjb25zdAkJeyByZXR1cm4gdmVyc2lvbjsgfQorCS8vLyBFbmNvZGluZy4gV2lsbCByZXR1cm4gZW1wdHkgaWYgbm9uZSB3YXMgZm91bmQuCisJY29uc3Qgc3RkOjpzdHJpbmcmIEVuY29kaW5nKCkgY29uc3QJCXsgcmV0dXJuIGVuY29kaW5nOyB9CisJLy8vIElzIHRoaXMgYSBzdGFuZGFsb25lIGRvY3VtZW50PyAKKwljb25zdCBzdGQ6OnN0cmluZyYgU3RhbmRhbG9uZSgpIGNvbnN0CQl7IHJldHVybiBzdGFuZGFsb25lOyB9CisKKwkvLyBbaW50ZXJuYWwgdXNlXSBDcmVhdGVzIGEgbmV3IEVsZW1lbnQgYW5kIHJldHVycyBpdC4KKwl2aXJ0dWFsIFRpWG1sTm9kZSogQ2xvbmUoKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAKKyAJdmlydHVhbCB2b2lkIFByaW50KCBGSUxFKiBjZmlsZSwgaW50IGRlcHRoICkgY29uc3Q7CisJLy8gW2ludGVybmFsIHVzZV0gCisJdmlydHVhbCB2b2lkIFN0cmVhbU91dCAoIHN0ZDo6b3N0cmVhbSogb3V0ICkgY29uc3Q7CisJLy8gW2ludGVybmFsIHVzZV0gCisJdmlydHVhbCB2b2lkIFN0cmVhbUluKCBzdGQ6OmlzdHJlYW0qIGluLCBzdGQ6OnN0cmluZyogdGFnICk7CisKKyAgcHJvdGVjdGVkOgorCS8vCVtpbnRlcm5hbCB1c2VdIAorCS8vCUF0dHJpYnR1ZSBwYXJzaW5nIHN0YXJ0czogbmV4dCBjaGFyIHBhc3QgJzwnCisJLy8JCQkJCSByZXR1cm5zOiBuZXh0IGNoYXIgcGFzdCAnPicKKwkKKwl2aXJ0dWFsIGNvbnN0IGNoYXIqIFBhcnNlKCBjb25zdCBjaGFyKiBwICk7CisKKyAgcHJpdmF0ZToKKwlzdGQ6OnN0cmluZyB2ZXJzaW9uOworCXN0ZDo6c3RyaW5nIGVuY29kaW5nOworCXN0ZDo6c3RyaW5nIHN0YW5kYWxvbmU7Cit9OworCisKKy8qKiBBbnkgdGFnIHRoYXQgdGlueVhtbCBkb2Vzbid0IHJlY29nbml6ZSBpcyBzYXZlIGFzIGFuIAorCXVua25vd24uIEl0IGlzIGEgdGFnIG9mIHRleHQsIGJ1dCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgorCUl0IHdpbGwgYmUgd3JpdHRlbiBiYWNrIHRvIHRoZSBYTUwsIHVuY2hhbmdlZCwgd2hlbiB0aGUgZmlsZSAKKwlpcyBzYXZlZC4KKyovCitjbGFzcyBUaVhtbFVua25vd24gOiBwdWJsaWMgVGlYbWxOb2RlCit7CisgIHB1YmxpYzoKKwlUaVhtbFVua25vd24oKSA6IFRpWG1sTm9kZSggVGlYbWxOb2RlOjpVTktOT1dOICkge30KKwl2aXJ0dWFsIH5UaVhtbFVua25vd24oKSB7fQorCisJLy8gW2ludGVybmFsIHVzZV0gCQorCXZpcnR1YWwgVGlYbWxOb2RlKiBDbG9uZSgpIGNvbnN0OworCS8vIFtpbnRlcm5hbCB1c2VdIAorIAl2aXJ0dWFsIHZvaWQgUHJpbnQoIEZJTEUqIGNmaWxlLCBpbnQgZGVwdGggKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAKKwl2aXJ0dWFsIHZvaWQgU3RyZWFtT3V0ICggc3RkOjpvc3RyZWFtKiBvdXQgKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAKKwl2aXJ0dWFsIHZvaWQgU3RyZWFtSW4oIHN0ZDo6aXN0cmVhbSogaW4sIHN0ZDo6c3RyaW5nKiB0YWcgKTsKKworICBwcm90ZWN0ZWQ6CisJLyoJW2ludGVybmFsIHVzZV0gCisJCUF0dHJpYnV0ZSBwYXJzaW5nIHN0YXJ0czogRmlyc3QgY2hhciBvZiB0aGUgdGV4dAorCQkJCQkJIHJldHVybnM6IG5leHQgY2hhciBwYXN0ICc+JworCSovCQorCXZpcnR1YWwgY29uc3QgY2hhciogUGFyc2UoIGNvbnN0IGNoYXIqIHAgKTsKK307CisKKworLyoqIEFsd2F5cyB0aGUgdG9wIGxldmVsIG5vZGUuIEEgZG9jdW1lbnQgYmluZHMgdG9nZXRoZXIgYWxsIHRoZQorCVhNTCBwaWVjZXMuIEl0IGNhbiBiZSBzYXZlZCwgbG9hZGVkLCBhbmQgcHJpbnRlZCB0byB0aGUgc2NyZWVuLgorCVRoZSAndmFsdWUnIG9mIGEgZG9jdW1lbnQgbm9kZSBpcyB0aGUgeG1sIGZpbGUgbmFtZS4KKyovCitjbGFzcyBUaVhtbERvY3VtZW50IDogcHVibGljIFRpWG1sTm9kZQoreworICBwdWJsaWM6CisJLy8vIENyZWF0ZSBhbiBlbXB0eSBkb2N1bWVudCwgdGhhdCBoYXMgbm8gbmFtZS4KKwlUaVhtbERvY3VtZW50KCk7CisJLy8vIENyZWF0ZSBhIGRvY3VtZW50IHdpdGggYSBuYW1lLiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQgaXMgYWxzbyB0aGUgZmlsZW5hbWUgb2YgdGhlIHhtbC4KKwlUaVhtbERvY3VtZW50KCBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnROYW1lICk7CisJCisJdmlydHVhbCB+VGlYbWxEb2N1bWVudCgpIHt9CisKKwkvKiogTG9hZCBhIGZpbGUgdXNpbmcgdGhlIGN1cnJlbnQgZG9jdW1lbnQgdmFsdWUuIAorCQlSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4gV2lsbCBkZWxldGUgYW55IGV4aXN0aW5nCisJCWRvY3VtZW50IGRhdGEgYmVmb3JlIGxvYWRpbmcuCisJKi8KKwlib29sIExvYWRGaWxlKCk7CisJLy8vIFNhdmUgYSBmaWxlIHVzaW5nIHRoZSBjdXJyZW50IGRvY3VtZW50IHZhbHVlLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4KKwlib29sIFNhdmVGaWxlKCkgY29uc3Q7CisJLy8vIExvYWQgYSBmaWxlIHVzaW5nIHRoZSBnaXZlbiBmaWxlbmFtZS4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCisJYm9vbCBMb2FkRmlsZSggY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lICk7CisJLy8vIFNhdmUgYSBmaWxlIHVzaW5nIHRoZSBnaXZlbiBmaWxlbmFtZS4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCisJYm9vbCBTYXZlRmlsZSggY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lICkgY29uc3Q7CisKKwkvLy8gUGFyc2UgdGhlIGdpdmVuIG51bGwgdGVybWluYXRlZCBibG9jayBvZiB4bWwgZGF0YS4KKwl2aXJ0dWFsIGNvbnN0IGNoYXIqIFBhcnNlKCBjb25zdCBjaGFyKiBwICk7CisKKwkvKiogR2V0IHRoZSByb290IGVsZW1lbnQgLS0gdGhlIG9ubHkgdG9wIGxldmVsIGVsZW1lbnQgLS0gb2YgdGhlIGRvY3VtZW50LgorCQlJbiB3ZWxsIGZvcm1lZCBYTUwsIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZS4gVGlueVhtbCBpcyB0b2xlcmFudCBvZgorCQltdWx0aXBsZSBlbGVtZW50cyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWwuCisJKi8KKwlUaVhtbEVsZW1lbnQqIFJvb3RFbGVtZW50KCkgY29uc3QJCXsgcmV0dXJuIEZpcnN0Q2hpbGRFbGVtZW50KCk7IH0KKwkKKwkvLy8gSWYsIGR1cmluZyBwYXJzaW5nLCBhIGVycm9yIG9jY3VycywgRXJyb3Igd2lsbCBiZSBzZXQgdG8gdHJ1ZS4KKwlib29sIEVycm9yKCkgY29uc3QJCQkJCQl7IHJldHVybiBlcnJvcjsgfQorCisJLy8vIENvbnRhaW5zIGEgdGV4dHVhbCAoZW5nbGlzaCkgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yIGlmIG9uZSBvY2N1cnMuCisJY29uc3Qgc3RkOjpzdHJpbmcmIEVycm9yRGVzYygpIGNvbnN0CXsgcmV0dXJuIGVycm9yRGVzYzsgfQorCisJLyoqIEdlbmVyYWxseSwgeW91IHByb2JhYmx5IHdhbnQgdGhlIGVycm9yIHN0cmluZyAoIEVycm9yRGVzYygpICkuIEJ1dCBpZiB5b3UKKwkJcHJlZmVyIHRoZSBFcnJvcklkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZmV0Y2ggaXQuCisJKi8KKwljb25zdCBpbnQgRXJyb3JJZCgpCWNvbnN0CQkJCXsgcmV0dXJuIGVycm9ySWQ7IH0KKworCS8vLyBJZiB5b3UgaGF2ZSBoYW5kbGVkIHRoZSBlcnJvciwgaXQgY2FuIGJlIHJlc2V0IHdpdGggdGhpcyBjYWxsLgorCXZvaWQgQ2xlYXJFcnJvcigpCQkJCQkJeyBlcnJvciA9IGZhbHNlOyBlcnJvcklkID0gMDsgZXJyb3JEZXNjID0gIiI7IH0KKyAgCisJLyoqIER1bXAgdGhlIGRvY3VtZW50IHRvIHN0YW5kYXJkIG91dC4gKi8KKwl2b2lkIFByaW50KCkgY29uc3QJCQkJCQkJCXsgUHJpbnQoIHN0ZG91dCwgMCApOyB9CisKKwkvLyBbaW50ZXJuYWwgdXNlXSAKKyAJdmlydHVhbCB2b2lkIFByaW50KCBGSUxFKiBjZmlsZSwgaW50IGRlcHRoID0gMCApIGNvbnN0OworCS8vIFtpbnRlcm5hbCB1c2VdIAorCXZpcnR1YWwgdm9pZCBTdHJlYW1PdXQgKCBzdGQ6Om9zdHJlYW0qIG91dCApIGNvbnN0OworCS8vIFtpbnRlcm5hbCB1c2VdIAkKKwl2aXJ0dWFsIFRpWG1sTm9kZSogQ2xvbmUoKSBjb25zdDsKKwkvLyBbaW50ZXJuYWwgdXNlXSAJCisJdm9pZCBTZXRFcnJvciggaW50IGVyciApIHsJCWFzc2VydCggZXJyID4gMCAmJiBlcnIgPCBUSVhNTF9FUlJPUl9TVFJJTkdfQ09VTlQgKTsKKwkJCQkJCQkJCWVycm9yICAgPSB0cnVlOyAKKwkJCQkJCQkJCWVycm9ySWQgPSBlcnI7CisJCQkJCQkJCQllcnJvckRlc2MgPSBlcnJvclN0cmluZ1sgZXJyb3JJZCBdOyB9CisJLy8gW2ludGVybmFsIHVzZV0gCisJdmlydHVhbCB2b2lkIFN0cmVhbUluKCBzdGQ6OmlzdHJlYW0qIGluLCBzdGQ6OnN0cmluZyogdGFnICk7CisKKyAgcHJvdGVjdGVkOgorCisgIHByaXZhdGU6CisJYm9vbCBlcnJvcjsKKwlpbnQgIGVycm9ySWQ7CQorCXN0ZDo6c3RyaW5nIGVycm9yRGVzYzsKK307CisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvQUNNL3Rpbnl4bWwvdGlueXhtbF92YzcudmNwcm9qIGIvQUNNL3Rpbnl4bWwvdGlueXhtbF92YzcudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2I2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9BQ00vdGlueXhtbC90aW55eG1sX3ZjNy52Y3Byb2oKQEAgLTAsMCArMSw2MDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJ0aW55eG1sIg0KKwlQcm9qZWN0R1VJRD0iezlBMDk0NkM5LUYwMTktNDY0My1BNTNBLTI1OUJGOTgwRjVGOX0iDQorCVNjY1Byb2plY3ROYW1lPSIiDQorCVNjY0xvY2FsUGF0aD0iIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFJlbGVhc2UiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS90aW55eG1sLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlXHRpbnl4bWwubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL3Rpbnl4bWwucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIg0KKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWcvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnXHRpbnl4bWwubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJMQU1FIGRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUyINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy90aW55eG1sLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Z1x0aW55eG1sLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iTEFNRSByZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUyINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy90aW55eG1sLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Z1x0aW55eG1sLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iTEFNRSByZWxlYXNlIE5hc218V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjQiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvdGlueXhtbC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyINCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZVx0aW55eG1sLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iZGxsIGRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUyINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxEZWJ1Zy90aW55eG1sLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Z1x0aW55eG1sLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iZGxsIHJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL3Rpbnl4bWwucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIg0KKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWcvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnXHRpbnl4bWwubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJkbGwgcmVsZWFzZSBOYXNtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL3Rpbnl4bWwucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2VcdGlueXhtbC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSJjaGFuZ2VzLnR4dCI+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0icmVhZG1lLnR4dCI+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0idGlueXhtbC5jcHAiPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIi8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJMQU1FIGRlYnVnfFdpbjMyIj4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIi8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iTEFNRSByZWxlYXNlfFdpbjMyIj4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIi8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iTEFNRSByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJkbGwgZGVidWd8V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJkbGwgcmVsZWFzZXxXaW4zMiI+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCU5hbWU9ImRsbCByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9InRpbnl4bWwuaCI+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0idGlueXhtbGVycm9yLmNwcCI+DQorCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCU5hbWU9IkxBTUUgZGVidWd8V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJMQU1FIHJlbGVhc2V8V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJMQU1FIHJlbGVhc2UgTmFzbXxXaW4zMiI+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCU5hbWU9ImRsbCBkZWJ1Z3xXaW4zMiI+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCU5hbWU9ImRsbCByZWxlYXNlfFdpbjMyIj4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIi8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iZGxsIHJlbGVhc2UgTmFzbXxXaW4zMiI+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0idGlueXhtbHBhcnNlci5jcHAiPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIi8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJMQU1FIGRlYnVnfFdpbjMyIj4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIi8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iTEFNRSByZWxlYXNlfFdpbjMyIj4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIi8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iTEFNRSByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJkbGwgZGVidWd8V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJkbGwgcmVsZWFzZXxXaW4zMiI+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCU5hbWU9ImRsbCByZWxlYXNlIE5hc218V2luMzIiPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJPC9GaWxlPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9BQ00vdGlueXhtbC90aW55eG1sZXJyb3IuY3BwIGIvQUNNL3Rpbnl4bWwvdGlueXhtbGVycm9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI5NDg2Ci0tLSAvZGV2L251bGwKKysrIGIvQUNNL3Rpbnl4bWwvdGlueXhtbGVycm9yLmNwcApAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSAidGlueXhtbC5oIgorCisvLyBUaGUgZ29hbCBvZiB0aGUgc2VwZXJhdGUgZXJyb3IgZmlsZSBpcyB0byBtYWtlIHRoZSBmaXJzdAorLy8gc3RlcCB0b3dhcmRzIGxvY2FsaXphdGlvbi4gdGlueXhtbCAoY3VycmVudGx5KSBvbmx5IHN1cHBvcnRzCisvLyBsYXRpbi0xLCBidXQgYXQgbGVhc3QgdGhlIGVycm9yIG1lc3NhZ2VzIGNvdWxkIG5vdyBiZSB0cmFuc2xhdGVkLgorLy8KKy8vIEl0IGFsc28gY2xlYW5zIHVwIHRoZSBjb2RlIGEgYml0LgorLy8KKworY29uc3QgY2hhciogVGlYbWxCYXNlOjplcnJvclN0cmluZ1sgVElYTUxfRVJST1JfU1RSSU5HX0NPVU5UIF0gPQoreworCSJObyBlcnJvciIsCisJIkVycm9yIiwKKwkiRmFpbGVkIHRvIG9wZW4gZmlsZSIsCisJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iLAorCSJFcnJvciBwYXJzaW5nIEVsZW1lbnQuIiwKKwkiRmFpbGVkIHRvIHJlYWQgRWxlbWVudCBuYW1lIiwKKwkiRXJyb3IgcmVhZGluZyBFbGVtZW50IHZhbHVlLiIsCisJIkVycm9yIHJlYWRpbmcgQXR0cmlidXRlcy4iLAorCSJFcnJvcjogZW1wdHkgdGFnLiIsCisJIkVycm9yIHJlYWRpbmcgZW5kIHRhZy4iLAorCSJFcnJvciBwYXJzaW5nIFVua25vd24uIiwKKwkiRXJyb3IgcGFyc2luZyBDb21tZW50LiIsCisJIkVycm9yIHBhcnNpbmcgRGVjbGFyYXRpb24uIiwKKwkiRXJyb3IgZG9jdW1lbnQgZW1wdHkuIgorfTsKZGlmZiAtLWdpdCBhL0FDTS90aW55eG1sL3Rpbnl4bWxwYXJzZXIuY3BwIGIvQUNNL3Rpbnl4bWwvdGlueXhtbHBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5YjBjMQotLS0gL2Rldi9udWxsCisrKyBiL0FDTS90aW55eG1sL3Rpbnl4bWxwYXJzZXIuY3BwCkBAIC0wLDAgKzEsOTI4IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgTGVlIFRob21hc29uICh3d3cuZ3Jpbm5pbmdsaXphcmQuY29tKQorCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCAKK3dhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgCitkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSAKK3B1cnBvc2UsIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCAKK3JlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKzEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3QgCitub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMKK3NvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiAKK3dvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisKKzIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIAorbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCiszLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgCitkaXN0cmlidXRpb24uCisqLworCisjaW5jbHVkZSAidGlueXhtbC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3Ryc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLy8jZGVmaW5lIERFQlVHX1BBUlNFUgorCitUaVhtbEJhc2U6OkVudGl0eSBUaVhtbEJhc2U6OmVudGl0eVsgTlVNX0VOVElUWSBdID0gCit7CisJeyAiJmFtcDsiLCAgNSwgJyYnIH0sCisJeyAiJmx0OyIsICAgNCwgJzwnIH0sCisJeyAiJmd0OyIsICAgNCwgJz4nIH0sCisJeyAiJnF1b3Q7IiwgNiwgJ1wiJyB9LAorCXsgIiZhcG9zOyIsIDYsICdcJycgfQorfTsKKworCitjb25zdCBjaGFyKiBUaVhtbEJhc2U6OlNraXBXaGl0ZVNwYWNlKCBjb25zdCBjaGFyKiBwICkKK3sKKwlpZiAoICFwIHx8ICEqcCApCisJeworCQlyZXR1cm4gMDsKKwl9CisJd2hpbGUgKCBwICYmICpwICkKKwl7CisJCWlmICggaXNzcGFjZSggKnAgKSB8fCAqcCA9PSAnXG4nIHx8ICpwID09J1xyJyApCQkvLyBTdGlsbCB1c2luZyBvbGQgcnVsZXMgZm9yIHdoaXRlIHNwYWNlLgorCQkJKytwOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcDsKK30KKworCisvKnN0YXRpYyovIGJvb2wgVGlYbWxCYXNlOjpTdHJlYW1XaGl0ZVNwYWNlKCBzdGQ6OmlzdHJlYW0qIGluLCBzdGQ6OnN0cmluZyogdGFnICkKK3sKKwlmb3IoIDs7ICkKKwl7CisJCWlmICggIWluLT5nb29kKCkgKSByZXR1cm4gZmFsc2U7CisKKwkJaW50IGMgPSBpbi0+cGVlaygpOworCQlpZiAoICFJc1doaXRlU3BhY2UoIGMgKSApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJKnRhZyArPSBpbi0+Z2V0KCk7CisJfQorfQorCisKKy8qc3RhdGljKi8gYm9vbCBUaVhtbEJhc2U6OlN0cmVhbVRvKCBzdGQ6OmlzdHJlYW0qIGluLCBpbnQgY2hhcmFjdGVyLCBzdGQ6OnN0cmluZyogdGFnICkKK3sKKwl3aGlsZSAoIGluLT5nb29kKCkgKQorCXsKKwkJaW50IGMgPSBpbi0+cGVlaygpOworCQlpZiAoIGMgPT0gY2hhcmFjdGVyICkKKwkJCXJldHVybiB0cnVlOworCisJCWluLT5nZXQoKTsKKwkJKnRhZyArPSBjOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKworY29uc3QgY2hhciogVGlYbWxCYXNlOjpSZWFkTmFtZSggY29uc3QgY2hhciogcCwgc3RyaW5nKiBuYW1lICkKK3sKKwkqbmFtZSA9ICIiOworCWFzc2VydCggcCApOworCisJLy8gTmFtZXMgc3RhcnQgd2l0aCBsZXR0ZXJzIG9yIHVuZGVyc2NvcmVzLgorCS8vIEFmdGVyIHRoYXQsIHRoZXkgY2FuIGJlIGxldHRlcnMsIHVuZGVyc2NvcmVzLCBudW1iZXJzLAorCS8vIGh5cGhlbnMsIG9yIGNvbG9ucy4gKENvbG9ucyBhcmUgdmFsaWQgb255IGZvciBuYW1lc3BhY2VzLAorCS8vIGJ1dCB0aW55eG1sIGNhbid0IHRlbGwgbmFtZXNwYWNlcyBmcm9tIG5hbWVzLikKKwlpZiAoICAgIHAgJiYgKnAgCisJCSAmJiAoIGlzYWxwaGEoICh1bnNpZ25lZCBjaGFyKSAqcCApIHx8ICpwID09ICdfJyApICkKKwl7CisJCXdoaWxlKAkJcCAmJiAqcAorCQkJCSYmCSgJCWlzYWxudW0oICh1bnNpZ25lZCBjaGFyICkgKnAgKSAKKwkJCQkJCSB8fCAqcCA9PSAnXycKKwkJCQkJCSB8fCAqcCA9PSAnLScKKwkJCQkJCSB8fCAqcCA9PSAnOicgKSApCisJCXsKKwkJCSgqbmFtZSkgKz0gKnA7CisJCQkrK3A7CisJCX0KKwkJcmV0dXJuIHA7CisJfQorCXJldHVybiAwOworfQorCisKK2NvbnN0IGNoYXIqIFRpWG1sQmFzZTo6R2V0RW50aXR5KCBjb25zdCBjaGFyKiBwLCBjaGFyKiB2YWx1ZSApCit7CisJLy8gUHJlc3VtZSBhbiBlbnRpdHksIGFuZCBwdWxsIGl0IG91dC4KKwlzdHJpbmcgZW50OworCWludCBpOworCisJLy8gSWdub3JlIHRoZSAmI3ggZW50aXRpZXMuCisJaWYgKCBzdHJuY21wKCAiJiN4IiwgcCwgMyApID09IDAgKQorCXsKKwkJKnZhbHVlID0gKnA7CisJCXJldHVybiBwKzE7CisJfQorCisJLy8gTm93IHRyeSB0byBtYXRjaCBpdC4KKwlmb3IoIGk9MDsgaTxOVU1fRU5USVRZOyArK2kgKQorCXsKKwkJaWYgKCBzdHJuY21wKCBlbnRpdHlbaV0uc3RyLCBwLCBlbnRpdHlbaV0uc3RyTGVuZ3RoICkgPT0gMCApCisJCXsKKwkJCWFzc2VydCggc3RybGVuKCBlbnRpdHlbaV0uc3RyICkgPT0gZW50aXR5W2ldLnN0ckxlbmd0aCApOworCQkJKnZhbHVlID0gZW50aXR5W2ldLmNocjsKKwkJCXJldHVybiAoIHAgKyBlbnRpdHlbaV0uc3RyTGVuZ3RoICk7CisJCX0KKwl9CisKKwkvLyBTbyBpdCB3YXNuJ3QgYW4gZW50aXR5LCBpdHMgdW5yZWNvZ25pemVkLCBvciBzb21ldGhpbmcgbGlrZSB0aGF0LgorCSp2YWx1ZSA9ICpwOwkvLyBEb24ndCBwdXQgYmFjayB0aGUgbGFzdCBvbmUsIHNpbmNlIHdlIHJldHVybiBpdCEKKwlyZXR1cm4gcCsxOworfQorCisKK2Jvb2wgVGlYbWxCYXNlOjpTdHJpbmdFcXVhbCggY29uc3QgY2hhciogcCwKKwkJCQkJCQkgY29uc3QgY2hhciogdGFnLAorCQkJCQkJCSBib29sIGlnbm9yZUNhc2UgKQoreworCWFzc2VydCggcCApOworCWlmICggIXAgfHwgISpwICkKKwl7CisJCWFzc2VydCggMCApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisgICAgaWYgKCB0b2xvd2VyKCAqcCApID09IHRvbG93ZXIoICp0YWcgKSApCisJeworCQljb25zdCBjaGFyKiBxID0gcDsKKworCQlpZiAoaWdub3JlQ2FzZSkKKwkJeworCQkJd2hpbGUgKCAqcSAmJiAqdGFnICYmICpxID09ICp0YWcgKQorCQkJeworCQkJCSsrcTsKKwkJCQkrK3RhZzsKKwkJCX0KKworCQkJaWYgKCAqdGFnID09IDAgKQkJLy8gSGF2ZSB3ZSBmb3VuZCB0aGUgZW5kIG9mIHRoZSB0YWcsIGFuZCBldmVyeXRoaW5nIGVxdWFsPworCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJd2hpbGUgKCAqcSAmJiAqdGFnICYmIHRvbG93ZXIoICpxICkgPT0gdG9sb3dlciggKnRhZyApICkKKwkJCXsKKwkJCQkrK3E7CisJCQkJKyt0YWc7CisJCQl9CisKKwkJCWlmICggKnRhZyA9PSAwICkKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKworY29uc3QgY2hhciogVGlYbWxCYXNlOjpSZWFkVGV4dCgJY29uc3QgY2hhciogcCwgCisJCQkJCQkJCQlzdHJpbmcqIHRleHQsIAorCQkJCQkJCQkJYm9vbCB0cmltV2hpdGVTcGFjZSwgCisJCQkJCQkJCQljb25zdCBjaGFyKiBlbmRUYWcsIAorCQkJCQkJCQkJYm9vbCBjYXNlSW5zZW5zaXRpdmUgKQoreworCSp0ZXh0ID0gIiI7CisKKwlpZiAoICAgICF0cmltV2hpdGVTcGFjZQkJCS8vIGNlcnRhaW4gdGFncyBhbHdheXMga2VlcCB3aGl0ZXNwYWNlCisJCSB8fCAhY29uZGVuc2VXaGl0ZVNwYWNlICkJLy8gaWYgdHJ1ZSwgd2hpdGVzcGFjZSBpcyBhbHdheXMga2VwdAorCXsKKwkJLy8gS2VlcCBhbGwgdGhlIHdoaXRlIHNwYWNlLgorCQl3aGlsZSAoCSAgIHAgJiYgKnAKKwkJCQkmJiAhU3RyaW5nRXF1YWwoIHAsIGVuZFRhZywgY2FzZUluc2Vuc2l0aXZlICkKKwkJCSAgKQorCQl7CisJCQljaGFyIGM7CisJCQlwID0gR2V0Q2hhciggcCwgJmMgKTsKKwkJCXRleHQtPmFwcGVuZCggJmMsIDEgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlib29sIHdoaXRlc3BhY2UgPSBmYWxzZTsKKworCQkvLyBSZW1vdmUgbGVhZGluZyB3aGl0ZSBzcGFjZToKKwkJcCA9IFNraXBXaGl0ZVNwYWNlKCBwICk7CisJCXdoaWxlICgJICAgcCAmJiAqcAorCQkJCSYmICFTdHJpbmdFcXVhbCggcCwgZW5kVGFnLCBjYXNlSW5zZW5zaXRpdmUgKSApCisJCXsKKwkJCWlmICggKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nICkKKwkJCXsKKwkJCQl3aGl0ZXNwYWNlID0gdHJ1ZTsKKwkJCQkrK3A7CisJCQl9CisJCQllbHNlIGlmICggaXNzcGFjZSggKnAgKSApCisJCQl7CisJCQkJd2hpdGVzcGFjZSA9IHRydWU7CisJCQkJKytwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIElmIHdlJ3ZlIGZvdW5kIHdoaXRlc3BhY2UsIGFkZCBpdCBiZWZvcmUgdGhlCisJCQkJLy8gbmV3IGNoYXJhY3Rlci4gQW55IHdoaXRlc3BhY2UganVzdCBiZWNvbWVzIGEgc3BhY2UuCisJCQkJaWYgKCB3aGl0ZXNwYWNlICkKKwkJCQl7CisJCQkJCXRleHQtPmFwcGVuZCggIiAiLCAxICk7CisJCQkJCXdoaXRlc3BhY2UgPSBmYWxzZTsKKwkJCQl9CisJCQkJY2hhciBjOworCQkJCXAgPSBHZXRDaGFyKCBwLCAmYyApOworCQkJCXRleHQtPmFwcGVuZCggJmMsIDEgKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcCArIHN0cmxlbiggZW5kVGFnICk7Cit9CisKKwordm9pZCBUaVhtbERvY3VtZW50OjpTdHJlYW1Jbiggc3RkOjppc3RyZWFtKiBpbiwgc3RkOjpzdHJpbmcqIHRhZyApCit7CisJLy8gVGhlIGJhc2ljIGlzc3VlIHdpdGggYSBkb2N1bWVudCBpcyB0aGF0IHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZQorCS8vIHN0cmVhbWluZy4gUmVhZCBzb21ldGhpbmcgcHJlc3VtZWQgdG8gYmUgYSB0YWcgKGFuZCBob3BlKSwgdGhlbgorCS8vIGlkZW50aWZ5IGl0LCBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUgc3RyZWFtIG1ldGhvZCBvbiB0aGUgdGFnLgorCS8vCisJLy8gVGhpcyAicHJlLXN0cmVhbWluZyIgd2lsbCBuZXZlciByZWFkIHRoZSBjbG9zaW5nICI+IiBzbyB0aGUKKwkvLyBzdWItdGFnIGNhbiBvcmllbnQgaXRzZWxmLgorCisJaWYgKCAhU3RyZWFtVG8oIGluLCAnPCcsIHRhZyApICkgCisJeworCQlTZXRFcnJvciggVElYTUxfRVJST1JfUEFSU0lOR19FTVBUWSApOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKCBpbi0+Z29vZCgpICkKKwl7CisJCWludCB0YWdJbmRleCA9IHRhZy0+bGVuZ3RoKCk7CisJCXdoaWxlICggaW4tPmdvb2QoKSAmJiBpbi0+cGVlaygpICE9ICc+JyApCisJCXsKKwkJCWludCBjID0gaW4tPmdldCgpOworCQkJKCp0YWcpICs9IChjaGFyKSBjOworCQl9CisKKwkJaWYgKCBpbi0+Z29vZCgpICkKKwkJeworCQkJLy8gV2Ugbm93IGhhdmUgc29tZXRoaW5nIHdlIHByZXN1bWUgdG8gYmUgYSBub2RlIG9mIAorCQkJLy8gc29tZSBzb3J0LiBJZGVudGlmeSBpdCwgYW5kIGNhbGwgdGhlIG5vZGUgdG8KKwkJCS8vIGNvbnRpbnVlIHN0cmVhbWluZy4KKwkJCVRpWG1sTm9kZSogbm9kZSA9IElkZW50aWZ5KCB0YWctPmNfc3RyKCkgKyB0YWdJbmRleCApOworCisJCQlpZiAoIG5vZGUgKQorCQkJeworCQkJCW5vZGUtPlN0cmVhbUluKCBpbiwgdGFnICk7CisJCQkJYm9vbCBpc0VsZW1lbnQgPSBub2RlLT5Ub0VsZW1lbnQoKSAhPSAwOworCQkJCWRlbGV0ZSBub2RlOworCQkJCW5vZGUgPSAwOworCisJCQkJLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50LCB3ZSdyZSBkb25lLiBQYXJzaW5nIHdpbGwgYmUKKwkJCQkvLyBkb25lIGJ5IHRoZSA+PiBvcGVyYXRvci4KKwkJCQlpZiAoIGlzRWxlbWVudCApCisJCQkJeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVNldEVycm9yKCBUSVhNTF9FUlJPUiApOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKwkvLyBXZSBzaG91bGQgaGF2ZSByZXR1cm5lZCBzb29uZXIuIAorCVNldEVycm9yKCBUSVhNTF9FUlJPUiApOworfQorCisKK2NvbnN0IGNoYXIqIFRpWG1sRG9jdW1lbnQ6OlBhcnNlKCBjb25zdCBjaGFyKiBwICkKK3sKKwkvLyBQYXJzZSBhd2F5LCBhdCB0aGUgZG9jdW1lbnQgbGV2ZWwuIFNpbmNlIGEgZG9jdW1lbnQKKwkvLyBjb250YWlucyBub3RoaW5nIGJ1dCBvdGhlciB0YWdzLCBtb3N0IG9mIHdoYXQgaGFwcGVucworCS8vIGhlcmUgaXMgc2tpcHBpbmcgd2hpdGUgc3BhY2UuCisJLy8KKwkvLyBJbiB0aGlzIHZhcmlhbnQgKGFzIG9wcG9zZWQgdG8gc3RyZWFtIGFuZCBQYXJzZSkgd2UKKwkvLyByZWFkIGV2ZXJ5dGhpbmcgd2UgY2FuLgorCisKKwlpZiAoICFwIHx8ICEqcCAgfHwgISggcCA9IFNraXBXaGl0ZVNwYWNlKCBwICkgKSApCisJeworCQlTZXRFcnJvciggVElYTUxfRVJST1JfRE9DVU1FTlRfRU1QVFkgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwl3aGlsZSAoIHAgJiYgKnAgKQorCXsKKwkJVGlYbWxOb2RlKiBub2RlID0gSWRlbnRpZnkoIHAgKTsKKwkJaWYgKCBub2RlICkKKwkJewkJCQkKKwkJCXAgPSBub2RlLT5QYXJzZSggcCApOworCQkJTGlua0VuZENoaWxkKCBub2RlICk7CisJCX0JCQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CQkKKwkJcCA9IFNraXBXaGl0ZVNwYWNlKCBwICk7CisJfQorCS8vIEFsbCBpcyB3ZWxsLgorCXJldHVybiBwOworfQorCisKK1RpWG1sTm9kZSogVGlYbWxOb2RlOjpJZGVudGlmeSggY29uc3QgY2hhciogcCApCit7CisJVGlYbWxOb2RlKiByZXR1cm5Ob2RlID0gMDsKKworCXAgPSBTa2lwV2hpdGVTcGFjZSggcCApOworCWlmKCAhcCB8fCAhKnAgfHwgKnAgIT0gJzwnICkKKwl7CisJCXJldHVybiAwOworCX0KKworCVRpWG1sRG9jdW1lbnQqIGRvYyA9IEdldERvY3VtZW50KCk7CisJcCA9IFNraXBXaGl0ZVNwYWNlKCBwICk7CisKKwlpZiAoICFwIHx8ICEqcCApCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwkvLyBXaGF0IGlzIHRoaXMgdGhpbmc/IAorCS8vIC0gRWxlbWVudHMgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlLCBidXQgeG1sIGlzIHJlc2VydmVkLgorCS8vIC0gQ29tbWVudHM6IDwhLS0KKwkvLyAtIERlY2xlcmF0aW9uOiA8P3htbAorCS8vIC0gRXZlcnRoaW5nIGVsc2UgaXMgdW5rbm93biB0byB0aW55eG1sLgorCS8vCisKKwljb25zdCBjaGFyKiB4bWxIZWFkZXIgPSB7ICI8P3htbCIgfTsKKwljb25zdCBjaGFyKiBjb21tZW50SGVhZGVyID0geyAiPCEtLSIgfTsKKworCWlmICggU3RyaW5nRXF1YWwoIHAsIHhtbEhlYWRlciwgdHJ1ZSApICkKKwl7CisJCSNpZmRlZiBERUJVR19QQVJTRVIKKwkJCVRJWE1MX0xPRyggIlhNTCBwYXJzaW5nIERlY2xhcmF0aW9uXG4iICk7CisJCSNlbmRpZgorCQlyZXR1cm5Ob2RlID0gbmV3IFRpWG1sRGVjbGFyYXRpb24oKTsKKwl9CisJZWxzZSBpZiAoICAgIGlzYWxwaGEoICoocCsxKSApCisJCQkgIHx8ICoocCsxKSA9PSAnXycgKQorCXsKKwkJI2lmZGVmIERFQlVHX1BBUlNFUgorCQkJVElYTUxfTE9HKCAiWE1MIHBhcnNpbmcgRWxlbWVudFxuIiApOworCQkjZW5kaWYKKwkJcmV0dXJuTm9kZSA9IG5ldyBUaVhtbEVsZW1lbnQoICIiICk7CisJfQorCWVsc2UgaWYgKCBTdHJpbmdFcXVhbCggcCwgY29tbWVudEhlYWRlciwgZmFsc2UgKSApCisJeworCQkjaWZkZWYgREVCVUdfUEFSU0VSCisJCQlUSVhNTF9MT0coICJYTUwgcGFyc2luZyBDb21tZW50XG4iICk7CisJCSNlbmRpZgorCQlyZXR1cm5Ob2RlID0gbmV3IFRpWG1sQ29tbWVudCgpOworCX0KKwllbHNlCisJeworCQkjaWZkZWYgREVCVUdfUEFSU0VSCisJCQlUSVhNTF9MT0coICJYTUwgcGFyc2luZyBVbmtub3duXG4iICk7CisJCSNlbmRpZgorCQlyZXR1cm5Ob2RlID0gbmV3IFRpWG1sVW5rbm93bigpOworCX0KKworCWlmICggcmV0dXJuTm9kZSApCisJeworCQkvLyBTZXQgdGhlIHBhcmVudCwgc28gaXQgY2FuIHJlcG9ydCBlcnJvcnMKKwkJcmV0dXJuTm9kZS0+cGFyZW50ID0gdGhpczsKKwkJLy9wID0gcmV0dXJuTm9kZS0+UGFyc2UoIHAgKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKCBkb2MgKQorCQkJZG9jLT5TZXRFcnJvciggVElYTUxfRVJST1JfT1VUX09GX01FTU9SWSApOworCX0KKwlyZXR1cm4gcmV0dXJuTm9kZTsKK30KKworCit2b2lkIFRpWG1sRWxlbWVudDo6U3RyZWFtSW4oIHN0ZDo6aXN0cmVhbSogaW4sIHN0ZDo6c3RyaW5nKiB0YWcgKQoreworCS8vIFdlJ3JlIGNhbGxlZCB3aXRoIHNvbWUgYW1vdW50IG9mIHByZS1wYXJzaW5nLiBUaGF0IGlzLCBzb21lIG9mICJ0aGlzIgorCS8vIGVsZW1lbnQgaXMgaW4gInRhZyIuIEdvIGFoZWFkIGFuZCBzdHJlYW0gdG8gdGhlIGNsb3NpbmcgIj4iCisJd2hpbGUoIGluLT5nb29kKCkgKQorCXsKKwkJaW50IGMgPSBpbi0+Z2V0KCk7CisJCSgqdGFnKSArPSAoY2hhcikgYyA7CisJCQorCQlpZiAoIGMgPT0gJz4nICkKKwkJCWJyZWFrOworCX0KKworCWlmICggdGFnLT5sZW5ndGgoKSA8IDMgKSByZXR1cm47CisKKwkvLyBPa2F5Li4uaWYgd2UgYXJlIGEgIi8+IiB0YWcsIHRoZW4gd2UncmUgZG9uZS4gV2UndmUgcmVhZCBhIGNvbXBsZXRlIHRhZy4KKwkvLyBJZiBub3QsIGlkZW50aWZ5IGFuZCBzdHJlYW0uCisKKwlpZiAoICAgIHRhZy0+YXQoIHRhZy0+bGVuZ3RoKCkgLSAxICkgPT0gJz4nIAorCQkgJiYgdGFnLT5hdCggdGFnLT5sZW5ndGgoKSAtIDIgKSA9PSAnLycgKQorCXsKKwkJLy8gQWxsIGdvb2QhCisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAoIHRhZy0+YXQoIHRhZy0+bGVuZ3RoKCkgLSAxICkgPT0gJz4nICkKKwl7CisJCS8vIFRoZXJlIGlzIG1vcmUuIENvdWxkIGJlOgorCQkvLwkJdGV4dAorCQkvLwkJY2xvc2luZyB0YWcKKwkJLy8JCWFub3RoZXIgbm9kZS4KKwkJZm9yICggOzsgKQorCQl7CisJCQlTdHJlYW1XaGl0ZVNwYWNlKCBpbiwgdGFnICk7CisKKwkJCS8vIERvIHdlIGhhdmUgdGV4dD8KKwkJCWlmICggaW4tPnBlZWsoKSAhPSAnPCcgKQorCQkJeworCQkJCS8vIFllcCwgdGV4dC4KKwkJCQlUaVhtbFRleHQgdGV4dCggIiIgKTsKKwkJCQl0ZXh0LlN0cmVhbUluKCBpbiwgdGFnICk7CisKKwkJCQkvLyBXaGF0IGZvbGxvd3MgdGV4dCBpcyBhIGNsb3NpbmcgdGFnIG9yIGFub3RoZXIgbm9kZS4KKwkJCQkvLyBHbyBhcm91bmQgYWdhaW4gYW5kIGZpZ3VyZSBpdCBvdXQuCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIFdlIG5vdyBoYXZlIGVpdGhlciBhIGNsb3NpbmcgdGFnLi4ub3IgYW5vdGhlciBub2RlLgorCQkJLy8gV2Ugc2hvdWxkIGJlIGF0IGEgIjwiLCByZWdhcmRsZXNzLgorCQkJaWYgKCAhaW4tPmdvb2QoKSApIHJldHVybjsKKwkJCWFzc2VydCggaW4tPnBlZWsoKSA9PSAnPCcgKTsKKwkJCWludCB0YWdJbmRleCA9IHRhZy0+bGVuZ3RoKCk7CisKKwkJCWJvb2wgY2xvc2luZ1RhZyA9IGZhbHNlOworCQkJYm9vbCBmaXJzdENoYXJGb3VuZCA9IGZhbHNlOworCisJCQlmb3IoIDs7ICkKKwkJCXsKKwkJCQlpZiAoICFpbi0+Z29vZCgpICkKKwkJCQkJcmV0dXJuOworCisJCQkJaW50IGMgPSBpbi0+cGVlaygpOworCQkJCQorCQkJCWlmICggYyA9PSAnPicgKQorCQkJCQlicmVhazsKKworCQkJCSp0YWcgKz0gYzsKKwkJCQlpbi0+Z2V0KCk7CisKKwkJCQlpZiAoICFmaXJzdENoYXJGb3VuZCAmJiBjICE9ICc8JyAmJiAhSXNXaGl0ZVNwYWNlKCBjICkgKQorCQkJCXsKKwkJCQkJZmlyc3RDaGFyRm91bmQgPSB0cnVlOworCQkJCQlpZiAoIGMgPT0gJy8nICkKKwkJCQkJCWNsb3NpbmdUYWcgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCS8vIElmIGl0IHdhcyBhIGNsb3NpbmcgdGFnLCB0aGVuIHJlYWQgaW4gdGhlIGNsb3NpbmcgJz4nIHRvIGNsZWFuIHVwIHRoZSBpbnB1dCBzdHJlYW0uCisJCQkvLyBJZiBpdCB3YXMgbm90LCB0aGUgc3RyZWFtaW5nIHdpbGwgYmUgZG9uZSBieSB0aGUgdGFnLgorCQkJaWYgKCBjbG9zaW5nVGFnICkKKwkJCXsKKwkJCQlpbnQgYyA9IGluLT5nZXQoKTsKKwkJCQlhc3NlcnQoIGMgPT0gJz4nICk7CisJCQkJKnRhZyArPSBjOworCisJCQkJLy8gV2UgYXJlIGRvbmUsIG9uY2Ugd2UndmUgZm91bmQgb3VyIGNsb3NpbmcgdGFnLgorCQkJCXJldHVybjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBJZiBub3QgYSBjbG9zaW5nIHRhZywgaWQgaXQsIGFuZCBzdHJlYW0uCisJCQkJY29uc3QgY2hhciogdGFnbG9jID0gdGFnLT5jX3N0cigpICsgdGFnSW5kZXg7CisJCQkJVGlYbWxOb2RlKiBub2RlID0gSWRlbnRpZnkoIHRhZ2xvYyApOworCQkJCWlmICggIW5vZGUgKQorCQkJCQlyZXR1cm47CisJCQkJbm9kZS0+U3RyZWFtSW4oIGluLCB0YWcgKTsKKwkJCQlkZWxldGUgbm9kZTsKKwkJCQlub2RlID0gMDsKKworCQkJCS8vIE5vIHJldHVybjogZ28gYXJvdW5kIGZyb20gdGhlIGJlZ2lubmluZzogdGV4dCwgY2xvc2luZyB0YWcsIG9yIG5vZGUuCisJCQl9CisJCX0KKwl9Cit9CisKKworY29uc3QgY2hhciogVGlYbWxFbGVtZW50OjpQYXJzZSggY29uc3QgY2hhciogcCApCit7CisJcCA9IFNraXBXaGl0ZVNwYWNlKCBwICk7CisJVGlYbWxEb2N1bWVudCogZG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOworCisJaWYgKCAhcCB8fCAhKnAgfHwgKnAgIT0gJzwnICkKKwl7CisJCWlmICggZG9jdW1lbnQgKSBkb2N1bWVudC0+U2V0RXJyb3IoIFRJWE1MX0VSUk9SX1BBUlNJTkdfRUxFTUVOVCApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcCA9IFNraXBXaGl0ZVNwYWNlKCBwKzEgKTsKKworCS8vIFJlYWQgdGhlIG5hbWUuCisJcCA9IFJlYWROYW1lKCBwLCAmdmFsdWUgKTsKKwlpZiAoICFwIHx8ICEqcCApCisJeworCQlpZiAoIGRvY3VtZW50ICkJZG9jdW1lbnQtPlNldEVycm9yKCBUSVhNTF9FUlJPUl9GQUlMRURfVE9fUkVBRF9FTEVNRU5UX05BTUUgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN0cmluZyBlbmRUYWcgPSAiPC8iOworCWVuZFRhZyArPSB2YWx1ZTsKKwllbmRUYWcgKz0gIj4iOworCisJLy8gQ2hlY2sgZm9yIGFuZCByZWFkIGF0dHJpYnV0ZXMuIEFsc28gbG9vayBmb3IgYW4gZW1wdHkKKwkvLyB0YWcgb3IgYW4gZW5kIHRhZy4KKwl3aGlsZSAoIHAgJiYgKnAgKQorCXsKKwkJcCA9IFNraXBXaGl0ZVNwYWNlKCBwICk7CisJCWlmICggIXAgfHwgISpwICkKKwkJeworCQkJaWYgKCBkb2N1bWVudCApIGRvY3VtZW50LT5TZXRFcnJvciggVElYTUxfRVJST1JfUkVBRElOR19BVFRSSUJVVEVTICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoICpwID09ICcvJyApCisJCXsKKwkJCSsrcDsKKwkJCS8vIEVtcHR5IHRhZy4KKwkJCWlmICggKnAgICE9ICc+JyApCisJCQl7CisJCQkJaWYgKCBkb2N1bWVudCApIGRvY3VtZW50LT5TZXRFcnJvciggVElYTUxfRVJST1JfUEFSU0lOR19FTVBUWSApOwkJCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gKHArMSk7CisJCX0KKwkJZWxzZSBpZiAoICpwID09ICc+JyApCisJCXsKKwkJCS8vIERvbmUgd2l0aCBhdHRyaWJ1dGVzIChpZiB0aGVyZSB3ZXJlIGFueS4pCisJCQkvLyBSZWFkIHRoZSB2YWx1ZSAtLSB3aGljaCBjYW4gaW5jbHVkZSBvdGhlcgorCQkJLy8gZWxlbWVudHMgLS0gcmVhZCB0aGUgZW5kIHRhZywgYW5kIHJldHVybi4KKwkJCSsrcDsKKwkJCXAgPSBSZWFkVmFsdWUoIHAgKTsJCS8vIE5vdGUgdGhpcyBpcyBhbiBFbGVtZW50IG1ldGhvZCwgYW5kIHdpbGwgc2V0IHRoZSBlcnJvciBpZiBvbmUgaGFwcGVucy4KKwkJCWlmICggIXAgfHwgISpwICkKKwkJCQlyZXR1cm4gMDsKKworCQkJLy8gV2Ugc2hvdWxkIGZpbmQgdGhlIGVuZCB0YWcgbm93CisJCQlpZiAoIFN0cmluZ0VxdWFsKCBwLCBlbmRUYWcuY19zdHIoKSwgZmFsc2UgKSApCisJCQl7CisJCQkJcCArPSBlbmRUYWcubGVuZ3RoKCk7CisJCQkJcmV0dXJuIHA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCBkb2N1bWVudCApIGRvY3VtZW50LT5TZXRFcnJvciggVElYTUxfRVJST1JfUkVBRElOR19FTkRfVEFHICk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUcnkgdG8gcmVhZCBhbiBlbGVtZW50OgorCQkJVGlYbWxBdHRyaWJ1dGUgYXR0cmliOworCQkJYXR0cmliLlNldERvY3VtZW50KCBkb2N1bWVudCApOworCQkJcCA9IGF0dHJpYi5QYXJzZSggcCApOworCisJCQlpZiAoICFwIHx8ICEqcCApCisJCQl7CisJCQkJaWYgKCBkb2N1bWVudCApIGRvY3VtZW50LT5TZXRFcnJvciggVElYTUxfRVJST1JfUEFSU0lOR19FTEVNRU5UICk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlTZXRBdHRyaWJ1dGUoIGF0dHJpYi5OYW1lKCksIGF0dHJpYi5WYWx1ZSgpICk7CisJCX0KKwl9CisJcmV0dXJuIHA7Cit9CisKKworY29uc3QgY2hhciogVGlYbWxFbGVtZW50OjpSZWFkVmFsdWUoIGNvbnN0IGNoYXIqIHAgKQoreworCVRpWG1sRG9jdW1lbnQqIGRvY3VtZW50ID0gR2V0RG9jdW1lbnQoKTsKKworCS8vIFJlYWQgaW4gdGV4dCBhbmQgZWxlbWVudHMgaW4gYW55IG9yZGVyLgorCXAgPSBTa2lwV2hpdGVTcGFjZSggcCApOworCXdoaWxlICggcCAmJiAqcCApCisJeworLy8JCXN0cmluZyB0ZXh0OworLy8JCXdoaWxlICggcCAmJiAqcCAmJiAqcCAhPSAnPCcgKQorLy8JCXsKKy8vCQkJdGV4dCArPSAoKnApOworLy8JCQkrK3A7CisvLwkJfQorLy8KKy8vCQlwID0gU2tpcFdoaXRlU3BhY2UoIHAgKTsKKworCQlpZiAoICpwICE9ICc8JyApCisJCXsKKwkJCS8vIFRha2Ugd2hhdCB3ZSBoYXZlLCBtYWtlIGEgdGV4dCBlbGVtZW50LgorCQkJVGlYbWxUZXh0KiB0ZXh0Tm9kZSA9IG5ldyBUaVhtbFRleHQoICIiICk7CisKKwkJCWlmICggIXRleHROb2RlICkKKwkJCXsKKwkJCQlpZiAoIGRvY3VtZW50ICkgZG9jdW1lbnQtPlNldEVycm9yKCBUSVhNTF9FUlJPUl9PVVRfT0ZfTUVNT1JZICk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXAgPSB0ZXh0Tm9kZS0+UGFyc2UoIHAgKTsKKworCQkJaWYgKCAhdGV4dE5vZGUtPkJsYW5rKCkgKQorCQkJCUxpbmtFbmRDaGlsZCggdGV4dE5vZGUgKTsKKwkJCWVsc2UKKwkJCQlkZWxldGUgdGV4dE5vZGU7CisJCX0gCisJCWVsc2UgCisJCXsKKwkJCS8vIFdlIGhpdCBhICc8JworCQkJLy8gSGF2ZSB3ZSBoaXQgYSBuZXcgZWxlbWVudCBvciBhbiBlbmQgdGFnPworCQkJaWYgKCBTdHJpbmdFcXVhbCggcCwgIjwvIiwgZmFsc2UgKSApCisJCQl7CisJCQkJcmV0dXJuIHA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVGlYbWxOb2RlKiBub2RlID0gSWRlbnRpZnkoIHAgKTsKKwkJCQlpZiAoIG5vZGUgKQorCQkJCXsKKwkJCQkJcCA9IG5vZGUtPlBhcnNlKCBwICk7CisJCQkJCUxpbmtFbmRDaGlsZCggbm9kZSApOworCQkJCX0JCQkJCisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJCXAgPSBTa2lwV2hpdGVTcGFjZSggcCApOworCX0KKworCWlmICggIXAgKQorCXsKKwkJaWYgKCBkb2N1bWVudCApIGRvY3VtZW50LT5TZXRFcnJvciggVElYTUxfRVJST1JfUkVBRElOR19FTEVNRU5UX1ZBTFVFICk7CisJfQkKKwlyZXR1cm4gcDsKK30KKworCit2b2lkIFRpWG1sVW5rbm93bjo6U3RyZWFtSW4oIHN0ZDo6aXN0cmVhbSogaW4sIHN0ZDo6c3RyaW5nKiB0YWcgKQoreworCXdoaWxlICggaW4tPmdvb2QoKSApCisJeworCQlpbnQgYyA9IGluLT5nZXQoKTsJCisJCSgqdGFnKSArPSBjOworCisJCWlmICggYyA9PSAnPicgKQorCQl7CisJCQkvLyBBbGwgaXMgd2VsbC4KKwkJCXJldHVybjsJCQorCQl9CisJfQorfQorCisKK2NvbnN0IGNoYXIqIFRpWG1sVW5rbm93bjo6UGFyc2UoIGNvbnN0IGNoYXIqIHAgKQoreworCVRpWG1sRG9jdW1lbnQqIGRvY3VtZW50ID0gR2V0RG9jdW1lbnQoKTsKKwlwID0gU2tpcFdoaXRlU3BhY2UoIHAgKTsKKwlpZiAoICFwIHx8ICEqcCB8fCAqcCAhPSAnPCcgKQorCXsKKwkJaWYgKCBkb2N1bWVudCApIGRvY3VtZW50LT5TZXRFcnJvciggVElYTUxfRVJST1JfUEFSU0lOR19VTktOT1dOICk7CisJCXJldHVybiAwOworCX0KKwkrK3A7CisJdmFsdWUgPSAiIjsKKworCXdoaWxlICggcCAmJiAqcCAmJiAqcCAhPSAnPicgKQorCXsKKwkJdmFsdWUgKz0gKnA7CisJCSsrcDsKKwl9CisKKwlpZiAoICFwICkKKwl7CisJCWlmICggZG9jdW1lbnQgKQlkb2N1bWVudC0+U2V0RXJyb3IoIFRJWE1MX0VSUk9SX1BBUlNJTkdfVU5LTk9XTiApOworCX0KKwlpZiAoICpwID09ICc+JyApCisJCXJldHVybiBwKzE7CisJcmV0dXJuIHA7Cit9CisKKwordm9pZCBUaVhtbENvbW1lbnQ6OlN0cmVhbUluKCBzdGQ6OmlzdHJlYW0qIGluLCBzdGQ6OnN0cmluZyogdGFnICkKK3sKKwl3aGlsZSAoIGluLT5nb29kKCkgKQorCXsKKwkJaW50IGMgPSBpbi0+Z2V0KCk7CQorCQkoKnRhZykgKz0gYzsKKworCQlpZiAoIGMgPT0gJz4nIAorCQkJICYmIHRhZy0+YXQoIHRhZy0+bGVuZ3RoKCkgLSAyICkgPT0gJy0nCisJCQkgJiYgdGFnLT5hdCggdGFnLT5sZW5ndGgoKSAtIDMgKSA9PSAnLScgKQorCQl7CisJCQkvLyBBbGwgaXMgd2VsbC4KKwkJCXJldHVybjsJCQorCQl9CisJfQorfQorCisKK2NvbnN0IGNoYXIqIFRpWG1sQ29tbWVudDo6UGFyc2UoIGNvbnN0IGNoYXIqIHAgKQoreworCVRpWG1sRG9jdW1lbnQqIGRvY3VtZW50ID0gR2V0RG9jdW1lbnQoKTsKKwl2YWx1ZSA9ICIiOworCisJcCA9IFNraXBXaGl0ZVNwYWNlKCBwICk7CisJY29uc3QgY2hhciogc3RhcnRUYWcgPSAiPCEtLSI7CisJY29uc3QgY2hhciogZW5kVGFnICAgPSAiLS0+IjsKKworCWlmICggIVN0cmluZ0VxdWFsKCBwLCBzdGFydFRhZywgZmFsc2UgKSApCisJeworCQlkb2N1bWVudC0+U2V0RXJyb3IoIFRJWE1MX0VSUk9SX1BBUlNJTkdfQ09NTUVOVCApOworCQlyZXR1cm4gMDsKKwl9CisJcCArPSBzdHJsZW4oIHN0YXJ0VGFnICk7CisJcCA9IFJlYWRUZXh0KCBwLCAmdmFsdWUsIGZhbHNlLCBlbmRUYWcsIGZhbHNlICk7CisJcmV0dXJuIHA7Cit9CisKKworY29uc3QgY2hhciogVGlYbWxBdHRyaWJ1dGU6OlBhcnNlKCBjb25zdCBjaGFyKiBwICkKK3sKKwlwID0gU2tpcFdoaXRlU3BhY2UoIHAgKTsKKwlpZiAoICFwIHx8ICEqcCApIHJldHVybiAwOworCisJLy8gUmVhZCB0aGUgbmFtZSwgdGhlICc9JyBhbmQgdGhlIHZhbHVlLgorCXAgPSBSZWFkTmFtZSggcCwgJm5hbWUgKTsKKwlpZiAoICFwIHx8ICEqcCApCisJeworCQlpZiAoIGRvY3VtZW50ICkgZG9jdW1lbnQtPlNldEVycm9yKCBUSVhNTF9FUlJPUl9SRUFESU5HX0FUVFJJQlVURVMgKTsKKwkJcmV0dXJuIDA7CisJfQorCXAgPSBTa2lwV2hpdGVTcGFjZSggcCApOworCWlmICggIXAgfHwgISpwIHx8ICpwICE9ICc9JyApCisJeworCQlpZiAoIGRvY3VtZW50ICkgZG9jdW1lbnQtPlNldEVycm9yKCBUSVhNTF9FUlJPUl9SRUFESU5HX0FUVFJJQlVURVMgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKytwOwkvLyBza2lwICc9JworCXAgPSBTa2lwV2hpdGVTcGFjZSggcCApOworCWlmICggIXAgfHwgISpwICkKKwl7CisJCWlmICggZG9jdW1lbnQgKSBkb2N1bWVudC0+U2V0RXJyb3IoIFRJWE1MX0VSUk9SX1JFQURJTkdfQVRUUklCVVRFUyApOworCQlyZXR1cm4gMDsKKwl9CisJCisJY29uc3QgY2hhciogZW5kOworCisJaWYgKCAqcCA9PSAnXCcnICkKKwl7CisJCSsrcDsKKwkJZW5kID0gIlwnIjsKKwkJcCA9IFJlYWRUZXh0KCBwLCAmdmFsdWUsIGZhbHNlLCBlbmQsIGZhbHNlICk7CisJfQorCWVsc2UgaWYgKCAqcCA9PSAnIicgKQorCXsKKwkJKytwOworCQllbmQgPSAiXCIiOworCQlwID0gUmVhZFRleHQoIHAsICZ2YWx1ZSwgZmFsc2UsIGVuZCwgZmFsc2UgKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gQWxsIGF0dHJpYnV0ZSB2YWx1ZXMgc2hvdWxkIGJlIGluIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzLgorCQkvLyBCdXQgdGhpcyBpcyBzdWNoIGEgY29tbW9uIGVycm9yIHRoYXQgdGhlIHBhcnNlciB3aWxsIHRyeQorCQkvLyBpdHMgYmVzdCwgZXZlbiB3aXRob3V0IHRoZW0uCisJCXZhbHVlID0gIiI7CisJCXdoaWxlICggICAgcCAmJiAqcAkJCQkJCQkJCQkvLyBleGlzdGVuY2UKKwkJCQkmJiAhaXNzcGFjZSggKnAgKSAmJiAqcCAhPSAnXG4nICYmICpwICE9ICdccicJLy8gd2hpdGVzcGFjZQorCQkJCSYmICpwICE9ICcvJyAmJiAqcCAhPSAnPicgKQkJCQkJCS8vIHRhZyBlbmQKKwkJeworCQkJdmFsdWUgKz0gKnA7CisJCQkrK3A7CisJCX0KKwl9CisJcmV0dXJuIHA7Cit9CisKKwordm9pZCBUaVhtbFRleHQ6OlN0cmVhbUluKCBzdGQ6OmlzdHJlYW0qIGluLCBzdGQ6OnN0cmluZyogdGFnICkKK3sKKwl3aGlsZSAoIGluLT5nb29kKCkgKQorCXsKKwkJaW50IGMgPSBpbi0+cGVlaygpOwkKKwkJaWYgKCBjID09ICc8JyApCisJCQlyZXR1cm47CisKKwkJKCp0YWcpICs9IGM7CisJCWluLT5nZXQoKTsKKwl9Cit9CisKKworCitjb25zdCBjaGFyKiBUaVhtbFRleHQ6OlBhcnNlKCBjb25zdCBjaGFyKiBwICkKK3sKKwl2YWx1ZSA9ICIiOworCisJLy9UaVhtbERvY3VtZW50KiBkb2MgPSBHZXREb2N1bWVudCgpOworCWJvb2wgaWdub3JlV2hpdGUgPSB0cnVlOworLy8JaWYgKCBkb2MgJiYgIWRvYy0+SWdub3JlV2hpdGVTcGFjZSgpICkgaWdub3JlV2hpdGUgPSBmYWxzZTsKKworCWNvbnN0IGNoYXIqIGVuZCA9ICI8IjsKKwlwID0gUmVhZFRleHQoIHAsICZ2YWx1ZSwgaWdub3JlV2hpdGUsIGVuZCwgZmFsc2UgKTsKKwlpZiAoIHAgKQorCQlyZXR1cm4gcC0xOwkvLyBkb24ndCB0cnVuY2F0ZSB0aGUgJzwnCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBUaVhtbERlY2xhcmF0aW9uOjpTdHJlYW1Jbiggc3RkOjppc3RyZWFtKiBpbiwgc3RkOjpzdHJpbmcqIHRhZyApCit7CisJd2hpbGUgKCBpbi0+Z29vZCgpICkKKwl7CisJCWludCBjID0gaW4tPmdldCgpOworCQkoKnRhZykgKz0gYzsKKworCQlpZiAoIGMgPT0gJz4nICkKKwkJeworCQkJLy8gQWxsIGlzIHdlbGwuCisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK2NvbnN0IGNoYXIqIFRpWG1sRGVjbGFyYXRpb246OlBhcnNlKCBjb25zdCBjaGFyKiBwICkKK3sKKwlwID0gU2tpcFdoaXRlU3BhY2UoIHAgKTsKKwkvLyBGaW5kIHRoZSBiZWdpbm5pbmcsIGZpbmQgdGhlIGVuZCwgYW5kIGxvb2sgZm9yCisJLy8gdGhlIHN0dWZmIGluLWJldHdlZW4uCisJVGlYbWxEb2N1bWVudCogZG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOworCWlmICggIXAgfHwgISpwIHx8ICFTdHJpbmdFcXVhbCggcCwgIjw/eG1sIiwgdHJ1ZSApICkKKwl7CisJCWlmICggZG9jdW1lbnQgKSBkb2N1bWVudC0+U2V0RXJyb3IoIFRJWE1MX0VSUk9SX1BBUlNJTkdfREVDTEFSQVRJT04gKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcCArPSA1OworLy8JY29uc3QgY2hhciogc3RhcnQgPSBwKzU7CisvLwljb25zdCBjaGFyKiBlbmQgID0gc3Ryc3RyKCBzdGFydCwgIj8+IiApOworCisJdmVyc2lvbiA9ICIiOworCWVuY29kaW5nID0gIiI7CisJc3RhbmRhbG9uZSA9ICIiOworCisJd2hpbGUgKCBwICYmICpwICkKKwl7CisJCWlmICggKnAgPT0gJz4nICkKKwkJeworCQkJKytwOworCQkJcmV0dXJuIHA7CisJCX0KKworCQlwID0gU2tpcFdoaXRlU3BhY2UoIHAgKTsKKwkJaWYgKCBTdHJpbmdFcXVhbCggcCwgInZlcnNpb24iLCB0cnVlICkgKQorCQl7CisvLwkJCXAgKz0gNzsKKwkJCVRpWG1sQXR0cmlidXRlIGF0dHJpYjsKKwkJCXAgPSBhdHRyaWIuUGFyc2UoIHAgKTsJCQorCQkJdmVyc2lvbiA9IGF0dHJpYi5WYWx1ZSgpOworCQl9CisJCWVsc2UgaWYgKCBTdHJpbmdFcXVhbCggcCwgImVuY29kaW5nIiwgdHJ1ZSApICkKKwkJeworLy8JCQlwICs9IDg7CisJCQlUaVhtbEF0dHJpYnV0ZSBhdHRyaWI7CisJCQlwID0gYXR0cmliLlBhcnNlKCBwICk7CQkKKwkJCWVuY29kaW5nID0gYXR0cmliLlZhbHVlKCk7CisJCX0KKwkJZWxzZSBpZiAoIFN0cmluZ0VxdWFsKCBwLCAic3RhbmRhbG9uZSIsIHRydWUgKSApCisJCXsKKy8vCQkJcCArPSAxMDsKKwkJCVRpWG1sQXR0cmlidXRlIGF0dHJpYjsKKwkJCXAgPSBhdHRyaWIuUGFyc2UoIHAgKTsJCQorCQkJc3RhbmRhbG9uZSA9IGF0dHJpYi5WYWx1ZSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gUmVhZCBvdmVyIHdoYXRldmVyIGl0IGlzLgorCQkJd2hpbGUoIHAgJiYgKnAgJiYgKnAgIT0gJz4nICYmICFpc3NwYWNlKCAqcCApICkKKwkJCQkrK3A7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2Jvb2wgVGlYbWxUZXh0OjpCbGFuaygpIGNvbnN0Cit7CisJZm9yICggdW5zaWduZWQgaT0wOyBpPHZhbHVlLnNpemUoKTsgaSsrICkKKwkJaWYgKCAhaXNzcGFjZSggdmFsdWVbaV0gKSApCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKZGlmZiAtLWdpdCBhL0FDTS90aW55eG1sL3htbHRlc3QuY3BwIGIvQUNNL3Rpbnl4bWwveG1sdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyOWFjOAotLS0gL2Rldi9udWxsCisrKyBiL0FDTS90aW55eG1sL3htbHRlc3QuY3BwCkBAIC0wLDAgKzEsMzI2IEBACisjaW5jbHVkZSAidGlueXhtbC5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3Ryc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IGdQYXNzID0gMDsKK2ludCBnRmFpbCA9IDA7CisKKy8vIFV0aWxpdHkgZnVuY3Rpb25zOgordGVtcGxhdGU8IGNsYXNzIFQgPgorYm9vbCBYbWxUZXN0KCBjb25zdCBjaGFyKiB0ZXN0U3RyaW5nLCBUIGV4cGVjdGVkLCBUIGZvdW5kLCBib29sIG5vRWNobyA9IGZhbHNlICkKK3sKKwlpZiAoIGV4cGVjdGVkID09IGZvdW5kICkgCisJCWNvdXQgPDwgIltwYXNzXSI7CisJZWxzZQorCQljb3V0IDw8ICJbZmFpbF0iOworCisJaWYgKCBub0VjaG8gKQorCQljb3V0IDw8ICIgIiA8PCB0ZXN0U3RyaW5nOworCWVsc2UKKwkJY291dCA8PCAiICIgPDwgdGVzdFN0cmluZyA8PCAiIFsiIDw8IGV4cGVjdGVkIDw8ICJdWyIgPDwgIGZvdW5kIDw8ICJdIjsKKwljb3V0IDw8ICJcbiI7CisKKwlib29sIHBhc3MgPSAoIGV4cGVjdGVkID09IGZvdW5kICk7CisJaWYgKCBwYXNzICkKKwkJKytnUGFzczsKKwllbHNlCisJCSsrZ0ZhaWw7CisJcmV0dXJuIHBhc3M7Cit9CisKKworLy8KKy8vIFRoaXMgZmlsZSBkZW1vbnN0cmF0ZXMgc29tZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIFRpbnlYbWwuCisvLyBOb3RlIHRoYXQgdGhlIGV4YW1wbGUgaXMgdmVyeSBjb250cml2ZWQuIEl0IHByZXN1bWVzIHlvdSBrbm93CisvLyB3aGF0IGlzIGluIHRoZSBYTUwgZmlsZS4gQnV0IGl0IGRvZXMgdGVzdCB0aGUgYmFzaWMgb3BlcmF0aW9ucywKKy8vIGFuZCBzaG93IGhvdyB0byBhZGQgYW5kIHJlbW92ZSBub2Rlcy4KKy8vCisKK2ludCBtYWluKCkKK3sKKwkvLworCS8vIFdlIHN0YXJ0IHdpdGggdGhlICdkZW1vU3RhcnQnIHRvZG8gbGlzdC4gUHJvY2VzcyBpdC4gQW5kCisJLy8gc2hvdWxkIGhvcGVmdWxseSBlbmQgdXAgd2l0aCB0aGUgdG9kbyBsaXN0IGFzIGlsbHVzdHJhdGVkLgorCS8vCisJY29uc3QgY2hhciogZGVtb1N0YXJ0ID0gCisJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgIHN0YW5kYWxvbmU9J25vJyA+XG4iCisJCSI8IS0tIE91ciB0byBkbyBsaXN0IGRhdGEgLS0+IgorCQkiPFRvRG8+XG4iCisJCQkiPCEtLSBEbyBJIG5lZWQgYSBzZWN1cmUgUERBPyAtLT5cbiIKKwkJCSI8SXRlbSBwcmlvcml0eT1cIjFcIiBkaXN0YW5jZT0nY2xvc2UnPiBHbyB0byB0aGUgPGJvbGQ+VG95IHN0b3JlITwvYm9sZD48L0l0ZW0+IgorCQkJIjxJdGVtIHByaW9yaXR5PVwiMlwiIGRpc3RhbmNlPSdub25lJz4gRG8gYmlsbHMgICA8L0l0ZW0+IgorCQkJIjxJdGVtIHByaW9yaXR5PVwiMlwiIGRpc3RhbmNlPSdmYXIgJmFtcDsgYmFjayc+IExvb2sgZm9yIEV2aWwgRGlub3NhdXJzISA8L0l0ZW0+IgorCQkiPC9Ub0RvPiI7CisKKwkvKglXaGF0IHRoZSB0b2RvIGxpc3Qgc2hvdWxkIGxvb2sgbGlrZSBhZnRlciBwcm9jZXNzaW5nLgorCQlJbiBzdHJlYW0gKG5vIGZvcm1hdHRpbmcpIHJlcHJlc2VudGF0aW9uLiAqLworCWNvbnN0IGNoYXIqIGRlbW9FbmQgPSAKKwkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIiA/PiIKKwkJIjwhLS0gT3VyIHRvIGRvIGxpc3QgZGF0YSAtLT4iCisJCSI8VG9Ebz4iCisJCQkiPCEtLSBEbyBJIG5lZWQgYSBzZWN1cmUgUERBPyAtLT4iCisJCSAgICAiPEl0ZW0gcHJpb3JpdHk9XCIyXCIgZGlzdGFuY2U9XCJjbG9zZVwiPkdvIHRvIHRoZSIKKwkJICAgICAgICAiPGJvbGQ+VG95IHN0b3JlISIKKwkJICAgICAgICAiPC9ib2xkPiIKKwkJICAgICI8L0l0ZW0+IgorCQkgICAgIjxJdGVtIHByaW9yaXR5PVwiMVwiIGRpc3RhbmNlPVwiZmFyXCI+VGFsayB0bzoiCisJCSAgICAgICAgIjxNZWV0aW5nIHdoZXJlPVwiU2Nob29sXCI+IgorCQkgICAgICAgICAgICAiPEF0dGVuZGVlIG5hbWU9XCJNYXJwbGVcIiBwb3NpdGlvbj1cInRlYWNoZXJcIiAvPiIKKwkJICAgICAgICAgICAgIjxBdHRlbmRlZSBuYW1lPVwiVm8mI3g4MjtcIiBwb3NpdGlvbj1cImNvdW5zZWxvclwiIC8+IgorCQkgICAgICAgICI8L01lZXRpbmc+IgorCQkgICAgICAgICI8TWVldGluZyB3aGVyZT1cIkx1bmNoXCIgLz4iCisJCSAgICAiPC9JdGVtPiIKKwkJICAgICI8SXRlbSBwcmlvcml0eT1cIjJcIiBkaXN0YW5jZT1cImhlcmVcIj5EbyBiaWxscyIKKwkJICAgICI8L0l0ZW0+IgorCQkiPC9Ub0RvPiI7CisKKwkvLyBUaGUgZXhhbXBsZSBwYXJzZXMgZnJvbSB0aGUgY2hhcmFjdGVyIHN0cmluZyAoYWJvdmUpOgorCisJeworCQkvLyBXcml0ZSB0byBhIGZpbGUgYW5kIHJlYWQgaXQgYmFjaywgdG8gY2hlY2sgZmlsZSBJL08uCisKKwkJVGlYbWxEb2N1bWVudCBkb2MoICJkZW1vdGVzdC54bWwiICk7CisJCWRvYy5QYXJzZSggZGVtb1N0YXJ0ICk7CisKKwkJaWYgKCBkb2MuRXJyb3IoKSApCisJCXsKKwkJCXByaW50ZiggIkVycm9yIGluICVzOiAlc1xuIiwgZG9jLlZhbHVlKCkuY19zdHIoKSwgZG9jLkVycm9yRGVzYygpLmNfc3RyKCkgKTsKKwkJCWV4aXQoIDEgKTsKKwkJfQorCQlkb2MuU2F2ZUZpbGUoKTsKKwl9CisKKwlUaVhtbERvY3VtZW50IGRvYyggImRlbW90ZXN0LnhtbCIgKTsKKwlib29sIGxvYWRPa2F5ID0gZG9jLkxvYWRGaWxlKCk7CisKKwlpZiAoICFsb2FkT2theSApCisJeworCQlwcmludGYoICJDb3VsZCBub3QgbG9hZCB0ZXN0IGZpbGUgJ2RlbW90ZXN0LnhtbCcuIEVycm9yPSclcycuIEV4aXRpbmcuXG4iLCBkb2MuRXJyb3JEZXNjKCkuY19zdHIoKSApOworCQlleGl0KCAxICk7CisJfQorCisJcHJpbnRmKCAiKiogRGVtbyBkb2MgcmVhZCBmcm9tIGRpc2s6ICoqIFxuXG4iICk7CisJZG9jLlByaW50KCBzdGRvdXQgKTsKKworCVRpWG1sTm9kZSogbm9kZSA9IDA7CisJVGlYbWxFbGVtZW50KiB0b2RvRWxlbWVudCA9IDA7CisJVGlYbWxFbGVtZW50KiBpdGVtRWxlbWVudCA9IDA7CisKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gQW4gZXhhbXBsZSBvZiBjaGFuZ2luZyBleGlzdGluZyBhdHRyaWJ1dGVzLCBhbmQgcmVtb3ZpbmcKKwkvLyBhbiBlbGVtZW50IGZyb20gdGhlIGRvY3VtZW50LgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvLyBHZXQgdGhlICJUb0RvIiBlbGVtZW50LgorCS8vIEl0IGlzIGEgY2hpbGQgb2YgdGhlIGRvY3VtZW50LCBhbmQgY2FuIGJlIHNlbGVjdGVkIGJ5IG5hbWUuCisJbm9kZSA9IGRvYy5GaXJzdENoaWxkKCAiVG9EbyIgKTsKKwlhc3NlcnQoIG5vZGUgKTsKKwl0b2RvRWxlbWVudCA9IG5vZGUtPlRvRWxlbWVudCgpOworCWFzc2VydCggdG9kb0VsZW1lbnQgICk7CisKKwkvLyBHb2luZyB0byB0aGUgdG95IHN0b3JlIGlzIG5vdyBvdXIgc2Vjb25kIHByaW9yaXR5Li4uCisJLy8gU28gc2V0IHRoZSAicHJpb3JpdHkiIGF0dHJpYnV0ZSBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC4KKwlub2RlID0gdG9kb0VsZW1lbnQtPkZpcnN0Q2hpbGRFbGVtZW50KCk7CS8vIFRoaXMgc2tpcHMgdGhlICJQREEiIGNvbW1lbnQuCisJYXNzZXJ0KCBub2RlICk7CisJaXRlbUVsZW1lbnQgPSBub2RlLT5Ub0VsZW1lbnQoKTsKKwlhc3NlcnQoIGl0ZW1FbGVtZW50ICApOworCWl0ZW1FbGVtZW50LT5TZXRBdHRyaWJ1dGUoICJwcmlvcml0eSIsIDIgKTsKKworCS8vIENoYW5nZSB0aGUgZGlzdGFuY2UgdG8gImRvaW5nIGJpbGxzIiBmcm9tCisJLy8gIm5vbmUiIHRvICJoZXJlIi4gSXQncyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQuCisJaXRlbUVsZW1lbnQgPSBpdGVtRWxlbWVudC0+TmV4dFNpYmxpbmdFbGVtZW50KCk7CisJYXNzZXJ0KCBpdGVtRWxlbWVudCApOworCWl0ZW1FbGVtZW50LT5TZXRBdHRyaWJ1dGUoICJkaXN0YW5jZSIsICJoZXJlIiApOworCisJLy8gUmVtb3ZlIHRoZSAiTG9vayBmb3IgRXZpbCBEaW5vc291cnMhIiBpdGVtLgorCS8vIEl0IGlzIDEgbW9yZSBzaWJsaW5nIGF3YXkuIFdlIGFzayB0aGUgcGFyZW50IHRvIHJlbW92ZQorCS8vIGEgcGFydGljdWxhciBjaGlsZC4KKwlpdGVtRWxlbWVudCA9IGl0ZW1FbGVtZW50LT5OZXh0U2libGluZ0VsZW1lbnQoKTsKKwl0b2RvRWxlbWVudC0+UmVtb3ZlQ2hpbGQoIGl0ZW1FbGVtZW50ICk7CisKKwlpdGVtRWxlbWVudCA9IDA7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFdoYXQgZm9sbG93cyBpcyBhbiBleGFtcGxlIG9mIGNyZWF0ZWQgZWxlbWVudHMgYW5kIHRleHQKKwkvLyBub2RlcyBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlIGRvY3VtZW50LgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvLyBBZGQgc29tZSBtZWV0aW5ncy4KKwlUaVhtbEVsZW1lbnQgaXRlbSggIkl0ZW0iICk7CisJaXRlbS5TZXRBdHRyaWJ1dGUoICJwcmlvcml0eSIsICIxIiApOworCWl0ZW0uU2V0QXR0cmlidXRlKCAiZGlzdGFuY2UiLCAiZmFyIiApOworCisJVGlYbWxUZXh0IHRleHQoICJUYWxrIHRvOiIgKTsKKworCVRpWG1sRWxlbWVudCBtZWV0aW5nMSggIk1lZXRpbmciICk7CisJbWVldGluZzEuU2V0QXR0cmlidXRlKCAid2hlcmUiLCAiU2Nob29sIiApOworCisJVGlYbWxFbGVtZW50IG1lZXRpbmcyKCAiTWVldGluZyIgKTsKKwltZWV0aW5nMi5TZXRBdHRyaWJ1dGUoICJ3aGVyZSIsICJMdW5jaCIgKTsKKworCVRpWG1sRWxlbWVudCBhdHRlbmRlZTEoICJBdHRlbmRlZSIgKTsKKwlhdHRlbmRlZTEuU2V0QXR0cmlidXRlKCAibmFtZSIsICJNYXJwbGUiICk7CisJYXR0ZW5kZWUxLlNldEF0dHJpYnV0ZSggInBvc2l0aW9uIiwgInRlYWNoZXIiICk7CisKKwlUaVhtbEVsZW1lbnQgYXR0ZW5kZWUyKCAiQXR0ZW5kZWUiICk7CisJYXR0ZW5kZWUyLlNldEF0dHJpYnV0ZSggIm5hbWUiLCAiVm8mI3g4MjsiICk7CisJYXR0ZW5kZWUyLlNldEF0dHJpYnV0ZSggInBvc2l0aW9uIiwgImNvdW5zZWxvciIgKTsKKworCS8vIEFzc2VtYmxlIHRoZSBub2RlcyB3ZSd2ZSBjcmVhdGVkOgorCW1lZXRpbmcxLkluc2VydEVuZENoaWxkKCBhdHRlbmRlZTEgKTsKKwltZWV0aW5nMS5JbnNlcnRFbmRDaGlsZCggYXR0ZW5kZWUyICk7CisKKwlpdGVtLkluc2VydEVuZENoaWxkKCB0ZXh0ICk7CisJaXRlbS5JbnNlcnRFbmRDaGlsZCggbWVldGluZzEgKTsKKwlpdGVtLkluc2VydEVuZENoaWxkKCBtZWV0aW5nMiApOworCisJLy8gQW5kIGFkZCB0aGUgbm9kZSB0byB0aGUgZXhpc3RpbmcgbGlzdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQuCisJbm9kZSA9IHRvZG9FbGVtZW50LT5GaXJzdENoaWxkKCAiSXRlbSIgKTsKKwlhc3NlcnQoIG5vZGUgKTsKKwlpdGVtRWxlbWVudCA9IG5vZGUtPlRvRWxlbWVudCgpOworCWFzc2VydCggaXRlbUVsZW1lbnQgKTsKKworCXRvZG9FbGVtZW50LT5JbnNlcnRBZnRlckNoaWxkKCBpdGVtRWxlbWVudCwgaXRlbSApOworCisJcHJpbnRmKCAiXG4qKiBEZW1vIGRvYyBwcm9jZXNzZWQ6ICoqIFxuXG4iICk7CisJZG9jLlByaW50KCBzdGRvdXQgKTsKKworCXByaW50ZiggIioqIERlbW8gZG9jIHByb2Nlc3NlZCB0byBzdHJlYW06ICoqIFxuXG4iICk7CisJY291dCA8PCBkb2MgPDwgZW5kbCA8PCBlbmRsOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBEaWZmZXJlbnQgdGVzdHMuLi5kbyB3ZSBoYXZlIHdoYXQgd2UgZXhwZWN0PworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlpbnQgY291bnQgPSAwOworCVRpWG1sRWxlbWVudCoJZWxlbWVudDsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWNvdXQgPDwgIioqIEJhc2ljIHN0cnVjdHVyZS4gKipcbiI7CisJb3N0cmluZ3N0cmVhbSBvdXRwdXRTdHJlYW0oIG9zdHJpbmdzdHJlYW06Om91dCApOworCW91dHB1dFN0cmVhbSA8PCBkb2M7CisKKwlYbWxUZXN0KCAiT3V0cHV0IHN0cmVhbSBjb3JyZWN0LiIsIHN0cmluZyggZGVtb0VuZCApLCBvdXRwdXRTdHJlYW0uc3RyKCksIHRydWUgKTsKKworCW5vZGUgPSBkb2MuUm9vdEVsZW1lbnQoKTsKKwlYbWxUZXN0KCAiUm9vdCBlbGVtZW50IGV4aXN0cy4iLCB0cnVlLCAoIG5vZGUgIT0gMCAmJiBub2RlLT5Ub0VsZW1lbnQoKSApICk7CQorCVhtbFRlc3QoICJSb290IGVsZW1lbnQgdmFsdWUgaXMgJ1RvRG8nLiIsIHN0cmluZyggIlRvRG8iICksIG5vZGUtPlZhbHVlKCkgKTsKKwlub2RlID0gbm9kZS0+Rmlyc3RDaGlsZCgpOworCVhtbFRlc3QoICJGaXJzdCBjaGlsZCBleGlzdHMgJiBpcyBhIGNvbW1lbnQuIiwgdHJ1ZSwgKCBub2RlICE9IDAgJiYgbm9kZS0+VG9Db21tZW50KCkgKSApOworCW5vZGUgPSBub2RlLT5OZXh0U2libGluZygpOworCVhtbFRlc3QoICJTaWJsaW5nIGVsZW1lbnQgZXhpc3RzICYgaXMgYW4gZWxlbWVudC4iLCB0cnVlLCAoIG5vZGUgIT0gMCAmJiBub2RlLT5Ub0VsZW1lbnQoKSApICk7CisJWG1sVGVzdCggIlZhbHVlIGlzICdJdGVtJy4iLCBzdHJpbmcoICJJdGVtIiApLCBub2RlLT5WYWx1ZSgpICk7CisJbm9kZSA9IG5vZGUtPkZpcnN0Q2hpbGQoKTsKKwlYbWxUZXN0KCAiRmlyc3QgY2hpbGQgZXhpc3RzLiIsIHRydWUsICggbm9kZSAhPSAwICYmIG5vZGUtPlRvVGV4dCgpICkgKTsKKwlYbWxUZXN0KCAiVmFsdWUgaXMgJ0dvIHRvIHRoZScuIiwgc3RyaW5nKCAiR28gdG8gdGhlIiApLCBub2RlLT5WYWx1ZSgpICk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWNvdXQgPDwgIlxuKiogSXRlcmF0b3JzLiAqKiIgPDwgIlxuIjsKKwkvLyBXYWxrIGFsbCB0aGUgdG9wIGxldmVsIG5vZGVzIG9mIHRoZSBkb2N1bWVudC4KKwljb3VudCA9IDA7CisJZm9yKCBub2RlID0gZG9jLkZpcnN0Q2hpbGQoKTsKKwkJIG5vZGU7CisJCSBub2RlID0gbm9kZS0+TmV4dFNpYmxpbmcoKSApCisJeworCQljb3VudCsrOworCX0KKwlYbWxUZXN0KCAiVG9wIGxldmVsIG5vZGVzLCB1c2luZyBGaXJzdCAvIE5leHQuIiwgMywgY291bnQgKTsKKworCWNvdW50ID0gMDsKKwlmb3IoIG5vZGUgPSBkb2MuTGFzdENoaWxkKCk7CisJCSBub2RlOworCQkgbm9kZSA9IG5vZGUtPlByZXZpb3VzU2libGluZygpICkKKwl7CisJCWNvdW50Kys7CisJfQorCVhtbFRlc3QoICJUb3AgbGV2ZWwgbm9kZXMsIHVzaW5nIExhc3QgLyBQcmV2aW91cy4iLCAzLCBjb3VudCApOworCisJLy8gV2FsayBhbGwgdGhlIHRvcCBsZXZlbCBub2RlcyBvZiB0aGUgZG9jdW1lbnQsCisJLy8gdXNpbmcgYSBkaWZmZXJlbnQgc3l0YXguCisJY291bnQgPSAwOworCWZvciggbm9kZSA9IGRvYy5JdGVyYXRlQ2hpbGRyZW4oIDAgKTsKKwkJIG5vZGU7CisJCSBub2RlID0gZG9jLkl0ZXJhdGVDaGlsZHJlbiggbm9kZSApICkKKwl7CisJCWNvdW50Kys7CisJfQorCVhtbFRlc3QoICJUb3AgbGV2ZWwgbm9kZXMsIHVzaW5nIEl0ZXJhdGVDaGlsZHJlbi4iLCAzLCBjb3VudCApOworCisJLy8gV2FsayBhbGwgdGhlIGVsZW1lbnRzIGluIGEgbm9kZS4KKwljb3VudCA9IDA7CisJZm9yKCBlbGVtZW50ID0gdG9kb0VsZW1lbnQtPkZpcnN0Q2hpbGRFbGVtZW50KCk7CisJCSBlbGVtZW50OworCQkgZWxlbWVudCA9IGVsZW1lbnQtPk5leHRTaWJsaW5nRWxlbWVudCgpICkKKwl7CisJCWNvdW50Kys7CisJfQorCVhtbFRlc3QoICJDaGlsZHJlbiBvZiB0aGUgJ1RvRG8nIGVsZW1lbnQsIHVzaW5nIEZpcnN0IC8gTmV4dC4iLAorCQkJIDMsIGNvdW50ICk7CisKKwkvLyBXYWxrIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBub2RlIGJ5IHZhbHVlLgorCWNvdW50ID0gMDsKKwlmb3IoIG5vZGUgPSB0b2RvRWxlbWVudC0+Rmlyc3RDaGlsZCggIkl0ZW0iICk7CisJCSBub2RlOworCQkgbm9kZSA9IG5vZGUtPk5leHRTaWJsaW5nKCAiSXRlbSIgKSApCisJeworCQljb3VudCsrOworCX0KKwlYbWxUZXN0KCAiJ0l0ZW0nIGNoaWxkcmVuIG9mIHRoZSAnVG9EbycgZWxlbWVudCwgdXNpbmcgRmlyc3QvTmV4dC4iLCAzLCBjb3VudCApOworCisJY291bnQgPSAwOworCWZvciggbm9kZSA9IHRvZG9FbGVtZW50LT5MYXN0Q2hpbGQoICJJdGVtIiApOworCQkgbm9kZTsKKwkJIG5vZGUgPSBub2RlLT5QcmV2aW91c1NpYmxpbmcoICJJdGVtIiApICkKKwl7CisJCWNvdW50Kys7CisJfQorCVhtbFRlc3QoICInSXRlbScgY2hpbGRyZW4gb2YgdGhlICdUb0RvJyBlbGVtZW50LCB1c2luZyBMYXN0L1ByZXZpb3VzLiIsIDMsIGNvdW50ICk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWNvdXQgPDwgIlxuKiogUGFyc2luZy4gKipcbiI7CisJaXN0cmluZ3N0cmVhbSBwYXJzZTAoICI8RWxlbWVudDAgYXR0cmlidXRlMD0nZm9vMCcgYXR0cmlidXRlMT0gbm9xdW90ZXMgYXR0cmlidXRlMiA9ICcmZ3Q7JyAvPiIgKTsKKwlUaVhtbEVsZW1lbnQgZWxlbWVudDAoICJkZWZhdWx0IiApOworCXBhcnNlMCA+PiBlbGVtZW50MDsKKworCVhtbFRlc3QoICJFbGVtZW50IHBhcnNlZCwgdmFsdWUgaXMgJ0VsZW1lbnQwJy4iLCBzdHJpbmcoICJFbGVtZW50MCIgKSwgZWxlbWVudDAuVmFsdWUoKSApOworCVhtbFRlc3QoICJSZWFkcyBhdHRyaWJ1dGUgJ2F0dHJpYnV0ZTA9XCJmb28wXCInLiIsIHN0cmluZyggImZvbzAiICksICooIGVsZW1lbnQwLkF0dHJpYnV0ZSggImF0dHJpYnV0ZTAiICkgKSApOworCVhtbFRlc3QoICJSZWFkcyBpbmNvcnJlY3RseSBmb3JtYXR0ZWQgJ2F0dHJpYnV0ZTE9bm9xdW90ZXMnLiIsIHN0cmluZyggIm5vcXVvdGVzIiApLCAqKCBlbGVtZW50MC5BdHRyaWJ1dGUoICJhdHRyaWJ1dGUxIiApICkgKTsKKwlYbWxUZXN0KCAiUmVhZCBhdHRyaWJ1dGUgd2l0aCBlbnRpdHkgdmFsdWUgJz4nLiIsIHN0cmluZyggIj4iICksICooIGVsZW1lbnQwLkF0dHJpYnV0ZSggImF0dHJpYnV0ZTIiICkgKSApOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJY291dCA8PCAiXG4qKiBTdHJlYW1pbmcuICoqXG4iOworCisJLy8gUm91bmQgdHJpcCBjaGVjazogc3RyZWFtIGluLCB0aGVuIHN0cmVhbSBiYWNrIG91dCB0byB2ZXJpZnkuIFRoZSBzdHJlYW0KKwkvLyBvdXQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLCBhYm92ZS4gV2UgdXNlIHRoZSBvdXRwdXQKKworCWlzdHJpbmdzdHJlYW0gaW5wdXRTdHJpbmdTdHJlYW0oIG91dHB1dFN0cmVhbS5zdHIoKSApOworCVRpWG1sRG9jdW1lbnQgZG9jdW1lbnQwOworCisJaW5wdXRTdHJpbmdTdHJlYW0gPj4gZG9jdW1lbnQwOworCisJb3N0cmluZ3N0cmVhbSBvdXRwdXRTdHJlYW0wKCBvc3RyaW5nc3RyZWFtOjpvdXQgKTsKKwlvdXRwdXRTdHJlYW0wIDw8IGRvY3VtZW50MDsKKworCVhtbFRlc3QoICJTdHJlYW0gcm91bmQgdHJpcCBjb3JyZWN0LiIsIHN0cmluZyggZGVtb0VuZCApLCBvdXRwdXRTdHJlYW0wLnN0cigpLCB0cnVlICk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwljb3V0IDw8ICJcbioqIFBhcnNpbmcsIG5vIENvbmRlbnNlIFdoaXRlc3BhY2UgKipcbiI7CisJVGlYbWxCYXNlOjpTZXRDb25kZW5zZVdoaXRlU3BhY2UoIGZhbHNlICk7CisKKwlpc3RyaW5nc3RyZWFtIHBhcnNlMSggIjxzdGFydD5UaGlzICBpcyAgICBcbnRleHQ8L3N0YXJ0PiIgKTsKKwlUaVhtbEVsZW1lbnQgdGV4dDEoICJ0ZXh0IiApOworCXBhcnNlMSA+PiB0ZXh0MTsKKworCVhtbFRlc3QoICJDb25kZW5zZSB3aGl0ZSBzcGFjZSBPRkYuIiwgc3RyaW5nKCAiVGhpcyAgaXMgICAgXG50ZXh0IiApLAorCQkJCQkJCQkJCSAgdGV4dDEuRmlyc3RDaGlsZCgpLT5WYWx1ZSgpLAorCQkJCQkJCQkJCSAgdHJ1ZSApOworCQkJCQkJCQorCWNvdXQgPDwgZW5kbCA8PCAiUGFzcyAiIDw8IGdQYXNzIDw8ICIsIEZhaWwgIiA8PCBnRmFpbCA8PCBlbmRsOwkKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvQVBJIGIvQVBJCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTBkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9BUEkKQEAgLTAsMCArMSwxMDcgQEAKK1RoZSBMQU1FIEFQSQorCitUaGlzIGlzIHRoZSBzaW1wbGUgaW50ZXJmYWNlIHRvIHRoZSBlbmNvZGluZyBwYXJ0IG9mIGxpYm1wM2xhbWUuc28uCitUaGUgbGlicmFyeSBhbHNvIGNvbnRhaW5zIHJvdXRpbmVzIGZvciBhZGRpbmcgaWQzIHRhZ3MgYW5kIAorbXAzIGRlY29kaW5nLiAgVGhlc2Ugcm91dGluZXMgYXJlIG5vdCBmdWxseSBkb2N1bWVudGVkLAorYnV0IHlvdSBjYW4gZmlndXJlIHRoZW0gb3V0IGJ5IGxvb2tpbmcgYXQgImluY2x1ZGUvbGFtZS5oIiBhbmQgdGhlCitleGFtcGxlIGZyb250ZW5kIGVuY29kZXIvZGVjb2RlciBzb3VyY2UgY29kZSBpbiBmcm9udGVuZC9tYWluLmMKKworQWxsIG9mIHRoZXNlIHN0ZXBzIHNob3VsZCBiZSBkb25lIGZvciBldmVyeSBNUDMgdG8gYmUgZW5jb2RlZC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEuIChvcHRpb25hbCkgR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZW5jb2RlciwgaWYgeW91IGFyZSBpbnRlcmVzdGVkLiAgCisgICB2b2lkIGdldF9sYW1lX3ZlcnNpb24oY2hhciAqc3RyYnVmLCBzaXplX3QgYnVmbGVuLCBjb25zdCBjaGFyICpwcmVmaXgpOworCisKKzIuIEVycm9yIG1lc3NhZ2VzLiAgQnkgZGVmYXVsdCwgTEFNRSB3aWxsIHdyaXRlIGVycm9yIG1lc3NhZ2VzIHRvCitzdGRlcnIgdXNpbmcgdmZwcmludGYoKS4gIEZvciBHVUkgYXBwbGljYXRpb25zLCB0aGlzIGlzIG9mdGVuIGEgcHJvYmxlbQorYW5kIHlvdSBuZWVkIHRvIHNldCB5b3VyIG93biBlcnJvciBtZXNzYWdlIGhhbmRsZXJzOgorCisgICBsYW1lX3NldF9lcnJvcmYoZ2ZwLGVycm9yX2hhbmRsZXJfZnVuY3Rpb24pOworICAgbGFtZV9zZXRfZGVidWdmKGdmcCxlcnJvcl9oYW5kbGVyX2Z1bmN0aW9uKTsKKyAgIGxhbWVfc2V0X21zZ2YoZ2ZwLGVycm9yX2hhbmRsZXJfZnVuY3Rpb24pOworICAKK1NlZSBsYW1lLmggZm9yIGRldGFpbHMuCisKKworMy4gSW5pdGlhbGl6ZSB0aGUgZW5jb2Rlci4gIHNldHMgZGVmYXVsdCBmb3IgYWxsIGVuY29kZXIgcGFyYW1ldGVycy4KKworICAgI2luY2x1ZGUgImxhbWUuaCIKKyAgIGxhbWVfZ2xvYmFsX2ZsYWdzICpnZnA7CisgICBnZnAgPSBsYW1lX2luaXQoKTsKKworVGhlIGRlZmF1bHQgKGlmIHlvdSBzZXQgbm90aGluZykgaXMgYSAgSi1TdGVyZW8sIDQ0LjFraHoKKzEyOGticHMgQ0JSIG1wMyBmaWxlIGF0IHF1YWxpdHkgNS4gIE92ZXJyaWRlIHZhcmlvdXMgZGVmYXVsdCBzZXR0aW5ncyAKK2FzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGU6CisKKyAgIGxhbWVfc2V0X251bV9jaGFubmVscyhnZnAsMik7CisgICBsYW1lX3NldF9pbl9zYW1wbGVyYXRlKGdmcCw0NDEwMCk7CisgICBsYW1lX3NldF9icmF0ZShnZnAsMTI4KTsKKyAgIGxhbWVfc2V0X21vZGUoZ2ZwLDEpOworICAgbGFtZV9zZXRfcXVhbGl0eShnZnAsMik7ICAgLyogMj1oaWdoICA1ID0gbWVkaXVtICA3PWxvdyAqLyAKKworCitTZWUgbGFtZS5oIGZvciB0aGUgY29tcGxldGUgbGlzdCBvZiBvcHRpb25zLiAgTm90ZSB0aGF0IHRoZXJlIGFyZQorc29tZSBsYW1lX3NldF8qKCkgY2FsbHMgbm90IGRvY3VtZW50ZWQgaW4gbGFtZS5oLiAgVGhlc2UgZnVuY3Rpb25zCithcmUgZXhwZXJpbWVudGFsIGFuZCBmb3IgdGVzdGluZyBvbmx5LiAgVGhleSBtYXkgYmUgcmVtb3ZlZCBpbgordGhlIGZ1dHVyZS4KKworCisKKzQuIFNldCBtb3JlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gZGF0YSBwcm92aWRlZCBhYm92ZSwKKyAgIGFzIHdlbGwgYXMgY2hlY2tpbmcgZm9yIHByb2JsZW1zLiAgQ2hlY2sgdGhhdCByZXRfY29kZSA+PSAwLgorCisgICByZXRfY29kZSA9IGxhbWVfaW5pdF9wYXJhbXMoZ2ZwKTsKKworCisKKzUuIEVuY29kZSBzb21lIGRhdGEuICBpbnB1dCBwY20gZGF0YSwgb3V0cHV0IChtYXliZSkgbXAzIGZyYW1lcy4KK1RoaXMgcm91dGluZSBoYW5kbGVzIGFsbCBidWZmZXJpbmcsIHJlc2FtcGxpbmcgYW5kIGZpbHRlcmluZyBmb3IgeW91LgorVGhlIHJlcXVpcmVkIG1wM2J1ZmZlcl9zaXplIGNhbiBiZSBjb21wdXRlZCBmcm9tIG51bV9zYW1wbGVzLCAKK3NhbXBsZXJhdGUgYW5kIGVuY29kaW5nIHJhdGUsIGJ1dCBoZXJlIGlzIGEgd29yc3QgY2FzZSBlc3RpbWF0ZToKK21wM2J1ZmZlcl9zaXplIChpbiBieXRlcykgPSAxLjI1Km51bV9zYW1wbGVzICsgNzIwMC4KK251bV9zYW1wbGVzID0gdGhlIG51bWJlciBvZiBQQ00gc2FtcGxlcyBpbiBlYWNoIGNoYW5uZWwuICBJdCBpcworbm90IHRoZSBzdW0gb2YgdGhlIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBMIGFuZCBSIGNoYW5uZWxzLgorCitUaGUgcmV0dXJuIGNvZGUgPSBudW1iZXIgb2YgYnl0ZXMgb3V0cHV0IGluIG1wM2J1ZmZlci4gIFRoaXMgY2FuIGJlIDAuCitJZiBpdCBpcyA8MCwgYW4gZXJyb3Igb2NjdXJlZC4gIAorCisgICBpbnQgbGFtZV9lbmNvZGVfYnVmZmVyKGxhbWVfZ2xvYmFsX2ZsYWdzICpnZnAsCisgICAgICAgICBzaG9ydCBpbnQgbGVmdHBjbVtdLCBzaG9ydCBpbnQgcmlnaHRwY21bXSwKKyAgICAgICAgIGludCBudW1fc2FtcGxlcyxjaGFyICptcDNidWZmZXIsaW50ICBtcDNidWZmZXJfc2l6ZSk7CisKKworVGhlcmUgYXJlIGFsc28gcm91dGluZXMgZm9yIHZhcmlvdXMgdHlwZXMgb2YgaW5wdXQgIAorKGZsb2F0LCBsb25nLCBpbnRlcmxlYXZlZCwgZXRjKS4gIFNlZSBsYW1lLmggZm9yIGRldGFpbHMuCisKKworNi4gbGFtZV9lbmNvZGVfZmx1c2ggd2lsbCBmbHVzaCB0aGUgYnVmZmVycyBhbmQgbWF5IHJldHVybiBhIAorZmluYWwgZmV3IG1wMyBmcmFtZXMuICBtcDNidWZmZXIgc2hvdWxkIGJlIGF0IGxlYXN0IDcyMDAgYnl0ZXMuCityZXR1cm4gY29kZSA9IG51bWJlciBvZiBieXRlcyBvdXRwdXQgdG8gbXAzYnVmZmVyLiAgVGhpcyBjYW4gYmUgMC4KKworaW50IGxhbWVfZW5jb2RlX2ZsdXNoKGxhbWVfZ2xvYmFsX2ZsYWdzICosY2hhciAqbXAzYnVmZmVyLCBpbnQgbXAzYnVmZmVyX3NpemUpOworCisKKzcuICBXcml0ZSB0aGUgWGluZyBWQlIvSU5GTyB0YWcgdG8gbXAzIGZpbGUuICAKKwordm9pZCBsYW1lX21wM190YWdzX2ZpZChsYW1lX2dsb2JhbF9mbGFncyAqLEZJTEUqIGZpZCk7CisKK1RoaXMgYWRkcyBhIHZhbGlkIG1wMyBmcmFtZSB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK2JpdHN0cmVhbSBzb21lIHBsYXllcnMgbWF5IGZpbmQgdXNlZnVsbC4gIEl0IGlzIHVzZWQgZm9yIENCUixBQlIgYW5kCitWQlIuICBUaGUgcm91dGluZSB3aWxsIGF0dGVtcHQgdG8gcmV3aW5kIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHRoZQorYmVnaW5uaW5nLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIChmb3IgZXhhbXBsZSwgeW91IGFyZSBlbmNvZGluZyB0bworc3Rkb3V0KSB5b3Ugc2hvdWxkIHNwZWNpZmljYWxseSBkaXNhYmxlIHRoZSB0YWcgYnkgY2FsbGluZworbGFtZV9zZXRfYldyaXRlVmJyVGFnKGdmcCwwKSBpbiBzdGVwIDMgYWJvdmUsIGFuZCBjYWxsCitsYW1lX21wM190YWdzX2ZpZCgpIHdpdGggZmlkPU5VTEwuICBJZiB0aGUgcmV3aW5kIGZhaWxzIGFuZAordGhlIHRhZyB3YXMgbm90IGRpc2FibGVkLCB0aGUgZmlyc3QgbXAzIGZyYW1lIGluIHRoZSBiaXRzdHJlYW0KK3dpbGwgYmUgYWxsIDAncy4KKworCisKKzguIGZyZWUgdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKwordm9pZCBsYW1lX2Nsb3NlKGxhbWVfZ2xvYmFsX2ZsYWdzICopOyAKKworCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTAzMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORwpAQCAtMCwwICsxLDQ4MSBAQAorCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgCQkgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcworIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKK290aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKK3lvdXIgbGlicmFyaWVzLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKK3lvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAordGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitsaWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCit2ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCit0aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCisMCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCitzb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAordHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCit3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKK2ZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCitsaWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCitkZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKK29uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwordGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCisKKyAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKK3RoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCitwcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAorY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKK2FuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgorYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQorZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCit0cmVhdHMgaXQgYXMgc3VjaC4KKworICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCitzaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKK2NvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCisKKyAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKK3VzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQorbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bworcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQorcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCitsaWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQordGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCitjaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcword2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKK3dvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCisKKyAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KKwwKKwkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKK2NvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCitwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKK2FkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQorZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY3YTEwCi0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy5oZWFkZXIgYi9DaGFuZ2VMb2cuaGVhZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MDhmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9DaGFuZ2VMb2cuaGVhZGVyCkBAIC0wLDAgKzEsMTMgQEAKKworIENoYW5nZUxvZyBmb3IgTEFNRQorLT09PT09PT09PT09PT09PT09PS0KKworIC0gQWxsIGRhdGVzL3RpbWVzIGFyZSBpbiBHTVQuCisgLSBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbXBsZXRlIGNoYW5nZWxvZywgZXZlbiBjb21taXQgbG9ncyBvZgorICAgbm9uIG9mZmljaWFsIGJyYW5jaGVzLiBBbiBlbnRyeSBvZiB0aGUgZm9ybSAiZmlsZW5hbWUgKGJyYW5jaG5hbWUpOiIKKyAgIG1heSBub3QgYXBwbHkgdG8gdGhlIHNvdXJjZSB5b3UgZ2V0IHdpdGggdGhpcyBwYWNrYWdlLgorIC0gR2VuZXJhdGVkIGZyb20gY3ZzIGxvZyBlbnRyaWVzCisgICAoY3ZzMmNsIC0tZ210IC1TIC0tYnJhbmNoZXMgLS1uby13cmFwIC0taGVhZGVyIENoYW5nZUxvZy5oZWFkZXIpCisKKy0tIAorCmRpZmYgLS1naXQgYS9ERUZJTkVTIGIvREVGSU5FUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZhYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvREVGSU5FUwpAQCAtMCwwICsxLDQ1IEBACiskSWQ6IERFRklORVMsdiAxLjIzIDIwMDMvMDIvMDcgMTg6MTc6NDEgYm91dmlnbmUgRXhwICQKKworVVNFX0ZBU1RfTE9HOgorIC0gdXNlIG9mIGxvZy9sb2cxMCBhcHByb3hpbWF0aW9uICh1c2VzIElFRUU3NTQgZmxvYXQgZm9ybWF0KQorICAgKGFic29sdXRlIHByZWNpc2lvbiBvZiBsb2cxMCBpcyB0aGVuIGFyb3VuZCAxZS02KQorCitLTEVNTV8zNjoKKyAtIHBvcnRhYmlsaXR5IGZpeGVzIGluIHRoZSBJTyBjb2RlCisKK05PTl9MSU5FQVJfUFNZTU9ERUwKKyAtIHVzZSBhIG5vbiBsaW5lYXIgcHN5bW9kZWwgaW4gdGhlIEdQU1lDSE8gY2FzZQorCitVU0VfR09HT19TVUJCQU5EOgorID8KKworTk9UQUJMRVMgKGRlZmF1bHQpOgorID8KKworTkVXUzM6CisgPworCitOT1JFU19URVNUIChhbGx3YXlzIG9uKToKKyAtIGRvbid0IGxldCB0aGUgMm5kIGdyYW51bGUgdXNlIGJpdHMgc2F2ZWQgYnkgdGhlIDFzdCBncmFudWxlCisgLSB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seQorCitORVdfRFJBSU4gKHRoZXJlcyBhIGRlZmluZSBhYm92ZTogTkVXX0RSQUlOWFgpOgorID8KKyBjb21tZW50OgorICAgbWRiX2J5dGVzID0geC84OyBtID89IG4gPz0gbyA/PSA4KiBtZGJfYnl0ZXM7IHAgPz0gbWRiX2J5dGVzCisgICAoID8gPT0gWystXSApCisgICAtIG9wdGltaXphdGlvbiBzaG91bGQgaGFuZGxlIHRoaXMsIGJ1dCBpdCBsb29rcyB1Z2x5CisgICAtIGRvIHdlIGxvc2UgcHJlY2lzaW9uIGhlcmU/CisKK0xBTUVfU1REX1BSSU5UOgorIC0gbW9yZSB2ZXJib3NlIG91dHB1dD8KKworUFJFQ09NUFVURSAoYWx3YXlzIG9uLCBtdWx0aXBsZSBkZWZpbmVzKToKKyAtIHByZWNvbXB1dGVzIGJsYWNrbWFuIHdpbmRvdz8KKworVVNFX0dOVUNfQVNNOgorIC0gc3BlZWQgb3B0aW1pemF0aW9uCisgICAoc2hvdWxkIG1vdmUgaW50byBjb25maWd1cmUuaW4pCisKKy4uLiBhbG90IG9mICNpZiAwIC8gI2lmIDEgbm90IGV2YWx1YXRlZCAuLi4KKwpkaWZmIC0tZ2l0IGEvRGxsL0JsYWRlTVAzRW5jRExMLmMgYi9EbGwvQmxhZGVNUDNFbmNETEwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDljYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvRGxsL0JsYWRlTVAzRW5jRExMLmMKQEAgLTAsMCArMSwxMDIxIEBACisvKgorKglCbGFkZSBETEwgSW50ZXJmYWNlIGZvciBMQU1FLgorKgorKglDb3B5cmlnaHQgKGMpIDE5OTkgLSAyMDAyIEEuTC4gRmFiZXIKKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqIAorKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyogCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisqIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8V2luZGVmLmg+CisjaW5jbHVkZSAiQmxhZGVNUDNFbmNETEwuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bGFtZS5oPgorCisKKyNkZWZpbmUgICAgICAgICBNaW4oQSwgQikgICAgICAgKChBKSA8IChCKSA/IChBKSA6IChCKSkKKyNkZWZpbmUgICAgICAgICBNYXgoQSwgQikgICAgICAgKChBKSA+IChCKSA/IChBKSA6IChCKSkKKworI2RlZmluZSBfUkVMRUFTRURFQlVHIDAKKworLy8gbGFtZV9lbmMgRExMIHZlcnNpb24gbnVtYmVyCitjb25zdCBpbnQgTUFKT1JWRVJTSU9OID0gMTsKK2NvbnN0IGludCBNSU5PUlZFUlNJT04gPSAzMjsKKworCisvLyBMb2NhbCB2YXJpYWJsZXMKK3N0YXRpYyBEV09SRAkJCQlkd1NhbXBsZUJ1ZmZlclNpemU9MDsKK3N0YXRpYyBIQU5ETEUJCQkJZ3NfaE1vZHVsZT1OVUxMOworc3RhdGljIEJPT0wJCQkJCWdzX2JMb2dGaWxlPUZBTFNFOworc3RhdGljIGxhbWVfZ2xvYmFsX2ZsYWdzKglnZnBfc2F2ZSA9IE5VTEw7CisKKy8vIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK3N0YXRpYyB2b2lkIGR1bXBfY29uZmlnKCAJbGFtZV9nbG9iYWxfZmxhZ3MqCWdmcCApOworc3RhdGljIHZvaWQgRGVidWdQcmludGYoIGNvbnN0IGNoYXIqIHB6Rm9ybWF0LCAuLi4gKTsKK3N0YXRpYyB2b2lkIERpc3BFcnIoIGNoYXIgY29uc3QqIHN0ckVyciApOworc3RhdGljIHZvaWQgUHJlc2V0T3B0aW9ucyggbGFtZV9nbG9iYWxfZmxhZ3MgKmdmcCwgTE9ORyBteVByZXNldCApOworCisKK3N0YXRpYyB2b2lkIERlYnVnUHJpbnRmKGNvbnN0IGNoYXIqIHB6Rm9ybWF0LCAuLi4pCit7CisgICAgY2hhcglzekJ1ZmZlclsxMDI0XT17J1wwJyx9OworICAgIGNoYXIJc3pGaWxlTmFtZVtNQVhfUEFUSCsxXT17J1wwJyx9OworICAgIHZhX2xpc3QgYXA7CisKKyAgICAvLyBHZXQgdGhlIGZ1bGwgbW9kdWxlIChETEwpIGZpbGUgbmFtZQorICAgIEdldE1vZHVsZUZpbGVOYW1lQSgJZ3NfaE1vZHVsZSwgCisgICAgICAgIHN6RmlsZU5hbWUsCisgICAgICAgIHNpemVvZiggc3pGaWxlTmFtZSApICk7CisKKyAgICAvLyBjaGFuZ2UgZmlsZSBuYW1lIGV4dGVudGlvbgorICAgIHN6RmlsZU5hbWVbIHN0cmxlbihzekZpbGVOYW1lKSAtIDMgXSA9ICd0JzsKKyAgICBzekZpbGVOYW1lWyBzdHJsZW4oc3pGaWxlTmFtZSkgLSAyIF0gPSAneCc7CisgICAgc3pGaWxlTmFtZVsgc3RybGVuKHN6RmlsZU5hbWUpIC0gMSBdID0gJ3QnOworCisgICAgLy8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmFfc3RhcnQoYXAsIHB6Rm9ybWF0KTsKKworICAgIC8vIGNvcHkgaXQgdG8gdGhlIHN0cmluZyBidWZmZXIKKyAgICBfdnNucHJpbnRmKHN6QnVmZmVyLCBzaXplb2Yoc3pCdWZmZXIpLCBwekZvcm1hdCwgYXApOworCisgICAgLy8gbG9nIGl0IHRvIHRoZSBmaWxlPworICAgIGlmICggZ3NfYkxvZ0ZpbGUgKSAKKyAgICB7CQorICAgICAgICBGSUxFKiBmcCA9IE5VTEw7CisKKyAgICAgICAgLy8gdHJ5IHRvIG9wZW4gdGhlIGxvZyBmaWxlCisgICAgICAgIGZwPWZvcGVuKCBzekZpbGVOYW1lLCAiYSsiICk7CisKKyAgICAgICAgLy8gY2hlY2sgZmlsZSBvcGVuIHJlc3VsdAorICAgICAgICBpZiAoZnApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdyaXRlIHN0cmluZyB0byB0aGUgZmlsZQorICAgICAgICAgICAgZnB1dHMoc3pCdWZmZXIsZnApOworCisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgZmlsZQorICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIGRlZmluZWQgX0RFQlVHIHx8IGRlZmluZWQgX1JFTEVBU0VERUJVRworICAgIE91dHB1dERlYnVnU3RyaW5nQSggc3pCdWZmZXIgKTsKKyNlbmRpZgorCisgICAgdmFfZW5kKGFwKTsKK30KKworCitzdGF0aWMgdm9pZCBQcmVzZXRPcHRpb25zKCBsYW1lX2dsb2JhbF9mbGFncyAqZ2ZwLCBMT05HIG15UHJlc2V0ICkKK3sKKyAgICBzd2l0Y2ggKG15UHJlc2V0KQorICAgIHsKKyAgICAgICAgLyotMSovY2FzZSBMUVBfTk9QUkVTRVQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKjAqL2Nhc2UgTFFQX05PUk1BTF9RVUFMSVRZOgorICAgICAgICAgICAgLyoJbGFtZV9zZXRfcXVhbGl0eSggZ2ZwLCA1ICk7Ki8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qMSovY2FzZSBMUVBfTE9XX1FVQUxJVFk6CisgICAgICAgICAgICAgbGFtZV9zZXRfcXVhbGl0eSggZ2ZwLCA5ICk7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoyKi9jYXNlIExRUF9ISUdIX1FVQUxJVFk6CisgICAgICAgICAgICAgbGFtZV9zZXRfcXVhbGl0eSggZ2ZwLCAyICk7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyozKi9jYXNlIExRUF9WT0lDRV9RVUFMSVRZOgkJCQkvLyAtLXZvaWNlIGZsYWcgZm9yIGV4cGVyaW1lbnRhbCB2b2ljZSBtb2RlCisgICAgICAgICAgICAgbGFtZV9zZXRfbW9kZSggZ2ZwLCBNT05PICk7CisgICAgICAgICAgICAgbGFtZV9zZXRfcHJlc2V0KCBnZnAsIDU2KTsKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKjQqL2Nhc2UgTFFQX1IzTUlYOgkJCQkJLy8gLS1SM01JWAorICAgICAgICAgICAgIGxhbWVfc2V0X3ByZXNldCggZ2ZwLCBSM01JWCk7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyo1Ki9jYXNlIExRUF9WRVJZSElHSF9RVUFMSVRZOgorICAgICAgICAgICAgIGxhbWVfc2V0X3F1YWxpdHkoIGdmcCwgMCApOworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qNiovY2FzZSBMUVBfU1RBTkRBUkQ6CQkJCS8vIC0tUFJFU0VUIFNUQU5EQVJECisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgU1RBTkRBUkQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyo3Ki9jYXNlIExRUF9GQVNUX1NUQU5EQVJEOgkJCQkvLyAtLVBSRVNFVCBGQVNUIFNUQU5EQVJECisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgU1RBTkRBUkRfRkFTVCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKjgqL2Nhc2UgTFFQX0VYVFJFTUU6CQkJCS8vIC0tUFJFU0VUIEVYVFJFTUUKKyAgICAgICAgICAgIGxhbWVfc2V0X3ByZXNldCggZ2ZwLCBFWFRSRU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qOSovY2FzZSBMUVBfRkFTVF9FWFRSRU1FOgkJCQkvLyAtLVBSRVNFVCBGQVNUIEVYVFJFTUU6CisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgRVhUUkVNRV9GQVNUKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qMTAqL2Nhc2UgTFFQX0lOU0FORToJCQkJLy8gLS1QUkVTRVQgSU5TQU5FCisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgSU5TQU5FKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qMTEqL2Nhc2UgTFFQX0FCUjoJCQkJCS8vIC0tUFJFU0VUIEFCUgorICAgICAgICAgICAgLy8gaGFuZGxlZCBpbiBiZUluaXRTdHJlYW0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qMTIqL2Nhc2UgTFFQX0NCUjoJCQkJCS8vIC0tUFJFU0VUIENCUgorICAgICAgICAgICAgLy8gaGFuZGxlZCBpbiBiZUluaXRTdHJlYW0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qMTMqL2Nhc2UgTFFQX01FRElVTToJCQkJCS8vIC0tUFJFU0VUIE1FRElVTQorICAgICAgICAgICAgbGFtZV9zZXRfcHJlc2V0KCBnZnAsIE1FRElVTSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKjE0Ki9jYXNlIExRUF9GQVNUX01FRElVTToJCQkJCS8vIC0tUFJFU0VUIEZBU1QgTUVESVVNCisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgTUVESVVNX0ZBU1QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoxMDAwKi9jYXNlIExRUF9QSE9ORToKKyAgICAgICAgICAgIGxhbWVfc2V0X21vZGUoIGdmcCwgTU9OTyApOworICAgICAgICAgICAgbGFtZV9zZXRfcHJlc2V0KCBnZnAsIDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qMjAwMCovY2FzZSBMUVBfU1c6CisgICAgICAgICAgICBsYW1lX3NldF9tb2RlKCBnZnAsIE1PTk8gKTsKKyAgICAgICAgICAgIGxhbWVfc2V0X3ByZXNldCggZ2ZwLCAyNCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKjMwMDAqL2Nhc2UgTFFQX0FNOgorICAgICAgICAgICAgbGFtZV9zZXRfbW9kZSggZ2ZwLCBNT05PICk7CisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgNDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyo0MDAwKi9jYXNlIExRUF9GTToKKyAgICAgICAgICAgIGxhbWVfc2V0X3ByZXNldCggZ2ZwLCAxMTIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyo1MDAwKi9jYXNlIExRUF9WT0lDRToKKyAgICAgICAgICAgIGxhbWVfc2V0X21vZGUoIGdmcCwgTU9OTyApOworICAgICAgICAgICAgbGFtZV9zZXRfcHJlc2V0KCBnZnAsIDU2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qNjAwMCovY2FzZSBMUVBfUkFESU86CisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgMTEyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qNzAwMCovY2FzZSBMUVBfVEFQRToKKyAgICAgICAgICAgIGxhbWVfc2V0X3ByZXNldCggZ2ZwLCAxMTIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyo4MDAwKi9jYXNlIExRUF9ISUZJOgorICAgICAgICAgICAgbGFtZV9zZXRfcHJlc2V0KCBnZnAsIDE2MCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKjkwMDAqL2Nhc2UgTFFQX0NEOgorICAgICAgICAgICAgbGFtZV9zZXRfcHJlc2V0KCBnZnAsIDE5Mik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKjEwMDAwKi9jYXNlIExRUF9TVFVESU86CisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoIGdmcCwgMjU2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorfQorCisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBCRV9FUlIJYmVJbml0U3RyZWFtKFBCRV9DT05GSUcgcGJlQ29uZmlnLCBQRFdPUkQgZHdTYW1wbGVzLCBQRFdPUkQgZHdCdWZmZXJTaXplLCBQSEJFX1NUUkVBTSBwaGJlU3RyZWFtKQoreworICAgIGludCBhY3R1YWxfYml0cmF0ZTsKKyAgICAvLzIwMDEtMTItMTgKKyAgICBpbnQJCQkJCW5EbGxBcmdDID0gMDsKKyAgICBCRV9DT05GSUcJCQlsYW1lQ29uZmlnID0geyAwLCB9OworICAgIGludAkJCQkJbkluaXRSZXR1cm4gPSAwOworICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKglnZnAgPSBOVUxMOworCisgICAgLy8gSW5pdCB0aGUgZ2xvYmFsIGZsYWdzIHN0cnVjdHVyZQorICAgIGdmcCA9IGxhbWVfaW5pdCgpOworICAgICpwaGJlU3RyZWFtID0gKEhCRV9TVFJFQU0pZ2ZwOworCisgICAgLy8gY2xlYXIgb3V0IHN0cnVjdHVyZQorICAgIG1lbXNldCgmbGFtZUNvbmZpZywweDAwLENVUlJFTlRfU1RSVUNUX1NJWkUpOworCisgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJlZ3VsYXIgQkxBREVfRU5DT0RFUiBoZWFkZXIKKyAgICBpZiAocGJlQ29uZmlnLT5kd0NvbmZpZyE9QkVfQ09ORklHX0xBTUUpCisgICAgeworICAgICAgICBpbnQgbkNSQz1wYmVDb25maWctPmZvcm1hdC5tcDMuYkNSQzsKKyAgICAgICAgaW50IG5WQlI9KG5DUkM+PjEyKSYweDBGOworCisgICAgICAgIC8vIENvcHkgcGFyYW1ldGVyIGZyb20gb2xkIEJsYWRlIHN0cnVjdHVyZQorICAgICAgICBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLmR3U2FtcGxlUmF0ZQk9cGJlQ29uZmlnLT5mb3JtYXQubXAzLmR3U2FtcGxlUmF0ZTsKKyAgICAgICAgLy9mb3IgbG93IGJpdHJhdGVzLCBMQU1FIHdpbGwgYXV0b21hdGljYWxseSBkb3duc2FtcGxlIGZvciBiZXR0ZXIKKyAgICAgICAgLy9zb3VuZCBxdWFsaXR5LiAgRm9yY2luZyBvdXRwdXQgc2FtcGxlcmF0ZSA9IGlucHV0IHNhbXBsZXJhdGUgaXMgbm90IGEgZ29vZCBpZGVhIAorICAgICAgICAvL3VubGVzcyB0aGUgdXNlciBzcGVjaWZpY2FsbHkgcmVxdWVzdHMgaXQ6CisgICAgICAgIC8vbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5kd1JlU2FtcGxlUmF0ZT1wYmVDb25maWctPmZvcm1hdC5tcDMuZHdTYW1wbGVSYXRlOworICAgICAgICBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLm5Nb2RlCQk9KHBiZUNvbmZpZy0+Zm9ybWF0Lm1wMy5ieU1vZGUmMHgwRik7CisgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdCaXRyYXRlCT1wYmVDb25maWctPmZvcm1hdC5tcDMud0JpdHJhdGU7CisgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuYlByaXZhdGUJCT1wYmVDb25maWctPmZvcm1hdC5tcDMuYlByaXZhdGU7CisgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuYk9yaWdpbmFsCT1wYmVDb25maWctPmZvcm1hdC5tcDMuYk9yaWdpbmFsOworICAgICAgICBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLmJDUkMJCT1uQ1JDJjB4MDE7CisgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuYkNvcHlyaWdodAk9cGJlQ29uZmlnLT5mb3JtYXQubXAzLmJDb3B5cmlnaHQ7CisKKyAgICAgICAgLy8gRmlsbCBvdXQgdGhlIHVua25vd25zCisgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdTdHJ1Y3RTaXplPUNVUlJFTlRfU1RSVUNUX1NJWkU7CisgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdTdHJ1Y3RWZXJzaW9uPUNVUlJFTlRfU1RSVUNUX1ZFUlNJT047CisKKyAgICAgICAgLy8gR2V0IFZCUiBzZXR0aW5nIGZyb20gZm91cnRoIG5pYmJsZQorICAgICAgICBpZiAoIG5WQlI+MCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuYldyaXRlVkJSSGVhZGVyID0gVFJVRTsKKyAgICAgICAgICAgIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuYkVuYWJsZVZCUiA9IFRSVUU7CisgICAgICAgICAgICBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLm5WQlJRdWFsaXR5ID0gblZCUi0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IFF1YWxpdHkgZnJvbSB0aGlyZCBuaWJibGUKKyAgICAgICAgbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5uUHJlc2V0PSgobkNSQz4+OCkmMHgwRik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gQ29weSB0aGUgcGFyYW1ldGVycworICAgICAgICBtZW1jcHkoJmxhbWVDb25maWcscGJlQ29uZmlnLHBiZUNvbmZpZy0+Zm9ybWF0LkxIVjEuZHdTdHJ1Y3RTaXplKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0gU2V0IGFyZ3VtZW50cyB0byBMQU1FIGVuY29kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gU2V0IGlucHV0IHNhbXBsZSBmcmVxdWVuY3kKKyAgICBsYW1lX3NldF9pbl9zYW1wbGVyYXRlKCBnZnAsIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdTYW1wbGVSYXRlICk7CisKKyAgICAvLyBkaXNhYmxlIElORk8vVkJSIHRhZyBieSBkZWZhdWx0LiAgCisgICAgLy8gaWYgdGhpcyB0YWcgaXMgdXNlZCwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBtdXN0IGNhbGwgYmVXcml0ZVZCUlRhZygpCisgICAgLy8gYWZ0ZXIgZW5jb2RpbmcuICBCdXQgdGhlIG9yaWdpbmFsIERMTCBkb2N1bWVudGF0aW9uIGRvZXMgbm90IAorICAgIC8vIHJlcXVpcmUgdGhlIAorICAgIC8vIGFwcCB0byBjYWxsIGJlV3JpdGVWQlJUYWcoKSB1bmxlc3MgdGhleSBoYXZlIHNwZWNpZmljYWxseQorICAgIC8vIHNldCBMSFYxLmJXcml0ZVZCUkhlYWRlcj1UUlVFLiAgVGh1cyB0aGUgZGVmYXVsdCBzZXR0aW5nIHNob3VsZAorICAgIC8vIGJlIGRpc2FibGVkLiAgCisgICAgbGFtZV9zZXRfYldyaXRlVmJyVGFnKCBnZnAsIDAgKTsKKworICAgIC8vMjAwMS0xMi0xOCBEaWJyb20ncyBBQlIgcHJlc2V0IHN0dWZmCisKKyAgICBpZihsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLm5QcmVzZXQgPT0gTFFQX0FCUikJCS8vIC0tQUxULVBSRVNFVCBBQlIKKyAgICB7CisgICAgICAgIGFjdHVhbF9iaXRyYXRlID0gbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5kd1ZickFicl9icHMgLyAxMDAwOworCisgICAgICAgIC8vIGxpbWl0IHJhbmdlCisgICAgICAgIGlmKCBhY3R1YWxfYml0cmF0ZSA+IDMyMCkKKyAgICAgICAgeworICAgICAgICAgICAgYWN0dWFsX2JpdHJhdGUgPSAzMjA7CisgICAgICAgIH0KKworICAgICAgICBpZiggYWN0dWFsX2JpdHJhdGUgPCA4ICkKKyAgICAgICAgeworICAgICAgICAgICAgYWN0dWFsX2JpdHJhdGUgPSA4OworICAgICAgICB9CisKKyAgICAgICAgbGFtZV9zZXRfcHJlc2V0KCBnZnAsIGFjdHVhbF9iaXRyYXRlICk7CisgICAgfSAgICAKKworICAgIC8vIGVuZCBEaWJyb20ncyBBQlIgcHJlc2V0IDIwMDEtMTItMTggKioqKioqIFNUQVJUIE9GIENCUgorCisgICAgaWYobGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5uUHJlc2V0ID09IExRUF9DQlIpCQkvLyAtLUFMVC1QUkVTRVQgQ0JSCisgICAgeworICAgICAgICBhY3R1YWxfYml0cmF0ZSA9IGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdCaXRyYXRlOworICAgICAgICBsYW1lX3NldF9wcmVzZXQoZ2ZwLCBhY3R1YWxfYml0cmF0ZSk7CisgICAgICAgIGxhbWVfc2V0X1ZCUihnZnAsIHZicl9vZmYpOworICAgIH0KKworICAgIC8vIGVuZCBEaWJyb20ncyBDQlIgcHJlc2V0IDIwMDEtMTItMTgKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3Mgb25seSB1c2VkIHdoZW4gcHJlc2V0IGlzIG5vdCBvbmUgb2YgdGhlIExBTUUgUVVBTElUWSBQcmVzZXRzCisgICAgaWYgKCAoaW50KWxhbWVDb25maWcuZm9ybWF0LkxIVjEublByZXNldCA8IChpbnQpIExRUF9TVEFOREFSRCApCisgICAgeworICAgICAgICBzd2l0Y2ggKCBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLm5Nb2RlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJFX01QM19NT0RFX1NURVJFTzoKKyAgICAgICAgICAgIGxhbWVfc2V0X21vZGUoIGdmcCwgU1RFUkVPICk7CisgICAgICAgICAgICBsYW1lX3NldF9udW1fY2hhbm5lbHMoIGdmcCwgMiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVfTVAzX01PREVfSlNURVJFTzoKKyAgICAgICAgICAgIGxhbWVfc2V0X21vZGUoIGdmcCwgSk9JTlRfU1RFUkVPICk7CisgICAgICAgICAgICBsYW1lX3NldF9udW1fY2hhbm5lbHMoIGdmcCwgMiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVfTVAzX01PREVfTU9OTzoKKyAgICAgICAgICAgIGxhbWVfc2V0X21vZGUoIGdmcCwgTU9OTyApOworICAgICAgICAgICAgbGFtZV9zZXRfbnVtX2NoYW5uZWxzKCBnZnAsIDEgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFX01QM19NT0RFX0RVQUxDSEFOTkVMOiAvL3dhcm5pbmc6IHRoZXJlIGlzIE5PIGR1YWwgY2hhbm5lbCBvcHRpb24gd29ya2luZyBpbiBMYW1lCisgICAgICAgICAgICBsYW1lX3NldF9mb3JjZV9tcyggZ2ZwLCAxICk7CisgICAgICAgICAgICBsYW1lX3NldF9tb2RlKCBnZnAsIFNURVJFTyApOworICAgICAgICAgICAgbGFtZV9zZXRfbnVtX2NoYW5uZWxzKCBnZnAsIDIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlYnVnUHJpbnRmKCJJbnZhbGlkIGxhbWVDb25maWcuZm9ybWF0LkxIVjEubk1vZGUsIHZhbHVlIGlzICVkXG4iLGxhbWVDb25maWcuZm9ybWF0LkxIVjEubk1vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCRV9FUlJfSU5WQUxJRF9GT1JNQVRfUEFSQU1FVEVSUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5iRW5hYmxlVkJSICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2V0IFZCUiBxdWFsaXR5ICovCisgICAgICAgICAgICBsYW1lX3NldF9WQlJfcSggZ2ZwLCBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLm5WQlJRdWFsaXR5ICk7CisKKyAgICAgICAgICAgIC8qIHNlbGVjdCBwcm9wZXIgVkJSIG1ldGhvZCAqLworICAgICAgICAgICAgc3dpdGNoICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5uVmJyTWV0aG9kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBWQlJfTUVUSE9EX05PTkU6CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfVkJSKCBnZnAsIHZicl9vZmYgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBWQlJfTUVUSE9EX0RFRkFVTFQ6CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfVkJSKCBnZnAsIHZicl9kZWZhdWx0ICk7IAorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFZCUl9NRVRIT0RfT0xEOgorICAgICAgICAgICAgICAgIGxhbWVfc2V0X1ZCUiggZ2ZwLCB2YnJfcmggKTsgCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVkJSX01FVEhPRF9NVFJIOgorICAgICAgICAgICAgY2FzZSBWQlJfTUVUSE9EX05FVzoKKyAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgKiB0aGUgLS12YnItbXRyaCBjb21tYW5kbGluZSBzd2l0Y2ggaXMgb2Jzb2xldGUuIAorICAgICAgICAgICAgICAgICogbm93IC0tdmJyLW10cmggaXMga25vd24gYXMgLS12YnItbmV3CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlIoIGdmcCwgdmJyX210cmggKTsgCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVkJSX01FVEhPRF9BQlI6CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfVkJSKCBnZnAsIHZicl9hYnIgKTsgCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogdW5zdXBwb3J0ZWQgVkJSIG1ldGhvZCAqLworICAgICAgICAgICAgICAgIGFzc2VydCggRkFMU0UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHVzZSBDQlIgZW5jb2RpbmcgbWV0aG9kLCBzbyB0dXJuIG9mZiBWQlIgKi8KKyAgICAgICAgICAgIGxhbWVfc2V0X1ZCUiggZ2ZwLCB2YnJfb2ZmICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgYml0cmF0ZS4gIChDRGV4IHVzZXJzIGFsd2F5cyBzcGVjaWZ5IGJpdHJhdGU9TWluIGJpdHJhdGUgd2hlbiB1c2luZyBWQlIpICovCisgICAgICAgIGxhbWVfc2V0X2JyYXRlKCBnZnAsIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdCaXRyYXRlICk7CisKKyAgICAgICAgLyogY2hlY2sgaWYgd2UgaGF2ZSB0byB1c2UgQUJSLCBpbiBvcmRlciB0byBiYWNrd2FyZHMgY29tcGF0aWJsZSwgdGhpcworICAgICAgICAqIGNvbmRpdGlvbiBzaG91bGQgc3RpbGwgYmUgY2hlY2tlZCBpbmRlcGVkZW50IG9mIHRoZSBuVmJyTWV0aG9kIG1ldGhvZAorICAgICAgICAqLworICAgICAgICBpZiAobGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5kd1ZickFicl9icHMgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2V0IFZCUiBtZXRob2QgdG8gQUJSICovCisgICAgICAgICAgICBsYW1lX3NldF9WQlIoIGdmcCwgdmJyX2FiciApOworCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdG8ga2Jwcywgcm91bmQgdG8gbmVhcmVzdCBrYnBzICovCisgICAgICAgICAgICBsYW1lX3NldF9WQlJfbWVhbl9iaXRyYXRlX2ticHMoIGdmcCwgKCBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLmR3VmJyQWJyX2JwcyArIDUwMCApIC8gMTAwMCApOworCisgICAgICAgICAgICAvKiBsaW1pdCByYW5nZSAqLworICAgICAgICAgICAgaWYoIGxhbWVfZ2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyggZ2ZwICkgPiAzMjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKCBnZnAsIDMyMCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggbGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKCBnZnAgKSA8IDggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxhbWVfc2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyggZ2ZwLCA4ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIEZpcnN0IHNldCBhbGwgdGhlIHByZXNldCBvcHRpb25zCisgICAgaWYgKCBMUVBfTk9QUkVTRVQgIT0gIGxhbWVDb25maWcuZm9ybWF0LkxIVjEublByZXNldCApCisgICAgeworICAgICAgICBQcmVzZXRPcHRpb25zKCBnZnAsIGxhbWVDb25maWcuZm9ybWF0LkxIVjEublByZXNldCApOworICAgIH0KKworCisgICAgLy8gU2V0IGZyZXF1ZW5jeSByZXNhbXBsaW5nIHJhdGUsIGlmIHNwZWNpZmllZAorICAgIGlmICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5kd1JlU2FtcGxlUmF0ZSA+IDAgKQorICAgIHsKKyAgICAgICAgbGFtZV9zZXRfb3V0X3NhbXBsZXJhdGUoIGdmcCwgbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5kd1JlU2FtcGxlUmF0ZSApOworICAgIH0KKworCisgICAgc3dpdGNoICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5uTW9kZSApCisgICAgeworICAgIGNhc2UgQkVfTVAzX01PREVfTU9OTzoKKyAgICAgICAgbGFtZV9zZXRfbW9kZSggZ2ZwLCBNT05PICk7CisgICAgICAgIGxhbWVfc2V0X251bV9jaGFubmVscyggZ2ZwLCAxICk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICAvLyBVc2Ugc3RyaWN0IElTTyBlbmNvZGluZz8KKyAgICBsYW1lX3NldF9zdHJpY3RfSVNPKCBnZnAsICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5iU3RyaWN0SXNvICkgPyAxIDogMCApOworCisgICAgLy8gU2V0IGNvcHlyaWdodCBmbGFnPworICAgIGlmICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5iQ29weXJpZ2h0ICkKKyAgICB7CisgICAgICAgIGxhbWVfc2V0X2NvcHlyaWdodCggZ2ZwLCAxICk7CisgICAgfQorCisgICAgLy8gRG8gd2UgaGF2ZSB0byB0YWcgIGl0IGFzIG5vbiBvcmlnaW5hbCAKKyAgICBpZiAoICFsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLmJPcmlnaW5hbCApCisgICAgeworICAgICAgICBsYW1lX3NldF9vcmlnaW5hbCggZ2ZwLCAwICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxhbWVfc2V0X29yaWdpbmFsKCBnZnAsIDEgKTsKKyAgICB9CisKKyAgICAvLyBBZGQgQ1JDPworICAgIGlmICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5iQ1JDICkKKyAgICB7CisgICAgICAgIGxhbWVfc2V0X2Vycm9yX3Byb3RlY3Rpb24oIGdmcCwgMSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsYW1lX3NldF9lcnJvcl9wcm90ZWN0aW9uKCBnZnAsIDAgKTsKKyAgICB9CisKKyAgICAvLyBTZXQgcHJpdmF0ZSBiaXQ/CisgICAgaWYgKCBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLmJQcml2YXRlICkKKyAgICB7CisgICAgICAgIGxhbWVfc2V0X2V4dGVuc2lvbiggZ2ZwLCAxICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxhbWVfc2V0X2V4dGVuc2lvbiggZ2ZwLCAwICk7CisgICAgfQorCisKKyAgICAvLyBTZXQgVkJSIG1pbiBiaXRyYXRlLCBpZiBzcGVjaWZpZWQKKyAgICBpZiAoIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdCaXRyYXRlID4gMCApCisgICAgeworICAgICAgICBsYW1lX3NldF9WQlJfbWluX2JpdHJhdGVfa2JwcyggZ2ZwLCBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLmR3Qml0cmF0ZSApOworICAgIH0KKworICAgIC8vIFNldCBNYXhiaXRyYXRlLCBpZiBzcGVjaWZpZWQKKyAgICBpZiAoIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuZHdNYXhCaXRyYXRlID4gMCApCisgICAgeworICAgICAgICBsYW1lX3NldF9WQlJfbWF4X2JpdHJhdGVfa2JwcyggZ2ZwLCBsYW1lQ29uZmlnLmZvcm1hdC5MSFYxLmR3TWF4Qml0cmF0ZSApOworICAgIH0KKyAgICAvLyBTZXQgYml0IHJlc292b2lyIG9wdGlvbgorICAgIGlmICggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5iTm9SZXMgKQorICAgIHsKKyAgICAgICAgbGFtZV9zZXRfZGlzYWJsZV9yZXNlcnZvaXIoIGdmcCwxICk7CisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgdGhlIFZCUiB0YWcgaXMgcmVxdWlyZWQKKyAgICBpZiAoIGxhbWVDb25maWcuZm9ybWF0LkxIVjEuYldyaXRlVkJSSGVhZGVyICkgCisgICAgeworICAgICAgICBsYW1lX3NldF9iV3JpdGVWYnJUYWcoIGdmcCwgMSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsYW1lX3NldF9iV3JpdGVWYnJUYWcoIGdmcCwgMCApOworICAgIH0KKworICAgIC8vIE92ZXJyaWRlIFF1YWxpdHkgc2V0dGluZywgdXNlIEhJR0hCWVRFID0gTk9UIExPV0JZVEUgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUKKyAgICBpZiAoCSggbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5uUXVhbGl0eSAmIDB4RkYgKSA9PQorICAgICAgICAoKH4oIGxhbWVDb25maWcuZm9ybWF0LkxIVjEublF1YWxpdHkgPj4gOCApKSAmIDB4RkYpICkKKyAgICB7CisgICAgICAgIGxhbWVfc2V0X3F1YWxpdHkoIGdmcCwgbGFtZUNvbmZpZy5mb3JtYXQuTEhWMS5uUXVhbGl0eSAmIDB4RkYgKTsKKyAgICB9CisKKyAgICBpZiAoIDAgIT0gKCBuSW5pdFJldHVybiA9IGxhbWVfaW5pdF9wYXJhbXMoIGdmcCApICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5Jbml0UmV0dXJuOworICAgIH0KKworICAgIC8vTEFNRSBlbmNvZGluZyBjYWxsIHdpbGwgYWNjZXB0IGFueSBudW1iZXIgb2Ygc2FtcGxlcy4gIAorICAgIGlmICggMCA9PSBsYW1lX2dldF92ZXJzaW9uKCBnZnAgKSApCisgICAgeworICAgICAgICAvLyBGb3IgTVBFRy1JSSwgb25seSA1NzYgc2FtcGxlcyBwZXIgZnJhbWUgcGVyIGNoYW5uZWwKKyAgICAgICAgKmR3U2FtcGxlcz0gNTc2ICogbGFtZV9nZXRfbnVtX2NoYW5uZWxzKCBnZnAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gRm9yIE1QRUctSSwgMTE1MiBzYW1wbGVzIHBlciBmcmFtZSBwZXIgY2hhbm5lbAorICAgICAgICAqZHdTYW1wbGVzPSAxMTUyICogbGFtZV9nZXRfbnVtX2NoYW5uZWxzKCBnZnAgKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IHNhbXBsZSBidWZmZXIgc2l6ZSwgc28gd2Uga25vdyB3aGF0IHdlIGNhbiBleHBlY3QKKyAgICBkd1NhbXBsZUJ1ZmZlclNpemUgPSAqZHdTYW1wbGVzOworCisgICAgLy8gU2V0IE1QMyBidWZmZXIgc2l6ZSwgY29uc2VydmF0aXZlIGVzdGltYXRlCisgICAgKmR3QnVmZmVyU2l6ZT0oRFdPUkQpKCAxLjI1ICogKCAqZHdTYW1wbGVzIC8gbGFtZV9nZXRfbnVtX2NoYW5uZWxzKCBnZnAgKSApICsgNzIwMCApOworCisgICAgLy8gRm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICAgIGR1bXBfY29uZmlnKCBnZnAgKTsKKworICAgIC8vIEV2ZXJ5dGhpbmcgd2VudCBPSywgdGh1cyByZXR1cm4gU1VDQ0VTU0ZVTAorICAgIHJldHVybiBCRV9FUlJfU1VDQ0VTU0ZVTDsKK30KKworCisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBCRV9FUlIJYmVGbHVzaE5vR2FwKEhCRV9TVFJFQU0gaGJlU3RyZWFtLCBQQllURSBwT3V0cHV0LCBQRFdPUkQgcGR3T3V0cHV0KQoreworICAgIGludCBuT3V0cHV0U2FtcGxlcyA9IDA7CisKKyAgICBsYW1lX2dsb2JhbF9mbGFncyoJZ2ZwID0gKGxhbWVfZ2xvYmFsX2ZsYWdzKiloYmVTdHJlYW07CisKKyAgICAvLyBJbml0IHRoZSBnbG9iYWwgZmxhZ3Mgc3RydWN0dXJlCisgICAgbk91dHB1dFNhbXBsZXMgPSBsYW1lX2VuY29kZV9mbHVzaF9ub2dhcCggZ2ZwLCBwT3V0cHV0LCBMQU1FX01BWE1QM0JVRkZFUiApOworCisgICAgaWYgKCBuT3V0cHV0U2FtcGxlcyA8IDAgKQorICAgIHsKKyAgICAgICAgKnBkd091dHB1dCA9IDA7CisgICAgICAgIHJldHVybiBCRV9FUlJfQlVGRkVSX1RPT19TTUFMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBkd091dHB1dCA9IG5PdXRwdXRTYW1wbGVzOworICAgIH0KKworICAgIHJldHVybiBCRV9FUlJfU1VDQ0VTU0ZVTDsKK30KKworX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZURlaW5pdFN0cmVhbShIQkVfU1RSRUFNIGhiZVN0cmVhbSwgUEJZVEUgcE91dHB1dCwgUERXT1JEIHBkd091dHB1dCkKK3sKKyAgICBpbnQgbk91dHB1dFNhbXBsZXMgPSAwOworCisgICAgbGFtZV9nbG9iYWxfZmxhZ3MqCWdmcCA9IChsYW1lX2dsb2JhbF9mbGFncyopaGJlU3RyZWFtOworCisgICAgbk91dHB1dFNhbXBsZXMgPSBsYW1lX2VuY29kZV9mbHVzaCggZ2ZwLCBwT3V0cHV0LCAwICk7CisKKyAgICBpZiAoIG5PdXRwdXRTYW1wbGVzIDwgMCApCisgICAgeworICAgICAgICAqcGR3T3V0cHV0ID0gMDsKKyAgICAgICAgcmV0dXJuIEJFX0VSUl9CVUZGRVJfVE9PX1NNQUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcGR3T3V0cHV0ID0gbk91dHB1dFNhbXBsZXM7CisgICAgfQorCisgICAgcmV0dXJuIEJFX0VSUl9TVUNDRVNTRlVMOworfQorCisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBCRV9FUlIJYmVDbG9zZVN0cmVhbShIQkVfU1RSRUFNIGhiZVN0cmVhbSkKK3sKKyAgICBsYW1lX2dsb2JhbF9mbGFncyoJZ2ZwID0gKGxhbWVfZ2xvYmFsX2ZsYWdzKiloYmVTdHJlYW07CisKKyAgICAvLyBsYW1lIHdpbGwgYmUgY2xvc2UgaW4gVmJyV3JpdGVUYWcgZnVuY3Rpb24KKyAgICBpZiAoICFsYW1lX2dldF9iV3JpdGVWYnJUYWcoIGdmcCApICkKKyAgICB7CisgICAgICAgIC8vIGNsZWFuIHVwIG9mIGFsbG9jYXRlZCBtZW1vcnkKKyAgICAgICAgbGFtZV9jbG9zZSggZ2ZwICk7CisKKyAgICAgICAgZ2ZwX3NhdmUgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZnBfc2F2ZSA9IChsYW1lX2dsb2JhbF9mbGFncyopaGJlU3RyZWFtOworICAgIH0KKworICAgIC8vIERlSW5pdCBlbmNvZGVyCisgICAgcmV0dXJuIEJFX0VSUl9TVUNDRVNTRlVMOworfQorCisKKworX19kZWNsc3BlYyhkbGxleHBvcnQpIFZPSUQJCWJlVmVyc2lvbihQQkVfVkVSU0lPTiBwYmVWZXJzaW9uKQoreworICAgIC8vIERMTCBSZWxlYXNlIGRhdGUKKyAgICBjaGFyIGxwc3pEYXRlWzIwXQk9IHsgJ1wwJywgfTsKKyAgICBjaGFyIGxwc3pUZW1wWzVdCT0geyAnXDAnLCB9OworICAgIGxhbWVfdmVyc2lvbl90IGx2ICAgPSB7IDAsIH07CisKKworICAgIC8vIFNldCBETEwgaW50ZXJmYWNlIHZlcnNpb24KKyAgICBwYmVWZXJzaW9uLT5ieURMTE1ham9yVmVyc2lvbj1NQUpPUlZFUlNJT047CisgICAgcGJlVmVyc2lvbi0+YnlETExNaW5vclZlcnNpb249TUlOT1JWRVJTSU9OOworCisgICAgZ2V0X2xhbWVfdmVyc2lvbl9udW1lcmljYWwgKCAmbHYgKTsKKworICAgIC8vIFNldCBFbmdpbmUgdmVyc2lvbiBudW1iZXIgKFNhbWUgYXMgTGFtZSB2ZXJzaW9uKQorICAgIHBiZVZlcnNpb24tPmJ5TWFqb3JWZXJzaW9uID0gbHYubWFqb3I7CisgICAgcGJlVmVyc2lvbi0+YnlNaW5vclZlcnNpb24gPSBsdi5taW5vcjsKKyAgICBwYmVWZXJzaW9uLT5ieUFscGhhTGV2ZWwgICA9IGx2LmFscGhhOworICAgIHBiZVZlcnNpb24tPmJ5QmV0YUxldmVsCSAgID0gbHYuYmV0YTsKKworI2lmZGVmIE1NWF9jaG9vc2VfdGFibGUKKyAgICBwYmVWZXJzaW9uLT5ieU1NWEVuYWJsZWQ9MTsKKyNlbHNlCisgICAgcGJlVmVyc2lvbi0+YnlNTVhFbmFibGVkPTA7CisjZW5kaWYKKworICAgIG1lbXNldCggcGJlVmVyc2lvbi0+YnRSZXNlcnZlZCwgMCwgc2l6ZW9mKCBwYmVWZXJzaW9uLT5idFJlc2VydmVkICkgKTsKKworICAgIC8vIEdldCBjb21waWxhdGlvbiBkYXRlCisgICAgc3RyY3B5KGxwc3pEYXRlLF9fREFURV9fKTsKKworICAgIC8vIEdldCB0aGUgZmlyc3QgdGhyZWUgY2hhcmFjdGVyLCB3aGljaCBpcyB0aGUgbW9udGgKKyAgICBzdHJuY3B5KGxwc3pUZW1wLGxwc3pEYXRlLDMpOworICAgIGxwc3pUZW1wWzNdID0gJ1wwJzsKKyAgICBwYmVWZXJzaW9uLT5ieU1vbnRoPTE7CisKKyAgICAvLyBTZXQgbW9udGgKKyAgICBpZiAoc3RyY21wKGxwc3pUZW1wLCJKYW4iKT09MCkJcGJlVmVyc2lvbi0+YnlNb250aCA9IDE7CisgICAgaWYgKHN0cmNtcChscHN6VGVtcCwiRmViIik9PTApCXBiZVZlcnNpb24tPmJ5TW9udGggPSAyOworICAgIGlmIChzdHJjbXAobHBzelRlbXAsIk1hciIpPT0wKQlwYmVWZXJzaW9uLT5ieU1vbnRoID0gMzsKKyAgICBpZiAoc3RyY21wKGxwc3pUZW1wLCJBcHIiKT09MCkJcGJlVmVyc2lvbi0+YnlNb250aCA9IDQ7CisgICAgaWYgKHN0cmNtcChscHN6VGVtcCwiTWF5Iik9PTApCXBiZVZlcnNpb24tPmJ5TW9udGggPSA1OworICAgIGlmIChzdHJjbXAobHBzelRlbXAsIkp1biIpPT0wKQlwYmVWZXJzaW9uLT5ieU1vbnRoID0gNjsKKyAgICBpZiAoc3RyY21wKGxwc3pUZW1wLCJKdWwiKT09MCkJcGJlVmVyc2lvbi0+YnlNb250aCA9IDc7CisgICAgaWYgKHN0cmNtcChscHN6VGVtcCwiQXVnIik9PTApCXBiZVZlcnNpb24tPmJ5TW9udGggPSA4OworICAgIGlmIChzdHJjbXAobHBzelRlbXAsIlNlcCIpPT0wKQlwYmVWZXJzaW9uLT5ieU1vbnRoID0gOTsKKyAgICBpZiAoc3RyY21wKGxwc3pUZW1wLCJPY3QiKT09MCkJcGJlVmVyc2lvbi0+YnlNb250aCA9IDEwOworICAgIGlmIChzdHJjbXAobHBzelRlbXAsIk5vdiIpPT0wKQlwYmVWZXJzaW9uLT5ieU1vbnRoID0gMTE7CisgICAgaWYgKHN0cmNtcChscHN6VGVtcCwiRGVjIik9PTApCXBiZVZlcnNpb24tPmJ5TW9udGggPSAxMjsKKworICAgIC8vIEdldCBkYXkgb2YgbW9udGggc3RyaW5nIChjaGFyIFs0Li41XSkKKyAgICBwYmVWZXJzaW9uLT5ieURheT1hdG9pKCBscHN6RGF0ZSArIDQgKTsKKworICAgIC8vIEdldCB5ZWFyIG9mIGNvbXBpbGF0aW9uIGRhdGUgKGNoYXIgWzcuLjEwXSkKKyAgICBwYmVWZXJzaW9uLT53WWVhciA9IGF0b2koIGxwc3pEYXRlICsgNyApOworCisgICAgbWVtc2V0KCBwYmVWZXJzaW9uLT56SG9tZXBhZ2UsIDB4MDAsIEJFX01BWF9IT01FUEFHRSApOworCisgICAgc3RyY3B5KCBwYmVWZXJzaW9uLT56SG9tZXBhZ2UsICJodHRwOi8vd3d3Lm1wM2Rldi5vcmcvIiApOworfQorCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgQkVfRVJSCWJlRW5jb2RlQ2h1bmsoSEJFX1NUUkVBTSBoYmVTdHJlYW0sIERXT1JEIG5TYW1wbGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hPUlQgcFNhbXBsZXMsIFBCWVRFIHBPdXRwdXQsIFBEV09SRCBwZHdPdXRwdXQpCit7CisgICAgLy8gRW5jb2RlIGl0CisgICAgaW50IGR3U2FtcGxlczsKKyAgICBpbnQJbk91dHB1dFNhbXBsZXMgPSAwOworICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKglnZnAgPSAobGFtZV9nbG9iYWxfZmxhZ3MqKWhiZVN0cmVhbTsKKworICAgIGR3U2FtcGxlcyA9IG5TYW1wbGVzIC8gbGFtZV9nZXRfbnVtX2NoYW5uZWxzKCBnZnAgKTsKKworICAgIC8vIG9sZCB2ZXJzaW9ucyBvZiBsYW1lX2VuYy5kbGwgcmVxdWlyZWQgZXhhY3RseSAxMTUyIHNhbXBsZXMKKyAgICAvLyBhbmQgd29ya2VkIGV2ZW4gaWYgblNhbXBsZXMgYWNjaWRlbnRseSBzZXQgdG8gMjMwNCAKKyAgICAvLyBzaW11bGF0ZSB0aGlzIGJlaGF2b2lyOgorICAgIGlmICggMSA9PSBsYW1lX2dldF9udW1fY2hhbm5lbHMoIGdmcCApICYmIG5TYW1wbGVzID09IDIzMDQpCisgICAgeworICAgICAgICBkd1NhbXBsZXMvPSAyOworICAgIH0KKworCisgICAgaWYgKCAxID09IGxhbWVfZ2V0X251bV9jaGFubmVscyggZ2ZwICkgKQorICAgIHsKKyAgICAgICAgbk91dHB1dFNhbXBsZXMgPSBsYW1lX2VuY29kZV9idWZmZXIoZ2ZwLHBTYW1wbGVzLHBTYW1wbGVzLGR3U2FtcGxlcyxwT3V0cHV0LDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuT3V0cHV0U2FtcGxlcyA9IGxhbWVfZW5jb2RlX2J1ZmZlcl9pbnRlcmxlYXZlZChnZnAscFNhbXBsZXMsZHdTYW1wbGVzLHBPdXRwdXQsMCk7CisgICAgfQorCisKKyAgICBpZiAoIG5PdXRwdXRTYW1wbGVzIDwgMCApCisgICAgeworICAgICAgICAqcGR3T3V0cHV0PTA7CisgICAgICAgIHJldHVybiBCRV9FUlJfQlVGRkVSX1RPT19TTUFMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBkd091dHB1dCA9IChEV09SRCluT3V0cHV0U2FtcGxlczsKKyAgICB9CisKKyAgICByZXR1cm4gQkVfRVJSX1NVQ0NFU1NGVUw7Cit9CisKKworLy8gYWNjZXB0IGZsb2F0aW5nIHBvaW50IGF1ZGlvIHNhbXBsZXMsIHNjYWxlZCB0byB0aGUgcmFuZ2Ugb2YgYSBzaWduZWQgMTYtYml0CisvLyAgaW50ZWdlciAod2l0aGluICsvLSAzMjc2OCksIGluIG5vbi1pbnRlcmxlYXZlZCBjaGFubmVscyAgLS0gRFNQZ3VydSwgamQKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBCRV9FUlIJYmVFbmNvZGVDaHVua0Zsb2F0UzE2TkkoSEJFX1NUUkVBTSBoYmVTdHJlYW0sIERXT1JEIG5TYW1wbGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZMT0FUIGJ1ZmZlcl9sLCBQRkxPQVQgYnVmZmVyX3IsIFBCWVRFIHBPdXRwdXQsIFBEV09SRCBwZHdPdXRwdXQpCit7CisgICAgaW50IG5PdXRwdXRTYW1wbGVzOworICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKglnZnAgPSAobGFtZV9nbG9iYWxfZmxhZ3MqKWhiZVN0cmVhbTsKKworICAgIG5PdXRwdXRTYW1wbGVzID0gbGFtZV9lbmNvZGVfYnVmZmVyX2Zsb2F0KGdmcCxidWZmZXJfbCxidWZmZXJfcixuU2FtcGxlcyxwT3V0cHV0LDApOworCisgICAgaWYgKCBuT3V0cHV0U2FtcGxlcyA+PSAwICkKKyAgICB7CisgICAgICAgICpwZHdPdXRwdXQgPSAoRFdPUkQpIG5PdXRwdXRTYW1wbGVzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcGR3T3V0cHV0PTA7CisgICAgICAgIHJldHVybiBCRV9FUlJfQlVGRkVSX1RPT19TTUFMTDsKKyAgICB9CisKKyAgICByZXR1cm4gQkVfRVJSX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQKK21heWJlU3luY1dvcmQoRklMRSogZnBTdHJlYW0pCit7CisgICAgdW5zaWduZWQgY2hhciBtcDNfZnJhbWVfaGVhZGVyWzRdOworICAgIHNpemVfdCBuYnl0ZXMgPSBmcmVhZChtcDNfZnJhbWVfaGVhZGVyLCAxLCBzaXplb2YobXAzX2ZyYW1lX2hlYWRlciksIGZwU3RyZWFtKTsKKyAgICBpZiAoIG5ieXRlcyAhPSBzaXplb2YobXAzX2ZyYW1lX2hlYWRlcikgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCBtcDNfZnJhbWVfaGVhZGVyWzBdICE9IDB4ZmZ1ICkgeworICAgICAgICByZXR1cm4gLTE7IC8qIGRvZXNuJ3QgbG9vayBsaWtlIGEgc3luYyB3b3JkICovCisgICAgfQorICAgIGlmICggKG1wM19mcmFtZV9oZWFkZXJbMV0gJiAweEUwdSkgIT0gMHhFMHUgKSB7CisgICAgICAgIHJldHVybiAtMTsgLyogZG9lc24ndCBsb29rIGxpa2UgYSBzeW5jIHdvcmQgKi8KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NraXBJZDN2MihGSUxFICogZnBTdHJlYW0sIHNpemVfdCBsYW1ldGFnX2ZyYW1lX3NpemUpCit7CisgICAgc2l6ZV90ICBuYnl0ZXM7CisgICAgc2l6ZV90ICBpZDN2MlRhZ1NpemUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgaWQzdjJIZWFkZXJbMTBdOworCisgICAgLyogc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0gKi8KKyAgICBpZiAoZnNlZWsoZnBTdHJlYW0sIDAsIFNFRUtfU0VUKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAtMjsgIC8qIG5vdCBzZWVrYWJsZSwgYWJvcnQgKi8KKyAgICB9CisgICAgLyogcmVhZCAxMCBieXRlcyBpbiBjYXNlIHRoZXJlJ3MgYW4gSUQzIHZlcnNpb24gMiBoZWFkZXIgaGVyZSAqLworICAgIG5ieXRlcyA9IGZyZWFkKGlkM3YySGVhZGVyLCAxLCBzaXplb2YoaWQzdjJIZWFkZXIpLCBmcFN0cmVhbSk7CisgICAgaWYgKG5ieXRlcyAhPSBzaXplb2YoaWQzdjJIZWFkZXIpKSB7CisgICAgICAgIHJldHVybiAtMzsgIC8qIG5vdCByZWFkYWJsZSwgbWF5YmUgb3BlbmVkIFdyaXRlLU9ubHkgKi8KKyAgICB9CisgICAgLyogZG9lcyB0aGUgc3RyZWFtIGJlZ2luIHdpdGggdGhlIElEMyB2ZXJzaW9uIDIgZmlsZSBpZGVudGlmaWVyPyAqLworICAgIGlmICghc3RybmNtcCgoY2hhciAqKSBpZDN2MkhlYWRlciwgIklEMyIsIDMpKSB7CisgICAgICAgIC8qIHRoZSB0YWcgc2l6ZSAobWludXMgdGhlIDEwLWJ5dGUgaGVhZGVyKSBpcyBlbmNvZGVkIGludG8gZm91cgorICAgICAgICAqIGJ5dGVzIHdoZXJlIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBjbGVhciBpbiBlYWNoIGJ5dGUKKyAgICAgICAgKi8KKyAgICAgICAgaWQzdjJUYWdTaXplID0gKCgoaWQzdjJIZWFkZXJbNl0gJiAweDdmKSA8PCAyMSkKKyAgICAgICAgICAgIHwgKChpZDN2MkhlYWRlcls3XSAmIDB4N2YpIDw8IDE0KQorICAgICAgICAgICAgfCAoKGlkM3YySGVhZGVyWzhdICYgMHg3ZikgPDwgNykKKyAgICAgICAgICAgIHwgKGlkM3YySGVhZGVyWzldICYgMHg3ZikpCisgICAgICAgICAgICArIHNpemVvZiBpZDN2MkhlYWRlcjsKKyAgICB9CisgICAgLyogU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KKyAgICBpZiAoIGZzZWVrKGZwU3RyZWFtLCBpZDN2MlRhZ1NpemUsIFNFRUtfU0VUKSAhPSAwICkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorICAgIGlmICggbWF5YmVTeW5jV29yZChmcFN0cmVhbSkgIT0gMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggZnNlZWsoZnBTdHJlYW0sIGlkM3YyVGFnU2l6ZStsYW1ldGFnX2ZyYW1lX3NpemUsIFNFRUtfU0VUKSAhPSAwICkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorICAgIGlmICggbWF5YmVTeW5jV29yZChmcFN0cmVhbSkgIT0gMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIE9LLCBpdCBzZWVtcyB3ZSBmb3VuZCBvdXIgTEFNRS1UYWcvWGluZyBmcmFtZSBhZ2FpbiAqLworICAgIC8qIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gc3RyZWFtICovCisgICAgaWYgKCBmc2VlayhmcFN0cmVhbSwgaWQzdjJUYWdTaXplLCBTRUVLX1NFVCkgIT0gMCApIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEJFX0VSUgordXBkYXRlTGFtZVRhZ0ZyYW1lKGxhbWVfZ2xvYmFsX2ZsYWdzKiBnZnAsIEZJTEUqIGZwU3RyZWFtKQoreworICAgIHNpemVfdCBuID0gbGFtZV9nZXRfbGFtZXRhZ19mcmFtZSggZ2ZwLCAwLCAwICk7IC8qIGFzayBmb3IgYnVmZXIgc2l6ZSAqLworCisgICAgaWYgKCBuID4gMCApCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIgPSAwOworICAgICAgICBzaXplX3QgbSA9IDE7CisKKyAgICAgICAgaWYgKCAwICE9IHNraXBJZDN2MihmcFN0cmVhbSwgbikgKSAKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcEVyciggIkVycm9yIHVwZGF0aW5nIExBTUUtdGFnIGZyYW1lOlxuXG4iCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9jYXRlIG9sZCBmcmFtZVxuIiApOworICAgICAgICAgICAgcmV0dXJuIEJFX0VSUl9JTlZBTElEX0ZPUk1BVF9QQVJBTUVURVJTOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gbWFsbG9jKCBuICk7CisKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gMCApIAorICAgICAgICB7CisgICAgICAgICAgICBEaXNwRXJyKCAiRXJyb3IgdXBkYXRpbmcgTEFNRS10YWcgZnJhbWU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBhbGxvY2F0ZSBmcmFtZSBidWZmZXJcbiIgKTsKKyAgICAgICAgICAgIHJldHVybiBCRV9FUlJfSU5WQUxJRF9GT1JNQVRfUEFSQU1FVEVSUzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFB1dCBpdCBhbGwgdG8gZGlzayBhZ2FpbiAqLworICAgICAgICBuID0gbGFtZV9nZXRfbGFtZXRhZ19mcmFtZSggZ2ZwLCBidWZmZXIsIG4gKTsKKyAgICAgICAgaWYgKCBuID4gMCApIAorICAgICAgICB7CisgICAgICAgICAgICBtID0gZndyaXRlKCBidWZmZXIsIG4sIDEsIGZwU3RyZWFtICk7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBmcmVlKCBidWZmZXIgKTsKKworICAgICAgICBpZiAoIG0gIT0gMSApIAorICAgICAgICB7CisgICAgICAgICAgICBEaXNwRXJyKCAiRXJyb3IgdXBkYXRpbmcgTEFNRS10YWcgZnJhbWU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCB3cml0ZSBmcmFtZSBpbnRvIGZpbGVcbiIgKTsKKyAgICAgICAgICAgIHJldHVybiBCRV9FUlJfSU5WQUxJRF9GT1JNQVRfUEFSQU1FVEVSUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkVfRVJSX1NVQ0NFU1NGVUw7Cit9CisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBCRV9FUlIgYmVXcml0ZUluZm9UYWcoIEhCRV9TVFJFQU0gaGJlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBzekZpbGVOYW1lICkKK3sKKyAgICBGSUxFKiBmcFN0cmVhbQk9IE5VTEw7CisgICAgQkVfRVJSIGJlUmVzdWx0CT0gQkVfRVJSX1NVQ0NFU1NGVUw7CisKKyAgICBsYW1lX2dsb2JhbF9mbGFncyoJZ2ZwID0gKGxhbWVfZ2xvYmFsX2ZsYWdzKiloYmVTdHJlYW07CisKKyAgICBpZiAoIE5VTEwgIT0gZ2ZwICkKKyAgICB7CisgICAgICAgIC8vIERvIHdlIGhhdmUgdG8gd3JpdGUgdGhlIFZCUiB0YWc/CisgICAgICAgIGlmICggbGFtZV9nZXRfYldyaXRlVmJyVGFnKCBnZnAgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBmaWxlCisgICAgICAgICAgICBmcFN0cmVhbT1mb3BlbiggbHBzekZpbGVOYW1lLCAicmIrIiApOworCisgICAgICAgICAgICAvLyBDaGVjayBmaWxlIG9wZW4gcmVzdWx0CisgICAgICAgICAgICBpZiAoIE5VTEwgPT0gZnBTdHJlYW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlUmVzdWx0ID0gQkVfRVJSX0lOVkFMSURfRk9STUFUX1BBUkFNRVRFUlM7CisgICAgICAgICAgICAgICAgRGlzcEVyciggIkVycm9yIHVwZGF0aW5nIExBTUUtdGFnIGZyYW1lOlxuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IG9wZW4gZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlUmVzdWx0ID0gdXBkYXRlTGFtZVRhZ0ZyYW1lKCBnZnAsIGZwU3RyZWFtICk7CisKKyAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZmlsZSBzdHJlYW0KKyAgICAgICAgICAgICAgICBmY2xvc2UoIGZwU3RyZWFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjbGVhbiB1cCBvZiBhbGxvY2F0ZWQgbWVtb3J5CisgICAgICAgIGxhbWVfY2xvc2UoIGdmcCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiZVJlc3VsdCA9IEJFX0VSUl9JTlZBTElEX0ZPUk1BVF9QQVJBTUVURVJTOworICAgIH0KKworICAgIC8vIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gYmVSZXN1bHQ7Cit9CisKKy8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJsaXR5CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgQkVfRVJSIGJlV3JpdGVWQlJIZWFkZXIoTFBDU1RSIGxwc3pGaWxlTmFtZSkKK3sKKyAgICByZXR1cm4gYmVXcml0ZUluZm9UYWcoIChIQkVfU1RSRUFNKWdmcF9zYXZlLCBscHN6RmlsZU5hbWUgKTsKK30KKworCitCT09MIEFQSUVOVFJZIERsbE1haW4oSEFORExFIGhNb2R1bGUsIAorICAgICAgICAgICAgICAgICAgICAgIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsIAorICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkKQoreworICAgIGdzX2hNb2R1bGU9aE1vZHVsZTsKKworICAgIHN3aXRjaCggdWxfcmVhc29uX2Zvcl9jYWxsICkKKyAgICB7CisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgIC8vIEVuYWJsZSBkZWJ1Zy9sb2dnaW5nPworICAgICAgICBnc19iTG9nRmlsZSA9IEdldFByaXZhdGVQcm9maWxlSW50QSgiRGVidWciLCJXcml0ZUxvZ0ZpbGUiLGdzX2JMb2dGaWxlLCJsYW1lX2VuYy5pbmkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfVEhSRUFEX0FUVEFDSDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgdm9pZCBkdW1wX2NvbmZpZyggCWxhbWVfZ2xvYmFsX2ZsYWdzKglnZnAgKQoreworICAgIERlYnVnUHJpbnRmKCJcblxuTGFtZV9lbmMgY29uZmlndXJhdGlvbiBvcHRpb25zOlxuIik7CisgICAgRGVidWdQcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisgICAgRGVidWdQcmludGYoInZlcnNpb24gICAgICAgICAgICAgICAgPSVkXG4iLGxhbWVfZ2V0X3ZlcnNpb24oIGdmcCApICk7CisgICAgRGVidWdQcmludGYoIkxheWVyICAgICAgICAgICAgICAgICAgPTNcbiIpOworICAgIERlYnVnUHJpbnRmKCJtb2RlICAgICAgICAgICAgICAgICAgID0iKTsKKyAgICBzd2l0Y2ggKCBsYW1lX2dldF9tb2RlKCBnZnAgKSApCisgICAgeworICAgIGNhc2UgU1RFUkVPOiAgICAgICBEZWJ1Z1ByaW50ZiggIlN0ZXJlb1xuIiApOyBicmVhazsKKyAgICBjYXNlIEpPSU5UX1NURVJFTzogRGVidWdQcmludGYoICJKb2ludC1TdGVyZW9cbiIgKTsgYnJlYWs7CisgICAgY2FzZSBEVUFMX0NIQU5ORUw6IERlYnVnUHJpbnRmKCAiRm9yY2VkIFN0ZXJlb1xuIiApOyBicmVhazsKKyAgICBjYXNlIE1PTk86ICAgICAgICAgRGVidWdQcmludGYoICJNb25vXG4iICk7IGJyZWFrOworICAgIGNhc2UgTk9UX1NFVDogICAgICAvKiBGQUxMVFJPVUdIICovCisgICAgZGVmYXVsdDogICAgICAgICAgIERlYnVnUHJpbnRmKCAiRXJyb3IgKHVua25vd24pXG4iICk7IGJyZWFrOworICAgIH0KKworICAgIERlYnVnUHJpbnRmKCJJbnB1dCBzYW1wbGUgcmF0ZSAgICAgID0lLjFmIGtIelxuIiwgbGFtZV9nZXRfaW5fc2FtcGxlcmF0ZSggZ2ZwICkgLzEwMDAuMCApOworICAgIERlYnVnUHJpbnRmKCJPdXRwdXQgc2FtcGxlIHJhdGUgICAgID0lLjFmIGtIelxuIiwgbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoIGdmcCApIC8xMDAwLjAgKTsKKworICAgIERlYnVnUHJpbnRmKCJiaXRyYXRlICAgICAgICAgICAgICAgID0lZCBrYnBzXG4iLCBsYW1lX2dldF9icmF0ZSggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiUXVhbGl0eSBTZXR0aW5nICAgICAgICA9JWRcbiIsIGxhbWVfZ2V0X3F1YWxpdHkoIGdmcCApICk7CisKKyAgICBEZWJ1Z1ByaW50ZigiTG93IHBhc3MgZnJlcXVlbmN5ICAgICA9JWRcbiIsIGxhbWVfZ2V0X2xvd3Bhc3NmcmVxKCBnZnAgKSApOworICAgIERlYnVnUHJpbnRmKCJMb3cgcGFzcyB3aWR0aCAgICAgICAgID0lZFxuIiwgbGFtZV9nZXRfbG93cGFzc3dpZHRoKCBnZnAgKSApOworCisgICAgRGVidWdQcmludGYoIkhpZ2ggcGFzcyBmcmVxdWVuY3kgICAgPSVkXG4iLCBsYW1lX2dldF9oaWdocGFzc2ZyZXEoIGdmcCApICk7CisgICAgRGVidWdQcmludGYoIkhpZ2ggcGFzcyB3aWR0aCAgICAgICAgPSVkXG4iLCBsYW1lX2dldF9oaWdocGFzc3dpZHRoKCBnZnAgKSApOworCisgICAgRGVidWdQcmludGYoIk5vIHNob3J0IGJsb2NrcyAgICAgICAgPSVkXG4iLCBsYW1lX2dldF9ub19zaG9ydF9ibG9ja3MoIGdmcCApICk7CisgICAgRGVidWdQcmludGYoIkZvcmNlIHNob3J0IGJsb2NrcyAgICAgPSVkXG4iLCBsYW1lX2dldF9mb3JjZV9zaG9ydF9ibG9ja3MoIGdmcCApICk7CisKKyAgICBEZWJ1Z1ByaW50ZigiZGUtZW1waGFzaXMgICAgICAgICAgICA9JWRcbiIsIGxhbWVfZ2V0X2VtcGhhc2lzKCBnZnAgKSApOworICAgIERlYnVnUHJpbnRmKCJwcml2YXRlIGZsYWcgICAgICAgICAgID0lZFxuIiwgbGFtZV9nZXRfZXh0ZW5zaW9uKCBnZnAgKSApOworCisgICAgRGVidWdQcmludGYoImNvcHlyaWdodCBmbGFnICAgICAgICAgPSVkXG4iLCBsYW1lX2dldF9jb3B5cmlnaHQoIGdmcCApICk7CisgICAgRGVidWdQcmludGYoIm9yaWdpbmFsIGZsYWcgICAgICAgICAgPSVkXG4iLAlsYW1lX2dldF9vcmlnaW5hbCggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiQ1JDICAgICAgICAgICAgICAgICAgICA9JXNcbiIsIGxhbWVfZ2V0X2Vycm9yX3Byb3RlY3Rpb24oIGdmcCApID8gIm9uIiA6ICJvZmYiICk7CisgICAgRGVidWdQcmludGYoIkZhc3QgbW9kZSAgICAgICAgICAgICAgPSVzXG4iLCAoIGxhbWVfZ2V0X3F1YWxpdHkoIGdmcCApICk/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIgKTsKKyAgICBEZWJ1Z1ByaW50ZigiRm9yY2UgbWlkL3NpZGUgc3RlcmVvICA9JXNcbiIsICggbGFtZV9nZXRfZm9yY2VfbXMoIGdmcCApICk/ImVuYWJsZWQiOiJkaXNhYmxlZCIgKTsKKyAgICBEZWJ1Z1ByaW50ZigiRGlzYWJsZSBSZXNlcnZvaXIgICAgICA9JWRcbiIsIGxhbWVfZ2V0X2Rpc2FibGVfcmVzZXJ2b2lyKCBnZnAgKSApOworICAgIERlYnVnUHJpbnRmKCJBbGxvdyBkaWZmLXNob3J0ICAgICAgID0lZFxuIiwgbGFtZV9nZXRfYWxsb3dfZGlmZl9zaG9ydCggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiSW50ZXJjaGFubmVsIG1hc2tpbmcgICA9JWZcbiIsIGxhbWVfZ2V0X2ludGVyQ2hSYXRpbyggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiU3RyaWN0IElTTyBFbmNvZGluZyAgICA9JXNcbiIsICggbGFtZV9nZXRfc3RyaWN0X0lTTyggZ2ZwICkgKSA/IlllcyI6Ik5vIik7CisgICAgRGVidWdQcmludGYoIlNjYWxlICAgICAgICAgICAgICAgICAgPSU1LjJmXG4iLCBsYW1lX2dldF9zY2FsZSggZ2ZwICkgKTsKKworICAgIERlYnVnUHJpbnRmKCJWQlIgICAgICAgICAgICAgICAgICAgID0lcywgVkJSX3EgPSVkLCBWQlIgbWV0aG9kID0iLAorICAgICAgICAoIGxhbWVfZ2V0X1ZCUiggZ2ZwICkgIT12YnJfb2ZmICkgPyAiZW5hYmxlZCI6ICJkaXNhYmxlZCIsCisgICAgICAgIGxhbWVfZ2V0X1ZCUl9xKCBnZnAgKSApOworCisgICAgc3dpdGNoICggbGFtZV9nZXRfVkJSKCBnZnAgKSApCisgICAgeworICAgIGNhc2UgdmJyX29mZjoJRGVidWdQcmludGYoICJ2YnJfb2ZmXG4iICk7CWJyZWFrOworICAgIGNhc2UgdmJyX210IDoJRGVidWdQcmludGYoICJ2YnJfbXQgXG4iICk7CWJyZWFrOworICAgIGNhc2UgdmJyX3JoIDoJRGVidWdQcmludGYoICJ2YnJfcmggXG4iICk7CWJyZWFrOworICAgIGNhc2UgdmJyX210cmg6CURlYnVnUHJpbnRmKCAidmJyX210cmggXG4iICk7CWJyZWFrOworICAgIGNhc2UgdmJyX2FicjogCisgICAgICAgIERlYnVnUHJpbnRmKCAidmJyX2FiciAoYXZlcmFnZSBiaXRyYXRlICVkIGticHMpXG4iLCBsYW1lX2dldF9WQlJfbWVhbl9iaXRyYXRlX2ticHMoIGdmcCApICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIERlYnVnUHJpbnRmKCJlcnJvciwgdW5rbm93biBWQlIgc2V0dGluZ1xuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIERlYnVnUHJpbnRmKCJWYnIgTWluIGJpdHJhdGUgICAgICAgID0lZCBrYnBzXG4iLCBsYW1lX2dldF9WQlJfbWluX2JpdHJhdGVfa2JwcyggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiVmJyIE1heCBiaXRyYXRlICAgICAgICA9JWQga2Jwc1xuIiwgbGFtZV9nZXRfVkJSX21heF9iaXRyYXRlX2ticHMoIGdmcCApICk7CisKKyAgICBEZWJ1Z1ByaW50ZigiV3JpdGUgVkJSIEhlYWRlciAgICAgICA9JXNcbiIsICggbGFtZV9nZXRfYldyaXRlVmJyVGFnKCBnZnAgKSApID8iWWVzIjoiTm8iKTsKKyAgICBEZWJ1Z1ByaW50ZigiVkJSIEhhcmQgbWluICAgICAgICAgICA9JWRcbiIsIGxhbWVfZ2V0X1ZCUl9oYXJkX21pbiggZ2ZwICkgKTsKKworICAgIERlYnVnUHJpbnRmKCJBVEggT25seSAgICAgICAgICAgICAgID0lZFxuIiwgbGFtZV9nZXRfQVRIb25seSggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiQVRIIHNob3J0ICAgICAgICAgICAgICA9JWRcbiIsIGxhbWVfZ2V0X0FUSHNob3J0KCBnZnAgKSApOworICAgIERlYnVnUHJpbnRmKCJBVEggbm8gICAgICAgICAgICAgICAgID0lZFxuIiwgbGFtZV9nZXRfbm9BVEgoIGdmcCApICk7CisgICAgRGVidWdQcmludGYoIkFUSCB0eXBlICAgICAgICAgICAgICAgPSVkXG4iLCBsYW1lX2dldF9BVEh0eXBlKCBnZnAgKSApOworICAgIERlYnVnUHJpbnRmKCJBVEggbG93ZXIgICAgICAgICAgICAgID0lZlxuIiwgbGFtZV9nZXRfQVRIbG93ZXIoIGdmcCApICk7CisgICAgRGVidWdQcmludGYoIkFUSCBhYSAgICAgICAgICAgICAgICAgPSVkXG4iLCBsYW1lX2dldF9hdGhhYV90eXBlKCBnZnAgKSApOworICAgIERlYnVnUHJpbnRmKCJBVEggYWEgIGxvdWRhcHByb3ggICAgID0lZFxuIiwgbGFtZV9nZXRfYXRoYWFfbG91ZGFwcHJveCggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiQVRIIGFhICBzZW5zaXRpdml0eSAgICA9JWZcbiIsIGxhbWVfZ2V0X2F0aGFhX3NlbnNpdGl2aXR5KCBnZnAgKSApOworCisgICAgRGVidWdQcmludGYoIkV4cGVyaW1lbnRhbCBuc3BzeXR1bmUgPSVkXG4iLCBsYW1lX2dldF9leHBfbnNwc3l0dW5lKCBnZnAgKSApOworICAgIERlYnVnUHJpbnRmKCJFeHBlcmltZW50YWwgWCAgICAgICAgID0lZFxuIiwgbGFtZV9nZXRfZXhwZXJpbWVudGFsWCggZ2ZwICkgKTsKKyAgICBEZWJ1Z1ByaW50ZigiRXhwZXJpbWVudGFsIFkgICAgICAgICA9JWRcbiIsIGxhbWVfZ2V0X2V4cGVyaW1lbnRhbFkoIGdmcCApICk7CisgICAgRGVidWdQcmludGYoIkV4cGVyaW1lbnRhbCBaICAgICAgICAgPSVkXG4iLCBsYW1lX2dldF9leHBlcmltZW50YWxaKCBnZnAgKSApOworfQorCisKK3N0YXRpYyB2b2lkIERpc3BFcnIoY2hhciBjb25zdCogc3RyRXJyKQoreworICAgIE1lc3NhZ2VCb3hBKE5VTEwsc3RyRXJyLCJMQU1FX0VOQy5ETEwiLE1CX09LfE1CX0lDT05IQU5EKTsKK30KZGlmZiAtLWdpdCBhL0RsbC9CbGFkZU1QM0VuY0RMTC5kZWYgYi9EbGwvQmxhZGVNUDNFbmNETEwuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODM0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9EbGwvQmxhZGVNUDNFbmNETEwuZGVmCkBAIC0wLDAgKzEsMzYgQEAKK0xJQlJBUlkgIGxhbWVfZW5jLkRMTAorRVhQT1JUUworCitiZUluaXRTdHJlYW0JCQlAMQorYmVFbmNvZGVDaHVuawkJCUAyCitiZURlaW5pdFN0cmVhbQkJCUAzCitiZUNsb3NlU3RyZWFtCQkJQDQKK2JlVmVyc2lvbgkJCQlANQorYmVXcml0ZVZCUkhlYWRlcgkJQDYKK2JlRW5jb2RlQ2h1bmtGbG9hdFMxNk5JCUA3CitiZUZsdXNoTm9HYXAJCQlAOAorYmVXcml0ZUluZm9UYWcJCQlAOQorCitsYW1lX2luaXQJCQkJCQlAMTAwCitsYW1lX2Nsb3NlCQkJCQkJQDEwMQorbGFtZV9pbml0X3BhcmFtcwkJCQlAMTAyCitsYW1lX2VuY29kZV9idWZmZXJfaW50ZXJsZWF2ZWQJQDExMAorbGFtZV9lbmNvZGVfZmx1c2gJCQkJQDEyMAorbGFtZV9tcDNfdGFnc19maWQJCQkJQDEzMAorCisKK2xhbWVfc2V0X251bV9zYW1wbGVzCQkJQDEwMDAKK2xhbWVfZ2V0X251bV9zYW1wbGVzCQkJQDEwMDEKK2xhbWVfc2V0X2luX3NhbXBsZXJhdGUJCQlAMTAwMgorbGFtZV9nZXRfaW5fc2FtcGxlcmF0ZQkJCUAxMDAzCitsYW1lX3NldF9udW1fY2hhbm5lbHMJCQlAMTAwNAorbGFtZV9nZXRfbnVtX2NoYW5uZWxzCQkJQDEwMDUKK2xhbWVfc2V0X3NjYWxlCQkJCQlAMTAwNgorbGFtZV9nZXRfc2NhbGUJCQkJCUAxMDA3CitsYW1lX3NldF9zY2FsZV9sZWZ0CQkJCUAxMDA4CitsYW1lX2dldF9zY2FsZV9sZWZ0CQkJCUAxMDA5CitsYW1lX3NldF9zY2FsZV9yaWdodAkJCUAxMDEwCitsYW1lX2dldF9zY2FsZV9yaWdodAkJCUAxMDExCitsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZQkJCUAxMDEyCitsYW1lX2dldF9vdXRfc2FtcGxlcmF0ZQkJCUAxMDEzCisKZGlmZiAtLWdpdCBhL0RsbC9CbGFkZU1QM0VuY0RMTC5oIGIvRGxsL0JsYWRlTVAzRW5jRExMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5NDk1MQotLS0gL2Rldi9udWxsCisrKyBiL0RsbC9CbGFkZU1QM0VuY0RMTC5oCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQmxhZGUgVHlwZSBvZiBETEwgSW50ZXJmYWNlIGZvciBMYW1lIGVuY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBBLkwuIEZhYmVyCisgKiBCYXNlZCBvbiBibGFkZWRsbC5oIHZlcnNpb24gMS4wIHdyaXR0ZW4gYnkgSnVra2EgUG9pa29sYWluZW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fX0JMQURFRExMX0hfSU5DTFVERURfX18KKyNkZWZpbmUgX19fQkxBREVETExfSF9JTkNMVURFRF9fXworCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgQVRUUklCVVRFX1BBQ0tFRAlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2Vsc2UKKyNkZWZpbmUgQVRUUklCVVRFX1BBQ0tFRAorI3ByYWdtYSBwYWNrKHB1c2gpCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIGVuY29kaW5nIGZvcm1hdHMgKi8KKworI2RlZmluZQkJQkVfQ09ORklHX01QMwkJCTAJCQkJCQkJCQkJCisjZGVmaW5lCQlCRV9DT05GSUdfTEFNRQkJCTI1NgkJCisKKy8qIHR5cGUgZGVmaW5pdGlvbnMgKi8KKwordHlwZWRlZgkJdW5zaWduZWQgbG9uZwkJCUhCRV9TVFJFQU07Cit0eXBlZGVmCQlIQkVfU1RSRUFNCQkJCSpQSEJFX1NUUkVBTTsKK3R5cGVkZWYJCXVuc2lnbmVkIGxvbmcJCQlCRV9FUlI7CisKKy8qIGVycm9yIGNvZGVzICovCisKKyNkZWZpbmUJCUJFX0VSUl9TVUNDRVNTRlVMCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lCQlCRV9FUlJfSU5WQUxJRF9GT1JNQVQJCQkJMHgwMDAwMDAwMQorI2RlZmluZQkJQkVfRVJSX0lOVkFMSURfRk9STUFUX1BBUkFNRVRFUlMJMHgwMDAwMDAwMgorI2RlZmluZQkJQkVfRVJSX05PX01PUkVfSEFORExFUwkJCQkweDAwMDAwMDAzCisjZGVmaW5lCQlCRV9FUlJfSU5WQUxJRF9IQU5ETEUJCQkJMHgwMDAwMDAwNAorI2RlZmluZQkJQkVfRVJSX0JVRkZFUl9UT09fU01BTEwJCQkJMHgwMDAwMDAwNQorCisvKiBvdGhlciBjb25zdGFudHMgKi8KKworI2RlZmluZQkJQkVfTUFYX0hPTUVQQUdFCQkJMTI4CisKKy8qIGZvcm1hdCBzcGVjaWZpYyB2YXJpYWJsZXMgKi8KKworI2RlZmluZQkJQkVfTVAzX01PREVfU1RFUkVPCQkwCisjZGVmaW5lCQlCRV9NUDNfTU9ERV9KU1RFUkVPCQkxCisjZGVmaW5lCQlCRV9NUDNfTU9ERV9EVUFMQ0hBTk5FTAkyCisjZGVmaW5lCQlCRV9NUDNfTU9ERV9NT05PCQkzCisKKworCisjZGVmaW5lCQlNUEVHMQkxCisjZGVmaW5lCQlNUEVHMgkwCisKKyNpZmRlZiBfQkxBREVETEwKKyN1bmRlZiBGTE9BVAorCSNpbmNsdWRlIDxXaW5kb3dzLmg+CisjZW5kaWYKKworI2RlZmluZSBDVVJSRU5UX1NUUlVDVF9WRVJTSU9OIDEKKyNkZWZpbmUgQ1VSUkVOVF9TVFJVQ1RfU0laRSBzaXplb2YoQkVfQ09ORklHKQkvLyBpcyBjdXJyZW50bHkgMzMxIGJ5dGVzCisKKwordHlwZWRlZiBlbnVtCit7CisJVkJSX01FVEhPRF9OT05FCQkJPSAtMSwKKwlWQlJfTUVUSE9EX0RFRkFVTFQJCT0gIDAsCisJVkJSX01FVEhPRF9PTEQJCQk9ICAxLAorCVZCUl9NRVRIT0RfTkVXCQkJPSAgMiwKKwlWQlJfTUVUSE9EX01UUkgJCQk9ICAzLAorCVZCUl9NRVRIT0RfQUJSCQkJPSAgNAorfSBWQlJNRVRIT0Q7CisKK3R5cGVkZWYgZW51bSAKK3sKKwlMUVBfTk9QUkVTRVQJCQk9LTEsCisKKwkvLyBRVUFMSVRZIFBSRVNFVFMKKwlMUVBfTk9STUFMX1FVQUxJVFkJCT0gMCwKKwlMUVBfTE9XX1FVQUxJVFkJCQk9IDEsCisJTFFQX0hJR0hfUVVBTElUWQkJPSAyLAorCUxRUF9WT0lDRV9RVUFMSVRZCQk9IDMsCisJTFFQX1IzTUlYCQkJCT0gNCwKKwlMUVBfVkVSWUhJR0hfUVVBTElUWQk9IDUsCisJTFFQX1NUQU5EQVJECQkJPSA2LAorCUxRUF9GQVNUX1NUQU5EQVJECQk9IDcsCisJTFFQX0VYVFJFTUUJCQkJPSA4LAorCUxRUF9GQVNUX0VYVFJFTUUJCT0gOSwKKwlMUVBfSU5TQU5FCQkJCT0gMTAsCisJTFFQX0FCUgkJCQkJPSAxMSwKKwlMUVBfQ0JSCQkJCQk9IDEyLAorCUxRUF9NRURJVU0JCQkJPSAxMywKKwlMUVBfRkFTVF9NRURJVU0JCQk9IDE0LAorCisJLy8gTkVXIFBSRVNFVCBWQUxVRVMKKwlMUVBfUEhPTkUJPTEwMDAsCisJTFFQX1NXCQk9MjAwMCwKKwlMUVBfQU0JCT0zMDAwLAorCUxRUF9GTQkJPTQwMDAsCisJTFFQX1ZPSUNFCT01MDAwLAorCUxRUF9SQURJTwk9NjAwMCwKKwlMUVBfVEFQRQk9NzAwMCwKKwlMUVBfSElGSQk9ODAwMCwKKwlMUVBfQ0QJCT05MDAwLAorCUxRUF9TVFVESU8JPTEwMDAwCisKK30gTEFNRV9RVUFMSVRZX1BSRVNFVDsKKworCisKK3R5cGVkZWYgc3RydWN0CXsKKwlEV09SRAlkd0NvbmZpZzsJCQkvLyBCRV9DT05GSUdfWFhYWFgKKwkJCQkJCQkJLy8gQ3VycmVudGx5IG9ubHkgQkVfQ09ORklHX01QMyBpcyBzdXBwb3J0ZWQKKwl1bmlvbgl7CisKKwkJc3RydWN0CXsKKworCQkJRFdPUkQJZHdTYW1wbGVSYXRlOwkJLy8gNDgwMDAsIDQ0MTAwIGFuZCAzMjAwMCBhbGxvd2VkCisJCQlCWVRFCWJ5TW9kZTsJCQkvLyBCRV9NUDNfTU9ERV9TVEVSRU8sIEJFX01QM19NT0RFX0RVQUxDSEFOTkVMLCBCRV9NUDNfTU9ERV9NT05PCisJCQlXT1JECXdCaXRyYXRlOwkJLy8gMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYgYW5kIDMyMCBhbGxvd2VkCisJCQlCT09MCWJQcml2YXRlOwkJCisJCQlCT09MCWJDUkM7CisJCQlCT09MCWJDb3B5cmlnaHQ7CisJCQlCT09MCWJPcmlnaW5hbDsKKworCQkJfSBtcDM7CQkJCQkvLyBCRV9DT05GSUdfTVAzCisKKwkJCXN0cnVjdAorCQkJeworCQkJLy8gU1RSVUNUVVJFIElORk9STUFUSU9OCisJCQlEV09SRAkJCWR3U3RydWN0VmVyc2lvbjsJCisJCQlEV09SRAkJCWR3U3RydWN0U2l6ZTsKKworCQkJLy8gQkFTSUMgRU5DT0RFUiBTRVRUSU5HUworCQkJRFdPUkQJCQlkd1NhbXBsZVJhdGU7CQkvLyBTQU1QTEVSQVRFIE9GIElOUFVUIEZJTEUKKwkJCURXT1JECQkJZHdSZVNhbXBsZVJhdGU7CQkvLyBET1dOU0FNUExFUkFURSwgMD1FTkNPREVSIERFQ0lERVMgIAorCQkJTE9ORwkJCW5Nb2RlOwkJCQkvLyBCRV9NUDNfTU9ERV9TVEVSRU8sIEJFX01QM19NT0RFX0RVQUxDSEFOTkVMLCBCRV9NUDNfTU9ERV9NT05PCisJCQlEV09SRAkJCWR3Qml0cmF0ZTsJCQkvLyBDQlIgYml0cmF0ZSwgVkJSIG1pbiBiaXRyYXRlCisJCQlEV09SRAkJCWR3TWF4Qml0cmF0ZTsJCS8vIENCUiBpZ25vcmVkLCBWQlIgTWF4IGJpdHJhdGUKKwkJCUxPTkcJCQluUHJlc2V0OwkJCS8vIFF1YWxpdHkgcHJlc2V0LCB1c2Ugb25lIG9mIHRoZSBzZXR0aW5ncyBvZiB0aGUgTEFNRV9RVUFMSVRZX1BSRVNFVCBlbnVtCisJCQlEV09SRAkJCWR3TXBlZ1ZlcnNpb247CQkvLyBGVVRVUkUgVVNFLCBNUEVHLTEgT1IgTVBFRy0yCisJCQlEV09SRAkJCWR3UHN5TW9kZWw7CQkJLy8gRlVUVVJFIFVTRSwgU0VUIFRPIDAKKwkJCURXT1JECQkJZHdFbXBoYXNpczsJCQkvLyBGVVRVUkUgVVNFLCBTRVQgVE8gMAorCisJCQkvLyBCSVQgU1RSRUFNIFNFVFRJTkdTCisJCQlCT09MCQkJYlByaXZhdGU7CQkJLy8gU2V0IFByaXZhdGUgQml0IChUUlVFL0ZBTFNFKQorCQkJQk9PTAkJCWJDUkM7CQkJCS8vIEluc2VydCBDUkMgKFRSVUUvRkFMU0UpCisJCQlCT09MCQkJYkNvcHlyaWdodDsJCQkvLyBTZXQgQ29weXJpZ2h0IEJpdCAoVFJVRS9GQUxTRSkKKwkJCUJPT0wJCQliT3JpZ2luYWw7CQkJLy8gU2V0IE9yaWdpbmFsIEJpdCAoVFJVRS9GQUxTRSkKKwkJCQorCQkJLy8gVkJSIFNUVUZGCisJCQlCT09MCQkJYldyaXRlVkJSSGVhZGVyOwkvLyBXUklURSBYSU5HIFZCUiBIRUFERVIgKFRSVUUvRkFMU0UpCisJCQlCT09MCQkJYkVuYWJsZVZCUjsJCQkvLyBVU0UgVkJSIEVOQ09ESU5HIChUUlVFL0ZBTFNFKQorCQkJSU5UCQkJCW5WQlJRdWFsaXR5OwkJLy8gVkJSIFFVQUxJVFkgMC4uOQorCQkJRFdPUkQJCQlkd1ZickFicl9icHM7CQkvLyBVc2UgQUJSIGluIHN0ZWFkIG9mIG5WQlJRdWFsaXR5CisJCQlWQlJNRVRIT0QJCW5WYnJNZXRob2Q7CisJCQlCT09MCQkJYk5vUmVzOwkJCQkvLyBEaXNhYmxlIEJpdCByZXNvcnZvaXIgKFRSVUUvRkFMU0UpCisKKwkJCS8vIE1JU0MgU0VUVElOR1MKKwkJCUJPT0wJCQliU3RyaWN0SXNvOwkJCS8vIFVzZSBzdHJpY3QgSVNPIGVuY29kaW5nIHJ1bGVzIChUUlVFL0ZBTFNFKQorCQkJV09SRAkJCW5RdWFsaXR5OwkJCS8vIFF1YWxpdHkgU2V0dGluZywgSElHSCBCWVRFIHNob3VsZCBiZSBOT1QgTE9XIGJ5dGUsIG90aGVyd2hpc2UgcXVhbGl0eT01CisKKwkJCS8vIEZVVFVSRSBVU0UsIFNFVCBUTyAwLCBhbGlnbiBzdHJ1Y3V0cmUgdG8gMzMxIGJ5dGVzCisJCQlCWVRFCQkJYnRSZXNlcnZlZFsyNTUtNCpzaXplb2YoRFdPUkQpIC0gc2l6ZW9mKCBXT1JEICldOworCisJCQl9IExIVjE7CQkJCQkvLyBMQU1FIGhlYWRlciB2ZXJzaW9uIDEKKworCQlzdHJ1Y3QJeworCisJCQlEV09SRAlkd1NhbXBsZVJhdGU7CisJCQlCWVRFCWJ5TW9kZTsKKwkJCVdPUkQJd0JpdHJhdGU7CisJCQlCWVRFCWJ5RW5jb2RpbmdNZXRob2Q7CisKKwkJfSBhYWM7CisKKwl9IGZvcm1hdDsKKwkJCit9IEJFX0NPTkZJRywgKlBCRV9DT05GSUcgQVRUUklCVVRFX1BBQ0tFRDsKKworCit0eXBlZGVmIHN0cnVjdAl7CisKKwkvLyBCbGFkZUVuYyBETEwgVmVyc2lvbiBudW1iZXIKKworCUJZVEUJYnlETExNYWpvclZlcnNpb247CisJQllURQlieURMTE1pbm9yVmVyc2lvbjsKKworCS8vIEJsYWRlRW5jIEVuZ2luZSBWZXJzaW9uIE51bWJlcgorCisJQllURQlieU1ham9yVmVyc2lvbjsKKwlCWVRFCWJ5TWlub3JWZXJzaW9uOworCisJLy8gRExMIFJlbGVhc2UgZGF0ZQorCisJQllURQlieURheTsKKwlCWVRFCWJ5TW9udGg7CisJV09SRAl3WWVhcjsKKworCS8vIEJsYWRlRW5jCUhvbWVwYWdlIFVSTAorCisJQ0hBUgl6SG9tZXBhZ2VbQkVfTUFYX0hPTUVQQUdFICsgMV07CQorCisJQllURQlieUFscGhhTGV2ZWw7CisJQllURQlieUJldGFMZXZlbDsKKwlCWVRFCWJ5TU1YRW5hYmxlZDsKKworCUJZVEUJYnRSZXNlcnZlZFsxMjVdOworCisKK30gQkVfVkVSU0lPTiwgKlBCRV9WRVJTSU9OIEFUVFJJQlVURV9QQUNLRUQ7CisKKyNpZm5kZWYgX0JMQURFRExMCisKK3R5cGVkZWYgQkVfRVJSCSgqQkVJTklUU1RSRUFNKQkJCShQQkVfQ09ORklHLCBQRFdPUkQsIFBEV09SRCwgUEhCRV9TVFJFQU0pOwordHlwZWRlZiBCRV9FUlIJKCpCRUVOQ09ERUNIVU5LKQkJKEhCRV9TVFJFQU0sIERXT1JELCBQU0hPUlQsIFBCWVRFLCBQRFdPUkQpOworCisvLyBhZGRlZCBmb3IgZmxvYXRpbmcgcG9pbnQgYXVkaW8gIC0tIERTUGd1cnUsIGpkCit0eXBlZGVmIEJFX0VSUgkoKkJFRU5DT0RFQ0hVTktGTE9BVFMxNk5JKQkoSEJFX1NUUkVBTSwgRFdPUkQsIFBGTE9BVCwgUEZMT0FULCBQQllURSwgUERXT1JEKTsKK3R5cGVkZWYgQkVfRVJSCSgqQkVERUlOSVRTVFJFQU0pCQkJKEhCRV9TVFJFQU0sIFBCWVRFLCBQRFdPUkQpOwordHlwZWRlZiBCRV9FUlIJKCpCRUNMT1NFU1RSRUFNKQkJCShIQkVfU1RSRUFNKTsKK3R5cGVkZWYgVk9JRAkoKkJFVkVSU0lPTikJCQkJKFBCRV9WRVJTSU9OKTsKK3R5cGVkZWYgQkVfRVJSCSgqQkVXUklURVZCUkhFQURFUikJCQkoTFBDU1RSKTsKK3R5cGVkZWYgQkVfRVJSCSgqQkVXUklURUlORk9UQUcpCQkJKEhCRV9TVFJFQU0sIExQQ1NUUiApOworCisjZGVmaW5lCVRFWFRfQkVJTklUU1RSRUFNCQkJCSJiZUluaXRTdHJlYW0iCisjZGVmaW5lCVRFWFRfQkVFTkNPREVDSFVOSwkJCQkiYmVFbmNvZGVDaHVuayIKKyNkZWZpbmUJVEVYVF9CRUVOQ09ERUNIVU5LRkxPQVRTMTZOSQkiYmVFbmNvZGVDaHVua0Zsb2F0UzE2TkkiCisjZGVmaW5lCVRFWFRfQkVERUlOSVRTVFJFQU0JCQkJImJlRGVpbml0U3RyZWFtIgorI2RlZmluZQlURVhUX0JFQ0xPU0VTVFJFQU0JCQkJImJlQ2xvc2VTdHJlYW0iCisjZGVmaW5lCVRFWFRfQkVWRVJTSU9OCQkJCQkiYmVWZXJzaW9uIgorI2RlZmluZQlURVhUX0JFV1JJVEVWQlJIRUFERVIJCQkiYmVXcml0ZVZCUkhlYWRlciIKKyNkZWZpbmUJVEVYVF9CRUZMVVNITk9HQVAJCQkJImJlRmx1c2hOb0dhcCIKKyNkZWZpbmUJVEVYVF9CRVdSSVRFSU5GT1RBRwkJCQkiYmVXcml0ZUluZm9UYWciCisKKworI2Vsc2UKKworX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUluaXRTdHJlYW0oUEJFX0NPTkZJRyBwYmVDb25maWcsIFBEV09SRCBkd1NhbXBsZXMsIFBEV09SRCBkd0J1ZmZlclNpemUsIFBIQkVfU1RSRUFNIHBoYmVTdHJlYW0pOworX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUVuY29kZUNodW5rKEhCRV9TVFJFQU0gaGJlU3RyZWFtLCBEV09SRCBuU2FtcGxlcywgUFNIT1JUIHBTYW1wbGVzLCBQQllURSBwT3V0cHV0LCBQRFdPUkQgcGR3T3V0cHV0KTsKKworLy8gYWRkZWQgZm9yIGZsb2F0aW5nIHBvaW50IGF1ZGlvICAtLSBEU1BndXJ1LCBqZAorX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUVuY29kZUNodW5rRmxvYXRTMTZOSShIQkVfU1RSRUFNIGhiZVN0cmVhbSwgRFdPUkQgblNhbXBsZXMsIFBGTE9BVCBidWZmZXJfbCwgUEZMT0FUIGJ1ZmZlcl9yLCBQQllURSBwT3V0cHV0LCBQRFdPUkQgcGR3T3V0cHV0KTsKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBCRV9FUlIJYmVEZWluaXRTdHJlYW0oSEJFX1NUUkVBTSBoYmVTdHJlYW0sIFBCWVRFIHBPdXRwdXQsIFBEV09SRCBwZHdPdXRwdXQpOworX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUNsb3NlU3RyZWFtKEhCRV9TVFJFQU0gaGJlU3RyZWFtKTsKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBWT0lECQliZVZlcnNpb24oUEJFX1ZFUlNJT04gcGJlVmVyc2lvbik7CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgQkVfRVJSCWJlV3JpdGVWQlJIZWFkZXIoTFBDU1RSIGxwc3pGaWxlTmFtZSk7CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgQkVfRVJSCWJlRmx1c2hOb0dhcChIQkVfU1RSRUFNIGhiZVN0cmVhbSwgUEJZVEUgcE91dHB1dCwgUERXT1JEIHBkd091dHB1dCk7CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgQkVfRVJSCWJlV3JpdGVJbmZvVGFnKCBIQkVfU1RSRUFNIGhiZVN0cmVhbSwgTFBDU1RSIGxwc3pGaWxlTmFtZSApOworCisjZW5kaWYKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBwYWNrKHBvcCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0RsbC9FeGFtcGxlLmNwcCBiL0RsbC9FeGFtcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWM3NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvRGxsL0V4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICoJTEFNRSBETEwgU2FtcGxlIENvZGUuCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIEEuTC4gRmFiZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJCbGFkZU1QM0VuY0RMTC5oIgorCitCRUlOSVRTVFJFQU0JCWJlSW5pdFN0cmVhbT1OVUxMOworQkVFTkNPREVDSFVOSwkJYmVFbmNvZGVDaHVuaz1OVUxMOworQkVERUlOSVRTVFJFQU0JCWJlRGVpbml0U3RyZWFtPU5VTEw7CitCRUNMT1NFU1RSRUFNCQliZUNsb3NlU3RyZWFtPU5VTEw7CitCRVZFUlNJT04JCQliZVZlcnNpb249TlVMTDsKK0JFV1JJVEVWQlJIRUFERVIJYmVXcml0ZVZCUkhlYWRlcj1OVUxMOworQkVXUklURUlORk9UQUcJCWJlV3JpdGVJbmZvVGFnPU5VTEw7CisKKworLy8gTWFpbiBwcm9ncmFtCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorewkKKwlISU5TVEFOQ0UJaERMTAkJCT1OVUxMOworCUZJTEUqCQlwRmlsZUluCQkJPU5VTEw7CisJRklMRSoJCXBGaWxlT3V0CQk9TlVMTDsKKwlCRV9WRVJTSU9OCVZlcnNpb24JCQk9ezAsfTsKKwlCRV9DT05GSUcJYmVDb25maWcJCT17MCx9OworCisJQ0hBUgkJc3RyRmlsZUluWzI1NV0JPXsnMCcsfTsKKwlDSEFSCQlzdHJGaWxlT3V0WzI1NV0JPXsnMCcsfTsKKworCURXT1JECQlkd1NhbXBsZXMJCT0wOworCURXT1JECQlkd01QM0J1ZmZlcgkJPTA7CisJSEJFX1NUUkVBTQloYmVTdHJlYW0JCT0wOworCUJFX0VSUgkJZXJyCQkJCT0wOworCisJUEJZVEUJCXBNUDNCdWZmZXIJCT1OVUxMOworCVBTSE9SVAkJcFdBVkJ1ZmZlcgkJPU5VTEw7CisKKwkvLyBjaGVjayBudW1iZXIgb2YgYXJndW1lbnRzCisJaWYoYXJnYyAhPSAyKQorCXsKKwkJZnByaW50ZihzdGRlcnIsIlVzYWdlOiAlcyA8ZmlsZW5hbWUud2F2PlxuIiwgYXJndlswXSk7CisJCWZwcmludGYoc3RkZXJyLCJEZXNjcjogU2hvcnQgZGVtbyB0byBzaG93IGhvdyB0byB1c2UgdGhlIGxhbWVfZW5jLmRsbCBsaWJyYXJ5IGZpbGVcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTm90ZSA6IFdBViBmaWxlIGlzIGFzc3VtZWQgdG8gdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnNcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiICAgICA6IDQ0MTAwIEh6LCBzdGVyZW8sIDE2IEJpdHMgcGVyIHNhbXBsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvLyBTZXR1cCB0aGUgZmlsZSBuYW1lcworCXN0cmNweShzdHJGaWxlSW4gLGFyZ3ZbMV0pOworCXN0cmNweShzdHJGaWxlT3V0LGFyZ3ZbMV0pOworCisJLy8gQWRkIG1wMyBleHRlbnRpb24KKwlzdHJjYXQoc3RyRmlsZU91dCwiLm1wMyIpOworCisJLy8gTG9hZCBsYW1lX2VuYy5kbGwgbGlicmFyeSAoTWFrZSBzdXJlIHRob3VnaCB0aGF0IHlvdSBzZXQgdGhlIAorCS8vIHByb2plY3Qvc2V0dGluZ3MvZGVidWcgV29ya2luZyBEaXJlY3RvcnkgY29ycmVjdGx5LCBvdGhlcndoaXNlIHRoZSBETEwgY2FuJ3QgYmUgbG9hZGVkCisKKwloRExMID0gTG9hZExpYnJhcnkoImxhbWVfZW5jLmRsbCIpOworCisgIAlpZiAoIE5VTEwgPT0gaERMTCApCisgIAl7CisgIAkJaERMTCA9IExvYWRMaWJyYXJ5KCIuLlxcLi5cXG91dHB1dFxcbGFtZV9lbmMuZGxsIik7CisgIAl9CisKKwlpZiggTlVMTCA9PSBoRExMICkKKwl7CisJCWZwcmludGYoc3RkZXJyLCJFcnJvciBsb2FkaW5nIGxhbWVfZW5jLkRMTCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLy8gR2V0IEludGVyZmFjZSBmdW5jdGlvbnMgZnJvbSB0aGUgRExMCisJYmVJbml0U3RyZWFtCT0gKEJFSU5JVFNUUkVBTSkgR2V0UHJvY0FkZHJlc3MoaERMTCwgVEVYVF9CRUlOSVRTVFJFQU0pOworCWJlRW5jb2RlQ2h1bmsJPSAoQkVFTkNPREVDSFVOSykgR2V0UHJvY0FkZHJlc3MoaERMTCwgVEVYVF9CRUVOQ09ERUNIVU5LKTsKKwliZURlaW5pdFN0cmVhbQk9IChCRURFSU5JVFNUUkVBTSkgR2V0UHJvY0FkZHJlc3MoaERMTCwgVEVYVF9CRURFSU5JVFNUUkVBTSk7CisJYmVDbG9zZVN0cmVhbQk9IChCRUNMT1NFU1RSRUFNKSBHZXRQcm9jQWRkcmVzcyhoRExMLCBURVhUX0JFQ0xPU0VTVFJFQU0pOworCWJlVmVyc2lvbgkJPSAoQkVWRVJTSU9OKSBHZXRQcm9jQWRkcmVzcyhoRExMLCBURVhUX0JFVkVSU0lPTik7CisJYmVXcml0ZVZCUkhlYWRlcj0gKEJFV1JJVEVWQlJIRUFERVIpIEdldFByb2NBZGRyZXNzKGhETEwsVEVYVF9CRVdSSVRFVkJSSEVBREVSKTsKKwliZVdyaXRlSW5mb1RhZyAgPSAoQkVXUklURUlORk9UQUcpIEdldFByb2NBZGRyZXNzKGhETEwsVEVYVF9CRVdSSVRFSU5GT1RBRyk7CisKKwkvLyBDaGVjayBpZiBhbGwgaW50ZXJmYWNlcyBhcmUgcHJlc2VudAorCWlmKCFiZUluaXRTdHJlYW0gfHwgIWJlRW5jb2RlQ2h1bmsgfHwgIWJlRGVpbml0U3RyZWFtIHx8ICFiZUNsb3NlU3RyZWFtIHx8ICFiZVZlcnNpb24gfHwgIWJlV3JpdGVWQlJIZWFkZXIpCisJeworCQlwcmludGYoIlVuYWJsZSB0byBnZXQgTEFNRSBpbnRlcmZhY2VzIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvLyBHZXQgdGhlIHZlcnNpb24gbnVtYmVyCisJYmVWZXJzaW9uKCAmVmVyc2lvbiApOworCisJcHJpbnRmKAorCQkJImxhbWVfZW5jLmRsbCB2ZXJzaW9uICV1LiUwMnUgKCV1LyV1LyV1KVxuIgorCQkJImxhbWVfZW5jIEVuZ2luZSAldS4lMDJ1XG4iCisJCQkibGFtZV9lbmMgaG9tZXBhZ2UgYXQgJXNcblxuIiwJCisJCQlWZXJzaW9uLmJ5RExMTWFqb3JWZXJzaW9uLCBWZXJzaW9uLmJ5RExMTWlub3JWZXJzaW9uLAorCQkJVmVyc2lvbi5ieURheSwgVmVyc2lvbi5ieU1vbnRoLCBWZXJzaW9uLndZZWFyLAorCQkJVmVyc2lvbi5ieU1ham9yVmVyc2lvbiwgVmVyc2lvbi5ieU1pbm9yVmVyc2lvbiwKKwkJCVZlcnNpb24uekhvbWVwYWdlKTsKKworCS8vIFRyeSB0byBvcGVuIHRoZSBXQVYgZmlsZSwgYmUgc3VyZSB0byBvcGVuIGl0IGFzIGEgYmluYXJ5IGZpbGUhCQorCXBGaWxlSW4gPSBmb3Blbiggc3RyRmlsZUluLCAicmIiICk7CisKKwkvLyBDaGVjayBmaWxlIG9wZW4gcmVzdWx0CisJaWYocEZpbGVJbiA9PSBOVUxMKQorCXsKKwkJZnByaW50ZihzdGRlcnIsIkVycm9yIG9wZW5pbmcgJXMiLCBhcmd2WzFdKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8vIE9wZW4gTVAzIGZpbGUKKwlwRmlsZU91dD0gZm9wZW4oc3RyRmlsZU91dCwid2IrIik7CisKKwkvLyBDaGVjayBmaWxlIG9wZW4gcmVzdWx0CisJaWYocEZpbGVPdXQgPT0gTlVMTCkKKwl7CisJCWZwcmludGYoc3RkZXJyLCJFcnJvciBjcmVhdGluZyBmaWxlICVzIiwgc3RyRmlsZU91dCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJmJlQ29uZmlnLDAsc2l6ZW9mKGJlQ29uZmlnKSk7CQkJCQkvLyBjbGVhciBhbGwgZmllbGRzCisKKwkvLyB1c2UgdGhlIExBTUUgY29uZmlnIHN0cnVjdHVyZQorCWJlQ29uZmlnLmR3Q29uZmlnID0gQkVfQ09ORklHX0xBTUU7CisKKwkvLyB0aGlzIGFyZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGVzdGNhc2Uud2F2CisJYmVDb25maWcuZm9ybWF0LkxIVjEuZHdTdHJ1Y3RWZXJzaW9uCT0gMTsKKwliZUNvbmZpZy5mb3JtYXQuTEhWMS5kd1N0cnVjdFNpemUJCT0gc2l6ZW9mKGJlQ29uZmlnKTsJCQorCWJlQ29uZmlnLmZvcm1hdC5MSFYxLmR3U2FtcGxlUmF0ZQkJPSA0NDEwMDsJCQkJLy8gSU5QVVQgRlJFUVVFTkNZCisJYmVDb25maWcuZm9ybWF0LkxIVjEuZHdSZVNhbXBsZVJhdGUJCT0gMDsJCQkJCS8vIERPTiJUIFJFU0FNUExFCisJYmVDb25maWcuZm9ybWF0LkxIVjEubk1vZGUJCQkJPSBCRV9NUDNfTU9ERV9KU1RFUkVPOwkvLyBPVVRQVVQgSU4gU1RSRU8KKwliZUNvbmZpZy5mb3JtYXQuTEhWMS5kd0JpdHJhdGUJCQk9IDEyODsJCQkJCS8vIE1JTklNVU0gQklUIFJBVEUKKwliZUNvbmZpZy5mb3JtYXQuTEhWMS5uUHJlc2V0CQkJPSBMUVBfUjNNSVg7CQkvLyBRVUFMSVRZIFBSRVNFVCBTRVRUSU5HCisJYmVDb25maWcuZm9ybWF0LkxIVjEuZHdNcGVnVmVyc2lvbgkJPSBNUEVHMTsJCQkJLy8gTVBFRyBWRVJTSU9OIChJIG9yIElJKQorCWJlQ29uZmlnLmZvcm1hdC5MSFYxLmR3UHN5TW9kZWwJCQk9IDA7CQkJCQkvLyBVU0UgREVGQVVMVCBQU1lDSE9BQ09VU1RJQyBNT0RFTCAKKwliZUNvbmZpZy5mb3JtYXQuTEhWMS5kd0VtcGhhc2lzCQkJPSAwOwkJCQkJLy8gTk8gRU1QSEFTSVMgVFVSTkVEIE9OCisJYmVDb25maWcuZm9ybWF0LkxIVjEuYk9yaWdpbmFsCQkJPSBUUlVFOwkJCQkJLy8gU0VUIE9SSUdJTkFMIEZMQUcKKwliZUNvbmZpZy5mb3JtYXQuTEhWMS5iV3JpdGVWQlJIZWFkZXIJPSBUUlVFOwkJCQkJLy8gV3JpdGUgSU5GTyB0YWcKKworLy8JYmVDb25maWcuZm9ybWF0LkxIVjEuZHdNYXhCaXRyYXRlCQk9IDMyMDsJCQkJCS8vIE1BWElNVU0gQklUIFJBVEUKKy8vCWJlQ29uZmlnLmZvcm1hdC5MSFYxLmJDUkMJCQkJPSBUUlVFOwkJCQkJLy8gSU5TRVJUIENSQworLy8JYmVDb25maWcuZm9ybWF0LkxIVjEuYkNvcHlyaWdodAkJCT0gVFJVRTsJCQkJCS8vIFNFVCBDT1BZUklHSFQgRkxBRwkKKy8vCWJlQ29uZmlnLmZvcm1hdC5MSFYxLmJQcml2YXRlCQkJPSBUUlVFOwkJCQkJLy8gU0VUIFBSSVZBVEUgRkxBRworLy8JYmVDb25maWcuZm9ybWF0LkxIVjEuYldyaXRlVkJSSGVhZGVyCT0gVFJVRTsJCQkJCS8vIFlFUywgV1JJVEUgVEhFIFhJTkcgVkJSIEhFQURFUgorLy8JYmVDb25maWcuZm9ybWF0LkxIVjEuYkVuYWJsZVZCUgkJCT0gVFJVRTsJCQkJCS8vIFVTRSBWQlIKKy8vCWJlQ29uZmlnLmZvcm1hdC5MSFYxLm5WQlJRdWFsaXR5CQk9IDU7CQkJCQkvLyBTRVQgVkJSIFFVQUxJVFkKKwliZUNvbmZpZy5mb3JtYXQuTEhWMS5iTm9SZXMJCQkJPSBUUlVFOwkJCQkJLy8gTm8gQml0IHJlc29ydm9pcgorCisvLyBQcmVzZXQgVGVzdAorLy8JYmVDb25maWcuZm9ybWF0LkxIVjEublByZXNldAkJCT0gTFFQX1BIT05FOworCisJLy8gSW5pdCB0aGUgTVAzIFN0cmVhbQorCWVyciA9IGJlSW5pdFN0cmVhbSgmYmVDb25maWcsICZkd1NhbXBsZXMsICZkd01QM0J1ZmZlciwgJmhiZVN0cmVhbSk7CisKKwkvLyBDaGVjayByZXN1bHQKKwlpZihlcnIgIT0gQkVfRVJSX1NVQ0NFU1NGVUwpCisJeworCQlmcHJpbnRmKHN0ZGVyciwiRXJyb3Igb3BlbmluZyBlbmNvZGluZyBzdHJlYW0gKCVsdSkiLCBlcnIpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwkvLyBBbGxvY2F0ZSBNUDMgYnVmZmVyCisJcE1QM0J1ZmZlciA9IG5ldyBCWVRFW2R3TVAzQnVmZmVyXTsKKworCS8vIEFsbG9jYXRlIFdBViBidWZmZXIKKwlwV0FWQnVmZmVyID0gbmV3IFNIT1JUW2R3U2FtcGxlc107CisKKwkvLyBDaGVjayBpZiBCdWZmZXIgYXJlIGFsbG9jYXRlZCBwcm9wZXJseQorCWlmKCFwTVAzQnVmZmVyIHx8ICFwV0FWQnVmZmVyKQorCXsKKwkJcHJpbnRmKCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlEV09SRCBkd1JlYWQ9MDsKKwlEV09SRCBkd1dyaXRlPTA7CisJRFdPUkQgZHdEb25lPTA7CisJRFdPUkQgZHdGaWxlU2l6ZT0wOworCisJLy8gU2VlayB0byBlbmQgb2YgZmlsZQorCWZzZWVrKHBGaWxlSW4sMCxTRUVLX0VORCk7CisKKwkvLyBHZXQgdGhlIGZpbGUgc2l6ZQorCWR3RmlsZVNpemU9ZnRlbGwocEZpbGVJbik7CisKKwkvLyBTZWVrIGJhY2sgdG8gc3RhcnQgb2YgV0FWIGZpbGUsCisJLy8gYnV0IHNraXAgdGhlIGZpcnN0IDQ0IGJ5dGVzLCBzaW5jZSB0aGF0J3MgdGhlIFdBViBoZWFkZXIKKwlmc2VlayhwRmlsZUluLDQ0LFNFRUtfU0VUKTsKKworCisJLy8gQ29udmVydCBBbGwgUENNIHNhbXBsZXMKKwl3aGlsZSAoIChkd1JlYWQ9ZnJlYWQocFdBVkJ1ZmZlcixzaXplb2YoU0hPUlQpLGR3U2FtcGxlcyxwRmlsZUluKSkgPjAgKQorCXsKKwkJLy8gRW5jb2RlIHNhbXBsZXMKKwkJZXJyID0gYmVFbmNvZGVDaHVuayhoYmVTdHJlYW0sIGR3UmVhZCwgcFdBVkJ1ZmZlciwgcE1QM0J1ZmZlciwgJmR3V3JpdGUpOworCisJCS8vIENoZWNrIHJlc3VsdAorCQlpZihlcnIgIT0gQkVfRVJSX1NVQ0NFU1NGVUwpCisJCXsKKwkJCWJlQ2xvc2VTdHJlYW0oaGJlU3RyZWFtKTsKKwkJCWZwcmludGYoc3RkZXJyLCJiZUVuY29kZUNodW5rKCkgZmFpbGVkICglbHUpIiwgZXJyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkKKwkJLy8gd3JpdGUgZHdXcml0ZSBieXRlcyB0aGF0IGFyZSByZXR1cm5lZCBpbiB0ZWhlIHBNUDNCdWZmZXIgdG8gZGlzaworCQlpZihmd3JpdGUocE1QM0J1ZmZlciwxLGR3V3JpdGUscEZpbGVPdXQpICE9IGR3V3JpdGUpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCJPdXRwdXQgZmlsZSB3cml0ZSBlcnJvciIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZHdEb25lICs9IGR3UmVhZCpzaXplb2YoU0hPUlQpOworCisJCXByaW50ZigiRG9uZTogJTAuMmYlJSAgICAgXHIiLCAxMDAgKiAoZmxvYXQpZHdEb25lLyhmbG9hdCkoZHdGaWxlU2l6ZSkpOworCX0KKworCS8vIERlaW5pdCB0aGUgc3RyZWFtCisJZXJyID0gYmVEZWluaXRTdHJlYW0oaGJlU3RyZWFtLCBwTVAzQnVmZmVyLCAmZHdXcml0ZSk7CisKKwkvLyBDaGVjayByZXN1bHQKKwlpZihlcnIgIT0gQkVfRVJSX1NVQ0NFU1NGVUwpCisJeworCisJCWJlQ2xvc2VTdHJlYW0oaGJlU3RyZWFtKTsKKwkJZnByaW50ZihzdGRlcnIsImJlRXhpdFN0cmVhbSBmYWlsZWQgKCVsdSkiLCBlcnIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLy8gQXJlIHRoZXJlIGFueSBieXRlcyByZXR1cm5lZCBmcm9tIHRoZSBEZUluaXQgY2FsbD8KKwkvLyBJZiBzbywgd3JpdGUgdGhlbSB0byBkaXNrCisJaWYoIGR3V3JpdGUgKQorCXsKKwkJaWYoIGZ3cml0ZSggcE1QM0J1ZmZlciwgMSwgZHdXcml0ZSwgcEZpbGVPdXQgKSAhPSBkd1dyaXRlICkKKwkJeworCQkJZnByaW50ZihzdGRlcnIsIk91dHB1dCBmaWxlIHdyaXRlIGVycm9yIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvLyBjbG9zZSB0aGUgTVAzIFN0cmVhbQorCWJlQ2xvc2VTdHJlYW0oIGhiZVN0cmVhbSApOworCisJLy8gRGVsZXRlIFdBViBidWZmZXIKKwlkZWxldGUgW10gcFdBVkJ1ZmZlcjsKKworCS8vIERlbGV0ZSBNUDMgQnVmZmVyCisJZGVsZXRlIFtdIHBNUDNCdWZmZXI7CisKKwkvLyBDbG9zZSBpbnB1dCBmaWxlCisJZmNsb3NlKCBwRmlsZUluICk7CisKKwkvLyBDbG9zZSBvdXRwdXQgZmlsZQorCWZjbG9zZSggcEZpbGVPdXQgKTsKKworCWlmICggYmVXcml0ZUluZm9UYWcgKQorCXsKKwkJLy8gV3JpdGUgdGhlIElORk8gVGFnCisJCWJlV3JpdGVJbmZvVGFnKCBoYmVTdHJlYW0sIHN0ckZpbGVPdXQgKTsKKwl9CisJZWxzZQorCXsKKwkJYmVXcml0ZVZCUkhlYWRlciggc3RyRmlsZU91dCApOworCX0KKworCS8vIFdlcmUgZG9uZSwgcmV0dXJuIE9LIHJlc3VsdAorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9EbGwvRXhhbXBsZV92YzYuZHNwIGIvRGxsL0V4YW1wbGVfdmM2LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRiZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvRGxsL0V4YW1wbGVfdmM2LmRzcApAQCAtMCwwICsxLDkwIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkV4YW1wbGUiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPUV4YW1wbGUgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIERpZXMgaXN0IGtlaW4gZ/xsdGlnZXMgTWFrZWZpbGUuIFp1bSBFcnN0ZWxsZW4gZGllc2VzIFByb2pla3RzIG1pdCBOTUFLRQ0KKyFNRVNTQUdFIHZlcndlbmRlbiBTaWUgZGVuIEJlZmVobCAiTWFrZWZpbGUgZXhwb3J0aWVyZW4iIHVuZCBm/GhyZW4gU2llIGRlbiBCZWZlaGwNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiRXhhbXBsZV92YzYubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBTaWUga/ZubmVuIGJlaW0gQXVzZvxocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbg0KKyFNRVNTQUdFIGR1cmNoIERlZmluaWVyZW4gZGVzIE1ha3JvcyBDRkcgaW4gZGVyIEJlZmVobHN6ZWlsZS4gWnVtIEJlaXNwaWVsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJFeGFtcGxlX3ZjNi5tYWsiIENGRz0iRXhhbXBsZSAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIEb8ciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgIkV4YW1wbGUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJFeGFtcGxlIC0gV2luMzIgRGVidWciIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkV4YW1wbGUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XHJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxyZWxlYXNlXGV4YW1wbGUiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi5cb3V0cHV0XHJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkV4YW1wbGUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XGRlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcZGVidWdcZXhhbXBsZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdCAvbGlicGF0aDoiLi5cb3V0cHV0XGRlYnVnIg0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiRXhhbXBsZSAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJFeGFtcGxlIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEV4YW1wbGUuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvRGxsL0V4YW1wbGVfdmM2LmRzdyBiL0RsbC9FeGFtcGxlX3ZjNi5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkODMzMgotLS0gL2Rldi9udWxsCisrKyBiL0RsbC9FeGFtcGxlX3ZjNi5kc3cKQEAgLTAsMCArMSw3NCBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiRXhhbXBsZSI9LlxFeGFtcGxlX3ZjNi5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgTGFtZU1wM0VuY0RsbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJMYW1lTXAzRW5jRGxsIj0uXExhbWVEbGxfdmM2LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBsaWJtcDNsYW1lDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbXBnbGliDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImxpYm1wM2xhbWUiPS4uXGxpYm1wM2xhbWVcbGlibXAzbGFtZV92YzYuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJtcGdsaWIiPS4uXG1wZ2xpYlxtcGdsaWJfdmM2LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9EbGwvTGFtZURMTEludGVyZmFjZS5odG0gYi9EbGwvTGFtZURMTEludGVyZmFjZS5odG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmMmFkZAotLS0gL2Rldi9udWxsCisrKyBiL0RsbC9MYW1lRExMSW50ZXJmYWNlLmh0bQpAQCAtMCwwICsxLDc0MiBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNaWNyb3NvZnQgRnJvbnRQYWdlIEV4cHJlc3MgMi4wIj4KKzx0aXRsZT5MYW1lLTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorCis8cCBhbGlnbj0iY2VudGVyIj4mbmJzcDsgPC9wPgorCis8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBzaXplPSI3Ij5MYW1lLWVuYyBETEw8L2ZvbnQ+IDxicj4KKzxmb250IHNpemU9IjUiPkludGVyZmFjZSB2ZXJzaW9uIDEuMzI8L2ZvbnQ+IChhbmQgYWJvdmUpPGJyPgorKExhbWUgZW5naW5lIHZlcnNpb246IDMuOTMgb3IgaGlnaGVyKSA8YnI+Cis8Zm9udCBzaXplPSI2Ij5Qcm9ncmFtbWVycyBNYW51YWw8L2ZvbnQ+PC9wPgorCis8cCBhbGlnbj0iY2VudGVyIj48aT5UaGUgbGFtZV9lbmMuZGxsIGFuZCB0aGlzIG1hbnVhbCBpcworY29weXJpZ2h0IGJ5IEFsYmVydCBMIEZhYmVyPGJyPgorT3JpZ2luYWxseSB0aGUgdGhlIERMTCBpbnRlcmZhY2UgaXMgbW9kZWxlZCBhZnRlciB0aGUgQmxhZGVFbmMKK0RMTCBpbnRlcmZhY2U8YnI+Cit3aGljaCBpcyBjb3B5cmlnaHRlZCBieSBUb3JkIEphbnNzb24gYW5kIEp1a2thIFBvaWtvbGFpbmVuPGJyPgorVGhpcyBkb2N1bWVudCBhbmQgdGhlIERMTCBpbnRlcmZhY2UgbWF5IGJlIGRpc3RyaWJ1dGVkIGZyZWVseTwvaT4KKzxicj4KKzxpPmFzIGxvbmcgYXMgbW9kaWZpY2F0aW9ucyBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwgbGljZW5zZS48L2k+Cis8L3A+CisKKzxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOyA8L3A+CisKKzxwIGFsaWduPSJjZW50ZXIiPjxiPkhvbWVwYWdlPC9iPjogPGEKK2hyZWY9Imh0dHA6Ly93d3cuY2RleC5uMy5uZXQiPmh0dHA6Ly93d3cuY2RleC5uMy5uZXQ8L2E+PGJyPgorPGI+RS1tYWlsOjwvYj4gbWFpbHRvOiA8YQoraHJlZj0ibWFpbHRvOmFmYWJlckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPmFmYWJlckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ8L2E+Cis8L3A+CisKKzxwPjxicj4KKzxicj4KKzxicj4KKzxicj4KKzwvcD4KKworPHA+PGZvbnQgc2l6ZT0iNSI+RGlzdHJpYnV0aW9uPC9mb250PiA8L3A+CisKKzxwPlBlb3BsZSBhbmQgY29tcGFuaWVzJm5ic3A7IHdobyB3YW50cyB0byBkaXN0cmlidXRlCitsYW1lX2VuYy5kbGwgd2l0aCB0aGVpciBjb21tZXJjaWFsIHByb2R1Y3RzIGFyZSBmcmVlIHRvIGRvIHNvIGFzCitmYXIgYXMgSSdtIGNvbmNlcm5lZCAoTEdQTCBsaWNlbnNlKSwgYnV0IHNob3VsZCBiZSBhd2FyZSB0aGF0CitsYW1lX2VuYy5kbGwgbWlnaHQgaW5mcmluZ2UgY2VydGFpbiBNUDMgcmVsYXRlZCBzb2Z0d2FyZSBwYXRlbnRzCitoZWxkIGJ5IEZyYXVuaG9mZXIgSUlTIGluIGNlcnRhaW4gY291bnRyaWVzLiA8L3A+CisKKzxwPjxicj4KKyZuYnNwOyA8L3A+CisKKzxwPjxmb250IHNpemU9IjUiPkRpc2NsYWltZXI8L2ZvbnQ+IDwvcD4KKworPHA+bGFtZV9lbmMuZGxsIGFuZCB0aGlzIG1hbnVhbCBpcyBkaXN0cmlidXRlZCAnYXMgaXMnIHdpdGggbm8KK3dhcnJhbnR5IG9mIGFueSBraW5kLiBUaGUgQXV0aG9yIGlzIG5vdCB0byBiZSBoZWxkIHJlc3BvbnNpYmxlCitmb3IgdGhlIHJlc3VsdCBvZiBhbnkgdXNlIG9yIG1pc3VzZSBvZiB0aGlzIHByb2R1Y3QuIDxicj4KKyZuYnNwOyA8YnI+CismbmJzcDsgPC9wPgorCis8cD48Zm9udCBzaXplPSI1Ij5DdXJyZW50IEJ1Z3MgYW5kIExpbWl0YXRpb25zPC9mb250PiA8L3A+CisKKzxwPkFsdGhvdWdoIHRoZSBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gYmUgYWJsZSB0byBoYW5kbGUKK211bHRpcGxlIHBhcmFsbGVsIHN0cmVhbXMgaXQgY2FuJ3QgYmUgZG9uZSB5ZXQgZHVlIHRvIGxpbWl0YXRpb25zCitpbiB0aGUgZW5naW5lLCBvbmx5IG9uZSBzdHJlYW0gaXMgYWxsb3dlZC4gPGJyPgorJm5ic3A7IDwvcD4KKworPHA+PGZvbnQgc2l6ZT0iNSI+RnV0dXJlIENvbXBhdGliaWxpdHk8L2ZvbnQ+IDwvcD4KKworPHA+VGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBhbGwgZnV0dXJlIHZlcnNpb25zCitvZiBsYW1lX2VuYy5ETEwgd2l0aG91dCBhbnkgbmVlZCB0byByZWNvbXBpbGUgeW91ciBwcm9ncmFtcy4gWW91CitzaG91bGQgdGhlcmVmb3JlIDxiPm5vdDwvYj4gY2hlY2sgdGhlIHZlcnNpb24gbnVtYmVyIHVwb24gc3RhcnQKK2FuZCBwcmV2ZW50IHVzZXJzIGZyb20gcnVubmluZyB5b3VyIHByb2dyYW0gd2l0aCBhIGxhdGVyIHZlcnNpb24KK29mIGxhbWVfZW5jLkRMTC4gPGJyPgorJm5ic3A7IDwvcD4KKworPGhyPgorCis8cD48Zm9udCBzaXplPSI1Ij5Ib3cgdG8gdXNlIHRoZSBETEw8L2ZvbnQ+IDwvcD4KKworPHA+MS4gRmlsbCBpbiBhIDxhIGhyZWY9IiNUaGUgQkVfQ09ORklHIFN0cnVjdHVyZSI+QkVfQ09ORklHIDwvYT5zdHJ1Y3R1cmUKK2FuZCBzZW5kIGl0IHRvIDxhIGhyZWY9IiNiZUluaXRTdHJlYW0oKSI+YmVJbml0U3RyZWFtKCk8L2E+LiBNYWtlCitzdXJlIHRoYXQgQkVfRVJSX1NVQ0NFU1NGVUwgaXMgcmV0dXJuZWQuIDwvcD4KKworPHA+Mi4gUmVzZXJ2ZSBhdCBsZWFzdCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXR1cm5lZCBpbgorZHdCdWZmZXJTaXplIGFzIHlvdXIgb3V0cHV0IGJ1ZmZlci4gPC9wPgorCis8cD4zLiBDYWxsIDxhIGhyZWY9IiNiZUVuY29kZUNodW5rKCkiPmJlRW5jb2RlQ2h1bmsoKTwvYT4gdW50aWwKK3lvdSd2ZSBlbmNvZGVkIGV2ZXJ5dGhpbmcgeW91IHdhbnQuIDwvcD4KKworPHA+NC4gQ2FsbCA8YSBocmVmPSIjYmVEZWluaXRTdHJlYW0oKSI+YmVEZWluaXRTdHJlYW0oKTwvYT4gdG8KK21ha2Ugc3VyZSB0aGF0IGFsbCBlbmNvZGVkIGRhdGEgaXMgZmx1c2hlZCBvdXQgYmVmb3JlIGNsb3NpbmcgdGhlCitzdHJlYW0uIDwvcD4KKworPHA+NS4gQ2xvc2UgdGhlIHN0cmVhbSB1c2luZyA8YSBocmVmPSIjYmVDbG9zZVN0cmVhbSgpIj5iZUNsb3NlU3RyZWFtKCkKKzwvYT48L3A+CisKKzxwPjYuIEZpbmFsbHksIGNhbGwgdGhlIDxhIGhyZWY9IiNiZVdyaXRlVkJSSGVhZGVyKCkiPmJlV3JpdGVWQlJIZWFkZXIoKTwvYT4KK2Z1bmN0aW9ucywgdG8gaW5zZXJ0IHRoZSBJTkZPIHRhZyBNUDMgSGVhZGVyLiBUaGlzIGlzIGFuCitleHRlbnNpb24gb2YgdGhlIFhpbmcgVkJSIHRhZyB3aGljaCBpcyBhbHNvIHVzZWQgZm9yIENCUgorZW5jb2RpbmdzLiBUaGlzIGNhbGwgY2FuIG9ubHkgYmUgb21pdHRlZCBpZiB0aGUgSU5GTyB0YWcgd2FzCitleHBsaWNpbHR5IGRpc2FibGVkIGluIHRoZSBCRV9DT05GSUcgU3RydWN0dXJlLjwvcD4KKworPHA+QSBoYW5keSBmZWF0dXJlIGlzIHRoZSBhdmFpbGFibGUgPGEKK2hyZWY9IiNMYW1lX2VuYy5kbGwgZGVidWcgb3B0aW9uIj5MYW1lX2VuYy5kbGwgZGVidWcgb3B0aW9uPC9hPiwKK3doaWNoIHdpbGwgZHVtcCB0aGUgaW1wb3J0YW50IGxhbWUgaW50ZXJuYWwgc2V0dGluZ3MgdG8gYSB0ZXh0CitmaWxlLjxicj4KKyZuYnNwOyA8L3A+CisKKzxwPiZuYnNwOzwvcD4KKworPHA+PGZvbnQgc2l6ZT0iNSI+UmV0dXJuIFZhbHVlczwvZm9udD4gPC9wPgorCis8cD5TZWUgdGhlIGhlYWRlci1maWxlIGZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgZnVuY3Rpb24gcmV0dXJuCit2YWx1ZXMuIEFsbCBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBCRV9FUlJfU1VDQ0VTU0ZVTCB1bmxlc3MKK3NvbWV0aGluZyB3ZW50IHdyb25nLiA8YnI+CismbmJzcDsgPC9wPgorCis8aHI+CisKKzxoMT48YSBuYW1lPSJUeXBlIGRlZmluaXRpb25zIj48Zm9udCBzaXplPSI1Ij5UeXBlIGRlZmluaXRpb25zPC9mb250PjwvYT48L2gxPgorCis8cD5UaGUgRExMIGlzIGJ5IGRlZmF1bHQgY29tcGlsZWQgd2l0aCB0aGUgTVMgVmlzdWFsIEMvQysrCitjb21waWxlciwgd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgdHlwZSBkZWZpbml0aW9uczo8L3A+CisKKzx0YWJsZSBib3JkZXI9IjAiPgorICAgIDx0cj4KKyAgICAgICAgPHRkPlR5cGUgPC90ZD4KKyAgICAgICAgPHRkPkRlc2NyaXB0aW9uPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPkNIQVI8L3RkPgorICAgICAgICA8dGQ+c2lnbmVkIGNoYXIgKDggYml0cyk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+QllURTwvdGQ+CisgICAgICAgIDx0ZD51bnNpZ25lZCBjaGFyICg4IGJpdHMpPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPlNIT1JUPC90ZD4KKyAgICAgICAgPHRkPnNpZ25lZCBzaG9ydCAoMTYgYml0cyk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+V09SRDwvdGQ+CisgICAgICAgIDx0ZD51bnNpZ25lZCBzaG9ydCAoMTYgYml0cyk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+SU5UPC90ZD4KKyAgICAgICAgPHRkPnNpZ25lZCBsb25nICgzMiBiaXRzKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5MT05HPC90ZD4KKyAgICAgICAgPHRkPnNpZ25lZCBsb25nICgzMiBiaXRzKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5CT09MPC90ZD4KKyAgICAgICAgPHRkPnNpZ25lZCBsb25nICgzMiBiaXRzKSAoWUVTLCAzMiBiaXRzIGZvciBhIG9uZSBiaXQKKyAgICAgICAgdmFsdWUpPGJyPgorICAgICAgICBUUlVFID0gMDxicj4KKyAgICAgICAgRkFMU0U9LTE8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+RFdPUkQ8L3RkPgorICAgICAgICA8dGQ+dW5zaWduZWQgbG9uZyAoMzIgYml0cyk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+RkxPQVQ8L3RkPgorICAgICAgICA8dGQ+ZmxvYXRpbmcgcG9pbnQgKDMyIGJpdHMpPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPkRPVUJMRTwvdGQ+CisgICAgICAgIDx0ZD5mbG9hdCBwb2ludCAoNjQgYml0cyk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+TFBDU1RSPC90ZD4KKyAgICAgICAgPHRkPmNvbnN0IGNoYXIqICgzMiBiaXRzIHBvaW50ZXIgdG8gemVybyB0ZXJtaW5hdGVkCisgICAgICAgIGNoYXJhY3RlciBzdHJpbmcpPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPHA+V2l0aGluIHRoZSBsYW1lX2VuYy5kbGwgQWxsIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgYXJlIG9uZQorYnl0ZSBhbGxpZ25lZCAoZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggQmxhZEVuYy5ETEwhPC9wPgorCis8cD4mbmJzcDs8L3A+CisKKzxocj4KKworPGgxPjxhIG5hbWU9IlRoZSBCRV9DT05GSUcgU3RydWN0dXJlIj48Zm9udCBzaXplPSI1Ij5UaGUKK0JFX0NPTkZJRyBTdHJ1Y3R1cmUgPC9mb250PjwvYT48L2gxPgorCis8cD48Zm9udCBzaXplPSIzIj5DdXJyZW50bHkgdGhlcmUgdGhlIEJFX0NPTkZJRyBzdHJ1Y3R1cmUgaGFzIHRvCit2YXJpYW5zLCB0aGUgb2xkIE1QMyBjb25maWcgc3RydWN0dXJlIHRoYXQgaXMgdHJ1bHkgY29tcGF0aWJsZQord2l0aCB0aGUgb2xkIEJsYWRlRW5jIGludGVyZmFjZSwgYW5kIHRoZSBuZXcgZGVmaW5lZCBMSFYxCitzdHJ1Y3R1cmUsIHdoaWNoIGNhbiBzZXQgZmFyIG1vcmUgb3B0aW9ucyBpbiB0aGUgbGFtZSBlbmNvZGVyPC9mb250PjwvcD4KKworPHA+Jm5ic3A7PC9wPgorCis8aDI+PGZvbnQgc2l6ZT0iNSI+VGhlIE1QMyBCRV9DT05GSUcgLSBzdHJ1Y3R1cmUgKE9CU09MRVRFKTwvZm9udD48L2gyPgorCis8cD5UaGlzIGlzIHRoZSBvbGQgc3RydWN0dXJlIGFzIGl0IHdhcyBvcmlnaW5hbGx5IGRlZmluZWQgYnkgdGhlCitCbGFkZUVuYy5ETEwgaW50ZXJmYWNlLiBIb3dldmVyLCBJIGRvIGhpZ2hseSByZWNvbW1lbmQgdG8gdXNlIHRoZQorbmV3IExhbWUgc3BlY2lmaWMgY29uZmlnIHN0cnVjdHVyZSwgc2luY2UgaXQgZ2l2ZXMgeW91IG1vcmUKK2NvbnRyb2wgb3ZlciB0aGUgTGFtZSBlbmNvZGVyIHNldHRpbmdzLjwvcD4KKworPHA+VGhlc2UgYXJlIHRoZSBtZW1iZXJzIG9mIHRoZSBCRV9DT05GSUcgc3RydWN0dXJlIHlvdSBuZWVkIHRvCitmaWxsIGluIGJlZm9yZSB5b3UgY2FsbCBiZUluaXRTdHJlYW0oKTogPGJyPgorJm5ic3A7IDwvcD4KKworPHRhYmxlIGJvcmRlcj0iMCI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGI+ZHdDb25maWc8L2I+PC90ZD4KKyAgICAgICAgPHRkPlNwZWNpZmllcyB3aGF0IGtpbmQgb2Ygb3V0cHV0IHlvdSB3YW50LiBTaW5jZSBvbmx5CisgICAgICAgIE1QMyBjdXJyZW50bHkgaXMgc3VwcG9ydGVkIHlvdSBtdXN0IHNldCB0aGlzIHRvIDxiPkJFX0NPTkZJR19NUDM8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPmZvcm1hdC5tcDMuZHdTYW1wbGVSYXRlPC9iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisgICAgICAgIDx0ZD5TYW1wbGVyYXRlIGluIEh6IGZvciBNUDMgZmlsZS4gVGhpcyBjYW4gYmUgc2V0IHRvCisgICAgICAgIGVpdGhlciA8Yj4zMjAwMDwvYj4sIDxiPjQ0MTAwPC9iPiBvciA8Yj40ODAwMDwvYj4uPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPmZvcm1hdC5tcDMuYnlNb2RlPC9iPjwvdGQ+CisgICAgICAgIDx0ZD5TdGVyZW9tb2RlIGZvciBNUDMgZmlsZS4gVGhpcyBjYW4gYmUgZWl0aGVyIDxiPkJFX01QM19NT0RFX1NURVJFTzwvYj4sCisgICAgICAgIDxiPkJFX01QM19NT0RFX0RVQUxDSEFOTkVMPC9iPiBvciA8Yj5CRV9NUDNfTU9ERV9NT05PLjwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGI+Zm9ybWF0Lm1wMy5iaXRyYXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZD5CaXRyYXRlIChpLmUuIHNpemUpIG9mIE1QMyBmaWxlIGluIGtCaXQvcy4gQWxsb3dlZAorICAgICAgICBiaXRyYXRlcyBhcmU6IDxiPjMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwKKyAgICAgICAgMTYwLCAxOTIsIDIyNCwgMjU2PC9iPiBhbmQgPGI+MzIwPC9iPi48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGI+Zm9ybWF0Lm1wMy5iQ29weXJpZ2h0PC9iPjwvdGQ+CisgICAgICAgIDx0ZD5JZiB0aGlzIGlzIHNldCB0byBUUlVFIHRoZSBDb3B5cmlnaHQgYml0IGluIHRoZSBNUDMKKyAgICAgICAgc3RyZWFtIHdpbGwgYmUgc2V0LjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Yj5mb3JtYXQubXAzLmJDUkM8L2I+PC90ZD4KKyAgICAgICAgPHRkPlNldCB0aGlzIHRvIFRSVUUgaW4gb3JkZXIgdG8gZW5hYmxlIENSQy1jaGVja3N1bSBpbgorICAgICAgICB0aGUgYml0c3RyZWFtLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Yj5mb3JtYXQubXAzLmJPcmlnaW5hbDwvYj48L3RkPgorICAgICAgICA8dGQ+SWYgdGhpcyBpcyBzZXQgdG8gVFJVRSB0aGUgT3JpZ2luYWwgYml0IGluIHRoZSBNUDMKKyAgICAgICAgc3RyZWFtIHdpbGwgYmUgc2V0LjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Yj5mb3JtYXQubXAzLmJQcml2YXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZD5JZiB0aGlzIGlzIHNldCB0byBUUlVFIHRoZSBQcml2YXRlIGJpdCBpbiB0aGUgTVAzCisgICAgICAgIHN0cmVhbSB3aWxsIGJlIHNldC48L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorCis8cD4mbmJzcDs8L3A+CisKKzxoMj48Zm9udCBzaXplPSI1Ij5UaGUgTEhWMSBCRV9DT05GSUcgLSBzdHJ1Y3R1cmUgKHJlY29tbWVuZGVkKTwvZm9udD48L2gyPgorCis8cD5UaGVzZSBhcmUgdGhlIG1lbWJlcnMgb2YgdGhlIExIVjEgQkVfQ09ORklHIHN0cnVjdHVyZSwgeW91CituZWVkIHRvIGZpbGwgaW4gYmVmb3JlIHlvdSBjYWxsIGJlSW5pdFN0cmVhbSgpOiA8YnI+Cis8L3A+CisKKzx0YWJsZSBib3JkZXI9IjAiPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPmR3Q29uZmlnPC9iPjwvdGQ+CisgICAgICAgIDx0ZD5TcGVjaWZpZXMgd2hhdCBraW5kIG9mIG91dHB1dCB5b3Ugd2FudC4gU2luY2Ugb25seQorICAgICAgICBNUDMgY3VycmVudGx5IGlzIHN1cHBvcnRlZCB5b3UgbXVzdCBzZXQgdGhpcyB0byA8Yj5CRV9DT05GSUdfTEFNRTwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Yj5mb3JtYXQuTEhWMS5kd1N0cnVjdFZlcnNpb248L2I+PC90ZD4KKyAgICAgICAgPHRkPkluZGljYXRlcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHN0cnVjdHVyZSwKKyAgICAgICAgY3VycmVudCB2ZXJzaW9uIG51bWJlciBpcyAxPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPmZvcm1hdC5MSFYxLmR3U3RydWN0U2l6ZTwvYj48L3RkPgorICAgICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBCRV9DT05GSUcgc3RydWN0dXJlCisgICAgICAgIChjdXJyZW50bHkgMzMxIGJ5dGVzKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPmZvcm1hdC5MSFYxLmR3U2FtcGxlUmF0ZTwvYj4mbmJzcDs8L3RkPgorICAgICAgICA8dGQ+U2FtcGxlcmF0ZSBpbiBIeiBmb3IgTVAzIGZpbGUuIFRoaXMgY2FuIGJlIHNldCB0bworICAgICAgICBlaXRoZXI6PGJyPgorICAgICAgICA8Yj4zMjAwMDwvYj4sIDxiPjQ0MTAwPC9iPiBvciA8Yj40ODAwMDwvYj4gZm9yIE1QRUctSTxicj4KKyAgICAgICAgPGI+MTYwMDA8L2I+LCA8Yj4yMjA1MDwvYj4gb3IgPGI+MjQwMDA8L2I+IGZvciBNUEVHLUk8YnI+CisgICAgICAgIDxiPjgwMDA8L2I+LCA8Yj4xMTAyNTwvYj4gb3IgPGI+MTIwMDA8L2I+IGZvciBNUEVHLUlJLjU8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGI+Zm9ybWF0LkxIVjEuZHdSZVNhbXBsZVJhdGU8L2I+PC90ZD4KKyAgICAgICAgPHRkPlNwZWNpZmllcyB0byB3aGljaCBzYW1wbGUgcmF0ZSB0aGUgaW5wdXQgc3RyZWFtIGhhcworICAgICAgICB0byBiZSByZXNhbXBsZWQsIGlmIHNldCB0byAwLCB0aGUgZW5jb2RlciB3aWxsIGRlY2lkZQorICAgICAgICB3aGljaCBSZVNhbXBsZSByYXRlIHRvIHVzZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Yj5mb3JtYXQuTEhWMS5uTW9kZTwvYj48L3RkPgorICAgICAgICA8dGQ+U3RlcmVvbW9kZSBmb3IgTVAzIGZpbGUuIFRoaXMgY2FuIGJlIGVpdGhlciA8Yj5CRV9NUDNfTU9ERV9TVEVSRU88L2I+LAorICAgICAgICA8Yj5CRV9NUDNfTU9ERV9KU1RFUkVPLCBCRV9NUDNfTU9ERV9EVUFMQ0hBTk5FTDwvYj4gb3IgPGI+QkVfTVAzX01PREVfTU9OTy48L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxzdHJvbmc+Zm9ybWF0LkxIVjEuZHdCaXRyYXRlPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgPHRkPkZvciBDQlIsIHRoaXMgc3BlY2lmaWVzIHRoZSBhY3R1YWwgYml0cmF0ZSwgZm9yIFZCUiwKKyAgICAgICAgaXQgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIGJpdHJhdGU8YnI+CisgICAgICAgIEFsbG93ZWQgYml0cmF0ZXMgYXJlOiA8Yj4zMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLAorICAgICAgICAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NjwvYj4gYW5kIDxiPjMyMDwvYj4uZm9yIE1QRUctSTxicj4KKyAgICAgICAgQWxsb3dlZCBiaXRyYXRlcyBhcmU6IDxiPjgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LAorICAgICAgICA4MCwgOTYsIDExMiwgMTI4LCAxNDQgPC9iPmFuZDxiPiAxNjA8L2I+LmZvciBNUEVHLUlJPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorICAgICAgICBkd0JpdHJhdGUgaXMgdXNlZCBhcyB0aGUgbWluaW11bSBiaXRyYXRlIGluIHRoZSBjYXNlIG9mCisgICAgICAgIHVzaW5nIGEgVkJSIG1vZGUuPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PHN0cm9uZz5mb3JtYXQuTEhWMS5kd01heEJpdHJhdGU8L3N0cm9uZz48L3RkPgorICAgICAgICA8dGQ+V2hlbiBWQlIgbW9kZSBpcyBlbmFibGVkLCBpdCBzcGVjaWZpZXMgdGhlIG1heGltdW0KKyAgICAgICAgYWxsb3dlZCBiaXRyYXRlIChzZWUgYWxzbyBkd0JpdHJhdGUgdG8gc3BlY2lmeSB0aGUgbWluaXVtCisgICAgICAgIGJpdHJhdGUpLCBmb3IgQ0JSIG1vZGUgdGhpcyBzZXR0aW5nIGlzIGlnbm9yZWQuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxzdHJvbmc+Zm9ybWF0LkxIVjEublByZXNldDwvc3Ryb25nPjwvdGQ+CisgICAgICAgIDx0ZD5LZWVwIGluIG1pbmQgdGhhdCB0aGUgcHJlc2V0cyBjYW4gb3ZlcndyaXRlIHNvbWUgb2YKKyAgICAgICAgdGhlIG90aGVyIHNldHRpbmdzLCBzaW5jZSBpdCBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZQorICAgICAgICBlbmNvZGVyIGlzIGluaXRpYWxpemVkPGJyPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQ+VGhlIG5QcmVzZXQgb3B0aW9uIGNhbiBiZSBzZXQgdG8gb25lIG9mIHRoZQorICAgICAgICAgICAgICAgIGZvbGxvd2luZyBwcmVzZXRzIHZhbHVlczo6PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDxwPkxRUF9OT1BSRVNFVCAoZG9uJ3QgdXNlIGFueSBwcmVzZXRzKTxicj4KKyAgICAgICAgTFFQX05PUk1BTF9RVUFMSVRZIChxdWFsaXR5IGlzIHNldCB0byA1KTxicj4KKyAgICAgICAgTFFQX0xPV19RVUFMSVRZIChxdWFsaXR5IGlzIHNldCB0byA5KTxicj4KKyAgICAgICAgTFFQX0hJR0hfUVVBTElUWSAocXVhbGl0eSBpcyBzZXQgdG8gMik8YnI+CisgICAgICAgIExRUF9WT0lDRV9RVUFMSVRZICh1c2UgZm9yIHZvaWNlIGVuY29kaW5nKTxicj4KKyAgICAgICAgTFFQX1IzTUlYIChyM21peCBwcmVzZXQgb3B0aW9uKTxicj4KKyAgICAgICAgTFFQX1ZFUllISUdIX1FVQUxJVFkgKHF1YWxpdHkgaXMgc2V0IHRvIDApPGJyPgorICAgICAgICBMUVBfU1RBTkRBUkQgKGxhbWUgY29tbWFuZCBsaW5lIGFsdC1wcmVzZXQgc3RhbmRhcmQpPGJyPgorICAgICAgICBMUVBfRkFTVF9TVEFOREFSRCAobGFtZSBjb21tYW5kIGxpbmUgYWx0LXByZXNldCBmYXN0CisgICAgICAgIHN0YW5kYXJkKTxicj4KKyAgICAgICAgTFFQX0VYVFJFTUUgKGxhbWUgY29tbWFuZCBsaW5lIGFsdC1wcmVzZXQgZXh0cmVtZSk8YnI+CisgICAgICAgIExRUF9GQVNUX0VYVFJFTUUgKGxhbWUgY29tbWFuZCBsaW5lIGFsdC1wcmVzZXQgZmFzdAorICAgICAgICBleHRyZW1lKTxicj4KKyAgICAgICAgTFFQX0lOU0FORSAobGFtZSBjb21tYW5kIGxpbmUgYWx0LXByZXNldCBpbnNhbmUpPGJyPgorICAgICAgICBMUVBfQUJSIChsYW1lIGNvbW1hbmQgbGluZSBhbHQtcHJlc2V0IGFicik8YnI+CisgICAgICAgIExRUF9DQlIobGFtZSBjb21tYW5kIGxpbmUgYWx0LXByZXNldCBjYnIpPGJyPgorICAgICAgICA8YnI+CisgICAgICAgIDxzdHJvbmc+KG9sZCBsYW1lIHByZXNldCBvcHRpb25zKTwvc3Ryb25nPjxicj4KKyAgICAgICAgTFFQX1BIT05FIDxicj4KKyAgICAgICAgTFFQX1NXPGJyPgorICAgICAgICBMUVBfQU08YnI+CisgICAgICAgIExRUF9GTTxicj4KKyAgICAgICAgTFFQX1ZPSUNFPGJyPgorICAgICAgICBMUVBfUkFESU88YnI+CisgICAgICAgIExRUF9UQVBFPGJyPgorICAgICAgICBMUVBfSElGSTxicj4KKyAgICAgICAgTFFQX0NEPGJyPgorICAgICAgICBMUVBfU1RVRElPPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPmZvcm1hdC5MSFYxLmJDb3B5cmlnaHQ8L2I+PC90ZD4KKyAgICAgICAgPHRkPklmIHRoaXMgaXMgc2V0IHRvIFRSVUUgdGhlIENvcHlyaWdodCBiaXQgaW4gdGhlIE1QMworICAgICAgICBzdHJlYW0gd2lsbCBiZSBzZXQuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPmZvcm1hdC5MSFYxLmJDUkM8L2I+PC90ZD4KKyAgICAgICAgPHRkPlNldCB0aGlzIHRvIFRSVUUgaW4gb3JkZXIgdG8gZW5hYmxlIENSQy1jaGVja3N1bSBpbgorICAgICAgICB0aGUgYml0c3RyZWFtLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Yj5mb3JtYXQuTEhWMS5iT3JpZ2luYWw8L2I+PC90ZD4KKyAgICAgICAgPHRkPklmIHRoaXMgaXMgc2V0IHRvIFRSVUUgdGhlIE9yaWdpbmFsIGJpdCBpbiB0aGUgTVAzCisgICAgICAgIHN0cmVhbSB3aWxsIGJlIHNldC48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGI+Zm9ybWF0LkxIVjEuYlByaXZhdGU8L2I+PC90ZD4KKyAgICAgICAgPHRkPklmIHRoaXMgaXMgc2V0IHRvIFRSVUUgdGhlIFByaXZhdGUgYml0IGluIHRoZSBNUDMKKyAgICAgICAgc3RyZWFtIHdpbGwgYmUgc2V0LjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxzdHJvbmc+Zm9ybWF0LkxIVjEublZick1ldGhvZDwvc3Ryb25nPjwvdGQ+CisgICAgICAgIDx0ZD5TZXBlY2lmZXMgaWYgdGhlIFZCUiBtZXRob2QgdG8gdXNlLCBjdXJyZW50bHkgdGhlCisgICAgICAgIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgc3VwcG9ydGVkOjxwPjxmb250IHNpemU9IjMiPlZCUl9NRVRIT0RfTk9ORQorICAgICAgICAoZG9uJ3QgdXNlIFZCUiwgdXNlIENCUiBlbmNvZGluZyBpbnN0ZWFkKSw8YnI+CisgICAgICAgIFZCUl9NRVRIT0RfREVGQVVMVCAoZGVmYXVsdCBWQlIgbWV0aG9kKTxicj4KKyAgICAgICAgVkJSX01FVEhPRF9PTEQgKG9sZCBWQlIgbWV0aG9kLCBwcm92ZW4gdG8gYmUgcmVsaWFibGUpPGJyPgorICAgICAgICBWQlJfTUVUSE9EX05FVyAobmV3IFZCUiBtZXRob2QsIGZhc3RlciB0aGFuCisgICAgICAgIFZCUl9NRVRIT0RfT0xEKTxicj4KKyAgICAgICAgVkJSX01FVEhPRF9NVFJIIChkZXByZWNpYXRlZCwgc2FtZSBhcyBWQlJfTUVUSE9EX05FVyk8YnI+CisgICAgICAgIFZCUl9NRVRIT0RfQUJSIChBdmVyYWdlIEJpdHJhdGUgRW5jb2RpbmcsIHNlZSBhbHNvIDwvZm9udD48c3Ryb25nPmZvcm1hdC5MSFYxLmR3VmJyQWJyX2Jwczwvc3Ryb25nPjxmb250CisgICAgICAgIHNpemU9IjMiPik8L2ZvbnQ+PC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PHN0cm9uZz5mb3JtYXQuTEhWMS5iV3JpdGVWQlJIZWFkZXI8L3N0cm9uZz48L3RkPgorICAgICAgICA8dGQ+U2VwZWNpZmVzIGlmIHRoZSBhIFhJTkcgVkJSIGhlYWRlciBzaG91bGQgYmUgd3JpdHRlbgorICAgICAgICBvciBub3QuIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgeW91IGhhdmUgdG8gY2FsbCB0aGUKKyAgICAgICAgPGZvbnQgc2l6ZT0iMyI+YmVXcml0ZVZCUkhlYWRlciBmdW5jdGlvbiB3aGVuIGVuY29kaW5nCisgICAgICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIFZCUiBpbmZvIHRhZworICAgICAgICBjYW4gYWxzbyBiZSB3cml0dGVuIGZvciBDQlIgZW5jb2RlZCBmaWxlcywgdGhlIFRBRyBpbmZvCisgICAgICAgIGNhbiBiZSB1c2VmdWwgZm9yIGFkZGl0aW9uYWwgaW5mbyBsaWtlIGVuY29kZXIgZGVsYXkgYW5kCisgICAgICAgIHRoZSBsaWtlLjwvZm9udD48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PHN0cm9uZz5mb3JtYXQuTEhWMS5iRW5hYmxlVkJSPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgPHRkPlNwZWNpZmllcyBpZiBWQlIgZW5jb2Rpbmcgb3B0aW9uIHNoYWxsIGJlIHVzZWQgb3IKKyAgICAgICAgbm90LCBwb3NzaWJsZSB2YWx1ZXMgYXJlIFRSVUUvRkFMU0U8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PHN0cm9uZz5mb3JtYXQuTEhWMS5uVkJSUXVhbGl0eTwvc3Ryb25nPjwvdGQ+CisgICAgICAgIDx0ZD5RdWFsaXR5IG9wdGlvbiBpZiBWQlIgaXMgZW5hYmxlZCAoMD1oaWdoZXN0IHF1YWxpdHksCisgICAgICAgIDkgaXMgbG93ZXN0IHF1YWxpdHkpPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxzdHJvbmc+Zm9ybWF0LkxIVjEuZHdWYnJBYnJfYnBzPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgPHRkPklmIHRoZSBBdmVyYWdlIEJpdCBSYXRlIGlzIHNwZWNpZmllZCwgdGhlIGxhbWUKKyAgICAgICAgZW5jb2RlciBpZ25vcmVzIHRoZSBuVkJSUXVhbGl0eSBzZXR0aW5ncyAoSG93ZXZlciwgPHN0cm9uZz5iRW5hYmxlVkJSPC9zdHJvbmc+CisgICAgICAgIG11c3QgYmUgc2V0IHRvIFRSVUUgYW5kIHRoZSA8c3Ryb25nPmZvcm1hdC5MSFYxLm5WYnJNZXRob2QKKyAgICAgICAgPC9zdHJvbmc+cGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgdG88c3Ryb25nPiA8L3N0cm9uZz48Zm9udAorICAgICAgICBzaXplPSIzIj48c3Ryb25nPlZCUl9NRVRIT0RfQUJSPC9zdHJvbmc+KS4gVGhlIGFsbG93ZWQKKyAgICAgICAgcmFuZ2UgZm9yIHRoZSA8L2ZvbnQ+PHN0cm9uZz5mb3JtYXQuTEhWMS5kd1ZickFicl9icHMgPC9zdHJvbmc+cGFyYW1ldGVyPHN0cm9uZz4KKyAgICAgICAgPC9zdHJvbmc+YW55IGludGVnZXIgdmFsdWUgPGZvbnQgc2l6ZT0iMyI+YmV0d2Vlbjo8L2ZvbnQ+PHA+PHN0cm9uZz5NUEVHLUk6PC9zdHJvbmc+CisgICAgICAgIDMyMDAwIC4uIDMyMDAwMCBicHM8Yj48YnI+CisgICAgICAgIDwvYj48c3Ryb25nPk1QRUctSUk6PC9zdHJvbmc+IDgwMDAgLi4gMTYwMDAwIGJwczwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CisgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PHN0cm9uZz5mb3JtYXQuTEhWMS5iTm9CaXRSZXM8L3N0cm9uZz48L3RkPgorICAgICAgICA8dGQ+RGlzYWJsZXMgdGhlIGJpdC1yZXNvcnZvaXIgYW5kIGRpc2FibGVzIHRoZSBpbnNlcnRpb24KKyAgICAgICAgb2YgcGFkZGVkIGZyYW1lczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48c3Ryb25nPmZvcm1hdC5MSFYxLm5RdWFsaXR5PC9zdHJvbmc+PC90ZD4KKyAgICAgICAgPHRkPlF1YWxpdHkgU2V0dGluZywgSElHSCBCWVRFIHNob3VsZCBiZSBOT1QgTE9XIGJ5dGUsCisgICAgICAgIG90aGVyd2hpc2UgcXVhbGl0eSBpcyBzZXQgdG8gNS4gVGhpcyBpcyBkb25lIHRvIGJlCisgICAgICAgIGJhY2t3YXJkIGNvbXBhdGlibGUuIFNvIHRvIHNldCBxdWFsaXR5IHRvIDMsIHlvdSBoYXZlIHRvCisgICAgICAgIHNldCB0aGUgblF1YWxpdHkgcGFyYW1ldGVyIHRvIDB4RkMwMy48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGI+Zm9ybWF0Lm1wMy5idFJlc2VydmVkPC9iPjwvdGQ+CisgICAgICAgIDx0ZD5Gb3IgZnV0dXJlIHVzZSwgc2V0IGFsbCBlbGVtZW50cyB0byB6ZXJvPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPHA+Jm5ic3A7PC9wPgorCis8cD4mbmJzcDsgPC9wPgorCis8aHI+CisKKzxoMT48YSBuYW1lPSJiZUluaXRTdHJlYW0oKSI+PGZvbnQgc2l6ZT0iNSI+YmVJbml0U3RyZWFtKCk8L2ZvbnQ+PC9hPgorPC9oMT4KKworPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjE2IiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMCUiPjxiPlN5bm9wc2lzOjwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI4MCUiPkJFX0VSUiBiZUluaXRTdHJlYW0oCisgICAgICAgIFBCRV9DT05GSUcgPGk+cGJlQ29uZmlnPC9pPiwgUERXT1JEIDxpPmR3U2FtcGxlczwvaT4sCisgICAgICAgIFBEV09SRCA8aT5kd0J1ZmZlclNpemU8L2k+LCBQSEJFX1NUUkVBTSA8aT5waGJlU3RyZWFtPC9pPgorICAgICAgICApPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAlIj48Yj5QYXJhbWV0ZXJzOjwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI4MCUiPjx0YWJsZSBib3JkZXI9IjAiCisgICAgICAgIGNlbGxzcGFjaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwJSI+PGk+cGJlQ29uZmlnPC9pPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPlBvaW50ZXIgYXQgdGhlIHN0cnVjdCBjb250YWluaW5nIGVuY29kZXIKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxpPmR3U2FtcGxlczwvaT48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD5Qb2ludGVyIGF0IGRvdWJsZSB3b3JkIHdoZXJlIG51bWJlciBvZgorICAgICAgICAgICAgICAgIHNhbXBsZXMgdG8gc2VuZCB0byBlYWNoIDxpPmJlRW5jb2RlQ2h1bmsoKTwvaT4gaXMKKyAgICAgICAgICAgICAgICByZXR1cm5lZC48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxpPmR3QnVmZmVyU2l6ZTwvaT48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD5Qb2ludGVyIGF0IGRvdWJsZSB3b3JkIHdoZXJlIG1pbmltdW0gc2l6ZSBpbgorICAgICAgICAgICAgICAgIGJ5dGVzIG9mIG91dHB1dCBidWZmZXIgaXMgcmV0dXJuZWQuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48aT5waGJlU3RyZWFtPC9pPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPlBvaW50ZXIgYXQgaW50ZWdlciB3aGVyZSBTdHJlYW0gaGFuZGxlIGlzCisgICAgICAgICAgICAgICAgcmV0dXJuZWQuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwJSI+PGI+RGVzY3JpcHRpb246PC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjgwJSI+VGhpcyBmdW5jdGlvbiBpcyB0aGUgZmlyc3QKKyAgICAgICAgdG8gY2FsbCBiZWZvcmUgc3RhcnRpbmcgYW4gZW5jb2Rpbmcgc3RyZWFtLjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxocj4KKworPGgxPjxhIG5hbWU9ImJlRW5jb2RlQ2h1bmsoKSI+PGZvbnQgc2l6ZT0iNSI+YmVFbmNvZGVDaHVuaygpPC9mb250PgorPC9hPjwvaDE+CisKKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxNiIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAlIj48Yj5TeW5vcHNpczo8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iODAlIj5CRV9FUlIgYmVFbmNvZGVDaHVuaygKKyAgICAgICAgSEJFX1NUUkVBTSA8aT5oYmVTdHJlYW08L2k+LCBEV09SRCA8aT5uU2FtcGxlczwvaT4sCisgICAgICAgIFBTSE9SVCA8aT5wU2FtcGxlczwvaT4sIFBCWVRFIDxpPnBPdXRwdXQ8L2k+LCBQRFdPUkQgPGk+cGR3T3V0cHV0PC9pPgorICAgICAgICApPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAlIj48Yj5QYXJhbWV0ZXJzOjwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxMCIKKyAgICAgICAgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwJSI+PGk+aGJlU3RyZWFtPC9pPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiPkhhbmRsZSBvZiB0aGUgc3RyZWFtLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkwIj48aT5uU2FtcGxlczwvaT48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD5OdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBlbmNvZGVkIGZvciB0aGlzCisgICAgICAgICAgICAgICAgY2FsbC4gVGhpcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIHdoYXQgaXMKKyAgICAgICAgICAgICAgICByZXR1cm5lZCBieSA8aT5iZUluaXRTdHJlYW0oKTwvaT4sIHVubGVzcyB5b3UgYXJlCisgICAgICAgICAgICAgICAgZW5jb2RpbmcgdGhlIGxhc3QgY2h1bmssIHdoaWNoIG1pZ2h0IGJlIHNtYWxsZXIuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTAiPjxpPnBTYW1wbGVzPC9pPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPlBvaW50ZXIgYXQgdGhlIDE2LWJpdCBzaWduZWQgc2FtcGxlcyB0byBiZQorICAgICAgICAgICAgICAgIGVuY29kZWQuIFRoZXNlIHNob3VsZCBiZSBpbiBzdGVyZW8gd2hlbiBlbmNvZGluZworICAgICAgICAgICAgICAgIGEgc3RlcmVvIE1QMyBhbmQgbW9ubyB3aGVuIGVuY29kaW5nIGEgbW9ubyBNUDMuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTAiPjxpPnBPdXRwdXQ8L2k+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+V2hlcmUgdG8gd3JpdGUgdGhlIGVuY29kZWQgZGF0YS4gVGhpcyBidWZmZXIKKyAgICAgICAgICAgICAgICBzaG91bGQgYmUgYXQgbGVhc3Qgb2YgdGhlIG1pbmltdW0gc2l6ZSByZXR1cm5lZAorICAgICAgICAgICAgICAgIGJ5IDxpPmJlSW5pdFN0cmVhbSgpPC9pPi48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MCI+PGk+cGR3T3V0cHV0PC9pPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPldoZXJlIHRvIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgb2YgZW5jb2RlZAorICAgICAgICAgICAgICAgIGRhdGEgd3JpdHRlbi4gVGhlIGFtb3VudCBvZiBkYXRhIHdyaXR0ZW4gbWlnaHQKKyAgICAgICAgICAgICAgICB2YXJ5IGZyb20gY2h1bmsgdG8gY2h1bmsuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwJSI+PGI+RGVzY3JpcHRpb246PC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+RW5jb2RlcyBhIGNodW5rIG9mIHNhbXBsZXMuIDxpPlBsZWFzZQorICAgICAgICBub3RlIHRoYXQgaWYgeW91IGhhdmUgc2V0IHRoZSBvdXRwdXQgdG8gZ2VuZXJhdGUgbW9ubyBNUDMKKyAgICAgICAgZmlsZXMgeW91IG11c3QgZmVlZCBiZUVuY29kZUNodW5rKCkgd2l0aCBtb25vIHNhbXBsZXMhPC9pPjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxocj4KKworPGgxPjxhIG5hbWU9ImJlRGVpbml0U3RyZWFtKCkiPjxmb250IHNpemU9IjUiPmJlRGVpbml0U3RyZWFtKCk8L2ZvbnQ+Cis8L2E+PC9oMT4KKworPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjE2IiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMCUiPjxiPlN5bm9wc2lzOjwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI4MCUiPkJFX0VSUiBiZURlaW5pdFN0cmVhbSgKKyAgICAgICAgSEJFX1NUUkVBTSA8aT5oYmVTdHJlYW08L2k+LCBQQllURSA8aT5wT3V0cHV0PC9pPiwgUERXT1JECisgICAgICAgIDxpPnBkd091dHB1dDwvaT4gKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwJSI+PGI+UGFyYW1ldGVyczo8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMTAiCisgICAgICAgIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMCUiPjxpPmhiZVN0cmVhbTwvaT48L3RkPgorICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIj5IYW5kbGUgb2YgdGhlIHN0cmVhbS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxpPnBPdXRwdXQ8L2k+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+V2hlcmUgdG8gd3JpdGUgdGhlIGVuY29kZWQgZGF0YS4gVGhpcyBidWZmZXIKKyAgICAgICAgICAgICAgICBzaG91bGQgYmUgYXQgbGVhc3Qgb2YgdGhlIG1pbmltdW0gc2l6ZSByZXR1cm5lZAorICAgICAgICAgICAgICAgIGJ5IDxpPmJlSW5pdFN0cmVhbSgpPC9pPi48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQ+PGk+cGR3T3V0cHV0PC9pPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPldoZXJlIHRvIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgb2YgZW5jb2RlZAorICAgICAgICAgICAgICAgIGRhdGEgd3JpdHRlbi48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAlIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIKKyAgICAgICAgZW5jb2RpbmcgdGhlIGxhc3QgY2h1bmsgaW4gb3JkZXIgdG8gZmx1c2ggdGhlIGVuY29kZXIuIEl0CisgICAgICAgIHdyaXRlcyBhbnkgZW5jb2RlZCBkYXRhIHRoYXQgc3RpbGwgbWlnaHQgYmUgbGVmdCBpbnNpZGUKKyAgICAgICAgdGhlIGVuY29kZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkCisgICAgICAgIE5PVCBiZSBjYWxsZWQgdW5sZXNzIHlvdSBoYXZlIGVuY29kZWQgYWxsIG9mIHRoZSBjaHVua3MKKyAgICAgICAgaW4geW91ciBzdHJlYW0uPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPGhyPgorCis8aDE+PGEgbmFtZT0iYmVDbG9zZVN0cmVhbSgpIj48Zm9udCBzaXplPSI1Ij5iZUNsb3NlU3RyZWFtKCk8L2ZvbnQ+PC9hPgorPC9oMT4KKworPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjE2IiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMCUiPjxiPlN5bm9wc2lzOjwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkJFX0VSUiBiZUNsb3NlU3RyZWFtKCBIQkVfU1RSRUFNIDxpPmhiZVN0cmVhbTwvaT4KKyAgICAgICAgKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkwIj48Yj5QYXJhbWV0ZXJzOjwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxMCIKKyAgICAgICAgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48aT5oYmVTdHJlYW08L2k+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+SGFuZGxlIG9mIHRoZSBzdHJlYW0uPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkwIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5MYXN0IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZpbmlzaGVkCisgICAgICAgIGVuY29kaW5nIGEgc3RyZWFtLiBTaG91bGQgdW5saWtlIDxpPmJlRGVpbml0U3RyZWFtKCk8L2k+CisgICAgICAgIGFsc28gYmUgY2FsbGVkIGlmIHRoZSBlbmNvZGluZyBpcyBjYW5jZWxlZC48L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorCis8aHI+CisKKzxoMT48YSBuYW1lPSJiZVZlcnNpb24oKSI+PGZvbnQgc2l6ZT0iNSI+YmVWZXJzaW9uKCk8L2ZvbnQ+IDwvYT48L2gxPgorCis8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMTYiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwJSI+PGI+U3lub3BzaXM6PC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Vk9JRCBiZVZlcnNpb24oIFBCRV9WRVJTSU9OIDxpPnBiZVZlcnNpb248L2k+CisgICAgICAgICk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlBhcmFtZXRlcnM6PC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEwIgorICAgICAgICB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAlIj48aT5wYmVWZXJzaW9uPC9pPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPlBvaW50ZXIgYXQgc3RydWN0IHdoZXJlIHZlcnNpb24gbnVtYmVyLAorICAgICAgICAgICAgICAgIHJlbGVhc2UgZGF0ZSBhbmQgVVJMIGZvciBob21lcGFnZSBpcyByZXR1cm5lZC48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5SZXR1cm5zIGluZm9ybWF0aW9uIGxpa2UgdmVyc2lvbiBudW1iZXJzCisgICAgICAgIChib3RoIG9mIHRoZSBETEwgYW5kIGVuY29kaW5nIGVuZ2luZSksIHJlbGVhc2UgZGF0ZSBhbmQKKyAgICAgICAgVVJMIGZvciBsYW1lX2VuYydzIGhvbWVwYWdlLiBBbGwgdGhpcyBpbmZvcm1hdGlvbiBzaG91bGQKKyAgICAgICAgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgb2YgeW91ciBwcm9kdWN0IHRocm91Z2ggYQorICAgICAgICBkaWFsb2cgYm94IG9yIHNvbWV0aGluZyBzaW1pbGFyLjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxwPiZuYnNwOzwvcD4KKworPGhyPgorCis8cD4mbmJzcDs8L3A+CisKKzxoMT48YSBuYW1lPSJiZVdyaXRlVkJSSGVhZGVyKCkiPjxmb250IHNpemU9IjUiPmJlV3JpdGVWQlJIZWFkZXIoKTwvZm9udD4KKzwvYT48L2gxPgorCis8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMTYiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwJSI+PGI+U3lub3BzaXM6PC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Vk9JRCBiZVdyaXRlVkJSSGVhZGVyKCBMUENTVFIgPGk+cHN6TVAzRmlsZU5hbWU8L2k+CisgICAgICAgICk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlBhcmFtZXRlcnM6PC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEwIgorICAgICAgICB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAlIj48aT5wc3pNUDNGaWxlTmFtZTwvaT48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD5Db25zdCBQb2ludGVyIHplcm8gdGVybWluYXRlZCBzdHJpbmcsIHRoYXQKKyAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgTVAzIGZpbGUgbmFtZS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Xcml0ZXMgYSBYaW5nIEhlYWRlciBpbiBmcm9udCBvZiB0aGUgTVAzCisgICAgICAgIGZpbGUuIE1ha2Ugc3VyZSB0aGF0IHRoZSBNUDMgZmlsZSBpcyBjbG9zZWQsIGFuZCB0aGUgdGhlCisgICAgICAgIGJlQ29uZmlnLmZvcm1hdC5MSFYxLmJXcml0ZVZCUkhlYWRlciBoYXMgYmVlbiBzZXQgdG8KKyAgICAgICAgVFJVRS4gSW4gYWRkaXRpb24sIGl0IGlzIGFsd2F5cyBzYXZlIHRvIGNhbGwKKyAgICAgICAgYmVXcml0ZVZCUkhlYWRlciBhZnRlciB0aGUgZW5jb2RpbmcgaGFzIGJlZW4gZmluaXNoZWQsCisgICAgICAgIGV2ZW4gd2hlbiB0aGUgYmVDb25maWcuZm9ybWF0LkxIVjEuYldyaXRlVkJSSGVhZGVyIGlzIG5vdAorICAgICAgICBzZXQgdG8gVFJVRTwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxwPiZuYnNwOzwvcD4KKworPHA+Jm5ic3A7PC9wPgorCis8aHI+CisKKzxwPiZuYnNwOzwvcD4KKworPGgxPjxhIG5hbWU9IkxhbWVfZW5jLmRsbCBkZWJ1ZyBvcHRpb24iPkxhbWVfZW5jLmRsbCBkZWJ1ZyBvcHRpb248L2E+PC9oMT4KKworPHA+VGhlIGxhbWVfZW5jLmRsbCBoYXMgYSBidWlsdC1pbiBkZWJ1ZyBvcHRpb24sIHRoYXQgZHVtcHMgYWxsCit0aGUgaW1wb3J0YW50IGludGVybmFsIHNldHRpbmdzIHRvIGEgdGV4dCBmaWxlLiBUbyBlbmFibGUgdGhpcworZmVhdHVyZSwgY3JlYXRlIGEgdGV4dCBmaWxlIGluIHRoZSBXaW5kb3dzIGRpcmVjdG9yeSB3aGljaCBpcworbmFtZWQgbGFtZV9lbmMuaW5pLCBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB0d28gbGluZXM8L3A+CisKKzxwPltkZWJ1Z108YnI+CitXcml0ZUxvZ0ZpbGU9MTwvcD4KKworPHA+U2F2ZSB0aGlzIHRleHQgZmlsZSwgYW5kIGVhY2ggdGltZSB5b3UgZW5jb2RlIGEgZmlsZSwgdGhlCitzZXR0aW5ncyBhcmUgYWRkZWQgdG8gYSBmaWxlIG5hbWUgbGFtZV9lbmMudHh0LCB0aGF0IGlzIGxvY2F0ZWQKK2luIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgbGFtZV9lbmMuZGxsPC9wPgorCis8cD4mbmJzcDs8L3A+CisKKzxwPjxicj4KKyZuYnNwOyA8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9EbGwvTGFtZURsbF92YzYuZHNwIGIvRGxsL0xhbWVEbGxfdmM2LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDA3YzY5Ci0tLSAvZGV2L251bGwKKysrIGIvRGxsL0xhbWVEbGxfdmM2LmRzcApAQCAtMCwwICsxLDExOCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJMYW1lTXAzRW5jRGxsIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogTklDSFQgQkVBUkJFSVRFTiAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDINCisNCitDRkc9TGFtZU1wM0VuY0RsbCAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJMYW1lRGxsX3ZjNi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIkxhbWVEbGxfdmM2Lm1hayIgQ0ZHPSJMYW1lTXAzRW5jRGxsIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgRvxyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoNCishTUVTU0FHRSANCishTUVTU0FHRSAiTGFtZU1wM0VuY0RsbCAtIFdpbjMyIFJlbGVhc2UiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJMYW1lTXAzRW5jRGxsIC0gV2luMzIgRGVidWciIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJMYW1lTXAzRW5jRGxsIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXG91dHB1dFxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZVxMYW1lTXAzRW5jRGxsIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkxBTUVNUDNFTkNETExfRVhQT1JUUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vIiAvSSAiLi4vbGlibXAzbGFtZSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJMQU1FTVAzRU5DRExMX0VYUE9SVFMiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBsaWJtcDNsYW1lLXN0YXRpYy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uXG91dHB1dFxSZWxlYXNlXGxhbWVfZW5jLmRsbCIgL2xpYnBhdGg6Ii4uXG91dHB1dFxSZWxlYXNlIiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvbm9kZWZhdWx0bGliDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkxhbWVNcDNFbmNEbGwgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcRGVidWdcTGFtZU1wM0VuY0RsbCINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJMQU1FTVAzRU5DRExMX0VYUE9SVFMiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uL2luY2x1ZGUiIC9JICIuLi8iIC9JICIuLi9saWJtcDNsYW1lIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkxBTUVNUDNFTkNETExfRVhQT1JUUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBsaWJtcDNsYW1lLXN0YXRpYy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uXG91dHB1dFxEZWJ1Z1xsYW1lX2VuYy5kbGwiIC9wZGJ0eXBlOnNlcHQgL2xpYnBhdGg6Ii4uXG91dHB1dFxEZWJ1ZyIgL29wdDpOT1dJTjk4DQorIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lIC9pbmNyZW1lbnRhbDpubw0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiTGFtZU1wM0VuY0RsbCAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJMYW1lTXAzRW5jRGxsIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cQmxhZGVNUDNFbmNETEwuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEJsYWRlTVAzRW5jRExMLmRlZg0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxCbGFkZU1QM0VuY0RMTC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL0RsbC9MYW1lRGxsX3ZjOC52Y3Byb2ogYi9EbGwvTGFtZURsbF92YzgudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTNkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9EbGwvTGFtZURsbF92YzgudmNwcm9qCkBAIC0wLDAgKzEsNTA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOS4wMCINCisJTmFtZT0iTGFtZURsbF92YzgiDQorCVByb2plY3RHVUlEPSJ7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fSINCisJUm9vdE5hbWVzcGFjZT0iTGFtZURsbF92YzgiDQorCUtleXdvcmQ9IldpbjMyUHJvaiINCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJ4NjQiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMQU1FRExMX1ZDOF9FWFBPUlRTIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuLi9vdXRwdXQvbGFtZV9lbmMuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iQmxhZGVNUDNFbmNEbGwuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMQU1FRExMX1ZDOF9FWFBPUlRTIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuLi9vdXRwdXQvbGFtZV9lbmMuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iQmxhZGVNUDNFbmNEbGwuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnIEdUS3xXaW4zMiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLzsuLi9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7TEFNRURMTF9WQzhfRVhQT1JUUyINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLi4vb3V0cHV0L2xhbWVfZW5jLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9IkJsYWRlTVAzRW5jRGxsLmRlZiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLzsuLi9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TEFNRURMTF9WQzhfRVhQT1JUUyINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLi4vb3V0cHV0L2xhbWVfZW5jLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9IkJsYWRlTVAzRW5jRGxsLmRlZiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnIEdUS3x4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtMQU1FRExMX1ZDOF9FWFBPUlRTIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuLi9vdXRwdXQvbGFtZV9lbmMuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iQmxhZGVNUDNFbmNEbGwuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UiDQorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXEJsYWRlTVAzRW5jRExMLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXEJsYWRlTVAzRW5jRExMLmRlZiINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXEJsYWRlTVAzRW5jRExMLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvRGxsL01QM2V4cG9ydC5wYXMgYi9EbGwvTVAzZXhwb3J0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjU1YmJhCi0tLSAvZGV2L251bGwKKysrIGIvRGxsL01QM2V4cG9ydC5wYXMKQEAgLTAsMCArMSwzMDMgQEAKK3VuaXQgTVAzZXhwb3J0OworCitpbnRlcmZhY2UKKworVXNlcyBTeXNVdGlscywgV2luVHlwZXMsIFdpblByb2NzLCBNZXNzYWdlcywgQ2xhc3NlcywgR3JhcGhpY3MsIENvbnRyb2xzLAorRm9ybXMsIERpYWxvZ3MsIFN0ZEN0cmxzOworCit0eXBlCisvL3R5cGUgZGVmaW5pdGlvbnMKKy8vdHlwZWRlZgkJdW5zaWduZWQgbG9uZwkJCUhCRV9TVFJFQU07CisvL3R5cGVkZWYJCUhCRV9TVFJFQU0JCQkJKlBIQkVfU1RSRUFNOworLy90eXBlZGVmCQl1bnNpZ25lZCBsb25nCQkJQkVfRVJSOworICBUSEJFX1NUUkVBTSA9IExvbmdXb3JkOworICBQSEJFX1NUUkVBTSA9IF5QSEJFX1NUUkVBTTsKKyAgQkVfRVJSID0gTG9uZ1dvcmQ7CisKK2NvbnN0CisvLyBlbmNvZGluZyBmb3JtYXRzCisvLyNkZWZpbmUJCUJFX0NPTkZJR19NUDMJCQkwCisvLyNkZWZpbmUJCUJFX0NPTkZJR19MQU1FCQkJMjU2CisgIEJFX0NPTkZJR19NUDMJID0gMDsKKyAgQkVfQ09ORklHX0xBTUUgPSAyNTY7CisKKworLy8gZXJyb3IgY29kZXMKKy8vI2RlZmluZSAgICBCRV9FUlJfU1VDQ0VTU0ZVTAkJICAgICAgICAweDAwMDAwMDAwCisvLyNkZWZpbmUgICAgQkVfRVJSX0lOVkFMSURfRk9STUFUCQkweDAwMDAwMDAxCisvLyNkZWZpbmUgICAgQkVfRVJSX0lOVkFMSURfRk9STUFUX1BBUkFNRVRFUlMJMHgwMDAwMDAwMgorLy8jZGVmaW5lICAgIEJFX0VSUl9OT19NT1JFX0hBTkRMRVMJCTB4MDAwMDAwMDMKKy8vI2RlZmluZSAgICBCRV9FUlJfSU5WQUxJRF9IQU5ETEUJCTB4MDAwMDAwMDQKK0JFX0VSUl9TVUNDRVNTRlVMOiBMb25nV29yZCA9IDA7CitCRV9FUlJfSU5WQUxJRF9GT1JNQVQ6IExvbmdXb3JkID0gMTsKK0JFX0VSUl9JTlZBTElEX0ZPUk1BVF9QQVJBTUVURVJTOiBMb25nV29yZCA9IDI7CitCRV9FUlJfTk9fTU9SRV9IQU5ETEVTOiBMb25nV29yZCA9IDM7CitCRV9FUlJfSU5WQUxJRF9IQU5ETEU6IExvbmdXb3JkID0gNDsKKworLy8gb3RoZXIgY29uc3RhbnRzCisKK0JFX01BWF9IT01FUEFHRQk9IDI1NjsKKworLy8gZm9ybWF0IHNwZWNpZmljIHZhcmlhYmxlcworCitCRV9NUDNfTU9ERV9TVEVSRU8gPSAwOworQkVfTVAzX01PREVfRFVBTENIQU5ORUwgPSAyOworQkVfTVAzX01PREVfTU9OTyA9IDM7CisKK3R5cGUKKworICBUTVAzID0gcGFja2VkIHJlY29yZAorICAgICAgICAgICBkd1NhbXBsZVJhdGUgICAgIDogTG9uZ1dvcmQ7CisgICAgICAgICAgIGJ5TW9kZSAgICAgICAgICAgOiBCeXRlOworICAgICAgICAgICB3Qml0UmF0ZSAgICAgICAgIDogV29yZDsKKyAgICAgICAgICAgYlByaXZhdGUgICAgICAgICA6IExvbmdXb3JkOworICAgICAgICAgICBiQ1JDICAgICAgICAgICAgIDogTG9uZ1dvcmQ7CisgICAgICAgICAgIGJDb3B5cmlnaHQgICAgICAgOiBMb25nV29yZDsKKyAgICAgICAgICAgYk9yaWdpbmFsICAgICAgICA6IExvbmdXb3JkOworICAgICAgICAgICBlbmQ7CisKKyAgVExIVjEgPSBwYWNrZWQgcmVjb3JkCisgICAgICAgICAgLy8gU1RSVUNUVVJFIElORk9STUFUSU9OCisgICAgICAgICAgICBkd1N0cnVjdFZlcnNpb246IERXT1JEOworICAgICAgICAgICAgZHdTdHJ1Y3RTaXplOiBEV09SRDsKKworICAgICAgICAgIC8vIEJBU0lDIEVOQ09ERVIgU0VUVElOR1MKKyAgICAgICAgICAgIGR3U2FtcGxlUmF0ZTogRFdPUkQ7CS8vIEFMTE9XRUQgU0FNUExFUkFURSBWQUxVRVMgREVQRU5EUyBPTiBkd01QRUdWZXJzaW9uCisgICAgICAgICAgICBkd1JlU2FtcGxlUmF0ZTogRFdPUkQ7CS8vIERPV05TQU1QTEVSQVRFLCAwPUVOQ09ERVIgREVDSURFUworICAgICAgICAgICAgbk1vZGU6IEludGVnZXI7CSAgCS8vIEJFX01QM19NT0RFX1NURVJFTywgQkVfTVAzX01PREVfRFVBTENIQU5ORUwsIEJFX01QM19NT0RFX01PTk8KKyAgICAgICAgICAgIGR3Qml0cmF0ZTogRFdPUkQ7CQkvLyBDQlIgYml0cmF0ZSwgVkJSIG1pbiBiaXRyYXRlCisgICAgICAgICAgICBkd01heEJpdHJhdGU6IERXT1JEOwkvLyBDQlIgaWdub3JlZCwgVkJSIE1heCBiaXRyYXRlCisgICAgICAgICAgICBuUXVhbGl0eTogSW50ZWdlcjsgICAJLy8gUXVhbGl0eSBzZXR0aW5nIChOT1JNQUwsSElHSCxMT1csVk9JQ0UpCisgICAgICAgICAgICBkd01wZWdWZXJzaW9uOiBEV09SRDsJLy8gTVBFRy0xIE9SIE1QRUctMgorICAgICAgICAgICAgZHdQc3lNb2RlbDogRFdPUkQ7CQkvLyBGVVRVUkUgVVNFLCBTRVQgVE8gMAorICAgICAgICAgICAgZHdFbXBoYXNpczogRFdPUkQ7CQkvLyBGVVRVUkUgVVNFLCBTRVQgVE8gMAorCisgICAgICAgICAgLy8gQklUIFNUUkVBTSBTRVRUSU5HUworICAgICAgICAgICAgYlByaXZhdGU6IExPTkdCT09MOwkJLy8gU2V0IFByaXZhdGUgQml0IChUUlVFL0ZBTFNFKQorICAgICAgICAgICAgYkNSQzogTE9OR0JPT0w7CQkvLyBJbnNlcnQgQ1JDIChUUlVFL0ZBTFNFKQorICAgICAgICAgICAgYkNvcHlyaWdodDogTE9OR0JPT0w7CS8vIFNldCBDb3B5cmlnaHQgQml0IChUUlVFL0ZBTFNFKQorICAgICAgICAgICAgYk9yaWdpbmFsOiBMT05HQk9PTDsJLy8gU2V0IE9yaWdpbmFsIEJpdCAoVFJVRS9GQUxTRV8KKworICAgICAgICAgIC8vIFZCUiBTVFVGRgorICAgICAgICAgICAgYldyaXRlVkJSSGVhZGVyOiBMT05HQk9PTDsJLy8gV1JJVEUgWElORyBWQlIgSEVBREVSIChUUlVFL0ZBTFNFKQorICAgICAgICAgICAgYkVuYWJsZVZCUjogTE9OR0JPT0w7ICAgICAgIC8vIFVTRSBWQlIgRU5DT0RJTkcgKFRSVUUvRkFMU0UpCisgICAgICAgICAgICBuVkJSUXVhbGl0eTogSW50ZWdlcjsJLy8gVkJSIFFVQUxJVFkgMC4uOQorCisgICAgICAgICAgICBidFJlc2VydmVkOiBhcnJheVswLi4yNTVdIG9mIEJ5dGU7CS8vIEZVVFVSRSBVU0UsIFNFVCBUTyAwCisgICAgICAgICAgICBlbmQ7CisKKyAgVEFBQyA9IHBhY2tlZCByZWNvcmQKKyAgICAgICAgICAgZHdTYW1wbGVSYXRlICAgICA6IExvbmdXb3JkOworICAgICAgICAgICBieU1vZGUgICAgICAgICAgIDogQnl0ZTsKKyAgICAgICAgICAgd0JpdFJhdGUgICAgICAgICA6IFdvcmQ7CisgICAgICAgICAgIGJ5RW5jb2RpbmdNZXRob2QgOiBCeXRlOworICAgICAgICAgICBlbmQ7CisKKyAgVEZvcm1hdCA9IHBhY2tlZCByZWNvcmQKKyAgICAgICAgICAgICAgY2FzZSBieXRlIG9mCisgICAgICAgICAgICAgICAgMSA6IChtcDMgICAgICAgICAgIDogVE1QMyk7CisgICAgICAgICAgICAgICAgMiA6IChsaHYxICAgICAgICAgIDogVExIVjEpOworICAgICAgICAgICAgICAgIDMgOiAoYWFjICAgICAgICAgICA6IFRBQUMpOworICAgICAgICAgICAgICBlbmQ7CisKKyAgVEJFX0NvbmZpZyA9IHBhY2tlZCByZWNvcmQKKyAgICAgICAgICAgICAgICAgZHdDb25maWcgICA6IExvbmdXb3JkOworICAgICAgICAgICAgICAgICBmb3JtYXQgICAgIDogVEZvcm1hdDsKKyAgICAgICAgICAgICAgICAgZW5kOworCisKKyAgUEJFX0NvbmZpZyA9IF5UQkVfQ29uZmlnOworCisvL3R5cGVkZWYgc3RydWN0CXsKKy8vCS8vIEJsYWRlRW5jIERMTCBWZXJzaW9uIG51bWJlcgorLy8KKy8vCUJZVEUJYnlETExNYWpvclZlcnNpb247CisvLwlCWVRFCWJ5RExMTWlub3JWZXJzaW9uOworLy8KKy8vCS8vIEJsYWRlRW5jIEVuZ2luZSBWZXJzaW9uIE51bWJlcgorLy8KKy8vCUJZVEUJYnlNYWpvclZlcnNpb247CisvLwlCWVRFCWJ5TWlub3JWZXJzaW9uOworLy8KKy8vCS8vIERMTCBSZWxlYXNlIGRhdGUKKy8vCisvLwlCWVRFCWJ5RGF5OworLy8JQllURQlieU1vbnRoOworLy8JV09SRAl3WWVhcjsKKy8vCisvLwkvLyBCbGFkZUVuYwlIb21lcGFnZSBVUkwKKy8vCisvLwlDSEFSCXpIb21lcGFnZVtCRV9NQVhfSE9NRVBBR0UgKyAxXTsKKy8vCisvL30gQkVfVkVSU0lPTiwgKlBCRV9WRVJTSU9OOworCisgIFRCRV9WZXJzaW9uID0gcmVjb3JkCisgICAgICAgICAgICAgICAgICBieURMTE1ham9yVmVyc2lvbiA6IEJ5dGU7CisgICAgICAgICAgICAgICAgICBieURMTE1pbm9yVmVyc2lvbiA6IEJ5dGU7CisKKyAgICAgICAgICAgICAgICAgIGJ5TWFqb3JWZXJzaW9uICAgIDogQnl0ZTsKKyAgICAgICAgICAgICAgICAgIGJ5TWlub3JWZXJzaW9uICAgIDogQnl0ZTsKKworICAgICAgICAgICAgICAgICAgYnlEYXkgICAgICAgICAgICAgOiBCeXRlOworICAgICAgICAgICAgICAgICAgYnlNb250aCAgICAgICAgICAgOiBCeXRlOworICAgICAgICAgICAgICAgICAgd1llYXIgICAgICAgICAgICAgOiBXb3JkOworCisgICAgICAgICAgICAgICAgICB6SG9tZVBhZ2UgICAgICAgICA6IEFycmF5WzAuLkJFX01BWF9IT01FUEFHRSArIDFdIG9mIENoYXI7CisgICAgICAgICAgICAgICAgICBlbmQ7CisKKyAgUEJFX1ZlcnNpb24gPSBeVEJFX1ZlcnNpb247CisKKy8vX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUluaXRTdHJlYW0oUEJFX0NPTkZJRyBwYmVDb25maWcsIFBEV09SRCBkd1NhbXBsZXMsIFBEV09SRCBkd0J1ZmZlclNpemUsIFBIQkVfU1RSRUFNIHBoYmVTdHJlYW0pOworLy9fX2RlY2xzcGVjKGRsbGV4cG9ydCkgQkVfRVJSCWJlRW5jb2RlQ2h1bmsoSEJFX1NUUkVBTSBoYmVTdHJlYW0sIERXT1JEIG5TYW1wbGVzLCBQU0hPUlQgcFNhbXBsZXMsIFBCWVRFIHBPdXRwdXQsIFBEV09SRCBwZHdPdXRwdXQpOworLy9fX2RlY2xzcGVjKGRsbGV4cG9ydCkgQkVfRVJSCWJlRGVpbml0U3RyZWFtKEhCRV9TVFJFQU0gaGJlU3RyZWFtLCBQQllURSBwT3V0cHV0LCBQRFdPUkQgcGR3T3V0cHV0KTsKKy8vX19kZWNsc3BlYyhkbGxleHBvcnQpIEJFX0VSUgliZUNsb3NlU3RyZWFtKEhCRV9TVFJFQU0gaGJlU3RyZWFtKTsKKy8vX19kZWNsc3BlYyhkbGxleHBvcnQpIFZPSUQJYmVWZXJzaW9uKFBCRV9WRVJTSU9OIHBiZVZlcnNpb24pOworCit7CitGdW5jdGlvbiBiZUluaXRTdHJlYW0odmFyIHBiZUNvbmZpZzogVEJFX0NPTkZJRzsgdmFyIGR3U2FtcGxlOiBMb25nV29yZDsgdmFyIGR3QnVmZmVyU2l6ZTogTG9uZ1dvcmQ7IHZhciBwaGJlU3RyZWFtOiBUSEJFX1NUUkVBTSApOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnQmxhZGVlbmMuZGxsJzsKKy8vRnVuY3Rpb24gYmVFbmNvZGVDaHVuayhoYmVTdHJlYW06IFRIQkVfU1RSRUFNOyBuU2FtcGxlczogTG9uZ1dvcmQ7IHBTYW1wbGU6IFBTbWFsbEludDtwT3V0cHV0OiBQQnl0ZTsgdmFyIHBkd091dHB1dDogTG9uZ1dvcmQpOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnQmxhZGVlbmMuZGxsJzsKK0Z1bmN0aW9uIGJlRW5jb2RlQ2h1bmsoaGJlU3RyZWFtOiBUSEJFX1NUUkVBTTsgblNhbXBsZXM6IExvbmdXb3JkOyB2YXIgcFNhbXBsZTt2YXIgcE91dHB1dDsgdmFyIHBkd091dHB1dDogTG9uZ1dvcmQpOiBCRV9FcnI7IHN0ZGNhbGw7IGNkZWNsICdCbGFkZWVuYy5kbGwnOworRnVuY3Rpb24gYmVEZWluaXRTdHJlYW0oaGJlU3RyZWFtOiBUSEJFX1NUUkVBTTsgdmFyIHBPdXRwdXQ7IHZhciBwZHdPdXRwdXQ6IExvbmdXb3JkKTogQkVfRXJyOyBjZGVjbDsgZXh0ZXJuYWwgJ0JsYWRlZW5jLmRsbCc7CitGdW5jdGlvbiBiZUNsb3NlU3RyZWFtKGhiZVN0cmVhbTogVEhCRV9TVFJFQU0pOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnQmxhZGVlbmMuZGxsJzsKK1Byb2NlZHVyZSBiZVZlcnNpb24odmFyIHBiZVZlcnNpb246IFRCRV9WRVJTSU9OKTsgY2RlY2w7IGV4dGVybmFsICdCbGFkZWVuYy5kbGwnOworfQorCitGdW5jdGlvbiBiZUluaXRTdHJlYW0odmFyIHBiZUNvbmZpZzogVEJFX0NPTkZJRzsgdmFyIGR3U2FtcGxlOiBMb25nV29yZDsgdmFyIGR3QnVmZmVyU2l6ZTogTG9uZ1dvcmQ7IHZhciBwaGJlU3RyZWFtOiBUSEJFX1NUUkVBTSApOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnTGFtZV9lbmMuZGxsJzsKKy8vRnVuY3Rpb24gYmVFbmNvZGVDaHVuayhoYmVTdHJlYW06IFRIQkVfU1RSRUFNOyBuU2FtcGxlczogTG9uZ1dvcmQ7IHBTYW1wbGU6IFBTbWFsbEludDtwT3V0cHV0OiBQQnl0ZTsgdmFyIHBkd091dHB1dDogTG9uZ1dvcmQpOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnTGFtZV9lbmMuZGxsJzsKK0Z1bmN0aW9uIGJlRW5jb2RlQ2h1bmsoaGJlU3RyZWFtOiBUSEJFX1NUUkVBTTsgblNhbXBsZXM6IExvbmdXb3JkOyB2YXIgcFNhbXBsZTt2YXIgcE91dHB1dDsgdmFyIHBkd091dHB1dDogTG9uZ1dvcmQpOiBCRV9FcnI7IGNkZWNsOyBleHRlcm5hbCAnTGFtZV9lbmMuZGxsJzsKK0Z1bmN0aW9uIGJlRGVpbml0U3RyZWFtKGhiZVN0cmVhbTogVEhCRV9TVFJFQU07IHZhciBwT3V0cHV0OyB2YXIgcGR3T3V0cHV0OiBMb25nV29yZCk6IEJFX0VycjsgY2RlY2w7IGV4dGVybmFsICdMYW1lX2VuYy5kbGwnOworRnVuY3Rpb24gYmVDbG9zZVN0cmVhbShoYmVTdHJlYW06IFRIQkVfU1RSRUFNKTogQkVfRXJyOyBjZGVjbDsgZXh0ZXJuYWwgJ0xhbWVfZW5jLmRsbCc7CitQcm9jZWR1cmUgYmVWZXJzaW9uKHZhciBwYmVWZXJzaW9uOiBUQkVfVkVSU0lPTik7IGNkZWNsOyBleHRlcm5hbCAnTGFtZV9lbmMuZGxsJzsKKworUHJvY2VkdXJlIEVuY29kZVdhdlRvTVAzKGZzLCBmZDogSW50ZWdlcik7CitpbXBsZW1lbnRhdGlvbgorCitVc2VzIEludGVybmV0U25kLCBUcmFpdGVXYXY7CisKK3stLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfQorUHJvY2VkdXJlIEVuY29kZVdhdlRvTVAzKGZzLCBmZDogSW50ZWdlcik7Cit2YXIKKyAgZXJyOiBJbnRlZ2VyOworICBiZUNvbmZpZzogVEJFX0NvbmZpZzsKKyAgZHdTYW1wbGVzLCBkd1NhbXBsZXNNUDMgOiBMb25nV29yZDsKKyAgaGJlU3RyZWFtIDogVEhCRV9TVFJFQU07CisgIGVycm9yOiBCRV9FUlI7CisgIHBCdWZmZXI6IFBTbWFsbEludDsKKyAgcE1QM0J1ZmZlcjogUEJ5dGU7CisgIE1hcnF1ZTpQQ2hhcjsKKworICBkb25lOiBMb25nV29yZDsKKyAgZHdXcml0ZTogTG9uZ1dvcmQ7CisgIFRvUmVhZDogTG9uZ1dvcmQ7CisgIFRvV3JpdGU6IExvbmdXb3JkOworICBpOkludGVnZXI7CisKK2JlZ2luCisgIGJlQ29uZmlnLmR3Q29uZmlnIDo9IEJFX0NPTkZJR19MQU1FOworCit7CisgIGJlQ29uZmlnLkZvcm1hdC5tcDMuZHdTYW1wbGVSYXRlIDo9IFdhdkluZm8uU2FtcGxlc1BlclNlYzsKKyAgYmVDb25maWcuRm9ybWF0Lm1wMy5ieU1vZGUgOj0gQkVfTVAzX01PREVfU1RFUkVPOworICBiZUNvbmZpZy5Gb3JtYXQubXAzLndCaXRyYXRlIDo9IHN0clRvSW50KE1haW5Gcm0uTXAzQml0UmF0ZS5UZXh0KTsKKyAgYmVDb25maWcuRm9ybWF0Lm1wMy5iQ29weXJpZ2h0IDo9IDA7CisgIGJlQ29uZmlnLkZvcm1hdC5tcDMuYkNSQyA6PSAkMDAwMDAwMDA7CisgIGJlQ29uZmlnLkZvcm1hdC5tcDMuYk9yaWdpbmFsIDo9IDA7CisgIGJlQ29uZmlnLkZvcm1hdC5tcDMuYlByaXZhdGUgOj0gMDsKK30KKy8vU3RydWN0dXJlIGluZm9ybWF0aW9uCisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3U3RydWN0VmVyc2lvbiA6PSAxOworICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5kd1N0cnVjdFNpemUgOj0gU2l6ZU9mKGJlQ29uZmlnKTsKKy8vQmFzaWMgZW5jb2RlciBzZXR0aW5nCisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3U2FtcGxlUmF0ZSA6PSBXYXZJbmZvLlNhbXBsZXNQZXJTZWM7CisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3UmVTYW1wbGVSYXRlIDo9IDQ0MTAwOworICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5uTW9kZSA6PSBCRV9NUDNfTU9ERV9TVEVSRU87CisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3Qml0cmF0ZSA6PSBzdHJUb0ludChNYWluRnJtLk1wM0JpdFJhdGUuVGV4dCk7CisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3TWF4Qml0cmF0ZSA6PSBzdHJUb0ludChNYWluRnJtLk1wM0JpdFJhdGUuVGV4dCk7CisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLm5RdWFsaXR5IDo9IDI7CisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3TVBlZ1ZlcnNpb24gOj0gMTsgLy9NUEVHMQorICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5kd1BzeU1vZGVsIDo9IDA7CisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmR3RW1waGFzaXMgOj0gMDsKKy8vQml0IFN0cmVhbSBTZXR0aW5ncworICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5iUHJpdmF0ZSA6PSBGYWxzZTsKKyAgYmVDb25maWcuRm9ybWF0LmxodjEuYkNSQyA6PSBGYWxzZTsKKyAgYmVDb25maWcuRm9ybWF0LmxodjEuYkNvcHlyaWdodCA6PSBUcnVlOworICBiZUNvbmZpZy5Gb3JtYXQubGh2MS5iT3JpZ2luYWwgOj0gVHJ1ZTsKKy8vVkJSIFN0dWZmCisgIGJlQ29uZmlnLkZvcm1hdC5saHYxLmJXcml0ZVZCUkhlYWRlciA6PSBmYWxzZTsKKyAgYmVDb25maWcuRm9ybWF0LmxodjEuYkVuYWJsZVZCUiA6PSBmYWxzZTsKKyAgYmVDb25maWcuRm9ybWF0LmxodjEublZCUlF1YWxpdHkgOj0gMDsKKworICBpIDo9IDA7CisgIGVycm9yIDo9IGJlSW5pdFN0cmVhbShiZUNvbmZpZywgZHdTYW1wbGVzLCBkd1NhbXBsZXNNUDMsIGhiZVN0cmVhbSk7CisgIGlmIGVycm9yID0gQkVfRVJSX1NVQ0NFU1NGVUwKKyAgICB0aGVuIGJlZ2luCisgICAgICAgICBwQnVmZmVyIDo9IEFsbG9jTWVtKGR3U2FtcGxlcyoyKTsKKyAgICAgICAgIHBNUDNCdWZmZXIgOj0gQWxsb2NNZW0oZHdTYW1wbGVzTVAzKTsKKyAgICAgICAgIHRyeQorICAgICAgICAgICBkb25lIDo9IDA7CisKKyAgICAgICAgICAgZXJyb3IgOj0gRmlsZVNlZWsoZnMsIDAsIDApOworICAgICAgICAgICBXaGlsZSAoZG9uZSA8IFRvdGFsU2l6ZSkgZG8KKyAgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICAgaWYgKGRvbmUgKyBkd1NhbXBsZXMqMiA8IFRvdGFsU2l6ZSkKKyAgICAgICAgICAgICAgICAgdGhlbiBUb1JlYWQgOj0gZHdTYW1wbGVzKjIKKyAgICAgICAgICAgICAgICAgZWxzZSBiZWdpbgorICAgICAgICAgICAgICAgICAgICAgIFRvUmVhZCA6PSBUb3RhbFNpemUtZG9uZTsKKyAgICAgICAgICAgICAgICAgICAgICAvL0ZpbGxDaGFyKGJ1ZlswXSxkd1NhbXBsZXMqMiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICBGaWxsQ2hhcihwYnVmZmVyXixkd1NhbXBsZXMsMCk7CisgICAgICAgICAgICAgICAgICAgICAgZW5kOworCisgICAgICAgICAgICAgICAvL2lmIEZpbGVSZWFkKGZzLCBidWZbMF0sIHRvcmVhZCkgPSAtMQorICAgICAgICAgICAgICAgaWYgRmlsZVJlYWQoZnMsIHBidWZmZXJeLCB0b3JlYWQpID0gLTEKKyAgICAgICAgICAgICAgICAgdGhlbiByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdFcnJldXIgZGUgbGVjdHVyZScpOworCisgICAgICAgICAgICAgICAvL2Vycm9yIDo9IGJlRW5jb2RlQ2h1bmsoaGJlU3RyZWFtLCB0b1JlYWQgZGl2IDIsIEJ1ZlswXSwgVG1wQnVmWzBdLCB0b1dyaXRlKTsKKyAgICAgICAgICAgICAgIGVycm9yIDo9IGJlRW5jb2RlQ2h1bmsoaGJlU3RyZWFtLCB0b1JlYWQgZGl2IDIsIHBCdWZmZXJeLCBwTVAzQnVmZmVyXiwgdG9Xcml0ZSk7CisKKyAgICAgICAgICAgICAgIGlmIGVycm9yIDw+IEJFX0VSUl9TVUNDRVNTRlVMCisgICAgICAgICAgICAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICBiZUNsb3NlU3RyZWFtKGhiZVN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnRWNoZWMgZGUgbCcnZW5jb2RhZ2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICAgICAgIC8vaWYgRmlsZVdyaXRlKGZkLCBUbXBCdWZbMF0sIHRvV3JpdGUpID0gLTEKKyAgICAgICAgICAgICAgIGlmIEZpbGVXcml0ZShmZCwgcE1QM0J1ZmZlcl4sIHRvV3JpdGUpID0gLTEKKyAgICAgICAgICAgICAgICAgdGhlbiByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdFcnJldXIgZCcn6WNyaXR1cmUnKTsKKworICAgICAgICAgICAgICAgZG9uZSA6PSBkb25lICsgdG9yZWFkOworICAgICAgICAgICAgICAgaW5jKGkpOworICAgICAgICAgICAgICAgaWYgaSBtb2QgNjQgPSAwCisgICAgICAgICAgICAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICBNYWluRnJtLlByb2dyZXNzQmFyMS5Qb3NpdGlvbiA6PSByb3VuZCgxMDAqZG9uZS9Ub3RhbHNpemUpOworICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uLlByb2Nlc3NNZXNzYWdlczsKKyAgICAgICAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAgZW5kOworCisgICAgICAgICAgIGVycm9yIDo9IGJlRGVJbml0U3RyZWFtKGhiZVN0cmVhbSwgcE1QM0J1ZmZlcl4sIGR3V3JpdGUpOworICAgICAgICAgICAvL2Vycm9yIDo9IGJlRGVJbml0U3RyZWFtKGhiZVN0cmVhbSwgVG1wQnVmWzBdLCBkd1dyaXRlKTsKKworICAgICAgICAgICBpZiBlcnJvciA8PiBCRV9FUlJfU1VDQ0VTU0ZVTAorICAgICAgICAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgICAgICAgICAgIGJlQ2xvc2VTdHJlYW0oaGJlU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0VjaGVjIOAgbGEgc29ydGllJyk7CisgICAgICAgICAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICAgaWYgZHdXcml0ZSA8PiAwCisgICAgICAgICAgICAgdGhlbiBiZWdpbgorICAgICAgICAgICAgICAgICAgLy9pZiBGaWxlV3JpdGUoZmQsIFRtcEJ1ZlswXSwgZHdXcml0ZSkgPSAtMQorICAgICAgICAgICAgICAgICAgaWYgRmlsZVdyaXRlKGZkLCBwTVAzQnVmZmVyXiwgZHdXcml0ZSkgPSAtMQorICAgICAgICAgICAgICAgICAgICB0aGVuIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0VycmV1ciDgIGxhIGRlcm5p6HJlIOljcml0dXJlJyk7CisgICAgICAgICAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICAgYmVDbG9zZVN0cmVhbShoYmVTdHJlYW0pOworICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgRnJlZU1lbShwQnVmZmVyKTsKKyAgICAgICAgICAgICBGcmVlTWVtKHBNUDNCdWZmZXIpOworICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgIGVuZAorICAgIGVsc2UgYmVnaW4KKworICAgICAgICAgZW5kOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9EbGwvTWFrZWZpbGUuYW0gYi9EbGwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMGY2YgotLS0gL2Rldi9udWxsCisrKyBiL0RsbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS45IDIwMDYvMDkvMzAgMDk6MTc6MDUgYm91dmlnbmUgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCitFWFRSQV9ESVNUID0gQmxhZGVNUDNFbmNETEwuYyBcCisJQmxhZGVNUDNFbmNETEwuZGVmIFwKKwlCbGFkZU1QM0VuY0RMTC5oIFwKKwlFeGFtcGxlLmNwcCBcCisJRXhhbXBsZV92YzYuZHNwIFwKKwlFeGFtcGxlX3ZjNi5kc3cgXAorCUxhbWVETExJbnRlcmZhY2UuaHRtIFwKKwlMYW1lRGxsX3ZjNi5kc3AgXAorCUxhbWVEbGxfdmM4LnZjcHJvaiBcCisJTVAzZXhwb3J0LnBhcyBcCisJTWFrZWZpbGUubWluZ3czMgpkaWZmIC0tZ2l0IGEvRGxsL01ha2VmaWxlLmluIGIvRGxsL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTRiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9EbGwvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNjcgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gUkVBRE1FICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAorCSQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCitzdWJkaXIgPSBEbGwKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gMS45IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRVhUUkFfRElTVCA9IEJsYWRlTVAzRW5jRExMLmMgXAorCUJsYWRlTVAzRW5jRExMLmRlZiBcCisJQmxhZGVNUDNFbmNETEwuaCBcCisJRXhhbXBsZS5jcHAgXAorCUV4YW1wbGVfdmM2LmRzcCBcCisJRXhhbXBsZV92YzYuZHN3IFwKKwlMYW1lRExMSW50ZXJmYWNlLmh0bSBcCisJTGFtZURsbF92YzYuZHNwIFwKKwlMYW1lRGxsX3ZjOC52Y3Byb2ogXAorCU1QM2V4cG9ydC5wYXMgXAorCU1ha2VmaWxlLm1pbmd3MzIKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgRGxsL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduICBEbGwvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCisJaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAorCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBlbmQgZ2xvYmFsIHNlY3Rpb24KKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL0RsbC9NYWtlZmlsZS5taW5ndzMyIGIvRGxsL01ha2VmaWxlLm1pbmd3MzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3MGYyOQotLS0gL2Rldi9udWxsCisrKyBiL0RsbC9NYWtlZmlsZS5taW5ndzMyCkBAIC0wLDAgKzEsMzkgQEAKKyMgVGhpcyBtYWtlZmlsZSBjb21waWxlcyBsYW1lX2VuYy5kbGwgd2l0aCBtaW5ndzMyIChhbmQgcG9zc2libHkgY3lnd2luKQorIyBPZiBjb3Vyc2UsIHlvdSBtdXN0IGZpcnN0IGJ1aWxkIC4uL2xpYm1wM2xhbWUvbGlibXAzbGFtZS5hLgorIyBsaWJsYW1lX2VuYy5hIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIGxhbWVfZW5jLmRsbCB0byB5b3VyIHByb2dyYW1zLgorIyBUZXN0ZWQgd2l0aCBFQUMgMC45cGI5IChteSBvd24gZmF2b3JpdGUsIGh0dHA6Ly93d3cuZXhhY3RhdWRpb2NvcHkuZGUvKQorIyBleGFtcGxlLmV4ZSBjb21waWxlcyBhbmQgd29ya3MsIHRvby4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmxhZGlzbGF2IE5hdW1vdiwgPHZuYXVtQGluYm94LnJ1PgorIworIyBQUzogdG8gJ21ha2UgY2xlYW4nIHlvdSBuZWVkIHJtLiBNUydzIGRlbCBpcyB1bnVzYWJsZS4KKyMgUFBTOiBxdWljayBidWlsZDoKKyMgICAgICBtYWtlIC1mTWFrZWZpbGUubWluZ3czMgorCitETExfTkFNRSA9IGxhbWVfZW5jCitMQU1FX1NSQ19ST09UID0gLi4KK09GSUxFUyA9IEJsYWRlTVAzRW5jRExMLm8gJChETExfTkFNRSlfZXhwLm8KK0NGTEFHUyA9IC1JJChMQU1FX1NSQ19ST09UKS9pbmNsdWRlIC1JJChMQU1FX1NSQ19ST09UKS9saWJtcDNsYW1lCitDQyA9IGcrKworTEQgPSBnKysKK0xGTEFHUyA9IC1MJChMQU1FX1NSQ19ST09UKS9saWJtcDNsYW1lIC1vICQoRExMX05BTUUpLmRsbCAtbWRsbCAtcworTElCUyA9IC1sbXAzbGFtZQorCithbGw6ICQoRExMX05BTUUpLmRsbCBleGFtcGxlLmV4ZQorCitCbGFkZU1QM0VuY0RMTC5vOiBCbGFkZU1QM0VuY0RMTC5jIEJsYWRlTVAzRW5jRExMLmggLi4vaW5jbHVkZS9sYW1lLmggXAorIC4uL2xpYm1wM2xhbWUvbGFtZV9nbG9iYWxfZmxhZ3MuaCAuLi9saWJtcDNsYW1lL3ZlcnNpb24uaAorCiskKERMTF9OQU1FKS5kbGwgOiAkKE9GSUxFUykKKwkkKExEKSAkKExGTEFHUykgJChPRklMRVMpICQoTElCUykKKwkKKyQoRExMX05BTUUpX2V4cC5vIDogQmxhZGVNUDNFbmNETEwubworCWRsbHRvb2wgLS1pbnB1dC1kZWYgQmxhZGVNUDNFbmNETEwuZGVmIC0tb3V0cHV0LWxpYiBsaWIkKERMTF9OQU1FKS5hIC0tb3V0cHV0LWV4cCAkKERMTF9OQU1FKV9leHAubyAtLWRsbG5hbWUgJChETExfTkFNRSkgQmxhZGVNUDNFbmNETEwubworCislLm8gOiAlLmMKKwkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKKworZXhhbXBsZS5leGUgOiBFeGFtcGxlLmNwcCBCbGFkZU1QM0VuY0RMTC5oCisJJChDQykgRXhhbXBsZS5jcHAgLW8gZXhhbXBsZS5leGUKKworY2xlYW4gOgorCXJtIC1mICQoRExMX05BTUUpLmRsbCAkKE9GSUxFUykgZXhhbXBsZS5leGUKZGlmZiAtLWdpdCBhL0RsbC9SRUFETUUgYi9EbGwvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODQ2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9EbGwvUkVBRE1FCkBAIC0wLDAgKzEsMjEgQEAKKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSBXaW5kb3dzIERMTCBpbnRlcmZhY2UgdG8gdGhlIExBTUUKK2VuY29kaW5nIGVuZ2luZS4KKworVGhpcyBETEwgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCbGFkZUVuYy5kbGwuICAKK1NlZSBCbGFkZU1QM0VuY0RMTC5jIGZvciBkZXRhaWxzIG9mIHRoZSBjYWxsaW5nCitzZXF1ZW5jZSwgYW5kIEJsYWRlTVAzRW5jRExMLmggZm9yIGRldGFpbHMgb2YgdGhlCitkYXRhIHRoYXQgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIERMTC4gIAorCitBcyBvZiB5ZXQsIHRoZXJlIGlzIG5vIG90aGVyIGRvY3VtZW50YXRpb24uIAorCitUbyB1c2UgdGhpcyBETEwgYXMgYSByZXBsYWNlbWVudCBmb3IgQmxhZGVFbmMuZGxsLCB5b3UKK25lZWQgdG8gcG9wdWxhdGUgdGhlICdtcDMnIHN0cnVjdC4gIAorCitUbyB1c2UgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBvZiBMQU1FLCB5b3UgbmVlZCB0byAKK3BvcHVsYXRlIHRoZSBMSFYxIHN0cnVjdCBpbnN0ZWFkLgorCitEZWxwaGkgNCBVc2VyczogIEdhYnJpZWwgR+lsaW4gPGdnZWxpbkBhbGFwYWdlLmNvbT4gaGFzCitjb250cmlidXRlZCBhIC5QQVMgZmlsZSwgZG8geW91IGNhbiBhY2Nlc3MgdGhlIERMTCBmcm9tCitEZWxwaGkuICAgU2VlIE1QM2V4cG9ydC5wYXMuCisKZGlmZiAtLWdpdCBhL0hBQ0tJTkcgYi9IQUNLSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYmRjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9IQUNLSU5HCkBAIC0wLDAgKzEsMTI0IEBACitGaXJzdCwgc2VlIHRoZSBmaWxlIFNUWUxFR1VJREUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitURVNUSU5HCis9PT09PT09CitJZiB5b3UgbWFrZSBjaGFuZ2VzLCBwbGVhc2UgdGVzdC4gIFRoZXJlIGlzIGEgcHl0aG9uCitzY3JpcHQgaW4gdGhlIHRlc3QvIGRpcmVjdG9yeSB3aGljaCB3aWxsIGNvbXBhcmUgdHdvIHZlcnNpb25zCitvZiBsYW1lIHVzaW5nIGEgYnVuY2ggb2YgQ0JSIGFuZCBBQlIgb3B0aW9ucy4gVG8gcnVuIHRoaXMKK3NjcmlwdCwgY29weSB5b3VyIGZhdm9yaXRlIChhbmQgc2hvcnQhKSB3YXYgZmlsZSB0byB0aGUKK2xhbWUvdGVzdCBkaXJlY3RvcnksIGFuZCBydW46CisKKyUgY2QgbGFtZS90ZXN0CislIC4vbGFtZXRlc3QucHkgWy13XSAgQ0JSQUJSLm9wIGNhc3RhbmV0cy53YXYgbGFtZV9vcmlnIGxhbWVfbmV3CisKKworCisKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0xBTUUgQVBJCisKK0ZvciBhIGdlbmVyYWwgb3V0bGluZSBvZiB0aGUgY29kZSwgc2VlIHRoZSBmaWxlIEFQSS4gIAorQWxzbywgZnJvbnRlbmQvbWFpbi5jIGlzIGEgc2ltcGxlIGZyb250IGVuZCB0byBsaWJtcDNsYW1lLmEKKworVGhlIGd1dHMgb2YgdGhlIGNvZGUgYXJlIGNhbGxlZCBmcm9tIGxhbWVfZW5jb2RlX2J1ZmZlcigpLgorCitsYW1lX2VuY29kZV9idWZmZXIoKSBoYW5kbGVzIGJ1ZmZlcmluZyBhbmQgcmVzYW1wbGluZywgYW5kCit0aGVuIGNhbGxzIGxhbWVfZW5jb2RlX2ZyYW1lKCkgZm9yIGVhY2ggZnJhbWUuICBsYW1lX2VuY29kZV9mcmFtZSgpCitsb29rcyBsaWtlIHRoaXM6CisKK2xhbWVfZW5jb2RlX2ZyYW1lX21wMygpOgorICAgbDNwc3ljaG9fYW5hbCgpICAgICAgICBjb21wdXRlIG1hc2tpbmcgdGhyZXNob2xkcworICAgbWRjdF9zdWIoKSAgICAgICAgICAgICBjb21wdXRlIE1EQ1QgY29lZmZpY2llbnRzCisgICBpdGVyYXRpb25fbG9vcCgpICAgICAgIGNob29zZSBzY2FsZWZhY3RvcnMgKHZpYSBpdGVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGRldGVybWluZSBub2lzZSBzaGFwcGluZywgYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2UgYmVzdCBodWZmbWFuIHRhYmxlcyBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24KKworICAgZm9ybWF0X2JpdHN0cmVhbSAgICAgICBmb3JtYXQgdGhlIGJpdHN0cmVhbS4gIHdoZW4gZGF0YStoZWFkZXJzIGFyZSBjb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHRvIGludGVybmFsIGJpdCBidWZmZXIuCisgICBjb3B5X2J1ZmZlcigpICAgICAgICAgIGNvcHkgaW50ZXJuYWwgYml0IGJ1ZmZlciBpbnRvIHVzZXIncyBtcDMgYnVmZmVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQURESU5HIE5FVyBPUFRJT05TCisKK2NvbnRyb2wgdmFyaWFibGUgZ29lcyBpbiBsYW1lX2dsb2JhbF9mbGFncyBzdHVyY3QuCitBc3N1bWUgdGhlIHZhcmlhYmxlIGlzIGNhbGxlZCAnbmV3X3ZhcmlhYmxlJy4KKworWW91IGFsc28gbmVlZCB0byB3cml0ZSAoaW4gc2V0X2dldC5jKToKKworbGFtZV9zZXRfbmV3X3ZhcmlhYmxlKCkKK2xhbWVfZ2V0X25ld192YXJpYWJsZSgpCisKK0FuZCB0aGVuIGRvY3VtZW50IHRoZSB2YXJpYWJsZSBpbiB0aGUgZmlsZSBVU0FHRSBhcyB3ZWxsIGFzIHRoZQorb3V0cHV0IG9mICJsYW1lIC0tbG9uZ2hlbHAiCisKK0FuZCBhZGQgYSAiLS1vcHRpb24iIHN0eWxlIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gZW5hYmxlIHRoaXMgdmFyaWFibGUKK2luIHBhcnNlLmMKKworTm90ZTogZm9yIGV4cGVyaW1lbnRhbCBmZWF0dXJlcyB0aGF0IHlvdSBuZWVkIHRvIGNhbGwgZnJvbSB0aGUgZnJvbnRlbmQKK2J1dCB0aGF0IHNob3VsZCBub3QgYmUgcGFydCBvZiB0aGUgb2ZmaWNpYWwgQVBJLCBzZWUgdGhlIHNlY3Rpb24gYXQKK3RoZSBlbmQgb2Ygc2V0X2dldC5jLiAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCAqTk9UKiBiZSBwcm90b3R5cGVkIGluCitsYW1lLmggKHNpbmNlIHRoYXQgd291bGQgaW5kaWNhdGUgdG8gdGhlIHdvcmxkIHRoYXQgdGhleSBhcmUgcGFydAorb2YgdGhlIEFQSSkuIAorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitUSFJFQURTQUZFOgorCitMYW1lIHNob3VsZCBub3cgYmUgdGhyZWFkIHNhZmUgYW5kIHJlLWVudHJhbnQuIAorVGhlIG9ubHkgcHJvYmxlbSBzZWVtcyB0byBiZSBzb21lIE9TJ3MgYWxsb2NhdGUgc21hbGwKK3N0YWNrcyAoPCAxMjhLKSB0byB0aHJlYWRzIGxhdW5jaGVkIGJ5IGFwcGxpY3Rpb25zLCBhbmQgdGhpcworaXMgbm90IGVub3VnaCBmb3IgTEFNRS4gIEZpeCBpcyB0byBpbmNyZWFzZSB0aGUgc3RhY2sgc3BhY2UsCitvciBtb3ZlIHNvbWUgb2Ygb3VyIGF1dG9tYXRpYyB2YXJpYWJsZXMgb250byB0aGUgaGVhcCB3aXRoCitieSB1c2luZyBidWctcHJvdmUgbWFsbG9jKCkncyBhbmQgZnJlZSgpLgorCisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitHbG9iYWwgVmFyaWFibGVzOgorCitUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuICBBbGwgZGF0YSBpbgorYm90aCBzdHJ1Y3MgaXMgaW5pdGlhbGl6ZWQgdG8gemVyby4KKworMS4gbGFtZV9nbG9iYWxfZmxhZ3MgKmdmcAorCitUaGVzZSBhcmUgaW5wdXQgcGFyYW10ZXJzIHdoaWNoIGFyZSBzZXQgYnkgdGhlIGNhbGxpbmcgcHJvZ3JhbSwKK2FuZCBzb21lIGluZm9ybWF0aW9uIHdoaWNoIHRoZSBjYWxsaW5nIHByb2dyYW0gbWF5IGJlIGludGVyZXN0ZWQgaW4uCisKK1RoaXMgc3RydWN0IGluc3RhbnRpYXRlZCBieSB0aGUgY2FsbCB0byBsYW1lX2luaXQoKS4gIAorCisKKzIuIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYworCitNb3N0IGdsb2JhbCB2YXJpYWJsZXMgZ28gaGVyZS4KKworQWxsIGludGVybmFsIGRhdGEgbm90IHNldCBieSB0aGUgdXNlci4gIEFsbCAnc3RhdGljJyBkYXRhIGZyb20KK29sZCBub24tcmVlbnRyYW50IGNvZGUgc2hvdWxkIGJlIG1vdmVkIGhlcmUuCisKK0RlZmluZWQgaW4gdXRpbC5oLiAgRGF0YSBmb3Igd2hpY2ggdGhlIHNpemUgaXMga25vd24KK2luIGFkdmFjZSBzaG91bGQgYmUgZXhwbGljaXRseSBkZWNsYWlyZWQgKGZvciBleGFtcGxlLAorZmxvYXQgeHJbNTc2XSk7ICBEYXRhIHdoaWNoIG5lZWRzIHRvIGJlIG1hbGxvYydkIGlzCitoYW5kbGVkIGJ5OiAgCisKKzEuICBpbiBsYW1lX2luaXRfcGFyYW1zKCksIG1hbGxvYyB0aGUgZGF0YQorMi4gIGJlIHN1cmUgdG8gZnJlZSB0aGUgZGF0YSBpbiBmcmVlZ2ZjKCkKKworCitJZiB0aGUgZGF0YSB0byBiZSBtYWxsb2MnZCBpcyBsYXJnZSBhbmQgb25seSB1c2VkIGluCitjZXJ0YWluIGNvbmRpdGlvbnMgKGxpa2UgcmVzYW1wbGluZyksIHVzZSB0aGUgZm9sbG93aW5nOiAgCit0aGlzIGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQgaXQgaXMgaGFyZCB0byBjYXRjaCBhbmQgcmV0dXJuIGVycm9yCitmbGFncyBhbGwgdGhlIHdheSBiYWNrIHVwIHRoZSBjYWxsIHN0YWNrLgorCisxLiBBZGQgYW4gaW5pdGlhbGl6YXRpb24gdmFyaWFibGUgdG8gdGhlIGdmYyBzdHJ1Y3Q6IGxhbWVfaW5pdF9yZXNhbXBsZQorMi4gSW4gdGhlIHJlc2FtcGxlIHJvdXRpbmUsIHRoZXJlIHNob3VsZCBiZSBzb21lIGNvZGUgbGlrZSB0aGlzOgorCisgICBpZiAoMD09Z2ZjLT5sYW1lX2luaXRfcmVzYW1wbGUpIHsKKyAgICAgICBnZmMtPmxhbWVfaW5pdF9yZXNhbXBsZT0xOworICAgICAgLyogaW5pdGlhbGl6YXRpb24gY29kZTogbWFsbG9jKCkgZGF0YSwgZXRjICovCisgICB9CisKKzMuIFRoZSBkYXRhIHNob3VsZCBiZSBmcmVlJ2QgaW4gdGhlIHJvdXRpbmUgZnJlZWdmYygpLgorCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGUxN2NlCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDIxMCBAQAorTEFNRSAzLnh4ICAgIEphbnVhcnkgMjAwMSAgTWFyayBUYXlsb3IgKGh0dHA6Ly93d3cubXAzZGV2Lm9yZykKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29tcGlsZSB0aW1lIG9wdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGVyZSBhcmUgc2VydmVyYWwgdGFyZ2V0cyB3aGljaCBjYW4gYmUgYnVpbHQgZnJvbSB0aGlzCitzb3VyY2UgY29kZToKKworbGFtZSwgbGFtZS5leGUgIFRoZSBjb21tYW5kIGxpbmUgZW5jb2RlcgorCittcDN4ICAgICAgICAgICAgQSBHVEsgYmFzZWQgZ3JhcGhpY2FsIE1QMyBmcmFtZSBhbmFseXplci4gIEZvciBkZWJ1Z2dpbmcsCisgICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnQsIGFuZCBzdHVkaW5nIE1QMyBmcmFtZXMgcHJvZHVjZWQgYnkgYW55CisgICAgICAgICAgICAgICAgZW5jb2Rlci4KKworbGFtZV9lbmMuZGxsICAgIGEgV2luZG93cyBETEwgdXNlZCBieSBtYW55IEdVSXMgd2hpY2ggc3VwcG9ydCBsYW1lLgorICAgICAgICAgICAgICAgIChDYW4gb25seSBiZSBjb21waWxlZCBieSBNU1ZDPz8/KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK2xhbWUuYWNtICAgICAgICBhIFdpbmRvd3MgQUNNIGNvZGVjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IAorICAgICAgICAgICAgICAgIG1hbnkgd2luZG93cyBwcm9ncmFtcywgYW5kIGFueSBkaXJlY3RzaG93IHByb2dyYW0uCisgICAgICAgICAgICAgICAgU2VlIE1TVkMgcHJvamVjdCBmaWxlcyBpbiBBQ00gZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIFJpZ2h0IGNsaWNrIG9uIGxhbWUuaW5mIHRvIGluc3RhbGwuCisKK2xhbWVfZW5jLmRzaG93ICBhIFdpbmRvd3MgZGlyZWN0IHNob3cgZmlsdGVyIGZvciBsYW1lLiAgUG90ZW50aWFsbHkgaGFzCisgICAgICAgICAgICAgICAgbW9yZSBmbGV4YWJpbGl0eSB0aGFuIHRoZSBBQ00gY29kZWMsIGJ1dCBjb2RlIG5lZWRzIHNvbWUKKyAgICAgICAgICAgICAgICB3b3JrLiAgU2VlIE1TVkMgcHJvamVjdCBmaWxlcyBpbiBkc2hvdyBkaXJlY3RvcnkKKyAKKworbGlibXAzbGFtZS5hICAgIHRoZSBzdGF0aWMgZW5jb2RpbmcgbGlicmFyeSB1c2VkIGJ5IGFsbCBwbGF0Zm9ybXMsIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgYnkgYWxsIHRoZSBhYm92ZSB0YXJnZXRzLgorCitsaWJtcDNsYW1lLnNvICAgc2hhcmVkIHZlcnNpb24gb2YgbGlibXAzbGFtZS5hIGZvciAqTklYIHBsYXRmb3JtcworCisKKworVGhlIGZvbGxvd2luZyBjb21waWxlIHRpbWUgb3B0aW9ucyBjYW4gYmUgdXNlZC4gIEZvciBsaWJtcDNsYW1lLmEKK2FuZCBsYW1lX2VuYy5kbGwsIG5vbmUgYXJlIHJlcXVpcmVkLiAgT24gbm9uLXVuaXggc3lzdGVtcywKK3RoZXNlIG9wdGlvbnMgbXVzdCBiZSBzZXQgaW4gY29uZmlnLmggb3IgaW4gdGhlIElERS4gIAorT24gdW5peCBzeXN0ZW1zLCB0aGV5IGFyZSBzZXQgdmlhIC4vY29uZmlndXJlLiAgCisKKworI2RlZmluZSBIQVZFX01QR0xJQiAgIGNvbXBpbGUgaW4gbXBnbGliJ3MgbXAzICpkZWNvZGluZyogY2FwaWJpbGl0eQorI2RlZmluZSBIQVZFX1ZPUkJJUyAgIGNvbXBpbGUgaW4gVm9yYmlzIGRlY29kaW5nIGNhcGliaWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAoeW91IG5lZWQgbGlidm9yYmlzIGFscmVhZHkgYnVpbHQpCisjZGVmaW5lIE5PQU5BTFlTSVMgICBkbyBub3QgY29tcGlsZSBpbiBob29rcyB1c2VkIGJ5IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgIE1QMyBmcmFtZSBhbmFseXplci4KKworCitPcHRpb25zIGZvciB0aGUgY29tbWFuZCBsaW5lIGVuY29kZXI6CisjZGVmaW5lIExJQlNOREZJTEUgICB0byB1c2UgRXJpayBkZSBDYXN0cm8gTG9wbydzIGxpYnNuZGZpbGUKKyAgICAgICAgICAgICAgICAgICAgIGZvciBpbnB1dC4KKyNkZWZpbmUgQlJISVNUICAgICAgIHRvIGFsbG93IHRoZSBvcHRpb25hbCBkaXNwbGF5IG9mIHRoZSBWQlIgaGlzdG9ncmFtCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQnVpbGRpbmcgdGhlIHNvZnR3YXJlIG9uICpOSVggcGxhdGZvcm1zIHVzaW5nIGNvbmZpZ3VyZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSdW4gdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworJSAuL2NvbmZpZ3VyZQorJSBtYWtlIAorJSBtYWtlIGluc3RhbGwKKworRm9yIGEgY29tcGxldGUgbGlzdCBvZiBvcHRpb25zLCB0cnkgIi4vY29uZmlndXJlIC0taGVscCIKK1NvbWUgb2YgdGhlIG1vcmUgdXNlZnVsbCBvcHRpb25zOgorCitGb3IgdGhlIGVuY29kaW5nIGxpYnJhcnk6CisKKyAgLS1lbmFibGUtbXAzeCAgICAgICAgICAgICAgIEJ1aWxkIHRoZSBtcDMgZnJhbWUgYW5hbHl6ZXIsICdtcDN4JworCisgIC0tZW5hYmxlLW1wM3J0cCAgICAgICAgICAgICBCdWlsZCB0aGUgZW5jb2RlLXRvLVJUUCBwcm9ncmFtLCAnbXAzcnRwJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJyb2tlbiBhcyBvZiBBdWd1c3QgMjAwMSkKKyAKKworRm9yIHRoZSBMQU1FIGZyb250IGVuZCBlbmNvZGVyOgorCisgIC0td2l0aC1maWxlaW89bGFtZSAgICAgICAgICBVc2UgbGFtZSdzIGludGVybmFsIGZpbGUgaW8gcm91dGluZXMgW2RlZmF1bHRdCisgICAgICAgICAgICAgICA9c25kZmlsZSAgICAgICBVc2UgRXJpayBkZSBDYXN0cm8gTG9wbydzIGxpYnNuZGZpbGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3VwcG9ydHMgbWFueSBtb3JlIGlucHV0IGZvcm1hdHMsIGJ1dCBubyBzdGRpbiBwb3NzaWJsZSBjdXJyZW50bHkpCisKKyAgLS13aXRoLXNuZGZpbGUtcHJlZml4PURJUiAgIEFsdGVybmF0ZSBsb2NhdGlvbiBmb3IgbGlic25kZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIC0td2l0aC1maWxlaW89c25kZmlsZSkKKworICAtLWVuYWJsZS1icmhpc3QgICAgICAgICAgICAgSW5jbHVkZSB0aGUgVkJSIGJpdHJhdGUgaGlzdG9ncmFtIGZlYXR1cmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDp5ZXMgaWYgYW55IG5jdXJzZXMvdGVybWNhcCBhdmFpbGFibGUpIgorCisKK090aGVyIHVzZWZ1bGwgY29uZmlndXJlIG9wdGlvbnM6CisKKyAgLS1lbmFibGUtZGVidWcgICAgICAgICAgICAgIEJ1aWxkIGEgZGVidWcgdmVyc2lvbgorCisgIC0tZW5hYmxlLWV4cG9wdCAgICAgICAgICAgICBFbmFibGUgc29tZSBtb3JlIG9wdGltaXphdGlvbnMgZmxhZ3MgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcGlsZXIsIG1heSBvciBtYXkgbm90IHByb2R1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RlciBjb2RlCisKKyAgLS1wcmVmaXggPSBQQVRIICAgICAgICAgICAgIGRlZmF1bHQgaXMgL3Vzci9sb2NhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExBTUUgY3VycmVudGx5IGluc3RhbGxzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdXNyL2xvY2FsL2Jpbi9sYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC91c3IvbG9jYWwvbGliL2xpYm1wM2xhbWUuYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdXNyL2xvY2FsL2xpYi9saWJtcDNsYW1lLnNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sYW1lLmgKKworCisgIC0td2l0aC12b3JiaXMgICAgICAgICAgICAgICAgRW5hYmxlIE9nZyBWb3JiaXMgZGVjb2Rpbmcgc3VwcG9ydAorICAtLXdpdGgtdm9yYmlzLXByZWZpeCA9IFBBVEggIHNwZWNpZnkgd2hlcmUgdG8gZmluZCBWb3JiaXMgbGlicworCisKK1NvbWUgbW9yZSBhZHZhbmNlZCB3YXlzIHRvIGluZmx1ZW5jZSB0aGUgYnVpbGQgcHJvY2VkdXJlCisoZXhwZXJpZW5jZWQgdXNlcnMgb25seSwgdXNlIGl0IGF0IHlvdXIgb3duIHJpc2spOgorCisgIC0gSWYgeW91IHdhbnQgdG8gdXNlIHNvbWUgY3VzdG9tIGRlZmluZXMgZm9yIGJ1aWxkaW5nIChlLmcuIHNvbWUgb3V0CisgICAgb2YgdGhlIGZpbGUgIkRFRklORVMiKSB1c2U6CisKKyAgICAgKiBib3VybmUgc2hlbGwgb3IgY29tcGF0aWJsZSAoYXNoLCBiYXNoLCB6c2gsIC4uLik6CisgICAgICAgQ09ORklHX0RFRlM9Ii1EbXlfZGVmaW5lIiAuL2NvbmZpZ3VyZQorCisgICAgICogQyBzaGVsbCBvciBjb21wYXRpYmxlIChjc2gsIHRjc2gsIC4uLik6CisgICAgICAgc2V0ZW52IENPTkZJR19ERUZTICItRG15X2RlZmluZSIKKyAgICAgICAuL2NvbmZpZ3VyZQorCisgIC0gSWYgeW91IHdhbnQgdG8gdXNlIHNvbWUgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgY29tcGlsZXI6CisKKyAgICAqIGJvdXJuZSBzaGVsbCBvciBjb21wYXRpYmxlIChhc2gsIGJhc2gsIHpzaCwgLi4uKToKKyAgICAgIENGTEFHUz0iLS1teV9mbGFnIiAuL2NvbmZpZ3VyZQorCisgICAgKiBDIHNoZWxsIG9yIGNvbXBhdGlibGUgKGNzaCwgdGNzaCwgLi4uKToKKyAgICAgIHNldGVudiBDRkxBR1MgIi0tbXlfZmxhZyIKKyAgICAgIC4vY29uZmlndXJlCisKKyAgT3Igc29tZSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUuCisKKyAgTm90ZToKKyAgICBJZiBjb25maWd1cmUgZGV0ZWN0cyB0aGUgcHJlc2VudHMgb2YgIm5hc20iIHNvbWUgYWRkaXRpb25hbCBzcGVlZAorICAgIGltcHJvdmVtZW50cyBnZXQgY29tcGlsZWQgaW4gKGFkZGl0aW9uYWwgYXNzZW1ibGVyIGNvZGUgdG8gZGV0ZWN0CisgICAgYW5kIHVzZSBtdWx0aW1lZGlhIGV4dGVuc2lvbnMgb2YgdGhlIHVzZWQgcHJvY2Vzc29yKS4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQnVpbGRpbmcgdGhlIHNvZnR3YXJlIG9uICpOSVggcGxhdGZvcm1zIHdpdGhvdXQgY29uZmlndXJlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUgbWFrZSAtZiBNYWtlZmlsZS51bml4CisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQnVpbGRpbmcgdGhlIHNvZnR3YXJlIG9uIFdpbmRvd3Mgd2l0aCBNU1ZDOgorKG9yIE1TVkMgKyAzcmQgcGFydHkgQyBjb21waWxlcikKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGVyZSBhcmUgTVNWQyBwcm9qZWN0IGZpbGVzLCBhbmQgYSBNYWtlZmlsZS5NU1ZDIGluY2x1ZGVkCit3aXRoIHRoZSBwcm9qZWN0LiAgRm9yIHByb2R1Y3Rpb24gdXNlLCBiZSBzdXJlIHRvIGNvbXBpbGUKK2EgIlJlbGVhc2UiIHRhcmdldCwgd2l0aCB0aGUgIm1heGltdW0gc3BlZWQiIGNvbXBpbGUKK29wdGlvbiwgYW5kICNkZWZpbmUgTkRFQlVHLiAgIAorCitJdCBpcyBwb3NzaWJsZSB0byBjb21waWxlIHRoZSBHVEsgZnJhbWUgYW5hbHl6ZXIgdW5kZXIgd2luZG93cywgc2VlCitSRUFETUUuV0lOR1RLCisKK1ZhcmlvdXMgYnVpbGQgb3B0aW9ucyBjYW4gYmUgc2V0IGluIGNvbmZpZ01TLmgKKworTm90ZTogcHJvamVjdCBmaWxlcyBmb3IgYnVpbGRpbmcgbGFtZS5leGUgc2VlbSB0byBiZSBicm9rZW4gb3Igbm90CitxdWl0ZSBjb21wYXRhYmxlIHdpdGggTVNWQzYuICBUaGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYnVpbGQgbGFtZSBhbmQKK2xhbWVfZW5jLmRsbCBpcyB0byBydW4gdGhlIC5iYXQgc2NyaXB0IChjb21lcyB3aXRoIE1TVkM2KSB3aGljaCBzZXRzCit1cCB5b3VyIFZDIGVudmlyb25tZW50IHRvIHdvcmsgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlbjoKKworY29weSBjb25maWdNUy5oIGNvbmZpZy5oIAorbm1ha2UgLWYgTWFrZWZpbGUuTVNWQyAgY29tcD1tc3ZjICBhc209bm8KKworUHJvamVjdCBmaWxlcyBmb3IgdGhlIGRsbCwgQUNNIGNvZGVjIGFuZCBkaXJlY3RzaG93IGZpbHRlciAKK3NlZW0gdG8gYmUgaW4gYmV0dGVyIHNhaHBlLiAgCisKKworCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQnVpbGRpbmcgdGhlIHNvZnR3YXJlIG9uIFdpbmRvd3Mgd2l0aCBmcmVlIGNvbXBpbGVyczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMQU1FIGNhbiBiZSBjb21waWxlZCB3aXRoIHZhcmlvdXMgV2luZG93cyBNU0RPUyBwb3J0cyAoYWxsIGZyZWUpCitvZiBHQ0MgKERKR1BQLCBNaW5ndzMyKS4gIFNlZSBSRUFETUUuREpHUFAuICAKKworRm9yIE1pbmd3MzIsIHlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gdXNlIHRoZSBVbml4IE1ha2VmaWxlIHRoYXQKK2NvbWVzIHdpdGggTEFNRS4gIFRyeTogIm1ha2UgLWYgTWFrZWZpbGUudW5peCBVTkFNRT1NU0RPUyIKK1lvdSBtYXkgbmVlZCB0byByZW1vdmUgdGhlc2UgbGluZXMgZnJvbSBicmhpc3QuYzoKKworI2lmZGVmIF9XSU4zMgorQ09PUkQgUG9zOworSEFORExFIENIOworQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gQ1NCSTsKKyNlbmRpZgorCitNaW5ndzMyIHVzZXJzIG1heSBhbHNvIHRyeSB0byB1c2UgdGhlIHVuaXggY29uZmlndXJlIHNjcmlwdCAoZXhwbGFpbmVkCithYm92ZSksIGl0IGhhcyBfdW50ZXN0ZWRfIHN1cHBvcnQgZm9yIE1pbmd3MzIuCisKK0N5Z3dpbiB1c2VycyBzaG91bGQgdXNlIHRoZSB1bml4IGNvbmZpZ3VyZSBzY3JpcHQgKGV4cGxhaW5lZCBhYm92ZSkuIElmCit5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSBjb25maWd1cmUgc2NyaXB0IHRyeToKKyAgICAgIENDPWdjYyAuL2NvbmZpZ3VyZQorUGF0Y2hlcyB0byBlbmFibGUgdGhlIGJ1aWxkIG9mIHRoZSBsYW1lX2VuYy5kbGwgd2l0aCBDeWd3aW4gYW5kIGF1dG9jb25mIC8KK2F1dG9tYWtlIC8gbGlidG9vbCBhcmUgd2VsY29tZSEKKworVG8gdXNlIHRoZSBCb3JsYW5kIEMgY29tcGlsZXIgKG5vdyBmcmVlISkgc2VlIFJFQURNRS5CMzIgYW5kIE1ha2VmaWxlLkIzMi4KK0JvcmxhbmQgY2FuIGFsc28gY29tcGlsZSB0aGUgbGFtZV9lbmMuZGxsLCBidXQgdGhpcyBpcyB1bnRlc3RlZC4KKworQ2FuIERKR1BQIG9yIE1pbmd3MzIgcHJvZHVjZSBsYW1lX2VuYy5kbGw/CisKK1ZhcmlvdXMgYnVpbGQgb3B0aW9ucyBjYW4gYmUgc2V0IGluIGNvbmZpZ01TLmgKKworCisKZGlmZiAtLWdpdCBhL0lOU1RBTEwuY29uZmlndXJlIGIvSU5TVEFMTC5jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkYmU0MwotLS0gL2Rldi9udWxsCisrKyBiL0lOU1RBTEwuY29uZmlndXJlCkBAIC0wLDAgKzEsMTgzIEBACitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYSBmaWxlCitgY29uZmlnLmNhY2hlJyB0aGF0IHNhdmVzIHRoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cAorcmVjb25maWd1cmluZywgYW5kIGEgZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQKKyh1c2VmdWwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgYXQgc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJworY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmluJyBpcyB1c2VkIHRvIGNyZWF0ZSBgY29uZmlndXJlJyBieSBhIHByb2dyYW0KK2NhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG9ubHkgbmVlZCBgY29uZmlndXJlLmluJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKK2l0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKKyAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKyAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICBgY29uZmlndXJlJyBpdHNlbGYuCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQorICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZS4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4KKworICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScKK2luaXRpYWwgdmFsdWVzIGZvciB2YXJpYWJsZXMgYnkgc2V0dGluZyB0aGVtIGluIHRoZSBlbnZpcm9ubWVudC4gIFVzaW5nCithIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsLCB5b3UgY2FuIGRvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSBsaWtlCit0aGlzOgorICAgICBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXggLi9jb25maWd1cmUKKworT3Igb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGBlbnYnIHByb2dyYW0sIHlvdSBjYW4gZG8gaXQgbGlrZSB0aGlzOgorICAgICBlbnYgQ1BQRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgTERGTEFHUz0tcyAuL2NvbmZpZ3VyZQorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKK3N1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCisKKyAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnRzIHRoZSBgVlBBVEgnCit2YXJpYWJsZSwgeW91IGhhdmUgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUKK2luIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yCitvbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUgcmVjb25maWd1cmluZyBmb3IgYW5vdGhlcgorYXJjaGl0ZWN0dXJlLgorCitJbnN0YWxsYXRpb24gTmFtZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgorYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCitpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcmVmaXg9UEFUSCcuCisKKyAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCithcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQorZ2l2ZSBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBBVEgnLCB0aGUgcGFja2FnZSB3aWxsIHVzZQorUEFUSCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCitEb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHdpbGwgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1QQVRIJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKK2tpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcworeW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4KKworICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCit3aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KKworT3B0aW9uYWwgRmVhdHVyZXMKKz09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgcGFja2FnZXMgcGF5IGF0dGVudGlvbiB0byBgLS1lbmFibGUtRkVBVFVSRScgb3B0aW9ucyB0bworYGNvbmZpZ3VyZScsIHdoZXJlIEZFQVRVUkUgaW5kaWNhdGVzIGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIHBhY2thZ2UuCitUaGV5IG1heSBhbHNvIHBheSBhdHRlbnRpb24gdG8gYC0td2l0aC1QQUNLQUdFJyBvcHRpb25zLCB3aGVyZSBQQUNLQUdFCitpcyBzb21ldGhpbmcgbGlrZSBgZ251LWFzJyBvciBgeCcgKGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtKS4gIFRoZQorYFJFQURNRScgc2hvdWxkIG1lbnRpb24gYW55IGAtLWVuYWJsZS0nIGFuZCBgLS13aXRoLScgb3B0aW9ucyB0aGF0IHRoZQorcGFja2FnZSByZWNvZ25pemVzLgorCisgICBGb3IgcGFja2FnZXMgdGhhdCB1c2UgdGhlIFggV2luZG93IFN5c3RlbSwgYGNvbmZpZ3VyZScgY2FuIHVzdWFsbHkKK2ZpbmQgdGhlIFggaW5jbHVkZSBhbmQgbGlicmFyeSBmaWxlcyBhdXRvbWF0aWNhbGx5LCBidXQgaWYgaXQgZG9lc24ndCwKK3lvdSBjYW4gdXNlIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGAtLXgtaW5jbHVkZXM9RElSJyBhbmQKK2AtLXgtbGlicmFyaWVzPURJUicgdG8gc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMuCisKK1NwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW4gbm90IGZpZ3VyZSBvdXQKK2F1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgaG9zdCB0aGUgcGFja2FnZQord2lsbCBydW4gb24uICBVc3VhbGx5IGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2FuIG5vdCBndWVzcyB0aGUgaG9zdCB0eXBlLCBnaXZlIGl0IHRoZQorYC0taG9zdD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aXRoIHRocmVlIGZpZWxkczoKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK1NlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIGhvc3QgdHlwZS4KKworICAgSWYgeW91IGFyZSBidWlsZGluZyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3UgY2FuIGFsc28KK3VzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvciBhbmQgdGhlIGAtLWJ1aWxkPVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2YKK3N5c3RlbSBvbiB3aGljaCB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcGFja2FnZS4KKworU2hhcmluZyBEZWZhdWx0cworPT09PT09PT09PT09PT09PQorCisgICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCit5b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKK2RlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KK2Bjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KK2BQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCitgQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCitBIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgorCitPcGVyYXRpb24gQ29udHJvbHMKKz09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWNhY2hlLWZpbGU9RklMRScKKyAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKKyAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCisgICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KKworYC0taGVscCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tcXVpZXQnCitgLS1zaWxlbnQnCitgLXEnCisgICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLiAgVG8KKyAgICAgc3VwcHJlc3MgYWxsIG5vcm1hbCBvdXRwdXQsIHJlZGlyZWN0IGl0IHRvIGAvZGV2L251bGwnIChhbnkgZXJyb3IKKyAgICAgbWVzc2FnZXMgd2lsbCBzdGlsbCBiZSBzaG93bikuCisKK2AtLXNyY2Rpcj1ESVInCisgICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKKyAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgorCitgLS12ZXJzaW9uJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCisKZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDc3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFCkBAIC0wLDAgKzEsMTMgQEAKK0NhbiBJIHVzZSBMQU1FIGluIG15IGNvbW1lcmNpYWwgcHJvZ3JhbT8gIAorCitZZXMsIHlvdSBjYW4sIHVuZGVyIHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIExHUEwuICBUaGUgZWFzaWVzdAord2F5IHRvIGRvIHRoaXMgaXMgdG86CisKKzEuIExpbmsgdG8gTEFNRSBhcyBzZXBhcmF0ZSBsaWJyYXJ5IChsaWJtcDNsYW1lLmEgb24gdW5peCBvciAKKyAgIGxhbWVfZW5jLmRsbCBvciBsaWJtcDNsYW1lLmRsbCBvbiB3aW5kb3dzKQorCisyLiBGdWxseSBhY2tub3dsZWRnZSB0aGF0IHlvdSBhcmUgdXNpbmcgTEFNRSwgYW5kIGdpdmUgYSBsaW5rCisgICB0byBvdXIgd2ViIHNpdGUsIHd3dy5tcDNkZXYub3JnCisKKzMuIElmIHlvdSBtYWtlIG1vZGlmaWNhdGlvbnMgdG8gTEFNRSwgeW91ICptdXN0KiByZWxlYXNlIHRoZXNlCisgICB0aGVzZSBtb2RpZmljYXRpb25zIGJhY2sgdG8gdGhlIExBTUUgcHJvamVjdCwgdW5kZXIgdGhlIExHUEwuCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5NU1ZDIGIvTWFrZWZpbGUuTVNWQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTkzNDQxCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuTVNWQwpAQCAtMCwwICsxLDY3NCBAQAorIwlNYWtlZmlsZS5NU1ZDOiBNU1ZDIE1ha2VmaWxlIGZvciBMQU1FCisjCisjCTIwMDAtMjAwNyBSb2JlcnQgSGVnZW1hbm4KKyMJZGVkaWNhdGVkIHRvIHRoZSBMQU1FIHByb2plY3QgaHR0cDovL3d3dy5tcDNkZXYub3JnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworCisjX18gcmVhZG1lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisjCW5tYWtlIC1mIE1ha2VmaWxlLk1TVkMKKyMJCS0+IGJ1aWxkIGxhbWUsIGJ1dCBub3QgbXAzeAorIwkJLT4gdXNlIFJvYmVydCdzIGNvZGUgbW9kaWZpY2F0aW9ucworIwkJLT4gYXNzdW1lIE1TVkMgNi4wIGNvbXBpbGVyIGF2YWlsYWJsZQorIwkJLT4gYXNzdW1lIE5BU00gYXZhaWxhYmxlCisjCQktPiBhc3NlbWJsZSBNTVggY29kZSB3aXRoIE5BU00KKyMJCS0+IG5vIGNvbXBpbGVyIHdhcm5pbmdzCisjICAgICAgIC0+IHVzZSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0CisjCisjCXBhc3NpbmcgYXJndW1lbnRzLCBvbmUgY2FuIG1vZGlmeSB0aGUgZGVmYXVsdCBiZWhhdmlvdXI6CisjCUNPTVA9PG5vdCBJTlRFTCBvciBCQ0M+ICAgIC0+ICB1c2UgTVMgY29tcGlsZXIKKyMJV0FSTj08YW55dGhpbmcgYnV0IE9GRj4gICAgLT4gIGdpdmUgdmVyYm9zZSBjb21waWxlciB3YXJuaW5ncworIwlBU009PGFueXRoaW5nIGJ1dCBZRVM+ICAgICAtPiAgbm8gTkFTTSBub3IgTU1YCisjCU1NWD08YW55dGhpbmcgYnV0IFlFUz4gICAgIC0+ICBkbyBub3QgYXNzZW1ibGUgTU1YIGNvZGUKKyMJQ0ZHPTxhbnl0aGluZyBidXQgUkg+ICAgICAgLT4gIGRpc2FibGUgUm9iZXJ0J3MgbW9kaWZpY2F0aW9ucworIwlDUFU9UDEgICAgICAgICAgICAgICAgICAgICAtPiAgb3B0aW1pemUgZm9yIFBlbnRpdW0gaW5zdGVhZCBvZiBQIElJL0lJSQorIwlDUFU9UDIgICAgICAgICAgICAgICAgICAgICAtPiAgb3B0aW1pemUgZm9yIFBlbnRpdW0gSUkvSUlJLCB5b3UgbmVlZCBhIFBJSSBvciBiZXR0ZXIKKyMJQ1BVPVAzICAgICAgICAgICAgICAgICAgICAgLT4gIG9wdGltaXplIGZvciBQZW50aXVtIElJSSwgeW91IG5lZWQgYSBQSUlJIG9yIGJldHRlcgorIwlHVEs9WUVTICAgICAgICAgICAgICAgICAgICAtPiAgaGF2ZSBHVEssIGFkZHMgbXAzeCB0byBkZWZhdWx0IHRhcmdldHMKKyMJUFJFQz08YW55dGhpbmcgYnV0IFNJTkdMRT4gLT4gIHVzZSBkb3VibGUgaW5zdGVhZCBvZiBzaW5nbGUgZmxvYXQKKyMJU05ERklMRT08YW55dGhpbmcgYnV0IFlFUz4gLT4gIGRvIG5vdCB1c2UgTGliU25kZmlsZSBmb3IgcmVhZGluZyBpbnB1dCBmaWxlcworIworIwlFeGFtcGxlOgorIwlubWFrZSAtZiBNYWtlZmlsZS5NU1ZDIENQVT1QMSBHVEs9WUVTCisjX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gcmVhZG1lIF9fCisKKworCisjCXRhcmdldHMgPC0+IERPUyBmaWxlbmFtZXMKKworVF9MQU1FID0gbGFtZS5leGUKK1RfTVAzWCA9IG1wM3guZXhlCitUX0RMTCA9IGxpYm1wM2xhbWUuZGxsCitUX0xJQl9EWU5BTUlDID0gbGlibXAzbGFtZS5saWIKK1RfTElCX1NUQVRJQyA9IGxpYm1wM2xhbWUtc3RhdGljLmxpYgorVF9MRUdBQ1lfRExMID0gbGFtZV9lbmMuZGxsCisKK1RBUkdFVF9ESVIgPSAuXG91dHB1dFwgCisKKyMJZGVmYXVsdCB0YXJnZXRzCisKK1BHTSA9ICQoVF9MQU1FKQorCisjCXNvbWUgZGVmYXVsdCBzZXR0aW5ncworCishCUlGICIkKE1TVkNWRVIpIiAhPSAiIgorQ09NUCA9IE1TCishCUlGICIkKE1TVkNWRVIpIiA9PSAiV2luNjQiCishCUlGICIkKEFTTSkiID09ICIiCitBU00gPSBOTyAjIG9yIGl0IGNvdWxkIGJlIE1MNjQgaWYgd2Ugd2FudCB0byB1c2UgaXQuLi4KK0dUSyA9IE5PCishCUVORElGCishCUVORElGCishCUVMU0UKKyEJSUYgIiQoQ09NUCkiID09ICIiCitDT01QID0gTVNWQworIQlFTkRJRgorIQlFTkRJRgorCishCUlGICIkKEFTTSkiID09ICIiCitBU00gPSBZRVMKKyEJRU5ESUYKKworIQlJRiAiJChNTVgpIiA9PSAiIgorTU1YID0gWUVTCishCUVORElGCisKKyEJSUYgIiQoQ0ZHKSIgPT0gIiIKK0NGRyA9IFJICishCUVORElGCisKKyEJSUYgIiQoQ1BVKSIgPT0gIiIKK0NQVSA9IFAyYXV0bworIWlmICIkKFBST0NFU1NPUl9MRVZFTCkiPT0iNiIKK0NQVSA9IFA2CishZW5kaWYKKyEJRU5ESUYKKworIQlJRiAiJChXQVJOKSIgPT0gIiIKK1dBUk4gPSBPRkYKKyEJRU5ESUYKKworIQlJRiAiJChQUkVDKSIgPT0gIiIKK1BSRUMgPSBTSU5HTEUKKyEJRU5ESUYKKworIQlJRiAiJChTTkRGSUxFKSIgPT0gIiIKK1NOREZJTEUgPSBOTworIQlFTkRJRgorCitPRkYgPSB3aW4zMgorTUFDSElORSA9IC9tYWNoaW5lOkkzODYKK0xJQl9PUFRTID0gL25vbG9nbyAkKE1BQ0hJTkUpIAorCishCU1FU1NBR0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIQlJRiAiJChDRkcpIiA9PSAiIgorIQkgTUVTU0FHRSBidWlsZGluZyBMQU1FCishCUVMU0UKKyEJIE1FU1NBR0UgYnVpbGRpbmcgTEFNRSBmZWF0dXJpbmcgJChDRkcpCishCUVORElGCishCUlGICIkKEFTTSkiID09ICJZRVMiCishCSBNRVNTQUdFICsgQVNNCishCSBJRiAiJChNTVgpIiA9PSAiWUVTIgorIQkgIE1FU1NBR0UgKyBNTVgKKyEJIEVORElGCishCUVORElGCishCUlGICIkKEdUSykiID09ICJZRVMiCishCSBNRVNTQUdFICsgR1RLCishCUVORElGCishCUlGICIkKENPTVApIiA9PSAiSU5URUwiCishCSBNRVNTQUdFIHVzaW5nIElOVEVMIENPTVBJTEVSCishCSBJRiAiJChDUFUpIiA9PSAiUDEiCishCSAgTUVTU0FHRSArIG9wdGltaXppbmcgZm9yIFBlbnRpdW0gKE1NWCkKKyEJIEVMU0UKKyEJICBJRiAiJChDUFUpIiA9PSAiUDIiCishCSAgIE1FU1NBR0UgKyB5b3UgbmVlZCBhIFBlbnRpdW0gSUkgb3IgYmV0dGVyCishCSAgRUxTRQorIQkgICBJRiAiJChDUFUpIiA9PSAiUDMiCishCSAgICBNRVNTQUdFICsgeW91IG5lZWQgYSBQZW50aXVtIElJSSBvciBiZXR0ZXIKKyEJICAgRUxTRQorIQkgICAgTUVTU0FHRSArIG9wdGltaXppbmcgZm9yIFBlbnRpdW0gSUkvSUlJCishCSAgIEVORElGCishCSAgRU5ESUYKKyEJIEVORElGCishCUVMU0UKKyEJIElGICIkKE1TVkNWRVIpIiA9PSAiNi4wIgorIQkgIE1FU1NBR0UgKyB1c2luZyBNU1ZDIDYuMCAzMi1CaXQgQ29tcGlsZXIKKyEJICBJRiAiJChDUFUpIiA9PSAiUDEiCishCSAgIE1FU1NBR0UgKyBvcHRpbWl6aW5nIGZvciBQZW50aXVtIChNTVgpIChtYXkgc2xvdyBkb3duIFBJSUkgYSBmZXcgcGVyY2VudCkKKyEJICBFTFNFCishCSAgIE1FU1NBR0UgKyBvcHRpbWl6aW5nIGZvciBQZW50aXVtIElJL0lJSQorIQkgIEVORElGCishCSBFTFNFSUYgIiQoTVNWQ1ZFUikiID09ICI4LjAiCishCSAgTUVTU0FHRSArIHVzaW5nIE1TVkMgOC4wIDMyLUJpdCBDb21waWxlcgorIQkgIElGICIkKENQVSkiID09ICJQMSIKKyEJICAgTUVTU0FHRSArIG9wdGltaXppbmcgZm9yIFBlbnRpdW0gKE1NWCkgKG1heSBzbG93IGRvd24gUElJSSBhIGZldyBwZXJjZW50KQorIQkgIEVMU0UKKyEJICAgTUVTU0FHRSArIG9wdGltaXppbmcgZm9yIFBlbnRpdW0gSUkvSUlJCishCSAgRU5ESUYKKyEJIEVMU0UKKyEJICBJRiAiJChNU1ZDVkVSKSIgPT0gIldpbjY0IgorIQkgICBNRVNTQUdFICsgdXNpbmcgTVMgNjQtQml0IENvbXBpbGVyCishCSAgRUxTRQorIQkgICBNRVNTQUdFIHVzaW5nIE1TIENPTVBJTEVSCishCSAgIElGICIkKENQVSkiID09ICJQMSIKKyEJICAgIE1FU1NBR0UgKyBvcHRpbWl6aW5nIGZvciBQZW50aXVtIChNTVgpIChtYXkgc2xvdyBkb3duIFBJSUkgYSBmZXcgcGVyY2VudCkKKyEJICAgRUxTRQorIQkgICAgTUVTU0FHRSArIG9wdGltaXppbmcgZm9yIFBlbnRpdW0gSUkvSUlJCishCSAgIEVORElGCishCSAgRU5ESUYKKyEJIEVORElGCishCUVORElGCishCUlGICIkKFBSRUMpIiA9PSAiU0lOR0xFIgorIQkgTUVTU0FHRSArIHVzaW5nIFNpbmdsZSBwcmVjaXNpb24KKyEJRU5ESUYKKyEJSUYgIiQoU05ERklMRSkiID09ICJZRVMiCishCSBNRVNTQUdFICsgdXNpbmcgTGliU25kZmlsZSByZWFkaW5nIGlucHV0IGZpbGVzCishCUVORElGCishCU1FU1NBR0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCishCUlGICIkKENPTVApIiAhPSAiSU5URUwiCishCUlGICIkKENPTVApIiAhPSAiQkNDIgorCisjX18gTWljcm9zb2Z0IEMgb3B0aW9ucyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisjCisjCS9PMiAgICAgbWF4aW1pemUgc3BlZWQKKyMJL09iPG4+ICBpbmxpbmUgZXhwYW5zaW9uCisjCS9PZyAgICAgZW5hYmxlIGdsb2JhbCBvcHRpbWl6YXRpb25zCisjCS9PaSAgICAgZW5hYmxlIGludHJpbnNpYyBmdW5jdGlvbnMKKyMJL090ICAgICBmYXZvciBjb2RlIHNwZWVkCisjCS9PeSAgICAgZW5hYmxlIGZyYW1lIHBvaW50ZXIgb21pc3Npb24KKyMJL0c1ICAgICBQZW50aXVtIG9wdGltaXphdGlvbgorIwkvRzYgICAgIFBlbnRpdW0gSUkvSUlJIG9wdGltaXphdGlvbgorIwkvR0EgICAgIG9wdGltaXplIGZvciBXaW5kb3dzIEFwcGxpY2F0aW9uCisjCS9HRiAgICAgZW5hYmxlIHJlYWQtb25seSBzdHJpbmcgcG9vbGluZworIwkvR2YgICAgIGVuYWJsZSBzdHJpbmcgc3Bvb2xpbmcKKyMJL0dzICAgICBkaXNhYmxlIHN0YWNrIGNoZWNraW5nIGNhbGxzCisjCS9HeSAgICAgc2VwYXJhdGUgZnVuY3Rpb25zIGZvciBsaW5rZXIKKyMJL1FJZmRpdiBnZW5lcmF0ZSBjb2RlIGZvciBQZW50aXVtIEZESVYgZml4CisjCS9RSTBmICAgZ2VuZXJhdGUgY29kZSBmb3IgUGVudGl1bSAweDBmIGVycmF0dW0gZml4CisjCisjCXJlbWFya3M6CisjCSAtIGFsaWFzaW5nIG9wdGlvbnMgc2VlbSB0byBicmVhayBjb2RlCisjCSAtIHRyeSB0byBnZXQgdGhlIEludGVsIGNvbXBpbGVyIGRlbW9uc3RyYXRpb24gY29kZSEKKyMJICAgSUNMIHByb2R1Y2VzIGZhc3RlciBjb2RlLgorCisjIGRlYnVnZ2luZyBvcHRpb25zCisjIENDX09QVFMgPSAvbm9sb2dvIC9aaSAvR2UgL0daCisjIExOX09QVFMgPSAvbm9sb2dvIC9kZWJ1ZzpmdWxsIC9kZWJ1Z3R5cGU6Y3YgL2ZpeGVkOm5vCisKKyMgcHJvZmlsaW5nIG9wdGlvbnMKKyMgQ0NfT1BUUyA9IC9ub2xvZ28gL1ppIC9PMmIyZ2l0eSAvRzZBcyAvRE5ERUJVRworIyBMTl9PUFRTID0gL25vbG9nbyAvZGVidWc6ZnVsbCAvZGVidWd0eXBlOmN2IC9maXhlZDpubyAvcHJvZmlsZQorCisjIHJlbGVhc2Ugb3B0aW9ucworIQlJRiAiJChNU1ZDVkVSKSIgPT0gIldpbjY0IgorQ0NfT1BUUyA9IC9ub2xvZ28gL0RXaW42NCAvTzJiMml0eSAvR0F5IC9HczEwMjQgL1pwOCAvR0wgL0dTLSAvWmkKKyEJRUxTRUlGICIkKE1TVkNWRVIpIiA9PSAiOC4wIgorQ0NfT1BUUyA9IC9ub2xvZ28gL08yIC9XcDY0IC9PaSAvR0wgL2FyY2g6U1NFIC9mcDpwcmVjaXNlCishCUVMU0VpZiAiJChDUFUpIj09IlA2IgorQ0NfT1BUUyA9IC9ub2xvZ28gL08yIC9PYjIgL0dBeSAvR3MxMDI0IC9acDggL1ppCishZWxzZQorQ0NfT1BUUyA9IC9ub2xvZ28gL08yIC9PYjIgL0dBeSAvR3MxMDI0IC9RSWZkaXYgL1FJMGYgL1lYCishCUVORElGCisKKyEJSUYgIiQoTVNWQ1ZFUikiID09ICI2LjAiCishCUlGICIkKENQVSkiID09ICJQMSIKK0NDX09QVFMgPSAkKENDX09QVFMpIC9HNQorIQlFTFNFCitDQ19PUFRTID0gJChDQ19PUFRTKSAvRzYKKyEJRU5ESUYKKyEJRU5ESUYKKworIQlJRiAiJChXQVJOKSIgPT0gIk9GRiIKK0NDX09QVFMgPSAkKENDX09QVFMpIC93CishCUVMU0UKK0NDX09QVFMgPSAkKENDX09QVFMpIC9XJChXQVJOKQorIQlFTkRJRgorCishCUlGICIkKFBSRUMpIiA9PSAiU0lOR0xFIgorQ0NfT1BUUyA9ICQoQ0NfT1BUUykgL0RGTE9BVDg9ZmxvYXQgL0RSRUFMX0lTX0ZMT0FUPTEKKyEJRU5ESUYKKworQ0NfT1BUUyA9ICQoQ0NfT1BUUykgL0ROREVCVUcgL01ECisKK0xOX09QVFMgPSAvbm9sb2dvIC9vcHQ6Tk9XSU45OCAvcGRiOm5vbmUKK0xOX0RMTCA9IC9ub2xvZ28gL0RMTCAvb3B0Ok5PV0lOOTgKKworQ0NfT1VUID0gL0ZvCitMTl9PVVQgPSAvZm9yY2UgL09VVDoKKworQ0MgPSBjbAorTE4gPSBsaW5rCisKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIE1pY3Jvc29mdCBDIG9wdGlvbnMgX18KKworCishCUVMU0UKKworI19fIEJvcmxhbmQgQkNDIG9wdGlvbnMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworIworIwlmaXJzdCBkcmFmdCwgRExMIG5vdCB3b3JraW5nLCBnZW5lcmF0ZXMgdmVyeSBzbG93IGNvZGUhCitCQ0NJTlNUID0gQzovQm9ybGFuZC9CQ0M1NQorCitDQ19PUFRTID0gLXBjIC1xIC1mZiAtZnAgLWpiIC1qMSAtdFdDIC10V00gLU8yIC1PUyAtSSQoQkNDSU5TVCkvaW5jbHVkZSAtRE5ERUJVRyAtRFdJTjMyCisjIGRsbCA+PiAtdFdECitMTl9PUFRTID0gLWxHbiAtbEdpIC1sYXAgLWx4IC1MJChCQ0NJTlNUKS9saWIKKyMgZGxsID4+IC1UcGQKKyEJSUYgIiQoQ1BVKSIgPT0gIlAxIgorQ0NfT1BUUyA9ICQoQ0NfT1BUUykgLTUKKyEJRUxTRQorQ0NfT1BUUyA9ICQoQ0NfT1BUUykgLTYKKyEJRU5ESUYKKworIQlJRiAiJChXQVJOKSIgPT0gIk9GRiIKK0NDX09QVFMgPSAkKENDX09QVFMpIC13LQorIQlFTFNFCitDQ19PUFRTID0gJChDQ19PUFRTKQorIQlFTkRJRgorCitMTl9ETEwgPQorIyQoQ0NJTlNUKS9saWIvY3czMlIubGliCitMTl9PVVQgPSAtZQorQ0NfT1VUID0gLW8KKworQ0MgPSBiY2MzMgorTE4gPSBiY2MzMgorCitPRkYgPSBvYmoKKworIQlFTkRJRgorI19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gQm9ybGFuZCBCQ0Mgb3B0aW9ucyBfXworCisKKyEJRUxTRQorCisjX18gSW50ZWwgNC41IG9wdGlvbnMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisjCisjCS9ZWCAgICAgICAgIGVuYWJsZSBhdXRvbWF0aWMgcHJlY29tcGlsZWQgaGVhZGVyIGZpbGUgY3JlYXRpb24vdXNhZ2UKKyMJL094ICAgICAgICAgbWF4aW11bSBvcHRpbWl6YXRpb24gc2FtZSBhcyAvTzIgd2l0aG91dCAvR2Z5CisjCS9PMiAgICAgICAgIHNhbWUgYXMgL0dmc3kgL09iMWd5dGkKKyMJL0dkICAgICAgMSkgbWFrZSBjZGVjbCB0aGUgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24KKyMJL0c1ICAgICAgMikgb3B0aW1pemVkIGZvciBQZW50aXVtCisjCS9HNiAgICAgIDMpIG9wdGltaXplZCBmb3IgUGVudGl1bSBJSS9JSUkKKyMJL0dBICAgICAgICAgYXNzdW1lIHNpbmdsZSB0aHJlYWRlZAorIwkvR3Nbbl0gICAgICBkaXNhYmxlIHN0YWNrIGNoZWNrcyBmb3IgZnVuY3Rpb25zIHdpdGggPG4gYnl0ZXMgb2YgbG9jYWxzCisjCS9HRiAgICAgICAgIHJlYWQtb25seSBzdHJpbmcgcG9vbGluZyBvcHRpbWl6YXRpb24KKyMJL0d5ICAgICAgICAgc2VwYXJhdGUgZnVuY3Rpb25zIGZvciB0aGUgbGlua2VyCisjCS9RdW5yb2xsICAgIHVucm9sbCBsb29wcyB3aXRoIGRlZmF1bHQgaGV1cmlzdGljCisjCS9RSWZpc3QgICAgIGVuYWJsZSBmYXN0IGZsb2F0IHRvIGludCBjb252ZXJzaW9uCisjCS9RSWZkaXYgICAgIGVuYWJsZSBwYXRjaCBmb3IgUGVudGl1bSB3aXRoIEZESVYgZXJyYXR1bQorIwkvUUkwZiAgICAgICBlbmFibGUgcGF0Y2ggZm9yIFBlbnRpdW0gd2l0aCAwZiBlcnJhdHVtCisjCS9RaXAgICAgIDIpIGVuYWJsZSBzaW5nbGUtZmlsZSBJUCBvcHRpbWl6YXRpb25zICh3aXRoaW4gZmlsZXMpCisjCS9RaXBvICAgICAgIGVuYWJsZSBtdWx0aS1maWxlIElQIG9wdGltaXphdGlvbnMgKGJldHdlZW4gZmlsZXMpCisjCS9RaXBvX3dwIDQpIGVuYWJsZSBlbnRpcmUgcHJvZ3JhbSBtdWx0aS1maWxlIElQIG9wdGltaXphdGlvbnMKKyMJL1FheGlNSyAgICAgYXV0b21hdGljIHVzZSBvZiBzcGVjaWFsaXplZCBjb2RlIGZvciBQSUkvSUlJLCBNTVgsIFNJTUQKKyMKKyMJcmVtYXJrczoKKyMJMSkgc2xvd3Mgc3BlZWQgZG93biwgbm90IHVzaW5nCisjCTIpIGZhc3RlciBjb21wYXJlZCB0byAzKSBvciA0KSBvbiBQZW50aXVtIE1NWCBhdCAyMDAgTUh6CisKKyEJSUYgIiQoQ1BVKSIgPT0gIlAxIgorQ0NfT1BUUyA9IC9HNSAvUWF4aU1LIC9RSWZkaXYgL1FJMGYKKyEJRUxTRQorIQlJRiAiJChDUFUpIiA9PSAiUDIiCitDQ19PUFRTID0gL0c2IC9ReGkgL1FheE1LCishCUVMU0UKKyEJSUYgIiQoQ1BVKSIgPT0gIlAzIgorQ0NfT1BUUyA9IC9HNiAvUXhpTUsKKyEJRUxTRQorQ0NfT1BUUyA9IC9HNiAvUWF4aU1LIC9RSWZkaXYgL1FJMGYKKyEJRU5ESUYKKyEJRU5ESUYKKyEJRU5ESUYKKworIQlJRiAiJChXQVJOKSIgPT0gIk9GRiIKK0NDX09QVFMgPSAkKENDX09QVFMpIC93CishCUVMU0UKK0NDX09QVFMgPSAkKENDX09QVFMpIC9XMiAvV3BvcnQKKyEJRU5ESUYKKworIQlJRiAiJChQUkVDKSIgPT0gIlNJTkdMRSIKK0NDX09QVFMgPSAkKENDX09QVFMpIC9ERkxPQVQ4PWZsb2F0IC9EUkVBTF9JU19GTE9BVD0xCishCUVORElGCisKK0NDX09QVFMgPSAvbm9sb2dvIC9ETkRFQlVHIC9ZWCAvR0EgL094IC9PYjIgXAorICAgICAgICAgIC9RdW5yb2xsIC9Rc294LSAvUWlwICQoQ0NfT1BUUykKKworCitMTl9PUFRTID0gJChDQ19PUFRTKQorTE5fRExMID0gL0xECitMTl9PVVQgPSAvRmUKK0NDX09VVCA9IC9GbworCitDQyA9IGljbAorTE4gPSBpY2wKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gSW50ZWwgNC41IG9wdGlvbnMgX18KKworIQlFTkRJRgorCisKKworI19fIExJQlNOREZJTEUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworIworIwl1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiB5b3Ugd2FudCBMaWJTbmRmaWxlIGZvciBpbnB1dAorIwlJdCdzIGFsd2F5cyBhIGdvb2QgaWRlYSB0byBjb21waWxlIGl0IGluIQorIworIQlJRiAiJChTTkRGSUxFKSIgPT0gIllFUyIKK1NOREZJTEVfT1BUUyA9IC9ETElCU05ERklMRQorTElCU05ERklMRSA9ICQoU05ERklMRV9ESVIpbGlic25kZmlsZS5saWIKKyEgICBFTkRJRgorI19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gTElCU05ERklMRSBfXworCisKKworIy0tIE1JU0MgLS0KK0JSSElTVF9TV0lUQ0ggPSAvREJSSElTVAorCitDUFBfT1BUUyA9IC9ESEFWRV9DT05GSUdfSCAtSS4KKworCisKKyNfXyBGUkFNRSBBTkFMWVpFUiBTVVBQT1JUIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyMKKyMJQXNzdW1pbmcgeW91IGhhdmUgImdsaWItZGV2IiBhbmQgImd0aystZGV2IiBpbnN0YWxsZWQgYW5kIHRoZSBzeXN0ZW0KKyMJRExMcyAiZ2xpYi0xLjMuZGxsIiwgImdkay0xLjMuZGxsIiBhbmQgImd0ay0xLjMuZGxsIiBjb3BpZWQgaW50byB0aGUKKyMJIldpblxTeXN0ZW0iIGZvbGRlcgorIworIwlUbyBjb21waWxlIGluIHRoZSBmcmFtZSBhbmFseXplciBzdXBwb3J0LCB5b3UgbmVlZCB0aGUgYWJvdmUgbWVudGlvbmVkCisjCWxpYnJhcmllcy4gWW91IGNhbiBwYXNzIHRoZSBhcHByb3ByaWF0ZSBwYXRoIHRvIHRoZW0gaW4gR1RLX0RJUlMuCisjCishCUlGICIkKEdUSykiID09ICJZRVMiCishCUlGICIkKEdUS19ESVJTKSIgPT0gIiIKK0dUS19ESVJTID0gLi4vM3JkcGFydHkKKyEJRU5ESUYKK0dUS19PUFRTID0gLUkkKEdUS19ESVJTKS9nbGliICAgICBcCisgICAgICAgICAgIC1JJChHVEtfRElSUykvZ3RrKyAgICAgXAorICAgICAgICAgICAtSSQoR1RLX0RJUlMpL2d0aysvZ3RrIFwKKyAgICAgICAgICAgLUkkKEdUS19ESVJTKS9ndGsrL2dkaworR1RLX0xJQlMgPSAkKEdUS19ESVJTKS9ndGsrL2d0ay9ndGstMS4zLmxpYiBcCisgICAgICAgICAgICQoR1RLX0RJUlMpL2d0aysvZ2RrL2dkay0xLjMubGliIFwKKyAgICAgICAgICAgJChHVEtfRElSUykvZ2xpYi9nbGliLTEuMy5saWIKKworUEdNID0gJChUX01QM1gpICQoUEdNKQorIQlFTFNFCishCUlGICIkKEdUSykiID09ICIiCishCU1FU1NBR0UgUGFzcyBHVEs9WUVTIHRvIGJ1aWxkIHRoZSBmcmFtZSBhbmFseXplci4gKHJlcXVpcmVzIGluc3RhbGxlZCBHVEspCishCUVORElGCishCUVORElGCisjX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBGUkFNRSBBTkFMWVpFUiBTVVBQT1JUIF9fCisKKworCisjX18gTVBHMTIzIERFQ09ESU5HIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisjCisjCXVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSB3YW50IGRlY29kaW5nIHN1cHBvcnQKKyMJSXQncyBhbHdheXMgYSBnb29kIGlkZWEgdG8gY29tcGlsZSBpdCBpbiEKKyMKK0NQUF9PUFRTID0gJChDUFBfT1BUUykgL0RIQVZFX01QR0xJQiAvRFVTRV9MQVlFUl8xIC9EVVNFX0xBWUVSXzIKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBNUEcxMjMgREVDT0RJTkcgX18KKworCisKKyNfXyBUYWtlaGlybydzIElFRUUgaGFjayBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyMKKyMJdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdG8gZW5hYmxlIFRha2VoaXJvJ3MgSUVFRSBoYWNrCisjCVlvdSdsbCB3YW50IGl0IG9uIGEgeDg2IG1hY2hpbmUgd2l0aCBpMzg3IEZQVQorIworQ1BQX09QVFMgPSAkKENQUF9PUFRTKSAvRFRBS0VISVJPX0lFRUU3NTRfSEFDSworI19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBUYWtlaGlybydzIElFRUUgaGFjayBfXworCisKKworI19fIFJvYmVydCdzIGFsdGVybmF0ZSBjb2RlIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworIQlJRiAiJChDRkcpIiA9PSAiUkgiCishCUlGICIkKE1TVkNWRVIpIiA9PSAiOC4wIgorTElCX09QVFMgPSAkKExJQl9PUFRTKSAvTFRDRworTE5fT1BUUyA9ICQoTE5fT1BUUykgL0xUQ0cKKyEgICBFTkRJRgorIQlFTkRJRgorI19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBSb2JlcnQncyBhbHRlcm5hdGUgY29kZSBfXworCisKKworQ0NfU1dJVENIRVMgPSAkKENDX09QVFMpICQoU05ERklMRV9PUFRTKSAkKEJSSElTVF9TV0lUQ0gpIFwKKyAgICAgICAgICAgICAgJChHVEtfT1BUUykgL0RCU19GT1JNQVQ9QklOQVJZCisKK0xOX1NXSVRDSEVTID0gJChMTl9PUFRTKQorCitsYW1lX3NvdXJjZXMgPSBcCisJZnJvbnRlbmQvbWFpbi5jCisKK21weF9zb3VyY2VzID0gXAorCWZyb250ZW5kL2dwa3Bsb3R0aW5nLmMgXAorCWZyb250ZW5kL2d0a2FuYWwuYyBcCisJZnJvbnRlbmQvbXAzeC5jCisKK2RsbF9zb3VyY2VzID0gXAorCWRsbC9CbGFkZU1QM0VuY0RsbC5jCisKK2NvbW1vbl9zb3VyY2VzID0gXAorCWZyb250ZW5kL3BvcnRhYmxlaW8uYyBcCisJZnJvbnRlbmQvZ2V0X2F1ZGlvLmMgXAorCWZyb250ZW5kL3BhcnNlLmMgXAorCWZyb250ZW5kL3RpbWVzdGF0dXMuYyBcCisJZnJvbnRlbmQvbGFtZXRpbWUuYyBcCisJZnJvbnRlbmQvY29uc29sZS5jIFwKKwlmcm9udGVuZC9icmhpc3QuYworCitsYW1lbGliX3NvdXJjZXMgPSBcCisJbGlibXAzbGFtZS9iaXRzdHJlYW0uYyBcCisJbGlibXAzbGFtZS9lbmNvZGVyLmMgXAorCWxpYm1wM2xhbWUvZmZ0LmMgXAorCWxpYm1wM2xhbWUvZ2Fpbl9hbmFseXNpcy5jIFwKKwlsaWJtcDNsYW1lL2lkM3RhZy5jIFwKKwlsaWJtcDNsYW1lL2xhbWUuYyBcCisJbGlibXAzbGFtZS9uZXdtZGN0LmMgXAorCWxpYm1wM2xhbWUvcHN5bW9kZWwuYyBcCisJbGlibXAzbGFtZS9xdWFudGl6ZS5jIFwKKwlsaWJtcDNsYW1lL3F1YW50aXplX3B2dC5jIFwKKwlsaWJtcDNsYW1lL3ZlY3Rvci94bW1fcXVhbnRpemVfc3ViLmMgXAorCWxpYm1wM2xhbWUvc2V0X2dldC5jIFwKKwlsaWJtcDNsYW1lL3ZicnF1YW50aXplLmMgXAorCWxpYm1wM2xhbWUvcmVzZXJ2b2lyLmMgXAorCWxpYm1wM2xhbWUvdGFibGVzLmMgXAorCWxpYm1wM2xhbWUvdGFrZWhpcm8uYyBcCisJbGlibXAzbGFtZS91dGlsLmMgXAorCWxpYm1wM2xhbWUvbXBnbGliX2ludGVyZmFjZS5jIFwKKwlsaWJtcDNsYW1lL1ZiclRhZy5jIFwKKwlsaWJtcDNsYW1lL3ByZXNldHMuYyBcCisJbGlibXAzbGFtZS92ZXJzaW9uLmMKKworbXBnbGliX3NvdXJjZXMgPSBcCisJbXBnbGliL2NvbW1vbi5jIFwKKwltcGdsaWIvZGN0NjRfaTM4Ni5jIFwKKwltcGdsaWIvZGVjb2RlX2kzODYuYyBcCisJbXBnbGliL2xheWVyMS5jIFwKKwltcGdsaWIvbGF5ZXIyLmMgXAorCW1wZ2xpYi9sYXllcjMuYyBcCisJbXBnbGliL3RhYmluaXQuYyBcCisJbXBnbGliL2ludGVyZmFjZS5jCisKKworIUlGICIkKE1TVkNWRVIpIiA9PSAiV2luNjQiCitBRERMX09CSiA9IGJ1ZmZlcm92ZXJmbG93VS5saWIKKyFFTkRJRgorCitMSUJfT0JKID0gJChsYW1lbGliX3NvdXJjZXM6LmM9Lm9iaikKK01QR19PQkogPSAkKG1wZ2xpYl9zb3VyY2VzOi5jPS5vYmopCitDTU1OX09CSiA9ICQoY29tbW9uX3NvdXJjZXM6LmM9Lm9iaikKK0xBTUVfT0JKID0gJChsYW1lX3NvdXJjZXM6LmM9Lm9iaikKK01QWF9PQkogPSAkKG1weF9zb3VyY2VzOi5jPS5vYmopCitETExfT0JKID0gJChkbGxfc291cmNlczouYz0ub2JqKQorCisKKy5jLm9iajoKKwlAJChDQykgJChDUFBfT1BUUykgJChDQ19TV0lUQ0hFUykgLUlpbmNsdWRlIC1JbGlibXAzbGFtZSAtSW1wZ2xpYiBcCisJICAgICAgICQoQ0NfT1VUKSRAICAtYyAkPAorCisKKyNfXyBNQVNNIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyMKKyMJTUFTTTogTWljcm9zb2Z0IEFzc2VtYmxlcgorIworIQlJRiAiJChBU00pIiA9PSAiTUw2NCIKKyMKKy5TVUZGSVhFUyA6IC5uYXMKKy5uYXMub2JqOgorCUBlY2hvICQ8CisJQG1sNjQgLUlsaWJtcDNsYW1lXGkzODYgLVNmIC1EV0lOMzIgLURXSU42NCAkPCAtRm8kQAorCitDQ19TV0lUQ0hFUyA9ICQoQ0NfU1dJVENIRVMpIC1ESEFWRV9OQVNNCitBU01fT0JKID0gJChBU01fT0JKKSBcCisJbGlibXAzbGFtZVxpMzg2XGNwdV9mZWF0Lm9iaiBcCisJbGlibXAzbGFtZVxpMzg2XGZmdDNkbi5vYmogXAorCWxpYm1wM2xhbWVcaTM4NlxmZnRzc2Uub2JqCisKKyMJbm90IHlldCBjb2RlZAorI0NDX1NXSVRDSEVTID0gJChDQ19TV0lUQ0hFUykgLURVU0VfRkZURlBVCisjQVNNX09CSiA9ICQoQVNNX09CSikgbGlibXAzbGFtZVxpMzg2XGZmdGZwdS5vYmoKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIE1BU00gX18KKworCisjX18gTkFTTSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisjCisjCU5BU006IE5ldHdpZGUgQXNzZW1ibGVyCisjCishCUVMU0VJRiAiJChBU00pIiA9PSAiWUVTIgorIworLlNVRkZJWEVTIDogLm5hcworLm5hcy5vYmo6CisJQGVjaG8gJDwKKwlAbmFzbXcgLWYgJChPRkYpIC1pIGxpYm1wM2xhbWUvaTM4Ni8gLURXSU4zMiAkPCAtbyAkQAorCitDQ19TV0lUQ0hFUyA9ICQoQ0NfU1dJVENIRVMpIC9ESEFWRV9OQVNNCitBU01fT0JKID0gJChBU01fT0JKKSBcCisJbGlibXAzbGFtZVxpMzg2XGNwdV9mZWF0Lm9iaiBcCisJbGlibXAzbGFtZVxpMzg2XGZmdDNkbi5vYmogXAorCWxpYm1wM2xhbWVcaTM4NlxmZnRzc2Uub2JqCisKKyMJbm90IHlldCBjb2RlZAorI0NDX1NXSVRDSEVTID0gJChDQ19TV0lUQ0hFUykgL0RVU0VfRkZURlBVCisjQVNNX09CSiA9ICQoQVNNX09CSikgbGlibXAzbGFtZS9pMzg2L2ZmdGZwdS5vYmoKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIE5BU00gX18KKworIQlFTFNFCishCU1FU1NBR0UgUGFzcyBBU009WUVTIHRvIGJ1aWxkIHRoZSBhc3NlbWJsZXIgb3B0aW1pemF0aW9ucworIQlFTkRJRgorCisKKyNfXyBNTVggX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyMKKyMJeW91IG5lZWQgTkFTTSBidXQgKm5vdCBuZWNlc3NhcmlseSogYSBwcm9jZXNzb3Igd2l0aCBNTVgKKyMJVGhlIGFib3ZlIENQVSBmZWF0dXJlIGRldGVjdGlvbiBjb2RlIGFsbG93cyB0byBydW4gdGhlIHNhbWUKKyMJYmluYXJ5IG9uIGEgQ1BVIHdpdGhvdXQgTU1YIHRvbyEKKyMKKyEJSUYgIiQoQVNNKSIgPT0gIllFUyIKKyEJSUYgIiQoTU1YKSIgPT0gIllFUyIKK0NDX1NXSVRDSEVTID0gJChDQ19TV0lUQ0hFUykgL0RNTVhfY2hvb3NlX3RhYmxlCitBU01fT0JKID0gJChBU01fT0JKKSBsaWJtcDNsYW1lL2kzODYvY2hvb3NlX3RhYmxlLm9iagorIQlFTkRJRgorIQlFTkRJRgorI19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIE1NWCBfXworCishCU1FU1NBR0UKKworbm9fdGFyZ2V0X3NwZWNpZmllZCA6CSQoUEdNKQorCUBlY2hvLgorCUBlY2hvIC0tPSogICQoUEdNKSB1cHRvZGF0ZSAgKj0tLQorCUBlY2hvLgorCit0YXJnZXRfZGlyZWN0b3J5IDoKKwlAaWYgbm90IGV4aXN0ICQoVEFSR0VUX0RJUikgbWtkaXIgJChUQVJHRVRfRElSKQorCQorY29tbW9uOgkkKENNTU5fT0JKKQorCUBlY2hvLgorCUBlY2hvIC0tLSBDT01NT04gRlJPTlRFTkQgU1RVRkYgVVBUT0RBVEUgLS0tCisJQGVjaG8uCisKK2xpYkE6CSQoTElCX09CSikKKwlAZWNoby4KKwlAZWNobyAtLS0gTEFNRSBNUDMgRU5DT0RJTkcgTElCUkFSWSBVUFRPREFURSAtLS0KKwlAZWNoby4KKworbGliQjoJJChNUEdfT0JKKQorCUBlY2hvLgorCUBlY2hvIC0tLSBNUEcxMjMgREVDT0RJTkcgTElCUkFSWSBVUFRPREFURSAtLS0KKwlAZWNoby4KKworbGliOiAkKEFTTV9PQkopIGxpYkEgbGliQgorCiskKFRfTEFNRSkgOiB0YXJnZXRfZGlyZWN0b3J5IGNvbmZpZy5oICQoVF9MSUJfU1RBVElDKSBjb21tb24gJChMQU1FX09CSikKKwlAJChMTikgJChMTl9PVVQpJChUQVJHRVRfRElSKSRAICQoTE5fU1dJVENIRVMpICQoTElCU05ERklMRSkgXAorCSAgICAgICAkKFRBUkdFVF9ESVIpJChUX0xJQl9TVEFUSUMpICQoQ01NTl9PQkopICQoTEFNRV9PQkopICQoQURETF9PQkopCisJQGVjaG8uCisJQGVjaG8gLS09KiAgJChUQVJHRVRfRElSKSRAIHJlYWR5ICAqPS0tCisJQGVjaG8uCisKKyQoVF9NUDNYKSA6IHRhcmdldF9kaXJlY3RvcnkgY29uZmlnLmggbGliIGNvbW1vbiAkKE1QWF9PQkopCisJQCQoTE4pICQoTE5fT1VUKSQoVEFSR0VUX0RJUikkQCAkKExOX1NXSVRDSEVTKSAkKEdUS19MSUJTKSAkKExJQlNOREZJTEUpIFwKKwkgICAgICAgJChUQVJHRVRfRElSKSQoVF9MSUJfU1RBVElDKSAkKENNTU5fT0JKKSAkKE1QWF9PQkopICQoQURETF9PQkopCisJQGVjaG8uCisJQGVjaG8gLS09KiAgJChUQVJHRVRfRElSKSRAIHJlYWR5ICAqPS0tCisJQGVjaG8uCisKKyQoVF9MRUdBQ1lfRExMKSA6IHRhcmdldF9kaXJlY3RvcnkgY29uZmlnLmggJChETExfT0JKKQorCUAkKExOKSAkKExOX09VVCkkKFRBUkdFVF9ESVIpJEAgJChMTl9TV0lUQ0hFUykgXAorCSAgICAgICAkKFRBUkdFVF9ESVIpJChUX0xJQl9TVEFUSUMpICQoTE5fRExMKSBcCisJICAgICAgICQoRExMX09CSikgJChBRERMX09CSikKKwlAZWNoby4KKwlAZWNobyAtLT0qICAkKFRBUkdFVF9ESVIpJEAgcmVhZHkgICo9LS0KKwlAZWNoby4KKworJChUX0RMTCkgOiB0YXJnZXRfZGlyZWN0b3J5IGNvbmZpZy5oICQoVF9MSUJfU1RBVElDKSAKKwlAJChMTikgJChMTl9ETEwpICQoTUFDSElORSkgXAorCQkvREVGOiJpbmNsdWRlXGxhbWUuZGVmIiBcCisJCSQoQURETF9PQkopIFwKKwkJJChMTl9PVVQpIiQoVEFSR0VUX0RJUikkQCIgXAorCQkkKFRBUkdFVF9ESVIpJChUX0xJQl9TVEFUSUMpIGxpYm1wM2xhbWVcdmVyc2lvbi5vYmogCisJQGVjaG8uCisJQGVjaG8gLS09KiAgJChUQVJHRVRfRElSKSRAIHJlYWR5ICAqPS0tCisJQGVjaG8uCisKKyQoVF9MSUJfU1RBVElDKSA6IHRhcmdldF9kaXJlY3RvcnkgbGliCisJQGxpYiAkKExJQl9PUFRTKSBcCisJCS9PVVQ6IiQoVEFSR0VUX0RJUikkQCIgXAorCQkkKEFTTV9PQkopICQoTElCX09CSikgJChNUEdfT0JKKQorCUBlY2hvLgorCUBlY2hvIC0tPSogICQoVEFSR0VUX0RJUikkQCByZWFkeSAgKj0tLQorCUBlY2hvLgorCQkKK2NvbmZpZy5oIDogY29uZmlnTVMuaAorCUAtY29weSBjb25maWdNUy5oIGNvbmZpZy5oCisKK2NsZWFuOgorCUAtZGVsICQoVEFSR0VUX0RJUikkKFRfTEFNRSkKKwlALWRlbCAkKFRBUkdFVF9ESVIpJChUX01QM1gpCisJQC1kZWwgJChUQVJHRVRfRElSKSQoVF9ETEwpCisJQC1kZWwgJChUQVJHRVRfRElSKSQoVF9MSUJfU1RBVElDKQorCUAtZGVsICQoVEFSR0VUX0RJUikkKFRfTElCX0RZTkFNSUMpCisJQC1kZWwgJChUQVJHRVRfRElSKSQoVF9MRUdBQ1lfRExMKQorCUAtZGVsIGxhbWUucGRiCisJQC1kZWwgaWNsLnBjaAorCUAtZGVsICQoVEFSR0VUX0RJUilsYW1lX2VuYy4qCisJQC1kZWwgZnJvbnRlbmRcKi5vYmoKKwlALWRlbCBkbGxcKi5vYmoKKwlALWRlbCBtcGdsaWJcKi5vYmoKKwlALWRlbCBsaWJtcDNsYW1lXCoub2JqCisJQC1kZWwgbGlibXAzbGFtZVxpMzg2XCoub2JqCisJQC1kZWwgbGlibXAzbGFtZVx2ZWN0b3JcKi5vYmoKKworCityZWJ1aWxkOiBjbGVhbiBhbGwKKworCitsYW1lCToJJChUX0xBTUUpCitsYW1lX2VuYzoJJChUX0xFR0FDWV9ETEwpCitkbGwgCToJJChUX0RMTCkgJChUX0xFR0FDWV9ETEwpIAorbXAzeAk6CSQoVF9NUDNYKQorCisKK2FsbCA6CSQoUEdNKSBkbGwgbGFtZV9lbmMgCisJQGVjaG8uCisJQGVjaG8gLS09KiAgYWxsIHVwdG9kYXRlICAqPS0tCisJQGVjaG8uCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTVlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDY3IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS4zNi4yLjIgMjAxMC8wMi8yNiAyMjozMzowNiByb2JlcnQgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCisuUEhPTlk6IHRlc3QKKworU1VCRElSUyA9IG1wZ2xpYiBsaWJtcDNsYW1lIGZyb250ZW5kIERsbCBkZWJpYW4gZG9jIGluY2x1ZGUgbWlzYyBkc2hvdyBBQ00gXAorCW1hYyBtYWNvc3ggdmNfc29sdXRpb24KKworQ0xFQU5GSUxFUyA9IHRlc3RjYXNlLm5ldy5tcDMKKworRVhUUkFfRElTVCA9IFwKKwlBUEkgXAorCURFRklORVMgXAorCUhBQ0tJTkcgXAorCUlOU1RBTEwuY29uZmlndXJlIFwKKwlMSUNFTlNFIFwKKwlNYWtlZmlsZS5NU1ZDIFwKKwlNYWtlZmlsZS51bml4IFwKKwlNYWtlZmlsZS5hbS5nbG9iYWwgXAorCVJFQURNRS5XSU5HVEsgXAorCVNUWUxFR1VJREUgXAorCVVTQUdFIFwKKwljb25maWdNUy5oIFwKKwlsYW1lLmJhdCBcCisJbGFtZS5zcGVjLmluIFwKKwlsYW1lLnNwZWMgXAorCWxhbWVfcHJvamVjdHNfdmM2LmRzcCBcCisJbGFtZV92YzYuZHN3IFwKKwlsYW1lX2NsaWVudHNfdmM2LmRzdyBcCisJbGFtZV92Yzguc2xuIFwKKwl0ZXN0Y2FzZS5tcDMgXAorCXRlc3RjYXNlLndhdgorCisjCisjIFRoZSBkaWZmZXJlbmNlcyBkZXBlbmQgb24gdGhlIHVzZWQgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSwgdGhlIHVzZWQKKyMgY29tcGlsZXIgYW5kIHRoZSB1c2VkIG9wdGlvbnMgZm9yIHRoZSBjb21waWxlciwgc28gbWFrZSB0ZXN0IG1heQorIyBzaG93IHNvbWUgZGlmZmVyZW5jZXMuIFlvdSBzaG91bGQgb25seSBiZSBjb25jZXJuZWQgaWYgeW91IGFyZSBhCisjIExBTUUgZGV2ZWxvcGVyIGFuZCB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzIGNoYW5nZSBhZnRlciB5b3UKKyMgbW9kaWZpZWQgdGhlIHNvdXJjZS4KKyMKK3Rlc3RjYXNlLm5ldy5tcDM6IHRlc3RjYXNlLndhdiBmcm9udGVuZC9sYW1lJChFWEVFWFQpCisJdGltZSBmcm9udGVuZC9sYW1lJChFWEVFWFQpIC0tbm9yZXMgJCh0b3Bfc3JjZGlyKS90ZXN0Y2FzZS53YXYgdGVzdGNhc2UubmV3Lm1wMyB8fCAkKFJNX0YpIHRlc3RjYXNlLm5ldy5tcDMKKwordGVzdDogdGVzdGNhc2UubXAzIHRlc3RjYXNlLm5ldy5tcDMKKwlAZWNobworCUBlY2hvICJUaGUgZm9sbG93aW5nIG91dHB1dCBoYXMgdmFsdWUgb25seSBmb3IgYSBMQU1FLWRldmVsb3BlciwgZG8gbm90IG1ha2UgX2FueV8iCisJQGVjaG8gImFzc3VtcHRpb25zIGFib3V0IHdoYXQgdGhpcyBudW1iZXIgbWVhbnMuIFlvdSBkbyBub3QgbmVlZCB0byBjYXJlIGFib3V0IGl0LiIKKwlAY21wIC1sIHRlc3RjYXNlLm5ldy5tcDMgJCh0b3Bfc3JjZGlyKS90ZXN0Y2FzZS5tcDMgfCB3YyAtbAorCit0ZXN0dXBkYXRlOiB0ZXN0Y2FzZS5tcDMgdGVzdGNhc2UubmV3Lm1wMworCWNwIHRlc3RjYXNlLm5ldy5tcDMgJCh0b3Bfc3JjZGlyKS90ZXN0Y2FzZS5tcDMKKwordGVzdGc6IGZyb250ZW5kL21wM3gkKEVYRUVYVCkgJCh0b3Bfc3JjZGlyKS8uLi90ZXN0L2Nhc3RhbmV0cy53YXYKKwlmcm9udGVuZC9tcDN4JChFWEVFWFQpIC1oICQodG9wX3NyY2RpcikvLi4vdGVzdC9jYXN0YW5ldHMud2F2CisKK3VwZGF0ZToKKwljZCAkKHRvcF9zcmNkaXIpICYmIENWU19SU0g9c3NoIGN2cyAtejMgLXEgdXBkYXRlIC1kQVAgfHwgdHJ1ZQorCitkaWZmOgorCWNkICQodG9wX3NyY2RpcikgJiYgQ1ZTX1JTSD1zc2ggY3ZzIC16MyBkaWZmIC11IHx8IHRydWUKKworZnJvbnRlbmQvbGFtZSQoRVhFRVhUKToKKwkkKE1BS0UpICQoTUFLRUZMQUdTKQorCitmcm9udGVuZC9tcDN4JChFWEVFWFQpOiBmcm9udGVuZC9sYW1lJChFWEVFWFQpCisKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtLmdsb2JhbCBiL01ha2VmaWxlLmFtLmdsb2JhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjg5Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuYW0uZ2xvYmFsCkBAIC0wLDAgKzEsNyBAQAorIyMgJElkOiBNYWtlZmlsZS5hbS5nbG9iYWwsdiAxLjYgMjAwNi8wNi8wMyAxMzowNzozNiBhbGVpZGluZ2VyIEV4cCAkCisKKyMgZ2xvYmFsIHNlY3Rpb24gZm9yIGV2ZXJ5IE1ha2VmaWxlLmFtCisKK0FVVE9NQUtFX09QVElPTlMgPSAxLjkgZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTQzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDcyNCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKyMgZ2xvYmFsIHNlY3Rpb24gZm9yIGV2ZXJ5IE1ha2VmaWxlLmFtCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCisJJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9jb25maWcuaC5pbiBcCisJJChzcmNkaXIpL2xhbWUuc3BlYy5pbiAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgQ09QWUlORyBDaGFuZ2VMb2cgSU5TVEFMTCBUT0RPIFwKKwljb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcKK3N1YmRpciA9IC4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKKyBjb25maWd1cmUubGluZW5vIGNvbmZpZy5zdGF0dXMubGluZW5vCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSBsYW1lLnNwZWMKK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCisJaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKKwlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK2Rpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKK3RvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQorYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAorICB7IHRlc3QgISAtZCAkKGRpc3RkaXIpIFwKKyAgICB8fCB7IGZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKKyAgICAgICAgICYmIHJtIC1mciAkKGRpc3RkaXIpOyB9OyB9CitESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKK0daSVBfRU5WID0gLS1iZXN0CitkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CitkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkZMQUdTID0gQEZGTEFHU0AKK0ZST05URU5EX0NGTEFHUyA9IEBGUk9OVEVORF9DRkxBR1NACitGUk9OVEVORF9MREFERCA9IEBGUk9OVEVORF9MREFEREAKK0ZST05URU5EX0xERkxBR1MgPSBARlJPTlRFTkRfTERGTEFHU0AKK0dSRVAgPSBAR1JFUEAKK0dUS19DRkxBR1MgPSBAR1RLX0NGTEFHU0AKK0dUS19DT05GSUcgPSBAR1RLX0NPTkZJR0AKK0dUS19MSUJTID0gQEdUS19MSUJTQAorSU5DTFVERVMgPSBASU5DTFVERVNACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IDEuOSBmb3JlaWduICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK1NVQkRJUlMgPSBtcGdsaWIgbGlibXAzbGFtZSBmcm9udGVuZCBEbGwgZGViaWFuIGRvYyBpbmNsdWRlIG1pc2MgZHNob3cgQUNNIFwKKwltYWMgbWFjb3N4IHZjX3NvbHV0aW9uCisKK0NMRUFORklMRVMgPSB0ZXN0Y2FzZS5uZXcubXAzCitFWFRSQV9ESVNUID0gXAorCUFQSSBcCisJREVGSU5FUyBcCisJSEFDS0lORyBcCisJSU5TVEFMTC5jb25maWd1cmUgXAorCUxJQ0VOU0UgXAorCU1ha2VmaWxlLk1TVkMgXAorCU1ha2VmaWxlLnVuaXggXAorCU1ha2VmaWxlLmFtLmdsb2JhbCBcCisJUkVBRE1FLldJTkdUSyBcCisJU1RZTEVHVUlERSBcCisJVVNBR0UgXAorCWNvbmZpZ01TLmggXAorCWxhbWUuYmF0IFwKKwlsYW1lLnNwZWMuaW4gXAorCWxhbWUuc3BlYyBcCisJbGFtZV9wcm9qZWN0c192YzYuZHNwIFwKKwlsYW1lX3ZjNi5kc3cgXAorCWxhbWVfY2xpZW50c192YzYuZHN3IFwKKwlsYW1lX3ZjOC5zbG4gXAorCXRlc3RjYXNlLm1wMyBcCisJdGVzdGNhc2Uud2F2CisKK2FsbDogY29uZmlnLmgKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKK2FtLS1yZWZyZXNoOgorCUA6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICc7IFwKKwkgICAgICBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBNYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAorCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpICQoQUNMT0NBTF9BTUZMQUdTKQorCitjb25maWcuaDogc3RhbXAtaDEKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkgIHJtIC1mIHN0YW1wLWgxOyBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBzdGFtcC1oMTsgXAorCWVsc2UgOjsgZmkKKworc3RhbXAtaDE6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBybSAtZiBzdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKKyQoc3JjZGlyKS9jb25maWcuaC5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykgCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCisJcm0gLWYgc3RhbXAtaDEKKwl0b3VjaCAkQAorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBjb25maWcuaCBzdGFtcC1oMQorbGFtZS5zcGVjOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvbGFtZS5zcGVjLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitkaXN0Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgbGlidG9vbAorCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6CisJQGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICB0YWdzPSIkJHRhZ3MgJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCXRlc3QgLWQgJChkaXN0ZGlyKSB8fCBta2RpciAkKGRpc3RkaXIpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICBkaXN0ZGlyPWAkKGFtX19jZCkgJChkaXN0ZGlyKSAmJiBwd2RgOyBcCisJICAgIHRvcF9kaXN0ZGlyPWAkKGFtX19jZCkgJCh0b3BfZGlzdGRpcikgJiYgcHdkYDsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJHRvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJGRpc3RkaXIvJCRzdWJkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwktZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtNzc3IC1leGVjIGNobW9kIGErcnd4IHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAorCXx8IGNobW9kIC1SIGErciAkKGRpc3RkaXIpCitkaXN0LWd6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWJ6aXAyOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGJ6aXAyIC05IC1jID4kKGRpc3RkaXIpLnRhci5iejIKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC10YXJaOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3Qtc2hhcjogZGlzdGRpcgorCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtemlwOiBkaXN0ZGlyCisJLXJtIC1mICQoZGlzdGRpcikuemlwCisJemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QgZGlzdC1hbGw6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCisJKi50YXIuZ3oqKSBcCisJICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnRhci5neiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5iejIqKSBcCisJICBidW56aXAyIC1jICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5aKikgXAorCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAorCSouc2hhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikuc2hhci5neiB8IHVuc2hhciA7O1wKKwkqLnppcCopIFwKKwkgIHVuemlwICQoZGlzdGRpcikuemlwIDs7XAorCWVzYWMKKwljaG1vZCAtUiBhLXcgJChkaXN0ZGlyKTsgY2htb2QgYSt3ICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpL19idWlsZAorCW1rZGlyICQoZGlzdGRpcikvX2luc3QKKwljaG1vZCBhLXcgJChkaXN0ZGlyKQorCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAorCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCisJICAmJiBjZCAkKGRpc3RkaXIpL19idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICQoRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrIFwKKwkgICYmIGNobW9kIC1SIGEtdyAiJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICYmICh7IFwKKwkgICAgICAgKGNkIC4uLy4uICYmIHVtYXNrIDA3NyAmJiBta2RpciAiJCRkY19kZXN0ZGlyIikgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIGluc3RhbGwgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIHVuaW5zdGFsbCBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgXAorCSAgICAgICAgICAgIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfZGVzdGRpciIgZGlzdHVuaW5zdGFsbGNoZWNrOyBcCisJICAgICAgfSB8fCB7IHJtIC1yZiAiJCRkY19kZXN0ZGlyIjsgZXhpdCAxOyB9KSBcCisJICAmJiBybSAtcmYgIiQkZGNfZGVzdGRpciIgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdCBcCisJICAmJiBybSAtcmYgJChESVNUX0FSQ0hJVkVTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Y2xlYW5jaGVjaworCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCUAoZWNobyAiJChkaXN0ZGlyKSBhcmNoaXZlcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uOiAiOyBcCisJICBsaXN0PSckKERJU1RfQVJDSElWRVMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSkgfCBcCisJICBzZWQgLWUgMWggLWUgMXMvLi89L2cgLWUgMXAgLWUgMXggLWUgJyQkcCcgLWUgJyQkeCcKK2Rpc3R1bmluc3RhbGxjaGVjazoKKwlAY2QgJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKSBcCisJJiYgdGVzdCBgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtbGUgMSBcCisJICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKKwkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKKwkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKKwkgICAgICAgIGZpIDsgXAorCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgIGV4aXQgMTsgfSA+JjIKK2Rpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KKwlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKKwkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKKwkgIGV4aXQgMSA7IFwKKwlmaQorCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAorCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCisJICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgZXhpdCAxOyB9ID4mMgorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSBjb25maWcuaAoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktcmVjdXJzaXZlCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1yZWN1cnNpdmUKKworaW5mbzogaW5mby1yZWN1cnNpdmUKKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktcmVjdXJzaXZlCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLXJlY3Vyc2l2ZQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCisJLXJtIC1yZiAkKHRvcF9zcmNkaXIpL2F1dG9tNHRlLmNhY2hlCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1yZWN1cnNpdmUKKworcGRmLWFtOgorCitwczogcHMtcmVjdXJzaXZlCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAorCWFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdCBkaXN0LWFsbCBkaXN0LWJ6aXAyIFwKKwlkaXN0LWd6aXAgZGlzdC1zaGFyIGRpc3QtdGFyWiBkaXN0LXppcCBkaXN0Y2hlY2sgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW5jaGVjayBkaXN0ZGlyIGRpc3R1bmluc3RhbGxjaGVjayBkdmkgXAorCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCisJaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCisJaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKKwlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKKwlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHRhZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIGVuZCBnbG9iYWwgc2VjdGlvbgorCisuUEhPTlk6IHRlc3QKKworIworIyBUaGUgZGlmZmVyZW5jZXMgZGVwZW5kIG9uIHRoZSB1c2VkIHByb2Nlc3NvciBhcmNoaXRlY3R1cmUsIHRoZSB1c2VkCisjIGNvbXBpbGVyIGFuZCB0aGUgdXNlZCBvcHRpb25zIGZvciB0aGUgY29tcGlsZXIsIHNvIG1ha2UgdGVzdCBtYXkKKyMgc2hvdyBzb21lIGRpZmZlcmVuY2VzLiBZb3Ugc2hvdWxkIG9ubHkgYmUgY29uY2VybmVkIGlmIHlvdSBhcmUgYQorIyBMQU1FIGRldmVsb3BlciBhbmQgdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlcyBjaGFuZ2UgYWZ0ZXIgeW91CisjIG1vZGlmaWVkIHRoZSBzb3VyY2UuCisjCit0ZXN0Y2FzZS5uZXcubXAzOiB0ZXN0Y2FzZS53YXYgZnJvbnRlbmQvbGFtZSQoRVhFRVhUKQorCXRpbWUgZnJvbnRlbmQvbGFtZSQoRVhFRVhUKSAtLW5vcmVzICQodG9wX3NyY2RpcikvdGVzdGNhc2Uud2F2IHRlc3RjYXNlLm5ldy5tcDMgfHwgJChSTV9GKSB0ZXN0Y2FzZS5uZXcubXAzCisKK3Rlc3Q6IHRlc3RjYXNlLm1wMyB0ZXN0Y2FzZS5uZXcubXAzCisJQGVjaG8KKwlAZWNobyAiVGhlIGZvbGxvd2luZyBvdXRwdXQgaGFzIHZhbHVlIG9ubHkgZm9yIGEgTEFNRS1kZXZlbG9wZXIsIGRvIG5vdCBtYWtlIF9hbnlfIgorCUBlY2hvICJhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHRoaXMgbnVtYmVyIG1lYW5zLiBZb3UgZG8gbm90IG5lZWQgdG8gY2FyZSBhYm91dCBpdC4iCisJQGNtcCAtbCB0ZXN0Y2FzZS5uZXcubXAzICQodG9wX3NyY2RpcikvdGVzdGNhc2UubXAzIHwgd2MgLWwKKwordGVzdHVwZGF0ZTogdGVzdGNhc2UubXAzIHRlc3RjYXNlLm5ldy5tcDMKKwljcCB0ZXN0Y2FzZS5uZXcubXAzICQodG9wX3NyY2RpcikvdGVzdGNhc2UubXAzCisKK3Rlc3RnOiBmcm9udGVuZC9tcDN4JChFWEVFWFQpICQodG9wX3NyY2RpcikvLi4vdGVzdC9jYXN0YW5ldHMud2F2CisJZnJvbnRlbmQvbXAzeCQoRVhFRVhUKSAtaCAkKHRvcF9zcmNkaXIpLy4uL3Rlc3QvY2FzdGFuZXRzLndhdgorCit1cGRhdGU6CisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBDVlNfUlNIPXNzaCBjdnMgLXozIC1xIHVwZGF0ZSAtZEFQIHx8IHRydWUKKworZGlmZjoKKwljZCAkKHRvcF9zcmNkaXIpICYmIENWU19SU0g9c3NoIGN2cyAtejMgZGlmZiAtdSB8fCB0cnVlCisKK2Zyb250ZW5kL2xhbWUkKEVYRUVYVCk6CisJJChNQUtFKSAkKE1BS0VGTEFHUykKKworZnJvbnRlbmQvbXAzeCQoRVhFRVhUKTogZnJvbnRlbmQvbGFtZSQoRVhFRVhUKQorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUudW5peCBiL01ha2VmaWxlLnVuaXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNDYxMAotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLnVuaXgKQEAgLTAsMCArMSw2MjQgQEAKKyMgTWFrZWZpbGUgZm9yIExBTUUgMy54eCAtKi0gbWFrZWZpbGUgLSotCisjCisjIExBTUUgaXMgcmVwb3J0ZWQgdG8gd29yayB1bmRlcjoKKyMgTGludXggKGk4NiksIE5ldEJTRCAxLjMuMiAoU3Ryb25nQVJNKSwgRnJlZUJTRCAoaTg2KQorIyBDb21wYXEgQWxwaGEoT1NGLCBMaW51eCwgVHJ1NjQgVW5peCksIFN1biBTb2xhcmlzLCBTR0kgSVJJWCwKKyMgT1MyIFdhcnAsIE1hY2ludG9zaCBQUEMsIEJlT1MsIEFtaWdhIGFuZCBldmVuIFZDKysKKyMKKworIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSBvbiBjb21tYW5kIGxpbmU6CisjCisjICAgbWFrZSBVTkFNRT14eHh4eCBBUkNIPXh4eHh4ICAgLSBzcGVjaWZ5IGEgdHlwZSBvZiBob3N0CisjICAgbWFrZSBQR009bGFtZV9leHAgICAgICAgICAgICAgLSBzcGVjaWZ5IGEgbmFtZSBvZiBhbiBleGVjdXRhYmxlIGZpbGUKKyMKKyMgaWYgeW91IGhhdmUgbWluZ3czMi1nY2MsIHRyeToKKyMgICBtYWtlIC1mTWFrZWZpbGUudW5peCBVTkFNRT1NU0RPUworIyBvciBpZiB5b3UgZ2V0IHRoZSBlcnJvcgorIyAicHJvY2Vzc19iZWdpbjogQ3JlYXRlUHJvY2VzcygobnVsbCksIGNvcHkgY29uZmlnTVMuaCBjb25maWcuaCwgLi4uKSI6CisjICAgbWFrZSAtZk1ha2VmaWxlLnVuaXggVU5BTUU9TVNET1MgTk9VTklYQ01EPU5PCisjIG9yIGlmIHlvdSBoYXZlIE5BU006CisjICAgbWFrZSAtZk1ha2VmaWxlLnVuaXggVU5BTUU9TVNET1MgSEFWRV9OQVNNPVlFUworIworCitpZmVxICgkKFVOQU1FKSxNU0RPUykKKyAgVU5BTUUgPz0gVU5LTk9XTgorICBBUkNIID0geDg2CisgIE5PVU5JWENNRCA9IFlFUworZWxzZQorICBVTkFNRSA9ICQoc2hlbGwgdW5hbWUpCisgIEFSQ0ggPSAkKHNoZWxsIHVuYW1lIC1tKQorICBpQVJDSCA9ICQocGF0c3Vic3QgaSU4Nix4ODYsJChBUkNIKSkKK2VuZGlmCisKK0hBVkVfTkFTTSA9IE5PCitIQVZFX05FV0VSX0dMSUJDID0gTk8KKworIyBnZW5lcmljIGRlZmF1bHRzLiBPUyBzcGVjaWZpYyBvcHRpb25zIGdvIGluIHZlcnNpb3VzIHNlY3Rpb25zIGJlbG93CitQR00gPSBsYW1lCitDQyA9IGdjYworQ0NfT1BUUyA9ICAtTworQ1BQX09QVFMgPSAtSWluY2x1ZGUgLUltcGdsaWIgLUlmcm9udGVuZCAtSWxpYm1wM2xhbWUKK0FSID0gYXIKK1JBTkxJQiA9IHJhbmxpYgorR1RLID0KK0dUS0xJQlMgPQorTElCU05ERklMRSA9CitMSUJTID0gLWxtCitNUDNMSUIgPSBsaWJtcDNsYW1lL2xpYm1wM2xhbWUuYQorTVAzTElCX1NIQVJFRCA9IGxpYm1wM2xhbWUvbGlibXAzbGFtZS5zbworTUFLRURFUCA9IC1NCitCUkhJU1RfU1dJVENIID0KK0xJQlRFUk1DQVAgPQorUk0gPSBybSAtZgorCitDUFBfT1BUUyArPSAtREhBVkVfQ09ORklHX0ggLUkuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC1ESEFWRU1QR0xJQiBjb21waWxlcyB0aGUgbXBnbGliICpkZWNvZGluZyogbGlicmFyeSBpbnRvIGxpYm1wM2xhbWUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitDUFBfT1BUUyArPSAtREhBVkVfTVBHTElCCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC1EVVNFX0xBWUVSXzEvMiBlbmFibGVzIExheWVyMSBvciBMYXllcjIgKmRlY29kaW5nKiBhYmlsaXRpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitDUFBfT1BUUyArPSAtRFVTRV9MQVlFUl8xIC1EVVNFX0xBWUVSXzIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLURUQUtFSElST19JRUVFNzU0X0hBQ0sgZW5hYmxlcyBUYWtlaGlybydzIElFRUUgaGFjaworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKCQoaUFSQ0gpLHg4NikKKwlDUFBfT1BUUyArPSAtRFRBS0VISVJPX0lFRUU3NTRfSEFDSworZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGVmaW5lIHRoZXNlIGluIHRoZSBPUyBzcGVjaWZpYyBzZWN0aW9ucyBiZWxvdyB0byBjb21waWxlIGluIGNvZGUKKyMgZm9yIHRoZSBvcHRpb25hbCBWQlIgYml0cmF0ZSBoaXN0b2dyYW0uCisjIFJlcXVpcmVzIG5jdXJzZXMsIGJ1dCBsaWJ0ZXJtY2FwIGFsc28gd29ya3MuCisjIElmIHlvdSBoYXZlIGFueSB0cm91YmxlLCBqdXN0IGRvbnQgZGVmaW5lIHRoZXNlCisjCisjIEJSSElTVF9TV0lUQ0ggPSAtREJSSElTVCAtREhBVkVfVEVSTUNBUCAtREhBVkVfe05DVVJTRVNffVRFUk1DQVBfSAorIyBMSUJURVJNQ0FQID0gLWxuY3Vyc2VzCisjIExJQlRFUk1DQVAgPSAtbHRlcm1jYXAKKyMKKyMgb3IsIHRvIHRyeSBhbmQgc2ltdWxhdGUgVEVSTUNBUCAoQU5TSSksIHVzZToKKyMgQlJISVNUX1NXSVRDSCA9IC1EQlJISVNUCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlZmluZSB0aGVzZSBpbiB0aGUgT1Mgc3BlY2lmaWMgc2VjdGlvbnMgYmVsb3cgdG8gY29tcGlsZSBpbiBjb2RlIGZvcjoKKyMKKyMgU05ETElCID0gLURMSUJTTkRGSUxFICAgdG8gdXNlIEVyaWsgZGUgQ2FzdHJvIExvcG8ncyBsaWJzbmRmaWxlCisjIGh0dHA6Ly93d3cuemlwLmNvbS5hdS9+ZXJpa2QvbGlic25kZmlsZS8gaW5zdGVhZCBvZiBMQU1FJ3MgaW50ZXJuYWwKKyMgcm91dGluZXMuICBBbHNvIHNldDoKKyMKKyMgTElCU05ERklMRSA9IC1sc25kZmlsZQorIyBvcgorIyBMSUJTTkRGSUxFID0gLUwvbG9jYXRpb25fb2ZfbGlic25kZmlsZSAgLWxzbmRmaWxlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlZmluZSB0aGVzZSBpbiB0aGUgT1Mgc3BlY2lmaWMgc2VjdGlvbnMgYmVsb3cgdG8gY29tcGlsZSBpbiBjb2RlIGZvcgorIyB0aGUgR1RLIG1wMyBmcmFtZSBhbmFseXplcgorIworIyBSZXF1aXJlcyAgLURIQVZFX01QR0xJQgorIworIyBHVEsgPSAtREhBVkVfR1RLIGBndGstY29uZmlnIC0tY2ZsYWdzYAorIyBHVEtMSUJTID0gYGd0ay1jb25maWcgLS1saWJzYAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTElOVVgKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKFVOQU1FKSxMaW51eCkKKyMgIFRoZSBmcmFtZSBhbmFseXplciBkZXBlbmRzIG9uIGd0azEuMi4gVW5jb21tZW50IHRoZSBuZXh0IDIgbGluZXMgdG8gZ2V0IGl0CisjICAgR1RLID0gLURIQVZFX0dUSyBgZ3RrLWNvbmZpZyAtLWNmbGFnc2AKKyMgICBHVEtMSUJTID0gYGd0ay1jb25maWcgLS1saWJzYAorIyBDb21tZW50IG91dCBuZXh0IDIgbGluZXMgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIFZCUiBoaXN0b2dyYW0gY2FwYWJpbGl0eQorICAgQlJISVNUX1NXSVRDSCA9IC1EQlJISVNUIC1ESEFWRV9URVJNQ0FQIC1ESEFWRV9URVJNQ0FQX0gKKyAgIExJQlRFUk1DQVAgPSAtbG5jdXJzZXMKKyMgIHVuY29tbWVudCB0byB1c2UgTElCU05ERklMRQorIyAgIFNORExJQiA9IC1ETElCU05ERklMRQorIyAgIExJQlNOREZJTEU9LWxzbmRmaWxlCisKKyMgc3VnZ2VzdGVkIGZvciBnY2MtMi43LngKKyMgIENDX09QVFMgPSAgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mdW5yb2xsLWxvb3BzIC1mZmFzdC1tYXRoICAtZmlubGluZS1mdW5jdGlvbnMgLVdhbGwgLXBlZGFudGljCisjICBDQ19PUFRTID0gIC1POSAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtbXBlbnRpdW1wcm8gLWZmYXN0LW1hdGggLWZpbmxpbmUtZnVuY3Rpb25zIC1mdW5yb2xsLWxvb3BzIC1XYWxsIC1tYWxpZ24tZG91YmxlIC1nIC1tYXJjaD1wZW50aXVtcHJvIC1tZmFuY3ktbWF0aC0zODcgLXBpcGUgLXBlZGFudGljCisKKyMgU3VnZ2VzdGVkIGZvciBHQ0MgNC4qICYgbWFjaGluZXMgd2l0aCBzc2Urc3NlMitzc2UzOiAtT3MgbWlnaHQgcmVkdWNlCisjIHRoZSB1c2Ugb2YgdGhlIGluc3RydWN0aW9uIGNhY2hlIGFuZCwgdGh1cywgZ2V0IGJldHRlciBwZXJmb3JtYW5jZSwKKyMgYnV0IHRoaXMgc2hvdWxkIGJlIGV4cGVyaW1lbnRlZCBieSB0aGUgdXNlci4gQ3VzdG9taXplIGF0IHlvdXIgb3duCisjIGNvbnZlbmllbmNlLgorIworI0NDX09QVFMgPSAtcGlwZSAtTzMgXAorIwktV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyBcCisjCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdmbG9hdC1lcXVhbCAtV3NoYWRvdyBcCisjCS1XY2FzdC1xdWFsIC1XY2FzdC1hbGlnbiAtV2Rpc2FibGVkLW9wdGltaXphdGlvbiBcCisjCS1mZmFzdC1tYXRoIC1mdHJlZS12ZWN0b3JpemUgLWZ0cmVlLXZlY3QtbG9vcC12ZXJzaW9uIFwKKyMJLW10dW5lPW5vY29uYSAtbWFyY2g9bm9jb25hIC1tZnBtYXRoPXNzZSAtbXNzZSAtbXNzZTIgLW1zc2UzIFwKKyMJLW1hbGlnbi1kb3VibGUgLW1hY2N1bXVsYXRlLW91dGdvaW5nLWFyZ3MKKworIyAgZm9yIGRlYnVnZ2luZzoKKyAgQ0NfT1BUUyA9ICAtVU5ERUJVRyAtTyAtV2FsbCAtcGVkYW50aWMgLWdnZGIgLURBQk9SVEZQCisKKyMgIGZvciBsb3RzIG9mIGRlYnVnZ2luZzoKKyMgICBDQ19PUFRTID0gIC1EREVCVUcgLVVOREVCVUcgIC1PIC1XYWxsIC1wZWRhbnRpYyAtZyAtREFCT1JURlAKKworCitpZmVxICgkKENGRyksUkgpCisgICBHVEsgPSAtREhBVkVfR1RLIGBndGstY29uZmlnIC0tY2ZsYWdzYAorICAgR1RLTElCUyA9IGBndGstY29uZmlnIC0tbGlic2AKKyAgQ1BQX09QVFMgKz0gLURGTE9BVDg9ZmxvYXQgLURSRUFMX0lTX0ZMT0FUPTEgLURIQVZFX0lDT05WIC1ESEFWRV9YTU1JTlRSSU5fSCAtRF9BTExPV19JTlRFUk5BTF9PUFRJT05TCisjIHRoZXNlIG9wdGlvbnMgZm9yIGdjYy0zLjIgJiBBdGhsb25YUAorICAgQ0NfT1BUUyA9IFwKKwktcGlwZSAtTzMgXAorCS1XYWxsIC1XIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdmbG9hdC1lcXVhbCBcCisJLVdjYXN0LXF1YWwgLVdjYXN0LWFsaWduIC1XZGlzYWJsZWQtb3B0aW1pemF0aW9uIC1Xc2hhZG93IFwKKwktbWFyY2g9YXRobG9uLXhwIFwKKwktbWFsaWduLWRvdWJsZSBcCisJLW1hY2N1bXVsYXRlLW91dGdvaW5nLWFyZ3MKKyMJLVdjb252ZXJzaW9uIC1XdW5yZWFjaGFibGUtY29kZSBcCisKKyAgIEhBVkVfTkVXRVJfR0xJQkMgPSBZRVMKKyAgIEhBVkVfTkFTTSA9IFlFUworZW5kaWYKKworaWZlcSAoJChDRkcpLFBGSykKKyAgIENQUF9PUFRTICs9IC1ES0xFTU0gLURLTEVNTV8wMCAtREtMRU1NXzAxIC1ES0xFTU1fMDIgLURLTEVNTV8wMyAtREtMRU1NXzA0IC1ES0xFTU1fMDUgLURLTEVNTV8wNiAtREtMRU1NXzA3IC1ES0xFTU1fMDggLURLTEVNTV8wOSAtREtMRU1NXzEwIC1ES0xFTU1fMTEgLURLTEVNTV8xMiAtREtMRU1NXzEzIC1ES0xFTU1fMTQgLURLTEVNTV8xNSAtREtMRU1NXzE2IC1ES0xFTU1fMTcgLURLTEVNTV8xOCAtREtMRU1NXzE5IC1ES0xFTU1fMjAgLURLTEVNTV8yMSAtREtMRU1NXzIyIC1ES0xFTU1fMjMgLURLTEVNTV8yNCAtREtMRU1NXzI1IC1ES0xFTU1fMjYgLURLTEVNTV8yNyAtREtMRU1NXzI4IC1ES0xFTU1fMjkgLURLTEVNTV8zMCAtREtMRU1NXzMxIC1ES0xFTU1fMzIgLURLTEVNTV8zMyAtREtMRU1NXzM0IC1ES0xFTU1fMzUgLURLTEVNTV8zNiAtREtMRU1NXzM3IC1ES0xFTU1fMzggLURLTEVNTV8zOSAtREtMRU1NXzQwIC1ES0xFTU1fNDEgLURLTEVNTV80MiAtREtMRU1NXzQzIC1ES0xFTU1fNDQgLURLTEVNTV80NSAtREtMRU1NXzQ2IC1ES0xFTU1fNDcgLURLTEVNTV80OCAtREtMRU1NXzQ5IC1ES0xFTU1fNTAKKyAgIENDX09QVFMgPSBcCisJLVdhbGwgLU85IC1mb21pdC1mcmFtZS1wb2ludGVyIC1tYXJjaD1wZW50aXVtIFwKKwktZmlubGluZS1mdW5jdGlvbnMgLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyBcCisJLWZ1bnJvbGwtbG9vcHMgLWZ1bnJvbGwtYWxsLWxvb3BzIC1waXBlIC1mc2NoZWR1bGUtaW5zbnMyIFwKKwktZnN0cmVuZ3RoLXJlZHVjZSBcCisJLW1hbGlnbi1kb3VibGUgLW1mYW5jeS1tYXRoLTM4NyAtZmZhc3QtbWF0aAorCisgICBIQVZFX05FV0VSX0dMSUJDID0gWUVTCisgICBIQVZFX05BU00gPSBZRVMKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExJTlVYIG9uIERpZ2l0YWwvQ29tcGFxIEFscGhhIENQVXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKEFSQ0gpLGFscGhhKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIENoZWNrIGlmICdjY2MnIGlzIGluIG91ciBwYXRoCisjIyMjICAgaWYgbm90LCB1c2UgJ2djYycKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKCQoc2hlbGwgd2hpY2ggY2NjIDI+L2Rldi9udWxsIHwgZ3JlcCAtYyBjY2MpLDApCisKKyMgZG91YmxlIGlzIGZhc3RlciB0aGFuIGZsb2F0IG9uIEFscGhhCitDQ19PUFRTID0gICAgICAgLU80IC1wZWRhbnRpYyAtV2FsbCAtZm9taXQtZnJhbWUtcG9pbnRlciAtZmZhc3QtbWF0aCAtZnVucm9sbC1sb29wcyBcCisgICAgICAgICAgICAgICAgLW1mcC1yZWdzIC1mc2NoZWR1bGUtaW5zbnMgLWZzY2hlZHVsZS1pbnNuczIgXAorICAgICAgICAgICAgICAgIC1maW5saW5lLWZ1bmN0aW9ucyBcCisjICAgICAgICAgICAgICAgIC1ERkxPQVQ9ZG91YmxlCisjIGFkZCAiLW1jcHU9MjExNjRhIC1XYSwtbTIxMTY0YSIgdG8gb3B0aW1pemUgZm9yIDIxMTY0YSAoZXY1NikgQ1BVCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMgZWxzZSwgdXNlICdjY2MnCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitlbHNlCisKKyMgQ29tcGFxJ3MgQyBDb21waWxlcgorQ0MgPSBjY2MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBzZXQgJ0NDX09QVFMgPSAtYXJjaCBob3N0IC10dW5lIGhvc3QnIHRvIGdlbmVyYXRlL3R1bmUgaW5zdHJ1Y3Rpb25zIGZvciB0aGlzIG1hY2hpbmUKKyMjIyMgICAgICdDQ19PUFRTICs9IC1taWdyYXRlIC1mYXN0IC1pbmxpbmUgc3BlZWQgLXVucm9sbCAwJyB0d2VhayB0byBydW4gYXMgZmFzdCBhcyBwb3NzaWJsZSA6KQorIyMjIyAgICAgJ0NDX09QVFMgKz0gLXcwIC1wZWRhbnRpYyAtV2FsbCcgc2V0IHdhcm5pbmcgYW5kIGxpbmtpbmcgZmxhZ3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0NDX09QVFMgPSAtYXJjaCBob3N0IC10dW5lIGhvc3QKK0NDX09QVFMgKz0gLW1pZ3JhdGUgLWZhc3QgLWlubGluZSBzcGVlZCAtdW5yb2xsIDAKK0NDX09QVFMgKz0gLXcwIC1wZWRhbnRpYyAtV2FsbAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMgdG8gZGVidWcsIHVuY29tbWVudAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGb3IgRGVidWdnaW5nCisjQ0NfT1BUUyArPSAtZzMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBkZWZpbmUgX19ERUNBTFBIQV9fIChpIHdhcyBnZXR0aW5nIHJlLWRlY2xhcmF0aW9uIHdhcm5pbmdzCisjIyMjICAgaW4gbWFjaGluZS5oCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlZmluZSBERUMgQWxwaGEKK0NQUF9PUFRTICs9IC1EX19ERUNBTFBIQV9fCisKKyMgc3RhbmRhcmQgTGludXggbGlibQorI0xJQlMJPQktbG0KKyMgb3B0aW1pemVkIGxpYmZmbSAoZnJlZSBmYXN0IG1hdGggbGlicmFyeSkKKyNMSUJTCT0JLWxmZm0KKyMgQ29tcGFxJ3MgZmFzdCBtYXRoIGxpYnJhcnkKK0xJQlMgICAgPSAgICAgICAtbGNwbWwKK2VuZGlmICAjICBnY2Mgb3IgY2NjPworZW5kaWYgICMgIGFscGhhCitlbmRpZiAgIyAgbGludXgKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZyZWVCU0QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKFVOQU1FKSxGcmVlQlNEKQorIyAgcmVtb3ZlIGlmIHlvdSBkbyBub3QgaGF2ZSBHVEsgb3IgZG8gbm90IHdhbnQgdGhlIEdUSyBmcmFtZSBhbmFseXplcgorICAgR1RLID0gLURIQVZFX0dUSyBgZ3RrMTItY29uZmlnIC0tY2ZsYWdzYAorICAgR1RLTElCUyA9IGBndGsxMi1jb25maWcgLS1saWJzYAorIyBDb21tZW50IG91dCBuZXh0IDIgbGluZXMgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIFZCUiBoaXN0b2dyYW0gY2FwYWJpbGl0eQorICAgQlJISVNUX1NXSVRDSCA9IC1EQlJISVNUIC1ESEFWRV9URVJNQ0FQIC1ESEFWRV9URVJNQ0FQX0gKKyAgIExJQlRFUk1DQVAgPSAtbG5jdXJzZXMKKworZW5kaWYKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9wZW5CU0QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKFVOQU1FKSxPcGVuQlNEKQorIyAgcmVtb3ZlIGlmIHlvdSBkbyBub3QgaGF2ZSBHVEsgb3IgZG8gbm90IHdhbnQgdGhlIEdUSyBmcmFtZSBhbmFseXplcgorICAgR1RLID0gLURIQVZFX0dUSyBgZ3RrLWNvbmZpZyAtLWNmbGFnc2AKKyAgIEdUS0xJQlMgPSBgZ3RrLWNvbmZpZyAtLWxpYnNgCisjIENvbW1lbnQgb3V0IG5leHQgMiBsaW5lcyBpZiB5b3Ugd2FudCB0byByZW1vdmUgVkJSIGhpc3RvZ3JhbSBjYXBhYmlsaXR5CisgICBCUkhJU1RfU1dJVENIID0gLURCUkhJU1QgLURIQVZFX1RFUk1DQVAgLURIQVZFX1RFUk1DQVBfSAorICAgTElCVEVSTUNBUCA9IC1sY3Vyc2VzCitlbmRpZgorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTdW5PUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKCQoVU5BTUUpLFN1bk9TKQorICAgQ0MgPSBjYworICAgQ0NfT1BUUyA9IC1PIC14Q0MKKyAgIE1BS0VERVAgPSAteE0KKyMgZm9yIGdjYywgdXNlIGluc3RlYWQ6CisjICAgQ0MgPSBnY2MKKyMgICBDQ19PUFRTID0gLU8KKyMgICBNQUtFREVQID0gLU0KK2VuZGlmCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTR0kKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKFVOQU1FKSxJUklYNjQpCisgICBDQyA9IGNjCisgICBDQ19PUFRTID0gLU8zIC13b2ZmIGFsbAorCisjb3B0b25hbDoKKyMgICBHVEsgPSAtREhBVkVfR1RLIGBndGstY29uZmlnIC0tY2ZsYWdzYAorIyAgIEdUS0xJQlMgPSBgZ3RrLWNvbmZpZyAtLWxpYnNgCisjICAgQlJISVNUX1NXSVRDSCA9IC1EQlJISVNUIC1ESEFWRV9URVJNQ0FQIC1ESEFWRV9URVJNQ0FQX0gKKyMgICBMSUJURVJNQ0FQID0gLWxuY3Vyc2VzCisKK2VuZGlmCitpZmVxICgkKFVOQU1FKSxJUklYKQorICAgQ0MgPSBjYworICAgQ0NfT1BUUyA9IC1PMyAtd29mZiBhbGwKK2VuZGlmCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wYXEgQWxwaGEgcnVubmluZyBEZWMgVW5peCAoT1NGKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKCQoVU5BTUUpLE9TRjEpCisgICBDQyA9IGNjCisgICBDQ19PUFRTID0gLWZhc3QgLU8zIC1zdGQgLWczIC1ub25fc2hhcmVkCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZU9TCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZlcSAoJChVTkFNRSksQmVPUykKKyAgIENDID0gJChCRV9DX0NPTVBJTEVSKQorICAgTElCUyA9CitpZmVxICgkKEFSQ0gpLEJlUEMpCisgICBDQ19PUFRTID0gLU85IC1mb21pdC1mcmFtZS1wb2ludGVyIC1tYXJjaD1wZW50aXVtIFwKKyAgIC1tY3B1PXBlbnRpdW0gLWZmYXN0LW1hdGggLWZ1bnJvbGwtbG9vcHMgXAorICAgLWZwcm9maWxlLWFyY3MgLWZicmFuY2gtcHJvYmFiaWxpdGllcworZWxzZQorICAgQ0NfT1BUUyA9IC1vcHQgYWxsCisgICBNQUtFREVQID0gLW1ha2UKK2VuZGlmCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTU9TWFMgKFJoYXBzb2R5IFBQQykKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZlcSAoJChVTkFNRSksUmhhcHNvZHkpCisgICBDQyA9IGNjCisgICBMSUJTID0KKyAgIENDX09QVFMgPSAtTzkgLWZmYXN0LW1hdGggLWZ1bnJvbGwtbG9vcHMgLWZvbWl0LWZyYW1lLXBvaW50ZXIKKyAgIE1BS0VERVAgPSAtbWFrZQorCitlbmRpZgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT1MvMgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUHJvcGVybHkgaW5zdGFsbGVkIEVNWCBydW50aW1lICYgZGV2ZWxvcG1lbnQgcGFja2FnZSBpcyBhIHByZXJlcXVpc2l0ZS4KKyMgdG9vbHMgSSB1c2VkOiBtYWtlIDMuNzYuMSwgdW5hbWUgMS4xMiwgc2VkIDIuMDUsIFBELWtzaCA1LjIuMTMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKFVOQU1FKSxPUy8yKQorICAgU0hFTEw9c2gKKyAgIENDID0gZ2NjCisgICBDQ19PUFRTID0gLU8zIC1EX19PUzJfXworICAgUEdNID0gbGFtZS5leGUKKyAgIExJQlMgPQorICAgUkFOTElCID0gdG91Y2gKKworIyBJIHVzZSB0aGUgZm9sbG93aW5nIGZvciBzbGlnaHRseSBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gbXkgUGVudGl1bS1JSQorIyB1c2luZyBwZ2NjLTIuOTEuNjY6CisjICAgQ0NfT1BUUyA9IC1PNiAtZmZhc3QtbWF0aCAtZnVucm9sbC1sb29wcyAtbXBlbnRpdW1wcm8gLW1hcmNoPXBlbnRpdW1wcm8gLURfX09TMl9fCisjIGZvciB0aGUgdW5mb3J0dW5hdGVzIHdpdGggYSByZWd1bGFyIHBlbnRpdW0gKHVzaW5nIHBnY2MpOgorIyBDQ19PUFRTID0gLU82IC1mZmFzdC1tYXRoIC1mdW5yb2xsLWxvb3BzIC1tcGVudGl1bSAtbWFyY2g9cGVudGl1bSAtRF9fT1MyX18KKworIyBDb21tZW50IG91dCBuZXh0IDIgbGluZXMgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIFZCUiBoaXN0b2dyYW0gY2FwYWJpbGl0eQorICAgQlJISVNUX1NXSVRDSCA9IC1EQlJISVNUIC1ESEFWRV9URVJNQ0FQIC1ESEFWRV97TkNVUlNFU199VEVSTUNBUF9ICisgICBMSUJURVJNQ0FQID0gLWxuY3Vyc2VzCisKKyMgVW5jb21tZW50ICYgaW5zcGVjdCB0aGUgMiBHVEsgbGluZXMgdG8gdXNlIE1QM3ggR1RLIGZyYW1lIGFuYWx5emVyLgorIyBQcm9wZXJseSBpbnN0YWxsZWQgWEZyZWU4Ni9kZXZsaWJzICYgR1RLKyBpcyBhIHByZXJlcXVpc2l0ZS4KKyMgVGhlIGZvbGxvd2luZyB3b3JrcyBmb3IgbWUgdXNpbmcgWGZyZWU4Ni9PUzIgMy4zLjUgYW5kIEdUSysgMS4yLjM6CisjICAgR1RLID0gLURIQVZFX0dUSyAtSUM6L1hGcmVlODYvaW5jbHVkZS9ndGsxMiAtWm10IC1EX19TVF9NVF9FUlJOT19fIC1JQzovWEZyZWU4Ni9pbmNsdWRlL2dsaWIxMiAtSUM6L1hGcmVlODYvaW5jbHVkZQorIyAgIEdUS0xJQlMgPSAtTEM6L1hGcmVlODYvbGliIC1abXRkIC1ac3lzdi1zaWduYWxzIC1aYmluLWZpbGVzIC1sZ3RrMTIgLWxnZGsxMiAtbGdtb2R1bGUgLWxnbGliMTIgLWxYZXh0IC1sWDExIC1sc2htIC1sYnNkIC1sc29ja2V0IC1sbQorZW5kaWYKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNU0RPUy9XaW5kb3dzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKCQoVU5BTUUpLE1TRE9TKQorICBSTSA9CisgIENDX09QVFMgPSBcCisgICAgICAgLVdhbGwgLXBpcGUgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mZmFzdC1tYXRoIC1mdW5yb2xsLWxvb3BzIFwKKyAgICAgICAtZnNjaGVkdWxlLWluc25zMiAtZm1vdmUtYWxsLW1vdmFibGVzIC1mcmVkdWNlLWFsbC1naXZzICAgICAgICAgXAorICAgICAgIC1tY3B1PXBlbnRpdW0gLW1hcmNoPXBlbnRpdW0gLW1mYW5jeS1tYXRoLTM4NworICBDQ19PUFRTICs9IC1EX2NkZWNsPV9fY2RlY2wKKyAgUEdNID0gbGFtZS5leGUKK2VuZGlmCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQW1pZ2FPUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFR5cGUgJ01ha2UgQVJDSD1QUEMnIGZvciBQb3dlclVQIGFuZCAnTWFrZSBBUkNIPVdPUycgZm9yIFdhcnBPUworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKFVOQU1FKSxBbWlnYU9TKQorCUNDID0gZ2NjIC1ub2l4ZW11bAorCUNDX09QVFMgPSAtTzMgLWZmYXN0LW1hdGggLWZ1bnJvbGwtbG9vcHMgLW02ODAyMC02MCAtbTY4ODgxCisJQlJISVNUX1NXSVRDSCA9IC1EQlJISVNUCisJTUFLRURFUCA9IC1NTQorCWlmZXEgKCQoQVJDSCksV09TKQorCQlDQyA9IHBwYy1hbWlnYW9zLWdjYyAtd2FycHVwCisJCUNDX09QVFMgPSAtTzMgLWZmYXN0LW1hdGggLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZ1bnJvbGwtbG9vcHMgXAorCQktbW11bHRpcGxlIC1tY3B1PTYwM2UKKwkJQVIgPSBwcGMtYW1pZ2Fvcy1hcgorCQlSQU5MSUIgPSBwcGMtYW1pZ2Fvcy1yYW5saWIKKwkJTElCUyA9CisJZW5kaWYKKwlpZmVxICgkKEFSQ0gpLFBQQykKKwkJQ0MgPSBwcGMtYW1pZ2Fvcy1nY2MKKwkJQ0NfT1BUUyA9IC1PMyAtZmZhc3QtbWF0aCAtZm9taXQtZnJhbWUtcG9pbnRlciAtZnVucm9sbC1sb29wcyBcCisJCS1tbXVsdGlwbGUgLW1jcHU9NjAzZQorCQlBUiA9IHBwYy1hbWlnYW9zLWFyCisJCVJBTkxJQiA9IHBwYy1hbWlnYW9zLXJhbmxpYgorCQlMSUJTID0KKwllbmRpZgorZW5kaWYKKworCisjIDEwLzk5IGFkZGVkIC1EX19OT19NQVRIX0lOTElORVMgdG8gZml4IGEgYnVnIGluICphbGwqIHZlcnNpb25zIG9mCisjIGdjYyAyLjgrIGFzIG9mIDEwLzk5LgorCitpZmVxICgkKEhBVkVfTkVXRVJfR0xJQkMpLFlFUykKK0NDX1NXSVRDSEVTID0KK2Vsc2UKK0NDX1NXSVRDSEVTID0gLURfX05PX01BVEhfSU5MSU5FUyAgIyBvbmx5IG5lZWRlZCBieSBzb21lIG9sZGVyIGdsaWJjCitlbmRpZgorCitDQ19TV0lUQ0hFUyArPSAtRE5ERUJVRyAkKENDX09QVFMpICQoU05ETElCKSAkKEJSSElTVF9TV0lUQ0gpCitmcm9udGVuZF9zb3VyY2VzID0gXAorCWZyb250ZW5kL2FtaWdhX21wZWdhLmMgXAorICAgICAgICBmcm9udGVuZC9icmhpc3QuYyBcCisJZnJvbnRlbmQvZ2V0X2F1ZGlvLmMgXAorICAgICAgICBmcm9udGVuZC9sYW1ldGltZS5jIFwKKyAgICAgICAgZnJvbnRlbmQvcGFyc2UuYyBcCisJZnJvbnRlbmQvcG9ydGFibGVpby5jIFwKKwlmcm9udGVuZC90aW1lc3RhdHVzLmMgXAorCWZyb250ZW5kL2NvbnNvbGUuYyBcCisKK2xpYl9zb3VyY2VzID0gXAorCWxpYm1wM2xhbWUvYml0c3RyZWFtLmMgXAorCWxpYm1wM2xhbWUvZW5jb2Rlci5jIFwKKwlsaWJtcDNsYW1lL2ZmdC5jIFwKKwlsaWJtcDNsYW1lL2dhaW5fYW5hbHlzaXMuYyBcCisgICAgICAgIGxpYm1wM2xhbWUvaWQzdGFnLmMgXAorICAgICAgICBsaWJtcDNsYW1lL2xhbWUuYyBcCisgICAgICAgIGxpYm1wM2xhbWUvbmV3bWRjdC5jIFwKKwlsaWJtcDNsYW1lL3BzeW1vZGVsLmMgXAorCWxpYm1wM2xhbWUvcXVhbnRpemUuYyBcCisJbGlibXAzbGFtZS9xdWFudGl6ZV9wdnQuYyBcCisgICAgICAgIGxpYm1wM2xhbWUvc2V0X2dldC5jIFwKKwlsaWJtcDNsYW1lL3ZicnF1YW50aXplLmMgXAorCWxpYm1wM2xhbWUvcmVzZXJ2b2lyLmMgXAorCWxpYm1wM2xhbWUvdGFibGVzLmMgXAorCWxpYm1wM2xhbWUvdGFrZWhpcm8uYyBcCisJbGlibXAzbGFtZS91dGlsLmMgXAorCWxpYm1wM2xhbWUvbXBnbGliX2ludGVyZmFjZS5jIFwKKyAgICAgICAgbGlibXAzbGFtZS9WYnJUYWcuYyBcCisgICAgICAgIGxpYm1wM2xhbWUvdmVyc2lvbi5jIFwKKyAgICAgICAgbGlibXAzbGFtZS9wcmVzZXRzLmMgXAorICAgICAgICBsaWJtcDNsYW1lL3ZlY3Rvci94bW1fcXVhbnRpemVfc3ViLmMgXAorICAgICAgICBtcGdsaWIvY29tbW9uLmMgXAorICAgICAgICBtcGdsaWIvZGN0NjRfaTM4Ni5jIFwKKyAgICAgICAgbXBnbGliL2RlY29kZV9pMzg2LmMgXAorICAgICAgICBtcGdsaWIvbGF5ZXIxLmMgXAorICAgICAgICBtcGdsaWIvbGF5ZXIyLmMgXAorICAgICAgICBtcGdsaWIvbGF5ZXIzLmMgXAorICAgICAgICBtcGdsaWIvdGFiaW5pdC5jIFwKKyAgICAgICAgbXBnbGliL2ludGVyZmFjZS5jCisKKworI2lmZXEgKCQoVU5BTUUpLE1TRE9TKQorIyAgZnJvbnRlbmRfc291cmNlcyA6PSAkKHN1YnN0IC8sXCwkKGZyb250ZW5kX3NvdXJjZXMpKQorIyAgbGliX3NvdXJjZXMgOj0gJChzdWJzdCAvLFwsJChsaWJfc291cmNlcykpCisjZW5kaWYKKworZnJvbnRlbmRfb2JqID0gJChmcm9udGVuZF9zb3VyY2VzOi5jPS5vKQorbGliX29iaiA9ICQobGliX3NvdXJjZXM6LmM9Lm8pCisKK0RFUCA9ICQoZnJvbnRlbmRfc291cmNlczouYz0uZCkgJChsaWJfc291cmNlczouYz0uZCApCisKK2d0a19zb3VyY2VzID0gZnJvbnRlbmQvZ3RrYW5hbC5jIGZyb250ZW5kL2dwa3Bsb3R0aW5nLmMgZnJvbnRlbmQvbXAzeC5jCitndGtfb2JqID0gJChndGtfc291cmNlczouYz0uZ3RrLm8pCitndGtfZGVwID0gJChndGtfc291cmNlczouYz0uZCkKKworCisKK05BU00gPSBuYXNtCitBU0ZMQUdTPS1mIGVsZiAtaSBsaWJtcDNsYW1lL2kzODYvCisKKyMgZm9yIHBlb3BsZSB3aXRoIG5hc213CitpZmVxICgkKFVOQU1FKSxNU0RPUykKKyBOQVNNID0gbmFzbXcKKyBBU0ZMQUdTPS1mIHdpbjMyIC1EV0lOMzIgLWkgbGlibXAzbGFtZS9pMzg2LworZW5kaWYKKworJS5vOiAlLm5hcworCSQoTkFTTSkgJChBU0ZMQUdTKSAkPCAtbyAkQAorJS5vOiAlLnMKKwlnY2MgLWMgJDwgLW8gJEAKKworCisjSEFWRV9OQVNNID0gWUVTCisKK2lmZXEgKCQoSEFWRV9OQVNNKSxZRVMpCisjIyBoYXZlIE5BU00KK0NDX1NXSVRDSEVTICs9IC1ESEFWRV9OQVNNCitsaWJfb2JqICs9IGxpYm1wM2xhbWUvaTM4Ni9jcHVfZmVhdC5vCisKKyMjIHVzZSBNTVggZXh0ZW5zaW9uLiB5b3UgbmVlZCBuYXNtIGFuZCBNTVggc3VwcG9ydGVkIENQVS4KK0NDX1NXSVRDSEVTICs9IC1ETU1YX2Nob29zZV90YWJsZQorbGliX29iaiArPSBsaWJtcDNsYW1lL2kzODYvY2hvb3NlX3RhYmxlLm8KKworIyMgdXNlIDNETm93ISBleHRlbnNpb24uIHlvdSBuZWVkIG5hc20gYW5kIDNETm93ISBzdXBwb3J0ZWQgQ1BVLgorbGliX29iaiArPSBsaWJtcDNsYW1lL2kzODYvZmZ0M2RuLm8KKworIyMgdXNlIFNTRSBleHRlbnNpb24uIHlvdSBuZWVkIG5hc20gYW5kIFNTRSBzdXBwb3J0ZWQgQ1BVLgorbGliX29iaiArPSBsaWJtcDNsYW1lL2kzODYvZmZ0c3NlLm8KKworIyMgbm90IHlldCBjb2RlZAorI0NDX1NXSVRDSEVTICs9IC1EVVNFX0ZGVEZQVQorI2xpYl9vYmogKz0gbGlibXAzbGFtZS9pMzg2L2ZmdGZwdS5vCitlbmRpZgorCisKKworIworIyBNYWtlZmlsZSBydWxlcy0tLXlvdSBwcm9iYWJseSB3b24ndCBoYXZlIHRvIG1vZGlmeSBiZWxvdyB0aGlzIGxpbmUKKyMKKyUubzogJS5jCisJJChDQykgJChDUFBfT1BUUykgJChDQ19TV0lUQ0hFUykgLWMgJDwgLW8gJEAKKworJS5kOiAlLmMKKyAgaWZlcSAoJChOT1VOSVhDTUQpLFlFUykKKwkkKENDKSAkKE1BS0VERVApICAkKENQUF9PUFRTKSAkKENDX1NXSVRDSEVTKSAgJDwgPiAkQAorICBlbHNlCisJJChTSEVMTCkgLWVjICckKENDKSAkKE1BS0VERVApICAkKENQUF9PUFRTKSAkKENDX1NXSVRDSEVTKSAgJDwgfCBzZWQgJ1wnJ3M7JCoubzsmICRAO2cnXCcnID4gJEAnCisgIGVuZGlmCisKKyUuZ3RrLm86ICUuYworCSQoQ0MpICQoQ1BQX09QVFMpICQoQ0NfU1dJVENIRVMpICQoR1RLKSAtYyAkPCAtbyAkQAorCithbGw6IGZyb250ZW5kLyQoUEdNKQorCisKKyQobGliX3NvdXJjZXMpICQoZnJvbnRlbmRfc291cmNlcykgJChndGtfc291cmNlcykgOiBjb25maWcuaAorCitjb25maWcuaDogY29uZmlnTVMuaAorICBpZmVxICgkKE5PVU5JWENNRCksWUVTKQorCWNvcHkgY29uZmlnTVMuaCBjb25maWcuaAorICBlbHNlCisJY3AgY29uZmlnTVMuaCBjb25maWcuaAorICBlbmRpZgorCitmcm9udGVuZC8kKFBHTSk6CWZyb250ZW5kL21haW4ubyAkKGZyb250ZW5kX29iaikgICQoTVAzTElCKQorCSQoQ0MpICQoQ0NfT1BUUykgLW8gZnJvbnRlbmQvJChQR00pICBmcm9udGVuZC9tYWluLm8gJChmcm9udGVuZF9vYmopIFwKKyAgICAgICAgJChNUDNMSUIpICQoTElCUykgJChMSUJTTkRGSUxFKSAkKExJQlRFUk1DQVApCisKK21wM3g6ICAgJChmcm9udGVuZF9vYmopICQoZ3RrX29iaikgJChNUDNMSUIpCisJJChDQykgJChDQ19PUFRTKSAtbyBmcm9udGVuZC9tcDN4ICQoZnJvbnRlbmRfb2JqKSAkKGd0a19vYmopIFwKKyAgICAgICAgJChNUDNMSUIpICQoTElCUykgJChMSUJTTkRGSUxFKSAkKExJQlRFUk1DQVApICQoR1RLTElCUykgCisKK21wM3J0cDoJZnJvbnRlbmQvcnRwLm8gZnJvbnRlbmQvbXAzcnRwLm8gICQoZnJvbnRlbmRfb2JqKSAkKE1QM0xJQikKKwkkKENDKSAkKENDX09QVFMpIC1vIGZyb250ZW5kL21wM3J0cCBmcm9udGVuZC9tcDNydHAubyBmcm9udGVuZC9ydHAubyAkKGZyb250ZW5kX29iaikgJChNUDNMSUIpIFwKKyAgICAgICAgJChMSUJTKSAkKExJQlNOREZJTEUpICQoTElCVEVSTUNBUCkKKworbGlibXAzbGFtZS9saWJtcDNsYW1lLmE6ICAkKGxpYl9vYmopCisJZWNobyAkKGxpYl9vYmopCisJJChBUikgY3IgbGlibXAzbGFtZS9saWJtcDNsYW1lLmEgICQobGliX29iaikKKwkkKFJBTkxJQikgbGlibXAzbGFtZS9saWJtcDNsYW1lLmEKKworI3NoYXJlZCBsaWJyYXJ5LiAgR05VIHNwZWNpZmljPworbGlibXAzbGFtZS9saWJtcDNsYW1lLnNvOiAgJChsaWJfb2JqKQorCWdjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYm1wM2xhbWUvbGlibXAzbGFtZS5zbyAtbyBsaWJtcDNsYW1lL2xpYm1wM2xhbWUuc28gJChsaWJfb2JqKQorCitpbnN0YWxsOiAgZnJvbnRlbmQvJChQR00pICNsaWJtcDNsYW1lLmEKKwljcCBmcm9udGVuZC8kKFBHTSkgL3Vzci9iaW4KKwkjY3AgbGlibXAzbGFtZS5hIC91c3IvbGliCisJI2NwIGxhbWUuaCAvdXNyL2xpYgorCitjbGVhbjoKKyAgaWZlcSAoJChVTkFNRSksTVNET1MpCisJLWRlbCAkKHN1YnN0IC8sXCwkKGZyb250ZW5kX29iaikpCisJLWRlbCAkKHN1YnN0IC8sXCwkKGxpYl9vYmopKQorCS1kZWwgJChzdWJzdCAvLFwsJChndGtfb2JqKSkKKwktZGVsICQoc3Vic3QgLyxcLCQoREVQKSkKKwktZGVsIGZyb250ZW5kXCQoUEdNKQorCS1kZWwgZnJvbnRlbmRcbWFpbi5vCisJLWRlbCBsaWJtcDNsYW1lXGxpYm1wM2xhbWUuYQorICBlbHNlCisJLSQoUk0pICQoZ3RrX29iaikgJChmcm9udGVuZF9vYmopICQobGliX29iaikgJChERVApIGZyb250ZW5kLyQoUEdNKSBcCisgICAgICAgICAgZnJvbnRlbmQvbWFpbi5vIGZyb250ZW5kL2xhbWUgbGlibXAzbGFtZS9saWJtcDNsYW1lLmEgXAorICAgICAgICAgIGZyb250ZW5kL21wM3gubyBmcm9udGVuZC9tcDN4CisgIGVuZGlmCisKKwordGFnczogVEFHUworCitUQUdTOiAke2Nfc291cmNlc30KKwlldGFncyAtVCAke2Nfc291cmNlc30KKworaWZuZXEgKCQoTUFLRUNNREdPQUxTKSxjbGVhbikKKyAgLWluY2x1ZGUgJChERVApCitlbmRpZgorCisKKyMKKyMgIHRlc3RjYXNlLm1wMyBpcyBhIDI5MjYgYnl0ZSBmaWxlLiAgVGhlIGZpcnN0IG51bWJlciBvdXRwdXQgYnkKKyMgIHdjIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggZGlmZmVyIGJldHdlZW4gbmV3IG91dHB1dAorIyAgYW5kICdvZmZpY2lhbCcgcmVzdWx0cy4KKyMKKyMgIEJlY2F1c2Ugb2YgY29tcGlsZXIgb3B0aW9ucyBhbmQgZWZmZWN0cyBvZiByb3VuZG9mZiwgdGhlCisjICBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBtYXkgbm90IGJlIHplcm8sIGJ1dAorIyAgc2hvdWxkIGJlIGF0IG1vc3QgMzAuCisjCit0ZXN0OiBmcm9udGVuZC8kKFBHTSkKKwlmcm9udGVuZC8kKFBHTSkgIC0tbm9yZXMgdGVzdGNhc2Uud2F2IHRlc3RjYXNlLm5ldy5tcDMKKwljbXAgLWwgdGVzdGNhc2UubmV3Lm1wMyB0ZXN0Y2FzZS5tcDMgfCB3YyAtbApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTdlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSw0MyBAQAorICAgICAgICAgICAgICAgICAgICAgIExBTUUgMy54eCAgIAorICAgICAgICAgICAgICAgTEFNRSBBaW4ndCBhbiBNUDMgRW5jb2RlcgorICAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm1wM2Rldi5vcmcKKwkgICAgICAgICAgICAgTWFyY2ggMjAwMQorCitPcmlnaW5hbGx5IGRldmVsb3BlZCBieSBNaWtlIENoZW5nICh3d3cudXEubmV0LmF1L356em1jaGVuZykuICBOb3cgCittYWludGFpbmVkIGJ5IE1hcmsgVGF5bG9yICh3d3cubXAzZGV2Lm9yZykuCisKK1RoaXMgY29kZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIExFU1NFUiBQVUJMSUMgTElDRU5TRQorKExHUEwsIHNlZSB3d3cuZ251Lm9yZykgd2l0aCB0aGUgZm9sbG93aW5nIG1vZGlmaWNhdGlvbjoKKworMS4gSWYgeW91IGRldGVybWluZSB0aGF0IGRpc3RyaWJ1dGlvbiBvZiBMQU1FIHJlcXVpcmVzIGEgcGF0ZW50IGxpY2Vuc2UsCisgICBhbmQgeW91IG9idGFpbiBhIHBhdGVudCBsaWNlbnNlLCB5b3UgbWF5IGRpc3RyaWJ1dGUgTEFNRSBldmVuIHRob3VnaAorICAgcmVkaXN0cmlidXRpb24gb2YgTEFNRSBtYXkgYWxzbyByZXF1aXJlIGEgcGF0ZW50IGxpY2Vuc2UuICAKKworMi4gWW91IGFncmVlIG5vdCB0byBlbmZvcmNlIGFueSBwYXRlbnQgY2xhaW1zIGZvciBhbnkgYXNwZWN0IG9mCisgICBNUEVHIGF1ZGlvIGNvbXByZXNzaW9uLCBvciBhbnkgb3RoZXIgdGVjaG5pcXVlcyBjb250YWluZWQgaW4gCisgICB0aGUgTEFNRSBzb3VyY2UgY29kZS4gCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzZWUgdGhlIGZpbGUgIklOU1RBTEwiIGZvciBpbnN0YWxsYXRpb24gKGNvbXBpbGluZykgaW5zdHJ1Y3Rpb25zLiAgCitzZWUgdGhlIGZpbGUgIlVTQUdFIiBmb3IgdGhlIG1vc3QgdXAtdG8tZGF0ZSBndWlkZSB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCitzZWUgdGhlIGZpbGUgIkxJQ0VOU0UiIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgTEFNRSBpbiBub24tR1BMIHByb2dyYW1zLgorc2VlIHRoZSBmaWxlICJIQUNLSU5HIiBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd29ya2luZyBvbiBMQU1FCitzZWUgdGhlIGZpbGUgIkFQSSIgZm9yIGRldGFpbHMgb2YgdGhlIExBTUUgZW5jb2RpbmcgbGlicmFyeSBBUEkKKworVGhlcmUgaXMgSFRNTCBkb2N1bWVudGF0aW9uIGFuZCBhIG1hbiBwYWdlIGluIHRoZSBkb2MgZGlyZWN0b3J5LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xBTUUgdXNlcyB0aGUgTVBHTElCIGRlY29kaW5nIGVuZ2luZSwgZnJvbSB0aGUgTVBHMTIzIHBhY2thZ2UsIHdyaXR0ZW4KK2J5OiBNaWNoYWVsIEhpcHAgKHd3dy5tcGcxMjMuZGUpIE1QR0xJQiBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorCitDb3B5cmlnaHRzIChjKSAxOTk5LTEwMDcgYnkgVGhlIExBTUUgUHJvamVjdAorQ29weXJpZ2h0cyAoYykgMTk5OSwyMDAwLDIwMDEgYnkgTWFyayBUYXlsb3IKK0NvcHlyaWdodHMgKGMpIDE5OTksMjAwMCwyMDAxIGJ5IE1hcmsgVGF5bG9yCitDb3B5cmlnaHRzIChjKSAxOTk4IGJ5IE1pY2hhZWwgQ2hlbmcKK0NvcHlyaWdodHMgKGMpIDE5OTUsMTk5NiwxOTk3IGJ5IE1pY2hhZWwgSGlwcDogbXBnbGliCisKK0FzIHdlbGwgYXMgYWRkaXRpb25hbCBjb3B5cmlnaHRzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHNvdXJjZSBjb2RlLiAgCisKZGlmZiAtLWdpdCBhL1JFQURNRS5XSU5HVEsgYi9SRUFETUUuV0lOR1RLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzFjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuV0lOR1RLCkBAIC0wLDAgKzEsNjcgQEAKKyAgICAgICAgICAgIEluc3RhbGxhdGlvbiBub3RlcyBvbiBNUDNYICh0aGUgTEFNRSBmcmFtZSBhbmFseXplcikgZm9yIFdJTjMyCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRG9jdW1lbnQgSGlzdG9yeToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbml0aWFsIHZlcnNpb24gYnkgQWxiZXJ0IEZhYmVyLCBNYXJjaCAzMCwgMjAwMAorCitVcGRhdGUgYnkgQWxiZXJ0IEZhYmVyIChTZXB0IDA3IDIwMDApLCBjaGFuZ2VkIGluc3RydWN0aW9ucwordG8gY29tcGlsZSB3aXRoIGxhdGVzdCBnbGliL2d0ayBsaWJyYXJpZXMuCisKK1VwZGF0ZSBieSBBbGJlcnQgRmFiZXIgKFNlcHQgMDcgMjAwMCksIGNoYW5nZWQgaW5zdHJ1Y3Rpb25zCit0byBjb21waWxlIHdpdGggbGF0ZXN0IGdsaWIvZ3RrIGxpYnJhcmllcy4KKworVXBkYXRlIGJ5IEFsYmVydCBGYWJlciAoT2N0IDIwIDIwMDApLCBzbWFsbCBhZGFwdGlvbnMgdG8gYmUgY29uZm9ybQordGhlIG5ldyBsYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisKK1VwZGF0ZSBieSBHYWJyaWVsIEJvdXZpZ25lIChKYW4gMDcgMjAwNCksIGNoYW5nZXMgdG8gYmUgY29uZm9ybSB0byB0aGUKK1ZDNiB3b3JzcGFjZSBzdHJ1Y3R1cmUuCisKK1VwZGF0ZSBieSBHYWJyaWVsIEJvdXZpZ25lIChOb3YgMTEgMjAwNiksIGNoYW5nZXMgdG8gYmUgY29uZm9ybSB0byB0aGUKK1ZDOCB3b3JzcGFjZSBzdHJ1Y3R1cmUuIFRlc3RlZCB3aXRoIGd0aystZGV2LTEuMy4wLTIwMDMwMTE1IGFuZCBnbGliLWRldi0yLjEyLjQKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0hvdyB0byBjb21waWxlIHRoZSBNUDMgZnJhbWUgYW5hbHl6ZXIgKE1QM3gpOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBmaXJzdCBuZWVkIHRvIGdldCBob2xkIG9mIHRoZSBsYXRlc3QgR1RLIGFuZCBHTElCIGluY2x1ZGUgZmlsZXMgYW5kIGxpYgorZmlsZXMuIFlvdSBjYW4gZG93bmxvYWQgdGhlbSBmcmVlbHkgZnJvbSB0aGUgV0lOR1RLIHByb2plY3QgV0VCIHNpdGUuCisoc2VlIGh0dHA6Ly93d3cuZ3RrLm9yZywgYW5kIGNsaWNrIG9uIHRoZSBXSU5HVEsgbGluay4pCisKK0Rvd25sb2FkOiAgZ2xpYi1kZXYtVkVSU0lPTi56aXAsIGd0aystZGV2LVZFUlNJT04uemlwIGFuZCBleHRyYWxpYnMtZGV2LVZFUlNJT04uemlwCit3aGVyZSBWRVJTSU9OIGluZGljYXRlcyB0aGUgcmVsZWFzZSBkYXRhLCBzbyBpdCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgMjAwMDA4MDUKKwordW56aXAgYWxsIHRocmVlIHppcCBmaWxlcyBpbiBhIFdpbkdUSyBzdWJkaXJlY3RvcnksIHdoaWNoIGlzIGNyZWF0ZWQgZnJvbSB0aGUgbGFtZQorYW5hbHl6ZXIgZGlyZWN0b3J5IChmb3IgZXhhbXBsZSwgRDpcQ1ZTXGxhbWVcV2luR3RrKQorCitZb3Ugd2lsbCBlbmQgdXAgd2l0aCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSB0cmVlCisgIEQ6XENWU1xsYW1lXGFuYWx5emVyXFdpbkd0a1xzcmNcZ2xpYgorICBEOlxDVlNcbGFtZVxhbmFseXplclxXaW5HdGtcc3JjXGd0aytcZ2xpYgorICBEOlxDVlNcbGFtZVxhbmFseXplclxXaW5HdGtcc3JjXGd0aysKKworU2V0IE1wM3ggYXMgeW91ciBjdXJyZW50IGFjdGl2ZSBwcm9qZWN0LCByZWNvbXBpbGUgZXZlcnl0aGluZywgYW5kIHlvdSdyZSBkb25lLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIHJ1biBhbmQgdXNlIHRoZSBNUDMgRnJhbWUgYW5hbHl6ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUbyBydW4gTVAzeC5leGUsIHlvdSBuZWVkCit0aGUgR1RLIERMTCBmaWxlczogIEVpdGhlciBpbnN0YWwgdGhlbSBvbiB5b3VyIHN5c3RlbSwKK29yIHB1dCB0aGVtIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBtcDN4LmV4ZSByZXNpZGVzLgorCisKKworRXhhbXBsZToKK21wM3guZXhlIG15ZmlsZQorCitteWZpbGUgY2FuIGJlIGEgbXAzIGZpbGUsIG9yIGEgd2F2IGZpbGUuCisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBFbmQgb2YgRG9jdW1lbnQgPT09CisKKworCmRpZmYgLS1naXQgYS9TVFlMRUdVSURFIGIvU1RZTEVHVUlERQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTU1ZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvU1RZTEVHVUlERQpAQCAtMCwwICsxLDE4NyBAQAorKiBUaGUgTEFNRSBBUEkgaXMgZnJvemVuLiAgUG9vcmx5IGRlc2lnbmVkIGFzIGl0IGlzLCBkb24ndCBjaGFuZ2UgaXQsIAorICBhbmQgYWRkIHRvIGl0IHNwYXJpbmdseS4KKworKiBEb24ndCB0YWtlIGl0IHVwb24geW91cnNlbGYgdG8gZ28gdGhyb3VnaCBMQU1FIHdpdGggdGhlIHNvbGUgcHVycG9zZQorICBvZiB1cGRhdGluZyBldmVyeXRoaW5nIHRvIG1hdGNoIHRoaXMgZ3VpZGUuICBFc3BlY2lhbGx5IGltcG9ydGFudDoKKyAgZG9uJ3QgY2hhbmdlIHRoZSBzcGFjaW5nLCBpbmRlbnRhdGlvbiwgY3VybHkgYnJhY2VzLCBldGMsIAorICBpbiByb3V0aW5lcyB5b3UgZGlkIG5vdCB3cml0ZS4KKworKiBJZiB5b3Ugd2FudCB0byBtYWtlIGEgY2hhbmdlIHdoaWNoIGVmZmVjdHMgbWFueSBtYW55IGZ1bmN0aW9ucywKKyAgcGxlYXNlIGNoZWNrIHdpdGggdGhlIG1haW50YWluZXIgZmlyc3QuCisKKyogUmVzcGVjdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGF1dGhvciBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCisgIElmIHRoZSBpbmRlbnRhdGlvbiBpcyBub3QgY29uc2lzdGVudCwgdXNlIDQuCisKKyogRG9uJ3QgdXNlIHRhYnVsYXRvcnMgKHRoZSBjaGFyYWN0ZXIgd2l0aCB0aGUgdmFsdWUgJ1x0JykgaW4gc291cmNlIGNvZGUsCisgIGVzcGVjaWFsbHkgdGhlc2Ugd2l0aCBhIHdpZHRoIG9mIHVuZXF1YWwgOC4gTGFtZSBzb3VyY2VzIGFyZSB1c2luZworICBkaWZmZXJlbnQgc2l6ZXMgZm9yIHRhYnVsYXRvcnMuCisKKyogRG9uJ3Qgc2V0IHRoZSBtYWNybyBOREVCVUcgaW4gYWxwaGEgdmVyc29ucy4KKyAgTkRFQlVHIHNob3VsZCBiZSBzZXQgZm9yIGJldGEgdmVyc2lvbnMuCisKKyogY2hlY2sgaW1wb3J0YW50IGFzc3VtcHRpb25zIHdpdGggYW4gYXNzZXJ0KCkKKworKiB1c2UgaW50IGZvciBhbGwgaW50ZWdlciBxdWFudGl0aWVzLiAgCisgIExBTUUgcmVxdWlyZXMgMzIgYml0IGludHMsIHNvIHlvdSBjYW4gYXNzdW1lIGludCBpcyBhdCBsZWFzdCAzMiBiaXRzLiAgCisgIERvbid0IHVzZSAnbG9uZycuICBEb24ndCB1c2UgJ3Vuc2lnbmVkJyB1bmxlc3MgQUJTT0xVVEVMWSBuZWNlc3NhcnkuCisgIERvbid0IHVzZSAnY2hhcicganVzdCB0byBzYXZlIGJ5dGVzLiAgSWYgNjQgYml0cyBpcyByZXF1aXJlZCwgdXNlIGludDY0LgorCisgIEFubm5vdGF0aW9uOgorICBJU08gQyBjYWxscyB0aGUgNjQgYml0IGludCB0eXBlIG5vdCBpbnQ2NCBidXQgaW50NjRfdC4KKworKiBBdm9pZCB1c2luZyBmbG9hdCBvciBkb3VibGUsIGFuZCBpbnN0ZWFkIHVzZTogKGRlZmluZWQgaW4gbWFjaGluZS5oKS4gIAorCisgIEZMT0FUICAgIGZvciB2YXJpYWJsZXMgd2hpY2ggcmVxdWlyZSBhdCBsZWFzdCAzMmJpdHMKKyAgRkxPQVQ4ICAgZm9yIHZhcmlhYmxlcyB3aGljaCByZXF1aXJlIGF0IGxlYXN0IDY0Yml0cworCisgIE9uIHNvbWUgbWFjaGluZXMsIDY0Yml0IHdpbGwgYmUgZmFzdGVyIHRoYW4gMzJiaXQuICBBbHNvLCBzb21lIG1hdGgKKyAgcm91dGluZXMgcmVxdWlyZSA2NGJpdCBmbG9hdCwgc28gc2V0dGluZyBGTE9BVD1mbG9hdCB3aWxsIHJlc3VsdCBpbiBhCisgIGxvdCBvZiBjb252ZXJzaW9ucy4KKworICBBbm5vdGF0aW9uIChwZmspOgorICBUaGUgbmV3IElTTyBDIHN0YW5kYXJkIHBhc3NlZCBpbiBhdXR1bW4gMTk5OSBoYXMgZGVmaW5lZCBuZXcgdHlwZXMgZm9yCisgIGV4YWN0bHkgdGhpcyByZWFzb24uIFRoZXJlIGFyZSBjYWxsZWQgZmxvYXRfbGVhc3QzMl90IGFuZCBmbG9hdF9sZWFzdDY0X3QKKyAgYW5kIGhhdmUgYXQgbGVhc3QgdGhlIGFkdmFudGFnZSB0aGF0IHlvdSBub3QgbmVlZCB0byBleHBsYWluIHRoZWlyCisgIG1lYW5pbmcuIAorCisgIEFubm90YXRpb24gKG10KTogIAorICB3ZSB3aWxsIGFkb3B0IHRoaXMgY29udmVudGlvbiBpbiBKYW4gMSwgMjAwMy4KKworCisqIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBQQ00gc2FtcGxlcyBpbiB0eXBlICdzYW1wbGVfdCcsCisgIGN1cnJlbnRseSB0aGlzIGlzIGEgRkxPQVQuCisKKyogVXNlIFNJIGJhc2UgdW5pdHMuIExhbWUgbWl4ZXMgSHosIGtIeiwga2JwcywgYnBzLiBUaGlzIGlzIG1lc3MuCisKKyAgRXhhbXBsZToKKyAgICAgICAgZmxvYXQgICAgIHdhdmVsZW5ndGhfZ3JlZW4gPSA1NTUuZS05OworICAgICAgICB1bnNpZ25lZCAgZGF0YV9yYXRlICAgICAgICA9IDEyODAwMDsKKyAgICAgICAgZmxvYXQgICAgIGxvd3Bhc3NfZnJlcSAgICAgPSAxMjUwMC47CisgIAorICBDb252ZXJ0aW5nIGJldHdlZW4gdXNlciBpbnB1dCBhbmQgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gc2hvdWxkIGJlIGRvbmUKKyAgbmVhciB0aGUgdXNlciBpbnRlcmZhY2UsIG5vdCBpbiB0aGUgbW9zdCBpbm5lciBsb29wIG9mIGFuIHV0aWxpdHkKKyAgZnVuY3Rpb24uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VkaXRlZCB2ZXJzaW9uIG9mIHRoZSBMaW51eCBLZXJuZWwgU3R5bGUgR3VpZGU6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICBDaGFwdGVyIDE6IEluZGVudGF0aW9uCisKK1Jlc3BlY3QgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBhdXRob3Igb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLgorSWYgdGhlIGluZGVudGF0aW9uIGlzIG5vdCBjb25zaXN0ZW50LCBkb24ndCBjaGFuZ2UgaXQuICBJZgoreW91IGFyZSBzbyBhbmFsLXJldGVudGl2ZSBhYm91dCB0aGVzZSB0aGluZ3MgYW5kIHlvdSBjYW4ndAorYmFyZSB0byBldmVuIGxvb2sgYXQgY29kZSB3aXRoIHBvb3IgaW5kZW50YXRpb24sIGNoYW5nZSBpdCB0byA0LgorCisKKyAgICAgICAgICAgICAgICBDaGFwdGVyIDI6IFBsYWNpbmcgQnJhY2VzCisKK1RoZSBvdGhlciBpc3N1ZSB0aGF0IGFsd2F5cyBjb21lcyB1cCBpbiBDIHN0eWxpbmcgaXMgdGhlIHBsYWNlbWVudCBvZgorYnJhY2VzLiAgVW5saWtlIHRoZSBpbmRlbnQgc2l6ZSwgdGhlcmUgYXJlIGZldyB0ZWNobmljYWwgcmVhc29ucyB0bworY2hvb3NlIG9uZSBwbGFjZW1lbnQgc3RyYXRlZ3kgb3ZlciB0aGUgb3RoZXIsIGJ1dCB0aGUgcHJlZmVycmVkIHdheSwgYXMKK3Nob3duIHRvIHVzIGJ5IHRoZSBwcm9waGV0cyBLZXJuaWdoYW4gYW5kIFJpdGNoaWUsIGlzIHRvIHB1dCB0aGUgb3BlbmluZworYnJhY2UgbGFzdCBvbiB0aGUgbGluZSwgYW5kIHB1dCB0aGUgY2xvc2luZyBicmFjZSBmaXJzdCwgdGh1c2x5OgorCisgICAgICAgIGlmICh4IGlzIHRydWUpIHsKKyAgICAgICAgICAgICAgICB3ZSBkbyB5CisgICAgICAgIH0KKworSG93ZXZlciwgdGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSwgbmFtZWx5IGZ1bmN0aW9uczogdGhleSBoYXZlIHRoZQorb3BlbmluZyBicmFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUsIHRodXM6CisKKyAgICAgICAgaW50IGZ1bmN0aW9uKGludCB4KQorICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9keSBvZiBmdW5jdGlvbgorICAgICAgICB9CisKK0hlcmV0aWMgcGVvcGxlIGFsbCBvdmVyIHRoZSB3b3JsZCBoYXZlIGNsYWltZWQgdGhhdCB0aGlzIGluY29uc2lzdGVuY3kKK2lzIC4uLiAgd2VsbCAuLi4gIGluY29uc2lzdGVudCwgYnV0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUga25vdyB0aGF0CisoYSkgSyZSIGFyZSBfcmlnaHRfIGFuZCAoYikgSyZSIGFyZSByaWdodC4gIEJlc2lkZXMsIGZ1bmN0aW9ucyBhcmUKK3NwZWNpYWwgYW55d2F5ICh5b3UgY2FuJ3QgbmVzdCB0aGVtIGluIEMpLiAKKworTm90ZSB0aGF0IHRoZSBjbG9zaW5nIGJyYWNlIGlzIGVtcHR5IG9uIGEgbGluZSBvZiBpdHMgb3duLCBfZXhjZXB0XyBpbgordGhlIGNhc2VzIHdoZXJlIGl0IGlzIGZvbGxvd2VkIGJ5IGEgY29udGludWF0aW9uIG9mIHRoZSBzYW1lIHN0YXRlbWVudCwKK2llIGEgIndoaWxlIiBpbiBhIGRvLXN0YXRlbWVudCBvciBhbiAiZWxzZSIgaW4gYW4gaWYtc3RhdGVtZW50LCBsaWtlCit0aGlzOgorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBib2R5IG9mIGRvLWxvb3AKKyAgICAgICAgfSB3aGlsZSAoY29uZGl0aW9uKTsKKworYW5kCisKKyAgICAgICAgaWYgKHggPT0geSkgeworICAgICAgICAgICAgICAgIC4uCisgICAgICAgIH0gZWxzZSBpZiAoeCA+IHkpIHsKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAuLi4uCisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorUmF0aW9uYWxlOiBLJlIuIAorCitBbHNvLCBub3RlIHRoYXQgdGhpcyBicmFjZS1wbGFjZW1lbnQgYWxzbyBtaW5pbWl6ZXMgdGhlIG51bWJlciBvZiBlbXB0eQorKG9yIGFsbW9zdCBlbXB0eSkgbGluZXMsIHdpdGhvdXQgYW55IGxvc3Mgb2YgcmVhZGFiaWxpdHkuICBUaHVzLCBhcyB0aGUKK3N1cHBseSBvZiBuZXctbGluZXMgb24geW91ciBzY3JlZW4gaXMgbm90IGEgcmVuZXdhYmxlIHJlc291cmNlICh0aGluaworMjUtbGluZSB0ZXJtaW5hbCBzY3JlZW5zIGhlcmUpLCB5b3UgaGF2ZSBtb3JlIGVtcHR5IGxpbmVzIHRvIHB1dAorY29tbWVudHMgb24uIAorCisKKyAgICAgICAgICAgICAgICBDaGFwdGVyIDM6IE5hbWluZworCitDIGlzIGEgU3BhcnRhbiBsYW5ndWFnZSwgYW5kIHNvIHNob3VsZCB5b3VyIG5hbWluZyBiZS4gIFVubGlrZSBNb2R1bGEtMgorYW5kIFBhc2NhbCBwcm9ncmFtbWVycywgQyBwcm9ncmFtbWVycyBkbyBub3QgdXNlIGN1dGUgbmFtZXMgbGlrZQorVGhpc1ZhcmlhYmxlSXNBVGVtcG9yYXJ5Q291bnRlci4gIEEgQyBwcm9ncmFtbWVyIHdvdWxkIGNhbGwgdGhhdAordmFyaWFibGUgInRtcCIsIHdoaWNoIGlzIG11Y2ggZWFzaWVyIHRvIHdyaXRlLCBhbmQgbm90IHRoZSBsZWFzdCBtb3JlCitkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZC4gCisKK0hPV0VWRVIsIHdoaWxlIG1peGVkLWNhc2UgbmFtZXMgYXJlIGZyb3duZWQgdXBvbiwgZGVzY3JpcHRpdmUgbmFtZXMgZm9yCitnbG9iYWwgdmFyaWFibGVzIGFyZSBhIG11c3QuICBUbyBjYWxsIGEgZ2xvYmFsIGZ1bmN0aW9uICJmb28iIGlzIGEKK3Nob290aW5nIG9mZmVuc2UuIAorCitHTE9CQUwgdmFyaWFibGVzICh0byBiZSB1c2VkIG9ubHkgaWYgeW91IF9yZWFsbHlfIG5lZWQgdGhlbSkgbmVlZCB0bworaGF2ZSBkZXNjcmlwdGl2ZSBuYW1lcywgYXMgZG8gZ2xvYmFsIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIGEgZnVuY3Rpb24KK3RoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHVzZXJzLCB5b3Ugc2hvdWxkIGNhbGwgdGhhdAorImNvdW50X2FjdGl2ZV91c2VycygpIiBvciBzaW1pbGFyLCB5b3Ugc2hvdWxkIF9ub3RfIGNhbGwgaXQgImNudHVzcigpIi4gCisKK0VuY29kaW5nIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gaW50byB0aGUgbmFtZSAoc28tY2FsbGVkIEh1bmdhcmlhbgorbm90YXRpb24pIGlzIGJyYWluIGRhbWFnZWQgLSB0aGUgY29tcGlsZXIga25vd3MgdGhlIHR5cGVzIGFueXdheSBhbmQgY2FuCitjaGVjayB0aG9zZSwgYW5kIGl0IG9ubHkgY29uZnVzZXMgdGhlIHByb2dyYW1tZXIuICBObyB3b25kZXIgTWljcm9Tb2Z0CittYWtlcyBidWdneSBwcm9ncmFtcy4gCisKK0xPQ0FMIHZhcmlhYmxlIG5hbWVzIHNob3VsZCBiZSBzaG9ydCwgYW5kIHRvIHRoZSBwb2ludC4gIElmIHlvdSBoYXZlCitzb21lIHJhbmRvbSBpbnRlZ2VyIGxvb3AgY291bnRlciwgaXQgc2hvdWxkIHByb2JhYmx5IGJlIGNhbGxlZCAiaSIuIAorQ2FsbGluZyBpdCAibG9vcF9jb3VudGVyIiBpcyBub24tcHJvZHVjdGl2ZSwgaWYgdGhlcmUgaXMgbm8gY2hhbmNlIG9mIGl0CitiZWluZyBtaXMtdW5kZXJzdG9vZC4gIFNpbWlsYXJseSwgInRtcCIgY2FuIGJlIGp1c3QgYWJvdXQgYW55IHR5cGUgb2YKK3ZhcmlhYmxlIHRoYXQgaXMgdXNlZCB0byBob2xkIGEgdGVtcG9yYXJ5IHZhbHVlLiAKKworCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ2hhcHRlciA0OiBGdW5jdGlvbnMKKworRG9jdW1lbnQgZnVuY3Rpb25zLiAgCisKK0tlZXAgZnVuY3Rpb25zIGFzIG1vZHVsYXIgYXMgcG9zc2libGUuICBCdXQgZG9uJ3QgYWRoZXJlIHRvIGFydGlmaWNpYWwKK2xpbmUgbnVtYmVyIGxpbWl0YXRpb25zLiAgRm9yIGV4YW1wbGUsIGxhbWVfZW5jb2RlX2ZyYW1lKCkgZW5jb2RlcyBhCitzaW5nbGUgTVAzIGZyYW1lIGFuZCBpcyBhIGxvbmcgc2VxdWVuY2Ugb2YgZnVuY3Rpb24gY2FsbHMuICBJdCBtYWtlcworbm8gc2Vuc2UgdG8gYnJlYWsgdGhpcyBpbnRvIHR3byBvciBtb3JlIHJvdXRpbmVzLgorCisKKworICAgICAgICAgICAgICAgIENoYXB0ZXIgNTogQ29tbWVudGluZworCitDb21tZW50cyBhcmUgZ29vZCwgYnV0IHRoZXJlIGlzIGFsc28gYSBkYW5nZXIgb2Ygb3Zlci1jb21tZW50aW5nLiAgTkVWRVIKK3RyeSB0byBleHBsYWluIEhPVyB5b3VyIGNvZGUgd29ya3MgaW4gYSBjb21tZW50OiBpdCdzIG11Y2ggYmV0dGVyIHRvCit3cml0ZSB0aGUgY29kZSBzbyB0aGF0IHRoZSBfd29ya2luZ18gaXMgb2J2aW91cywgYW5kIGl0J3MgYSB3YXN0ZSBvZgordGltZSB0byBleHBsYWluIGJhZGx5IHdyaXR0ZW4gY29kZS4gCisKK0dlbmVyYWxseSwgeW91IHdhbnQgeW91ciBjb21tZW50cyB0byB0ZWxsIFdIQVQgeW91ciBjb2RlIGRvZXMsIG5vdCBIT1cuIAorQWxzbywgdHJ5IHRvIGF2b2lkIHB1dHRpbmcgY29tbWVudHMgaW5zaWRlIGEgZnVuY3Rpb24gYm9keTogaWYgdGhlCitmdW5jdGlvbiBpcyBzbyBjb21wbGV4IHRoYXQgeW91IG5lZWQgdG8gc2VwYXJhdGVseSBjb21tZW50IHBhcnRzIG9mIGl0LAoreW91IHNob3VsZCBwcm9iYWJseSBnbyBiYWNrIHRvIGNoYXB0ZXIgNCBmb3IgYSB3aGlsZS4gIFlvdSBjYW4gbWFrZQorc21hbGwgY29tbWVudHMgdG8gbm90ZSBvciB3YXJuIGFib3V0IHNvbWV0aGluZyBwYXJ0aWN1bGFybHkgY2xldmVyIChvcgordWdseSksIGJ1dCB0cnkgdG8gYXZvaWQgZXhjZXNzLiAgSW5zdGVhZCwgcHV0IHRoZSBjb21tZW50cyBhdCB0aGUgaGVhZAorb2YgdGhlIGZ1bmN0aW9uLCB0ZWxsaW5nIHBlb3BsZSB3aGF0IGl0IGRvZXMsIGFuZCBwb3NzaWJseSBXSFkgaXQgZG9lcworaXQuIAorCisKZGlmZiAtLWdpdCBhL1RPRE8gYi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDk1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9UT0RPCkBAIC0wLDAgKzEsMTYyIEBACisxLiBidWcgaW4gcmVzYW1wbGUgY29kZTogIGRvd25zYW1wbGluZyBmcm9tIDQ0MTAxIHRvIDQ0MTAwIGNhdXNlcworICAgYSBzZWcgZmF1bHQuICBXb3JrYXJvdW5kIGluIHBsYWNlIGZvciBub3c6ICByZXNhbXBsaW5nIGRpc2FibGVkIAorICAgaWYgaW5wdXQvb3V0cHV0IHNhbXBsZXJhdGVzIGFncmVlIHRvIDQgZGlnaXRzLiAgCisKKworCisyLiAgaGlnaCBiaXRyYXRlIGVuY29kaW5ncyBoYXZlIHRyb3VibGUgb24gc29tZSBoYXJkd2FyZSBwbGF5ZXJzLgorVHJhY2sgdGhpcyBkb3duLiAgUHJvYmFibHkgY2F1c2VkIGJ5IC0tc3RyaWN0bHktZW5mb3JjZS1JU08gYW5kCitJWE1BWF9WQUwuICBUcnkgc2V0dGluZyBJWE1BWF9WQUwgYmFjayB0byA4MTkxIGFuZC9vcgorbWF4bXAzYnVmPTgqOTYwIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHdvcmtpbmcgY29tYmluYXRpb24uCisKK25vdGU6IG9uZSBvZiB0aGUgZGVjb2RlciBidWdzIHdhcyBpZGVudGlmaWVkLiBJdCBpcyBjYXVzZWQgYnkgdXNpbmcKK2RpZmZlcmVudCBibG9jayBzaXplcyBvbiBib3RoIGNoYW5uZWxzLiBBIHBhcmFtZXRlciBuZWVkIHRvIGJlCithZGRlZCB0byBMYW1lIHRvIGhhbmRsZSB3b3JrYXJvdW5kcy4KKworCiszIGZyb250ZW5kOiBjb2RlIGlzIGEgY29tcGxldGUgbWVzcy4gQnV0IGl0IGhhcyBzbyBtYW55IGRlYnVnZ2VkCisgIGZlYXR1cmVzIGl0IHdpbGwgYmUgYSBsb3Qgb2Ygd29yayB0byByZS13cml0ZS4KKworCis0LiBNU1ZDIHByb2plY3QgZmlsZXMuICBJdCB3b3VsZCBiZSBuaWNlIHRvIGNyZWF0ZSBhIHdvcmtpbmcKKyAgIE1TVkM2IHdvcmtzcGFjZSwgd2hpY2ggaW5jbHVkZWQgYWxsIHRoZSBwcm9qZWN0cyBhcyBwb3NzaWJsZQorICAgdGFyZ2V0czoKKyAgICAgICAgICBsYW1lLmV4ZQorICAgICAgICAgIG1wM3guZXhlICAgKHJlcXVpcmUgR1RLIGxpYnMpCisgICAgICAgICAgbGFtZV9lbmMuZGxsICAgCisgICAgICAgICAgQUNNIGNvZGVjCisgICAgICAgICAgZGlyZWN0c2hvdyBjb2RlYworCisgICBJIHRoaW5rIHRoZSBvbmx5IE1TVkM1IHByb2plY3QgdGhhdCB3ZSBuZWVkIHRvIHByZXNlcnZlIGlzCisgICBmb3IgbGFtZV9lbmMuZGxsLCBzaW5jZSBBbGJlcnQgRmFiZXIgKHN0aWxsPykgZG9lc24ndCB1c2UgVkM2PworICAgQnV0IG5vIHJlYXNvbiB3ZSBjYW50IGhhdmUgVkM1IGFuZCBWQzYgcHJvamVjdCBmaWxlcyBmb3IgdGhlIGRsbC4KKworICAgCisKKyAgIAorCisKKzUuCitOT0dBUCBlbmNvZGluZzoKKworLW5vZ2FwOiAgbW9yZSB0ZXN0aW5nLCBmaXggb3B0aW9ucywgdGVzdCBpZDMgdGFncz8KK0NhbiB3ZSBjaGFuZ2UgaWQzIHRhZ3Mgd2l0aG91dCByZXNldGluZyB0aGUgZW5jb2Rlcj8/CitBdCB0aGUgZW5kIG9mIGVuY29kaW5nIDEud2F2LCBjYWxsIGxhbWVfZ2V0X21mX3NhbXBsZXNfdG9fZW5jb2RlKCkKK3RvIGZpbmQgdGhlIG51bWJlciBvZiBub24gZW5jb2RlZCBidWZmZXJlZCBQQ00gc2FtcGxlcy4gIFRoZW4KK2VuY29kZSBzYW1wbGVzIGZyb20gMi53YXYgdW50aWwgdGhlc2UgUENNIHNhbXBsZXMgaGF2ZSBiZWVuCitlbmNvZGVkLCAqVEhFTiogY2FsbCBsYW1lX2VuY29kZV9mbHVzaF9ub2dhcCgpIGFuZCBjbG9zZQorb3V0IGZpbGUgMS5tcDMuCisKKworTk9HQVAgZGVjb2Rpbmc6ICAKK2xhbWUgLS1kZWNvZGUgLS1ub2dhcCBmaWxlMS5tcDMgZmlsZTIubXAzIGZpbGUzLm1wMworc2hvdWxkIGFsc28gd29yay4gIFdoYXQgbmVlZHMgdG8gYmUgZG9uZToKK2dldF9hdWRpby5jOiAgV2UgbmVlZCBhIHdheSB0byBvcGVuIGEgc2Vjb25kIG1wMyBmaWxlLCB3aXRob3V0CisgICAgICAgICAgICAgIGNhbGxpbmcgbGFtZV9kZWNvZGVfaW5pdCgpIGFuZCByZWluaXRpYWxpemluZyBtcGdsaWIuCisgICAgICAgICAgICAgIEFuZCB0aGUgbXBnbGliIG5lZWRzIHRvIGtub3cgdG8gbG9vayBmb3IgbmV3IFhpbmcKKyAgICAgICAgICAgICAgdGFncyBhdCB0aGUgYmVnaW5uaW5nIG9mIGZpbGUyLm1wMyBhbmQgZmlsZTMubXAzLgorCisKKworNi4KK0RvZXMgc3RkaW4gd29yayB3aGVuIExBTUUgaXMgY29tcGlsZWQgdG8gdXNlIGxpYnNuZGZpbGU/IAorKG5ldyB2ZXJzaW9uIG9mIGxpYnNuZGZpbGUgd2lsbCBzdXBwb3J0IHRoaXMgLSB0cnkgdGhpcyBvdXQpCisKKworNy4gCitMQU1FIGhhcyBwcm9ibGVtcyB3aXRoIHB1cmUgREMgaW5wdXQuICBpLmUuIGEgc3F1YXJlIHdhdmUgd2l0aAorYSBmcmVxdWVuY3kgd2VsbCBiZWxvdyAyMCBIei4gIE5vdCB2ZXJ5IGltcG9ydGFudCwgYnV0IGl0IHNob3VsZAorYmUgZml4ZWQuCisKKworOC4KK21ncGxpYiBoYXMgYnVncyB3aXRoIGktc3RlcmVvLiAgZmxhZyBkZW5vdGluZyBpbnZhbGlkCitpLXN0ZXJlbyB2YWx1ZSAoPSBmcmFtZSBpcyBtL3Mgc3RlcmVvKSBpcyBub3QgY29ycmVjdC4gIAorCis5LgorbG93cGFzcyBmaWx0ZXI6IGZvciBNL1Mgc3RlcmVvLCB1c2UgbW9yZSBmaWx0ZXJpbmcgZm9yIHRoZSBzaWRlCitjaGFubmVsLCBsZXNzIGZpbHRlcmluZyBmb3IgbWlkIGNoYW5uZWwuICBXZSBuZWVkIHRvIGZpcnN0IHJlcGxhY2UKK3RoZSBwb2x5cGhhc2UgZmlsdGVyIHdpdGggYW4gRklSIGxvd3Bhc3MgZmlsdGVyIHdpdGggZmluZXIgZnJlcXVlbmN5CityZXNvbHV0aW9uIGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy4gCisKKzEwLiAKK0xBTUUgaGFzIGEgMzEgcG9pbnQgRklSIGZpbHRlciB1c2VkIGZvciByZXNhbXBsaW5nLCB3aGljaAorY2FuIGFsc28gYmUgdXNlZCBhcyBhIGxvd3Bhc3MuICBXaGVuIHJlc2FtcGxpbmcgaXMgZG9uZSwgCit1c2UgdGhhdCBmaWx0ZXIgdG8gYWxzbyBsb3dwYXNzIGluc3RlYWQgb2YgdGhlIHBvbHlwaGFzZSBmaWx0ZXIuCisKKzExLgorRXZlbiB3aGVuIHJlc2FtcGxpbmcgaXMgbm90IG5lZWRlZCwgc2hvdWxkIHdlIHVzZSBhbiBGSVIgZmlsdGVyCitmb3IgdGhlIGxvd3Bhc3M/ICBJZiBpdCBpcyBub3QgdG9vIG11Y2ggc2xvd2VyLCB5ZXMuICBJZiBpdAoraXMgc2xvd2VyLCB0aGVuIGl0IHNob3VsZCBiZSBhbiBvcHRpb24gc2luY2UgaXQgd2lsbCBwcm9kdWNlCitoaWdoZXIgcXVhbGl0eS4gIAorCisxMi4KK1dlIHNob3VsZCBjb25zaWRlciBtb3ZpbmcgdGhlIGV4cGVydHMgb3B0aW9ucyBmcm9tIHRoZSAqbG9uZworaGVscCogdGV4dCBpbnRvIGFuICpleHBlcnRzIG9ubHkqIGhlbHAgdGV4dC4gVGhlIGF2ZXJhZ2UgSm9lIGdldHMKK2tub2NrZWQgZG93biBieSB0aGUgaHVnZSBudW1iZXIgb2YgcG9zc2liaWxpdGllcyB0byBzZXR1cCBsYW1lLgorCisKKworCis1MC4KK0JldHRlciB0b25hbGl0eSBlc3RpbWF0aW9uLgorR3BzeWNobyB1c2VzIHByZWRpY3RhYmlsaXR5LCBhbmQgc28gbmVlZHMgYSBkZWxheSB0byBkZXRlY3QgdGhlIHRvbmFsaXR5CitvZiBhIHNvdW5kLgorTnNwc3l0dW5lIHNlZW1zIHRvIG1pc3MgdG9uYWxzIHdoZW4gc2V2ZXJhbCBvZiB0aGVtIGFyZSB0b28gbmFycm93LgorV2Ugd291bGQgcHJvYmFibHkgbmVlZCB0aGUgYmVzdCBvZiBib3RoLgorCisKKworCis2MC4KK0RpZmZlcmVudCBBVEggaGFuZGxpbmcgZm9yIHNmYjIxLiBXZSBhcmUgdXNpbmcgdGhlIG1pbmltdW0gdmFsdWUgb2YgYXRoCitpbiBlYWNoIHdob2xlIHNmYi4gaW4gc2ZiMjEgdGhpcyBsZWFkcyB0byB2ZXJ5IGhpZ2ggYml0cmF0ZXMuCitXZSBjb3VsZCBwZXJoYXBzIHVzZSAyIG9yIDMgYXRoIHBhcnRpdGlvbnMgaW4gc2ZiMjEKKworbm90ZTogcGFydGlhbGx5IGRvbmUKKworCisKKzcwLgorVXNlIG1peGVkIGJsb2Nrcy4KKworCisKKworOTAuCitVc2UgaW50ZW5zaXR5IHN0ZXJlby4gVGhpcyBpcyBhIG11c3QtaGF2ZSBmb3IgbG93IGJpdHJhdGVzLCBidXQgaWYgdGhlCithbGdvcnl0aG0gaXMgdmVyeSBnb29kIGl0IGNvdWxkIGFsc28gYmUgdXNlZCBpbiBldmVyeSBjYXNlLgorTm90ZTogbXBnMTIzIChhbmQgYWxsIGRlcml2YXRpdmVzLCBsaWtlIHhtbXMgYW5kIGxhbWUvbXBnbGliKQoraGF2ZSBidWdzIGluIHRoZSBpbnRlbnNpdHkgc3RlcmVvIGRlY29kaW5nLiAgQnVncyBoYXZlIGJlZW4gdGhlcmUKK2ZvciB5ZWFycyBzaW5jZSB0aGVyZSBhcmUgdmVyeSBmZXcgaW50ZW5zaXR5IHN0ZXJlbyBtcDMncyBvdXQgdGhlcmUuCisKKworCisKKworOTk4LgorTWVyZ2UgR09HTydzIGZhc3QgYXNzZW1ibGVyIHJvdXRpbmVzLgorCisKKworCis5OTkuCitJdCB3b3VsZCBiZSBuaWNlIHRvIHNhdmUgc29tZSBpbmZvcm1hdGlvbiB3aGlsc3QgZW5jb2RpbmcKK2E6IHdhdmUgLT4gbXAzCisJYSBSSUZGL3dhdmUgY2FuIGNvbnRhaW4gTElTVCBjaHVua3Mgd2l0aCBpbmZvcm1hdGlvbgorCWFib3V0IGF1dGhvciwgdGl0bGUsIGV0Yy4gCisJPT0+IGNvdWxkIGdvIGludG8gVEFHIGZpZWxkcyBvZiByZXN1bHRpbmcgbXAzCitiOiBtcDMgLT4gbXAzCisJPT0+IHdlIGNvdWxkIGNvcHkgdGhlIFRBRyBkaXJlY3RseQorYzogbXAzIC0+IHdhdmUKKwk9PT4gY29weSBUQUcgaW50byBMSVNUIGNodW5rCisKKworCisxNTAwLgorSW50ZWdyYXRlIHBsdXNWIGV4dGVuc2lvbnMKKworCisKKzIwMDAuCitUbyBiZSBhYmxlIHRvIGVuY29kZSBhcyBmYXN0IGFzIEZhc3RFbmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9VU0FHRSBiL1VTQUdFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWJmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9VU0FHRQpAQCAtMCwwICsxLDc3OSBAQAorCislIGxhbWUgW29wdGlvbnNdIGlucHV0ZmlsZSBbb3V0cHV0ZmlsZV0KKworRm9yIG1vcmUgb3B0aW9ucywganVzdCB0eXBlOgorJSBsYW1lIC0taGVscAorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDb25zdGFudCBCaXRyYXRlIEV4YW1wbGVzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2ZpeGVkIGJpdCByYXRlIGpzdGVyZW8gMTI4IGticHMgZW5jb2Rpbmc6CislIGxhbWUgc2FtcGxlLndhdiAgc2FtcGxlLm1wMyAgICAgIAorCitmaXhlZCBiaXQgcmF0ZSBqc3RlcmVvIDEyOCBrYnBzIGVuY29kaW5nLCBoaWdoZXIgcXVhbGl0eTogIChyZWNvbW1lbmRlZCkKKyUgbGFtZSAtaCBzYW1wbGUud2F2ICBzYW1wbGUubXAzICAgICAgCisKK0Zhc3QgZW5jb2RlLCBsb3cgcXVhbGl0eSAgKG5vIG5vaXNlIHNoYXBpbmcpCislIGxhbWUgLWYgc2FtcGxlLndhdiAgc2FtcGxlLm1wMyAgICAgCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWYXJpYWJsZSBCaXRyYXRlIEV4YW1wbGVzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xBTUUgaGFzIHR3byB0eXBlcyBvZiB2YXJpYWJsZSBiaXRyYXRlOiBBQlIgYW5kIFZCUi4KKworQUJSIGlzIHRoZSB0eXBlIG9mIHZhcmlhYmxlIGJpdHJhdGUgZW5jb2RpbmcgdXN1YWxseSBmb3VuZCBpbiBvdGhlcgorTVAzIGVuY29kZXJzLCBWb3JiaXMgYW5kIEFBQy4gIFRoZSBudW1iZXIgb2YgYml0cyBpcyBkZXRlcm1pbmVkIGJ5Citzb21lIG1ldHJpYyAobGlrZSBwZXJjZXB0dWFsIGVudHJvcHksIG9yIGp1c3QgdGhlIG51bWJlciBvZiBiaXRzCituZWVkZWQgZm9yIGEgY2VydGFpbiBzZXQgb2YgZW5jb2RpbmcgdGFibGVzKSwgYW5kIGl0IGlzIG5vdCBiYXNlZCBvbgorY29tcHV0aW5nIHRoZSBhY3R1YWwgZW5jb2RpbmcvcXVhbnRpemF0aW9uIGVycm9yLiAgQUJSIHNob3VsZCBhbHdheXMKK2dpdmUgcmVzdWx0cyBlcXVhbCBvciBiZXR0ZXIgdGhhbiBDQlI6CisKK0FCUjogICAoLS1hYnIgPHg+IG1lYW5zIGVuY29kZSB3aXRoIGFuIGF2ZXJhZ2UgYml0cmF0ZSBvZiBhcm91bmQgeCBrYnBzKQorbGFtZSAtaCAtLWFiciAxMjggIHNhbXBsZS53YXYgc2FtcGxlLm1wMworCisKK1ZCUiBpcyBhIHRydWUgdmFyaWFibGUgYml0cmF0ZSBtb2RlIHdoaWNoIGJhc2VzIHRoZSBudW1iZXIgb2YgYml0cyBmb3IKK2VhY2ggZnJhbWUgb24gdGhlIG1lYXN1cmVkIHF1YW50aXphdGlvbiBlcnJvciByZWxhdGl2ZSB0byB0aGUKK2VzdGltYXRlZCBhbGxvd2VkIG1hc2tpbmcuIFRoZXJlIGFyZSAxMCBjb21wcmVzc2lvbiBsZXZlbHMgZGVmaW5lZCwgCityYW5naW5nIGZyb20gMD1sb3dlc3QgY29tcHJlc3Npb24gdG8gOSBoaWdoZXN0IGNvbXByZXNzaW9uLiBUaGUgcmVzdWx0aW5nCitmaWxlc2l6ZXMgZGVwZW5kIG9uIHRoZSBpbnB1dCBtYXRlcmlhbC4gT24gdHlwaWNhbCBtdXNpYyB5b3UgY2FuIGV4cGVjdAorLVY1IHJlc3VsdGluZyBpbiBmaWxlcyBhdmVyYWdpbmcgMTMyIGticHMsIC1WMiBhdmVyYWdpbmcgMjAwIGticHMuCisKK1ZhcmlhYmxlIEJpdHJhdGUgKFZCUik6ICh1c2UgLVYgbiB0byBhZGp1c3QgcXVhbGl0eS9maWxlc2l6ZSkKKyUgbGFtZSAtVjIgc2FtcGxlLndhdiBzYW1wbGUubXAzCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTE9XIEJJVFJBVEVTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQXQgbG93ZXIgYml0cmF0ZXMsIChsaWtlIDI0IGticHMgcGVyIGNoYW5uZWwpLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0Cit5b3UgdXNlIGEgMTYga0h6IHNhbXBsaW5nIHJhdGUgY29tYmluZWQgd2l0aCBsb3dwYXNzIGZpbHRlcmluZy4gIExBTUUsCithcyB3ZWxsIGFzIGNvbW1lcmNpYWwgZW5jb2RlcnMgKEZoRywgWGluZykgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuCitIb3dldmVyLCBpZiB5b3UgZmVlbCB0aGVyZSBpcyB0b28gbXVjaCAob3Igbm90IGVub3VnaCkgbG93cGFzcworZmlsdGVyaW5nLCB5b3UgbWF5IG5lZWQgdG8gdHJ5IGRpZmZlcmVudCB2YWx1ZXMgb2YgdGhlIGxvd3Bhc3MgY3V0b2ZmCithbmQgcGFzc2JhbmQgd2lkdGggKC0tcmVzYW1wbGUsIC0tbG93cGFzcyBhbmQgLS1sb3dwYXNzLXdpZHRoIG9wdGlvbnMpLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTVFJFQU1JTkcgRVhBTVBMRVMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyUgY2F0IGlucHV0ZmlsZSB8IGxhbWUgW29wdGlvbnNdIC0gLSA+IG91dHB1dAorCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorU2NyaXB0cyBhcmUgaW5jbHVkZWQgKGluIHRoZSAnbWlzYycgc3ViZGlyZWN0b3J5KQordG8gcnVuIGxhbWUgb24gbXVsdGlwbGUgZmlsZXM6CisKK2JhY2ggc2NyaXB0OiAgbWxhbWUgICAgIFJ1biAibWxhbWUgLT8iIGZvciBpbnN0cnVjdGlvbnMuCitzaCBzY3JpcHQ6ICAgIGF1ZW5jICAgICBSdW4gYXVlbmMgZm9yIGluc3RydWN0aW9ucworc2ggc2NyaXB0OiAgICBtdWdlY28uc2gKKworUGVhcmwgc2NyaXB0IHdoaWNoIHdpbGwgcmUtZW5jb2RlIG1wMyBmaWxlcyBhbmQgcHJlc2VydmUgaWQzIHRhZ3M6CitsYW1laWQzLnBsIAorCitXaW5kb3dzIHNjcmlwdHM6CitsYW1lNGRvcy5iYXQgIAorTGFtZS52YnMgICAoYW5kIGFuIEhUTUwgZnJvbnRlbmQ6IExhbWVHVUkuaHRtbCkKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorb3B0aW9ucyBndWlkZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGVzZSBvcHRpb25zIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGJlbG93LgorCisKK1F1YWxpdHkgcmVsYXRlZDoKKworLW0gbS9zL2ovZi9hICAgbW9kZSBzZWxlY3Rpb24KKy1xIG4gICAgICAgICAgIEludGVybmFsIGFsZ29yaXRobSBxdWFsaXR5IHNldHRpbmcgMC4uOS4gCisgICAgICAgICAgICAgICAwID0gc2xvd2VzdCBhbGdvcml0aG1zLCBidXQgcG90ZW50aWFsbHkgaGlnaGVzdCBxdWFsaXR5CisgICAgICAgICAgICAgICA5ID0gZmFzdGVyIGFsZ29yaXRobXMsIHZlcnkgcG9vciBxdWFsaXR5CistaCAgICAgICAgICAgICBzYW1lIGFzIC1xMgorLWYgICAgICAgICAgICAgc2FtZSBhcyAtcTcKKworCitDb25zdGFudCBCaXQgUmF0ZSAoQ0JSKQorLWIgIG4gICAgICAgICAgc2V0IGJpdHJhdGUgKDgsIDE2LCAyNCwgLi4uLCAzMjApCistLWZyZWVmb3JtYXQgICBwcm9kdWNlIGEgZnJlZSBmb3JtYXQgYml0c3RyZWFtLiAgVXNlciBtdXN0IGFsc28gc3BlY2lmeQorICAgICAgICAgICAgICAgYSBiaXRyYXRlIHdpdGggLWIsIGJldHdlZW4gOCBhbmQgNjQwIGticHMuCisKK1ZhcmlhYmxlIEJpdCBSYXRlIChWQlIpCistdiAgICAgICAgICAgICBWQlIKKy0tdmJyLW9sZCAgICAgIHVzZSBvbGQgdmFyaWFibGUgYml0cmF0ZSAoVkJSKSByb3V0aW5lCistLXZici1uZXcgICAgICB1c2UgbmV3IHZhcmlhYmxlIGJpdHJhdGUgKFZCUikgcm91dGluZSAoZGVmYXVsdCkKKy1WIG4gICAgICAgICAgIFZCUiBxdWFsaXR5IHNldHRpbmcgICgwPWhpZ2hlc3QgcXVhbGl0eSwgOT1sb3dlc3QpCistYiAgbiAgICAgICAgICBzcGVjaWZ5IGEgbWluaW11bSBhbGxvd2VkIGJpdHJhdGUgKDgsMTYsMjQsLi4uLDMyMCkKKy1CICBuICAgICAgICAgIHNwZWNpZnkgYSBtYXhpbXVtIGFsbG93ZWQgYml0cmF0ZSAoOCwxNiwyNCwuLi4sMzIwKQorLUYgICAgICAgICAgICAgc3RyaWN0bHkgZW5mb3JjZSBtaW5pbXVtIGJpdHJhdGUKKy10ICAgICAgICAgICAgIGRpc2FibGUgVkJSIGluZm9ybWF0aW9uYWwgdGFnIAorLS1ub2hpc3QgICAgICAgZGlzYWJsZSBkaXNwbGF5IG9mIFZCUiBiaXRyYXRlIGhpc3RvZ3JhbQorCistLWFiciBuICAgICAgICBzcGVjaWZ5IGF2ZXJhZ2UgYml0cmF0ZSBkZXNpcmVkCisKKworT3BlcmF0aW9uYWw6CisKKy1yICAgICAgICAgICAgICBhc3N1bWUgaW5wdXQgZmlsZSBpcyByYXcgUENNCistcyAgbiAgICAgICAgICAgaW5wdXQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIGtIeiAoZm9yIHJhdyBQQ00gaW5wdXQgZmlsZXMpCistLXJlc2FtcGxlIG4gICAgb3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeQorLS1tcDNpbnB1dCAgICAgIGlucHV0IGZpbGUgaXMgYW4gTVAzIGZpbGUuICBkZWNvZGUgdXNpbmcgbXBnbGliL21wZzEyMworLS1vZ2dpbnB1dCAgICAgIGlucHV0IGZpbGUgaXMgYW4gT2dnIFZvcmJpcyBmaWxlLiAgZGVjb2RlIHVzaW5nIGxpYnZvcmJpcworLXggICAgICAgICAgICAgIHN3YXAgYnl0ZXMgb2YgaW5wdXQgZmlsZQorLS1zY2FsZSA8YXJnPiAgIG11bHRpcGx5IFBDTSBpbnB1dCBieSA8YXJnPgorLS1zY2FsZS1sIDxhcmc+IHNjYWxlIGNoYW5uZWwgMCAobGVmdCkgaW5wdXQgKG11bHRpcGx5IFBDTSBkYXRhKSBieSA8YXJnPgorLS1zY2FsZS1yIDxhcmc+IHNjYWxlIGNoYW5uZWwgMSAocmlnaHQpIGlucHV0IChtdWx0aXBseSBQQ00gZGF0YSkgYnkgPGFyZz4KKy1hICAgICAgICAgICAgICBkb3dubWl4IHN0ZXJlbyBpbnB1dCBmaWxlIHRvIG1vbm8gLm1wMworLWUgIG4vNS9jICAgICAgIGRlLWVtcGhhc2lzCistcCAgICAgICAgICAgICAgYWRkIENSQyBlcnJvciBwcm90ZWN0aW9uCistYyAgICAgICAgICAgICAgbWFyayB0aGUgZW5jb2RlZCBmaWxlIGFzIGNvcHlyaWdodGVkCistbyAgICAgICAgICAgICAgbWFyayB0aGUgZW5jb2RlZCBmaWxlIGFzIGEgY29weQorLVMgICAgICAgICAgICAgIGRvbid0IHByaW50IHByb2dyZXNzIHJlcG9ydCwgVkJSIGhpc3RvZ3JhbQorLS1zdHJpY3RseS1lbmZvcmNlLUlTTyAgIGNvbXBseSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIElTTyBNUEVHIHNwZWMKKy0tcmVwbGF5Z2Fpbi1mYXN0ICAgY29tcHV0ZSBSRyBmYXN0IGJ1dCBzbGlnaHRseSBpbmFjY3VyYXRlbHkgKGRlZmF1bHQpCistLXJlcGxheWdhaW4tYWNjdXJhdGUgICBjb21wdXRlIFJHIG1vcmUgYWNjdXJhdGVseSBhbmQgZmluZCB0aGUgcGVhayBzYW1wbGUKKy0tbm9yZXBsYXlnYWluICBkaXNhYmxlIFJlcGxheUdhaW4gYW5hbHlzaXMKKy0tY2xpcGRldGVjdCAgICBlbmFibGUgLS1yZXBsYXlnYWluLWFjY3VyYXRlIGFuZCBwcmludCBhIG1lc3NhZ2Ugd2hldGhlcgorICAgICAgICAgICAgICAgIGNsaXBwaW5nIG9jY3VycyBhbmQgaG93IGZhciB0aGUgd2F2ZWZvcm0gaXMgZnJvbSBmdWxsIHNjYWxlCisKKy0tZGVjb2RlICAgICAgICBhc3N1bWUgaW5wdXQgZmlsZSBpcyBhbiBtcDMgZmlsZSwgYW5kIGRlY29kZSB0byB3YXYuCistdCAgICAgICAgICAgICAgZGlzYWJsZSB3cml0aW5nIG9mIFdBViBoZWFkZXIgd2hlbiB1c2luZyAtLWRlY29kZQorICAgICAgICAgICAgICAgIChkZWNvZGUgdG8gcmF3IHBjbSwgbmF0aXZlIGVuZGlhbiBmb3JtYXQgKHVzZSAteCB0byBzd2FwKSkKKworCisKK0lEMyB0YWdnaW5nOgorCistLXR0IDx0aXRsZT4gICAgYXVkaW8vc29uZyB0aXRsZSAobWF4IDMwIGNoYXJzIGZvciB2ZXJzaW9uIDEgdGFnKQorLS10YSA8YXJ0aXN0PiAgIGF1ZGlvL3NvbmcgYXJ0aXN0IChtYXggMzAgY2hhcnMgZm9yIHZlcnNpb24gMSB0YWcpCistLXRsIDxhbGJ1bT4gICAgYXVkaW8vc29uZyBhbGJ1bSAobWF4IDMwIGNoYXJzIGZvciB2ZXJzaW9uIDEgdGFnKQorLS10eSA8eWVhcj4gICAgIGF1ZGlvL3NvbmcgeWVhciBvZiBpc3N1ZSAoMSB0byA5OTk5KQorLS10YyA8Y29tbWVudD4gIHVzZXItZGVmaW5lZCB0ZXh0IChtYXggMzAgY2hhcnMgZm9yIHYxIHRhZywgMjggZm9yIHYxLjEpCistLXRuIDx0cmFjaz4gICAgYXVkaW8vc29uZyB0cmFjayBudW1iZXIgKDEgdG8gMjU1LCBjcmVhdGVzIHYxLjEgdGFnKQorLS10ZyA8Z2VucmU+ICAgIGF1ZGlvL3NvbmcgZ2VucmUgKG5hbWUgb3IgbnVtYmVyIGluIGxpc3QpCistLWFkZC1pZDN2MiAgICAgZm9yY2UgYWRkaXRpb24gb2YgdmVyc2lvbiAyIHRhZworLS1pZDN2MS1vbmx5ICAgIGFkZCBvbmx5IGEgdmVyc2lvbiAxIHRhZworLS1pZDN2Mi1vbmx5ICAgIGFkZCBvbmx5IGEgdmVyc2lvbiAyIHRhZworLS1zcGFjZS1pZDN2MSAgIHBhZCB2ZXJzaW9uIDEgdGFnIHdpdGggc3BhY2VzIGluc3RlYWQgb2YgbnVsbHMKKy0tcGFkLWlkM3YyICAgICBzYW1lIGFzICctLXBhZC1pZDN2Mi1zaXplIDEyOCcKKy0tcGFkLWlkM3YyLXNpemUgPG51bT4gYWRkcyB2ZXJzaW9uIDIgdGFnLCBwYWQgd2l0aCBleHRyYSA8bnVtPiBieXRlcworLS1nZW5yZS1saXN0ICAgIHByaW50IGFscGhhYmV0aWNhbGx5IHNvcnRlZCBJRDMgZ2VucmUgbGlzdCBhbmQgZXhpdAorCitOb3RlOiBBIHZlcnNpb24gMiB0YWcgd2lsbCBOT1QgYmUgYWRkZWQgdW5sZXNzIG9uZSBvZiB0aGUgaW5wdXQgZmllbGRzCit3b24ndCBmaXQgaW4gYSB2ZXJzaW9uIDEgdGFnIChlLmcuIHRoZSB0aXRsZSBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gMzAKK2NoYXJhY3RlcnMpLCBvciB0aGUgJy0tYWRkLWlkM3YyJyBvciAnLS1pZDN2Mi1vbmx5JyBvcHRpb25zIGFyZSB1c2VkLAorb3Igb3V0cHV0IGlzIHJlZGlyZWN0ZWQgdG8gc3Rkb3V0LgorCitXaW5kb3dzIGFuZCBPUy8yLXNwZWNpZmljIG9wdGlvbnM6CisgICAgLS1wcmlvcml0eSA8dHlwZT4gICAgIHNldHMgdGhlIHByb2Nlc3MgcHJpb3JpdHkKKworCitvcHRpb25zIG5vdCB5ZXQgZGVzY3JpYmVkOgorLS1ub3JlcyAgICAgICAgICAgIGRpc2FibGUgYml0IHJlc2Vydm9pcgorLS1kaXNwdGltZQorCistLWxvd3Bhc3MKKy0tbG93cGFzcy13aWR0aAorLS1oaWdocGFzcworLS1oaWdocGFzcy13aWR0aAorCisKKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbGwgb3B0aW9ucyBpbiBhbHBoYWJldGljYWwgb3JkZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2Rvd25taXgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistYSAgCisKK21peCB0aGUgc3RlcmVvIGlucHV0IGZpbGUgdG8gbW9ubyBhbmQgZW5jb2RlIGFzIG1vbm8uICAKKworVGhpcyBvcHRpb24gaXMgb25seSBuZWVkZWQgaW4gdGhlIGNhc2Ugb2YgcmF3IFBDTSBzdGVyZW8gaW5wdXQgCisoYmVjYXVzZSBMQU1FIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgaW5wdXQgZmlsZSkuCitUbyBlbmNvZGUgYSBzdGVyZW8gUENNIGlucHV0IGZpbGUgYXMgbW9ubywgdXNlICJsYW1lIC1tIHMgLWEiCisKK0ZvciBXQVYgYW5kIEFJRkYgaW5wdXQgZmlsZXMsIHVzaW5nICItbSBtIiB3aWxsIGFsd2F5cyBwcm9kdWNlIGEKK21vbm8gLm1wMyBmaWxlIGZyb20gYm90aCBtb25vIGFuZCBzdGVyZW8gaW5wdXQuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2F2ZXJhZ2UgYml0cmF0ZSBlbmNvZGluZyAoYWthIFNhZmUgVkJSKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tYWJyIG4KKwordHVybnMgb24gZW5jb2Rpbmcgd2l0aCBhIHRhcmdldGVkIGF2ZXJhZ2UgYml0cmF0ZSBvZiBuIGticHMsIGFsbG93aW5nCit0byB1c2UgZnJhbWVzIG9mIGRpZmZlcmVudCBzaXplcy4gIFRoZSBhbGxvd2VkIHJhbmdlIG9mIG4gaXMgOC4uLjMyMCAKK2ticHMsIHlvdSBjYW4gdXNlIGFueSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGF0IHJhbmdlLgorCisKKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitiaXRyYXRlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLWIgIG4KKworRm9yIE1QRUctMSAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgMzIsIDQ0LjEgYW5kIDQ4IGtIeikKK24gPSAgIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAKKworRm9yIE1QRUctMiAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgMTYsIDIyLjA1IGFuZCAyNCBrSHopCituID0gOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCisKK0ZvciBNUEVHLTIuNSAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgOCwgMTEuMDI1IGFuZCAxMiBrSHopCituID0gOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQKKworCitUaGUgYml0cmF0ZSB0byBiZSB1c2VkLiAgRGVmYXVsdCBpcyAxMjgga2JwcyBNUEVHMSwgODAga2JwcyBNUEVHMi4KKworV2hlbiB1c2VkIHdpdGggdmFyaWFibGUgYml0cmF0ZSBlbmNvZGluZ3MgKFZCUiksIC1iIHNwZWNpZmllcyB0aGUKK21pbmltdW0gYml0cmF0ZSB0byB1c2UuICBUaGlzIGlzIHVzZWZ1bCBvbmx5IGlmIHlvdSBuZWVkIHRvIGNpcmN1bXZlbnQKK2EgYnVnZ3kgaGFyZHdhcmUgZGV2aWNlIHdpdGggc3RyYW5nZSBiaXRyYXRlIGNvbnN0cmFpbnMuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK21heCBiaXRyYXRlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLUIgIG4KKworc2VlIGFsc28gb3B0aW9uICItYiIgZm9yIGFsbG93ZWQgYml0cmF0ZXMuCisKK01heGltdW0gYWxsb3dlZCBiaXRyYXRlIHdoZW4gdXNpbmcgVkJSL0FCUi4KKworVXNpbmcgLUIgaXMgTk9UIFJFQ09NTUVOREVELiAgQSAxMjgga2JwcyBDQlIgYml0c3RyZWFtLCBiZWNhdXNlIG9mIHRoZQorYml0IHJlc2Vydm9pciwgY2FuIGFjdHVhbGx5IGhhdmUgZnJhbWVzIHdoaWNoIHVzZSBhcyBtYW55IGJpdHMgYXMgYQorMzIwIGticHMgZnJhbWUuICBBQlIvVkJSIG1vZGVzIG1pbmltaXplIHRoZSB1c2Ugb2YgdGhlIGJpdCByZXNlcnZvaXIsIGFuZAordGh1cyBuZWVkIHRvIGFsbG93IDMyMCBrYnBzIGZyYW1lcyB0byBnZXQgdGhlIHNhbWUgZmxleGFiaWxpdHkgYXMgQ0JSCitzdHJlYW1zLiAgVGhpcyBpcyB1c2VmdWwgb25seSBpZiB5b3UgbmVlZCB0byBjaXJjdW12ZW50IGEgYnVnZ3kgaGFyZHdhcmUKK2RldmljZSB3aXRoIHN0cmFuZ2UgYml0cmF0ZSBjb25zdHJhaW5zLgorCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorY29weXJpZ2h0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLWMgICAKKworbWFyayB0aGUgZW5jb2RlZCBmaWxlIGFzIGNvcHlyaWdodGVkCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorY2xpcHBpbmcgZGV0ZWN0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS1jbGlwZGV0ZWN0CisKK0VuYWJsZSAtLXJlcGxheWdhaW4tYWNjdXJhdGUgYW5kIHByaW50IGEgbWVzc2FnZSB3aGV0aGVyIGNsaXBwaW5nIAorb2NjdXJzIGFuZCBob3cgZmFyIGluIGRCIHRoZSB3YXZlZm9ybSBpcyBmcm9tIGZ1bGwgc2NhbGUuCisKK1RoaXMgb3B0aW9uIGlzIG5vdCB1c2FibGUgaWYgdGhlIE1QMyBkZWNvZGVyIHdhcyBfZXhwbGljaXRseV8gZGlzYWJsZWQgCitpbiB0aGUgYnVpbGQgb2YgTEFNRS4KKworU2VlIGFsc286IC0tcmVwbGF5Z2Fpbi1hY2N1cmF0ZQorCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK21wZ2xpYiBkZWNvZGUgY2FwYWJpbGl0eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tZGVjb2RlIAorCitUaGlzIGp1c3QgdXNlcyBMQU1FJ3MgbXBnMTIzL21wZ2xpYiBpbnRlcmZhY2UgdG8gZGVjb2RlIGFuIE1QMyBmaWxlIHRvCithIHdhdiBmaWxlLiAgVGhlIGlucHV0IGZpbGUgY2FuIGJlIGFueSBpbnB1dCB0eXBlIHN1cHBvcnRlZCBieQorZW5jb2RpbmcsIGluY2x1ZGluZyAubXAzIChsYXllcnMgMSwgMiBhbmQgMykgYW5kIC5vZ2cuICAKKworSWYgLXQgaXMgdXNlZCAoZGlzYWJsZSB3YXYgaGVhZGVyKSwgTEFNRSB3aWxsIG91dHB1dAorcmF3IHBjbSBpbiBuYXRpdmUgZW5kaWFuIGZvcm1hdCAodXNlIC14IHRvIHN3YXAgYnl0ZXMpLgorCitUaGlzIG9wdGlvbiBpcyBub3QgdXNhYmxlIGlmIHRoZSBNUDMgZGVjb2RlciB3YXMgX2V4cGxpY2l0bHlfIGRpc2FibGVkCitpbiB0aGUgYnVpbGQgb2YgTEFNRS4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZGUtZW1waGFzaXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistZSAgbi81L2MgICAKKworICBuID0gKG5vbmUsIGRlZmF1bHQpCisgIDUgPSAwLzE1IG1pY3Jvc2Vjb25kcworICBjID0gY2l0dCBqLjE3CisKK0FsbCB0aGlzIGRvZXMgaXMgc2V0IGEgZmxhZyBpbiB0aGUgYml0c3RyZWFtLiAgSWYgeW91IGhhdmUgYSBQQ00KK2lucHV0IGZpbGUgd2hlcmUgb25lIG9mIHRoZSBhYm92ZSB0eXBlcyBvZiAob2Jzb2xldGUpIGVtcGhhc2lzIGhhcworYmVlbiBhcHBsaWVkLCB5b3UgY2FuIHNldCB0aGlzIGZsYWcgaW4gTEFNRS4gIFRoZW4gdGhlIG1wMyBkZWNvZGVyCitzaG91bGQgZGUtZW1waGFzaXplIHRoZSBvdXRwdXQgZHVyaW5nIHBsYXliYWNrLCBhbHRob3VnaCBtb3N0IAorZGVjb2RlcnMgaWdub3JlIHRoaXMgZmxhZy4KKworQSBiZXR0ZXIgc29sdXRpb24gd291bGQgYmUgdG8gYXBwbHkgdGhlIGRlLWVtcGhhc2lzIHdpdGggYSBzdGFuZGFsb25lCit1dGlsaXR5IGJlZm9yZSBlbmNvZGluZywgYW5kIHRoZW4gZW5jb2RlIHdpdGhvdXQgLWUuICAKKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitmYXN0IG1vZGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistZiAgIAorCitTYW1lIGFzIC1xIDcuICAKKworTk9UIFJFQ09NTUVOREVELiAgVXNlIHdoZW4gZW5jb2Rpbmcgc3BlZWQgaXMgY3JpdGljYWwgYW5kIGVuY29kaW5nCitxdWFsaXR5IGRvZXMgbm90IG1hdHRlci4gIERpc2FibGUgbm9pc2Ugc2hhcGluZy4gIFBzeWNobyBhY291c3RpY3MgYXJlCit1c2VkIG9ubHkgZm9yIGJpdCBhbGxvY2F0aW9uIGFuZCBwcmUtZWNobyBkZXRlY3Rpb24uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzdHJpY3RseSBlbmZvcmNlIFZCUiBtaW5pbXVtIGJpdHJhdGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistRiAgIAorCitzdHJpY3RseSBlbmZvcmNlIFZCUiBtaW5pbXVtIGJpdHJhdGUuICBXaXRoIG91dCB0aGlzIG9wdGlvbmksIHRoZSBtaW5pbXVtCitiaXRyYXRlIHdpbGwgYmUgaWdub3JlZCBmb3IgcGFzc2FnZXMgb2YgYW5hbG9nIHNpbGVuY2UuCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZnJlZSBmb3JtYXQgYml0c3RyZWFtcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tZnJlZWZvcm1hdCAgIAorCitMQU1FIHdpbGwgcHJvZHVjZSBhIGZpeGVkIGJpdHJhdGUsIGZyZWUgZm9ybWF0IGJpdHN0cmVhbS4KK1VzZXIgbXVzdCBzcGVjaWZ5IHRoZSBkZXNpcmVkIGJpdHJhdGUgaW4ga2Jwcywgd2hpY2ggY2FuCitiZSBhbnkgaW50ZWdlciBiZXR3ZWVuIDggYW5kIDY0MC4KKworTm90IHN1cHBvcnRlZCBieSBtb3N0IGRlY29kZXJzLiAgQ29tcGxpZW50IGRlY29kZXJzIChvZiB3aGljaCB0aGVyZQorYXJlIGZldykgYXJlIG9ubHkgcmVxdWlyZWQgdG8gc3VwcG9ydCB1cCB0byAzMjAga2Jwcy4gIAorCitEZWNvZGVycyB3aGljaCBjYW4gaGFuZGxlIGZyZWUgZm9ybWF0OgorCisgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyB1cCB0bworTUFEICAgICAgICAgICAgICAgICAgICAgIDY0MCBrYnBzCisibGFtZSAtLWRlY29kZSIgICAgICAgICAgNTUwIGticHMgIAorRnJlZWFtcDogICAgICAgICAgICAgICAgIDQ0MCBrYnBzCitsM2RlYzogICAgICAgICAgICAgICAgICAgMzEwIGticHMKKworCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraGlnaCBxdWFsaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLWgKKwordXNlIHNvbWUgcXVhbGl0eSBpbXByb3ZlbWVudHMuICBUaGUgc2FtZSBhcyAtcSAyLgorCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01vZGVzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLW0gbSAgICAgICAgICAgbW9ubworLW0gcyAgICAgICAgICAgc3RlcmVvCistbSBqICAgICAgICAgICBqb2ludCBzdGVyZW8KKy1tIGYgICAgICAgICAgIGZvcmNlZCBtaWQvc2lkZSBzdGVyZW8KKy1tIGQgICAgICAgICAgIGR1YWwgKGluZGVwZW5kZW50KSBjaGFubmVscworLW0gaSAgICAgICAgICAgaW50ZW5zaXR5IHN0ZXJlbworLW0gYSAgICAgICAgICAgYXV0bworCitNT05PIGlzIHRoZSBkZWZhdWx0IG1vZGUgZm9yIG1vbm8gaW5wdXQgZmlsZXMuICBJZiAiLW0gbSIgaXMgc3BlY2lmaWVkCitmb3IgYSBzdGVyZW8gaW5wdXQgZmlsZSwgdGhlIHR3byBjaGFubmVscyB3aWxsIGJlIGF2ZXJhZ2VkIGludG8gYSBtb25vCitzaWduYWwuICAKKworU1RFUkVPCisKK0pPSU5UIFNURVJFTyBpcyB0aGUgZGVmYXVsdCBtb2RlIGZvciBzdGVyZW8gZmlsZXMgd2l0aCBmaXhlZCBiaXRyYXRlcyBvZgorMTI4IGticHMgb3IgbGVzcy4gIEF0IGhpZ2hlciBmaXhlZCBiaXRyYXRlcywgdGhlIGRlZmF1bHQgaXMgc3RlcmVvLgorRm9yIFZCUiBlbmNvZGluZywganN0ZXJlbyBpcyB0aGUgZGVmYXVsdCBmb3IgVkJSX3EgPjQsIGFuZCBzdGVyZW8KK2lzIHRoZSBkZWZhdWx0IGZvciBWQlJfcSA8PTQuICBZb3UgY2FuIG92ZXJyaWRlIGFsbCBvZiB0aGVzZSBkZWZhdWx0cworYnkgc3BlY2lmaW5nIHRoZSBtb2RlIG9uIHRoZSBjb21tYW5kIGxpbmUuICAKKworanN0ZXJlbyBtZWFucyB0aGUgZW5jb2RlciBjYW4gdXNlIChvbiBhIGZyYW1lIGJ5IGZyYW1lIGJhc2VzKSBlaXRoZXIKK3JlZ3VsYXIgc3RlcmVvIChqdXN0IGVuY29kZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyBpbmRlcGVuZGVudGx5KQorb3IgbWlkL3NpZGUgc3RlcmVvLiAgSW4gbWlkL3NpZGUgc3RlcmVvLCB0aGUgbWlkIChMK1IpIGFuZCBzaWRlIChMLVIpCitjaGFubmVscyBhcmUgZW5jb2RlZCwgYW5kIG1vcmUgYml0cyBhcmUgYWxsb2NhdGVkIHRvIHRoZSBtaWQgY2hhbm5lbAordGhhbiB0aGUgc2lkZSBjaGFubmVsLiAgVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IGluY3JlYXNlIHRoZSBiYW5kd2lkdGgKK2lmIHRoZSBzaWduYWwgZG9lcyBub3QgaGF2ZSB0b28gbXVjaCBzdGVyZW8gc2VwYXJhdGlvbi4gIAorCitNaWQvc2lkZSBzdGVyZW8gaXMgYmFzaWNhbGx5IGEgdHJpY2sgdG8gaW5jcmVhc2UgYmFuZHdpZHRoLiAgQXQgMTI4IGticHMsCitpdCBpcyBjbGVhcmx5IHdvcnRoIHdoaWxlLiAgQXQgaGlnaGVyIGJpdHJhdGVzIGl0IGlzIGxlc3MgdXNlZnVsLgorCitGb3IgdHJ1bHkgbW9ubyBjb250ZW50LCB1c2UgLW0gbSwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGRvd24KK3NhbXBsZSB5b3VyIGlucHV0IGZpbGUgdG8gbW9uby4gIFRoaXMgd2lsbCBwcm9kdWNlIDMwJSBiZXR0ZXIgcmVzdWx0cworb3ZlciAtbSBqLiAgCisKK1VzaW5nIG1pZC9zaWRlIHN0ZXJlbyBpbmFwcHJvcHJpYXRlbHkgY2FuIHJlc3VsdCBpbiBhdWRpYmxlCitjb21wcmVzc2lvbiBhcnRpZmFjdHMuICBUbyBtdWNoIHN3aXRjaGluZyBiZXR3ZWVuIG1pZC9zaWRlIGFuZCByZWd1bGFyCitzdGVyZW8gY2FuIGFsc28gc291bmQgYmFkLiAgVG8gZGV0ZXJtaW5lIHdoZW4gdG8gc3dpdGNoIHRvIG1pZC9zaWRlCitzdGVyZW8sIExBTUUgdXNlcyBhIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkIGFsZ29yaXRobSB0aGFuIHRoYXQKK2Rlc2NyaWJlZCBpbiB0aGUgSVNPIGRvY3VtZW50YXRpb24uCisKK0ZPUkNFRCBNSUQvU0lERSBTVEVSRU8gZm9yY2VzIGFsbCBmcmFtZXMgdG8gYmUgZW5jb2RlZCBtaWQvc2lkZSBzdGVyZW8uICBJdCAKK3Nob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGFyZSBzdXJlIGV2ZXJ5IGZyYW1lIG9mIHRoZSBpbnB1dCBmaWxlCitoYXMgdmVyeSBsaXR0bGUgc3RlcmVvIHNlcGVyYXRpb24uICAKKworRFVBTCBDSEFOTkVMUyAgIE5vdCBzdXBwb3J0ZWQuCisKK0lOVEVOU0lUWSBTVEVSRU8KKworQVVUTworCitBdXRvIHNlbGVjdCBzaG91bGQgc2VsZWN0IChpZiBpbnB1dCBpcyBzdGVyZW8pCisgICAgICAgICAgOCBrYnBzICAgTW9ubworICAgICAxNi0gOTYga2JwcyAgIEludGVuc2l0eSBTdGVyZW8gKGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIEpvaW50IFN0ZXJlbykKKyAgICAxMTItMTI4IGticHMgICBKb2ludCBTdGVyZW8gLW1qCisgICAgMTYwLTE5MiBrYnBzICAgLW1qIHdpdGggdmFyaWFibGUgbWlkL3NpZGUgdGhyZXNob2xkCisgICAgMjI0LTMyMCBrYnBzICAgSW5kZXBlbmRlbnQgU3RlcmVvIC1tcworCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01QMyBpbnB1dCBmaWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS1tcDNpbnB1dAorCitBc3N1bWUgdGhlIGlucHV0IGZpbGUgaXMgYSBNUDMgZmlsZS4gIExBTUUgd2lsbCBkZWNvZGUgdGhlIGlucHV0IGZpbGUKK2JlZm9yZSByZS1lbmNvZGluZyBpdC4gIFNpbmNlIE1QMyBpcyBhIGxvc3N5IGZvcm1hdCwgdGhpcyBpcyAKK25vdCByZWNvbW1lbmRlZCBpbiBnZW5lcmFsLiAgQnV0IGl0IGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgbG93IGJpdHJhdGUKK21wM3MgZnJvbSBoaWdoIGJpdHJhdGUgbXAzcy4gIElmIHRoZSBmaWxlbmFtZSBlbmRzIGluICIubXAzIiBMQU1FIHdpbGwgYXNzdW1lCitpdCBpcyBhbiBNUDMuICBGb3Igc3RkaW4gb3IgTVAzIGZpbGVzIHdoaWNoIGRvbnQgZW5kIGluIC5tcDMgeW91IG5lZWQKK3RvIHVzZSB0aGlzIHN3aXRjaC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZGlzYWJsZSBoaXN0b3JncmFtIGRpc3BsYXkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLW5vaGlzdAorCitCeSBkZWZhdWx0LCBMQU1FIHdpbGwgZGlzcGxheSBhIGJpdHJhdGUgaGlzdG9ncmFtIHdoaWxlIHByb2R1Y2luZworVkJSIG1wMyBmaWxlcy4gIFRoaXMgd2lsbCBkaXNhYmxlIHRoYXQgZmVhdHVyZS4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZGlzYWJsZSBSZXBsYXlHYWluIGFuYWx5c2lzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS1ub3JlcGxheWdhaW4KKworQnkgZGVmYXVsdCBSZXBsYXlHYWluIGFuYWx5c2lzIGlzIGVuYWJsZWQuIFRoaXMgc3dpdGNoIGRpc2FibGVzIGl0LgorCitTZWUgYWxzbzogLS1yZXBsYXlnYWluLWFjY3VyYXRlLCAtLXJlcGxheWdhaW4tZmFzdAorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citub24tb3JpZ2luYWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistbyAgIAorCittYXJrIHRoZSBlbmNvZGVkIGZpbGUgYXMgYSBjb3B5CisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ1JDIGVycm9yIHByb3RlY3Rpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistcCAgCisKK3R1cm4gb24gQ1JDIGVycm9yIHByb3RlY3Rpb24uICAKK1llcyB0aGlzIHJlYWxseSBkb2VzIHdvcmsgY29ycmVjdGx5IGluIExBTUUuICBIb3dldmVyLCBpdCB0YWtlcyAKKzE2IGJpdHMgcGVyIGZyYW1lIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHVzZWQgZm9yIGVuY29kaW5nLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CithbGdvcml0aG0gcXVhbGl0eSBzZWxlY3Rpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistcSBuICAKKworQml0cmF0ZSBpcyBvZiBjb3Vyc2UgdGhlIG1haW4gaW5mbHVlbmNlIG9uIHF1YWxpdHkuICBUaGUgaGlnaGVyIHRoZQorYml0cmF0ZSwgdGhlIGhpZ2hlciB0aGUgcXVhbGl0eS4gIEJ1dCBmb3IgYSBnaXZlbiBiaXRyYXRlLAord2UgaGF2ZSBhIGNob2ljZSBvZiBhbGdvcml0aG1zIHRvIGRldGVybWluZSB0aGUgYmVzdAorc2NhbGVmYWN0b3JzIGFuZCBodWZmbWFuIGVuY29kaW5nIChub2lzZSBzaGFwaW5nKS4KKworLXEgMDogIHVzZSBzbG93ZXN0ICYgYmVzdCBwb3NzaWJsZSB2ZXJzaW9uIG9mIGFsbCBhbGdvcml0aG1zLgorCistcSAyOiAgcmVjb21tZW5kZWQuICBTYW1lIGFzIC1oLiAgLXEgMCBhbmQgLXEgMSBhcmUgc2xvdyBhbmQgbWF5IG5vdCBwcm9kdWNlIAorICAgICAgIHNpZ25pZmljYW50bHkgaGlnaGVyIHF1YWxpdHkuICAKKworLXEgNTogIGRlZmF1bHQgdmFsdWUuICBHb29kIHNwZWVkLCByZWFzb25hYmxlIHF1YWxpdHkKKworLXEgNzogIHNhbWUgYXMgLWYuICBWZXJ5IGZhc3QsIG9rIHF1YWxpdHkuICAocHN5Y2hvIGFjb3VzdGljcyBhcmUKKyAgICAgICB1c2VkIGZvciBwcmUtZWNobyAmIE0vUywgYnV0IG5vIG5vaXNlIHNoYXBpbmcgaXMgZG9uZS4gIAorCistcSA5OiAgZGlzYWJsZXMgYWxtb3N0IGFsbCBhbGdvcml0aG1zIGluY2x1ZGluZyBwc3ktbW9kZWwuICBwb29yIHF1YWxpdHkuCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW5wdXQgZmlsZSBpcyByYXcgcGNtCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLXIgIAorCitBc3N1bWUgdGhlIGlucHV0IGZpbGUgaXMgcmF3IHBjbS4gIFNhbXBsaW5nIHJhdGUgYW5kIG1vbm8vc3RlcmVvL2pzdGVyZW8KK211c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBXaXRob3V0IC1yLCBMQU1FIHdpbGwgcGVyZm9ybQorc2V2ZXJhbCBmc2VlaygpJ3Mgb24gdGhlIGlucHV0IGZpbGUgbG9va2luZyBmb3IgV0FWIGFuZCBBSUZGIGhlYWRlcnMuCisKK05vdCBzdXBwb3J0ZWQgaWYgTEFNRSBpcyBjb21waWxlZCB0byB1c2UgTElCU05ERklMRS4KKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzbGlnaHRseSBtb3JlIGFjY3VyYXRlIFJlcGxheUdhaW4gYW5hbHlzaXMgYW5kIGZpbmRpbmcgdGhlIHBlYWsgc2FtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS1yZXBsYXlnYWluLWFjY3VyYXRlCisKK0VuYWJsZSBkZWNvZGluZyBvbiB0aGUgZmx5LiBDb21wdXRlICJSYWRpbyIgUmVwbGF5R2FpbiBvbiB0aGUgZGVjb2RlZCAKK2RhdGEgc3RyZWFtLiBGaW5kIHRoZSBwZWFrIHNhbXBsZSBvZiB0aGUgZGVjb2RlZCBkYXRhIHN0cmVhbSBhbmQgc3RvcmUgCitpdCBpbiB0aGUgZmlsZS4KKworCitSZXBsYXlHYWluIGFuYWx5c2lzIGRvZXMgX25vdF8gYWZmZWN0IHRoZSBjb250ZW50IG9mIGEgY29tcHJlc3NlZCBkYXRhCitzdHJlYW0gaXRzZWxmLCBpdCBpcyBhIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGVhZGVyIG9mIGEgc291bmQgZmlsZS4gCitJbmZvcm1hdGlvbiBvbiB0aGUgcHVycG9zZSBvZiBSZXBsYXlHYWluIGFuZCB0aGUgYWxnb3JpdGhtcyB1c2VkIGlzIAorYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5yZXBsYXlnYWluLm9yZy8KKworQnkgZGVmYXVsdCwgTEFNRSBwZXJmb3JtcyBSZXBsYXlHYWluIGFuYWx5c2lzIG9uIHRoZSBpbnB1dCBkYXRhIChhZnRlcgordGhlIHVzZXItc3BlY2lmaWVkIHZvbHVtZSBzY2FsaW5nKS4gVGhpcyBiZWhhdmlvdXIgbWlnaHQgZ2l2ZSBzbGlnaHRseSAKK2luYWNjdXJhdGUgcmVzdWx0cyBiZWNhdXNlIHRoZSBkYXRhIG9uIHRoZSBvdXRwdXQgb2YgYSBsb3NzeSAKK2NvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gc2VxdWVuY2UgZGlmZmVycyBmcm9tIHRoZSBpbml0aWFsIGlucHV0IGRhdGEuIAorV2hlbiAtLXJlcGxheWdhaW4tYWNjdXJhdGUgaXMgc3BlY2lmaWVkIHRoZSBtcDMgc3RyZWFtIGdldHMgZGVjb2RlZCBvbgordGhlIGZseSBhbmQgdGhlIGFuYWx5c2lzIGlzIHBlcmZvcm1lZCBvbiB0aGUgZGVjb2RlZCBkYXRhIHN0cmVhbS4gCitBbHRob3VnaCB0aGVvcmV0aWNhbGx5IHRoaXMgbWV0aG9kIGdpdmVzIG1vcmUgYWNjdXJhdGUgcmVzdWx0cywgaXQgaGFzCitzZXZlcmFsIGRpc2FkdmFudGFnZXM6CisgICogdGVzdHMgaGF2ZSBzaG93biB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFJlcGxheUdhaW4gdmFsdWVzIAorICAgIGNvbXB1dGVkIG9uIHRoZSBpbnB1dCBkYXRhIGFuZCBkZWNvZGVkIGRhdGEgaXMgdXN1YWxseSBubyBncmVhdGVyIAorICAgIHRoYW4gMC41ZEIsIGFsdGhvdWdoIHRoZSBtaW5pbXVtIHZvbHVtZSBkaWZmZXJlbmNlIHRoZSBodW1hbiBlYXIgCisgICAgY2FuIHBlcmNlaXZlIGlzIGFib3V0IDEuMGRCCisgICogZGVjb2Rpbmcgb24gdGhlIGZseSBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIGVuY29kaW5nIHByb2Nlc3MKK1RoZSBhcHBhcmVudCBhZHZhbnRhZ2UgaXMgdGhhdDoKKyAgKiB3aXRoIC0tcmVwbGF5Z2Fpbi1hY2N1cmF0ZSB0aGUgcGVhayBzYW1wbGUgaXMgZGV0ZXJtaW5lZCBhbmQgCisgICAgc3RvcmVkIGluIHRoZSBmaWxlLiBUaGUga25vd2xlZGdlIG9mIHRoZSBwZWFrIHNhbXBsZSBjYW4gYmUgdXNlZnVsCisgICAgdG8gZGVjb2RlcnMgKHBsYXllcnMpIHRvIHByZXZlbnQgYSBuZWdhdGl2ZSBlZmZlY3QgY2FsbGVkICdjbGlwcGluZycKKyAgICB0aGF0IGludHJvZHVjZXMgZGlzdG9ydGlvbiBpbnRvIHNvdW5kLgorICAgIAorCitPbmx5IHRoZSAiUmFkaW8iIFJlcGxheUdhaW4gdmFsdWUgaXMgY29tcHV0ZWQuIEl0IGlzIHN0b3JlZCBpbiB0aGUgTEFNRSB0YWcuIAorVGhlIGFuYWx5c2lzIGlzIHBlcmZvcm1lZCB3aXRoIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGVxdWFsIHRvIDg5ZEIuIAorTm90ZTogdGhlIHJlZmVyZW5jZSB2b2x1bWUgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIDgzZEIgb24gdHJhbnNpdGlvbgorZnJvbSB2ZXJzaW9uIDMuOTUgdG8gMy45NS4xLgorCitUaGlzIG9wdGlvbiBpcyBub3QgdXNhYmxlIGlmIHRoZSBNUDMgZGVjb2RlciB3YXMgX2V4cGxpY2l0bHlfIGRpc2FibGVkIAoraW4gdGhlIGJ1aWxkIG9mIExBTUUuIChOb3RlOiBpZiBMQU1FIGlzIGNvbXBpbGVkIHdpdGhvdXQgdGhlIE1QMyBkZWNvZGVyLCAKK1JlcGxheUdhaW4gYW5hbHlzaXMgaXMgcGVyZm9ybWVkIG9uIHRoZSBpbnB1dCBkYXRhIGFmdGVyIHVzZXItc3BlY2lmaWVkIAordm9sdW1lIHNjYWxpbmcpLgorCitTZWUgYWxzbzogLS1yZXBsYXlnYWluLWZhc3QsIC0tbm9yZXBsYXlnYWluLCAtLWNsaXBkZXRlY3QKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZmFzdCBSZXBsYXlHYWluIGFuYWx5c2lzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS1yZXBsYXlnYWluLWZhc3QKKworQ29tcHV0ZSAiUmFkaW8iIFJlcGxheUdhaW4gb2YgdGhlIGlucHV0IGRhdGEgc3RyZWFtIGFmdGVyIHVzZXItc3BlY2lmaWVkCit2b2x1bWUgc2NhbGluZyBhbmQvb3IgcmVzYW1wbGluZy4KKworUmVwbGF5R2FpbiBhbmFseXNpcyBkb2VzIF9ub3RfIGFmZmVjdCB0aGUgY29udGVudCBvZiBhIGNvbXByZXNzZWQgZGF0YQorc3RyZWFtIGl0c2VsZiwgaXQgaXMgYSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGhlYWRlciBvZiBhIHNvdW5kIGZpbGUuIAorSW5mb3JtYXRpb24gb24gdGhlIHB1cnBvc2Ugb2YgUmVwbGF5R2FpbiBhbmQgdGhlIGFsZ29yaXRobXMgdXNlZCBpcyAKK2F2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cucmVwbGF5Z2Fpbi5vcmcvCisKK09ubHkgdGhlICJSYWRpbyIgUmVwbGF5R2FpbiB2YWx1ZSBpcyBjb21wdXRlZC4gSXQgaXMgc3RvcmVkIGluIHRoZSBMQU1FIHRhZy4gCitUaGUgYW5hbHlzaXMgaXMgcGVyZm9ybWVkIHdpdGggdGhlIHJlZmVyZW5jZSB2b2x1bWUgZXF1YWwgdG8gODlkQi4gCitOb3RlOiB0aGUgcmVmZXJlbmNlIHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gODNkQiBvbiB0cmFuc2l0aW9uCitmcm9tIHZlcnNpb24gMy45NSB0byAzLjk1LjEuCisKK1RoaXMgc3dpdGNoIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKworU2VlIGFsc286IC0tcmVwbGF5Z2Fpbi1hY2N1cmF0ZSwgLS1ub3JlcGxheWdhaW4KKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIGtIegorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tcmVzYW1wbGUgIG4KKword2hlcmUgbiA9IDgsIDExLjAyNSwgMTIsIDE2LCAyMi4wNSwgMjQsIDMyLCA0NC4xLCA0OAorCitPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5LiAgUmVzYW1wbGUgdGhlIGlucHV0IGlmIG5lY2Vzc2FyeS4gIAorCitJZiBub3Qgc3BlY2lmaWVkLCBMQU1FIG1heSBzb21ldGltZXMgcmVzYW1wbGUgYXV0b21hdGljYWxseSAKK3doZW4gZmFjZWQgd2l0aCBleHRyZW1lIGNvbXByZXNzaW9uIGNvbmRpdGlvbnMgKGxpa2UgZW5jb2RpbmcKK2EgNDQuMSBrSHogaW5wdXQgZmlsZSBhdCAzMiBrYnBzKS4gIFRvIGRpc2FibGUgdGhpcyBhdXRvbWF0aWMKK3Jlc2FtcGxpbmcsIHlvdSBoYXZlIHRvIHVzZSAtLXJlc2FtbGUgdG8gc2V0IHRoZSBvdXRwdXQgc2FtcGxlcmF0ZQorZXF1YWwgdG8gdGhlIGlucHR1IHNhbXBsZXJhdGUuICBJbiB0aGF0IGNhc2UsIExBTUUgd2lsbCBub3QKK3BlcmZvcm0gYW55IGV4dHJhIGNvbXB1dGF0aW9ucy4KKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzYW1wbGluZyBmcmVxdWVuY3kgaW4ga0h6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLXMgIG4KKword2hlcmUgbiA9IHNhbXBsaW5nIHJhdGUgaW4ga0h6LgorCitSZXF1aXJlZCBmb3IgcmF3IFBDTSBpbnB1dCBmaWxlcy4gIE90aGVyd2lzZSBpdCB3aWxsIGJlIGRldGVybWluZWQKK2Zyb20gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaW5wdXQgZmlsZS4KKworTEFNRSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzYW1wbGUgdGhlIGlucHV0IGZpbGUgdG8gb25lIG9mIHRoZQorc3VwcG9ydGVkIE1QMyBzYW1wbGVyYXRlcyBpZiBuZWNlc3NhcnkuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3NpbGVudCBvcGVyYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistUworCitkb24ndCBwcmludCBwcm9ncmVzcyByZXBvcnQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3NjYWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS1zY2FsZSA8YXJnPgorCitTY2FsZXMgaW5wdXQgYnkgPGFyZz4uICBUaGlzIGp1c3QgbXVsdGlwbGllcyB0aGUgUENNIGRhdGEKKyhhZnRlciBpdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gZmxvYXRpbmcgcG9pbnQpIGJ5IDxhcmc+LiAgCisKKzxhcmc+ID4gMTogIGluY3JlYXNlIHZvbHVtZQorPGFyZz4gPSAxOiAgbm8gZWZmZWN0Cis8YXJnPiA8IDE6ICByZWR1Y2Ugdm9sdW1lCisKK1VzZSB3aXRoIGNhcmUsIHNpbmNlIG1vc3QgTVAzIGRlY29kZXJzIHdpbGwgdHJ1bmNhdGUgZGF0YQord2hpY2ggZGVjb2RlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMyNzY4LiAgCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0cmljdCBJU08gY29tcGxpZW5jZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tc3RyaWN0bHktZW5mb3JjZS1JU08gICAKKworV2l0aCB0aGlzIG9wdGlvbiwgTEFNRSB3aWxsIGVuZm9yY2UgdGhlIDc2ODAgYml0IGxpbWl0YXRpb24gb24KK3RvdGFsIGZyYW1lIHNpemUuICBUaGlzIHJlc3VsdHMgaW4gbWFueSB3YXN0ZWQgYml0cyBmb3IKK2hpZ2ggYml0cmF0ZSBlbmNvZGluZ3MuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2Rpc2FibGUgVkJSIHRhZworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy10ICAgICAgICAgICAgICAKKworRGlzYWJsZSB3cml0aW5nIG9mIHRoZSBWQlIgVGFnIChvbmx5IHZhbGlkIGlmIC12IGZsYWcgaXMKK3NwZWNpZmllZCkgVGhpcyB0YWcgaW4gZW1iZWRkZWQgaW4gZnJhbWUgMCBvZiB0aGUgTVAzIGZpbGUuICBJdCBsZXRzCitWQlIgYXdhcmUgcGxheWVycyBjb3JyZWN0bHkgc2VlayBhbmQgY29tcHV0ZSBwbGF5aW5nIHRpbWVzIG9mIFZCUgorZmlsZXMuCisKK1doZW4gJy0tZGVjb2RlJyBpcyBzcGVjaWZpZWQgKGRlY29kZSBtcDMgdG8gd2F2KSwgdGhpcyBmbGFnIHdpbGwgCitkaXNhYmxlIHdyaXRpbmcgdGhlIFdBViBoZWFkZXIuICBUaGUgb3V0cHV0IHdpbGwgYmUgcmF3IHBjbSwKK25hdGl2ZSBlbmRpYW4gZm9ybWF0LiAgVXNlIC14IHRvIHN3YXAgYnl0ZXMuCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordmFyaWFibGUgYml0IHJhdGUgIChWQlIpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLXYKKworVHVybiBvbiBWQlIuICBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHlvdSBjYW4gdXNlIFZCUi4gIEkgcGVyc29uYWxseQorbGlrZSB1c2luZyBWQlIgdG8gZ2V0IGZpbGVzIHNsaWdodGx5IGJpZ2dlciB0aGFuIDEyOCBrYnBzIGZpbGVzLCB3aGVyZQordGhlIGV4dHJhIGJpdHMgYXJlIHVzZWQgZm9yIHRoZSBvY2Nhc2lvbmFsIGRpZmZpY3VsdC10by1lbmNvZGUgZnJhbWUuCitGb3IgdGhpcywgdHJ5IHNwZWNpZnlpbmcgYSBtaW5pbXVtIGJpdHJhdGUgdG8gdXNlIHdpdGggVkJSOgorCitsYW1lIC12ICAgICAgLWIgMTEyICBpbnB1dC53YXYgb3V0cHV0Lm1wMworCitJZiB0aGUgZmlsZSBpcyB0b28gYmlnLCB1c2UgLVYgbiwgd2hlcmUgbiA9IDAuLi45CisKK2xhbWUgLXYgLVYgbiAtYiAxMTIgIGlucHV0LndhdiBvdXRwdXQubXAzCisKKworSWYgeW91IHdhbnQgdG8gdXNlIFZCUiB0byBnZXQgdGhlIG1heGltdW0gY29tcHJlc3Npb24gcG9zc2libGUsCithbmQgZm9yIHRoaXMsIHlvdSBjYW4gdHJ5OiAgCisKK2xhbWUgLXYgIGlucHV0LndhdiBvdXRwdXQubXAzCitsYW1lIC12IC1WIG4gaW5wdXQud2F2IG91dHB1dC5tcDMgICAgICAgICAodG8gdmFyeSBxdWFsaXR5L2ZpbGVzaXplKQorCisKKworCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZCUiBxdWFsaXR5IHNldHRpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistViBuICAgICAgIAorCituID0gMC4uLjkuICBTcGVjaWZpZXMgdGhlIHZhbHVlIG9mIFZCUl9xLgorZGVmYXVsdCA9IDQsICBoaWdoZXN0IHF1YWxpdHkgPSAwLCBzbWFsbGVzdCBmaWxlcyA9IDkKKworVXNpbmcgLVYgNiBvciBoaWdoZXIgKGxvd2VyIHF1YWxpdHkpIGlzIE5PVCBSRUNPTU1FTkRFRC4gIAorQUJSIHdpbGwgcHJvZHVjZSBiZXR0ZXIgcmVzdWx0cy4gIAorCisKK0hvdyBpcyBWQlJfcSB1c2VkPworCitUaGUgdmFsdWUgb2YgVkJSX3EgaW5mbHVlbmNlcyB0d28gYmFzaWMgcGFyYW1ldGVycyBvZiBMQU1FJ3MgcHN5Y2hvCithY291c3RpY3M6CisgYSkgdGhlIGFic29sdXRlIHRocmVzaG9sZCBvZiBoZWFyaW5nCisgYikgdGhlIHNhbXBsZSB0byBub2lzZSByYXRpbworVGhlIGxvd2VyIHRoZSBWQlJfcSB2YWx1ZSB0aGUgbG93ZXIgdGhlIGluamVjdGVkIHF1YW50aXphdGlvbiBub2lzZQord2lsbCBiZS4KKyAKKypOT1RFKiBObyBwc3ktbW9kZWwgaXMgcGVyZmVjdCwgc28gdGhlcmUgY2FuIG9mdGVuIGJlIGRpc3RvcnRpb24gd2hpY2gKK2lzIGF1ZGlibGUgZXZlbiB0aG91Z2ggdGhlIHBzeS1tb2RlbCBjbGFpbXMgaXQgaXMgbm90ISAgVGh1cyB1c2luZyBhCitzbWFsbCBtaW5pbXVtIGJpdHJhdGUgY2FuIHJlc3VsdCBpbiBzb21lIGFnZ3Jlc3NpdmUgY29tcHJlc3Npb24gYW5kCithdWRpYmxlIGRpc3RvcnRpb24gZXZlbiB3aXRoIC1WIDAuICBUaHVzIHVzaW5nIC1WIDAgZG9lcyBub3Qgc291bmQKK2JldHRlciB0aGFuIGEgZml4ZWQgMjU2IGticHMgZW5jb2RpbmcuICBGb3IgZXhhbXBsZTogc3VwcG9zZSBpbiB0aGUgMSBrSHoKK2ZyZXF1ZW5jeSBiYW5kIHRoZSBwc3ktbW9kZWwgY2xhaW1zIDIwIGRCIG9mIGRpc3RvcnRpb24gd2lsbCBub3QgYmUKK2RldGVjdGFibGUgYnkgdGhlIGh1bWFuIGVhciwgc28gTEFNRSBWQlItMCB3aWxsIGNvbXByZXNzIHRoYXQKK2ZyZXF1ZW5jeSBiYW5kIGFzIG11Y2ggYXMgcG9zc2libGUgYW5kIGludHJvZHVjZSBhdCBtb3N0IDIwIGRCIG9mCitkaXN0b3J0aW9uLiAgVXNpbmcgYSBmaXhlZCAyNTYga2JwcyBmcmFtZXNpemUsIExBTUUgY291bGQgZW5kIHVwCitpbnRyb2R1Y2luZyBvbmx5IDIgZEIgb2YgZGlzdG9ydGlvbi4gIElmIHRoZSBwc3ktbW9kZWwgd2FzIGNvcnJlY3QsCit0aGV5IHdpbGwgYm90aCBzb3VuZCB0aGUgc2FtZS4gIElmIHRoZSBwc3ktbW9kZWwgd2FzIHdyb25nLCB0aGUgVkJSLTAKK3Jlc3VsdCBjYW4gc291bmQgd29yc2UuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N3YXBieXRlcyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy14CisKK3N3YXAgYnl0ZXMgaW4gdGhlIGlucHV0IGZpbGUgKGFuZCBvdXRwdXQgZmlsZSB3aGVuIHVzaW5nIC0tZGVjb2RlKS4KK0ZvciBzb3J0aW5nIG91dCBsaXR0bGUgZW5kaWFuL2JpZyBlbmRpYW4gdHlwZSBwcm9ibGVtcy4gIElmIHlvdXIKK2VuY29kaW5ncyBzb3VuZCBsaWtlIHN0YXRpYywgdHJ5IHRoaXMgZmlyc3QuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitXaW5kb3cgYW5kIE9TLzIgcHJvY2VzcyBwcmlvcml0eSBjb250cm9sICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS1wcmlvcml0eSA8dHlwZT4KKworKFdpbmRvd3MgYW5kIE9TLzIgb25seSkKKworU2V0cyB0aGUgcHJvY2VzcyBwcmlvcml0eSBmb3IgTEFNRSB3aGlsZSBydW5uaW5nIHVuZGVyIElCTSBPUy8yLgorVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgdG8gYXZvaWQgdGhlIHN5c3RlbSBiZWNvbWluZyBzbG93IGFuZC9vcgordW5yZXNwb25zaXZlLiBCeSBzZXR0aW5nIExBTUUgdG8gcnVuIGluIGEgbG93ZXIgcHJpb3JpdHksIHlvdSBsZWF2ZQorbW9yZSB0aW1lIGZvciB0aGUgc3lzdGVtIHRvIHVwZGF0ZSBiYXNpYyBwcm9jZXNzaW5nIChkcmF3aW5nIHdpbmRvd3MsCitwb2xsaW5nIGtleWJvYXJkL21vdXNlLCBldGMpLiBUaGUgaW1wYWN0IGluIExBTUUncyBwZXJmb3JtYW5jZSBpcyAKK21pbmltYWwgaWYgeW91IHVzZSBwcmlvcml0eSAwIHRvIDIuCisKK1RoZSB2YWxpZCBwYXJhbWV0ZXJzIGFyZToKKworICAgICAwID0gTG93IHByaW9yaXR5IChJRExFLCBkZWx0YSA9IDApCisgICAgIDEgPSBNZWRpdW0gcHJpb3JpdHkgKElETEUsIGRlbHRhID0gKzMxKQorICAgICAyID0gUmVndWxhciBwcmlvcml0eSAoUkVHVUxBUiwgZGVsdGEgPSAtMzEpCisgICAgIDMgPSBIaWdoIHByaW9yaXR5IChSRUdVTEFSLCBkZWx0YSA9IDApCisgICAgIDQgPSBNYXhpbXVtIHByaW9yaXR5IChSRUdVTEFSLCBkZWx0YSA9ICszMSkgCisKK05vdGUgdGhhdCBpZiB5b3UgY2FsbCAnLS1wcmlvcml0eScgd2l0aG91dCBhIHBhcmFtZXRlciwgdGhlbiAKK3ByaW9yaXR5IDAgd2lsbCBiZSBhc3N1bWVkLgorIAorCisgIAorCmRpZmYgLS1naXQgYS9hY2luY2x1ZGUubTQgYi9hY2luY2x1ZGUubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4Zjg2OQotLS0gL2Rldi9udWxsCisrKyBiL2FjaW5jbHVkZS5tNApAQCAtMCwwICsxLDg4IEBACitkbmwgYWNpbmNsdWRlLm00LiBDaGFuZ2UgKnRoaXMqIGZpbGUgdG8gYWRkIG5ldyBvciBjaGFuZ2UgbWFjcm9zLgorZG5sIFdoZW4gY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSwgZGVsZXRlIGFjbG9jYWwubTQgYW5kIHJ1bgorZG5sICJhY2xvY2FsIi4KK2RubAorZG5sIERPIE5PVCBjaGFuZ2UgYWNsb2NhbC5tNCAhCitkbmwKKworZG5sICogTEFfU0VBUkNIX0ZJTEUodmFyaWFibGUsIGZpbGVuYW1lLCBQQVRIKQorZG5sICogU2VhcmNoICJmaWxlbmFtZSIgaW4gdGhlIHNwZWNpZmllZCAiUEFUSCIsICJ2YXJpYWJsZSIgd2lsbCAKK2RubCAqIGNvbnRhaW4gdGhlIGZ1bGwgcGF0aG5hbWUgb3IgdGhlIGVtcHR5IHN0cmluZworZG5sICogUEFUSCBpcyBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3Rvcmllcy4KK2RubCAqIGJ5IEZsb3JpYW4gQm9tZXJzCisKK0FDX0RFRlVOKFtMQV9TRUFSQ0hfRklMRV0sWworICAkMT0KKyAgZG5sIGhhY2s6IGVsaW1pbmF0ZSBsaW5lIGZlZWRzIGluICQyCisgIGZvciBGSUxFIGluICQyOyBkbworICAgIGZvciBESVIgaW4gJDM7IGRvCisgICAgICBkbmwgdXNlIFBBVEggaW4gb3JkZXIKKyAgICAgIGlmIHRlc3QgIi4kMSI9Ii4iICYmIHRlc3QgLWYgIiRESVIvJEZJTEUiOyB0aGVuCisgICAgICAgICQxPSRESVIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitdKQorCitkbmwgKiBMQV9TRUFSQ0hfTElCKGxpYi12YXJpYWJsZSwgaW5jbHVkZS12YXJpYWJsZSwgbGliLWZpbGVuYW1lLCBoZWFkZXItZmlsZW5hbWUsIHByZWZpeCkKK2RubCAqIGxvb2tzIGZvciAibGliLWZpbGVuYW1lIiBhbmQgImhlYWRlci1maWxlbmFtZSIgaW4gdGhlIGFyZWEgb2YgInByZWZpeCIuCitkbmwgKiBpZiBmb3VuZCwgImxpYi12YXJpYWJsZSIgYW5kICJpbmNsdWRlLXZhcmlhYmxlIiBhcmUgc2V0IHRvIHRoZQorZG5sICogcmVzcGVjdGl2ZSBwYXRocy4KK2RubCAqIHByZWZpeCBpcyBhIHNpbmdsZSBwYXRoCitkbmwgKiBsaWJzIGFyZSBzZWFyY2hlZCBpbiBwcmVmaXgsIHByZWZpeC9saWIsIHByZWZpeC8uLiwgcHJlZml4Ly4uL2xpYgorZG5sICogaGVhZGVycyBhcmUgc2VhcmNoZWQgaW4gcHJlZml4LCBwcmVmaXgvaW5jbHVkZSwgcHJlZml4Ly4uLCBwcmVmaXgvLi4vaW5jbHVkZQorZG5sICogCitkbmwgKiBJZiBvbmUgb2YgdGhlbSBpcyBub3QgZm91bmQsIGJvdGggImxpYi12YXJpYWJsZSIsICJpbmNsdWRlLXZhcmlhYmxlIiBhcmUgCitkbmwgKiBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZy4KK2RubCAqCitkbmwgKiBUT0RPOiBhc3NlcnQgZnVuY3Rpb24gY2FsbCB0byB2ZXJpZnkgbGliCitkbmwgKgorZG5sICogYnkgRmxvcmlhbiBCb21lcnMKKworQUNfREVGVU4oW0xBX1NFQVJDSF9MSUJdLFsKKyAgZG5sIGxvb2sgZm9yIGxpYgorICBMQV9TRUFSQ0hfRklMRSgkMSwgJDMsICQ1ICQ1L2xpYiAkNS8uLiAkNS8uLi9saWIpCisgIGRubCBsb29rIGZvciBoZWFkZXIuCisgIExBX1NFQVJDSF9GSUxFKCQyLCAkNCwgJDUgJDUvaW5jbHVkZSAkNS8uLiAkNS8uLi9pbmNsdWRlKQorICBpZiB0ZXN0ICIuJDEiID0gIi4iIHx8IHRlc3QgIi4kMiIgPSAiLiI7IHRoZW4KKyAgICAkMT0KKyAgICAkMj0KKyAgZmkKK10pCisKKworIAorCisjIGFsZXhfSUVFRTg1NF9GTE9BVDgwCisjIC0tLS0tLS0tLS0tLQorQUNfREVGVU4oW2FsZXhfSUVFRTg1NF9GTE9BVDgwXSwKK1tBQ19DQUNIRV9DSEVDSyhmb3IgSUVFRTg1NCBjb21wbGlhbnQgODAgYml0IGZsb2F0cywgYWxleF9jdl9pZWVlODU0X2Zsb2F0ODAsCitbQUNfVFJZX1JVTihbCitpbnQgICBmbG9hdDJsb25nX0lFRUVfY29tcGxpYW5jZSAoIHZvaWQgKQoreworICAgIHN0cnVjdCB7CisgICAgICAgIGxvbmcgcGFkZGluZzsgLyogdG8gcHJldmVudCB1bmFsaWduZWQgYWNjZXNzICovCisgICAgICAgIGZsb2F0ICBmOworICAgIH0gczsKKyAgICBzLmYgPSAxMjU4MjkxMi47IGlmICggKihsb25nKikoJnMuZikgIT0gMTI2MjQ4NTUwNGwgKSByZXR1cm4gMDsKKyAgICBzLmYgPSAxMjYxNTY3OS47IGlmICggKihsb25nKikoJnMuZikgIT0gMTI2MjUxODI3MWwgKSByZXR1cm4gMDsKKyAgICBzLmYgPSAxMzU4MjkxMi47IGlmICggKihsb25nKikoJnMuZikgIT0gMTI2MzQ4NTUwNGwgKSByZXR1cm4gMDsKKyAgICBzLmYgPSAxMjU1MDE0NS47IGlmICggKihsb25nKikoJnMuZikgIT0gMTI2MjQ1MjczN2wgKSByZXR1cm4gMDsKKyAgICBzLmYgPSAxMTU4MjkxMi47IGlmICggKihsb25nKikoJnMuZikgIT0gMTI2MTQ4NTUwNGwgKSByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgcmV0dmFsID0gZmxvYXQybG9uZ19JRUVFX2NvbXBsaWFuY2UoKTsKKworICAgIC8qIG5vIGVycm9yIHJldHVybiAtPiBzdWNjZXNzICovCisgICAgcmV0dXJuICFyZXR2YWw7Cit9CitdLCBhbGV4X2N2X2llZWU4NTRfZmxvYXQ4MD15ZXMsIGFsZXhfY3ZfaWVlZTg1NF9mbG9hdDgwPW5vLAorW0FDX01TR19XQVJOKGNhbid0IGNoZWNrIGZvciBJRUVFODU0IGNvbXBsaWFudCA4MCBiaXQgZmxvYXRzKV0KKyldKV0pICMgYWxleF9JRUVFODU0X0ZMT0FUODAKKworCmRpZmYgLS1naXQgYS9hY2xvY2FsLm00IGIvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTZlY2EyCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC5tNApAQCAtMCwwICsxLDc4NjQgQEAKKyMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjEwIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCisjIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCittNF9pZihtNF9QQUNLQUdFX1ZFUlNJT04sIFsyLjYxXSwsCitbbTRfZmF0YWwoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjYxLgorWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoYXQsCit5b3Ugc2hvdWxkIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS5dLCBbNjNdKV0pCisKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBHVEsrCisjIE93ZW4gVGF5bG9yICAgICA5Ny0xMS0zCisKK2RubCBBTV9QQVRIX0dUSyhbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkQgWywgTU9EVUxFU11dXV0pCitkbmwgVGVzdCBmb3IgR1RLLCBhbmQgZGVmaW5lIEdUS19DRkxBR1MgYW5kIEdUS19MSUJTCitkbmwKK0FDX0RFRlVOKEFNX1BBVEhfR1RLLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzIGZyb20gdGhlIGd0ay1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGd0ay1wcmVmaXgsWyAgLS13aXRoLWd0ay1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIEdUSyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBndGtfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBndGtfY29uZmlnX3ByZWZpeD0iIikKK0FDX0FSR19XSVRIKGd0ay1leGVjLXByZWZpeCxbICAtLXdpdGgtZ3RrLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBHVEsgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLAorICAgICAgICAgICAgZ3RrX2NvbmZpZ19leGVjX3ByZWZpeD0iJHdpdGh2YWwiLCBndGtfY29uZmlnX2V4ZWNfcHJlZml4PSIiKQorQUNfQVJHX0VOQUJMRShndGt0ZXN0LCBbICAtLWRpc2FibGUtZ3RrdGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgR1RLIHByb2dyYW1dLAorCQkgICAgLCBlbmFibGVfZ3RrdGVzdD15ZXMpCisKKyAgZm9yIG1vZHVsZSBpbiAuICQ0CisgIGRvCisgICAgICBjYXNlICIkbW9kdWxlIiBpbgorICAgICAgICAgZ3RocmVhZCkgCisgICAgICAgICAgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIGd0aHJlYWQiCisgICAgICAgICA7OworICAgICAgZXNhYworICBkb25lCisKKyAgaWYgdGVzdCB4JGd0a19jb25maWdfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIC0tZXhlYy1wcmVmaXg9JGd0a19jb25maWdfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R1RLX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdUS19DT05GSUc9JGd0a19jb25maWdfZXhlY19wcmVmaXgvYmluL2d0ay1jb25maWcKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGd0a19jb25maWdfcHJlZml4ICE9IHggOyB0aGVuCisgICAgIGd0a19jb25maWdfYXJncz0iJGd0a19jb25maWdfYXJncyAtLXByZWZpeD0kZ3RrX2NvbmZpZ19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R1RLX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdUS19DT05GSUc9JGd0a19jb25maWdfcHJlZml4L2Jpbi9ndGstY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgQUNfUEFUSF9QUk9HKEdUS19DT05GSUcsIGd0ay1jb25maWcsIG5vKQorICBtaW5fZ3RrX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjk5LjcsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgR1RLIC0gdmVyc2lvbiA+PSAkbWluX2d0a192ZXJzaW9uKQorICBub19ndGs9IiIKKyAgaWYgdGVzdCAiJEdUS19DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19ndGs9eWVzCisgIGVsc2UKKyAgICBHVEtfQ0ZMQUdTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgIEdUS19MSUJTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tbGlic2AKKyAgICBndGtfY29uZmlnX21ham9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBndGtfY29uZmlnX21pbm9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICBndGtfY29uZmlnX21pY3JvX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGt0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkR1RLX0NGTEFHUyIKKyAgICAgIExJQlM9IiRHVEtfTElCUyAkTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIEdUSyBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgZ3RrLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBybSAtZiBjb25mLmd0a3Rlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgCittYWluICgpCit7CisgIGludCBtYWpvciwgbWlub3IsIG1pY3JvOworICBjaGFyICp0bXBfdmVyc2lvbjsKKworICBzeXN0ZW0gKCJ0b3VjaCBjb25mLmd0a3Rlc3QiKTsKKworICAvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KKyAgdG1wX3ZlcnNpb24gPSBnX3N0cmR1cCgiJG1pbl9ndGtfdmVyc2lvbiIpOworICBpZiAoc3NjYW5mKHRtcF92ZXJzaW9uLCAiJWQuJWQuJWQiLCAmbWFqb3IsICZtaW5vciwgJm1pY3JvKSAhPSAzKSB7CisgICAgIHByaW50ZigiJXMsIGJhZCB2ZXJzaW9uIHN0cmluZ1xuIiwgIiRtaW5fZ3RrX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICBpZiAoKGd0a19tYWpvcl92ZXJzaW9uICE9ICRndGtfY29uZmlnX21ham9yX3ZlcnNpb24pIHx8CisgICAgICAoZ3RrX21pbm9yX3ZlcnNpb24gIT0gJGd0a19jb25maWdfbWlub3JfdmVyc2lvbikgfHwKKyAgICAgIChndGtfbWljcm9fdmVyc2lvbiAhPSAkZ3RrX2NvbmZpZ19taWNyb192ZXJzaW9uKSkKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdndGstY29uZmlnIC0tdmVyc2lvbicgcmV0dXJuZWQgJWQuJWQuJWQsIGJ1dCBHVEsrICglZC4lZC4lZClcbiIsIAorICAgICAgICAgICAgICRndGtfY29uZmlnX21ham9yX3ZlcnNpb24sICRndGtfY29uZmlnX21pbm9yX3ZlcnNpb24sICRndGtfY29uZmlnX21pY3JvX3ZlcnNpb24sCisgICAgICAgICAgICAgZ3RrX21ham9yX3ZlcnNpb24sIGd0a19taW5vcl92ZXJzaW9uLCBndGtfbWljcm9fdmVyc2lvbik7CisgICAgICBwcmludGYgKCIqKiogd2FzIGZvdW5kISBJZiBndGstY29uZmlnIHdhcyBjb3JyZWN0LCB0aGVuIGl0IGlzIGJlc3RcbiIpOworICAgICAgcHJpbnRmICgiKioqIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb24gb2YgR1RLKy4gWW91IG1heSBhbHNvIGJlIGFibGUgdG8gZml4IHRoZSBlcnJvclxuIik7CisgICAgICBwcmludGYoIioqKiBieSBtb2RpZnlpbmcgeW91ciBMRF9MSUJSQVJZX1BBVEggZW52aXJvbWVudCB2YXJpYWJsZSwgb3IgYnkgZWRpdGluZ1xuIik7CisgICAgICBwcmludGYoIioqKiAvZXRjL2xkLnNvLmNvbmYuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCBpc1xuIik7CisgICAgICBwcmludGYoIioqKiByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbS5cbiIpOworICAgICAgcHJpbnRmKCIqKiogSWYgZ3RrLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR1RLX0NPTkZJR1xuIik7CisgICAgICBwcmludGYoIioqKiB0byBwb2ludCB0byB0aGUgY29ycmVjdCBjb3B5IG9mIGd0ay1jb25maWcsIGFuZCByZW1vdmUgdGhlIGZpbGUgY29uZmlnLmNhY2hlXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGJlZm9yZSByZS1ydW5uaW5nIGNvbmZpZ3VyZVxuIik7CisgICAgfSAKKyNpZiBkZWZpbmVkIChHVEtfTUFKT1JfVkVSU0lPTikgJiYgZGVmaW5lZCAoR1RLX01JTk9SX1ZFUlNJT04pICYmIGRlZmluZWQgKEdUS19NSUNST19WRVJTSU9OKQorICBlbHNlIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gIT0gR1RLX01BSk9SX1ZFUlNJT04pIHx8CisJICAgKGd0a19taW5vcl92ZXJzaW9uICE9IEdUS19NSU5PUl9WRVJTSU9OKSB8fAorICAgICAgICAgICAoZ3RrX21pY3JvX3ZlcnNpb24gIT0gR1RLX01JQ1JPX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIHByaW50ZigiKioqIEdUSysgaGVhZGVyIGZpbGVzICh2ZXJzaW9uICVkLiVkLiVkKSBkbyBub3QgbWF0Y2hcbiIsCisJICAgICBHVEtfTUFKT1JfVkVSU0lPTiwgR1RLX01JTk9SX1ZFUlNJT04sIEdUS19NSUNST19WRVJTSU9OKTsKKyAgICAgIHByaW50ZigiKioqIGxpYnJhcnkgKHZlcnNpb24gJWQuJWQuJWQpXG4iLAorCSAgICAgZ3RrX21ham9yX3ZlcnNpb24sIGd0a19taW5vcl92ZXJzaW9uLCBndGtfbWljcm9fdmVyc2lvbik7CisgICAgfQorI2VuZGlmIC8qIGRlZmluZWQgKEdUS19NQUpPUl9WRVJTSU9OKSAuLi4gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICAgKChndGtfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICAgICAoKGd0a19tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoZ3RrX21pbm9yX3ZlcnNpb24gPT0gbWlub3IpICYmIChndGtfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJcbioqKiBBbiBvbGQgdmVyc2lvbiBvZiBHVEsrICglZC4lZC4lZCkgd2FzIGZvdW5kLlxuIiwKKyAgICAgICAgICAgICAgIGd0a19tYWpvcl92ZXJzaW9uLCBndGtfbWlub3JfdmVyc2lvbiwgZ3RrX21pY3JvX3ZlcnNpb24pOworICAgICAgICBwcmludGYoIioqKiBZb3UgbmVlZCBhIHZlcnNpb24gb2YgR1RLKyBuZXdlciB0aGFuICVkLiVkLiVkLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2ZcbiIsCisJICAgICAgIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgICBwcmludGYoIioqKiBHVEsrIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSBmdHA6Ly9mdHAuZ3RrLm9yZy5cbiIpOworICAgICAgICBwcmludGYoIioqKlxuIik7CisgICAgICAgIHByaW50ZigiKioqIElmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGEgc3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uLCB0aGlzIGVycm9yXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgd3JvbmcgY29weSBvZiB0aGUgZ3RrLWNvbmZpZyBzaGVsbCBzY3JpcHQgaXNcbiIpOworICAgICAgICBwcmludGYoIioqKiBiZWluZyBmb3VuZC4gVGhlIGVhc2llc3Qgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb25cbiIpOworICAgICAgICBwcmludGYoIioqKiBvZiBHVEsrLCBidXQgeW91IGNhbiBhbHNvIHNldCB0aGUgR1RLX0NPTkZJRyBlbnZpcm9ubWVudCB0byBwb2ludCB0byB0aGVcbiIpOworICAgICAgICBwcmludGYoIioqKiBjb3JyZWN0IGNvcHkgb2YgZ3RrLWNvbmZpZy4gKEluIHRoaXMgY2FzZSwgeW91IHdpbGwgaGF2ZSB0b1xuIik7CisgICAgICAgIHByaW50ZigiKioqIG1vZGlmeSB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZlxuIik7CisgICAgICAgIHByaW50ZigiKioqIHNvIHRoYXQgdGhlIGNvcnJlY3QgbGlicmFyaWVzIGFyZSBmb3VuZCBhdCBydW4tdGltZSkpXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiAxOworfQorXSwsIG5vX2d0az15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fZ3RrIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJEdUS19DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICAgICBlY2hvICIqKiogVGhlIGd0ay1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBHVEsgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBHVEsgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICAgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgR1RLX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBndGstY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5ndGt0ZXN0IDsgdGhlbgorICAgICAgICA6CisgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIEdUSyB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdUS19DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJEdUS19MSUJTIgorICAgICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK10sICAgICAgWyByZXR1cm4gKChndGtfbWFqb3JfdmVyc2lvbikgfHwgKGd0a19taW5vcl92ZXJzaW9uKSB8fCAoZ3RrX21pY3JvX3ZlcnNpb24pKTsgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBHVEsgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgR1RLLiBJZiBpdCBpcyBub3QgZmluZGluZyBHVEssIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiCisgICAgICAgICAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhIFJlZEhhdCA1LjAgc3lzdGVtLCB5b3Ugc2hvdWxkIHJlbW92ZSB0aGUgR1RLIHBhY2thZ2UgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogY2FtZSB3aXRoIHRoZSBzeXN0ZW0gd2l0aCB0aGUgY29tbWFuZCIKKyAgICAgICAgICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqICAgIHJwbSAtLWVyYXNlIC0tbm9kZXBzIGd0ayBndGstZGV2ZWwiIF0sCisgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGUgb3IgbGluay4gU2VlIHRoZSBmaWxlIGNvbmZpZy5sb2cgZm9yIHRoZSIKKyAgICAgICAgICBlY2hvICIqKiogZXhhY3QgZXJyb3IgdGhhdCBvY2N1cmVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgR1RLIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgR1RLIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91IgorICAgICAgICAgIGVjaG8gIioqKiBtYXkgd2FudCB0byBlZGl0IHRoZSBndGstY29uZmlnIHNjcmlwdDogJEdUS19DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgICBmaQorICAgICBmaQorICAgICBHVEtfQ0ZMQUdTPSIiCisgICAgIEdUS19MSUJTPSIiCisgICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgIGZpCisgIEFDX1NVQlNUKEdUS19DRkxBR1MpCisgIEFDX1NVQlNUKEdUS19MSUJTKQorICBybSAtZiBjb25mLmd0a3Rlc3QKK10pCisKKyMgbGlidG9vbC5tNCAtIENvbmZpZ3VyZSBsaWJ0b29sIGZvciB0aGUgaG9zdCBzeXN0ZW0uIC0qLUF1dG9jb25mLSotCisKKyMgc2VyaWFsIDUxIEFDX1BST0dfTElCVE9PTAorCisKKyMgQUNfUFJPVklERV9JRkVMU0UoTUFDUk8tTkFNRSwgSUYtUFJPVklERUQsIElGLU5PVC1QUk9WSURFRCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWYgdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCBieSBBdXRvY29uZiwgZGVmaW5lIGl0IGhlcmUuCittNF9pZmRlZihbQUNfUFJPVklERV9JRkVMU0VdLAorICAgICAgICAgW10sCisgICAgICAgICBbbTRfZGVmaW5lKFtBQ19QUk9WSURFX0lGRUxTRV0sCisJICAgICAgICAgW200X2lmZGVmKFtBQ19QUk9WSURFXyQxXSwKKwkJICAgICAgICAgICBbJDJdLCBbJDNdKV0pXSkKKworCisjIEFDX1BST0dfTElCVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19QUk9HX0xJQlRPT0xdLAorW0FDX1JFUVVJUkUoW19BQ19QUk9HX0xJQlRPT0xdKWRubAorZG5sIElmIEFDX1BST0dfQ1hYIGhhcyBhbHJlYWR5IGJlZW4gZXhwYW5kZWQsIHJ1biBBQ19MSUJUT09MX0NYWAorZG5sIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UsIGhvb2sgaXQgaW4gYXQgdGhlIGVuZCBvZiBBQ19QUk9HX0NYWC4KKyAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKyAgICBbQUNfTElCVE9PTF9DWFhdLAorICAgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwgZGVmbihbQUNfUFJPR19DWFhdKVtBQ19MSUJUT09MX0NYWAorICBdKV0pCitkbmwgQW5kIGEgc2ltaWxhciBzZXR1cCBmb3IgRm9ydHJhbiA3NyBzdXBwb3J0CisgIEFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0Y3N10sCisgICAgW0FDX0xJQlRPT0xfRjc3XSwKKyAgICBbZGVmaW5lKFtBQ19QUk9HX0Y3N10sIGRlZm4oW0FDX1BST0dfRjc3XSlbQUNfTElCVE9PTF9GNzcKK10pXSkKKworZG5sIFF1b3RlIEFdW01fUFJPR19HQ0ogc28gdGhhdCBhY2xvY2FsIGRvZXNuJ3QgYnJpbmcgaXQgaW4gbmVlZGxlc3NseS4KK2RubCBJZiBlaXRoZXIgQUNfUFJPR19HQ0ogb3IgQV1bTV9QUk9HX0dDSiBoYXZlIGFscmVhZHkgYmVlbiBleHBhbmRlZCwgcnVuCitkbmwgQUNfTElCVE9PTF9HQ0ogaW1tZWRpYXRlbHksIG90aGVyd2lzZSwgaG9vayBpdCBpbiBhdCB0aGUgZW5kIG9mIGJvdGguCisgIEFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCisgICAgW0FDX0xJQlRPT0xfR0NKXSwKKyAgICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAorICAgICAgW0FDX0xJQlRPT0xfR0NKXSwKKyAgICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfQUNfUFJPR19HQ0pdLAorCVtBQ19MSUJUT09MX0dDSl0sCisgICAgICBbaWZkZWYoW0FDX1BST0dfR0NKXSwKKwkgICAgIFtkZWZpbmUoW0FDX1BST0dfR0NKXSwgZGVmbihbQUNfUFJPR19HQ0pdKVtBQ19MSUJUT09MX0dDSl0pXSkKKyAgICAgICBpZmRlZihbQV1bTV9QUk9HX0dDSl0sCisJICAgICBbZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0FDX0xJQlRPT0xfR0NKXSldKQorICAgICAgIGlmZGVmKFtMVF9BQ19QUk9HX0dDSl0sCisJICAgICBbZGVmaW5lKFtMVF9BQ19QUk9HX0dDSl0sCisJCWRlZm4oW0xUX0FDX1BST0dfR0NKXSlbQUNfTElCVE9PTF9HQ0pdKV0pXSldKQorXSldKSMgQUNfUFJPR19MSUJUT09MCisKKworIyBfQUNfUFJPR19MSUJUT09MCisjIC0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQUNfUFJPR19MSUJUT09MXSwKK1tBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKK0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX0NYWF0pZG5sCitBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9GNzddKWRubAorQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfR0NKXSlkbmwKKworIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAorTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKK0FDX1NVQlNUKExJQlRPT0wpZG5sCisKKyMgUHJldmVudCBtdWx0aXBsZSBleHBhbnNpb24KK2RlZmluZShbQUNfUFJPR19MSUJUT09MXSwgW10pCitdKSMgX0FDX1BST0dfTElCVE9PTAorCisKKyMgQUNfTElCVE9PTF9TRVRVUAorIyAtLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9TRVRVUF0sCitbQUNfUFJFUkVRKDIuNTApZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCisKK0FDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCitBQ19SRVFVSVJFKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0pZG5sCisjIEF1dG9jb25mIDIuMTMncyBBQ19PQkpFWFQgYW5kIEFDX0VYRUVYVCBtYWNyb3Mgb25seSB3b3JrcyBmb3IgQyBjb21waWxlcnMhCitBQ19SRVFVSVJFKFtBQ19PQkpFWFRdKWRubAorQUNfUkVRVUlSRShbQUNfRVhFRVhUXSlkbmwKK2RubAorCitBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgorQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCitBQ19MSUJUT09MX09CSkRJUgorCitBQ19SRVFVSVJFKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSlkbmwKK19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNICisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIDFzL15YLy8nCitbc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYCRcXFxcXVwpL1xcXDEvZyddCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorW2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZyddCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCisjIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCitkZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworCisjIENvbnN0YW50czoKK3JtPSJybSAtZiIKKworIyBHbG9iYWwgdmFyaWFibGVzOgorZGVmYXVsdF9vZmlsZT1saWJ0b29sCitjYW5fYnVpbGRfc2hhcmVkPXllcworCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTVNWQywKKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KK2xpYmV4dD1hCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKK29maWxlPSIkZGVmYXVsdF9vZmlsZSIKK3dpdGhfZ251X2xkPSIkbHRfY3ZfcHJvZ19nbnVfbGQiCisKK0FDX0NIRUNLX1RPT0woQVIsIGFyLCBmYWxzZSkKK0FDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCitBQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJEFSIiAmJiBBUj1hcgordGVzdCAteiAiJEFSX0ZMQUdTIiAmJiBBUl9GTEFHUz1jcnUKK3Rlc3QgLXogIiRBUyIgJiYgQVM9YXMKK3Rlc3QgLXogIiRDQyIgJiYgQ0M9Y2MKK3Rlc3QgLXogIiRMVENDIiAmJiBMVENDPSRDQwordGVzdCAteiAiJExUQ0ZMQUdTIiAmJiBMVENGTEFHUz0kQ0ZMQUdTCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCit0ZXN0IC16ICIkTEQiICYmIExEPWxkCit0ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQordGVzdCAteiAiJFNFRCIgJiYgU0VEPXNlZAordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJG9sZGxpYiIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKK2ZpCisKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0CitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICBBQ19QQVRIX01BR0lDCisgIGZpCisgIDs7Citlc2FjCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19MSUJUT09MX0RMT1BFTl0sIGVuYWJsZV9kbG9wZW49eWVzLCBlbmFibGVfZGxvcGVuPW5vKQorQUNfUFJPVklERV9JRkVMU0UoW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK2VuYWJsZV93aW4zMl9kbGw9eWVzLCBlbmFibGVfd2luMzJfZGxsPW5vKQorCitBQ19BUkdfRU5BQkxFKFtsaWJ0b29sLWxvY2tdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisJW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCitBQ19BUkdfV0lUSChbcGljXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1waWNdLAorCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCisgICAgW3BpY19tb2RlPSIkd2l0aHZhbCJdLAorICAgIFtwaWNfbW9kZT1kZWZhdWx0XSkKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9ZGVmYXVsdAorCisjIFVzZSBDIGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJ0b29sIHNjcmlwdAordGFnbmFtZT0KK0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJRworX0xUX0FDX1RBR0NPTkZJRworXSkjIEFDX0xJQlRPT0xfU0VUVVAKKworCisjIF9MVF9BQ19TWVNfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19TWVNfQ09NUElMRVJdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCitdKSMgX0xUX0FDX1NZU19DT01QSUxFUgorCisKKyMgX0xUX0NDX0JBU0VOQU1FKENDKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGN1bGF0ZSBjY19iYXNlbmFtZS4gIFNraXAga25vd24gY29tcGlsZXIgd3JhcHBlcnMgYW5kIGNyb3NzLXByZWZpeC4KK0FDX0RFRlVOKFtfTFRfQ0NfQkFTRU5BTUVdLAorW2ZvciBjY190ZW1wIGluICQxIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltbXFwvXV1jb21waWxlIHwgY2NhY2hlIHwgKltbXFwvXV1jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbW1xcL11dZGlzdGNjIHwgcHVyaWZ5IHwgKltbXFwvXV1wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorXSkKKworCisjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGNvbXBpbGVyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgY29tcGlsZXIgdGVzdCBjb2RlLgorQUNfREVGVU4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sCitbQUNfUkVRVUlSRShbTFRfQUNfUFJPR19TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCitdKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorQUNfREVGVU4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAorW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSlkbmwKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKK10pIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KK0FDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwKK1tBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1NFRF0pZG5sCitBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWworbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJL14wLyB7CisJICAgIHMvXjAgICpcKC4qXCkkL1wxLworCSAgICBwCisJfQorICAgIH0nCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KKyAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCitmaV0sW10pCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKK10pIyBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisKKworIyBfTFRfQUNfU0hFTExfSU5JVChBUkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfU0hFTExfSU5JVF0sCitbaWZkZWYoW0FDX0RJVkVSU0lPTl9OT1RJQ0VdLAorCSAgICAgW0FDX0RJVkVSVF9QVVNIKEFDX0RJVkVSU0lPTl9OT1RJQ0UpXSwKKwkgW0FDX0RJVkVSVF9QVVNIKE5PVElDRSldKQorJDEKK0FDX0RJVkVSVF9QT1AKK10pIyBfTFRfQUNfU0hFTExfSU5JVAorCisKKyMgX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIHNvbWUgY29kZSB0byB0aGUgc3RhcnQgb2YgdGhlIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0IHdoaWNoCisjIHdpbGwgZmluZCBhbiBlY2hvIGNvbW1hbmQgd2hpY2ggZG9lc24ndCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitBQ19ERUZVTihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdLAorW19MVF9BQ19TSEVMTF9JTklUKFsKKyMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKK2Nhc2UgWCRFQ0hPIGluCitYKi0tZmFsbGJhY2stZWNobykKKyAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KKyAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcWyRdXFxbJF0wLCdbJF0wJywnYAorICA7OworZXNhYworCitlY2hvPSR7RUNITy1lY2hvfQoraWYgdGVzdCAiWFskXTEiID0gWC0tbm8tcmVleGVjOyB0aGVuCisgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICBzaGlmdAorZWxpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCisgICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKKyAgOgorZWxzZQorICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCisgIGV4ZWMgJFNIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQorZmkKKworaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKK1skXSoKK0VPRgorICBleGl0IDAKK2ZpCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgLXogIiRFQ0hPIjsgdGhlbgoraWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCisjIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKKyAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDJxICJbJF0wIicgJ2VjaG8gdGVzdCc7IGRvCisgICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KKyAgICBpZiAoZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCkgMj4vZGV2L251bGwgJiYKKyAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgICYmCisgICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKKyAgICB0aGVuCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgIDoKK2Vsc2UKKyAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCisgICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKKyAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgIworICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCisKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKKyAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgIGVjaG89IiRkaXIvZWNobyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKworICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KKyAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KKyAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgorICAgICAgZWNobz0ncHJpbnQgLXInCisgICAgZWxpZiAodGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dCkgJiYKKwkgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgorICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCisgICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKKyAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAorICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQorICAgIGVsc2UKKyAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KKyAgICAgIGVjaG89J3ByaW50ZiAlc1xuJworICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisJIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJIyBDb29sLCBwcmludGYgd29ya3MKKwk6CisgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwlDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAorCWV4cG9ydCBDT05GSUdfU0hFTEwKKwlTSEVMTD0iJENPTkZJR19TSEVMTCIKKwlleHBvcnQgU0hFTEwKKwllY2hvPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsc2UKKwkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgorCXByZXY9OgorCisJZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgNTBxICJbJF0wIic7IGRvCisJICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbAorCSAgdGhlbgorCSAgICBicmVhaworCSAgZmkKKwkgIHByZXY9IiRjbWQiCisJZG9uZQorCisJaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICJbJF0wIic7IHRoZW4KKwkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCisJICBleHBvcnQgZWNob190ZXN0X3N0cmluZworCSAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIlskXTAiICR7MSsiWyRdQCJ9CisJZWxzZQorCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KKwkgIGVjaG89ZWNobworCWZpCisgICAgICBmaQorICAgIGZpCisgIGZpCitmaQorZmkKKworIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQorIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCitFQ0hPPSRlY2hvCitpZiB0ZXN0ICJYJEVDSE8iID0gIlgkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorICAgRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXFskXTAgLS1mYWxsYmFjay1lY2hvIgorZmkKKworQUNfU1VCU1QoRUNITykKK10pXSkjIF9MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNICisKKworIyBfTFRfQUNfTE9DSworIyAtLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19MT0NLXSwKK1tBQ19BUkdfRU5BQkxFKFtsaWJ0b29sLWxvY2tdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisJW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICpFTEYtMzIqKQorICAgICAgSFBVWF9JQTY0X01PREU9IjMyIgorICAgICAgOzsKKyAgICAqRUxGLTY0KikKKyAgICAgIEhQVVhfSUE2NF9NT0RFPSI2NCIKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgKjMyLWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJzbWlwIgorICAgICAgOzsKKyAgICAqTjMyKikKKyAgICAgIExEPSIke0xELWxkfSAtbWVsZjMyYm1pcG4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLW1lbGY2NGJtaXAiCisgICAgICA7OworICAgIGVzYWMKKyAgIGVsc2UKKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgKjMyLWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTMyIgorICAgICAgOzsKKyAgICAqTjMyKikKKyAgICAgIExEPSIke0xELWxkfSAtbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgIGZpCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworeDg2XzY0LSprZnJlZWJzZCotZ251fHg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfCBcCitzMzkwKi0qbGludXgqfHNwYXJjKi0qbGludXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICozMi1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisgICAgICAgICAgOzsKKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorICAgICAgICAgIDs7CisgICAgICAgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisgICAgICAgICAgOzsKKyAgICAgICAgczM5MHgtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmM2NC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgeDg2XzY0LSprZnJlZWJzZCotZ251KQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisgICAgICAgICAgOzsKKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisgICAgICAgICAgOzsKKyAgICAgICAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorICAgICAgICAgIDs7CisgICAgICAgIHMzOTAqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfTEFOR19QVVNIKEMpCisgICAgIEFDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKQorICAgICBBQ19MQU5HX1BPUF0pCisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CitzcGFyYyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIgOzsKKyAgICAgICopICAgIExEPSIke0xELWxkfSAtNjQiIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCitBQ19QUk9WSURFX0lGRUxTRShbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorWyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKikKKyAgQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQorICA7OworICBdKQorZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworXSkjIF9MVF9BQ19MT0NLCisKKworIyBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMJCVtPVVRQVVQtRklMRV0sIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLAorW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSkKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICBpZmVsc2UoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBpZmVsc2UoWyQ1XSwgLCA6LCBbJDVdKQorZWxzZQorICAgIGlmZWxzZShbJDZdLCAsIDosIFskNl0pCitmaQorXSkjIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OCisKKworIyBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwKK1tBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1NFRF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkMyIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgJDI9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgICQyPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCitdKQorCitpZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgorICAgIGlmZWxzZShbJDRdLCAsIDosIFskNF0pCitlbHNlCisgICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKK2ZpCitdKSMgQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OCisKKworIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwKK1sjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK0FDX01TR19DSEVDS0lORyhbdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHNdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfbWF4X2NtZF9sZW5dLCBbZG5sCisgIGk9MAorICB0ZXN0c3RyaW5nPSJBQkNEIgorCisgIGNhc2UgJGJ1aWxkX29zIGluCisgIG1zZG9zZGpncHAqKQorICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKKyAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCisgICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKKyAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0CisgICAgOzsKKworICBnbnUqKQorICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcworICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcworICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCisgICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKKyAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCisgICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgorICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQorICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCisgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCisgICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCisgICAgZmkKKyAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICA7OworCisgIGludGVyaXgqKQorICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbIAldXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgICB3aGlsZSAodGVzdCAiWCJgJFNIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvICJYJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCisJICAgICAgID0gIlhYJHRlc3RzdHJpbmciKSA+L2Rldi9udWxsIDI+JjEgJiYKKwkgICAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgorCSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0kbmV3X3Jlc3VsdCAmJgorCSAgICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAorICAgICAgZG8KKyAgICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgdGVzdHN0cmluZz0KKyAgICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24gbWFzc2l2ZQorICAgICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KKyAgICAgICMgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJGx0X2N2X3N5c19tYXhfY21kX2xlbikKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK10pIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgorCisKKyMgX0xUX0FDX0NIRUNLX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0sCitbQUNfQ0hFQ0tfSEVBREVSUyhkbGZjbi5oKWRubAorXSkjIF9MVF9BQ19DSEVDS19ETEZDTgorCisKKyMgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCitbQUNfUkVRVUlSRShbX0xUX0FDX0NIRUNLX0RMRkNOXSlkbmwKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgWyQ0XQorZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK1sjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7CisjZW5kaWYKKwordm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgICAgZXhpdCAoc3RhdHVzKTsKK31dCitFT0YKKyAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSAkMSA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSAkMiA7OworICAgICAgeCRsdF9kbHVua25vd258eCopICQzIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgICQzCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorXSkjIF9MVF9BQ19UUllfRExPUEVOX1NFTEYKKworCisjIEFDX0xJQlRPT0xfRExPUEVOX1NFTEYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19DSEVDS19ETEZDTl0pZG5sCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgZGFyd2luKikKKyAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKKyAgICBBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSxbCisgICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIF0pCisgICA7OworCisgICopCisgICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKKyAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdLAorCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAorCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAorCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAorCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCisJCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCisJICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKKwkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdKQorCSAgICAgIF0pCisJICAgIF0pCisJICBdKQorCV0pCisgICAgICBdKQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKKworICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorCisgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorCSAgbHRfY3ZfZGxvcGVuX3NlbGYsIFtkbmwKKwkgIF9MVF9BQ19UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubywgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MpCisgICAgXSkKKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorICAgIAkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAorCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQorICAgICAgXSkKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCitdKSMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgorCisKKyMgQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgorQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAorW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSlkbmwKK0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2lmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHRdLAorICBbX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpXSwKKyAgW19MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT1ubworICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICRybSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgIHJtZGlyIGNvbmZ0ZXN0CisgICAkcm0gY29uZnRlc3QqCitdKQorXSkjIEFDX0xJQlRPT0xfUFJPR19DQ19DX08KKworCisjIEFDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCitBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfTE9DS10pZG5sCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSkiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rc10pCisgIGhhcmRfbGlua3M9eWVzCisgICRybSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIEFDX01TR19SRVNVTFQoWyRoYXJkX2xpbmtzXSkKKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBgLWMgLW8nLCBzbyBgbWFrZSAtaicgbWF5IGJlIHVuc2FmZV0pCisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCitdKSMgQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTCisKKworIyBBQ19MSUJUT09MX09CSkRJUgorIyAtLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfT0JKRElSXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yIG9iamRpcl0sIFtsdF9jdl9vYmpkaXJdLAorW3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGxdKQorb2JqZGlyPSRsdF9jdl9vYmpkaXIKK10pIyBBQ19MSUJUT09MX09CSkRJUgorCisKKyMgQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sCitbQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zXSkKK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9CitpZiB0ZXN0IC1uICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkiIHx8IFwKKyAgIHRlc3QgLW4gIiRfTFRfQUNfVEFHVkFSKHJ1bnBhdGhfdmFyLCAkMSkiIHx8IFwKKyAgIHRlc3QgIlgkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKSIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCitmaQorQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQorCitpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCitdKSMgQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgKKworCisjIEFDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdLAorW3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGVdKQoraWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8IGdyZXAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgICBkYXJ3aW4qKQorICAgICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCisgICAgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgorICAgICAgICAgb2xkX3N0cmlwbGliPSIkU1RSSVAgLVMiCisgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgIGVsc2UKKyAgQUNfTVNHX1JFU1VMVChbbm9dKQorZmkKKyAgICAgICA7OworICAgKikKKyAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIDs7CisgIGVzYWMKK2ZpCitdKSMgQUNfTElCVE9PTF9TWVNfTElCX1NUUklQCisKKworIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcworQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwKK1tBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1NFRF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK200X2lmKCQxLFtdLFsKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgYXdrICRsdF9hd2tfYXJnIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICBpZiBlY2hvICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBsdF9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgZWxzZQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICBmaQorICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtbbHRfZm9vXV0rKzsgfQorICBpZiAobHRfZnJlcVtbbHRfZm9vXV0gPT0gMSkgeyBwcmludCBsdF9mb287IH0KK30nYAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gJGx0X3NlYXJjaF9wYXRoX3NwZWNgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpXSkKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpW1s0NV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IFtncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIDs7CisgIGVzYWMKKyAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCisgIG00X2lmKFskMV0sIFtdLFsKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIl0pIAorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFtbMTIzXV0qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMDFdXSogfCBmcmVlYnNkZWxmMy5bWzAxXV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1syLTldXSogfCBmcmVlYnNkZWxmMy5bWzItOV1dKiB8IFwKKyAgZnJlZWJzZDQuW1swLTVdXSB8IGZyZWVic2RlbGY0LltbMC01XV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeFtbMy05XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4CisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqIHwgaypic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFxbJF0yKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcWyRdMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsgCV0qaHdjYXBbIAldL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuW1s4OV1dIHwgb3BlbmJzZDIuW1s4OV1dLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCityZG9zKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKyAgICBzaWVtZW5zKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRkeW5hbWljX2xpbmtlcl0pCit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCitdKSMgQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIKKworCisjIF9MVF9BQ19UQUdDT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19UQUdDT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSlkbmwKK0FDX0FSR19XSVRIKFt0YWdzXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC10YWdzQDw6QD1UQUdTQDo+QF0sCisgICAgICAgIFtpbmNsdWRlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgQDw6QGF1dG9tYXRpY0A6PkBdKV0sCisgICAgW3RhZ25hbWVzPSIkd2l0aHZhbCJdKQorCitpZiB0ZXN0IC1mICIkbHRtYWluIiAmJiB0ZXN0IC1uICIkdGFnbmFtZXMiOyB0aGVuCisgIGlmIHRlc3QgISAtZiAiJHtvZmlsZX0iOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW291dHB1dCBmaWxlIGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0XSkKKyAgZmkKKworICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KKyAgICBldmFsICJgJFNIRUxMICR7b2ZpbGV9IC0tY29uZmlnIHwgZ3JlcCAnXkxUQ0M9J2AiCisgICAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCisgICAgICBBQ19NU0dfV0FSTihbb3V0cHV0IGZpbGUgYCRvZmlsZScgZG9lcyBub3QgbG9vayBsaWtlIGEgbGlidG9vbCBzY3JpcHRdKQorICAgIGVsc2UKKyAgICAgIEFDX01TR19XQVJOKFt1c2luZyBgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIGAkb2ZpbGUnXSkKKyAgICBmaQorICBmaQorICBpZiB0ZXN0IC16ICIkTFRDRkxBR1MiOyB0aGVuCisgICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENGTEFHUz0nYCIKKyAgZmkKKworICAjIEV4dHJhY3QgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIGluICRvZmlsZS4KKyAgIyBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoZSBlbnRpcmUgbGlzdCBpcyBvbiBvbmUgbGluZS4KKyAgYXZhaWxhYmxlX3RhZ3M9YGdyZXAgIl5hdmFpbGFibGVfdGFncz0iICIke29maWxlfSIgfCAkU0VEIC1lICdzL2F2YWlsYWJsZV90YWdzPVwoLiokXCkvXDEvJyAtZSAncy9cIi8vZydgCisKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgIGZvciB0YWduYW1lIGluICR0YWduYW1lczsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKKyAgICBjYXNlIGAkZWNobyAiWCR0YWduYW1lIiB8ICRYc2VkIC1lICdzOltbLV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5MCwvXV06OmcnYCBpbgorICAgICIiKSA7OworICAgICopICBBQ19NU0dfRVJST1IoW2ludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lXSkKKwk7OworICAgIGVzYWMKKworICAgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHtvZmlsZX0iID4gL2Rldi9udWxsCisgICAgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFt0YWcgbmFtZSBcIiR0YWduYW1lXCIgYWxyZWFkeSBleGlzdHNdKQorICAgIGZpCisKKyAgICAjIFVwZGF0ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSI7IHRoZW4KKyAgICAgIGVjaG8gYXBwZW5kaW5nIGNvbmZpZ3VyYXRpb24gdGFnIFwiJHRhZ25hbWVcIiB0byAkb2ZpbGUKKworICAgICAgY2FzZSAkdGFnbmFtZSBpbgorICAgICAgQ1hYKQorCWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisJICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorCSAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KKwkgIEFDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHCisJZWxzZQorCSAgdGFnbmFtZT0iIgorCWZpCisJOzsKKworICAgICAgRjc3KQorCWlmIHRlc3QgLW4gIiRGNzciICYmIHRlc3QgIlgkRjc3IiAhPSAiWG5vIjsgdGhlbgorCSAgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBHQ0opCisJaWYgdGVzdCAtbiAiJEdDSiIgJiYgdGVzdCAiWCRHQ0oiICE9ICJYbm8iOyB0aGVuCisJICBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIFJDKQorCUFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcKKwk7OworCisgICAgICAqKQorCUFDX01TR19FUlJPUihbVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lXSkKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFwcGVuZCB0aGUgbmV3IHRhZyBuYW1lIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgorICAgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiIDsgdGhlbgorICAgICAgYXZhaWxhYmxlX3RhZ3M9IiRhdmFpbGFibGVfdGFncyAkdGFnbmFtZSIKKyAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgIyBOb3cgc3Vic3RpdHV0ZSB0aGUgdXBkYXRlZCBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgorICBpZiBldmFsICJzZWQgLWUgJ3MvXmF2YWlsYWJsZV90YWdzPS4qXCQvYXZhaWxhYmxlX3RhZ3M9XCIkYXZhaWxhYmxlX3RhZ3NcIi8nIFwiJG9maWxlXCIgPiBcIiR7b2ZpbGV9VFwiIjsgdGhlbgorICAgIG12ICIke29maWxlfVQiICIkb2ZpbGUiCisgICAgY2htb2QgK3ggIiRvZmlsZSIKKyAgZWxzZQorICAgIHJtIC1mICIke29maWxlfVQiCisgICAgQUNfTVNHX0VSUk9SKFt1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy5dKQorICBmaQorZmkKK10pIyBfTFRfQUNfVEFHQ09ORklHCisKKworIyBBQ19MSUJUT09MX0RMT1BFTgorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBlbmFibGUgY2hlY2tzIGZvciBkbG9wZW4gc3VwcG9ydAorQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwKKyBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKQorXSkjIEFDX0xJQlRPT0xfRExPUEVOCisKKworIyBBQ19MSUJUT09MX1dJTjMyX0RMTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBkZWNsYXJlIHBhY2thZ2Ugc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2luMzIgRExMcworQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK1tBQ19CRUZPUkUoWyQwXSwgW0FDX0xJQlRPT0xfU0VUVVBdKQorXSkjIEFDX0xJQlRPT0xfV0lOMzJfRExMCisKKworIyBBQ19FTkFCTEVfU0hBUkVEKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorQUNfREVGVU4oW0FDX0VOQUJMRV9TSEFSRURdLAorW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKFtzaGFyZWRdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc2hhcmVkQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc2hhcmVkPV1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpCitdKSMgQUNfRU5BQkxFX1NIQVJFRAorCisKKyMgQUNfRElTQUJMRV9TSEFSRUQKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorQUNfRU5BQkxFX1NIQVJFRChubykKK10pIyBBQ19ESVNBQkxFX1NIQVJFRAorCisKKyMgQUNfRU5BQkxFX1NUQVRJQyhbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK0FDX0RFRlVOKFtBQ19FTkFCTEVfU1RBVElDXSwKK1tkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY0A8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyAgICAqKQorICAgICBlbmFibGVfc3RhdGljPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3N0YXRpYz15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc3RhdGljPV1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpCitdKSMgQUNfRU5BQkxFX1NUQVRJQworCisKKyMgQUNfRElTQUJMRV9TVEFUSUMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NUQVRJQ10sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorQUNfRU5BQkxFX1NUQVRJQyhubykKK10pIyBBQ19ESVNBQkxFX1NUQVRJQworCisKKyMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK0FDX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwKK1tkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShbZmFzdC1pbnN0YWxsXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkBdLAorICAgIFtvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gQDw6QGRlZmF1bHQ9XUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKKyAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfZmFzdF9pbnN0YWxsPV1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpCitdKSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTAorCisKKyMgQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubykKK10pIyBBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTAorCisKKyMgQUNfTElCVE9PTF9QSUNNT0RFKFtNT0RFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLXdpdGgtcGljIGZsYWcKKyMgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBib3RoJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLAorW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKK3BpY19tb2RlPWlmZWxzZSgkIywxLCQxLGRlZmF1bHQpCitdKSMgQUNfTElCVE9PTF9QSUNNT0RFCisKKworIyBBQ19QUk9HX0VHUkVQCisjIC0tLS0tLS0tLS0tLS0KKyMgVGhpcyBpcyBwcmVkZWZpbmVkIHN0YXJ0aW5nIHdpdGggQXV0b2NvbmYgMi41NCwgc28gdGhpcyBjb25kaXRpb25hbAorIyBkZWZpbml0aW9uIGNhbiBiZSByZW1vdmVkIG9uY2Ugd2UgcmVxdWlyZSBBdXRvY29uZiAyLjU0IG9yIGxhdGVyLgorbTRfaWZuZGVmKFtBQ19QUk9HX0VHUkVQXSwgW0FDX0RFRlVOKFtBQ19QUk9HX0VHUkVQXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yIGVncmVwXSwgW2FjX2N2X3Byb2dfZWdyZXBdLAorICAgW2lmIGVjaG8gYSB8IChncmVwIC1FICcoYXxiKScpID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4gYWNfY3ZfcHJvZ19lZ3JlcD0nZ3JlcCAtRScKKyAgICBlbHNlIGFjX2N2X3Byb2dfZWdyZXA9J2VncmVwJworICAgIGZpXSkKKyBFR1JFUD0kYWNfY3ZfcHJvZ19lZ3JlcAorIEFDX1NVQlNUKFtFR1JFUF0pCitdKV0pCisKKworIyBBQ19QQVRIX1RPT0xfUFJFRklYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9NQUdJQ19DTUQsCitbY2FzZSAkTUFHSUNfQ01EIGluCitbW1xcLypdIHwgID86W1xcL10qXSkKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCitkbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCitkbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgorICBhY19kdW1teT0iaWZlbHNlKFskMl0sICwgJFBBVEgsIFskMl0pIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kMTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJDEiCisgICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkiZmlsZV9tYWdpYyAiKikKKwkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAorCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCisJICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8CisJICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWNdKQorTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRNQUdJQ19DTUQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorXSkjIEFDX1BBVEhfVE9PTF9QUkVGSVgKKworCisjIEFDX1BBVEhfTUFHSUMKKyMgLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pemUgYSBzaGFyZWQgbGlicmFyeQorQUNfREVGVU4oW0FDX1BBVEhfTUFHSUNdLAorW0FDX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQoraWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgQUNfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQorICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCitdKSMgQUNfUEFUSF9NQUdJQworCisKKyMgQUNfUFJPR19MRAorIyAtLS0tLS0tLS0tCisjIGZpbmQgdGhlIHBhdGhuYW1lIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKK0FDX0RFRlVOKFtBQ19QUk9HX0xEXSwKK1tBQ19BUkdfV0lUSChbZ251LWxkXSwKKyAgICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1nbnUtbGRdLAorCVthc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgQDw6QGRlZmF1bHQ9bm9AOj5AXSldLAorICAgIFt0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXNdLAorICAgIFt3aXRoX2dudV9sZD1ub10pCitBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1NFRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSAkQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKKyAgICAgIHJlX2RpcmVsdD0nL1tbXi9dXVtbXi9dXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorQUNfUFJPR19MRF9HTlUKK10pIyBBQ19QUk9HX0xECisKKworIyBBQ19QUk9HX0xEX0dOVQorIyAtLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX1BST0dfTERfR05VXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGx0X2N2X3Byb2dfZ251X2xkLAorWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KK2Nhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCisgIDs7CisqKQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworICA7OworZXNhY10pCit3aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKK10pIyBBQ19QUk9HX0xEX0dOVQorCisKKyMgQUNfUFJPR19MRF9SRUxPQURfRkxBRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZpbmQgcmVsb2FkIGZsYWcgZm9yIGxpbmtlcgorIyAgIC0tIFBPUlRNRSBTb21lIGxpbmtlcnMgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCitBQ19ERUZVTihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAorICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKKyAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworXSkjIEFDX1BST0dfTERfUkVMT0FEX0ZMQUcKKworCisjIEFDX0RFUExJQlNfQ0hFQ0tfTUVUSE9ECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKK0FDX0RFRlVOKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0sCitbQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllc10sCitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKK1tsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXg0KiB8IGFpeDUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitiZW9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKKyAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KKyAgaWYgKCBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICBmaQorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbWzMtOV1dODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gUEEtUklTQyBbMC05XS5bMC05XSddCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxQQS1SSVNDW1swLTldXS5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4W1szLTldXSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqIHwgaypic2QqLWdudSkKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworbnRvLXFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVtbMC05XV1bWzAtOV1dKiBWZXJzaW9uIFtbMC05XV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKK10pCitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCitdKSMgQUNfREVQTElCU19DSEVDS19NRVRIT0QKKworCisjIEFDX1BST0dfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCitBQ19ERUZVTihbQUNfUFJPR19OTV0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCU0QtY29tcGF0aWJsZSBubV0sIGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIHRlc3QgLXogIiRsdF9jdl9wYXRoX05NIiAmJiBsdF9jdl9wYXRoX05NPW5tCitmaV0pCitOTT0iJGx0X2N2X3BhdGhfTk0iCitdKSMgQUNfUFJPR19OTQorCisKKyMgQUNfQ0hFQ0tfTElCTQorIyAtLS0tLS0tLS0tLS0tCisjIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKK0FDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitMSUJNPQorY2FzZSAkaG9zdCBpbgorKi0qLWJlb3MqIHwgKi0qLWN5Z3dpbiogfCAqLSotcHczMiogfCAqLSotZGFyd2luKikKKyAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtLCBvciBkb24ndCBuZWVkIGl0CisgIDs7CisqLW5jci1zeXN2NC4zKikKKyAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09IiRMSUJNIC1sbSIpCisgIDs7CisqKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSItbG0iKQorICA7OworZXNhYworXSkjIEFDX0NIRUNLX0xJQk0KKworCisjIEFDX0xJQkxURExfQ09OVkVOSUVOQ0UoW0RJUkVDVE9SWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSBhbmQKKyMgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcworIyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCisjIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLiAgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGgKKyMgJyR7dG9wX2J1aWxkZGlyfS8nIGFuZCBMVERMSU5DTCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX3NyY2Rpcn0vJworIyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpLiAgSWYgeW91ciBwYWNrYWdlIGlzIG5vdCBmbGF0IGFuZCB5b3UncmUgbm90CisjIHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFuZCB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkgaW4KKyMgdGhlIE1ha2VmaWxlcy4KK0FDX0RFRlVOKFtBQ19MSUJMVERMX0NPTlZFTklFTkNFXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCisgIGNhc2UgJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIGluCisgIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OworICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCisgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7CisgIGVzYWMKKyAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsYy5sYQorICBMVERMSU5DTD0nLUkke3RvcF9zcmNkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKQorICAjIEZvciBiYWNrd2FyZHMgbm9uLWdldHRleHQgY29uc2lzdGVudCBjb21wYXRpYmlsaXR5Li4uCisgIElOQ0xUREw9IiRMVERMSU5DTCIKK10pIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFCisKKworIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFKFtESVJFQ1RPUlldKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnkgYW5kCisjIExURExJTkNMIHRvIHRoZSBpbmNsdWRlIGZsYWdzIGZvciB0aGUgbGlibHRkbCBoZWFkZXIgYW5kIGFkZHMKKyMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCisjIGFuZCBhbiBpbnN0YWxsZWQgbGlibHRkbCBpcyBub3QgZm91bmQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLgorIyBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycjIGFuZCBMVERMSU5DTCB3aXRoCisjICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhbmQgdG9wX3NyY2RpcgorIyBhcHByb3ByaWF0ZWx5IGluIHRoZSBNYWtlZmlsZXMuCisjIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KK0FDX0RFRlVOKFtBQ19MSUJMVERMX0lOU1RBTExBQkxFXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCisgIEFDX0NIRUNLX0xJQihsdGRsLCBsdF9kbGluaXQsCisgIFt0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHh5ZXMgJiYgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ub10sCisgIFtpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geG5vOyB0aGVuCisgICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQorICAgZWxzZQorICAgICBlbmFibGVfbHRkbF9pbnN0YWxsPXllcworICAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHgieWVzIjsgdGhlbgorICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIgorICAgIExJQkxUREw9JyR7dG9wX2J1aWxkZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkvbGlibHRkbC5sYQorICAgIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pCisgIGVsc2UKKyAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbD1ubyIKKyAgICBMSUJMVERMPSItbGx0ZGwiCisgICAgTFRETElOQ0w9CisgIGZpCisgICMgRm9yIGJhY2t3YXJkcyBub24tZ2V0dGV4dCBjb25zaXN0ZW50IGNvbXBhdGliaWxpdHkuLi4KKyAgSU5DTFRETD0iJExURExJTkNMIgorXSkjIEFDX0xJQkxURExfSU5TVEFMTEFCTEUKKworCisjIEFDX0xJQlRPT0xfQ1hYCisjIC0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBzdXBwb3J0IGZvciBDKysgbGlicmFyaWVzCitBQ19ERUZVTihbQUNfTElCVE9PTF9DWFhdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0NYWF0pCitdKSMgQUNfTElCVE9PTF9DWFgKKworCisjIF9MVF9BQ19MQU5HX0NYWAorIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKK0FDX1JFUVVJUkUoW19MVF9BQ19QUk9HX0NYWENQUF0pCitfTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYXSkKK10pIyBfTFRfQUNfTEFOR19DWFgKKworIyBfTFRfQUNfUFJPR19DWFhDUFAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1BST0dfQ1hYQ1BQXSwKK1sKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKK2lmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIEFDX1BST0dfQ1hYQ1BQCitmaQorXSkjIF9MVF9BQ19QUk9HX0NYWENQUAorCisjIEFDX0xJQlRPT0xfRjc3CisjIC0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBzdXBwb3J0IGZvciBGb3J0cmFuIDc3IGxpYnJhcmllcworQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfTEFOR19GNzddKQorXSkjIEFDX0xJQlRPT0xfRjc3CisKKworIyBfTFRfQUNfTEFOR19GNzcKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3XSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pCitfTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Rjc3XSkKK10pIyBfTFRfQUNfTEFOR19GNzcKKworCisjIEFDX0xJQlRPT0xfR0NKCisjIC0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBzdXBwb3J0IGZvciBHQ0ogbGlicmFyaWVzCitBQ19ERUZVTihbQUNfTElCVE9PTF9HQ0pdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0dDSl0pCitdKSMgQUNfTElCVE9PTF9HQ0oKKworCisjIF9MVF9BQ19MQU5HX0dDSgorIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sW10sCisgIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sW10sCisgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9BQ19QUk9HX0dDSl0sW10sCisgICAgICBbaWZkZWYoW0FDX1BST0dfR0NKXSxbQUNfUkVRVUlSRShbQUNfUFJPR19HQ0pdKV0sCisJIFtpZmRlZihbQV1bTV9QUk9HX0dDSl0sW0FDX1JFUVVJUkUoW0FdW01fUFJPR19HQ0pdKV0sCisJICAgW0FDX1JFUVVJUkUoW0FdW0NfUFJPR19HQ0pfT1JfQV1bTV9QUk9HX0dDSl0pXSldKV0pXSldKQorX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUdDSl0pCitdKSMgX0xUX0FDX0xBTkdfR0NKCisKKworIyBBQ19MSUJUT09MX1JDCisjIC0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIFdpbmRvd3MgcmVzb3VyY2UgZmlsZXMKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwKK1tBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1JDXSkKK19MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1SQ10pCitdKSMgQUNfTElCVE9PTF9SQworCisKKyMgQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DX0NPTkZJR10pCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddLAorW2x0X3NhdmVfQ0M9IiRDQyIKK0FDX0xBTkdfUFVTSChDKQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO30nCisKK19MVF9BQ19TWVNfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSSgkMSkKK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCitBQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQorQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKK0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCitBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKK0FDX0xJQlRPT0xfRExPUEVOX1NFTEYKKworIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CitBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBmaQorICAgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1BPUAorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DWFhfQ09ORklHKENYWCldKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF9DT05GSUddLAorW0FDX0xBTkdfUFVTSChDKyspCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCitBQ19SRVFVSVJFKFtfTFRfQUNfUFJPR19DWFhDUFBdKQorCitfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQorX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KK19MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpPQorX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQorX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltbXV0pIHsgcmV0dXJuKDApOyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0xEPSRMRAorbHRfc2F2ZV9HQ0M9JEdDQworR0NDPSRHWFgKK2x0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCitsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CitlbHNlCisgICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAorZmkKK2lmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCitlbHNlCisgICRhc191bnNldCBsdF9jdl9wYXRoX0xECitmaQordGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKK0NDPSR7Q1hYLSJjKysifQorY29tcGlsZXI9JENDCitfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3ZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CitpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCitlbHNlCisgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KK2ZpCisKK2lmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCisKKyAgQUNfUFJPR19MRAorCisgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfCBcCisJZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgZWxzZQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgd2xhcmM9CisKKyAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgorICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KKyAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgZmkKKworICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworZWxzZQorICBHWFg9bm8KKyAgd2l0aF9nbnVfbGQ9bm8KKyAgd2xhcmM9CitmaQorCisjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgYWl4NCogfCBhaXg1KikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgIGVsc2UKKyAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4NSopCisJZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBjYXNlICRsZF9mbGFnIGluCisJICAqLWJydGwqKQorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgICAgZXNhYworCisgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgIGZpCisKKyAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKyAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCXRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCWVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJc2hhcmVkX2ZsYWc9Jy1HJworICAgICAgZWxzZQorCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJZWxzZQorCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisgICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICBlbHNlCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgIGVsc2UKKwkjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKwlfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgIGZpCisgICAgZmkKKyAgICA7OworCisgIGJlb3MqKQorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisgICAgICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIGZpCisgICAgOzsKKworICBjaG9ydXMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKyAgICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwljcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisgICAgICBlbHNlCisJZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgIGZpfgorICAgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgIGVsc2UKKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICBmaQorICA7OworICAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgZWxzZQorICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgICAgIDEwLltbMDEyXV0pCisgICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgIGVzYWMKKyAgICAgICAgIGZpCisgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScnCisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzIDsgdGhlbgorICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgaWYgJENDIC1kdW1wc3BlY3MgMj4mMSB8ICRFR1JFUCAnc2luZ2xlX21vZHVsZScgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCisgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICBlbHNlCisgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKKyAgICAgICAgZmkKKyAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgICAgICBpZiB0ZXN0ICJYJGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kIiA9IFh5ZXMgOyB0aGVuCisgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gJHtsaWJ9LW1hc3Rlci5vICRsaWJvYmpzfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAke2xpYn0tbWFzdGVyLm8gJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgZmkKKyAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgIGVsc2UKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIHhsYyopCisgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHhsY3ZlcnN0cmluZycKKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHhsY3ZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgZmkKKyAgICAgICAgOzsKKworICBkZ3V4KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZWMrKyopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICBnaGN4KikKKwkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZnJlZWJzZFtbMTJdXSopCisgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZSBzd2l0Y2ggdG8gRUxGCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIGZyZWVic2QtZWxmKikKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICA7OworICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAjIGNvbnZlbnRpb25zCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICA7OworICBnbnUqKQorICAgIDs7CisgIGhwdXg5KikKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCSMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgQ0MqKQorICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworICAgIGFDQyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICAjCisgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisgICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorICAgICAgIyBkZXBlbmRlbmNpZXMuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiW1stXV1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgaHB1eDEwKnxocHV4MTEqKQorICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKSA7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgIGFDQyopCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCopCisJICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGlhNjQqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBpbnRlcml4W1szLTldXSopCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgOzsKKyAgaXJpeDUqIHwgaXJpeDYqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBTR0kgQysrCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJIyBpbiB0aGUgYXJjaGl2ZS4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICBlbHNlCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCisJICBmaQorCWZpCisJX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisJOzsKKyAgICBlc2FjCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgOzsKKyAgbGludXgqIHwgaypic2QqLWdudSkKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgS0NDKikKKwkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8IGdyZXAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIGljcGMqKQorCSMgSW50ZWwgQysrCisJd2l0aF9nbnVfbGQ9eWVzCisJIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKKwkjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAorCSMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJWZXJzaW9uIDcuIiopCisgIAkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICA7OworCSopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCisJICB0bXBfaWR5bj0KKwkgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkgIGVzYWMKKyAgCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIDs7CisJZXNhYworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCTs7CisgICAgICBwZ0NDKikKKyAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKyAgCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICA7OworICAgICAgY3h4KikKKwkjIENvbXBhcSBDKysKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJworCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikKKwkgICMgU3VuIEMrKyA1LjkKKwkgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scycKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCisJICAjIE5vdCBzdXJlIHdoZXRoZXIgc29tZXRoaW5nIGJhc2VkIG9uCisJICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCisJICAjIHdvdWxkIGJlIGJldHRlci4KKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworCisJICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAjIGluIHRoZSBhcmNoaXZlLgorCSAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgICA7OworICBseW54b3MqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworICBtODhrKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgbXZzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY3h4KikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIG5ldGJzZCopCisgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICBmaQorICAgICMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKyAgICA7OworICBvcGVuYnNkMiopCisgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworICBvcGVuYnNkKikKKyAgICBpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBmaQorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIGZpCisgICAgOzsKKyAgb3NmMyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisKKwk7OworICAgICAgUkNDKikKKwkjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgY3h4KikKKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgb3NmNCogfCBvc2Y1KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgS0NDKikKKwkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIFJDQyopCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgIGN4eCopCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CisJICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAtV2wsLWlucHV0IC1XbCwkbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uCSR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICRybSAkbGliLmV4cCcKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgcHNvcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIHN1bm9zNCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIFN1biBDKysgNC54CisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICBsY2MqKQorCSMgTHVjaWQKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCQxKT15ZXMKKwlfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCWNhc2UgJGhvc3Rfb3MgaW4KKwkgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJICAqKQorCSAgICAjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCSAgICAjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLgorCSAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCSAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJICAgIDs7CisJZXNhYworCV9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkjIGluIHRoZSBhcmNoaXZlLgorCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBnY3gqKQorCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCisJX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICAqKQorCSMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS16ICR7d2x9ZGVmcycKKwkgIGlmICRDQyAtLXZlcnNpb24gfCBncmVwIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKKwkgIGVsc2UKKwkgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcworCSAgICAjIHBsYXRmb3JtLgorCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgorCSAgZmkKKworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJHdsJGxpYmRpcicKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJICAqKQorCSAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgIyBhcyAteiBkZWZzLgorICAgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKyAgICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQorICAgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisgICAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKyAgICAjIFNvIHRoYXQgYmVoYXZpb3VyIGlzIG9ubHkgZW5hYmxlZCBpZiBTQ09BQlNQQVRIIGlzIHNldCB0byBhCisgICAgIyBub24tZW1wdHkgdmFsdWUgaW4gdGhlIGVudmlyb25tZW50LiAgTW9zdCBsaWtlbHkgb25seSB1c2VmdWwgZm9yCisgICAgIyBjcmVhdGluZyBvZmZpY2lhbCBkaXN0cmlidXRpb25zIG9mIHBhY2thZ2VzLgorICAgICMgVGhpcyBpcyBhIGhhY2sgdW50aWwgbGlidG9vbCBvZmZpY2lhbGx5IHN1cHBvcnRzIGFic29sdXRlIHBhdGgKKyAgICAjIG5hbWVzIGZvciBzaGFyZWQgbGlicmFyaWVzLgorICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgZXNhYworICAgIDs7CisgIHRhbmRlbSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIE5DQyopCisJIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICB2eHdvcmtzKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKK3Rlc3QgIiRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworX0xUX0FDX1RBR1ZBUihHQ0MsICQxKT0iJEdYWCIKK19MVF9BQ19UQUdWQVIoTEQsICQxKT0iJExEIgorCitBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQKCQxKQorQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKK0FDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCitBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCitBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQorQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCitBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKKworQUNfTElCVE9PTF9DT05GSUcoJDEpCisKK0FDX0xBTkdfUE9QCitDQz0kbHRfc2F2ZV9DQworTERDWFg9JExECitMRD0kbHRfc2F2ZV9MRAorR0NDPSRsdF9zYXZlX0dDQword2l0aF9nbnVfbGRjeHg9JHdpdGhfZ251X2xkCit3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECitsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKK2x0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitdKSMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKKworIyBBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpZ3VyZSBvdXQgImhpZGRlbiIgbGlicmFyeSBkZXBlbmRlbmNpZXMgZnJvbSB2ZXJib3NlCisjIGNvbXBpbGVyIG91dHB1dCB3aGVuIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSxbCitkbmwgd2UgY2FuJ3QgdXNlIHRoZSBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUgaGVyZSwKK2RubCBiZWNhdXNlIGl0IGNvbnRhaW5zIGNvZGUgaW50ZW5kZWQgZm9yIGFuIGV4ZWN1dGFibGUsCitkbmwgbm90IGEgbGlicmFyeS4gIEl0J3MgcG9zc2libGUgd2Ugc2hvdWxkIGxldCBlYWNoCitkbmwgdGFnIGRlZmluZSBhIG5ldyBsdF8/Pz8/X2xpbmtfdGVzdF9jb2RlIHZhcmlhYmxlLAorZG5sIGJ1dCBpdCdzIG9ubHkgdXNlZCBoZXJlLi4uCitpZmVsc2UoWyQxXSxbXSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgoraW50IGE7Cit2b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQorRU9GCitdLFskMV0sW0NYWF0sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK0VPRgorXSxbJDFdLFtGNzddLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlcio0IGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK0VPRgorXSxbJDFdLFtHQ0pdLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitwdWJsaWMgY2xhc3MgZm9vIHsKKyAgcHJpdmF0ZSBpbnQgYTsKKyAgcHVibGljIHZvaWQgYmFyICh2b2lkKSB7CisgICAgYSA9IDA7CisgIH0KK307CitFT0YKK10pCitkbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Citkbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgoraWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCisKKyAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQorICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KKyAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubworCisgICMgVGhlIGAqJyBpbiB0aGUgY2FzZSBtYXRjaGVzIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGBjYXNlJyBpbgorICAjICRvdXRwdXRfdmVyYm9zZV9jbWQgY2FuIHRyaWdnZXIgZ2xvYiBleHBhbnNpb24gZHVyaW5nIHRoZSBsb29wCisgICMgZXZhbCB3aXRob3V0IHRoaXMgc3Vic3RpdHV0aW9uLgorICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1gJGVjaG8gIlgkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiIHwgJFhzZWQgLWUgIiRub19nbG9iX3N1YnN0ImAKKworICBmb3IgcCBpbiBgZXZhbCAkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWRgOyBkbworICAgIGNhc2UgJHAgaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiBcCisJICB8fCB0ZXN0ICRwID0gIi1SIjsgdGhlbgorCSBwcmV2PSRwCisJIGNvbnRpbnVlCisgICAgICAgZWxzZQorCSBwcmV2PQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICRwIGluCisJIC1MKiB8IC1SKikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KKwkgICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KKwkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKi4kb2JqZXh0KQorICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAorICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgorICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgorCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcworCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgorCisgICAgZXNhYworICBkb25lCisKKyAgIyBDbGVhbiB1cC4KKyAgcm0gLWYgYS5vdXQgYS5leGUKK2Vsc2UKKyAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nICQxIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRybSAtZiBjb25mZXN0LiRvYmpleHQKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK2lmZWxzZShbJDFdLFtDWFhdLAorW2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXhbWzMtOV1dKikKKyAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgorICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgorICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCQxKT0KKyAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsJDEpPQorICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCQxKT0KKyAgOzsKKworbGludXgqKQorICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKyAgKlN1blwgQyopCisgICAgIyBTdW4gQysrIDUuOQorICAgICMKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworCitzb2xhcmlzKikKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgQ0MqKQorICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgorICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKKyAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgorICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworXSkKKworY2FzZSAiICRfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSkgIiBpbgorKiIgLWxjICIqKSBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8gOzsKK2VzYWMKK10pIyBBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQCisKKyMgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10sIFtfTFRfQUNfTEFOR19GNzdfQ09ORklHKEY3NyldKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N19DT05GSUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfRjc3XSkKK0FDX0xBTkdfUFVTSChGb3J0cmFuIDc3KQorCitfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX0FDX1NZU19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0Y3Ny0iZjc3In0KK2NvbXBpbGVyPSRDQworX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7CithaXg0KiB8IGFpeDUqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgZmkKKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK0FDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworX0xUX0FDX1RBR1ZBUihHQ0MsICQxKT0iJEc3NyIKK19MVF9BQ19UQUdWQVIoTEQsICQxKT0iJExEIgorCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKCQxKQorQUNfTElCVE9PTF9QUk9HX0NDX0NfTygkMSkKK0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUygkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoJDEpCitBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUigkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCitBQ19MSUJUT09MX0NPTkZJRygkMSkKKworQUNfTEFOR19QT1AKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sIFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHKEdDSildKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAorW0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fSIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfScKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX0FDX1NZU19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0dDSi0iZ2NqIn0KK2NvbXBpbGVyPSRDQworX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCitfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKworX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKKworQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkoJDEpCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKCQxKQorQUNfTElCVE9PTF9QUk9HX0NDX0NfTygkMSkKK0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLUygkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoJDEpCitBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUigkMSkKK0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCitBQ19MSUJUT09MX0NPTkZJRygkMSkKKworQUNfTEFOR19SRVNUT1JFCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKKworCisjIEFDX0xJQlRPT0xfTEFOR19SQ19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgV2luZG93cyByZXNvdXJjZSBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLCBbX0xUX0FDX0xBTkdfUkNfQ09ORklHKFJDKV0pCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwKK1tBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9JworCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7UkMtIndpbmRyZXMifQorY29tcGlsZXI9JENDCitfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCitfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1JFU1RPUkUKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0NPTkZJRyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWYgVEFHTkFNRSBpcyBub3QgcGFzc2VkLCB0aGVuIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0CisjIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UKKyMgYWRkIGNvZGUgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5CisjIFRBR05BTUUgZnJvbSB0aGUgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSwKK1sjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKENDLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoTEQsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0aW5zdGFsbF9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIocG9zdHVuaW5zdGFsbF9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihmaXhfc3JjZmlsZV9wYXRoLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSk7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKSB8IFwKKyAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKSB8IFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKSB8IFwKKyAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKSB8IFwKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKSB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXFskXTAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcWyRdMCAtLWZhbGxiYWNrLWVjaG8iWyRdL1skXTAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworaWZlbHNlKFskMV0sIFtdLAorICBbY2ZnZmlsZT0iJHtvZmlsZX1UIgorICB0cmFwICIkcm0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAkcm0gLWYgIiRjZmdmaWxlIgorICBBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkb2ZpbGVdKV0sCisgIFtjZmdmaWxlPSIkb2ZpbGUiXSkKKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKK2lmZWxzZShbJDFdLCBbXSwKK1sjISAkU0hFTEwKKworIyBgJGVjaG8gIiRjZmdmaWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sOgorIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIEEgc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCitTRUQ9JGx0X1NFRAorCisjIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgorWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCisjIFRoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KK2F2YWlsYWJsZV90YWdzPQorCisjICMjIyBCRUdJTiBMSUJUT09MIENPTkZJR10sCitbIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZV0pCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKQorCisjIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSkKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBUaGUgaG9zdCBzeXN0ZW0uCitob3N0X2FsaWFzPSRob3N0X2FsaWFzCitob3N0PSRob3N0Citob3N0X29zPSRob3N0X29zCisKKyMgVGhlIGJ1aWxkIHN5c3RlbS4KK2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworYnVpbGQ9JGJ1aWxkCitidWlsZF9vcz0kYnVpbGRfb3MKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgTFRDQyBjb21waWxlciBmbGFncy4KK0xUQ0ZMQUdTPSRsdF9MVENGTEFHUworCisjIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCitDQz0kbHRfW11fTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSkKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JF9MVF9BQ19UQUdWQVIoR0NDLCAkMSkKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfW11fTFRfQUNfVEFHVkFSKExELCAkMSkKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCisKKyMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgorb2JqZXh0PSIkYWNfb2JqZXh0IgorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKQorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSkKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSkKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKQorCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKQorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKQorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKQorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSkKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSkKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKQorYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKQorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfW11fTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBzPSRsdF9bXV9MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9bXV9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKQorCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X1tdX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKQorCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgorZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSkKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X1tdX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSkKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X1tdX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSkKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSkKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKQorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKQorCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSkKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSRsdF9maXhfc3JjZmlsZV9wYXRoCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKQorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpCisKKyMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X1tdX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKQorCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfW11fTFRfQUNfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpCisKK2lmZWxzZShbJDFdLFtdLAorWyMgIyMjIEVORCBMSUJUT09MIENPTkZJR10sCitbIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVdKQorCitfX0VPRl9fCisKK2lmZWxzZShbJDFdLFtdLCBbCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitFT0YKKyAgICA7OworICBlc2FjCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8IFwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSkKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKKyAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KKyAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCisgIGZpCitmaQorXSkjIEFDX0xJQlRPT0xfQ09ORklHCisKKworIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sCitbQUNfUkVRVUlSRShbX0xUX0FDX1NZU19DT01QSUxFUl0pZG5sCisKK19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworCisgIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMsCisgICAgWy1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbXSwKKyAgICBbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPSIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiXSkKK2ZpCitdKSMgQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEkKKworCisjIEFDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKK0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSkKK0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKQorQUNfUkVRVUlSRShbQUNfT0JKRVhUXSkKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3RdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwKK1sKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMTsvcCciCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUgXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW1tCQ0RUXV0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHN5bWNvZGU9J1tbQUJDREdJU1RXXV0nCisgIDs7CitocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCisgIGZpCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisgIDs7CitsaW51eCogfCBrKmJzZCotZ251KQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJworICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKyAgZmkKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW1tCQ0RFR1FSU1RdXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbW0JEUlRdXScKKyAgOzsKK3NjbzMuMnY1KikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tbQUJEVF1dJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tbREZOU1RVXV0nCisgIDs7Citlc2FjCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkYnVpbGRfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWBlY2hvICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW1tBQkNER0lSU1RXXV0nIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWyAJXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWyAJXV1bWyAJXV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitFT0YKKworICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3QpICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmIGdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCisjIGRlZmluZSBjb25zdAorI2VuZGlmCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyX3QgYWRkcmVzczsKK30KK2x0X3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Cit7CitFT0YKKwkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKGx0X3B0cl90KSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgZ3JlcCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKKwkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKGx0X3B0cl90KSAwfQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKKwkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorXSkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KK2ZpCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChmYWlsZWQpCitlbHNlCisgIEFDX01TR19SRVNVTFQob2spCitmaQorXSkgIyBBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKKworCisjIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwKK1tfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0KK19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KK19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10pCisgaWZlbHNlKFskMV0sW0NYWF0sWworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgIDs7CisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCogfCBhaXg1KikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCWVsc2UKKwkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCisJICA7OworCWVzYWMKKwk7OworICAgICAgIGRhcndpbiopCisgICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgICB4bGMqKQorICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xbm9jb21tb24nCisgICAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgICAgICA7OworICAgICAgICAgZXNhYworICAgICAgIDs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKyopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKwkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCisJOzsKKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwkgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICBmaQorCSAgICA7OworCSAgYUNDKikKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGludGVyaXgqKQorCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQorCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCogfCBrKmJzZCotZ251KQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICA7OworCSAgaWNwYyogfCBlY3BjKikKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKwkgICAgOzsKKwkgIHBnQ0MqKQorCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlci4KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbHlueG9zKikKKwk7OworICAgICAgbTg4ayopCisJOzsKKyAgICAgIG12cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGN4eCopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKikKKwk7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB0YW5kZW0qKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworCTs7CisgICAgZXNhYworICBmaQorXSwKK1sKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgICAgZmkKKyAgICAgIDs7CisgICAgICBkYXJ3aW4qKQorICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgeGxjKikKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFub2NvbW1vbicKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgICAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSkKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBpY2MqIHwgZWNjKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgIDs7CisJKlN1blwgRiopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPScnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KKyAgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSksCisgICAgWyRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlpZmVsc2UoWyQxXSxbXSxbIC1EUElDXSxbaWZlbHNlKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKKyAgICBbY2FzZSAkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKKyAgICAgZXNhY10sCisgICAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCitmaQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgOzsKKyAgKikKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlpZmVsc2UoWyQxXSxbXSxbIC1EUElDXSxbaWZlbHNlKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSkiCisgICAgOzsKK2VzYWMKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCitBQ19MSUJUT09MX0xJTktFUl9PUFRJT04oW2lmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzXSwKKyAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcywgJDEpLAorICAkbHRfdG1wX3N0YXRpY19mbGFnLAorICBbXSwKKyAgW19MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT1dKQorXSkKKworCisjIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwKK1tBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1NFRF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitpZmVsc2UoWyQxXSxbQ1hYXSxbCisgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4NCogfCBhaXg1KikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLzsvXi4qW1sgXV1fX25tX18vcy9eLipbWyBdXV9fbm1fX1woW1teIF1dKlwpW1sgXV1bW14gXV0qL1wxIERBVEEvOy9eSVtbIF1dL2Q7L15bW0FJVFddXVtbIF1dL3MvLipbWyBdXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICAqKQorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgIGVzYWMKK10sWworICBydW5wYXRoX3Zhcj0KKyAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfQUNfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBfTFRfQUNfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIF9MVF9BQ19UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgIGVsc2UKKyAgCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPi9kZXYvbnVsbGAgaW4KKyAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCisgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAorICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQorICAgICAgIyB0aGVtLgorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS8nXCcnIC1lICdcJycvXltbQUlUV11dW1sgXV0vcy8uKltbIF1dLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgZ251KiB8IGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwl0bXBfYWRkZmxhZz0KKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKwlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWVzYWMKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQorCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSopCisJICB0bXBfc2hhcmVkZmxhZz0nLXNoYXJlZCcgOzsKKwllc2FjCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgICRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjFbWzAtNV1dLiopCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXg0KiB8IGFpeDUqKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4NSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKyAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworICAJICAgIGJyZWFrCisgIAkgIGZpCisJICBkb25lCisJICA7OworCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIDoKKwkgIGVsc2UKKyAgCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKyAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKyAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisgIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKwkgIGZpCisJICA7OworCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCWZpCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisgIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAorICAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCSBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisJIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKworICAgIGJzZGlbWzQ1XV0qKQorICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKyAgICAgIGxpYmV4dD1saWIKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKyAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKyAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisgICAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworICAgICAgX0xUX0FDX1RBR1ZBUihmaXhfc3JjZmlsZV9wYXRoLCAkMSk9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJworICAgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQorICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIDs7CisgICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KKyAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAgICAxMC5bWzAxMl1dKQorICAgICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBlbHNlCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICB4bGMqKQorICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR4bGN2ZXJzdHJpbmcnCisgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHhsY3ZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9JytiICRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCSAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisgICAgICAgIGZpCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHMsICQxKT0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiB0ZXh0JworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwl3bGFyYz0nJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKyAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGZpCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorIAkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwllbHNlCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCit0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW5dKQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQorCXBpY19mbGFnPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCisgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgICAgICAgaWYgQUNfVFJZX0VWQUwoX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorICAgICAgICB0aGVuCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgICAgZWxzZQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworICAgICAgICBmaQorICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKV0pCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKK10pIyBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTCisKKworIyBfTFRfQUNfRklMRV9MVERMTF9DCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQmUgY2FyZWZ1bCB0aGF0IHRoZSBzdGFydCBtYXJrZXIgYWx3YXlzIGZvbGxvd3MgYSBuZXdsaW5lLgorQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdLCBbCisjIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KKyMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDxzdGRpby5oPgorIworIyAjaWZuZGVmIF9fQ1lHV0lOX18KKyMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCisjICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjICMgIGVuZGlmCisjICNlbmRpZgorIworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgZXh0ZXJuICJDIiB7CisjICNlbmRpZgorIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgfQorIyAjZW5kaWYKKyMKKyMgI2lmZGVmIF9fQ1lHV0lOX18KKyMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+CisjIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOworIyAjZW5kaWYKKyMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7CisjCisjIEJPT0wgQVBJRU5UUlkKKyMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKKyMgeworIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKKyMgICByZXR1cm4gVFJVRTsKKyMgfQorIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLworXSkjIF9MVF9BQ19GSUxFX0xURExMX0MKKworCisjIF9MVF9BQ19UQUdWQVIoVkFSTkFNRSwgW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSwgW2lmZWxzZShbJDJdLCBbXSwgWyQxXSwgWyQxXyQyXSldKQorCisKKyMgb2xkIG5hbWVzCitBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgICBbQUNfUFJPR19MSUJUT09MXSkKK0FDX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sICBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQUNfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKK0FDX0RFRlVOKFtBTV9QUk9HX0xEXSwgICAgICAgIFtBQ19QUk9HX0xEXSkKK0FDX0RFRlVOKFtBTV9QUk9HX05NXSwgICAgICAgIFtBQ19QUk9HX05NXSkKKworIyBUaGlzIGlzIGp1c3QgdG8gc2lsZW5jZSBhY2xvY2FsIGFib3V0IHRoZSBtYWNybyBub3QgYmVpbmcgdXNlZAoraWZlbHNlKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pCisKK0FDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sCitbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwgbm8pCisgIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgorICBBQ19TVUJTVChHQ0pGTEFHUykKK10pCisKK0FDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwKK1tBQ19DSEVDS19UT09MKFJDLCB3aW5kcmVzLCBubykKK10pCisKKworIyBDaGVhcCBiYWNrcG9ydCBvZiBBU19FWEVDVVRBQkxFX1AgYW5kIHJlcXVpcmVkIG1hY3JvcworIyBmcm9tIEF1dG9jb25mIDIuNTk7IHdlIHNob3VsZCBub3QgdXNlICRhc19leGVjdXRhYmxlX3AgZGlyZWN0bHkuCisKKyMgX0FTX1RFU1RfUFJFUEFSRQorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9pZm5kZWYoW19BU19URVNUX1BSRVBBUkVdLAorW200X2RlZnVuKFtfQVNfVEVTVF9QUkVQQVJFXSwKK1tpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4ZWN1dGFibGVfcD0ndGVzdCAteCcKK2Vsc2UKKyAgYXNfZXhlY3V0YWJsZV9wPSd0ZXN0IC1mJworZmkKK10pXSkjIF9BU19URVNUX1BSRVBBUkUKKworIyBBU19FWEVDVVRBQkxFX1AKKyMgLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgYSBmaWxlIGlzIGV4ZWN1dGFibGUuCittNF9pZm5kZWYoW0FTX0VYRUNVVEFCTEVfUF0sCitbbTRfZGVmdW4oW0FTX0VYRUNVVEFCTEVfUF0sCitbQVNfUkVRVUlSRShbX0FTX1RFU1RfUFJFUEFSRV0pZG5sCiskYXNfZXhlY3V0YWJsZV9wICQxW11kbmwKK10pXSkjIEFTX0VYRUNVVEFCTEVfUAorCisjIE5PVEU6IFRoaXMgbWFjcm8gaGFzIGJlZW4gc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW50byAgICMKKyMgIEdOVSBBdXRvY29uZiBhcyBBQ19QUk9HX1NFRC4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgIworIyAgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEF1dG9jb25mIHdlIHNob3VsZCByZW1vdmUgdGhpcyAgICAjCisjICBtYWNybyBhbmQgdXNlIGl0IGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgTFRfQUNfUFJPR19TRUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KK0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfU0VELAorWyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgorIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGlmIEFTX0VYRUNVVEFCTEVfUChbIiRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiXSk7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCitdKQorU0VEPSRsdF9jdl9wYXRoX1NFRAorQUNfU1VCU1QoW1NFRF0pCitBQ19NU0dfUkVTVUxUKFskU0VEXSkKK10pCisKKyMgcGtnLm00IC0gTWFjcm9zIHRvIGxvY2F0ZSBhbmQgdXRpbGlzZSBwa2ctY29uZmlnLiAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMgCisjIENvcHlyaWdodCDCqSAyMDA0IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQS0dfUFJPR19QS0dfQ09ORklHKFtNSU4tVkVSU0lPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfUFJPR19QS0dfQ09ORklHXSwKK1ttNF9wYXR0ZXJuX2ZvcmJpZChbXl8/UEtHX1tBLVpfXSskXSkKK200X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHKF9QQVRIKT8kXSkKK0FDX0FSR19WQVIoW1BLR19DT05GSUddLCBbcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHldKWRubAoraWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgorCUFDX1BBVEhfVE9PTChbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKK2ZpCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKwlfcGtnX21pbl92ZXJzaW9uPW00X2RlZmF1bHQoWyQxXSwgWzAuOS4wXSkKKwlBQ19NU0dfQ0hFQ0tJTkcoW3BrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbl0pCisJaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCisJCUFDX01TR19SRVNVTFQoW3llc10pCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCVBLR19DT05GSUc9IiIKKwlmaQorCQkKK2ZpW11kbmwKK10pIyBQS0dfUFJPR19QS0dfQ09ORklHCisKKyMgUEtHX0NIRUNLX0VYSVNUUyhNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIworIyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVsZXMgZXhpc3RzLiAgU2ltaWxhcgorIyB0byBQS0dfQ0hFQ0tfTU9EVUxFUygpLCBidXQgZG9lcyBub3Qgc2V0IHZhcmlhYmxlcyBvciBwcmludCBlcnJvcnMuCisjCisjCisjIFNpbWlsYXIgdG8gUEtHX0NIRUNLX01PRFVMRVMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZgorIyB0aGlzIG9yIFBLR19DSEVDS19NT0RVTEVTIGlzIGNhbGxlZCwgb3IgbWFrZSBzdXJlIHRvIGNhbGwKKyMgUEtHX0NIRUNLX0VYSVNUUyBtYW51YWxseQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19DSEVDS19FWElTVFNdLAorW0FDX1JFUVVJUkUoW1BLR19QUk9HX1BLR19DT05GSUddKWRubAoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICBBQ19SVU5fTE9HKFskUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiJDEiXSk7IHRoZW4KKyAgbTRfaWZ2YWwoWyQyXSwgWyQyXSwgWzpdKQorbTRfaWZ2YWxuKFskM10sIFtlbHNlCisgICQzXSlkbmwKK2ZpXSkKKworCisjIF9QS0dfQ09ORklHKFtWQVJJQUJMRV0sIFtDT01NQU5EXSwgW01PRFVMRVNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX1BLR19DT05GSUddLAorW2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiQkMSI7IHRoZW4KKyAgICAgICAgcGtnX2N2X1tdJDE9IiQkMSIKKyAgICBlbHNlCisgICAgICAgIFBLR19DSEVDS19FWElTVFMoWyQzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbcGtnX2N2X1tdJDE9YCRQS0dfQ09ORklHIC0tW10kMiAiJDMiIDI+L2Rldi9udWxsYF0sCisJCQkgW3BrZ19mYWlsZWQ9eWVzXSkKKyAgICBmaQorZWxzZQorCXBrZ19mYWlsZWQ9dW50cmllZAorZmlbXWRubAorXSkjIF9QS0dfQ09ORklHCisKKyMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVEXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaVtdZG5sCitdKSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisKKworIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAorIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjCisjCisjIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRvCisjIFBLR19DSEVDS19NT0RVTEVTIG1pZ2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCisjIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYworIworIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19DSEVDS19NT0RVTEVTXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK0FDX0FSR19WQVIoWyQxXVtfQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAorQUNfQVJHX1ZBUihbJDFdW19MSUJTXSwgW2xpbmtlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCisKK3BrZ19mYWlsZWQ9bm8KK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKKworX1BLR19DT05GSUcoWyQxXVtfQ0ZMQUdTXSwgW2NmbGFnc10sIFskMl0pCitfUEtHX0NPTkZJRyhbJDFdW19MSUJTXSwgW2xpYnNdLCBbJDJdKQorCittNF9kZWZpbmUoW19QS0dfVEVYVF0sIFtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICQxW11fQ0ZMQUdTCithbmQgJDFbXV9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLl0pCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgICAgICAgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgJDFbXV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXNob3J0LWVycm9ycyAtLWVycm9ycy10by1zdGRvdXQgLS1wcmludC1lcnJvcnMgIiQyImAKKyAgICAgICAgZWxzZSAKKwkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1lcnJvcnMtdG8tc3Rkb3V0IC0tcHJpbnQtZXJyb3JzICIkMiJgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJCQxW11fUEtHX0VSUk9SUyIgPiZBU19NRVNTQUdFX0xPR19GRAorCisJaWZlbHNlKFskNF0sICwgW0FDX01TR19FUlJPUihkbmwKK1tQYWNrYWdlIHJlcXVpcmVtZW50cyAoJDIpIHdlcmUgbm90IG1ldDoKKworJCQxX1BLR19FUlJPUlMKKworQ29uc2lkZXIgYWRqdXN0aW5nIHRoZSBQS0dfQ09ORklHX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91CitpbnN0YWxsZWQgc29mdHdhcmUgaW4gYSBub24tc3RhbmRhcmQgcHJlZml4LgorCitfUEtHX1RFWFQKK10pXSwKKwkJW0FDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgICAkNF0pCitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisJaWZlbHNlKFskNF0sICwgW0FDX01TR19GQUlMVVJFKGRubAorW1RoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAoraXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAorcGF0aCB0byBwa2ctY29uZmlnLgorCitfUEtHX1RFWFQKKworVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uXSldLAorCQlbJDRdKQorZWxzZQorCSQxW11fQ0ZMQUdTPSRwa2dfY3ZfW10kMVtdX0NGTEFHUworCSQxW11fTElCUz0kcGtnX2N2X1tdJDFbXV9MSUJTCisgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJaWZlbHNlKFskM10sICwgOiwgWyQzXSkKK2ZpW11kbmwKK10pIyBQS0dfQ0hFQ0tfTU9EVUxFUworCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCisjIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgorIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKK0FDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKK1thbV9fYXBpX3ZlcnNpb249JzEuMTAnCitkbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCitkbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgorbTRfaWYoWyQxXSwgWzEuMTBdLCBbXSwKKyAgICAgIFtBQ19GQVRBTChbRG8gbm90IGNhbGwgJDAsIHVzZSBBTV9JTklUX0FVVE9NQUtFKFskMV0pLl0pXSlkbmwKK10pCisKKyMgX0FNX0FVVE9DT05GX1ZFUlNJT04oVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgYWNsb2NhbCB0cmFjZXMgdGhpcyBtYWNybyB0byBmaW5kIHRoZSBBdXRvY29uZiB2ZXJzaW9uLgorIyBUaGlzIGlzIGEgcHJpdmF0ZSBtYWNybyB0b28uICBVc2luZyBtNF9kZWZpbmUgc2ltcGxpZmllcworIyB0aGUgbG9naWMgaW4gYWNsb2NhbCwgd2hpY2ggY2FuIHNpbXBseSBpZ25vcmUgdGhpcyBkZWZpbml0aW9uLgorbTRfZGVmaW5lKFtfQU1fQVVUT0NPTkZfVkVSU0lPTl0sIFtdKQorCisjIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gdGhleSBjYW4gYmUgdHJhY2VkLgorIyBUaGlzIGZ1bmN0aW9uIGlzIEFDX1JFUVVJUkVkIGJ5IEFDX0lOSVRfQVVUT01BS0UuCitBQ19ERUZVTihbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0sCitbQU1fQVVUT01BS0VfVkVSU0lPTihbMS4xMF0pZG5sCitfQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9QQUNLQUdFX1ZFUlNJT04pXSkKKworIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCisjICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCisjIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCisjCisjIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKKyMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKKyMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCisjIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQorIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAorIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKKyMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KKyMKKyMgJGFjX2F1eF9kaXIvbWlzc2luZworIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCisjICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCisjICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCisjICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKKyMKKyMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKKyMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKKyMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91CisjIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCisjCisjIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAorIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKKyMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKKyMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCisjICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCisjIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCisjIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCisjIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KKyMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgorIworIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KKyMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQorIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCisKK0FDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCitbZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KK0FDX1BSRVJFUShbMi41MF0pZG5sCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitdKQorCisjIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDgKKworIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCitBQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAorW0FDX1BSRVJFUSgyLjUyKWRubAorIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCisJWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAorQUNfU1VCU1QoWyQxX1RSVUVdKWRubAorQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCitpZiAkMjsgdGhlbgorICAkMV9UUlVFPQorICAkMV9GQUxTRT0nIycKK2Vsc2UKKyAgJDFfVFJVRT0nIycKKyAgJDFfRkFMU0U9CitmaQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKK1tpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQorZmldKV0pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDkKKworIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKKyMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCisjIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncworIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCisjIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KKworCisjIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCisjIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCisjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCisjCisjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcworIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgorIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCisjIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgorQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAorQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAorQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCisKK2lmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQorCitBQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAorICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKK1tpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKKyAgZmkKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKK10pCitBQ19TVUJTVChbJDFERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSkKK0FNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcCQxXSwgWworICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCitdKQorCisKKyMgQU1fU0VUX0RFUERJUgorIyAtLS0tLS0tLS0tLS0tCisjIENob29zZSBhIGRpcmVjdG9yeSBuYW1lIGZvciBkZXBlbmRlbmN5IGZpbGVzLgorIyBUaGlzIG1hY3JvIGlzIEFDX1JFUVVJUkVkIGluIF9BTV9ERVBFTkRFTkNJRVMKK0FDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAorXSkKKworCisjIEFNX0RFUF9UUkFDSworIyAtLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAorW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKK1sgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKKyAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQoraWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworZmkKK0FNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQorQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCitdKQorCisjIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyNzZXJpYWwgMworCisjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW2ZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbworICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAorICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0CisgICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgorICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQorICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KKyAgaWYgc2VkIDEwcSAiJG1mIiB8IGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKKyAgZWxzZQorICAgIGNvbnRpbnVlCisgIGZpCisgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQorICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCisgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCisgICMgZXhwYW5zaW9uLgorICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKKyAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCisgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQorICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgIGRvbmUKK2RvbmUKK10pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKworCisjIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KKyMKKyMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZworIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCisjIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCitBQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAorICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKKyAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQorXSkKKworCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAzCisKK0FDX0RFRlVOKFtBTV9XSVRIX0RNQUxMT0NdLAorW0FDX01TR19DSEVDS0lORyhbaWYgbWFsbG9jIGRlYnVnZ2luZyBpcyB3YW50ZWRdKQorQUNfQVJHX1dJVEgoZG1hbGxvYywKK1sgIC0td2l0aC1kbWFsbG9jICAgICAgICAgIHVzZSBkbWFsbG9jLCBhcyBpbgorCQkJICBodHRwOi8vd3d3LmRtYWxsb2MuY29tL2RtYWxsb2MudGFyLmd6XSwKK1tpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgIEFDX0RFRklORShXSVRIX0RNQUxMT0MsMSwKKwkgICAgW0RlZmluZSBpZiB1c2luZyB0aGUgZG1hbGxvYyBkZWJ1Z2dpbmcgbWFsbG9jIHBhY2thZ2VdKQorICBMSUJTPSIkTElCUyAtbGRtYWxsb2MiCisgIExERkxBR1M9IiRMREZMQUdTIC1nIgorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmldLCBbQUNfTVNHX1JFU1VMVChubyldKQorXSkKKworQVVfREVGVU4oW2ZwX1dJVEhfRE1BTExPQ10sIFtBTV9XSVRIX0RNQUxMT0NdKQorCisjIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorIyAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEyCisKKyMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCisjIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKKyMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQorIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCisjIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQorIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgorIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKKyMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKKyMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgorIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgorQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAorW0FDX1BSRVJFUShbMi42MF0pZG5sCitkbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdworZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCittNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KKyAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKKyAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgorICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCisgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAorICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKKyAgZmkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCitBQ19TVUJTVChbQ1lHUEFUSF9XXSkKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCittNF9pZnZhbChbJDJdLAorW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKK1tfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKK2RubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgorbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCisgIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAorCitfQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKK1tBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCisgQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCitBQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAorQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAorQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKK0FNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCitBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQorQU1fUFJPR19JTlNUQUxMX1NICitBTV9QUk9HX0lOU1RBTExfU1RSSVAKK0FDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCisjIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgorIyBzb21lIHBsYXRmb3Jtcy4KK0FDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAorQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK19BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAorICAgICAgICAgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKKwkgICAgICAJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKK19BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKKyAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCisgICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKyAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAorICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAorICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAorICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKK10pCitdKQorCisKKyMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KKyMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCisjIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KKworIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQorIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCisjIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KK0FDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKK1sjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCitfYW1fc3RhbXBfY291bnQ9MQorZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCisgIGNhc2UgJF9hbV9oZWFkZXIgaW4KKyAgICAkMSB8ICQxOiogKQorICAgICAgYnJlYWsgOzsKKyAgICAqICkKKyAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKKyAgZXNhYworZG9uZQorZWNobyAidGltZXN0YW1wIGZvciAkMSIgPmBBU19ESVJOQU1FKFskMV0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19JTlNUQUxMX1NICisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgJGluc3RhbGxfc2guCitBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCitpbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iXCQoU0hFTEwpICRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQorQUNfU1VCU1QoaW5zdGFsbF9zaCldKQorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCisjIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KK0FDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAorW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCitta2RpciAudHN0IDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC50c3Q7IHRoZW4KKyAgYW1fX2xlYWRpbmdfZG90PS4KK2Vsc2UKKyAgYW1fX2xlYWRpbmdfZG90PV8KK2ZpCitybWRpciAudHN0IDI+L2Rldi9udWxsCitBQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQorCisjIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4gICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIEZyb20gSmltIE1leWVyaW5nCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworQUNfREVGVU4oW0FNX01BSU5UQUlORVJfTU9ERV0sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCisgIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKK1sgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSAgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAorICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAorICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKKyAgQUNfTVNHX1JFU1VMVChbJFVTRV9NQUlOVEFJTkVSX01PREVdKQorICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIFt0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzXSkKKyAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCisgIEFDX1NVQlNUKE1BSU5UKWRubAorXQorKQorCitBVV9ERUZVTihbam1fTUFJTlRBSU5FUl9NT0RFXSwgW0FNX01BSU5UQUlORVJfTU9ERV0pCisKKyMgQ2hlY2sgdG8gc2VlIGhvdyAnbWFrZScgdHJlYXRzIGluY2x1ZGVzLgkgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAzCisKKyMgQU1fTUFLRV9JTkNMVURFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGhvdyBtYWtlIHRyZWF0cyBpbmNsdWRlcy4KK0FDX0RFRlVOKFtBTV9NQUtFX0lOQ0xVREVdLAorW2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCithbV9fZG9pdDoKKwlAZWNobyBkb25lCisuUEhPTlk6IGFtX19kb2l0CitFTkQKKyMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KK0FDX01TR19DSEVDS0lORyhbZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZV0pCithbV9faW5jbHVkZT0iIyIKK2FtX19xdW90ZT0KK19hbV9yZXN1bHQ9bm9uZQorIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2VjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKKyMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKKyMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KKyMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKKyMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCisjIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KK2lmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgorICAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICAgYW1fX3F1b3RlPQorICAgX2FtX3Jlc3VsdD1HTlUKK2ZpCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KKyAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgICBhbV9fcXVvdGU9IlwiIgorICAgICAgX2FtX3Jlc3VsdD1CU0QKKyAgIGZpCitmaQorQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKK0FDX1NVQlNUKFthbV9fcXVvdGVdKQorQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQorcm0gLWYgY29uZmluYyBjb25mbWYKK10pCisKKyMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAorW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCiskMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KK0FDX1NVQlNUKCQxKV0pCisKKworIyBBTV9NSVNTSU5HX0hBU19SVU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KKyMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgorQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAorQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCit0ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCitmaQorXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19NS0RJUl9QCisjIC0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgYG1rZGlyIC1wJy4KK0FDX0RFRlVOKFtBTV9QUk9HX01LRElSX1BdLAorW0FDX1BSRVJFUShbMi42MF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX01LRElSX1BdKWRubAorZG5sIEF1dG9tYWtlIDEuOCB0byAxLjkuNiB1c2VkIHRvIGRlZmluZSBta2Rpcl9wLiAgV2Ugbm93IHVzZSBNS0RJUl9QLAorZG5sIHdoaWxlIGtlZXBpbmcgYSBkZWZpbml0aW9uIG9mIG1rZGlyX3AgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitkbmwgQE1LRElSX1BAIGlzIG1hZ2ljOiBBQ19PVVRQVVQgYWRqdXN0cyBpdHMgdmFsdWUgZm9yIGVhY2ggTWFrZWZpbGUuCitkbmwgSG93ZXZlciB3ZSBjYW5ub3QgZGVmaW5lIG1rZGlyX3AgYXMgJChNS0RJUl9QKSBmb3IgdGhlIHNha2Ugb2YKK2RubCBNYWtlZmlsZS5pbnMgdGhhdCBkbyBub3QgZGVmaW5lIE1LRElSX1AsIHNvIHdlIGRvIG91ciBvd24KK2RubCBhZGp1c3RtZW50IHVzaW5nIHRvcF9idWlsZGRpciAod2hpY2ggaXMgZGVmaW5lZCBtb3JlIG9mdGVuIHRoYW4KK2RubCBNS0RJUl9QKS4KK0FDX1NVQlNUKFtta2Rpcl9wXSwgWyIkTUtESVJfUCJdKWRubAorY2FzZSAkbWtkaXJfcCBpbgorICBbW1xcLyRdXSogfCA/OltbXFwvXV0qKSA7OworICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Citlc2FjCitdKQorCisjIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAzCisKKyMgX0FNX01BTkdMRV9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fTUFOR0xFX09QVElPTl0sCitbW19BTV9PUFRJT05fXW00X2JwYXRzdWJzdCgkMSwgW1teYS16QS1aMC05X11dLCBbX10pXSkKKworIyBfQU1fU0VUX09QVElPTihOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IG9wdGlvbiBOQU1FLiAgUHJlc2VudGx5IHRoYXQgb25seSBtZWFucyBkZWZpbmluZyBhIGZsYWcgZm9yIHRoaXMgb3B0aW9uLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIDEpXSkKKworIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPUFRJT05TIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgQXV0b21ha2Ugb3B0aW9ucy4KK0FDX0RFRlVOKFtfQU1fU0VUX09QVElPTlNdLAorW0FDX0ZPUkVBQ0goW19BTV9PcHRpb25dLCBbJDFdLCBbX0FNX1NFVF9PUFRJT04oX0FNX09wdGlvbildKV0pCisKKyMgX0FNX0lGX09QVElPTihPUFRJT04sIElGLVNFVCwgW0lGLU5PVC1TRVRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgorQUNfREVGVU4oW19BTV9JRl9PUFRJT05dLAorW200X2lmc2V0KF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbJDJdLCBbJDNdKV0pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1LCAyMDA2CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworQUNfREVGVU4oW0FNX0NfUFJPVE9UWVBFU10sCitbQUNfUkVRVUlSRShbQUNfQ19QUk9UT1RZUEVTXSkKK2lmIHRlc3QgIiRhY19jdl9wcm9nX2NjX3N0ZGMiICE9IG5vOyB0aGVuCisgIFU9IEFOU0kyS05SPQorZWxzZQorICBVPV8gQU5TSTJLTlI9Li9hbnNpMmtucgorZmkKKyMgRW5zdXJlIHNvbWUgY2hlY2tzIG5lZWRlZCBieSBhbnNpMmtuciBpdHNlbGYuCitBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pCitBQ19DSEVDS19IRUFERVJTKFtzdHJpbmcuaF0pCitBQ19TVUJTVChbVV0pZG5sCitBQ19TVUJTVChbQU5TSTJLTlJdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW0FOU0kyS05SXSlkbmwKK10pCisKK0FVX0RFRlVOKFtmcF9DX1BST1RPVFlQRVNdLCBbQU1fQ19QUk9UT1RZUEVTXSkKKworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4gICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0CisKKyMgQU1fU0FOSVRZX0NIRUNLCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGVgCisgICBmaQorICAgcm0gLWYgY29uZnRlc3QuZmlsZQorICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCitmaQorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19JTlNUQUxMX1NUUklQCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKKyMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisjIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCisjIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgorIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCisjIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKKyMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAorW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitkbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQorZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCitBQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBfQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByZXZlbnQgQXV0b21ha2UgZnJvbSBvdXRwdXRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgorIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KK0FDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCisKKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBfQU1fUFJPR19UQVIoRk9STUFUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgorIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKKyMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKKyMgJHRhcmRpci4KKyMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAorIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgorIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgorQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCitbIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorQU1fTUlTU0lOR19QUk9HKFtBTVRBUl0sIFt0YXJdKQorbTRfaWYoWyQxXSwgW3Y3XSwKKyAgICAgW2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJ10sCisgICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCisgICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQorQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQorIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgorX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKK19hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9CisjIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKKyMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KK2ZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCitkbworICBjYXNlICRfYW1fdG9vbCBpbgorICBnbnV0YXIpCisgICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOworICAgIGRvCisgICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhaworICAgIGRvbmUKKyAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgorICAgIDs7CisgIHBsYWludGFyKQorICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCisgICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KKyAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCisgICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSd0YXIgeGYgLScKKyAgICA7OworICBwYXgpCisgICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSdwYXggLXInCisgICAgOzsKKyAgY3BpbykKKyAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCisgICAgOzsKKyAgbm9uZSkKKyAgICBhbV9fdGFyPWZhbHNlCisgICAgYW1fX3Rhcl89ZmFsc2UKKyAgICBhbV9fdW50YXI9ZmFsc2UKKyAgICA7OworICBlc2FjCisKKyAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKKyAgIyBhbmQgYW1fX3VudGFyIHNldC4KKyAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCisKKyAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKKyAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgorICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCisgICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCisgIGZpCitkb25lCitybSAtcmYgY29uZnRlc3QuZGlyCisKK0FDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKK0FDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKK0FDX1NVQlNUKFthbV9fdGFyXSkKK0FDX1NVQlNUKFthbV9fdW50YXJdKQorXSkgIyBfQU1fUFJPR19UQVIKKworbTRfaW5jbHVkZShbYWNpbmNsdWRlLm00XSkKZGlmZiAtLWdpdCBhL2NvbmZpZy5ndWVzcyBiL2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZTMwZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsMTQwNyBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMDMtMDctMDInCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KKyMKKyMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bworIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKKyMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjCisjIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQorIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKKyAgICAgICBleGl0IDEgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJCMgIT0gMDsgdGhlbgorICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgZXhpdCAxCitmaQorCit0cmFwICdleGl0IDEnIDEgMiAxNQorCisjIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCisjIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCisjIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKKyMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KKworIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAorIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgorCisjIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCisKK3NldF9jY19mb3JfYnVpbGQ9JwordHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Cit0cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOworOiAke1RNUERJUj0vdG1wfSA7CisgeyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAorIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8CisgeyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8CisgeyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOworZHVtbXk9JHRtcC9kdW1teSA7Cit0bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKK2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KKyAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKKwlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCisJICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7CisJICBmaSA7CisJZG9uZSA7CisJaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KKwkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7CisJZmkKKwk7OworICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7CisgLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OworZXNhYyA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAorCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5CisJIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAorCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgorCSMKKwkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKKwkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KKwlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCisJVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCisJICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7CisJICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKKwkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKKwkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAorCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkgICAgICAgIG9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDAgOzsKKyAgICBhbWlnYTpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFyYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaHAzMDA6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWM2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWNwcGM6T3BlbkJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTg4azpPcGVuQlNEOio6KikKKwllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWVwcGM6T3BlbkJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBwbWF4Ok9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzZ2k6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWItdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bjM6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICB3Z3Jpc2M6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6T3BlbkJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJZmkKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJZXhpdCAwIDs7CisgICAgQWxwaGEqOk9wZW5WTVM6KjoqKQorCWVjaG8gYWxwaGEtaHAtdm1zCisJZXhpdCAwIDs7CisgICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCisJIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/CisJZWNobyBhbHBoYS1wYy1pbnRlcml4CisJZXhpdCAwIDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCAwIDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgMCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgMCA7OworICAgICo6T1MvMzkwOio6KikKKwllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCisJZXhpdCAwIDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgMDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCisJIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KKwlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCisJZWxzZQorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCAwIDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCAwIDs7CisgICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqKQorCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgorCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3ICYmIGV4aXQgMCA7OworCWVzYWMgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KikKKwllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDAgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIFwKKwkgICYmICRkdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCisJICAmJiBleGl0IDAKKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAorCWV4aXQgMCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCAwIDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDAgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgMCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAJZXhpdCAwIDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgMCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgMCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCAwIDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCAwIDs7CisgICAgKjpBSVg6KjpbNDVdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDAgOzsKKyAgICAqOkFJWDoqOiopCisJZWNobyByczYwMDAtaWJtLWFpeAorCWV4aXQgMCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgMCA7OworICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCisJZWNobyBtNjhrLWJ1bGwtc3lzdjMKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgMCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgMCA7OworICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKKwkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OworCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKKwkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KKwkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisgICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCisgICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCisgICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworCQlmaQorCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KKwkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYworCisgICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCisgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisgICAgICAgICAgICAgIGludCBtYWluICgpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQorICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCisgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJfSBicmVhazsKKyAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KKyAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgIGV4aXQgKDApOworICAgICAgICAgICAgICB9CitFT0YKKwkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCisJCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCisJCWZpIDs7CisJZXNhYworCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQorCXRoZW4KKwkgICAgIyBhdm9pZCBkb3VibGUgZXZhbHVhdGlvbiBvZiAkc2V0X2NjX2Zvcl9idWlsZAorCSAgICB0ZXN0IC1uICIkQ0NfRk9SX0JVSUxEIiB8fCBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0pIHwgZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgMCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDAgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgMCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgMCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCAwIDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgMCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBudjEtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJyAKKwlleGl0IDAgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgMCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RnJlZUJTRDoqOip8KjpHTlUvRnJlZUJTRDoqOiopCisJIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciB1c2VzIGdsaWJjLgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZiBfX0dMSUJDX18gPj0gMgorCUxJQkM9Z251CisJI2Vsc2UKKwlMSUJDPQorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAorCSMgR05VL0ZyZWVCU0Qgc3lzdGVtcyBoYXZlIGEgImsiIHByZWZpeCB0byBpbmRpY2F0ZSB3ZSBhcmUgdXNpbmcKKwkjIEZyZWVCU0QncyBrZXJuZWwsIGJ1dCBub3QgdGhlIGNvbXBsZXRlIE9TLgorCWNhc2UgJHtMSUJDfSBpbiBnbnUpIGtlcm5lbF9vbmx5PSdrJyA7OyBlc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tJHtrZXJuZWxfb25seX1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCR7TElCQzorLSRMSUJDfQorCWV4aXQgMCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCAwIDs7CisgICAgaSo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDAgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgMCA7OworICAgIHg4NjpJbnRlcml4KjpbMzRdKikKKwllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1wuLiovLycKKwlleGl0IDAgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDAgOzsKKyAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKKwkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/CisJZWNobyBpNTg2LXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCAwIDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCAwIDs7CisgICAgcHJlcCo6U3VuT1M6NS4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgICo6R05VOio6KikKKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDAgOzsKKyAgICBpKjg2Ok1pbml4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKKwlleGl0IDAgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBtaXBzOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHMKKwkjdW5kZWYgbWlwc2VsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwc2VsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzCisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCisJOzsKKyAgICBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwczY0CisJI3VuZGVmIG1pcHM2NGVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwczY0ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHM2NAorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiICYmIGV4aXQgMAorCTs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBhbHBoYTpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KKwkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7CisJICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKKwkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7CisJICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKKwkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OworICAgICAgICBlc2FjCisJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDAgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgMCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgaSo4NjpMaW51eDoqOiopCisJIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KKwkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuIGNkIHRvIHRoZSByb290IGRpcmVjdG9yeSB0byBwcmV2ZW50CisJIyBwcm9ibGVtcyB3aXRoIG90aGVyIHByb2dyYW1zIG9yIGRpcmVjdG9yaWVzIGNhbGxlZCBgbGQnIGluIHRoZSBwYXRoLgorCSMgU2V0IExDX0FMTD1DIHRvIGVuc3VyZSBsZCBvdXRwdXRzIG1lc3NhZ2VzIGluIEVuZ2xpc2guCisJbGRfc3VwcG9ydGVkX3RhcmdldHM9YGNkIC87IExDX0FMTD1DIGxkIC0taGVscCAyPiYxIFwKKwkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgdGFyZ2V0czovIWQKKwkJCQkgICAgcy9bIAldWyAJXSovIC9nCisJCQkJICAgIHMvLipzdXBwb3J0ZWQgdGFyZ2V0czogKi8vCisJCQkJICAgIHMvIC4qLy8KKwkJCQkgICAgcCdgCisgICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfdGFyZ2V0cyIgaW4KKwkgIGVsZjMyLWkzODYpCisJCVRFTlRBVElWRT0iJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnUiCisJCTs7CisJICBhLm91dC1pMzg2LWxpbnV4KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiCisJCWV4aXQgMCA7OworCSAgY29mZi1pMzg2KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCisJCWV4aXQgMCA7OworCSAgIiIpCisJCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgorCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKKwkJZXhpdCAwIDs7CisJZXNhYworCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisJI2lmZGVmIF9fRUxGX18KKwkjIGlmZGVmIF9fR0xJQkNfXworCSMgIGlmIF9fR0xJQkNfXyA+PSAyCisJTElCQz1nbnUKKwkjICBlbHNlCisJTElCQz1nbnVsaWJjMQorCSMgIGVuZGlmCisJIyBlbHNlCisJTElCQz1nbnVsaWJjMQorCSMgZW5kaWYKKwkjZWxzZQorCSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAorCXRlc3QgeCIke0xJQkN9IiAhPSB4ICYmIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIgJiYgZXhpdCAwCisJdGVzdCB4IiR7VEVOVEFUSVZFfSIgIT0geCAmJiBlY2hvICIke1RFTlRBVElWRX0iICYmIGV4aXQgMAorCTs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCAwIDs7CisgICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKKyAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCisgICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKKwkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCisgICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCAwIDs7CisgICAgaSo4NjpPUy8yOio6KikKKwkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQorCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14CisJZXhpdCAwIDs7CisgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCisJZXhpdCAwIDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgMCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC4wKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCAwIDs7CisgICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKKwlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKKwlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQorCWZpCisJZXhpdCAwIDs7CisgICAgaSo4NjoqOjU6Wzc4XSopCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDAgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgMCA7OworICAgIHBjOio6KjoqKQorCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgorICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAorICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpMzg2LgorCWVjaG8gaTM4Ni1wYy1tc2Rvc2RqZ3BwCisgICAgICAgIGV4aXQgMCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDAgOzsKKyAgICBwYXJhZ29uOio6KjoqKQorCWVjaG8gaTg2MC1pbnRlbC1vc2YxCisJZXhpdCAwIDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgMCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCAwIDs7CisgICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQorCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKKwlleGl0IDAgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgMCA7OworICAgIE02OCo6KjpSM1ZbNTY3XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JyAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgMCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuMCo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgMCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCAwIDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCAwIDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDAgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCAwIDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCAwIDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpSaGFwc29keToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RGFyd2luOio6KikKKwljYXNlIGB1bmFtZSAtcGAgaW4KKwkgICAgKjg2KSBVTkFNRV9QUk9DRVNTT1I9aTY4NiA7OworCSAgICBwb3dlcnBjKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDAgOzsKKyAgICBOU1ItW0RHS0xOUFRWV106Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgMCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgMCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgMCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgMCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgMCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCAwIDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDAgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDAgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgMCA7OworICAgIFNFSToqOio6U0VJVVgpCisgICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgJGR1bW15ICYmIGV4aXQgMAorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvY29uZmlnLworCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZy5oLmluIGIvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYTMzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMzQyIEBACisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogZGVidWcgZGVmaW5lICovCisjdW5kZWYgQUJPUlRGUAorCisvKiBlbmFibGUgVkJSIGJpdHJhdGUgaGlzdG9ncmFtICovCisjdW5kZWYgQlJISVNUCisKKy8qIERlZmluZSB0byBvbmUgb2YgYF9nZXRiNjcnLCBgR0VUQjY3JywgYGdldGI2NycgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAKKyAgIHN5c3RlbXMuIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGBhbGxvY2EuYycgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLgorICAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgdG8gMSBpZiB1c2luZyBgYWxsb2NhLmMnLiAqLworI3VuZGVmIENfQUxMT0NBCisKKy8qIGFsb3Qgb2YgZGVidWcgb3V0cHV0ICovCisjdW5kZWYgREVCVUcKKworLyogYWxsb3cgdG8gY29tcHV0ZSBhIG1vcmUgYWNjdXJhdGUgcmVwbGF5Z2FpbiB2YWx1ZSAqLworI3VuZGVmIERFQ09ERV9PTl9USEVfRkxZCisKKy8qIGRvdWJsZSBpcyBmYXN0ZXIgdGhhbiBmbG9hdCBvbiBBbHBoYSAqLworI3VuZGVmIEZMT0FUCisKKy8qIGZsb2F0IGluc3RlYWQgb2YgZG91YmxlICovCisjdW5kZWYgRkxPQVQ4CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGBhbGxvY2EnLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4KKyAgICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiB3ZSBsaW5rIGFnYWluc3QgbGliZWZlbmNlICovCisjdW5kZWYgSEFWRV9FRkVOQ0UKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0VSUk5PX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCisKKy8qIGFkZCBpZWVlNzU0X2Zsb2F0MzJfdCB0eXBlICovCisjdW5kZWYgSEFWRV9JRUVFNzU0X0ZMT0FUMzJfVAorI2lmbmRlZiBIQVZFX0lFRUU3NTRfRkxPQVQzMl9UCisJdHlwZWRlZiBmbG9hdCBpZWVlNzU0X2Zsb2F0MzJfdDsKKyNlbmRpZgorCisvKiBhZGQgaWVlZTc1NF9mbG9hdDY0X3QgdHlwZSAqLworI3VuZGVmIEhBVkVfSUVFRTc1NF9GTE9BVDY0X1QKKyNpZm5kZWYgSEFWRV9JRUVFNzU0X0ZMT0FUNjRfVAorCXR5cGVkZWYgZG91YmxlIGllZWU3NTRfZmxvYXQ2NF90OworI2VuZGlmCisKKy8qIHN5c3RlbSBoYXMgODAgYml0IGZsb2F0cyAqLworI3VuZGVmIEhBVkVfSUVFRTg1NF9GTE9BVDgwCisKKy8qIGFkZCBpZWVlODU0X2Zsb2F0ODBfdCB0eXBlICovCisjdW5kZWYgSEFWRV9JRUVFODU0X0ZMT0FUODBfVAorI2lmbmRlZiBIQVZFX0lFRUU4NTRfRkxPQVQ4MF9UCisJdHlwZWRlZiBsb25nIGRvdWJsZSBpZWVlODU0X2Zsb2F0ODBfdDsKKyNlbmRpZgorCisvKiBhZGQgaW50MTZfdCB0eXBlICovCisjdW5kZWYgSEFWRV9JTlQxNl9UCisjaWZuZGVmIEhBVkVfSU5UMTZfVAorCXR5cGVkZWYgc2hvcnQgaW50MTZfdDsKKyNlbmRpZgorCisvKiBhZGQgaW50MzJfdCB0eXBlICovCisjdW5kZWYgSEFWRV9JTlQzMl9UCisjaWZuZGVmIEhBVkVfSU5UMzJfVAorI3VuZGVmIEFfSU5UMzJfVAorCXR5cGVkZWYgQV9JTlQzMl9UIGludDMyX3Q7CisjZW5kaWYKKworLyogYWRkIGludDY0X3QgdHlwZSAqLworI3VuZGVmIEhBVkVfSU5UNjRfVAorI2lmbmRlZiBIQVZFX0lOVDY0X1QKKyN1bmRlZiBBX0lOVDY0X1QKKwl0eXBlZGVmIEFfSU5UNjRfVCBpbnQ2NF90OworI2VuZGlmCisKKy8qIGFkZCBpbnQ4X3QgdHlwZSAqLworI3VuZGVmIEhBVkVfSU5UOF9UCisjaWZuZGVmIEhBVkVfSU5UOF9UCisJdHlwZWRlZiBjaGFyIGludDhfdDsKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvc291bmRjYXJkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfU09VTkRDQVJEX0gKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHR5cGUgYGxvbmcgZG91YmxlJyB3b3JrcyBhbmQgaGFzIG1vcmUgcmFuZ2Ugb3IgcHJlY2lzaW9uCisgICB0aGFuIGBkb3VibGUnLiAqLworI3VuZGVmIEhBVkVfTE9OR19ET1VCTEUKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHR5cGUgYGxvbmcgZG91YmxlJyB3b3JrcyBhbmQgaGFzIG1vcmUgcmFuZ2Ugb3IgcHJlY2lzaW9uCisgICB0aGFuIGBkb3VibGUnLiAqLworI3VuZGVmIEhBVkVfTE9OR19ET1VCTEVfV0lERVIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBidWlsZCB3aXRoIG1wZ2xpYiBzdXBwb3J0ICovCisjdW5kZWYgSEFWRV9NUEdMSUIKKworLyogaGF2ZSBuYXNtICovCisjdW5kZWYgSEFWRV9OQVNNCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmN1cnNlcy90ZXJtY2FwLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkNVUlNFU19URVJNQ0FQX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU09DS0VUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT0wKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc291bmRjYXJkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NPVU5EQ0FSRF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogaGF2ZSB0ZXJtY2FwICovCisjdW5kZWYgSEFWRV9URVJNQ0FQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGVybWNhcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1RFUk1DQVBfSAorCisvKiBhZGQgdWludDE2X3QgdHlwZSAqLworI3VuZGVmIEhBVkVfVUlOVDE2X1QKKyNpZm5kZWYgSEFWRV9VSU5UMTZfVAorCXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CisjZW5kaWYKKworLyogYWRkIHVpbnQzMl90IHR5cGUgKi8KKyN1bmRlZiBIQVZFX1VJTlQzMl9UCisjaWZuZGVmIEhBVkVfVUlOVDMyX1QKKyN1bmRlZiBBX1VJTlQzMl9UCisJdHlwZWRlZiBBX1VJTlQzMl9UIHVpbnQzMl90OworI2VuZGlmCisKKy8qIGFkZCB1aW50NjRfdCB0eXBlICovCisjdW5kZWYgSEFWRV9VSU5UNjRfVAorI2lmbmRlZiBIQVZFX1VJTlQ2NF9UCisjdW5kZWYgQV9VSU5UNjRfVAorCXR5cGVkZWYgQV9VSU5UNjRfVCB1aW50NjRfdDsKKyNlbmRpZgorCisvKiBhZGQgdWludDhfdCB0eXBlICovCisjdW5kZWYgSEFWRV9VSU5UOF9UCisjaWZuZGVmIEhBVkVfVUlOVDhfVAorCXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworI2VuZGlmCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx4bW1pbnRyaW4uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9YTU1JTlRSSU5fSAorCisvKiByZXF1ZXN0ZWQgYnkgRnJhbmssIHNlZW1zIHRvIGJlIHRlbXBvcmFyeSBuZWVkZWQgZm9yIGEgc21vb3RoIHRyYW5zaXRpb24gKi8KKyN1bmRlZiBMQU1FX0xJQlJBUllfQlVJTEQKKworLyogc2V0IHRvIDEgaWYgeW91IGhhdmUgbGlic25kZmlsZSAqLworI3VuZGVmIExJQlNOREZJTEUKKworLyogdXNlIE1NWCB2ZXJzaW9uIG9mIGNob29zZV90YWJsZSAqLworI3VuZGVmIE1NWF9jaG9vc2VfdGFibGUKKworLyogbm8gZGVidWcgYnVpbGQgKi8KKyN1bmRlZiBOREVCVUcKKworLyogYnVpbGQgd2l0aG91dCBob29rcyBmb3IgYW5hbHl6ZXIgKi8KKyN1bmRlZiBOT0FOQUxZU0lTCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI3VuZGVmIFBST1RPVFlQRVMKKworLyogVGhlIHNpemUgb2YgYGRvdWJsZScsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfRE9VQkxFCisKKy8qIFRoZSBzaXplIG9mIGBmbG9hdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfRkxPQVQKKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfSU5UCisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9MT05HCisKKy8qIFRoZSBzaXplIG9mIGBsb25nIGRvdWJsZScsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTE9OR19ET1VCTEUKKworLyogVGhlIHNpemUgb2YgYGxvbmcgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTE9OR19MT05HCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfU0hPUlQKKworLyogVGhlIHNpemUgb2YgYHVuc2lnbmVkIGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfVU5TSUdORURfSU5UCisKKy8qIFRoZSBzaXplIG9mIGB1bnNpZ25lZCBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9VTlNJR05FRF9MT05HCisKKy8qIFRoZSBzaXplIG9mIGB1bnNpZ25lZCBsb25nIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX1VOU0lHTkVEX0xPTkdfTE9ORworCisvKiBUaGUgc2l6ZSBvZiBgdW5zaWduZWQgc2hvcnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX1VOU0lHTkVEX1NIT1JUCisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVudGltZS4KKwlTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisJU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisJU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24gKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIElFRUU3NTQgY29tcGF0aWJsZSBtYWNoaW5lICovCisjdW5kZWYgVEFLRUhJUk9fSUVFRTc1NF9IQUNLCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLworI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQorCisvKiBmYXN0ZXIgbG9nIGltcGxlbWVudGF0aW9uIHdpdGggbGVzcyBidXQgZW5vdWdoIHByZWNpc3Npb24gKi8KKyN1bmRlZiBVU0VfRkFTVF9MT0cKKworLyogYnVpbGQgd2l0aCBsYXllciAxIGRlY29kaW5nICovCisjdW5kZWYgVVNFX0xBWUVSXzEKKworLyogYnVpbGQgd2l0aCBsYXllciAyIGRlY29kaW5nICovCisjdW5kZWYgVVNFX0xBWUVSXzIKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI3VuZGVmIFZFUlNJT04KKworLyogRGVmaW5lIGlmIHVzaW5nIHRoZSBkbWFsbG9jIGRlYnVnZ2luZyBtYWxsb2MgcGFja2FnZSAqLworI3VuZGVmIFdJVEhfRE1BTExPQworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlCisgICBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gKi8KKyN1bmRlZiBXT1JEU19CSUdFTkRJQU4KKworLyogRGVmaW5lIHRvIDEgaWYgb24gQUlYIDMuCisgICBTeXN0ZW0gaGVhZGVycyBzb21ldGltZXMgZGVmaW5lIHRoaXMuCisgICBXZSBqdXN0IHdhbnQgdG8gYXZvaWQgYSByZWRlZmluaXRpb24gZXJyb3IgbWVzc2FnZS4gICovCisjaWZuZGVmIF9BTExfU09VUkNFCisjIHVuZGVmIF9BTExfU09VUkNFCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBmaWxlIG9mZnNldCwgb24gaG9zdHMgd2hlcmUgdGhpcyBpcyBzZXR0YWJsZS4gKi8KKyN1bmRlZiBfRklMRV9PRkZTRVRfQklUUworCisvKiBEZWZpbmUgZm9yIGxhcmdlIGZpbGVzLCBvbiBBSVgtc3R5bGUgaG9zdHMuICovCisjdW5kZWYgX0xBUkdFX0ZJTEVTCisKKy8qIERlZmluZSB0byAxIGlmIG9uIE1JTklYLiAqLworI3VuZGVmIF9NSU5JWAorCisvKiBEZWZpbmUgdG8gMiBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgUE9TSVguMSBmZWF0dXJlcyBleGNlcHQgd2l0aAorICAgdGhpcyBkZWZpbmVkLiAqLworI3VuZGVmIF9QT1NJWF8xX1NPVVJDRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3IgYHN0YXQnIGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIHdlJ3JlIG9uIERFQyBBbHBoYSAqLworI3VuZGVmIF9fREVDQUxQSEFfXworCisvKiB3b3JrIGFyb3VuZCBhIGdsaWJjIGJ1ZyAqLworI3VuZGVmIF9fTk9fTUFUSF9JTkxJTkVTCisKKy8qIERlZmluZSBsaWtlIFBST1RPVFlQRVM7IHRoaXMgY2FuIGJlIHVzZWQgYnkgc3lzdGVtIGhlYWRlcnMuICovCisjdW5kZWYgX19QUk9UT1RZUEVTCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjdW5kZWYgaW5saW5lCisjZW5kaWYKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNpemVfdApkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWQ3ZjczMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNTA0IEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDAzLTA3LTA0JworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCAwOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcykKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgXAorCXwgYzR4IHwgY2xpcHBlciBcCisJfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAorCXwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCisJfCBpcDJrIFwKKwl8IG0zMnIgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayB8IG1jb3JlIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbXNwNDMwIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3BlbnJpc2MgfCBvcjMyIFwKKwl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCisJfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgfCBwcGNiZSBcCisJfCBweXJhbWlkIFwKKwl8IHNoIHwgc2hbMTIzNF0gfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmN2OSB8IHNwYXJjdjliIFwKKwl8IHN0cm9uZ2FybSBcCisJfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAorCXwgdjg1MCB8IHY4NTBlIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhzY2FsZSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGspCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKKwkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCisJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKKwkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKKwkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCisJaSo4NiB8IHg4Nl82NCkKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJNTgwLSogXAorCXwgYTI5ay0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKKwl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYW1kNjQtKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogXAorCXwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogXAorCXwgbTMyci0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1jb3JlLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBub25lLSogfCBucDEtKiB8IG52MS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIHwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIHwgdGh1bWItKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCisJfCB0cm9uLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogfCB4c3Rvcm15MTYtKiBcCisJfCB4dGVuc2EtKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwljOTApCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQorCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWdvMzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tZ28zMgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloODMwMHhyYXkpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0teHJheQorCQk7OworCWg4NTAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCTs7CisjIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KKwlpKjg2djMyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YzMgorCQk7OworCWkqODZ2NCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjQKKwkJOzsKKwlpKjg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaSo4NnNvbDIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlpMzg2bWFjaCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKKwkJb3M9LW1hY2gKKwkJOzsKKwlpMzg2LXZzdGEgfCB2c3RhKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tdnN0YQorCQk7OworCWlyaXMgfCBpcmlzNGQpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1pcml4KikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LWlyaXg0CisJCQk7OworCQllc2FjCisJCTs7CisJaXNpNjggfCBpc2kpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKKwkJb3M9LXN5c3YKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW1peCopCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW12cykKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisJbmNyMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgorCQlvcz0tc3lzdjQKKwkJOzsKKwluZXRic2QzODYpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1uZXRic2QKKwkJOzsKKwluZXR3aW5kZXIpCisJCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCisJCW9zPS1saW51eAorCQk7OworCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzMTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmVjdjcwKQorCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwluZXh0IHwgbSotbmV4dCApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0CisJCWNhc2UgJG9zIGluCisJCSAgICAtbmV4dHN0ZXAqICkKKwkJCTs7CisJCSAgICAtbnMyKikKKwkJICAgICAgb3M9LW5leHRzdGVwMgorCQkJOzsKKwkJICAgICopCisJCSAgICAgIG9zPS1uZXh0c3RlcDMKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwluaDMwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaFs0NV0wMDApCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaW5keTk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1uaW5keQorCQk7OworCW1vbjk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1tb245NjAKKwkJOzsKKwlub25zdG9wdXgpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKKwkJb3M9LW5vbnN0b3B1eAorCQk7OworCW5wMSkKKwkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKKwkJOzsKKwludjEpCisJCWJhc2ljX21hY2hpbmU9bnYxLWNyYXkKKwkJb3M9LXVuaWNvc21wCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9yMzIgfCBvcjMyLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bTQpCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtNC0qKQorCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQorCQk7OworCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJOzsKKwlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkJOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCisJCTs7CisJcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KKwkJOzsKKwlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNjQpCisJCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCisJCTs7CisJc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWM1NHggfCBjNTR4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzU1eCB8IGM1NXgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNnggfCBjNngqKQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2gzIHwgc2g0IHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OSB8IHNwYXJjdjliKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCisJICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50by1xbngqKQorCQk7OworCS1udG8qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKKwkJOzsKKwktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworCS13aW5jZSopCisJCW9zPS13aW5jZQorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktYXRoZW9zKikKKwkJb3M9LWF0aGVvcworCQk7OworCS0zODZic2QpCisJCW9zPS1ic2QKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbm92YSopCisJCW9zPS1ydG1rLW5vdmEKKwkJOzsKKwktbnMyICkKKwkJb3M9LW5leHRzdGVwMgorCQk7OworCS1uc2sqKQorCQlvcz0tbnNrCisJCTs7CisJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgorCS1zaW5peDUuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKKwkJOzsKKwktc2luaXgqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwkta2FvcyopCisJCW9zPS1rYW9zCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworICAgIGM0eC0qIHwgdGljNHgtKikKKyAgICAgICAgb3M9LWNvZmYKKyAgICAgICAgOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKKwkJIyBkZWZhdWx0LgorCQkjIG9zPS1zdW5vczQKKwkJOzsKKwltNjgqLWNpc2NvKQorCQlvcz0tYW91dAorCQk7OworCW1pcHMqLWNpc2NvKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotKikKKwkJb3M9LWVsZgorCQk7OworCW9yMzItKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1iZSkKKwkJb3M9LWJlb3MKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlnTVMuaCBiL2NvbmZpZ01TLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyOTBhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ01TLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBkb3VibGUuICAqLworI2RlZmluZSBTSVpFT0ZfRE9VQkxFIDgKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGZsb2F0LiAgKi8KKyNkZWZpbmUgU0laRU9GX0ZMT0FUIDQKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGludC4gICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgbG9uZy4gICovCisjZGVmaW5lIFNJWkVPRl9MT05HIDQKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGxvbmcgZG91YmxlLiAgKi8KKyNkZWZpbmUgU0laRU9GX0xPTkdfRE9VQkxFIDEyCisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzaG9ydC4gICovCisjZGVmaW5lIFNJWkVPRl9TSE9SVCAyCisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSB1bnNpZ25lZCBpbnQuICAqLworI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfSU5UIDQKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHVuc2lnbmVkIGxvbmcuICAqLworI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfTE9ORyA0CisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSB1bnNpZ25lZCBzaG9ydC4gICovCisjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9TSE9SVCAyCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjZGVmaW5lIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfRkNOVExfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX0xJTUlUU19ICisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2RlZmluZSBQQUNLQUdFICJsYW1lIgorCisvKiBEZWZpbmUgaWYgY29tcGlsZXIgaGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyNkZWZpbmUgUFJPVE9UWVBFUyAxCisKKy8qIGVuYWJsZSBWQlIgYml0cmF0ZSBoaXN0b2dyYW0gKi8KKyNkZWZpbmUgQlJISVNUIDEKKworLyogSUVFRTc1NCBjb21wYXRpYmxlIG1hY2hpbmUgKi8KKyNkZWZpbmUgVEFLRUhJUk9fSUVFRTc1NF9IQUNLIDEKKworLyogZmFzdGVyIGxvZyBpbXBsZW1lbnRhdGlvbiB3aXRoIGxlc3MgYnV0IGVub3VnaCBwcmVjaXNzaW9uICovCisjZGVmaW5lIFVTRV9GQVNUX0xPRyAxCisKKyNkZWZpbmUgSEFWRV9TVFJDSFIKKyNkZWZpbmUgSEFWRV9NRU1DUFkKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDMwNSApCisJdHlwZWRlZiBfX2ludDggIGludDhfdDsKKwl0eXBlZGVmIF9faW50MTYgaW50MTZfdDsKKwl0eXBlZGVmIF9faW50MzIgaW50MzJfdDsKKwl0eXBlZGVmIF9faW50NjQgaW50NjRfdDsKKworCXR5cGVkZWYgdW5zaWduZWQgX19pbnQ4ICB1aW50OF90OworCXR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiB1aW50MTZfdDsKKwl0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgdWludDMyX3Q7CisJdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OworCisJdHlwZWRlZiBmbG9hdCAgZmxvYXQzMl90OworCXR5cGVkZWYgZG91YmxlIGZsb2F0NjRfdDsKKyNlbGlmIGRlZmluZWQgKF9fR05VQ19fKQorI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIHVpbnQ4X3QgdW5zaWduZWQgY2hhcgorI2RlZmluZSB1aW50MTZfdCB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSB1aW50MzJfdCB1bnNpZ25lZCBpbnQKKyNkZWZpbmUgdWludDY0X3QgdW5zaWduZWQgbG9uZyBsb25nCisKKyNkZWZpbmUgaW50OF90IHNpZ25lZCBjaGFyCisjZGVmaW5lIGludDE2X3Qgc2lnbmVkIHNob3J0CisjZGVmaW5lIGludDMyX3Qgc2lnbmVkIGludAorI2RlZmluZSBpbnQ2NF90IHNpZ25lZCBsb25nIGxvbmcKKyNlbmRpZgorCit0eXBlZGVmIGxvbmcgZG91YmxlIGllZWU4NTRfZmxvYXQ4MF90OwordHlwZWRlZiBkb3VibGUgICAgICBpZWVlNzU0X2Zsb2F0NjRfdDsKK3R5cGVkZWYgZmxvYXQgICAgICAgaWVlZTc1NF9mbG9hdDMyX3Q7CisKKyNpZmRlZiBIQVZFX01QR0xJQgorIyBkZWZpbmUgREVDT0RFX09OX1RIRV9GTFkgMQorI2VuZGlmCisKKyNpZmRlZiBMQU1FX0FDTQorLyogbWVtb3J5IGhhY2tpbmcgZm9yIGRyaXZlciBwdXJwb3NlcyAqLworI2RlZmluZSBjYWxsb2MoeCx5KSBhY21fQ2FsbG9jKHgseSkKKyNkZWZpbmUgZnJlZSh4KSAgICAgYWNtX0ZyZWUoeCkKKyNkZWZpbmUgbWFsbG9jKHgpICAgYWNtX01hbGxvYyh4KQorCisjaW5jbHVkZSA8c3RkZGVmLmg+Cit2b2lkICphY21fQ2FsbG9jKCBzaXplX3QgbnVtLCBzaXplX3Qgc2l6ZSApOwordm9pZCAqYWNtX01hbGxvYyggc2l6ZV90IHNpemUgKTsKK3ZvaWQgYWNtX0ZyZWUoIHZvaWQgKiBtZW0pOworI2VuZGlmIC8qIExBTUVfQUNNICovCisKKyNkZWZpbmUgTEFNRV9MSUJSQVJZX0JVSUxECisKKworI2lmZGVmIEhBVkVfTkFTTQorICAgICNpZiAoZGVmaW5lZChfX0lDTCkgJiYgKF9fSUNMID49IDQ1MCkpCisgICAgICAgICNkZWZpbmUgSEFWRV9YTU1JTlRSSU5fSAorICAgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgICAgICNpbmNsdWRlIDxtYWxsb2MuaD4KKyAgICAgICAgI2lmZGVmIF9tbV9tYWxsb2MKKyAgICAgICAgICAgICNkZWZpbmUgSEFWRV9YTU1JTlRSSU5fSAorICAgICAgICAjZW5kaWYKKyAgICAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX01fWDY0CisgICAgICAgICNkZWZpbmUgSEFWRV9YTU1JTlRSSU5fSAorI2VuZGlmCmRpZmYgLS1naXQgYS9jb25maWdNYWMuaCBiL2NvbmZpZ01hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMTljYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdNYWMuaApAQCAtMCwwICsxLDM1OCBAQAorLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBkZWJ1ZyBkZWZpbmUgKi8KKy8qICN1bmRlZiBBQk9SVEZQICovCisKKy8qIGVuYWJsZSBWQlIgYml0cmF0ZSBoaXN0b2dyYW0gKi8KKyNkZWZpbmUgQlJISVNUIDEKKworLyogRGVmaW5lIHRvIG9uZSBvZiBgX2dldGI2NycsIGBHRVRCNjcnLCBgZ2V0YjY3JyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUAorICAgc3lzdGVtcy4gVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYGFsbG9jYS5jJyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuCisgICAqLworLyogI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5EICovCisKKy8qIERlZmluZSB0byAxIGlmIHVzaW5nIGBhbGxvY2EuYycuICovCisvKiAjdW5kZWYgQ19BTExPQ0EgKi8KKworLyogYWxvdCBvZiBkZWJ1ZyBvdXRwdXQgKi8KKy8qICN1bmRlZiBERUJVRyAqLworCisvKiBhbGxvdyB0byBjb21wdXRlIGEgbW9yZSBhY2N1cmF0ZSByZXBsYXlnYWluIHZhbHVlICovCisjdW5kZWYgREVDT0RFX09OX1RIRV9GTFkgCisKKy8qIGRvdWJsZSBpcyBmYXN0ZXIgdGhhbiBmbG9hdCBvbiBBbHBoYSAqLworLyogI3VuZGVmIEZMT0FUICovCisKKy8qIGZsb2F0IGluc3RlYWQgb2YgZG91YmxlICovCisvKiAjdW5kZWYgRkxPQVQ4ICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGBhbGxvY2EnLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAqLworI2RlZmluZSBIQVZFX0FMTE9DQSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4KKyAgICovCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0RMRkNOX0ggMQorCisvKiB3ZSBsaW5rIGFnYWluc3QgbGliZWZlbmNlICovCisvKiAjdW5kZWYgSEFWRV9FRkVOQ0UgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCisKKy8qIGhhdmUgd29ya2luZyBHVEsgKi8KKy8qICN1bmRlZiBIQVZFX0dUSyAqLworCisvKiBhZGQgaWVlZTc1NF9mbG9hdDMyX3QgdHlwZSAqLworLyogI3VuZGVmIEhBVkVfSUVFRTc1NF9GTE9BVDMyX1QgKi8KKyNpZm5kZWYgSEFWRV9JRUVFNzU0X0ZMT0FUMzJfVAorCXR5cGVkZWYgZmxvYXQgaWVlZTc1NF9mbG9hdDMyX3Q7CisjZW5kaWYKKworLyogYWRkIGllZWU3NTRfZmxvYXQ2NF90IHR5cGUgKi8KKy8qICN1bmRlZiBIQVZFX0lFRUU3NTRfRkxPQVQ2NF9UICovCisjaWZuZGVmIEhBVkVfSUVFRTc1NF9GTE9BVDY0X1QKKwl0eXBlZGVmIGRvdWJsZSBpZWVlNzU0X2Zsb2F0NjRfdDsKKyNlbmRpZgorCisvKiBzeXN0ZW0gaGFzIDgwIGJpdCBmbG9hdHMgKi8KKyNkZWZpbmUgSEFWRV9JRUVFODU0X0ZMT0FUODAgMQorCisvKiBhZGQgaWVlZTg1NF9mbG9hdDgwX3QgdHlwZSAqLworLyogI3VuZGVmIEhBVkVfSUVFRTg1NF9GTE9BVDgwX1QgKi8KKyNpZm5kZWYgSEFWRV9JRUVFODU0X0ZMT0FUODBfVAorCXR5cGVkZWYgbG9uZyBkb3VibGUgaWVlZTg1NF9mbG9hdDgwX3Q7CisjZW5kaWYKKworLyogYWRkIGludDE2X3QgdHlwZSAqLworI2RlZmluZSBIQVZFX0lOVDE2X1QgMQorI2lmbmRlZiBIQVZFX0lOVDE2X1QKKwl0eXBlZGVmIHNob3J0IGludDE2X3Q7CisjZW5kaWYKKworLyogYWRkIGludDMyX3QgdHlwZSAqLworI2RlZmluZSBIQVZFX0lOVDMyX1QgMQorI2lmbmRlZiBIQVZFX0lOVDMyX1QKKyNkZWZpbmUgQV9JTlQzMl9UIGludAorCXR5cGVkZWYgQV9JTlQzMl9UIGludDMyX3Q7CisjZW5kaWYKKworLyogYWRkIGludDY0X3QgdHlwZSAqLworI2RlZmluZSBIQVZFX0lOVDY0X1QgMQorI2lmbmRlZiBIQVZFX0lOVDY0X1QKKyNkZWZpbmUgQV9JTlQ2NF9UIGxvbmcgbG9uZworCXR5cGVkZWYgQV9JTlQ2NF9UIGludDY0X3Q7CisjZW5kaWYKKworLyogYWRkIGludDhfdCB0eXBlICovCisjZGVmaW5lIEhBVkVfSU5UOF9UIDEKKyNpZm5kZWYgSEFWRV9JTlQ4X1QKKwl0eXBlZGVmIGNoYXIgaW50OF90OworI2VuZGlmCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0xJTUlUU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9zb3VuZGNhcmQuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9MSU5VWF9TT1VORENBUkRfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBsb25nIGRvdWJsZSB3b3JrcyBhbmQgaGFzIG1vcmUgcmFuZ2Ugb3IgcHJlY2lzaW9uIHRoYW4KKyAgIGRvdWJsZS4gKi8KKyNkZWZpbmUgSEFWRV9MT05HX0RPVUJMRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKworLyogYnVpbGQgd2l0aCBtcGdsaWIgc3VwcG9ydCAqLworI3VuZGVmIEhBVkVfTVBHTElCIAorCisvKiBoYXZlIG5hc20gKi8KKy8qICN1bmRlZiBIQVZFX05BU00gKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuY3Vyc2VzL3Rlcm1jYXAuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9OQ1VSU0VTX1RFUk1DQVBfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU09DS0VUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJUT0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb3VuZGNhcmQuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TWVNfU09VTkRDQVJEX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBoYXZlIHRlcm1jYXAgKi8KKyNkZWZpbmUgSEFWRV9URVJNQ0FQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0ZXJtY2FwLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1RFUk1DQVBfSCAxCisKKy8qIGFkZCB1aW50MTZfdCB0eXBlICovCisjZGVmaW5lIEhBVkVfVUlOVDE2X1QgMQorI2lmbmRlZiBIQVZFX1VJTlQxNl9UCisJdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKKyNlbmRpZgorCisvKiBhZGQgdWludDMyX3QgdHlwZSAqLworI2RlZmluZSBIQVZFX1VJTlQzMl9UIDEKKyNpZm5kZWYgSEFWRV9VSU5UMzJfVAorI2RlZmluZSBBX1VJTlQzMl9UIHVuc2lnbmVkIGludAorCXR5cGVkZWYgQV9VSU5UMzJfVCB1aW50MzJfdDsKKyNlbmRpZgorCisvKiBhZGQgdWludDY0X3QgdHlwZSAqLworI2RlZmluZSBIQVZFX1VJTlQ2NF9UIDEKKyNpZm5kZWYgSEFWRV9VSU5UNjRfVAorI2RlZmluZSBBX1VJTlQ2NF9UIHVuc2lnbmVkIGxvbmcgbG9uZworCXR5cGVkZWYgQV9VSU5UNjRfVCB1aW50NjRfdDsKKyNlbmRpZgorCisvKiBhZGQgdWludDhfdCB0eXBlICovCisjZGVmaW5lIEhBVkVfVUlOVDhfVCAxCisjaWZuZGVmIEhBVkVfVUlOVDhfVAorCXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworI2VuZGlmCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogd2luc29jayAqLworLyogI3VuZGVmIEhBVkVfV0lOU09DS0VUICovCisKKy8qIHJlcXVlc3RlZCBieSBGcmFuaywgc2VlbXMgdG8gYmUgdGVtcG9yYXJ5IG5lZWRlZCBmb3IgYSBzbW9vdGggdHJhbnNpdGlvbiAqLworI2RlZmluZSBMQU1FX0xJQlJBUllfQlVJTEQgMQorCisvKiBidWlsZCB3aXRoIGxpYnNuZGZpbGUgc3VwcG9ydCAqLworLyogI3VuZGVmIExJQlNOREZJTEUgKi8KKworLyogdXNlIE1NWCB2ZXJzaW9uIG9mIGNob29zZV90YWJsZSAqLworLyogI3VuZGVmIE1NWF9jaG9vc2VfdGFibGUgKi8KKworLyogbm8gZGVidWcgYnVpbGQgKi8KKyNkZWZpbmUgTkRFQlVHIDEKKworLyogYnVpbGQgd2l0aG91dCBob29rcyBmb3IgYW5hbHl6ZXIgKi8KKy8qICN1bmRlZiBOT0FOQUxZU0lTICovCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2RlZmluZSBQQUNLQUdFICJsYW1lIgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImxhbWUtZGV2QGxpc3RzLnNmLm5ldCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgImxhbWUiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgImxhbWUgMy45NyIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImxhbWUiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMy45NyIKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIEMgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKyNkZWZpbmUgUFJPVE9UWVBFUyAxCisKKy8qIFRoZSBzaXplIG9mIGEgYGRvdWJsZScsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0RPVUJMRSA4CisKKy8qIFRoZSBzaXplIG9mIGEgYGZsb2F0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfRkxPQVQgNAorCisvKiBUaGUgc2l6ZSBvZiBhIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorCisvKiBUaGUgc2l6ZSBvZiBhIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfTE9ORyA0CisKKy8qIFRoZSBzaXplIG9mIGEgYGxvbmcgZG91YmxlJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9MT05HX0RPVUJMRSAqLworCisvKiBUaGUgc2l6ZSBvZiBhIGBsb25nIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgOAorCisvKiBUaGUgc2l6ZSBvZiBhIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1NIT1JUIDIKKworLyogVGhlIHNpemUgb2YgYSBgdW5zaWduZWQgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfSU5UIDQKKworLyogVGhlIHNpemUgb2YgYSBgdW5zaWduZWQgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgNAorCisvKiBUaGUgc2l6ZSBvZiBhIGB1bnNpZ25lZCBsb25nIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HX0xPTkcgOAorCisvKiBUaGUgc2l6ZSBvZiBhIGB1bnNpZ25lZCBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX1NIT1JUIDIKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKwlTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisJU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisJU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24gKi8KKy8qICN1bmRlZiBTVEFDS19ESVJFQ1RJT04gKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIElFRUU3NTQgY29tcGF0aWJsZSBtYWNoaW5lICovCisjZGVmaW5lIFRBS0VISVJPX0lFRUU3NTRfSEFDSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLworI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQorCisvKiBmYXN0ZXIgbG9nIGltcGxlbWVudGF0aW9uIHdpdGggbGVzcyBidXQgZW5vdWdoIHByZWNpc3Npb24gKi8KKyNkZWZpbmUgVVNFX0ZBU1RfTE9HIDEKKworLyogYnVpbGQgd2l0aCBsYXllciAxIGRlY29kaW5nICovCisvKiAjdW5kZWYgVVNFX0xBWUVSXzEgKi8KKworLyogYnVpbGQgd2l0aCBsYXllciAyIGRlY29kaW5nICovCisjZGVmaW5lIFVTRV9MQVlFUl8yIDEKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIzLjk3IgorCisvKiBEZWZpbmUgaWYgdXNpbmcgdGhlIGRtYWxsb2MgZGVidWdnaW5nIG1hbGxvYyBwYWNrYWdlICovCisvKiAjdW5kZWYgV0lUSF9ETUFMTE9DICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUKKyAgIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsIGFuZCBWQVgpLiAqLworI2lmZGVmIF9fQVBQTEVfXworCSNpZmRlZiBfX0JJR19FTkRJQU5fXworCQkjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisJI2Vsc2UKKwkJI3VuZGVmIFdPUkRTX0JJR0VORElBTgorCSNlbmRpZgorI2Vsc2UKKwlFcnJvciB0aGlzIGNvbmZpZy5oIGZpbGUgaXMgb25seSB2YWxpZCBmb3IgTWFjIE9TLiBSdW4gLi9jb25maWd1cmUgZm9yIG90aGVyIE9TZXMgCisjZW5kaWYKKworCisvKiBEZWZpbmUgdG8gMSBpZiBvbiBBSVggMy4KKyAgIFN5c3RlbSBoZWFkZXJzIHNvbWV0aW1lcyBkZWZpbmUgdGhpcy4KKyAgIFdlIGp1c3Qgd2FudCB0byBhdm9pZCBhIHJlZGVmaW5pdGlvbiBlcnJvciBtZXNzYWdlLiAgKi8KKyNpZm5kZWYgX0FMTF9TT1VSQ0UKKy8qICMgdW5kZWYgX0FMTF9TT1VSQ0UgKi8KKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGZpbGUgb2Zmc2V0LCBvbiBob3N0cyB3aGVyZSB0aGlzIGlzIHNldHRhYmxlLiAqLworLyogI3VuZGVmIF9GSUxFX09GRlNFVF9CSVRTICovCisKKy8qIERlZmluZSBmb3IgbGFyZ2UgZmlsZXMsIG9uIEFJWC1zdHlsZSBob3N0cy4gKi8KKy8qICN1bmRlZiBfTEFSR0VfRklMRVMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgb24gTUlOSVguICovCisvKiAjdW5kZWYgX01JTklYICovCisKKy8qIERlZmluZSB0byAyIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSBQT1NJWC4xIGZlYXR1cmVzIGV4Y2VwdCB3aXRoCisgICB0aGlzIGRlZmluZWQuICovCisvKiAjdW5kZWYgX1BPU0lYXzFfU09VUkNFICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBgc3RhdCcgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAqLworLyogI3VuZGVmIF9QT1NJWF9TT1VSQ0UgKi8KKworLyogd2UncmUgb24gREVDIEFscGhhICovCisvKiAjdW5kZWYgX19ERUNBTFBIQV9fICovCisKKy8qIHdvcmsgYXJvdW5kIGEgZ2xpYmMgYnVnICovCisvKiAjdW5kZWYgX19OT19NQVRIX0lOTElORVMgKi8KKworLyogRGVmaW5lIGxpa2UgUFJPVE9UWVBFUzsgdGhpcyBjYW4gYmUgdXNlZCBieSBzeXN0ZW0gaGVhZGVycy4gKi8KKyNkZWZpbmUgX19QUk9UT1RZUEVTIDEKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCisvKiAjdW5kZWYgY29uc3QgKi8KKworLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCisgICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKy8qICN1bmRlZiBpbmxpbmUgKi8KKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBzaXplX3QgKi8KKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBmaWxlIG9mZnNldCwgb24gaG9zdHMgd2hlcmUgdGhpcyBpcyBzZXR0YWJsZS4gKi8KKy8qICN1bmRlZiBfRklMRV9PRkZTRVRfQklUUyAqLworCisvKiBEZWZpbmUgZm9yIGxhcmdlIGZpbGVzLCBvbiBBSVgtc3R5bGUgaG9zdHMuICovCisvKiAjdW5kZWYgX0xBUkdFX0ZJTEVTICovCisKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDhiOTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlCkBAIC0wLDAgKzEsMzIxMzkgQEAKKyMhIC9iaW4vc2gKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxIGZvciBsYW1lIDMuOTguNC4KKyMKKyMgUmVwb3J0IGJ1Z3MgdG8gPGxhbWUtZGV2QGxpc3RzLnNmLm5ldD4uCisjCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Citlc2FjCisKK2ZpCisKKworCisKKyMgUEFUSCBuZWVkcyBDUgorIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCisKKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgoraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Vuc2V0PXVuc2V0CitlbHNlCisgIGFzX3Vuc2V0PWZhbHNlCitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK2FzX25sPScKKycKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2Nhc2UgJDAgaW4KKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitmaQorCisjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KK2ZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKK2RvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCitkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQorZG8KKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgoraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCisKKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworCitpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCisgIGlmIChldmFsICI6IikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKworICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0geWVzICYmIAkgKGV2YWwgIjoKKyhhc19mdW5jX3JldHVybiAoKSB7CisgIChleGl0IFwkMSkKK30KK2FzX2Z1bmNfc3VjY2VzcyAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDAKK30KK2FzX2Z1bmNfZmFpbHVyZSAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDEKK30KK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworICByZXR1cm4gMAorfQorYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7CisgIHJldHVybiAxCit9CisKK2V4aXRjb2RlPTAKK2lmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KK2ZpCisKK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQorCit0ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKworKAorICBhc19saW5lbm9fMT1cJExJTkVOTworICBhc19saW5lbm9fMj1cJExJTkVOTworICB0ZXN0IFwieFwkYXNfbGluZW5vXzFcIiAhPSBcInhcJGFzX2xpbmVub18yXCIgJiYKKyAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKyIpIDI+IC9kZXYvbnVsbDsgdGhlbgorICA6CitlbHNlCisgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9CisgICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBjYXNlICRhc19kaXIgaW4KKwkgLyopCisJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKKwkgICBkb25lOzsKKyAgICAgICBlc2FjCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKworICAgICAgZm9yIGFzX3NoZWxsIGluICRhc19jYW5kaWRhdGVfc2hlbGxzICRTSEVMTDsgZG8KKwkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKKwkJeyAoIiRhc19zaGVsbCIpIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Citlc2FjCisKK2ZpCisKKworOgorX0FTRU9GCit9OyB0aGVuCisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKKwkgICAgICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCisgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworZXNhYworCitmaQorCisKKzoKKyhhc19mdW5jX3JldHVybiAoKSB7CisgIChleGl0ICQxKQorfQorYXNfZnVuY19zdWNjZXNzICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMAorfQorYXNfZnVuY19mYWlsdXJlICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMQorfQorYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisgIHJldHVybiAwCit9Cithc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKyAgcmV0dXJuIDEKK30KKworZXhpdGNvZGU9MAoraWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCitmaQorCitpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorICBleGl0Y29kZT0xCisgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCisKK3Rlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisKKygKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKworX0FTRU9GCit9OyB0aGVuCisgIGJyZWFrCitmaQorCitmaQorCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCisgIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCisgICAgICAgIGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCisgICAgICAgIGRvbmUKKyAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CitmaQorCisKKyAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KKyAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQorICAgICAgZWNobyBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiAgUGxlYXNlIGluc3RhbGwgYQorICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQorICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCisgICAgICB7IChleGl0IDEpOyBleGl0IDE7IH0KK2ZpCisKKworZmkKKworZmkKKworCisKKyhldmFsICJhc19mdW5jX3JldHVybiAoKSB7CisgIChleGl0IFwkMSkKK30KK2FzX2Z1bmNfc3VjY2VzcyAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDAKK30KK2FzX2Z1bmNfZmFpbHVyZSAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDEKK30KK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworICByZXR1cm4gMAorfQorYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7CisgIHJldHVybiAxCit9CisKK2V4aXRjb2RlPTAKK2lmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KK2ZpCisKK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQorCit0ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgeworICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgorICBlY2hvIFBsZWFzZSB0ZWxsIGF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCisgIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKKyAgZWNobyBtZXNzYWdlCit9CisKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7CisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJworICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAorICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCisgICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKKyAgIyBjYXNlIGF0IGxpbmUgZW5kLgorICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKyAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCisgICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4KKy1uKikKKyAgY2FzZSBgZWNobyAneFxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgICopICAgRUNIT19DPSdcYyc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyCitmaQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPSdsbiAtcycKKyAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICBhc19sbl9zPSdjcCAtcCcKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9OgorZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKyAgICAgICAgdGVzdCAtZCAiJDEvLiI7CisgICAgICBlbHNlCisJY2FzZSAkMSBpbgorICAgICAgICAtKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCisJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorICAgICdcJycgc2gKKyAgJworZmkKK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCisKKworIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworY2FzZSBYJEVDSE8gaW4KK1gqLS1mYWxsYmFjay1lY2hvKQorICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgorICBFQ0hPPWBlY2hvICIkRUNITyIgfCBzZWQgJ3MsXFxcXFwkXFwkMCwnJDAnLCdgCisgIDs7Citlc2FjCisKK2VjaG89JHtFQ0hPLWVjaG99CitpZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCisgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICBzaGlmdAorZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCisgIDoKK2VsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnIDsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQorZmkKKworaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCiskKgorRU9GCisgIGV4aXQgMAorZmkKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworaWYgdGVzdCAteiAiJEVDSE8iOyB0aGVuCitpZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KKyMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAorICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCisgICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KKyAgICBpZiAoZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYCkgMj4vZGV2L251bGwgJiYKKyAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgICYmCisgICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKKyAgICB0aGVuCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgIDoKK2Vsc2UKKyAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCisgICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKKyAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgIworICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCisKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKKyAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgIGVjaG89IiRkaXIvZWNobyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKworICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KKyAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KKyAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgorICAgICAgZWNobz0ncHJpbnQgLXInCisgICAgZWxpZiAodGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dCkgJiYKKwkgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgorICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCisgICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKKyAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAorICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CisgICAgZWxzZQorICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgorICAgICAgZWNobz0ncHJpbnRmICVzXG4nCisgICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKwkgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwkjIENvb2wsIHByaW50ZiB3b3JrcworCToKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJU0hFTEw9IiRDT05GSUdfU0hFTEwiCisJZXhwb3J0IFNIRUxMCisJZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgZWxzZQorCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCisJcHJldj06CisKKwlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCA1MHEgIiQwIic7IGRvCisJICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbAorCSAgdGhlbgorCSAgICBicmVhaworCSAgZmkKKwkgIHByZXY9IiRjbWQiCisJZG9uZQorCisJaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICIkMCInOyB0aGVuCisJICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAorCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKKwkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICIkMCIgJHsxKyIkQCJ9CisJZWxzZQorCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KKwkgIGVjaG89ZWNobworCWZpCisgICAgICBmaQorICAgIGZpCisgIGZpCitmaQorZmkKKworIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQorIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCitFQ0hPPSRlY2hvCitpZiB0ZXN0ICJYJEVDSE8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKyAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFwkMCAtLWZhbGxiYWNrLWVjaG8iCitmaQorCisKKworCit0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1DWFgKKwordGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Rjc3CisKK2V4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKKworIyBOYW1lIG9mIHRoZSBob3N0LgorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9J2xhbWUnCitQQUNLQUdFX1RBUk5BTUU9J2xhbWUnCitQQUNLQUdFX1ZFUlNJT049JzMuOTguNCcKK1BBQ0tBR0VfU1RSSU5HPSdsYW1lIDMuOTguNCcKK1BBQ0tBR0VfQlVHUkVQT1JUPSdsYW1lLWRldkBsaXN0cy5zZi5uZXQnCisKK2FjX3VuaXF1ZV9maWxlPSJsaWJtcDNsYW1lL2xhbWUuYyIKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworYWNfc3Vic3RfdmFycz0nU0hFTEwKK1BBVEhfU0VQQVJBVE9SCitQQUNLQUdFX05BTUUKK1BBQ0tBR0VfVEFSTkFNRQorUEFDS0FHRV9WRVJTSU9OCitQQUNLQUdFX1NUUklORworUEFDS0FHRV9CVUdSRVBPUlQKK2V4ZWNfcHJlZml4CitwcmVmaXgKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKK2JpbmRpcgorc2JpbmRpcgorbGliZXhlY2RpcgorZGF0YXJvb3RkaXIKK2RhdGFkaXIKK3N5c2NvbmZkaXIKK3NoYXJlZHN0YXRlZGlyCitsb2NhbHN0YXRlZGlyCitpbmNsdWRlZGlyCitvbGRpbmNsdWRlZGlyCitkb2NkaXIKK2luZm9kaXIKK2h0bWxkaXIKK2R2aWRpcgorcGRmZGlyCitwc2RpcgorbGliZGlyCitsb2NhbGVkaXIKK21hbmRpcgorREVGUworRUNIT19DCitFQ0hPX04KK0VDSE9fVAorTElCUworYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworYnVpbGQKK2J1aWxkX2NwdQorYnVpbGRfdmVuZG9yCitidWlsZF9vcworaG9zdAoraG9zdF9jcHUKK2hvc3RfdmVuZG9yCitob3N0X29zCitJTlNUQUxMX1BST0dSQU0KK0lOU1RBTExfU0NSSVBUCitJTlNUQUxMX0RBVEEKK2FtX19pc3JjCitDWUdQQVRIX1cKK1BBQ0tBR0UKK1ZFUlNJT04KK0FDTE9DQUwKK0FVVE9DT05GCitBVVRPTUFLRQorQVVUT0hFQURFUgorTUFLRUlORk8KK2luc3RhbGxfc2gKK1NUUklQCitJTlNUQUxMX1NUUklQX1BST0dSQU0KK21rZGlyX3AKK0FXSworU0VUX01BS0UKK2FtX19sZWFkaW5nX2RvdAorQU1UQVIKK2FtX190YXIKK2FtX191bnRhcgorTUFJTlRBSU5FUl9NT0RFX1RSVUUKK01BSU5UQUlORVJfTU9ERV9GQUxTRQorTUFJTlQKK2FtX19pbmNsdWRlCithbV9fcXVvdGUKK0NDCitDRkxBR1MKK0xERkxBR1MKK0NQUEZMQUdTCithY19jdF9DQworRVhFRVhUCitPQkpFWFQKK0RFUERJUgorQU1ERVBfVFJVRQorQU1ERVBfRkFMU0UKK0FNREVQQkFDS1NMQVNICitDQ0RFUE1PREUKK2FtX19mYXN0ZGVwQ0NfVFJVRQorYW1fX2Zhc3RkZXBDQ19GQUxTRQorQ1BQCitHUkVQCitFR1JFUAorU0VECitMTl9TCitFQ0hPCitBUgorUkFOTElCCitDWFgKK0NYWEZMQUdTCithY19jdF9DWFgKK0NYWERFUE1PREUKK2FtX19mYXN0ZGVwQ1hYX1RSVUUKK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFCitDWFhDUFAKK0Y3NworRkZMQUdTCithY19jdF9GNzcKK0xJQlRPT0wKK0xJQlRPT0xfREVQUworVQorQU5TSTJLTlIKK0FMTE9DQQorR1RLX0NPTkZJRworR1RLX0NGTEFHUworR1RLX0xJQlMKK1BLR19DT05GSUcKK1NOREZJTEVfQ0ZMQUdTCitTTkRGSUxFX0xJQlMKK0xJQl9XSVRIX0RFQ09ERVJfVFJVRQorTElCX1dJVEhfREVDT0RFUl9GQUxTRQorV0lUSF9CUkhJU1RfVFJVRQorV0lUSF9CUkhJU1RfRkFMU0UKK1dJVEhfWE1NX1RSVUUKK1dJVEhfWE1NX0ZBTFNFCitXSVRIX1ZFQ1RPUl9UUlVFCitXSVRIX1ZFQ1RPUl9GQUxTRQorTkFTTQorSEFWRV9OQVNNX1RSVUUKK0hBVkVfTkFTTV9GQUxTRQorSU5DTFVERVMKK0ZST05URU5EX0xERkxBR1MKK0ZST05URU5EX0NGTEFHUworRlJPTlRFTkRfTERBREQKK0NPTkZJR19NQVRIX0xJQgorTERBREQKK0xJQl9NQUpPUl9WRVJTSU9OCitMSUJfTUlOT1JfVkVSU0lPTgorTkFTTV9GT1JNQVQKK01BS0VERVAKK1JNX0YKK1dJVEhfRlJPTlRFTkQKK1dJVEhfTVAzWAorV0lUSF9NUDNSVFAKK0NQVVRZUEUKK0NQVUNDT0RFCitDT05GSUdfREVGUworTElCT0JKUworTFRMSUJPQkpTJworYWNfc3Vic3RfZmlsZXM9JycKKyAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCitob3N0X2FsaWFzCit0YXJnZXRfYWxpYXMKK0NDCitDRkxBR1MKK0xERkxBR1MKK0xJQlMKK0NQUEZMQUdTCitDUFAKK0NYWAorQ1hYRkxBR1MKK0NDQworQ1hYQ1BQCitGNzcKK0ZGTEFHUworUEtHX0NPTkZJRworU05ERklMRV9DRkxBR1MKK1NOREZJTEVfTElCUycKKworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCisjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKK2RhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9JworaW5mb2Rpcj0nJHtkYXRhcm9vdGRpcn0vaW5mbycKK2h0bWxkaXI9JyR7ZG9jZGlyfScKK2R2aWRpcj0nJHtkb2NkaXJ9JworcGRmZGlyPScke2RvY2Rpcn0nCitwc2Rpcj0nJHtkb2NkaXJ9JworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitsb2NhbGVkaXI9JyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZScKK21hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJworCithY19wcmV2PQorYWNfZGFzaGRhc2g9Citmb3IgYWNfb3B0aW9uCitkbworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAkYWNfcHJldj1cJGFjX29wdGlvbgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgKj0qKQlhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqKQlhY19vcHRhcmc9eWVzIDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgorICAtLSkKKyAgICBhY19kYXNoZGFzaD15ZXMgOzsKKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKKyAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKKyAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCisgICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OworICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCisgIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQorICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy9bLS5dL18vZydgCisgICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9bm8gOzsKKworICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQorICAgIGFjX3ByZXY9ZG9jZGlyIDs7CisgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKyAgICBhY19wcmV2PWR2aWRpciA7OworICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAorICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPVwkYWNfb3B0YXJnIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQorICAgIGFjX3ByZXY9aHRtbGRpciA7OworICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKKyAgfCAtLWh0PSopCisgICAgaHRtbGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKKyAgICBhY19wcmV2PWxvY2FsZWRpciA7OworICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQorICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCisgICAgbG9jYWxzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisKKyAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKKyAgICBhY19wcmV2PXBkZmRpciA7OworICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQorICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKKyAgICBhY19wcmV2PXBzZGlyIDs7CisgIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQorICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy9bLS5dL18vZydgCisgICAgZXZhbCB3aXRoXyRhY19wYWNrYWdlPVwkYWNfb3B0YXJnIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvWy0uXS9fL2cnYAorICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1ubyA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKKyAgICBleHBvcnQgJGFjX2VudnZhciA7OworCisgICopCisgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259CisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgorZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAorCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCisJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisgIGVzYWMKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZG9uZQorCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKKworIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgoraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KKyAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZC4iID4mMgorICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPXllcworICBmaQorZmkKKworYWNfdG9vbF9wcmVmaXg9Cit0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKKworCithY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKK2FjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IFdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQordGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8CisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogcHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWCIkMCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJDAiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllcyAmJiBzcmNkaXI9IiRhY19jb25mZGlyIG9yIC4uIgorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCithY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCithY19hYnNfY29uZmRpcj1gKAorCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgeyBlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfbXNnIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCXB3ZClgCisjIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgoraWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgorICBzcmNkaXI9LgorZmkKKyMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCisjIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KKyMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgorY2FzZSAkc3JjZGlyIGluCisqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKK2VzYWMKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Citkb25lCisKKyMKKyMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KKyMKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCisgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgIGNhdCA8PF9BQ0VPRgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgbGFtZSAzLjk4LjQgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKwkJCSAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKwkJCSAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQorICAtLWluZm9kaXI9RElSICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQorICAtLWRvY2Rpcj1ESVIgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL2xhbWVdCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tZHZpZGlyPURJUiAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wZGZkaXI9RElSICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKKworUHJvZ3JhbSBuYW1lczoKKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggICAgICAgICAgICBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCAgICAgICAgICAgIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0gICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKworU3lzdGVtIHR5cGVzOgorICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQorICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KK19BQ0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKyAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCisgICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBsYW1lIDMuOTguNDoiOzsKKyAgIGVzYWMKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSAgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIKKyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAorICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycworICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KKyAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCisgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10KKyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKQorICAtLWRpc2FibGUtbGFyZ2VmaWxlICAgICBvbWl0IHN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzCisgIC0tZW5hYmxlLW5hc20gICAgICAgICAgICAgIEFsbG93IHRoZSB1c2Ugb2YgbmFzbSBpZiBhdmFpbGFibGUKKyAgLS1kaXNhYmxlLWNwbWwgICAgICAgICAgICAgIERvIG5vdCB1c2UgQ29tcGFxJ3MgZmFzdCBNYXRoIExpYnJhcnkKKyAgLS1kaXNhYmxlLWd0a3Rlc3QgICAgICAgRG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IEdUSyBwcm9ncmFtCisgIC0tZW5hYmxlLWVmZW5jZSAgICAgICAgICAgIFVzZSBFbGVjdHJpY0ZlbmNlIGZvciBtYWxsb2MgZGVidWdnaW5nCisgIC0tZGlzYWJsZS1hbmFseXplci1ob29rcyAgIEV4Y2x1ZGUgYW5hbHl6ZXIgaG9va3MKKyAgLS1kaXNhYmxlLWRlY29kZXIgICAgICAgICAgRXhjbHVkZSBtcGcxMjMgZGVjb2RlcgorICAtLWVuYWJsZS1kZWNvZGUtbGF5ZXIxICAgICBJbmNsdWRlIGxheWVyMSBkZWNvZGluZyBkZWZhdWx0PW5vCisgIC0tZGlzYWJsZS1kZWNvZGUtbGF5ZXIyICAgIEV4Y2x1ZGUgbGF5ZXIyIGRlY29kaW5nCisgIC0tZGlzYWJsZS1mcm9udGVuZCAgICAgICAgIERvIG5vdCBidWlsZCB0aGUgbGFtZSBleGVjdXRhYmxlIGRlZmF1bHQ9YnVpbGQKKyAgLS1lbmFibGUtbXAzeCAgICAgICAgICAgICAgQnVpbGQgR1RLIGZyYW1lIGFuYWx5emVyIGRlZmF1bHQ9bm8KKyAgLS1lbmFibGUtbXAzcnRwICAgICAgICAgICAgQnVpbGQgbXAzcnRwIGRlZmF1bHQ9bm8KKyAgLS1kaXNhYmxlLWJyaGlzdCAgICAgICAgICBJbmNsdWRlIHRoZSBWQlIgYml0cmF0ZSBoaXN0b2dyYW0gZmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PXllcworICAtLWVuYWJsZS1hbGwtZmxvYXQgICAgICAgICBXaGV0aGVyIHRvIG1ha2UgYWxsIGZsb3RpbmcgcG9pbnQgdmFyaWFibGVzIGFzIGZsb2F0LCBub3QgZG91YmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9bm8KKyAgLS1lbmFibGUtZXhwb3B0PWZ1bGwsbm9ybSAgV2hldGhlciB0byBlbmFibGUgZXhwZXJpbWVudGFsIG9wdGltaXphdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1ubworICAtLWVuYWJsZS1kZWJ1Zz1hbG90LG5vcm0gICBFbmFibGUgZGVidWdnaW5nIChkaXNhYmxlcyBvcHRpbWl6YXRpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PW5vCisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dCisgIC0td2l0aC1waWMgICAgICAgICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoXQorICAtLXdpdGgtdGFnc1s9VEFHU10gICAgICBpbmNsdWRlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgW2F1dG9tYXRpY10KKyAgLS13aXRoLWRtYWxsb2MgICAgICAgICAgdXNlIGRtYWxsb2MsIGFzIGluCisJCQkgIGh0dHA6Ly93d3cuZG1hbGxvYy5jb20vZG1hbGxvYy50YXIuZ3oKKyAgLS13aXRoLWd0ay1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIEdUSyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKQorICAtLXdpdGgtZ3RrLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBHVEsgaXMgaW5zdGFsbGVkIChvcHRpb25hbCkKKyAgLS13aXRoLWZpbGVpbz1sYW1lICAgICAgICAgVXNlIGxhbWUncyBpbnRlcm5hbCBmaWxlIGlvIHJvdXRpbmVzIGRlZmF1bHQKKyAgICAgICAgICAgICAgID1zbmRmaWxlICAgICAgVXNlIEVyaWsgZGUgQ2FzdHJvIExvcG8ncyBsaWJzbmRmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBzdGRpbiBwb3NzaWJsZSBjdXJyZW50bHkpCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisgIENYWCAgICAgICAgIEMrKyBjb21waWxlciBjb21tYW5kCisgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworICBDWFhDUFAgICAgICBDKysgcHJlcHJvY2Vzc29yCisgIEY3NyAgICAgICAgIEZvcnRyYW4gNzcgY29tcGlsZXIgY29tbWFuZAorICBGRkxBR1MgICAgICBGb3J0cmFuIDc3IGNvbXBpbGVyIGZsYWdzCisgIFBLR19DT05GSUcgIHBhdGggdG8gcGtnLWNvbmZpZyB1dGlsaXR5CisgIFNOREZJTEVfQ0ZMQUdTCisgICAgICAgICAgICAgIEMgY29tcGlsZXIgZmxhZ3MgZm9yIFNOREZJTEUsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBTTkRGSUxFX0xJQlMKKyAgICAgICAgICAgICAgbGlua2VyIGZsYWdzIGZvciBTTkRGSUxFLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKworVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKworUmVwb3J0IGJ1Z3MgdG8gPGxhbWUtZGV2QGxpc3RzLnNmLm5ldD4uCitfQUNFT0YKK2FjX3N0YXR1cz0kPworZmkKKworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgorICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgorICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQorICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8IGNvbnRpbnVlCisgICAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKKyAgICBmaSB8fCBhY19zdGF0dXM9JD8KKyAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9CisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cworaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcX0FDRU9GCitsYW1lIGNvbmZpZ3VyZSAzLjk4LjQKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KK19BQ0VPRgorICBleGl0CitmaQorY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKworSXQgd2FzIGNyZWF0ZWQgYnkgbGFtZSAkYXNfbWUgMy45OC40LCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGVjaG8gIlBBVEg6ICRhc19kaXIiCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzMT0iJGFjX2NvbmZpZ3VyZV9hcmdzMSAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorZG9uZQorJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMCB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMCtzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczA9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MwOyB9CiskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCisjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIENhY2hlIHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKyAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YGVjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKyAgICAgIGVzYWMKKyAgICAgIGVjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgIGRvbmUgfCBzb3J0CisgICAgZWNobworCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICBlY2hvCisgICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcworICAgICAgZG8KKwlldmFsIGFjX3ZhbD1cJCRhY192YXIKKwljYXNlICRhY192YWwgaW4KKwkqXCdcJycqKSBhY192YWw9YGVjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBjb25mZGVmcy5oLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICAgZWNobworICAgICAgY2F0IGNvbmZkZWZzLmgKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgIGVjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgorICAgIGVjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgeyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICIkUEFDS0FHRV9OQU1FIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiRQQUNLQUdFX1NUUklORyIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgc2V0IHggIiRDT05GSUdfU0lURSIKK2VsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgIHNldCB4ICIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlIiAiJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCitlbHNlCisgIHNldCB4ICIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiIFwKKwkiJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKK2ZpCitzaGlmdAorZm9yIGFjX3NpdGVfZmlsZQorZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsCisgICMgZmlsZXMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LgorICBpZiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjI7fQorCWFjX2NhY2hlX2NvcnJ1cHRlZD06CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YGVjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CisgICAgZXNhYworICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCisgICAgICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgICBlc2FjCisgIGZpCitkb25lCitpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCisgIGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC1zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9idWlsZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2FjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfYnVpbGQiID4mNjsgfQorY2FzZSAkYWNfY3ZfYnVpbGQgaW4KKyotKi0qKSA7OworKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworZXNhYworYnVpbGQ9JGFjX2N2X2J1aWxkCithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfYnVpbGQKK3NoaWZ0CitidWlsZF9jcHU9JDEKK2J1aWxkX3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2J1aWxkX29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCisgIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCitlbHNlCisgIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxpYXNgIHx8CisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hvc3QiID4mNjsgfQorY2FzZSAkYWNfY3ZfaG9zdCBpbgorKi0qLSopIDs7CisqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKKworYW1fX2FwaV92ZXJzaW9uPScxLjEwJworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4KKyAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKKwkgICAgYnJlYWsgMworCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICA7OworZXNhYworZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjY7IH0KKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICRFQ0hPX0MiID4mNjsgfQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICBmaQorCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyMgQnkgZGVmYXVsdCB3YXMgYHMseCx4JywgcmVtb3ZlIGl0IGlmIHVzZWxlc3MuCitjYXQgPDxcX0FDRU9GID5jb25mdGVzdC5zZWQKK3MvW1xcJF0vJiYvZztzLztzLHgseCwkLy8KK19BQ0VPRgorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB8IHNlZCAtZiBjb25mdGVzdC5zZWRgCitybSAtZiBjb25mdGVzdC5zZWQKKworIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorCit0ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiYyO30KK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIHRocmVhZC1zYWZlIG1rZGlyIC1wIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0IC16ICIkTUtESVJfUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX3Byb2cgaW4gbWtkaXIgZ21rZGlyOyBkbworCSBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwkgICB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9IHx8IGNvbnRpbnVlCisJICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAorCSAgICAgJ21rZGlyIChHTlUgY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoZmlsZXV0aWxzKSAnNC4xKikKKwkgICAgICAgYWNfY3ZfcGF0aF9ta2Rpcj0kYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0CisJICAgICAgIGJyZWFrIDM7OworCSAgIGVzYWMKKwkgZG9uZQorICAgICAgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKKworICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBNS0RJUl9QPSIkYWNfY3ZfcGF0aF9ta2RpciAtcCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBNS0RJUl9QIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgorICAgIE1LRElSX1A9IiRhY19pbnN0YWxsX3NoIC1kIgorICBmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJE1LRElSX1AiID4mNQorZWNobyAiJHtFQ0hPX1R9JE1LRElSX1AiID4mNjsgfQorCitta2Rpcl9wPSIkTUtESVJfUCIKK2Nhc2UgJG1rZGlyX3AgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qKSA7OworICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Citlc2FjCisKK2ZvciBhY19wcm9nIGluIGdhd2sgbWF3ayBuYXdrIGF3aworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BV0src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVdLPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFXSyIgPiY1CitlY2hvICIke0VDSE9fVH0kQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gJEVDSE9fQyIgPiY2OyB9CitzZXQgeCAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCitpZiB7IGFzX3Zhcj1hY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitjYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KKyAgKkBAQCUlJT0/Kj1AQEAlJSUqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7CisgICopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OworZXNhYworcm0gLWYgY29uZnRlc3QubWFrZQorZmkKK2lmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorICBTRVRfTUFLRT0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCitta2RpciAudHN0IDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC50c3Q7IHRoZW4KKyAgYW1fX2xlYWRpbmdfZG90PS4KK2Vsc2UKKyAgYW1fX2xlYWRpbmdfZG90PV8KK2ZpCitybWRpciAudHN0IDI+L2Rldi9udWxsCisKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KKyAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKKyAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgorICBhbV9faXNyYz0nIC1JJChzcmNkaXIpJworICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorZmkKKworIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCitpZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgorICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCisgIGVsc2UKKyAgICBDWUdQQVRIX1c9ZWNobworICBmaQorZmkKKworCisjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCisgUEFDS0FHRT0nbGFtZScKKyBWRVJTSU9OPSczLjk4LjQnCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitfQUNFT0YKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorCitBQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9CisKKworQVVUT01BS0U9JHtBVVRPTUFLRS0iJHthbV9taXNzaW5nX3J1bn1hdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0ifQorCisKK0FVVE9IRUFERVI9JHtBVVRPSEVBREVSLSIke2FtX21pc3NpbmdfcnVufWF1dG9oZWFkZXIifQorCisKK01BS0VJTkZPPSR7TUFLRUlORk8tIiR7YW1fbWlzc2luZ19ydW59bWFrZWluZm8ifQorCitpbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iXCQoU0hFTEwpICRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQorCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU1RSSVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JFNUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1NUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgorICAgIFNUUklQPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgU1RSSVA9JGFjX2N0X1NUUklQCisgIGZpCitlbHNlCisgIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKK2ZpCisKK2ZpCitJTlNUQUxMX1NUUklQX1BST0dSQU09IlwkKGluc3RhbGxfc2gpIC1jIC1zIgorCisjIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgorIyBzb21lIHBsYXRmb3Jtcy4KKyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworQU1UQVI9JHtBTVRBUi0iJHthbV9taXNzaW5nX3J1bn10YXIifQorCithbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLScKKworCisKKworCithY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGNvbmZpZy5oIgorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0kZW5hYmxlX21haW50YWluZXJfbW9kZTsgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KK2ZpCisKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkVVNFX01BSU5UQUlORVJfTU9ERSIgPiY1CitlY2hvICIke0VDSE9fVH0kVVNFX01BSU5UQUlORVJfTU9ERSIgPiY2OyB9CisgICBpZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPQorICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCitlbHNlCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJworICBNQUlOVEFJTkVSX01PREVfRkFMU0U9CitmaQorCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorCisKK2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCithbV9fZG9pdDoKKwlAZWNobyBkb25lCisuUEhPTlk6IGFtX19kb2l0CitFTkQKKyMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICRFQ0hPX0MiID4mNjsgfQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCisjIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCisjIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0CisjIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAorIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCitpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KKyAgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgIGFtX19xdW90ZT0KKyAgIF9hbV9yZXN1bHQ9R05VCitmaQorIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCisgICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQorICAgICAgYW1fX3F1b3RlPSJcIiIKKyAgICAgIF9hbV9yZXN1bHQ9QlNECisgICBmaQorZmkKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRfYW1fcmVzdWx0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRfYW1fcmVzdWx0IiA+JjY7IH0KK3JtIC1mIGNvbmZpbmMgY29uZm1mCisKKworREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgorCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworZmkKKyBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgQU1ERVBfVFJVRT0KKyAgQU1ERVBfRkFMU0U9JyMnCitlbHNlCisgIEFNREVQX1RSVUU9JyMnCisgIEFNREVQX0ZBTFNFPQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCisgIGZpCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZmkKKworZmkKKworCit0ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC12ID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAtdiA+JjUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChhY190cnk9IiRhY19jb21waWxlciAtViA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgLVYgPiY1IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCisjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCisjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCisjIG9mIGV4ZWV4dC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKyMKKyMgTGlzdCBvZiBwb3NzaWJsZSBvdXRwdXQgZmlsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LgorIyBUaGUgYWxnb3JpdGhtIGlzIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKQorIyBvbmx5IGFzIGEgbGFzdCByZXNvcnQuICBiLm91dCBpcyBjcmVhdGVkIGJ5IGk5NjAgY29tcGlsZXJzLgorYWNfZmlsZXM9J2Ffb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQnCisjCisjIFRoZSBJUklYIDYgbGlua2VyIHdyaXRlcyBpbnRvIGV4aXN0aW5nIGZpbGVzIHdoaWNoIG1heSBub3QgYmUKKyMgZXhlY3V0YWJsZSwgcmV0YWluaW5nIHRoZWlyIHBlcm1pc3Npb25zLiAgUmVtb3ZlIHRoZW0gZmlyc3Qgc28gYQorIyBzdWJzZXF1ZW50IGV4ZWN1dGlvbiB0ZXN0IHdvcmtzLgorYWNfcm1maWxlcz0KK2ZvciBhY19maWxlIGluICRhY19maWxlcworZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKKyAgZXNhYworZG9uZQorcm0gLWYgJGFjX3JtZmlsZXMKKworaWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCisjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCisjIEF1dG9jb25mLgorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCitkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkKKwk7OworICAgIFthYl0ub3V0ICkKKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorCSMgY2VydGFpbmx5IHJpZ2h0LgorCWJyZWFrOzsKKyAgICAqLiogKQorICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKwl0aGVuIDo7IGVsc2UKKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwlmaQorCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAorCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJworCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgorCSMgYWN0dWFsbHkgd29ya2luZy4KKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCit0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KKworZWxzZQorICBhY19maWxlPScnCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbgorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorZmkKKworYWNfZXhlZXh0PSRhY19jdl9leGVleHQKKworIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQorIyBGSVhNRTogVGhlc2UgY3Jvc3MgY29tcGlsZXIgaGFja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIEF1dG9jb25mIDMuMAorIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICBpZiB7IGFjX3RyeT0nLi8kYWNfZmlsZScKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bm8KKyAgZWxzZQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKwljcm9zc19jb21waWxpbmc9eWVzCisgICAgZWxzZQorCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGZpCisgIGZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKworcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjY7IH0KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1CitlY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQorIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorIyBgcm0nLgorZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9vYmpleHQiID4mNjsgfQorT0JKRVhUPSRhY19jdl9vYmpleHQKK2FjX29iamV4dD0kT0JKRVhUCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jb21waWxlcl9nbnU9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KK0dDQz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2NjX2c9bm8KKyAgIENGTEFHUz0iLWciCisgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlDRkxBR1M9IiIKKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworCSBDRkxBR1M9Ii1nIgorCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9wcm9nX2NjX2M4OT1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1CitlY2hvICIke0VDSE9fVH11bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgorICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAkRUNIT19DIiA+JjY7IH0KKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgOgorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdyZXAgZ2dyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0CitpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KK3NldCBkdW1teSBncmVwIGdncmVwOyBhY19wcm9nX25hbWU9JDIKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisgICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAorY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisgICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisKKyAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgZG9uZQorZG9uZQorCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKworZmkKKworR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKK2lmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCitmaQorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZWdyZXAuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZWdyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0CitpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCitzZXQgZHVtbXkgZWdyZXA7IGFjX3Byb2dfbmFtZT0kMgoraWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKKyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKyAgICAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICBlY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKworICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgZG9uZQorZG9uZQorCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKworZmkKKworRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgoraWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKK2ZpCisKKworICAgZmkKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCisKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQUlYIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEFJWC4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9BSVgKKyAgeWVzCisjZW5kaWYKKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAieWVzIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIF9BTExfU09VUkNFIDEKK19BQ0VPRgorCitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc3RyZXJyb3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHN0cmVycm9yLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc3RyZXJyb3Irc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzdHJlcnJvciAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHN0cmVycm9yICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIGNwb3NpeDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3Zfc2VhcmNoX3N0cmVycm9yPSRhY19yZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3N0cmVycm9yK3NldH0iID0gc2V0OyB0aGVuCisgIGJyZWFrCitmaQorZG9uZQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc3RyZXJyb3Irc2V0fSIgPSBzZXQ7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9zZWFyY2hfc3RyZXJyb3I9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc3RyZXJyb3IiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9zdHJlcnJvciIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zdHJlcnJvcgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitfQUNFT0YKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KKworCisKKworCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1pbml4L2NvbmZpZy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1pbml4L2NvbmZpZy5oLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9taW5peF9jb25maWdfaCIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbWluaXgvY29uZmlnLmggdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgbWluaXgvY29uZmlnLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPG1pbml4L2NvbmZpZy5oPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbWluaXgvY29uZmlnLmggcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBtaW5peC9jb25maWcuaCBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPG1pbml4L2NvbmZpZy5oPgorX0FDRU9GCitpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbWluaXgvY29uZmlnLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBtaW5peC9jb25maWcuaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBtaW5peC9jb25maWcuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG1pbml4L2NvbmZpZy5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBtaW5peC9jb25maWcuaDogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogbWluaXgvY29uZmlnLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBtaW5peC9jb25maWcuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG1pbml4L2NvbmZpZy5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IG1pbml4L2NvbmZpZy5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBtaW5peC9jb25maWcuaDogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IG1pbml4L2NvbmZpZy5oOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogbWluaXgvY29uZmlnLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogbWluaXgvY29uZmlnLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogbWluaXgvY29uZmlnLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IG1pbml4L2NvbmZpZy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBtaW5peC9jb25maWcuaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorICAgICggY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBSZXBvcnQgdGhpcyB0byBsYW1lLWRldkBsaXN0cy5zZi5uZXQgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1pbml4L2NvbmZpZy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1pbml4L2NvbmZpZy5oLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX21pbml4X2NvbmZpZ19oPSRhY19oZWFkZXJfcHJlcHJvYworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9taW5peF9jb25maWdfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX21pbml4X2NvbmZpZ19oIiA+JjY7IH0KKworZmkKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9taW5peF9jb25maWdfaCA9IHllczsgdGhlbgorICBNSU5JWD15ZXMKK2Vsc2UKKyAgTUlOSVg9CitmaQorCisKK2lmIHRlc3QgIiRNSU5JWCIgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBfUE9TSVhfMV9TT1VSQ0UgMgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgX01JTklYIDEKK19BQ0VPRgorCitmaQorCitjYXNlICRob3N0X29zIGluCisgICpjeWd3aW4qICkgQ1lHV0lOPXllczs7CisgICAgICAgICAqICkgQ1lHV0lOPW5vOzsKK2VzYWMKKworIyBBQ19ESVNBQkxFX1NIQVJFRAorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfc3RhdGljOyBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9mYXN0X2luc3RhbGw7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworZmkKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfU0VEK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgorIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCisKK2ZpCisKK1NFRD0kbHRfY3ZfcGF0aF9TRUQKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU0VEIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRTRUQiID4mNjsgfQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0kd2l0aF9nbnVfbGQ7IHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcworZWxzZQorICB3aXRoX2dudV9sZD1ubworZmkKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQy4uLiAkRUNIT19DIiA+JjY7IH0KKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkRUNIT19DIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAkRUNIT19DIiA+JjY7IH0KK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfTEQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTEQiID4mNQorZWNobyAiJHtFQ0hPX1R9JExEIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQordGVzdCAteiAiJExEIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9sZF9yZWxvYWRfZmxhZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9jdl9sZF9yZWxvYWRfZmxhZz0nLXInCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjY7IH0KK3JlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZworY2FzZSAkcmVsb2FkX2ZsYWcgaW4KKyIiIHwgIiAiKikgOzsKKyopIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIiA7OworZXNhYworcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX05NK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgorICBmaQorICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKKyAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKwkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKwkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKwljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCSAgYnJlYWsKKwkgIDs7CisJKikKKwkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSAgKi9kZXYvbnVsbCopCisJICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICAgIGJyZWFrCisJICAgIDs7CisJICAqKQorCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgZG9uZQorICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQorZmkKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wYXRoX05NIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wYXRoX05NIiA+JjY7IH0KK05NPSIkbHRfY3ZfcGF0aF9OTSIKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJEVDSE9fQyIgPiY2OyB9CitMTl9TPSRhc19sbl9zCitpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vLCB1c2luZyAkTE5fUyIgPiY2OyB9CitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDQqIHwgYWl4NSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpWzQ1XSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKKyAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KKyAgaWYgKCBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICBmaQorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbMy05XTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JworICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICBmaQorICA7OworCitnbnUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBQQS1SSVNDIFswLTldLlswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAorICAgIDs7CisgICopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18UEEtUklTQ1swLTldLlswLTldKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4WzMtOV0qKQorICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251KQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworbnRvLXFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVswLTldWzAtOV0qIFZlcnNpb24gWzAtOV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY2OyB9CitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCisKKworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOworZmkKKwordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgKkVMRi0zMiopCisgICAgICBIUFVYX0lBNjRfTU9ERT0iMzIiCisgICAgICA7OworICAgICpFTEYtNjQqKQorICAgICAgSFBVWF9JQTY0X01PREU9IjY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnI2xpbmUgNTE2NiAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKyAgICAgIDs7CisgICAgZXNhYworICAgZWxzZQorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtMzIiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKKyAgICAgIDs7CisgICAgZXNhYworICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICozMi1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisgICAgICAgICAgOzsKKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorICAgICAgICAgIDs7CisgICAgICAgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisgICAgICAgICAgOzsKKyAgICAgICAgczM5MHgtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmM2NC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgeDg2XzY0LSprZnJlZWJzZCotZ251KQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisgICAgICAgICAgOzsKKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisgICAgICAgICAgOzsKKyAgICAgICAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorICAgICAgICAgIDs7CisgICAgICAgIHMzOTAqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9jY19uZWVkc19iZWxmK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlsdF9jdl9jY19uZWVkc19iZWxmPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY2OyB9CisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CitzcGFyYyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCisgICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7CisgICAgICAqKSAgICBMRD0iJHtMRC1sZH0gLTY0IiA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworCitlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorCisKKworZm9yIGFjX2hlYWRlciBpbiBkbGZjbi5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gbGFtZS1kZXZAbGlzdHMuc2YubmV0ICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRDQ0MiOyB0aGVuCisgICAgQ1hYPSRDQ0MKKyAgZWxzZQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ1hYPSRhY19jdl9wcm9nX0NYWAoraWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorICBhY19jdF9DWFg9JENYWAorICBmb3IgYWNfcHJvZyBpbiBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKK2lmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NYWCIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCisgICAgQ1hYPSJnKysiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDWFg9JGFjX2N0X0NYWAorICBmaQorZmkKKworICBmaQorZmkKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC1WID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAtViA+JjUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2N4eF9jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY29tcGlsZXJfZ251PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2N4eF9jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2OyB9CitHWFg9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKK2FjX3Rlc3RfQ1hYRkxBR1M9JHtDWFhGTEFHUytzZXR9CithY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jeHhfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19zYXZlX2N4eF93ZXJyb3JfZmxhZz0kYWNfY3h4X3dlcnJvcl9mbGFnCisgICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2N4eF9nPW5vCisgICBDWFhGTEFHUz0iLWciCisgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlDWFhGTEFHUz0iIgorICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCisJIENYWEZMQUdTPSItZyIKKwkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2N4eF9nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2N4eF9nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgorICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9CisgIGZpCitmaQorYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKKyAgZmkKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQorQ1hYREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKKworIGlmCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgorICBhbV9fZmFzdGRlcENYWF9UUlVFPQorICBhbV9fZmFzdGRlcENYWF9GQUxTRT0nIycKK2Vsc2UKKyAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0nIycKKyAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9CitmaQorCisKKworCitpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorICBhY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0IC16ICIkQ1hYQ1BQIjsgdGhlbgorICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1hYQ1BQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKKworZmkKKyAgQ1hYQ1BQPSRhY19jdl9wcm9nX0NYWENQUAorZWxzZQorICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYQ1BQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFhDUFAiID4mNjsgfQorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgOgorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDKysgcHJlcHJvY2Vzc29yIFwiJENYWENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQysrIHByZXByb2Nlc3NvciBcIiRDWFhDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCitmaQorCisKK2FjX2V4dD1mCithY19jb21waWxlPSckRjc3IC1jICRGRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckRjc3IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkRkZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9mNzdfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGc3NyB4bGYgZjc3IGZydCBwZ2Y3NyBjZjc3IGZvcnQ3NyBmbDMyIGFmNzcgeGxmOTAgZjkwIHBnZjkwIHBnaHBmIGVwY2Y5MCBnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2Y5NSBsZjk1IGZ0bgorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfRjc3K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRGNzciOyB0aGVuCisgIGFjX2N2X3Byb2dfRjc3PSIkRjc3IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0Y3Nz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitGNzc9JGFjX2N2X3Byb2dfRjc3CitpZiB0ZXN0IC1uICIkRjc3IjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRGNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JEY3NyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJEY3NyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRGNzciOyB0aGVuCisgIGFjX2N0X0Y3Nz0kRjc3CisgIGZvciBhY19wcm9nIGluIGc3NyB4bGYgZjc3IGZydCBwZ2Y3NyBjZjc3IGZvcnQ3NyBmbDMyIGFmNzcgeGxmOTAgZjkwIHBnZjkwIHBnaHBmIGVwY2Y5MCBnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2Y5NSBsZjk1IGZ0bgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9GNzcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0Y3NyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9GNzc9IiRhY19jdF9GNzciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRjc3PSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0Y3Nz0kYWNfY3ZfcHJvZ19hY19jdF9GNzcKK2lmIHRlc3QgLW4gIiRhY19jdF9GNzciOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0Y3NyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfRjc3IiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0Y3NyIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0Y3NyIgPSB4OyB0aGVuCisgICAgRjc3PSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBGNzc9JGFjX2N0X0Y3NworICBmaQorZmkKKworCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEZvcnRyYW4gNzcgY29tcGlsZXIgdmVyc2lvbiIgPiY1CithY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCit7IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChhY190cnk9IiRhY19jb21waWxlciAtdiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3JtIC1mIGEub3V0CisKKyMgSWYgd2UgZG9uJ3QgdXNlIGAuRicgYXMgZXh0ZW5zaW9uLCB0aGUgcHJlcHJvY2Vzc29yIGlzIG5vdCBydW4gb24gdGhlCisjIGlucHV0IGZpbGUuICAoTm90ZSB0aGF0IHRoaXMgb25seSBuZWVkcyB0byB3b3JrIGZvciBHTlUgY29tcGlsZXJzLikKK2FjX3NhdmVfZXh0PSRhY19leHQKK2FjX2V4dD1GCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2Y3N19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgICAgIGVuZAorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY29tcGlsZXJfZ251PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2Y3N19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPiY2OyB9CithY19leHQ9JGFjX3NhdmVfZXh0CithY190ZXN0X0ZGTEFHUz0ke0ZGTEFHUytzZXR9CithY19zYXZlX0ZGTEFHUz0kRkZMQUdTCitGRkxBR1M9Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRGNzcgYWNjZXB0cyAtZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2Y3N19nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIEZGTEFHUz0tZworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKworICAgICAgZW5kCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9wcm9nX2Y3N19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfcHJvZ19mNzdfZz1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2Y3N19nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2Y3N19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0ZGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgRkZMQUdTPSRhY19zYXZlX0ZGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2Y3N19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIngkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPSB4eWVzOyB0aGVuCisgICAgRkZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBGRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICJ4JGFjX2N2X2Y3N19jb21waWxlcl9nbnUiID0geHllczsgdGhlbgorICAgIEZGTEFHUz0iLU8yIgorICBlbHNlCisgICAgRkZMQUdTPQorICBmaQorZmkKKworRzc3PWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCisjIEF1dG9jb25mIDIuMTMncyBBQ19PQkpFWFQgYW5kIEFDX0VYRUVYVCBtYWNyb3Mgb25seSB3b3JrcyBmb3IgQyBjb21waWxlcnMhCisKKyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX21heF9jbWRfbGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3NmKikKKyAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKKyAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAorICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCisgICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0CisgICAgIworICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCisgICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgorICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKKyAgICA7OworICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCisgICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qWyAJXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgICB3aGlsZSAodGVzdCAiWCJgJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyAiWCR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAorCSAgICAgICA9ICJYWCR0ZXN0c3RyaW5nIikgPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgbmV3X3Jlc3VsdD1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAgJiYKKwkgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKKwkgICAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKKyAgICAgIGRvCisgICAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uIG1hc3NpdmUKKyAgICAgICMgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBsaW5rZXIuCisgICAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCisgICAgZmkKKyAgICA7OworICBlc2FjCisKK2ZpCisKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUiID4mNQorZWNobyAiJHtFQ0hPX1R9bm9uZSIgPiY2OyB9CitmaQorCisKKworCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJworICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorICA7OworbGludXgqIHwgaypic2QqLWdudSkKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbQUJDREdJUlNUV10nCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbQkNERUdSU1RdJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW0JDREVHUVJTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW0JEUlRdJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbRFRdJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tEVF0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbQUJEVF0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW0RGTlNUVV0nCisgIDs7Citlc2FjCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkYnVpbGRfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWBlY2hvICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW0FCQ0RHSVJTVFddJyA7OworZXNhYworCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsgCV1bIAldKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorRU9GCisKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdFwiIikgPiY1CisgIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuJGFjX2V4dAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAobHRfcHRyX3QpIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAobHRfcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0CisJICBsdF9zYXZlX0xJQlM9IiRMSUJTIgorCSAgbHRfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKwkgICAgcGlwZV93b3Jrcz15ZXMKKwkgIGZpCisJICBMSUJTPSIkbHRfc2F2ZV9MSUJTIgorCSAgQ0ZMQUdTPSIkbHRfc2F2ZV9DRkxBR1MiCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1CisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZhaWxlZCIgPiY1CitlY2hvICIke0VDSE9fVH1mYWlsZWQiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG9rIiA+JjUKK2VjaG8gIiR7RUNIT19UfW9rIiA+JjY7IH0KK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvYmpkaXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9vYmpkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3Zfb2JqZGlyIiA+JjY7IH0KK29iamRpcj0kbHRfY3Zfb2JqZGlyCisKKworCisKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCitub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKKworIyBDb25zdGFudHM6CitybT0icm0gLWYiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK2RlZmF1bHRfb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitvZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0FSK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVI9JGFjX2N2X3Byb2dfQVIKK2lmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQVIiID4mNQorZWNobyAiJHtFQ0hPX1R9JEFSIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiI7IHRoZW4KKyAgYWNfY3RfQVI9JEFSCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFyOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQVIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfY3RfQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQVI9ImFyIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQVI9JGFjX2N2X3Byb2dfYWNfY3RfQVIKK2lmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQVIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0FSIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQVIiID0geDsgdGhlbgorICAgIEFSPSJmYWxzZSIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIEFSPSRhY19jdF9BUgorICBmaQorZWxzZQorICBBUj0iJGFjX2N2X3Byb2dfQVIiCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQorZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9SQU5MSUIiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorICAgIFJBTkxJQj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisgIGZpCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFNUUklQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRTVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1NUUklQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9TVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KKyAgICBTVFJJUD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFNUUklQPSRhY19jdF9TVFJJUAorICBmaQorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Cit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgordGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKK3Rlc3QgLXogIiROTSIgJiYgTk09bm0KK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Cit0ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG9wZW5ic2QqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCisgICAgOzsKKyAgKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCitmaQorCitmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfTUFHSUNfQ01EK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGU7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworRU9GCisJICBmaSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgorICA7OworZXNhYworZmkKKworTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JE1BR0lDX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmlsZS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTUFHSUNfQ01EIGluCitbXFwvKl0gfCAgPzpbXFwvXSopCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyopCisgIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgYWNfZHVtbXk9Ii91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyL2ZpbGU7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyL2ZpbGUiCisgICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkiZmlsZV9tYWdpYyAiKikKKwkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAorCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCisJICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8CisJICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWMKK2ZpCisKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRNQUdJQ19DTUQiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKK2VuYWJsZV9kbG9wZW49bm8KK2VuYWJsZV93aW4zMl9kbGw9bm8KKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOworZmkKKwordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9JHdpdGhfcGljOyBwaWNfbW9kZT0iJHdpdGh2YWwiCitlbHNlCisgIHBpY19tb2RlPWRlZmF1bHQKK2ZpCisKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9ZGVmYXVsdAorCisjIFVzZSBDIGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJ0b29sIHNjcmlwdAordGFnbmFtZT0KK2x0X3NhdmVfQ0M9IiRDQyIKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0PSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKKworCitsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjc0MzQ6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6NzQzODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCitsdF9wcm9nX2NvbXBpbGVyX3dsPQorbHRfcHJvZ19jb21waWxlcl9waWM9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkRUNIT19DIiA+JjY7IH0KKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKyAgICAgIGRhcndpbiopCisgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICB4bGMqKQorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1xbm9jb21tb24nCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgICAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWM9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgaWNjKiB8IGVjYyopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKKyAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKKwkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIGNjYyopCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikKKwkgICMgU3VuIEMgNS45CisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCSAgOzsKKwkqU3VuXCBGKikKKwkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9JycKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctUW9wdGlvbiBsZCAnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLVBJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtjb25mb3JtX3BpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXBpYycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljIiA+JjY7IH0KKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljIjsgdGhlbgorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6NzcyNDogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTo3NzI4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KK2ZpCisKK2ZpCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKKyAgICA7OworZXNhYworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9CitmaQorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubworICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo3ODI4OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6NzgzMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkcm0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICBybWRpciBjb25mdGVzdAorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjY7IH0KKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gJEVDSE9fQyIgPiY2OyB9CisgIGhhcmRfbGlua3M9eWVzCisgICRybSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRfbGlua3MiID4mNjsgfQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2OyB9CisKKyAgcnVucGF0aF92YXI9CisgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQorICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPW5vCisgIGFyY2hpdmVfY21kcz0KKyAgYXJjaGl2ZV9leHBzeW1fY21kcz0KKyAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcz0KKyAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9CisgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KKyAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYz0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0KKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKyAgaGFyZGNvZGVfZGlyZWN0PW5vCisgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICBsaW5rX2FsbF9kZXBsaWJzPXVua25vd24KKyAgaGFyZGNvZGVfYXV0b21hdGljPW5vCisgIG1vZHVsZV9jbWRzPQorICBtb2R1bGVfZXhwc3ltX2NtZHM9CisgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubworICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgaW5jbHVkZV9leHBzeW1zPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIGV4Y2x1ZGVfZXhwc3ltcz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisgICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KKyAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBlc2FjCisKKyAgbGRfc2hsaWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBlbHNlCisgIAl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPi9kZXYvbnVsbGAgaW4KKyAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKworICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCWFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworICAgICAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS8nXCcnIC1lICdcJycvXltBSVRXXVsgXS9zLy4qWyBdLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCBrKmJzZCotZ251KQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJdG1wX2FkZGZsYWc9CisJY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCisJcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJKlN1blwgRiopCQkJIyBTdW4gRm9ydHJhbiA4LjMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqKQorCSAgdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnIDs7CisJZXNhYworCWFyY2hpdmVfY21kcz0nJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90CisqKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKwk7OworCSopCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LXJwYXRoLCRsaWJkaXJgJworCSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzPW5vCisJICBmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwloYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYWl4NCogfCBhaXg1KikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisgIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgCSAgICBicmVhaworICAJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgYXJjaGl2ZV9jbWRzPScnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAorICAJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCSAgdGhlbgorICAJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKyAgCSAgOgorCSAgZWxzZQorICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisgIAkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisgIAkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworICAJICBoYXJkY29kZV9taW51c19MPXllcworICAJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgIAkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorICAJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1iZXJvaycKKyAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisKK2x0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCS9eMC8geworCSAgICBzL14wICAqXCguKlwpJC9cMS8KKwkgICAgcAorCX0KKyAgICB9JworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iLXogbm9kZWZzIgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisKK2x0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCS9eMC8geworCSAgICBzL14wICAqXCguKlwpJC9cMS8KKwkgICAgcAorCX0KKyAgICB9JworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisJIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSckY29udmVuaWVuY2UnCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworCisgICAgYnNkaVs0NV0qKQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKyAgICAgIGxpYmV4dD1saWIKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9J3RydWUnCisgICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworICAgICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICA7OworICAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAgICAxMC5bMDEyXSkKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgIGVzYWMKKyAgICAgICAgIGZpCisgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgaGFyZGNvZGVfYXV0b21hdGljPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JycKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisgICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgbW9kdWxlX2NtZHM9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZWxzZQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgeGxjKikKKyAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR4bGN2ZXJzdHJpbmcnCisgICAgICAgICBtb2R1bGVfY21kcz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR4bGN2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIGxkX3NobGlicz1ubworICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisKKwloYXJkY29kZV9kaXJlY3Q9eWVzCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwloYXJkY29kZV9taW51c19MPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nK2IgJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdD1ubworCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfZGlyZWN0PXllcworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCWhhcmRjb2RlX2RpcmVjdD15ZXMKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisJZWxzZQorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgICA7OworCSAgZXNhYworICAgICAgICBmaQorICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHM9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkkTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1pbnB1dCAkbGliLmV4cCAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRybSAkbGliLmV4cCcKKworCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZWxzZQorCXdsYXJjPScnCisJYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKyAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorIAkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGxkX3NobGlicyIgPiY2OyB9Cit0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2OyB9CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsCisJcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljCisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQorICAgICAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIikgPiY1CisgIChldmFsICRhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgICBlbHNlCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJEVDSE9fQyIgPiY2OyB9CitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGRhcndpbiopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8sL0xSLyIgOzsKKyAgICAqKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgIGlmIGVjaG8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICBlbHNlCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCisgICMgT2ssIG5vdyB3ZSBoYXZlIHRoZSBwYXRoLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCB3ZSBjYW4gc3RlcCB0aHJvdWdoIGl0CisgICMgYW5kIGFkZCBtdWx0aWxpYiBkaXIgaWYgbmVjZXNzYXJ5LgorICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0KKyAgbHRfbXVsdGlfb3NfZGlyPWAkQ0MgJENQUEZMQUdTICRDRkxBR1MgJExERkxBR1MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSAyPi9kZXYvbnVsbGAKKyAgZm9yIGx0X3N5c19wYXRoIGluICRsdF9zZWFyY2hfcGF0aF9zcGVjOyBkbworICAgIGlmIHRlc3QgLWQgIiRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIjsgdGhlbgorICAgICAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciIKKyAgICBlbHNlCisgICAgICB0ZXN0IC1kICIkbHRfc3lzX3BhdGgiICYmIFwKKwlsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aCIKKyAgICBmaQorICBkb25lCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIHwgYXdrICcKK0JFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKKyAgbHRfZm9vPSIiOworICBsdF9jb3VudD0wOworICBmb3IgKGx0X2kgPSBORjsgbHRfaSA+IDA7IGx0X2ktLSkgeworICAgIGlmICgkbHRfaSAhPSAiIiAmJiAkbHRfaSAhPSAiLiIpIHsKKyAgICAgIGlmICgkbHRfaSA9PSAiLi4iKSB7CisgICAgICAgIGx0X2NvdW50Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobHRfY291bnQgPT0gMCkgeworICAgICAgICAgIGx0X2Zvbz0iLyIgJGx0X2kgbHRfZm9vOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGx0X2NvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW2x0X2Zvb10rKzsgfQorICBpZiAobHRfZnJlcVtsdF9mb29dID09IDEpIHsgcHJpbnQgbHRfZm9vOyB9Cit9J2AKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICRsdF9zZWFyY2hfcGF0aF9zcGVjYAorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXg0KiB8IGFpeDUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgICAgIDs7CisgICAgbWluZ3cqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsgCV0qaHdjYXBbIAldL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJEVDSE9fQyIgPiY2OyB9CitoYXJkY29kZV9hY3Rpb249CitpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiB8fCBcCisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCApIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRjb2RlX2FjdGlvbiIgPiY2OyB9CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCitzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KKyAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKKyAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisjIEZJWE1FIC0gaW5zZXJ0IHNvbWUgcmVhbCB0ZXN0cywgaG9zdF9vcyBpc24ndCByZWFsbHkgZ29vZCBlbm91Z2gKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgZGFyd2luKikKKyAgICAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgorICAgICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKKyAgICAgICAgIG9sZF9zdHJpcGxpYj0iJFNUUklQIC1TIgorICAgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKyAgICAgICBlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKyAgICAgICA7OworICAgKikKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgICAgOzsKKyAgZXNhYworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCisgIGVuYWJsZV9kbG9wZW49dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KK2Vsc2UKKyAgbHRfY3ZfZGxvcGVuPW5vCisgIGx0X2N2X2Rsb3Blbl9saWJzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYmVvcyopCisgICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICA7OworCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX2RsX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgIDs7CisKKyAgKikKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2hsX2xvYWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2hsX2xvYWQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc2hsX2xvYWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgc2hsX2xvYWQgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBzaGxfbG9hZC4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSBzaGxfbG9hZCBpbm5vY3VvdXNfc2hsX2xvYWQKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc2hsX2xvYWQgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgc2hsX2xvYWQKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzaGxfbG9hZCAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViX3NobF9sb2FkIHx8IGRlZmluZWQgX19zdHViX19fc2hsX2xvYWQKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gc2hsX2xvYWQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl9mdW5jX3NobF9sb2FkPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfZnVuY19zaGxfbG9hZD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX3NobF9sb2FkID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzaGxfbG9hZCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCIKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4uLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lIGRsb3BlbiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIGRsb3Blbi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSBkbG9wZW4gaW5ub2N1b3VzX2Rsb3BlbgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBkbG9wZW4gKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgZGxvcGVuCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfZGxvcGVuIHx8IGRlZmluZWQgX19zdHViX19fZGxvcGVuCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2Z1bmNfZGxvcGVuPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfZnVuY19kbG9wZW49bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfZGxvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX2Rsb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX2RsX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9zdmxkX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHN2bGQgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGliX3N2bGRfZGxvcGVuPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9saWJfc3ZsZF9kbG9wZW4gPSB5ZXM7IHRoZW4KKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiCitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9kbGRfbGluaytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbGRfbGluayAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRsZF9saW5rICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX2RsZF9kbGRfbGluaz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9kbGRfZGxkX2xpbms9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCIKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDE3NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfZGxvcGVuX3NlbGYiID4mNjsgfQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcworZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjc3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICAgIGV4aXQgKHN0YXR1cyk7Cit9CitFT0YKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9CisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorCisKKyMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNjsgfQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBmaQorICAgIDs7Citlc2FjCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRlbmFibGVfc2hhcmVkIiA+JjY7IH0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNjsgfQorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZV9zdGF0aWMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGVuYWJsZV9zdGF0aWMiID4mNjsgfQorCisjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgY29tcGlsZXIgXAorICAgIENDIFwKKyAgICBMRCBcCisgICAgbHRfcHJvZ19jb21waWxlcl93bCBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgXAorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzIFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIFwKKyAgICBwcmVkZXBfb2JqZWN0cyBcCisgICAgcG9zdGRlcF9vYmplY3RzIFwKKyAgICBwcmVkZXBzIFwKKyAgICBwb3N0ZGVwcyBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKKyAgICBhcmNoaXZlX2NtZHMgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgXAorICAgIHBvc3R1bmluc3RhbGxfY21kcyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnIFwKKyAgICBub191bmRlZmluZWRfZmxhZyBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kcyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljIFwKKyAgICBtb2R1bGVfY21kcyBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzIFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyBcCisgICAgZml4X3NyY2ZpbGVfcGF0aCBcCisgICAgZXhjbHVkZV9leHBzeW1zIFwKKyAgICBpbmNsdWRlX2V4cHN5bXM7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCisgICAgYXJjaGl2ZV9jbWRzIHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCisgICAgbW9kdWxlX2NtZHMgfCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQorICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgY2FzZSAkbHRfZWNobyBpbgorICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitjZmdmaWxlPSIke29maWxlfVQiCisgIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICRybSAtZiAiJGNmZ2ZpbGUiCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRvZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRvZmlsZSIgPiY2O30KKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNworIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6CisjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KK1NFRD0kbHRfU0VECisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9CisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0MKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTEQKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCisKKyMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgorb2JqZXh0PSIkYWNfb2JqZXh0IgorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpYworcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX28KKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kcworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kcworYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kcworcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHMKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBzPSRsdF9wcmVkZXBzCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwcworCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aAorCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgorZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgorCisjIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCitoYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicworCisjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZAorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCisKKyMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5CisjIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWMKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSRsdF9maXhfc3JjZmlsZV9wYXRoCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXMKKworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19fRU9GX18KKworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitFT0YKKyAgICA7OworICBlc2FjCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICckcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8IFwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3RhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0kd2l0aF90YWdzOyB0YWduYW1lcz0iJHdpdGh2YWwiCitmaQorCisKK2lmIHRlc3QgLWYgIiRsdG1haW4iICYmIHRlc3QgLW4gIiR0YWduYW1lcyI7IHRoZW4KKyAgaWYgdGVzdCAhIC1mICIke29maWxlfSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgZXhpc3QiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBvdXRwdXQgZmlsZSBcYCRvZmlsZScgZG9lcyBub3QgZXhpc3QiID4mMjt9CisgIGZpCisKKyAgaWYgdGVzdCAteiAiJExUQ0MiOyB0aGVuCisgICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENDPSdgIgorICAgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGxvb2sgbGlrZSBhIGxpYnRvb2wgc2NyaXB0IiA+JjI7fQorICAgIGVsc2UKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHVzaW5nIFxgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIFxgJG9maWxlJyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIFxgTFRDQz0kTFRDQycsIGV4dHJhY3RlZCBmcm9tIFxgJG9maWxlJyIgPiYyO30KKyAgICBmaQorICBmaQorICBpZiB0ZXN0IC16ICIkTFRDRkxBR1MiOyB0aGVuCisgICAgZXZhbCAiYCRTSEVMTCAke29maWxlfSAtLWNvbmZpZyB8IGdyZXAgJ15MVENGTEFHUz0nYCIKKyAgZmkKKworICAjIEV4dHJhY3QgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIGluICRvZmlsZS4KKyAgIyBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoZSBlbnRpcmUgbGlzdCBpcyBvbiBvbmUgbGluZS4KKyAgYXZhaWxhYmxlX3RhZ3M9YGdyZXAgIl5hdmFpbGFibGVfdGFncz0iICIke29maWxlfSIgfCAkU0VEIC1lICdzL2F2YWlsYWJsZV90YWdzPVwoLiokXCkvXDEvJyAtZSAncy9cIi8vZydgCisKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgIGZvciB0YWduYW1lIGluICR0YWduYW1lczsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKKyAgICBjYXNlIGAkZWNobyAiWCR0YWduYW1lIiB8ICRYc2VkIC1lICdzOlstX0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwLC9dOjpnJ2AgaW4KKyAgICAiIikgOzsKKyAgICAqKSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwk7OworICAgIGVzYWMKKworICAgIGlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHtvZmlsZX0iID4gL2Rldi9udWxsCisgICAgdGhlbgorICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdGFnIG5hbWUgXCIkdGFnbmFtZVwiIGFscmVhZHkgZXhpc3RzIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHRhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0cyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGZpCisKKyAgICAjIFVwZGF0ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSI7IHRoZW4KKyAgICAgIGVjaG8gYXBwZW5kaW5nIGNvbmZpZ3VyYXRpb24gdGFnIFwiJHRhZ25hbWVcIiB0byAkb2ZpbGUKKworICAgICAgY2FzZSAkdGFnbmFtZSBpbgorICAgICAgQ1hYKQorCWlmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisJICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorCSAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KKwkgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworCisKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQorYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9CitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPQoraGFyZGNvZGVfZGlyZWN0X0NYWD1ubworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWD0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQoraGFyZGNvZGVfbWludXNfTF9DWFg9bm8KK2hhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPXVuc3VwcG9ydGVkCitoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPW5vCittb2R1bGVfY21kc19DWFg9Cittb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPQorbGlua19hbGxfZGVwbGlic19DWFg9dW5rbm93bgorb2xkX2FyY2hpdmVfY21kc19DWFg9JG9sZF9hcmNoaXZlX2NtZHMKK25vX3VuZGVmaW5lZF9mbGFnX0NYWD0KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPW5vCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitwcmVkZXBfb2JqZWN0c19DWFg9Citwb3N0ZGVwX29iamVjdHNfQ1hYPQorcHJlZGVwc19DWFg9Citwb3N0ZGVwc19DWFg9Citjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jcHAKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X0NYWD0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW10pIHsgcmV0dXJuKDApOyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0kQ0MKK2x0X3NhdmVfTEQ9JExECitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9JEdYWAorbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKK2x0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAoraWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgorICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKK2Vsc2UKKyAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCitmaQoraWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCisgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKK2Vsc2UKKyAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKK2ZpCit0ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAorQ0M9JHtDWFgtImMrKyJ9Citjb21waWxlcj0kQ0MKK2NvbXBpbGVyX0NYWD0kQ0MKK2ZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCisKKworIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKKyMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKK2lmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWD0nIC1mbm8tYnVpbHRpbicKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPQorZmkKKworaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9JHdpdGhfZ251X2xkOyB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gJEVDSE9fQyIgPiY2OyB9CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJEVDSE9fQyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gJEVDSE9fQyIgPiY2OyB9CitmaQoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX0xEK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwk7OworICAgICAgKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpCitmaQorCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJExEIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRMRCIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KK2Nhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCisgIDs7CisqKQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworICA7OworZXNhYworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfZ251X2xkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Cit3aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKKworCisKKyAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCisgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgorICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KKyAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8IFwKKwlncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGVsc2UKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KKyAgICBmaQorICBlbHNlCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICB3bGFyYz0KKworICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKKyAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAorICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCisgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworICBmaQorCisgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJworCitlbHNlCisgIEdYWD1ubworICB3aXRoX2dudV9sZD1ubworICB3bGFyYz0KK2ZpCisKKyMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KK2xkX3NobGlic19DWFg9eWVzCitjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICBhaXg0KiB8IGFpeDUqKQorICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisgICAgICBub19lbnRyeV9mbGFnPSIiCisgICAgZWxzZQorICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorCWZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgY2FzZSAkbGRfZmxhZyBpbgorCSAgKi1icnRsKikKKwkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICBmaQorCisgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgIGFyY2hpdmVfY21kc19DWFg9JycKKyAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JworICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKyAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCXRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCWVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJc2hhcmVkX2ZsYWc9Jy1HJworICAgICAgZWxzZQorCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJZWxzZQorCSAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPXllcworICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisgICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisKK2x0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCS9eMC8geworCSAgICBzL14wICAqXCguKlwpJC9cMS8KKwkgICAgcAorCX0KKyAgICB9JworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iLXogbm9kZWZzIgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorICAgICAgZWxzZQorCSMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorCitsdF9haXhfbGlicGF0aF9zZWQ9JworICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkvXjAvIHsKKwkgICAgcy9eMCAgKlwoLipcKSQvXDEvCisJICAgIHAKKwl9CisgICAgfScKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgorICBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKK2ZpCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCW5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm5vdG9rJworCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm9rJworCSMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJGNvbnZlbmllbmNlJworCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICBmaQorICAgIGZpCisgICAgOzsKKworICBiZW9zKikKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorICAgICAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworICAgICAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICBmaQorICAgIDs7CisKKyAgY2hvcnVzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIENYWCkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLUwkbGliZGlyJworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9bm8KKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD15ZXMKKworICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgIGVsc2UKKwllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwljYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgZml+CisgICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIGZpCisgIDs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgZWxzZQorICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgICAgIDEwLlswMTJdKQorICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCisgICAgICBoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJworICAgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyA7IHRoZW4KKyAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgIGlmICRDQyAtZHVtcHNwZWNzIDI+JjEgfCAkRUdSRVAgJ3NpbmdsZV9tb2R1bGUnID4vZGV2L251bGwgOyB0aGVuCisgICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgZWxzZQorICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICAgIGZpCisgICAgICAgIG1vZHVsZV9jbWRzX0NYWD0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIGZpCisgICAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICBlbHNlCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICB4bGMqKQorICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR4bGN2ZXJzdHJpbmcnCisgICAgICAgICAgbW9kdWxlX2NtZHNfQ1hYPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR4bGN2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICA7OworICAgICAgICopCisgICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICAgIDs7CisKKyAgZGd1eCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGVjKysqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgZ2hjeCopCisJIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIGZyZWVic2RbMTJdKikKKyAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlIHN3aXRjaCB0byBFTEYKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgZnJlZWJzZC1lbGYqKQorICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgIDs7CisgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAjIEZyZWVCU0QgMyBhbmQgbGF0ZXIgdXNlIEdOVSBDKysgYW5kIEdOVSBsZCB3aXRoIHN0YW5kYXJkIEVMRgorICAgICMgY29udmVudGlvbnMKKyAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgIDs7CisgIGdudSopCisgICAgOzsKKyAgaHB1eDkqKQorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBDQyopCisgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgIDs7CisgICAgYUNDKikKKyAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICMKKyAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJbLV1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgaHB1eDEwKnxocHV4MTEqKQorICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKSA7OworICAgICAgKikKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1FJworICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgICA7OworICAgICopCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGFDQyopCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCopCisJICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGlhNjQqKQorCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBpbnRlcml4WzMtOV0qKQorICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCisgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgIDs7CisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCSMgU0dJIEMrKworCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSMgaW4gdGhlIGFyY2hpdmUuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgZWxzZQorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJworCSAgZmkKKwlmaQorCWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCTs7CisgICAgZXNhYworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8IGdyZXAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIGljcGMqKQorCSMgSW50ZWwgQysrCisJd2l0aF9nbnVfbGQ9eWVzCisJIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKKwkjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAorCSMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJWZXJzaW9uIDcuIiopCisgIAkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICA7OworCSopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCisJICB0bXBfaWR5bj0KKwkgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkgIGVzYWMKKyAgCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIDs7CisJZXNhYworCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCTs7CisgICAgICBwZ0NDKikKKyAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKyAgCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICA7OworICAgICAgY3h4KikKKwkjIENvbXBhcSBDKysKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJworCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikKKwkgICMgU3VuIEMrKyA1LjkKKwkgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nIC16ZGVmcycKKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scycKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCisJICAjIE5vdCBzdXJlIHdoZXRoZXIgc29tZXRoaW5nIGJhc2VkIG9uCisJICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCisJICAjIHdvdWxkIGJlIGJldHRlci4KKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworCisJICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAjIGluIHRoZSBhcmNoaXZlLgorCSAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgICA7OworICBseW54b3MqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICBtODhrKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgbXZzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY3h4KikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIG5ldGJzZCopCisgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICBmaQorICAgICMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKyAgICA7OworICBvcGVuYnNkMiopCisgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICBvcGVuYnNkKikKKyAgICBpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBmaQorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIGZpCisgICAgOzsKKyAgb3NmMyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCisJOzsKKyAgICAgIFJDQyopCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGN4eCopCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCisKKwllbHNlCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIG9zZjQqIHwgb3NmNSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCWFyY2hpdmVfY21kc19DWFg9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW14oKTAtOUEtWmEtent9XVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgUkNDKikKKwkjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgY3h4KikKKwlhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIC1XbCwtaW5wdXQgLVdsLCRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24JJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgJHJtICRsaWIuZXhwJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJworCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBwc29zKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgc3Vub3M0KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCSMgU3VuIEMrKyA0LngKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGxjYyopCisJIyBMdWNpZAorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc29sYXJpcyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisgICAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwlub191bmRlZmluZWRfZmxhZ19DWFg9JyAtemRlZnMnCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWNhc2UgJGhvc3Rfb3MgaW4KKwkgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKwkgICopCisJICAgICMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJICAgICMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuCisJICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgOzsKKwllc2FjCisJbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSMgaW4gdGhlIGFyY2hpdmUuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIGdjeCopCisJIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisKKwkjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgICopCisJIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgaWYgJENDIC0tdmVyc2lvbiB8IGdyZXAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgorCSAgZWxzZQorCSAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICMgcGxhdGZvcm0uCisJICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCisJICBmaQorCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkd2wkbGliZGlyJworCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworCSAgKikKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJICAgIDs7CisJICBlc2FjCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuWzAyNF0qKQorICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teix0ZXh0JworICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgICAqKQorCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgZXNhYworICAgIDs7CisgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICMgYXMgLXogZGVmcy4KKyAgICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCisgICAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKKyAgICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworICAgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCisgICAgIyBTbyB0aGF0IGJlaGF2aW91ciBpcyBvbmx5IGVuYWJsZWQgaWYgU0NPQUJTUEFUSCBpcyBzZXQgdG8gYQorICAgICMgbm9uLWVtcHR5IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudC4gIE1vc3QgbGlrZWx5IG9ubHkgdXNlZnVsIGZvcgorICAgICMgY3JlYXRpbmcgb2ZmaWNpYWwgZGlzdHJpYnV0aW9ucyBvZiBwYWNrYWdlcy4KKyAgICAjIFRoaXMgaXMgYSBoYWNrIHVudGlsIGxpYnRvb2wgb2ZmaWNpYWxseSBzdXBwb3J0cyBhYnNvbHV0ZSBwYXRoCisgICAgIyBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcmllcy4KKyAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosbm9kZWZzJworICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JworICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUJleHBvcnQnCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICAgICopCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwk7OworICAgIGVzYWMKKyAgICA7OworICB0YW5kZW0qKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBOQ0MqKQorCSMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgdnh3b3JrcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgICopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7Citlc2FjCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KK3Rlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworR0NDX0NYWD0iJEdYWCIKK0xEX0NYWD0iJExEIgorCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK0VPRgorCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCisKKyAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQorICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KKyAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubworCisgICMgVGhlIGAqJyBpbiB0aGUgY2FzZSBtYXRjaGVzIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGBjYXNlJyBpbgorICAjICRvdXRwdXRfdmVyYm9zZV9jbWQgY2FuIHRyaWdnZXIgZ2xvYiBleHBhbnNpb24gZHVyaW5nIHRoZSBsb29wCisgICMgZXZhbCB3aXRob3V0IHRoaXMgc3Vic3RpdHV0aW9uLgorICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1gJGVjaG8gIlgkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiIHwgJFhzZWQgLWUgIiRub19nbG9iX3N1YnN0ImAKKworICBmb3IgcCBpbiBgZXZhbCAkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWRgOyBkbworICAgIGNhc2UgJHAgaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiBcCisJICB8fCB0ZXN0ICRwID0gIi1SIjsgdGhlbgorCSBwcmV2PSRwCisJIGNvbnRpbnVlCisgICAgICAgZWxzZQorCSBwcmV2PQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICRwIGluCisJIC1MKiB8IC1SKikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCI7IHRoZW4KKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJHBvc3RkZXBzX0NYWCI7IHRoZW4KKwkgICBwb3N0ZGVwc19DWFg9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgcG9zdGRlcHNfQ1hYPSIke3Bvc3RkZXBzX0NYWH0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKi4kb2JqZXh0KQorICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAorICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgorICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgorCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcworCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBpZiB0ZXN0IC16ICIkcHJlZGVwX29iamVjdHNfQ1hYIjsgdGhlbgorCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHAiCisJIGVsc2UKKwkgICBwcmVkZXBfb2JqZWN0c19DWFg9IiRwcmVkZXBfb2JqZWN0c19DWFggJHAiCisJIGZpCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkcG9zdGRlcF9vYmplY3RzX0NYWCI7IHRoZW4KKwkgICBwb3N0ZGVwX29iamVjdHNfQ1hYPSIkcCIKKwkgZWxzZQorCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwb3N0ZGVwX29iamVjdHNfQ1hYICRwIgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgorCisgICAgZXNhYworICBkb25lCisKKyAgIyBDbGVhbiB1cC4KKyAgcm0gLWYgYS5vdXQgYS5leGUKK2Vsc2UKKyAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nIENYWCB0ZXN0IHByb2dyYW0iCitmaQorCiskcm0gLWYgY29uZmVzdC4kb2JqZXh0CisKKyMgUE9SVE1FOiBvdmVycmlkZSBhYm92ZSB0ZXN0IG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYnJva2VuCitjYXNlICRob3N0X29zIGluCitpbnRlcml4WzMtOV0qKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIHByZWRlcF9vYmplY3RzX0NYWD0KKyAgcG9zdGRlcF9vYmplY3RzX0NYWD0KKyAgcG9zdGRlcHNfQ1hYPQorICA7OworCitsaW51eCopCisgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorICAqU3VuXCBDKikKKyAgICAjIFN1biBDKysgNS45CisgICAgIworICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIHBvc3RkZXBzX0NYWD0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworCitzb2xhcmlzKikKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgQ0MqKQorICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgorICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKKyAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgorICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBwb3N0ZGVwc19DWFg9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgOzsKK2VzYWMKKworCitjYXNlICIgJHBvc3RkZXBzX0NYWCAiIGluCisqIiAtbGMgIiopIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubyA7OworZXNhYworCitsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0KK2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkRUNIT19DIiA+JjY7IH0KKworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgIDs7CisgICAgaW50ZXJpeFszLTldKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQqIHwgYWl4NSopCisJIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwllbHNlCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKwlmaQorCTs7CisgICAgICBjaG9ydXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJY3hjaDY4KikKKwkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAjIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIENYWCk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICAgZGFyd2luKikKKyAgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgIHhsYyopCisgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXFub2NvbW1vbicKKyAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisgICAgICAgICAgIDs7CisgICAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKKwk7OworICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCisJICAgIGZpCisJICAgIDs7CisJICBhQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCp8aWE2NCopCisJICAgICAgIyArWiB0aGUgZGVmYXVsdAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgaW50ZXJpeCopCisJIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCisJIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PworCTs7CisgICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgICMgS0FJIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqKQorCSAgICAjIEludGVsIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZnBpYycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1Rb3B0aW9uIGxkICcKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqKQorCTs7CisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgOzsKKwkgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgRGlnaXRhbC9Db21wYXEgQysrCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHBzb3MqKQorCTs7CisgICAgICBzb2xhcmlzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctUW9wdGlvbiBsZCAnCisJICAgIDs7CisJICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1QSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3Vub3M0KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHRhbmRlbSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB2eHdvcmtzKikKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgIGZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjY7IH0KKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWD1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTI2OTc6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTI3MDE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubworZmkKKworZmkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIDs7Citlc2FjCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFhcIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9CitmaQorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPW5vCisgICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjEyODAxOiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTI4MDU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRybSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgIHJtZGlyIGNvbmZ0ZXN0CisgICAkcm0gY29uZnRlc3QqCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY2OyB9CisKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkRUNIT19DIiA+JjY7IH0KKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZF9saW5rcyIgPiY2OyB9CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KKworICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBjYXNlICRob3N0X29zIGluCisgIGFpeDQqIHwgYWl4NSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgIGlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZmkKKyAgICA7OworICBwdzMyKikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0iJGx0ZGxsX2NtZHMiCisgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyopCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxIERBVEEvOy9eLipbIF1fX25tX18vcy9eLipbIF1fX25tX19cKFteIF0qXClbIF1bXiBdKi9cMSBEQVRBLzsvXklbIF0vZDsvXltBSVRXXVsgXS9zLy4qWyBdLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgICopCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgOzsKKyAgZXNhYworCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KK3Rlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19DWFggaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2OyB9CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAorCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0KKyAgICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiKSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kc19DWFggMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICAgICAgZWxzZQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworICAgICAgICBmaQorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiID4mNjsgfQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkRUNIT19DIiA+JjY7IH0KK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsgCV0qaHdjYXBbIAldL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJEVDSE9fQyIgPiY2OyB9CitoYXJkY29kZV9hY3Rpb25fQ1hYPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIiB8fCBcCisgICB0ZXN0IC1uICIkcnVucGF0aF92YXJfQ1hYIiB8fCBcCisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19DWFgiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9DWFgiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIENYWCkiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0NYWCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9DWFg9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9DWFg9dW5zdXBwb3J0ZWQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjY7IH0KKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBjb21waWxlcl9DWFggXAorICAgIENDX0NYWCBcCisgICAgTERfQ1hYIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWCBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFggXAorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWCBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWCBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0NYWCBcCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWCBcCisgICAgb2xkX2FyY2hpdmVfY21kc19DWFggXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIFwKKyAgICBwcmVkZXBfb2JqZWN0c19DWFggXAorICAgIHBvc3RkZXBfb2JqZWN0c19DWFggXAorICAgIHByZWRlcHNfQ1hYIFwKKyAgICBwb3N0ZGVwc19DWFggXAorICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFggXAorICAgIGFyY2hpdmVfY21kc19DWFggXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzX0NYWCBcCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzX0NYWCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIFwKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFggXAorICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWCBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFggXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWCBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFggXAorICAgIGhhcmRjb2RlX2F1dG9tYXRpY19DWFggXAorICAgIG1vZHVsZV9jbWRzX0NYWCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWCBcCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIFwKKyAgICBmaXhfc3JjZmlsZV9wYXRoX0NYWCBcCisgICAgZXhjbHVkZV9leHBzeW1zX0NYWCBcCisgICAgaW5jbHVkZV9leHBzeW1zX0NYWDsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIHwgXAorICAgIGFyY2hpdmVfY21kc19DWFggfCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFggfCBcCisgICAgbW9kdWxlX2NtZHNfQ1hYIHwgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFggfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYIHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworY2ZnZmlsZT0iJG9maWxlIgorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX0NYWAorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDX0NYWAorCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRF9DWFgKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19DWFgKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0NYWAorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWAorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0NYWAorYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19DWFgKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0NYWAorbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0NYWAorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19DWFgKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X3ByZWRlcHNfQ1hYCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19DWFgKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0NYWAorCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fQ1hYCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFgKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfQ1hYCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0NYWAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFgKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19DWFgKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfQ1hYCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0kbHRfZml4X3NyY2ZpbGVfcGF0aAorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFgKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19DWFgKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0NYWAorCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0NYWAorCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCitfX0VPRl9fCisKKworZWxzZQorICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCisgICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQorICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCisgIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAorICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgorICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKKyAgZmkKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitDQz0kbHRfc2F2ZV9DQworTERDWFg9JExECitMRD0kbHRfc2F2ZV9MRAorR0NDPSRsdF9zYXZlX0dDQword2l0aF9nbnVfbGRjeHg9JHdpdGhfZ251X2xkCit3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECitsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKK2x0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCisKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBGNzcpCisJaWYgdGVzdCAtbiAiJEY3NyIgJiYgdGVzdCAiWCRGNzciICE9ICJYbm8iOyB0aGVuCisKK2FjX2V4dD1mCithY19jb21waWxlPSckRjc3IC1jICRGRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckRjc3IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkRkZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9mNzdfY29tcGlsZXJfZ251CisKKworYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCithbGxvd191bmRlZmluZWRfZmxhZ19GNzc9CithbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PW5vCithcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9CitoYXJkY29kZV9kaXJlY3RfRjc3PW5vCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PQoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9CitoYXJkY29kZV9taW51c19MX0Y3Nz1ubworaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz1ubworbW9kdWxlX2NtZHNfRjc3PQorbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KK2xpbmtfYWxsX2RlcGxpYnNfRjc3PXVua25vd24KK29sZF9hcmNoaXZlX2NtZHNfRjc3PSRvbGRfYXJjaGl2ZV9jbWRzCitub191bmRlZmluZWRfZmxhZ19GNzc9Cit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9CitlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3Nz1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KK2FjX2V4dD1mCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9GNzc9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJcCisgICAgICBzdWJyb3V0aW5lIHQKKyAgICAgIHJldHVybgorICAgICAgZW5kCisiCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0Y3Ny0iZjc3In0KK2NvbXBpbGVyPSRDQworY29tcGlsZXJfRjc3PSRDQworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2OyB9Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjYW5fYnVpbGRfc2hhcmVkIiA+JjY7IH0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNjsgfQordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgZmkKKyAgOzsKK2FpeDQqIHwgYWl4NSopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBmaQorICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kZW5hYmxlX3NoYXJlZCIgPiY2OyB9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRlbmFibGVfc3RhdGljIiA+JjY7IH0KKworR0NDX0Y3Nz0iJEc3NyIKK0xEX0Y3Nz0iJExEIgorCitsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0KK2x0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkRUNIT19DIiA+JjY7IH0KKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgICAgZmkKKyAgICAgIDs7CisgICAgICBkYXJ3aW4qKQorICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgeGxjKikKKyAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLXFub2NvbW1vbicKKyAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgICAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSkKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBpY2MqIHwgZWNjKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZnBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKwkgIDs7CisJKlN1blwgRiopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJworCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PScnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctUW9wdGlvbiBsZCAnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1QSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtjb25mb3JtX3BpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1waWMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciID4mNjsgfQorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IjsgdGhlbgorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3PW5vCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNDM2MzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxNDM2NzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3Nz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfRjc3PW5vCitmaQorCitmaQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9CisgICAgOzsKKyAgKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9IiRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciCisgICAgOzsKK2VzYWMKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3IGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3N1wiCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3PW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgICRlY2hvICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3Nz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NyIgPSB4eWVzOyB0aGVuCisgICAgOgorZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0KK2ZpCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzc9bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTQ0Njc6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxNDQ3MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzc9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJHJtIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgcm1kaXIgY29uZnRlc3QKKyAgICRybSBjb25mdGVzdCoKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA+JjY7IH0KKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRFQ0hPX0MiID4mNjsgfQorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkX2xpbmtzIiA+JjY7IH0KKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNjsgfQorCisgIHJ1bnBhdGhfdmFyPQorICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9CisgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PW5vCisgIGFyY2hpdmVfY21kc19GNzc9CisgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PQorICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0KKyAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3PQorICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQorICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9CisgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzc9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9CisgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKyAgaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKKyAgbGlua19hbGxfZGVwbGlic19GNzc9dW5rbm93bgorICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PW5vCisgIG1vZHVsZV9jbWRzX0Y3Nz0KKyAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KKyAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubworICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIGluY2x1ZGVfZXhwc3ltc19GNzc9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgZXhjbHVkZV9leHBzeW1zX0Y3Nz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisgICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KKyAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBlc2FjCisKKyAgbGRfc2hsaWJzX0Y3Nz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgorICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlic19GNzc9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKworICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEY3NykgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS8nXCcnIC1lICdcJycvXltBSVRXXVsgXS9zLy4qWyBdLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCBrKmJzZCotZ251KQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJdG1wX2FkZGZsYWc9CisJY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCisJcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKKwllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7CisJZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKKwlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgorCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKKwllc2FjCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCQkJIyBTdW4gQyA1LjkKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJKlN1blwgRiopCQkJIyBTdW4gRm9ydHJhbiA4LjMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqKQorCSAgdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnIDs7CisJZXNhYworCWFyY2hpdmVfY21kc19GNzc9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKwlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCWZpCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJbGRfc2hsaWJzX0Y3Nz1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjFbMC01XS4qKQorCWxkX3NobGlic19GNzc9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LXJwYXRoLCRsaWJkaXJgJworCSAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBsZF9zaGxpYnNfRjc3PW5vCisJICBmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJGxkX3NobGlic19GNzciID0gbm87IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9CisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQorICAgIGZpCisgIGVsc2UKKyAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3PXllcworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCWhhcmRjb2RlX2RpcmVjdF9GNzc9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYWl4NCogfCBhaXg1KikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZWxzZQorCSAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzc9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKyAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworICAJICAgIGJyZWFrCisgIAkgIGZpCisJICBkb25lCisJICA7OworCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PScnCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorCSMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworCSMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAorICAJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCSAgdGhlbgorICAJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKyAgCSAgOgorCSAgZWxzZQorICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9dW5zdXBwb3J0ZWQKKyAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKyAgCSAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Jy1iZXJvaycKKyAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgICAgIHByb2dyYW0gbWFpbgorCisgICAgICBlbmQKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKworbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJL14wLyB7CisJICAgIHMvXjAgICpcKC4qXCkkL1wxLworCSAgICBwCisJfQorICAgIH0nCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KKyAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCitmaQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCisKKyAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICBlbHNlCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0iLXogbm9kZWZzIgorCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisJZWxzZQorCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKwkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKworICAgICAgZW5kCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisKK2x0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCS9eMC8geworCSAgICBzL14wICAqXCguKlwpJC9cMS8KKwkgICAgcAorCX0KKyAgICB9JworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisJIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWJlcm5vdG9rJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJGNvbnZlbmllbmNlJworCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgOzsKKworICAgIGJzZGlbNDVdKikKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyAnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgICBsaWJleHQ9bGliCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKyAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgorICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisgICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19GNzc9J3RydWUnCisgICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgICAgb2xkX2FyY2hpdmVfY21kc19GNzc9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICAgIGZpeF9zcmNmaWxlX3BhdGhfRjc3PSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgZWxzZQorICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgICAgIDEwLlswMTJdKQorICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz1ubworICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PXVuc3VwcG9ydGVkCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JycKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICBtb2R1bGVfY21kc19GNzc9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBlbHNlCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICB4bGMqKQorICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR4bGN2ZXJzdHJpbmcnCisgICAgICAgICBtb2R1bGVfY21kc19GNzc9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHhsY3ZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBsZF9zaGxpYnNfRjc3PW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorCisJaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJworCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwloYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9JytiICRsaWJkaXInCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwloYXJkY29kZV9kaXJlY3RfRjc3PXllcworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorCSAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisgICAgICAgIGZpCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBub191bmRlZmluZWRfZmxhZ19GNzc9JyAteiB0ZXh0JworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwl3bGFyYz0nJworCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKyAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKyAgICAgICopCisJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLiAgR0NDIGRpc2NhcmRzIGl0IHdpdGhvdXQgYCR3bCcsCisJIyBidXQgaXMgY2FyZWZ1bCBlbm91Z2ggbm90IHRvIHJlb3JkZXIuCisgCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzX0Y3Nz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnNfRjc3PXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuWzAyNF0qKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS16LHRleHQnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LXosbm9kZWZzJworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnNfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnNfRjc3IiA+JjY7IH0KK3Rlc3QgIiRsZF9zaGxpYnNfRjc3IiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzciIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19GNzcgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2OyB9CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NworCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3CisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0KKyAgICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYXJjaGl2ZV9jbWRzX0Y3NyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiKSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kc19GNzcgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KKyAgICAgICAgZWxzZQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PXllcworICAgICAgICBmaQorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzciID4mNjsgfQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkRUNIT19DIiA+JjY7IH0KK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsgCV0qaHdjYXBbIAldL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJEVDSE9fQyIgPiY2OyB9CitoYXJkY29kZV9hY3Rpb25fRjc3PQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3IiB8fCBcCisgICB0ZXN0IC1uICIkcnVucGF0aF92YXJfRjc3IiB8fCBcCisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19GNzciID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9GNzciICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEY3NykiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0Y3NyIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9GNzc9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9GNzc9dW5zdXBwb3J0ZWQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkY29kZV9hY3Rpb25fRjc3IiA+JjY7IH0KKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9GNzciID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBjb21waWxlcl9GNzcgXAorICAgIENDX0Y3NyBcCisgICAgTERfRjc3IFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzcgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0Y3NyBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3NyBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0Y3NyBcCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3IFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3NyBcCisgICAgb2xkX2FyY2hpdmVfY21kc19GNzcgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3IFwKKyAgICBwcmVkZXBfb2JqZWN0c19GNzcgXAorICAgIHBvc3RkZXBfb2JqZWN0c19GNzcgXAorICAgIHByZWRlcHNfRjc3IFwKKyAgICBwb3N0ZGVwc19GNzcgXAorICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9GNzcgXAorICAgIGFyY2hpdmVfY21kc19GNzcgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzX0Y3NyBcCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzX0Y3NyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3IFwKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzcgXAorICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3NyBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19GNzcgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3IFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3NyBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzcgXAorICAgIGhhcmRjb2RlX2F1dG9tYXRpY19GNzcgXAorICAgIG1vZHVsZV9jbWRzX0Y3NyBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3NyBcCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IFwKKyAgICBmaXhfc3JjZmlsZV9wYXRoX0Y3NyBcCisgICAgZXhjbHVkZV9leHBzeW1zX0Y3NyBcCisgICAgaW5jbHVkZV9leHBzeW1zX0Y3NzsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIG9sZF9hcmNoaXZlX2NtZHNfRjc3IHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3IHwgXAorICAgIGFyY2hpdmVfY21kc19GNzcgfCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzcgfCBcCisgICAgbW9kdWxlX2NtZHNfRjc3IHwgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19GNzcgfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3IHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3IHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworY2ZnZmlsZT0iJG9maWxlIgorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzcKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3CisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX0Y3NworCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDX0Y3NworCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRF9GNzcKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NworCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfRjc3CitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3CisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfRjc3CisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3NworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzcKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzcKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0Y3Nworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfRjc3CisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0Y3NworYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19GNzcKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0Y3NworbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfRjc3CisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0Y3NworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19GNzcKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X3ByZWRlcHNfRjc3CisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19GNzcKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfRjc3CisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19GNzcKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0Y3NworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fRjc3CisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzcKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzcKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfRjc3CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0Y3NworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzcKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19GNzcKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfRjc3CisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0kbHRfZml4X3NyY2ZpbGVfcGF0aAorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzcKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19GNzcKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0Y3NworCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0Y3NworCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCitfX0VPRl9fCisKKworZWxzZQorICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCisgICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQorICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCisgIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAorICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgorICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKKyAgZmkKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitDQz0iJGx0X3NhdmVfQ0MiCisKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBHQ0opCisJaWYgdGVzdCAtbiAiJEdDSiIgJiYgdGVzdCAiWCRHQ0oiICE9ICJYbm8iOyB0aGVuCisKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWphdmEKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9HQ0o9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge30iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J3B1YmxpYyBjbGFzcyBjb25mdGVzdCB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHt9OyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorQ0M9JHtHQ0otImdjaiJ9Citjb21waWxlcj0kQ0MKK2NvbXBpbGVyX0dDSj0kQ0MKK2ZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCisKKworIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCisKK29sZF9hcmNoaXZlX2NtZHNfR0NKPSRvbGRfYXJjaGl2ZV9jbWRzCisKKworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0o9JyAtZm5vLWJ1aWx0aW4nCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE2NjU0OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjE2NjU4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSB4eWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCitlbHNlCisgICAgOgorZmkKKworZmkKKworbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9CitsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJEVDSE9fQyIgPiY2OyB9CisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgaW50ZXJpeFszLTldKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWRfR0NKPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworICAgICAgZGFyd2luKikKKyAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgIHhsYyopCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1xbm9jb21tb24nCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICAgIDs7CisgICAgICAgZXNhYworICAgICAgIDs7CisKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgaWNjKiB8IGVjYyopCisJbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKKyAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKKwkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQorCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZwaWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIGNjYyopCisgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworCSAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisJICA7OworCSpTdW5cIEYqKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nJworCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICByZG9zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVFvcHRpb24gbGQgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LY29uZm9ybV9waWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIiA+JjY7IH0KKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiI7IHRoZW4KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSj1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTY5NDQ6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTY5NDg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0o9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworZmkKKworZmkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIgorICAgIDs7Citlc2FjCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0pcIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSj1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0oiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9CitmaQorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0orc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKPW5vCisgICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjE3MDQ4OiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTcwNTI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRybSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJHJtIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJHJtIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgIHJtZGlyIGNvbmZ0ZXN0CisgICAkcm0gY29uZnRlc3QqCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPiY2OyB9CisKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkRUNIT19DIiA+JjY7IH0KKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZF9saW5rcyIgPiY2OyB9CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KKworICBydW5wYXRoX3Zhcj0KKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPQorICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSj1ubworICBhcmNoaXZlX2NtZHNfR0NKPQorICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0KKyAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19HQ0o9CisgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSj0KKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0KKyAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPQorICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfR0NKPQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9CisgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPQorICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCisgIGhhcmRjb2RlX21pbnVzX0xfR0NKPW5vCisgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPXVuc3VwcG9ydGVkCisgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXVua25vd24KKyAgaGFyZGNvZGVfYXV0b21hdGljX0dDSj1ubworICBtb2R1bGVfY21kc19HQ0o9CisgIG1vZHVsZV9leHBzeW1fY21kc19HQ0o9CisgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9bm8KKyAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBpbmNsdWRlX2V4cHN5bXNfR0NKPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIGV4Y2x1ZGVfZXhwc3ltc19HQ0o9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorICAjIEp1c3QgYmVpbmcgcGFyYW5vaWQgYWJvdXQgZW5zdXJpbmcgdGhhdCBjY19iYXNlbmFtZSBpcyBzZXQuCisgIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIGxkX3NobGlic19HQ0o9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgIGVsc2UKKyAgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPi9kZXYvbnVsbGAgaW4KKyAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlsZF9zaGxpYnNfR0NKPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKKyoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisKKyAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCisgICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAorICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQorICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCisgICAgICAjIHRoZW0uCisgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBHQ0opIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcworICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxIERBVEEvJ1wnJyAtZSAnXCcnL15bQUlUV11bIF0vcy8uKlsgXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19HQ0o9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaW50ZXJpeFszLTldKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIDs7CisKKyAgICBnbnUqIHwgbGludXgqIHwgaypic2QqLWdudSkKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRtcF9hZGRmbGFnPQorCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJKikKKwkgIHRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJyA7OworCWVzYWMKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisJaWYgdGVzdCAkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nID0geWVzOyB0aGVuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCWxkX3NobGlic19HQ0o9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlic19HQ0o9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xWzAtNV0uKikKKwlsZF9zaGxpYnNfR0NKPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90CisqKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKwk7OworCSopCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1ycGF0aCwkbGliZGlyYCcKKwkgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSwtcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzX0dDSj1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19HQ0o9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnNfR0NKIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwloYXJkY29kZV9kaXJlY3RfR0NKPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKwkjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisJZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSIiCisgICAgICBlbHNlCisJIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisJIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorCWlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0o9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZmkKKwlhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKwkjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKwkjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKwkjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisgIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgCSAgICBicmVhaworICAJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPSc6JworICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKyAgCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKyAgCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgIAkgIDoKKwkgIGVsc2UKKyAgCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorICAJICBoYXJkY29kZV9kaXJlY3RfR0NKPXVuc3VwcG9ydGVkCisgIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKyAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKyAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisgIAkgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0KKwkgIGZpCisJICA7OworCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCWZpCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisgIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSctYmVyb2snCisgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorCitsdF9haXhfbGlicGF0aF9zZWQ9JworICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkvXjAvIHsKKwkgICAgcy9eMCAgKlwoLipcKSQvXDEvCisJICAgIHAKKwl9CisgICAgfScKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgorICBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKK2ZpCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSIteiBub2RlZnMiCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisKK2x0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCS9eMC8geworCSAgICBzL14wICAqXCguKlwpJC9cMS8KKwkgICAgcAorCX0KKyAgICB9JworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisJIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWJlcm5vdG9rJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJGNvbnZlbmllbmNlJworCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgbGRfc2hsaWJzX0dDSj1ubworICAgICAgOzsKKworICAgIGJzZGlbNDVdKikKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyAnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgICBsaWJleHQ9bGliCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKyAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgorICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCAkU0VEIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisgICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19HQ0o9J3RydWUnCisgICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgICAgb2xkX2FyY2hpdmVfY21kc19HQ0o9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICAgIGZpeF9zcmNmaWxlX3BhdGhfR0NKPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPXllcworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgZWxzZQorICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgICAgIDEwLlswMTJdKQorICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj1ubworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj1ubworICAgICAgaGFyZGNvZGVfYXV0b21hdGljX0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPXVuc3VwcG9ydGVkCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JycKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICBtb2R1bGVfY21kc19HQ0o9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBlbHNlCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICB4bGMqKQorICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR4bGN2ZXJzdHJpbmcnCisgICAgICAgICBtb2R1bGVfY21kc19HQ0o9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9JHJwYXRoLyRzb25hbWUgJHhsY3ZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIDs7CisgICAgICAgKikKKyAgICAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorCisJaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJworCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwloYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9JytiICRsaWJkaXInCisJICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfR0NKPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorICAgICAgbGlua19hbGxfZGVwbGlic19HQ0o9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwloYXJkY29kZV9kaXJlY3RfR0NKPXllcworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorCSAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisgICAgICAgIGZpCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0dDSj1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyAteiB0ZXh0JworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGVsc2UKKwl3bGFyYz0nJworCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKyAgCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKyAgICAgICopCisJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLiAgR0NDIGRpc2NhcmRzIGl0IHdpdGhvdXQgYCR3bCcsCisJIyBidXQgaXMgY2FyZWZ1bCBlbm91Z2ggbm90IHRvIHJlb3JkZXIuCisgCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSj0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzX0dDSj0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3RfR0NKPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnNfR0NKPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuWzAyNF0qKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS16LHRleHQnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXosbm9kZWZzJworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnNfR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnNfR0NKIiA+JjY7IH0KK3Rlc3QgIiRsZF9zaGxpYnNfR0NKIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19HQ0ogaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2OyB9CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgorCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0KKyAgICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYXJjaGl2ZV9jbWRzX0dDSiAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiKSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKyAgICAgICAgZWxzZQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPXllcworICAgICAgICBmaQorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oiID4mNjsgfQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkRUNIT19DIiA+JjY7IH0KK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsgCV0qaHdjYXBbIAldL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjY7IH0KK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJEVDSE9fQyIgPiY2OyB9CitoYXJkY29kZV9hY3Rpb25fR0NKPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIiB8fCBcCisgICB0ZXN0IC1uICIkcnVucGF0aF92YXJfR0NKIiB8fCBcCisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9HQ0oiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEdDSikiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0dDSiIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9dW5zdXBwb3J0ZWQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkY29kZV9hY3Rpb25fR0NKIiA+JjY7IH0KKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9HQ0oiID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBjb21waWxlcl9HQ0ogXAorICAgIENDX0dDSiBcCisgICAgTERfR0NKIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0ogXAorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSiBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSiBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0dDSiBcCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSiBcCisgICAgb2xkX2FyY2hpdmVfY21kc19HQ0ogXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIFwKKyAgICBwcmVkZXBfb2JqZWN0c19HQ0ogXAorICAgIHBvc3RkZXBfb2JqZWN0c19HQ0ogXAorICAgIHByZWRlcHNfR0NKIFwKKyAgICBwb3N0ZGVwc19HQ0ogXAorICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9HQ0ogXAorICAgIGFyY2hpdmVfY21kc19HQ0ogXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKIFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzX0dDSiBcCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzX0dDSiBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIFwKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0ogXAorICAgIG5vX3VuZGVmaW5lZF9mbGFnX0dDSiBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19HQ0ogXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSiBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0ogXAorICAgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0ogXAorICAgIG1vZHVsZV9jbWRzX0dDSiBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSiBcCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIFwKKyAgICBmaXhfc3JjZmlsZV9wYXRoX0dDSiBcCisgICAgZXhjbHVkZV9leHBzeW1zX0dDSiBcCisgICAgaW5jbHVkZV9leHBzeW1zX0dDSjsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIG9sZF9hcmNoaXZlX2NtZHNfR0NKIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIHwgXAorICAgIGFyY2hpdmVfY21kc19HQ0ogfCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0ogfCBcCisgICAgbW9kdWxlX2NtZHNfR0NKIHwgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0ogfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKIHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworY2ZnZmlsZT0iJG9maWxlIgorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX0dDSgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDX0dDSgorCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRF9HQ0oKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfR0NKCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSgorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0oKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19HQ0oKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0dDSgorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSgorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0dDSgorYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19HQ0oKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0dDSgorbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfR0NKCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0dDSgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19HQ0oKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X3ByZWRlcHNfR0NKCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19HQ0oKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfR0NKCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19HQ0oKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0dDSgorCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fR0NKCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0oKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0oKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfR0NKCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0dDSgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0oKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfR0NKCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0kbHRfZml4X3NyY2ZpbGVfcGF0aAorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0oKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19HQ0oKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0dDSgorCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0dDSgorCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCitfX0VPRl9fCisKKworZWxzZQorICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCisgICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQorICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCisgIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAorICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgorICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKKyAgZmkKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitDQz0iJGx0X3NhdmVfQ0MiCisKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBSQykKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PXJjCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X1JDPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfScKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7UkMtIndpbmRyZXMifQorY29tcGlsZXI9JENDCitjb21waWxlcl9SQz0kQ0MKK2ZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCisKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDPXllcworCisjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgY29tcGlsZXJfUkMgXAorICAgIENDX1JDIFwKKyAgICBMRF9SQyBcCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9SQyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfUkMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQyBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDIFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfUkMgXAorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX1JDIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDIFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDIFwKKyAgICBwcmVkZXBfb2JqZWN0c19SQyBcCisgICAgcG9zdGRlcF9vYmplY3RzX1JDIFwKKyAgICBwcmVkZXBzX1JDIFwKKyAgICBwb3N0ZGVwc19SQyBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX1JDIFwKKyAgICBhcmNoaXZlX2NtZHNfUkMgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgXAorICAgIHBvc3RpbnN0YWxsX2NtZHNfUkMgXAorICAgIHBvc3R1bmluc3RhbGxfY21kc19SQyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMgXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX1JDIFwKKyAgICBub191bmRlZmluZWRfZmxhZ19SQyBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19SQyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19SQyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9SQyBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQyBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljX1JDIFwKKyAgICBtb2R1bGVfY21kc19SQyBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQyBcCisgICAgZml4X3NyY2ZpbGVfcGF0aF9SQyBcCisgICAgZXhjbHVkZV9leHBzeW1zX1JDIFwKKyAgICBpbmNsdWRlX2V4cHN5bXNfUkM7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzX1JDIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMgfCBcCisgICAgYXJjaGl2ZV9jbWRzX1JDIHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfUkMgfCBcCisgICAgbW9kdWxlX2NtZHNfUkMgfCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX1JDIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDIHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfUkMgfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQorICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgY2FzZSAkbHRfZWNobyBpbgorICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitjZmdmaWxlPSIkb2ZpbGUiCisKKyAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX1JDCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX1JDCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX1JDCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0NfUkMKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfUkMKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX1JDCisKKyMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgorb2JqZXh0PSIkYWNfb2JqZXh0IgorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19SQworcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkMKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfUkMKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19SQworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX1JDCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19SQworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19SQworYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19SQworcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfUkMKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX1JDCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX1JDCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX1JDCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBzPSRsdF9wcmVkZXBzX1JDCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19SQworCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9SQworCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgorZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWdfUkMKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX1JDCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9SQworCisjIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCitoYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicworCisjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfUkMKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9SQworCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X1JDCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX1JDCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX1JDCisKKyMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5CisjIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfUkMKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfUkMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSRsdF9maXhfc3JjZmlsZV9wYXRoCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX1JDCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfUkMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX1JDCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfUkMKKworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworX19FT0ZfXworCisKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKKyAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KKyAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCisgIGZpCitmaQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworQ0M9IiRsdF9zYXZlX0NDIgorCisJOzsKKworICAgICAgKikKKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBVbnN1cHBvcnRlZCB0YWcgbmFtZTogJHRhZ25hbWUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBcHBlbmQgdGhlIG5ldyB0YWcgbmFtZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIiA7IHRoZW4KKyAgICAgIGF2YWlsYWJsZV90YWdzPSIkYXZhaWxhYmxlX3RhZ3MgJHRhZ25hbWUiCisgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorCisgICMgTm93IHN1YnN0aXR1dGUgdGhlIHVwZGF0ZWQgbGlzdCBvZiBhdmFpbGFibGUgdGFncy4KKyAgaWYgZXZhbCAic2VkIC1lICdzL15hdmFpbGFibGVfdGFncz0uKlwkL2F2YWlsYWJsZV90YWdzPVwiJGF2YWlsYWJsZV90YWdzXCIvJyBcIiRvZmlsZVwiID4gXCIke29maWxlfVRcIiI7IHRoZW4KKyAgICBtdiAiJHtvZmlsZX1UIiAiJG9maWxlIgorICAgIGNobW9kICt4ICIkb2ZpbGUiCisgIGVsc2UKKyAgICBybSAtZiAiJHtvZmlsZX1UIgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVuYWJsZSB0byB1cGRhdGUgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZmkKK2ZpCisKKworCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworCisjIFByZXZlbnQgbXVsdGlwbGUgZXhwYW5zaW9uCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitDRkxBR1M9IiR7YWNfc2F2ZV9DRkxBR1N9IgorCisjIGluY3JlYXNlIHRoaXMgd2hlbiB0aGUgc2hhcmVkIGxpYiBiZWNvbWVzIHRvdGFsbHkgaW5jb21wYXRpYmxlCitMSUJfTUFKT1JfVkVSU0lPTj0wCisKKyMgaW5jcmVhc2UgdGhpcyB3aGVuIGNoYW5nZXMgYXJlIG1hZGUsIGJ1dCB0aGV5IGFyZSB1cHdhcmQgY29tcGF0aWJsZQorIyB0byBwcmV2aW91cyB2ZXJzaW9ucworTElCX01JTk9SX1ZFUlNJT049MAorCitpZiB0ZXN0ICIke2FjX2N2X2N5Z3dpbn0iID0gInllcyI7IHRoZW4KKwlpZiB0ZXN0ICIke0NDfSIgIT0gImdjYyI7IHRoZW4KKwkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogUGxlYXNlIHVzZQorCQkJICAgQ0M9Z2NjIC4vY29uZmlndXJlCisJCQlBYm9ydCB0aGlzIGNvbmZpZ3VyZSBydW4gYW5kIGFkZCBcIkNDPWdjY1wiIG9yIHlvdSB3aWxsCisJCQlzZWUgZXJyb3JzIGFuZCBubyBsYW1lLmV4ZSB3aWxsIGJlIGJ1aWxkLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBQbGVhc2UgdXNlCisJCQkgICBDQz1nY2MgLi9jb25maWd1cmUKKwkJCUFib3J0IHRoaXMgY29uZmlndXJlIHJ1biBhbmQgYWRkIFwiQ0M9Z2NjXCIgb3IgeW91IHdpbGwKKwkJCXNlZSBlcnJvcnMgYW5kIG5vIGxhbWUuZXhlIHdpbGwgYmUgYnVpbGQuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJZmkKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyAgZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC1WID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAtViA+JjUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2NvbXBpbGVyX2dudT1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQorR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZworICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY2NfZz1ubworICAgQ0ZMQUdTPSItZyIKKyAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCUNGTEFHUz0iIgorICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCisJIENGTEFHUz0iLWciCisJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfZyIgPiY2OyB9CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCisvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZpbmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisJLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCitkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfXVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKKyAgKikKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OworZXNhYworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCisgIGZpCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQorQ0NERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCisKKyBpZgorICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgorICBhbV9fZmFzdGRlcENDX1RSVUU9CisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9JyMnCitlbHNlCisgIGFtX19mYXN0ZGVwQ0NfVFJVRT0nIycKKyAgYW1fX2Zhc3RkZXBDQ19GQUxTRT0KK2ZpCisKKworCitpZiB0ZXN0ICIke0dDQ30iID0gInllcyI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB2ZXJzaW9uIG9mIEdDQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHZlcnNpb24gb2YgR0NDLi4uICRFQ0hPX0MiID4mNjsgfQorCUdDQ192ZXJzaW9uPWAke0NDfSAtLXZlcnNpb24gfCBzZWQgLW4gJzFzL15bXiBdKiAoLiopIC8vO3MvIC4qJC8vOzFwJ2AKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR7R0NDX3ZlcnNpb259IiA+JjUKK2VjaG8gIiR7RUNIT19UfSR7R0NDX3ZlcnNpb259IiA+JjY7IH0KK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19jY19jODkiICE9IG5vOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFBST1RPVFlQRVMgMQorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgX19QUk9UT1RZUEVTIDEKK19BQ0VPRgorCitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19jY19zdGRjIiAhPSBubzsgdGhlbgorICBVPSBBTlNJMktOUj0KK2Vsc2UKKyAgVT1fIEFOU0kyS05SPS4vYW5zaTJrbnIKK2ZpCisjIEVuc3VyZSBzb21lIGNoZWNrcyBuZWVkZWQgYnkgYW5zaTJrbnIgaXRzZWxmLgorCisKK2ZvciBhY19oZWFkZXIgaW4gc3RyaW5nLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCisgIHllczpubzogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorICAgICggY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBSZXBvcnQgdGhpcyB0byBsYW1lLWRldkBsaXN0cy5zZi5uZXQgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CisKK2ZpCitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKworaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfZG1hbGxvY19oK3NldH0iID0gc2V0OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbWFsbG9jLmgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZG1hbGxvYy5oLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfZG1hbGxvY19oK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2RtYWxsb2NfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2RtYWxsb2NfaCIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZG1hbGxvYy5oIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGRtYWxsb2MuaCB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZG1hbGxvYy5oIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZG1hbGxvYy5oIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorX0FDRU9GCitpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogZG1hbGxvYy5oOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogZG1hbGxvYy5oOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGRtYWxsb2MuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGRtYWxsb2MuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogZG1hbGxvYy5oOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkbWFsbG9jLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBkbWFsbG9jLmg6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkbWFsbG9jLmg6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogZG1hbGxvYy5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkbWFsbG9jLmg6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBkbWFsbG9jLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkbWFsbG9jLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogZG1hbGxvYy5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGRtYWxsb2MuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogZG1hbGxvYy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkbWFsbG9jLmg6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gbGFtZS1kZXZAbGlzdHMuc2YubmV0ICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbWFsbG9jLmgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZG1hbGxvYy5oLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfZG1hbGxvY19oK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2hlYWRlcl9kbWFsbG9jX2g9JGFjX2hlYWRlcl9wcmVwcm9jCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2RtYWxsb2NfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2RtYWxsb2NfaCIgPiY2OyB9CisKK2ZpCisKKworaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfZG1hbGxvY19ofSIgPSAieWVzIjsgdGhlbgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIG1hbGxvYyBkZWJ1Z2dpbmcgaXMgd2FudGVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgbWFsbG9jIGRlYnVnZ2luZyBpcyB3YW50ZWQuLi4gJEVDSE9fQyIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZG1hbGxvYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZG1hbGxvYytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSR3aXRoX2RtYWxsb2M7IGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBXSVRIX0RNQUxMT0MgMQorX0FDRU9GCisKKyAgTElCUz0iJExJQlMgLWxkbWFsbG9jIgorICBMREZMQUdTPSIkTERGTEFHUyAtZyIKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitfQUNFT0YKKworZmkKKworCisKKworCisKKworCisKKworCitmb3IgYWNfaGVhZGVyIGluIFwKKwkJIGVycm5vLmggXAorCQkgZmNudGwuaCBcCisJCSBsaW1pdHMuaCBcCisJCSBzdGRpbnQuaCBcCisJCSBzdHJpbmcuaCBcCisJCSBzeXMvc291bmRjYXJkLmggXAorCQkgc3lzL3RpbWUuaCBcCisJCSB1bmlzdGQuaCBcCisJCSB4bW1pbnRyaW4uaCBcCisJCSBsaW51eC9zb3VuZGNhcmQuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisgICAgKCBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIGxhbWUtZGV2QGxpc3RzLnNmLm5ldCAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9jX2NvbnN0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKy8qIEZJWE1FOiBJbmNsdWRlIHRoZSBjb21tZW50cyBzdWdnZXN0ZWQgYnkgUGF1bC4gKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsKKyAgY29uc3QgY2hhcnNldCBjczsKKyAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOworICBjaGFyICoqcHBjOworICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CisgIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCisgICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKKyAgICAgZXhwcmVzc2lvbiAqLworICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7CisgIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOworICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworICArK3BjcGNjOworICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKKyAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOworICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICAgIGNoYXIgKnQ7CisgICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAgICp0KysgPSAwOworICAgIGlmIChzKSByZXR1cm4gMDsKKyAgfQorICB7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICAgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICAgICsrZm9vOworICB9CisgIHsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICAgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICAgIGlwdHIgcCA9IDA7CisgICAgKytwOworICB9CisgIHsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICAgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKKyAgfQorICB7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICAgIGNvbnN0IGludCBmb28gPSAxMDsKKyAgICBpZiAoIWZvbykgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICFjc1swXSAmJiAhemVyby54OworI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfY19jb25zdD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb25zdCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgY29uc3QKK19BQ0VPRgorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGlubGluZS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfY19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGludCBmb29fdDsKK3N0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KKyRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9CisjZW5kaWYKKworX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICB0ZXN0ICIkYWNfY3ZfY19pbmxpbmUiICE9IG5vICYmIGJyZWFrCitkb25lCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19pbmxpbmUiID4mNjsgfQorCisKK2Nhc2UgJGFjX2N2X2NfaW5saW5lIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgKikKKyAgICBjYXNlICRhY19jdl9jX2lubGluZSBpbgorICAgICAgbm8pIGFjX3ZhbD07OworICAgICAgKikgYWNfdmFsPSRhY19jdl9jX2lubGluZTs7CisgICAgZXNhYworICAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgaW5saW5lICRhY192YWwKKyNlbmRpZgorX0FDRU9GCisgICAgOzsKK2VzYWMKKworaWYgdGVzdCAke2Nyb3NzX2NvbXBpbGluZ30gPSAibm8iOyB0aGVuCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2NfYmlnZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworaW50CittYWluICgpCit7CisjaWYgICEgKGRlZmluZWQgQllURV9PUkRFUiAmJiBkZWZpbmVkIEJJR19FTkRJQU4gJiYgZGVmaW5lZCBMSVRUTEVfRU5ESUFOIFwKKwkmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gJiYgTElUVExFX0VORElBTikKKyBib2d1cyBlbmRpYW4gbWFjcm9zCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworaW50CittYWluICgpCit7CisjaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCisgbm90IGJpZyBlbmRpYW4KKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwkjIEl0IGRvZXMgbm90OyBjb21waWxlIGEgdGVzdCBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyB0cnkgdG8gZ3Vlc3MgdGhlIGVuZGlhbm5lc3MgYnkgZ3JlcHBpbmcgdmFsdWVzIGludG8gYW4gb2JqZWN0IGZpbGUKKyAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK3Nob3J0IGludCBhc2NpaV9tbVtdID0geyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CitzaG9ydCBpbnQgYXNjaWlfaWlbXSA9IHsgMHg2OTRDLCAweDU0NTQsIDB4NjU2QywgMHg2RTQ1LCAweDY5NDQsIDB4NkU2MSwgMCB9Owordm9pZCBfYXNjaWkgKCkgeyBjaGFyICpzID0gKGNoYXIgKikgYXNjaWlfbW07IHMgPSAoY2hhciAqKSBhc2NpaV9paTsgfQorc2hvcnQgaW50IGViY2RpY19paVtdID0geyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07CitzaG9ydCBpbnQgZWJjZGljX21tW10gPSB7IDB4QzJDOSwgMHhDNzg1LCAweDk1QzQsIDB4ODk4MSwgMHg5NUUyLCAweEE4RTIsIDAgfTsKK3ZvaWQgX2ViY2RpYyAoKSB7IGNoYXIgKnMgPSAoY2hhciAqKSBlYmNkaWNfbW07IHMgPSAoY2hhciAqKSBlYmNkaWNfaWk7IH0KK2ludAorbWFpbiAoKQoreworIF9hc2NpaSAoKTsgX2ViY2RpYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGwgOyB0aGVuCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZmkKK2lmIGdyZXAgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbCA7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX2N2X2NfYmlnZW5kaWFuIiA9IHVua25vd247IHRoZW4KKyAgICBhY19jdl9jX2JpZ2VuZGlhbj1ubworICBlbHNlCisgICAgIyBmaW5kaW5nIGJvdGggc3RyaW5ncyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCB3aG8ga25vd3M/CisgICAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorICBmaQorZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CisKKyAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworICB1bmlvbgorICB7CisgICAgbG9uZyBpbnQgbDsKKyAgICBjaGFyIGNbc2l6ZW9mIChsb25nIGludCldOworICB9IHU7CisgIHUubCA9IDE7CisgIHJldHVybiB1LmNbc2l6ZW9mIChsb25nIGludCkgLSAxXSA9PSAxOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCithY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19iaWdlbmRpYW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluCisgIHllcykKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKK19BQ0VPRgorIDs7CisgIG5vKQorICAgICA7OworICAqKQorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVua25vd24gZW5kaWFubmVzcworcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogdW5rbm93biBlbmRpYW5uZXNzCitwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworZXNhYworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGFyZ2VmaWxlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xhcmdlZmlsZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9sYXJnZWZpbGU7CitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX2xhcmdlZmlsZSIgIT0gbm87IHRoZW4KKworICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3BlY2lhbCBDIGNvbXBpbGVyIG9wdGlvbnMgbmVlZGVkIGZvciBsYXJnZSBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzcGVjaWFsIEMgY29tcGlsZXIgb3B0aW9ucyBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zeXNfbGFyZ2VmaWxlX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X3N5c19sYXJnZWZpbGVfQ0M9bm8KKyAgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICAgYWNfc2F2ZV9DQz0kQ0MKKyAgICAgICB3aGlsZSA6OyBkbworCSAjIElSSVggNi4yIGFuZCBsYXRlciBkbyBub3Qgc3VwcG9ydCBsYXJnZSBmaWxlcyBieSBkZWZhdWx0LAorCSAjIHNvIHVzZSB0aGUgQyBjb21waWxlcidzIC1uMzIgb3B0aW9uIGlmIHRoYXQgaGVscHMuCisJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgorICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKKyAgICBzaW5jZSBzb21lIEMrKyBjb21waWxlcnMgbWFzcXVlcmFkaW5nIGFzIEMgY29tcGlsZXJzCisgICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCisgIGludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQorCQkgICAgICAgJiYgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpCisJCSAgICAgID8gMSA6IC0xXTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKKwkgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgQ0M9IiRDQyAtbjMyIgorCSBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3N5c19sYXJnZWZpbGVfQ0M9JyAtbjMyJzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisJIGJyZWFrCisgICAgICAgZG9uZQorICAgICAgIENDPSRhY19zYXZlX0NDCisgICAgICAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQyIgPiY2OyB9CisgIGlmIHRlc3QgIiRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDIiAhPSBubzsgdGhlbgorICAgIENDPSRDQyRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDCisgIGZpCisKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF9GSUxFX09GRlNFVF9CSVRTIHZhbHVlIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgd2hpbGUgOjsgZG8KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cz1ubzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cz02NDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHM9dW5rbm93bgorICBicmVhaworZG9uZQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyIgPiY2OyB9CitjYXNlICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyBpbiAjKAorICBubyB8IHVua25vd24pIDs7CisgICopCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cworX0FDRU9GCis7OworZXNhYworcm0gLWYgY29uZnRlc3QqCisgIGlmIHRlc3QgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzID0gdW5rbm93bjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfTEFSR0VfRklMRVMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfTEFSR0VfRklMRVMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc3lzX2xhcmdlX2ZpbGVzK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIHdoaWxlIDo7IGRvCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgorICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKKyAgICBzaW5jZSBzb21lIEMrKyBjb21waWxlcnMgbWFzcXVlcmFkaW5nIGFzIEMgY29tcGlsZXJzCisgICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCisgIGludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQorCQkgICAgICAgJiYgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpCisJCSAgICAgID8gMSA6IC0xXTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzPW5vOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0xBUkdFX0ZJTEVTIDEKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KKyAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCisgICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycworICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQorICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKKwkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQorCQkgICAgICA/IDEgOiAtMV07CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3N5c19sYXJnZV9maWxlcz0xOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9dW5rbm93bgorICBicmVhaworZG9uZQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3N5c19sYXJnZV9maWxlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X3N5c19sYXJnZV9maWxlcyBpbiAjKAorICBubyB8IHVua25vd24pIDs7CisgICopCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIF9MQVJHRV9GSUxFUyAkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzCitfQUNFT0YKKzs7Citlc2FjCitybSAtZiBjb25mdGVzdCoKKyAgZmkKK2ZpCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNob3J0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgc2hvcnQgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfc2hvcnQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3Nob3J0PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3Nob3J0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Nob3J0IiA+JjY7IH0KKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2Zfc2hvcnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIHNob3J0IGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89IGFjX2hpPQorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgYWNfY3Zfc2l6ZW9mX3Nob3J0PSRhY19sbzs7CisnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc2hvcnQiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2hvcnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2Zfc2hvcnQ9MAorICAgZmkgOzsKK2VzYWMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOworICAgIH0KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3NpemVvZl9zaG9ydD1gY2F0IGNvbmZ0ZXN0LnZhbGAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2lmIHRlc3QgIiRhY19jdl90eXBlX3Nob3J0IiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKKyAgIGZpCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QudmFsCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfU0hPUlQgJGFjX2N2X3NpemVvZl9zaG9ydAorX0FDRU9GCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVuc2lnbmVkIHNob3J0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVuc2lnbmVkIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3Vuc2lnbmVkX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfdW5zaWduZWRfc2hvcnQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3Vuc2lnbmVkX3Nob3J0PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3Vuc2lnbmVkX3Nob3J0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Vuc2lnbmVkX3Nob3J0IiA+JjY7IH0KKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgdW5zaWduZWQgc2hvcnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIHVuc2lnbmVkIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfc2hvcnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89IGFjX2hpPQorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0PSRhY19sbzs7CisnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfdW5zaWduZWRfc2hvcnQiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodW5zaWduZWQgc2hvcnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIHNob3J0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfdW5zaWduZWRfc2hvcnQ9MAorICAgZmkgOzsKK2VzYWMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOworICAgIH0KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3NpemVvZl91bnNpZ25lZF9zaG9ydD1gY2F0IGNvbmZ0ZXN0LnZhbGAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2lmIHRlc3QgIiRhY19jdl90eXBlX3Vuc2lnbmVkX3Nob3J0IiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIHNob3J0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0PTAKKyAgIGZpCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QudmFsCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfdW5zaWduZWRfc2hvcnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfU0hPUlQgJGFjX2N2X3NpemVvZl91bnNpZ25lZF9zaG9ydAorX0FDRU9GCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgaW50IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfaW50PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQiID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBpbnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGludC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2ludCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89IGFjX2hpPQorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgaW50IGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitjYXNlICRhY19sbyBpbgorPyopIGFjX2N2X3NpemVvZl9pbnQ9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnQiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9pbnQ9MAorICAgZmkgOzsKK2VzYWMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CisKKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKKyAgaWYgKCEgZikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQorICAgIHsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKKyAgICB9CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9zaXplb2ZfaW50PWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50IiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGludCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfaW50PTAKKyAgIGZpCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QudmFsCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2ludCIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKK19BQ0VPRgorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1bnNpZ25lZCBpbnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdW5zaWduZWQgaW50Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3Vuc2lnbmVkX2ludCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIHVuc2lnbmVkIGludCBhY19fdHlwZV9uZXdfOworaW50CittYWluICgpCit7CitpZiAoKGFjX190eXBlX25ld18gKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfdHlwZV91bnNpZ25lZF9pbnQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3Vuc2lnbmVkX2ludD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91bnNpZ25lZF9pbnQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdW5zaWduZWRfaW50IiA+JjY7IH0KKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgdW5zaWduZWQgaW50IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiB1bnNpZ25lZCBpbnQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl91bnNpZ25lZF9pbnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPSBhY19oaT0KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgord2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbworICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorY2FzZSAkYWNfbG8gaW4KKz8qKSBhY19jdl9zaXplb2ZfdW5zaWduZWRfaW50PSRhY19sbzs7CisnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfdW5zaWduZWRfaW50IiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIGludCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodW5zaWduZWQgaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfdW5zaWduZWRfaW50PTAKKyAgIGZpIDs7Citlc2FjCitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50IGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworCisgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CisgIGlmICghIGYpCisgICAgcmV0dXJuIDE7CisgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKKyAgICB7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CisgICAgfQorICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludD1gY2F0IGNvbmZ0ZXN0LnZhbGAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2lmIHRlc3QgIiRhY19jdl90eXBlX3Vuc2lnbmVkX2ludCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1bnNpZ25lZCBpbnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIGludCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludD0wCisgICBmaQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LnZhbAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl91bnNpZ25lZF9pbnQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl91bnNpZ25lZF9pbnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfSU5UICRhY19jdl9zaXplb2ZfdW5zaWduZWRfaW50CitfQUNFT0YKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbG9uZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBsb25nIGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2xvbmc9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2xvbmc9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfbG9uZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nIiA+JjY7IH0KKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgbG9uZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89MCBhY19taWQ9MAorICB3aGlsZSA6OyBkbworICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz0gYWNfaGk9CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitjYXNlICRhY19sbyBpbgorPyopIGFjX2N2X3NpemVvZl9sb25nPSRhY19sbzs7CisnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZz0wCisgICBmaSA7OworZXNhYworZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CisKKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKKyAgaWYgKCEgZikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQorICAgIHsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKKyAgICB9CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9zaXplb2ZfbG9uZz1gY2F0IGNvbmZ0ZXN0LnZhbGAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2lmIHRlc3QgIiRhY19jdl90eXBlX2xvbmciID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZykKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZykKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmc9MAorICAgZmkKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb25mdGVzdC52YWwKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2xvbmciID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfTE9ORyAkYWNfY3Zfc2l6ZW9mX2xvbmcKK19BQ0VPRgorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1bnNpZ25lZCBsb25nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVuc2lnbmVkIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfdW5zaWduZWRfbG9uZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZz1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmciID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiB1bnNpZ25lZCBsb25nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiB1bnNpZ25lZCBsb25nLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPSBhY19oaT0KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgord2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbworICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmc9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nPTAKKyAgIGZpIDs7Citlc2FjCitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOworICAgIH0KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nPWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1bnNpZ25lZCBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1bnNpZ25lZCBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZz0wCisgICBmaQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LnZhbAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZyIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HICRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZworX0FDRU9GCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2xvbmdfbG9uZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfbG9uZ19sb25nPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmdfbG9uZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89IGFjX2hpPQorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitjYXNlICRhY19sbyBpbgorPyopIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nX2xvbmciID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAorICAgZmkgOzsKK2VzYWMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CisKKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKKyAgaWYgKCEgZikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQorICAgIHsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKKyAgICB9CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKKyAgIGZpCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QudmFsCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nX2xvbmcKK19BQ0VPRgorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1bnNpZ25lZCBsb25nIGxvbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdW5zaWduZWQgbG9uZyBsb25nLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBhY19fdHlwZV9uZXdfOworaW50CittYWluICgpCit7CitpZiAoKGFjX190eXBlX25ld18gKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmc9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZz1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiA+JjY7IH0KKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgdW5zaWduZWQgbG9uZyBsb25nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiB1bnNpZ25lZCBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPSBhY19oaT0KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgord2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbworICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorY2FzZSAkYWNfbG8gaW4KKz8qKSBhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nPSRhY19sbzs7CisnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nPTAKKyAgIGZpIDs7Citlc2FjCitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworCisgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CisgIGlmICghIGYpCisgICAgcmV0dXJuIDE7CisgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKKyAgICB7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CisgICAgfQorICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmdfbG9uZz1gY2F0IGNvbmZ0ZXN0LnZhbGAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2lmIHRlc3QgIiRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmdfbG9uZz0wCisgICBmaQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LnZhbAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nX2xvbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nX2xvbmciID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfTE9OR19MT05HICRhY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nCitfQUNFT0YKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvYXQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmxvYXQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfZmxvYXQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBmbG9hdCBhY19fdHlwZV9uZXdfOworaW50CittYWluICgpCit7CitpZiAoKGFjX190eXBlX25ld18gKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfdHlwZV9mbG9hdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfZmxvYXQ9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfZmxvYXQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfZmxvYXQiID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBmbG9hdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgZmxvYXQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9mbG9hdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBmbG9hdCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89MCBhY19taWQ9MAorICB3aGlsZSA6OyBkbworICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgZmxvYXQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBmbG9hdCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGZsb2F0IGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz0gYWNfaGk9CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBmbG9hdCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorY2FzZSAkYWNfbG8gaW4KKz8qKSBhY19jdl9zaXplb2ZfZmxvYXQ9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9mbG9hdCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChmbG9hdCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoZmxvYXQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9mbG9hdD0wCisgICBmaSA7OworZXNhYworZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGZsb2F0IGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworCisgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CisgIGlmICghIGYpCisgICAgcmV0dXJuIDE7CisgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKKyAgICB7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CisgICAgfQorICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3Zfc2l6ZW9mX2Zsb2F0PWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfZmxvYXQiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoZmxvYXQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZsb2F0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfZmxvYXQ9MAorICAgZmkKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb25mdGVzdC52YWwKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfZmxvYXQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9mbG9hdCIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9GTE9BVCAkYWNfY3Zfc2l6ZW9mX2Zsb2F0CitfQUNFT0YKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZG91YmxlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRvdWJsZS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBkb3VibGUgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfZG91YmxlPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfdHlwZV9kb3VibGU9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfZG91YmxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2RvdWJsZSIgPiY2OyB9CisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGRvdWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgZG91YmxlLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2ZfZG91YmxlK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89MCBhY19taWQ9MAorICB3aGlsZSA6OyBkbworICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPS0xIGFjX21pZD0tMQorICB3aGlsZSA6OyBkbworICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz0gYWNfaGk9CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBkb3VibGUgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgYWNfY3Zfc2l6ZW9mX2RvdWJsZT0kYWNfbG87OworJycpIGlmIHRlc3QgIiRhY19jdl90eXBlX2RvdWJsZSIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2RvdWJsZT0wCisgICBmaSA7OworZXNhYworZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOworICAgIH0KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3NpemVvZl9kb3VibGU9YGNhdCBjb25mdGVzdC52YWxgCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCitpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9kb3VibGUiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoZG91YmxlKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9kb3VibGU9MAorICAgZmkKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb25mdGVzdC52YWwKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfZG91YmxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfZG91YmxlIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX0RPVUJMRSAkYWNfY3Zfc2l6ZW9mX2RvdWJsZQorX0FDRU9GCisKKworCitpZiB0ZXN0ICRhY19jdl9zaXplb2Zfc2hvcnQgLWVxIDAgXAorICAgIC1vICRhY19jdl9zaXplb2ZfdW5zaWduZWRfc2hvcnQgLWVxIDAgXAorICAgIC1vICRhY19jdl9zaXplb2ZfaW50IC1lcSAwIFwKKyAgICAtbyAkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2ludCAtZXEgMCBcCisgICAgLW8gJGFjX2N2X3NpemVvZl9sb25nIC1lcSAwIFwKKyAgICAtbyAkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmcgLWVxIDAgXAorICAgIC1vICRhY19jdl9zaXplb2ZfbG9uZ19sb25nIC1lcSAwIFwKKyAgICAtbyAkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmdfbG9uZyAtZXEgMCBcCisgICAgLW8gJGFjX2N2X3NpemVvZl9mbG9hdCAtZXEgMCBcCisgICAgLW8gJGFjX2N2X3NpemVvZl9kb3VibGUgLWVxIDA7IHRoZW4KKwllY2hvICcqKiogSSBoYXZlIGEgcHJvYmxlbSBkZXRlcm1pbmluZyB0aGUgc2l6ZSBvZiBzb21lIHZhcmlhYmxlIHR5cGVzLiBFaXRoZXInCisJZWNobyAnKioqIHlvdSBjb21waWxlciBpcyBicm9rZW4sIG9yIHlvdXIgc3lzdGVtK2NvbXBpbGVyIGNvbWJpbmF0aW9uIGlzIG5vdCcKKwllY2hvICcqKiogc3VwcG9ydGV0IGJ5IHRoZSAiYXV0b2NvbmYiIGZyYW1ld29yayB3ZSB1c2UgdG8gZ2VuZXJhdGUgdGhpcycKKwllY2hvICcqKiogY29uZmlndXJlIHNjcmlwdC4nCisJZXhpdCAxCitmaQorCisKKworICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgd2l0aCBtb3JlIHJhbmdlIG9yIHByZWNpc2lvbiB0aGFuIGRvdWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGRvdWJsZSB3aXRoIG1vcmUgcmFuZ2Ugb3IgcHJlY2lzaW9uIHRoYW4gZG91YmxlLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2xvbmdfZG91YmxlX3dpZGVyK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGZsb2F0Lmg+CisJICAgIGxvbmcgZG91YmxlIGNvbnN0IGFbXSA9CisJICAgICAgeworCQkgMC4wTCwgREJMX01JTiwgREJMX01BWCwgREJMX0VQU0lMT04sCisJCSBMREJMX01JTiwgTERCTF9NQVgsIExEQkxfRVBTSUxPTgorCSAgICAgIH07CisJICAgIGxvbmcgZG91YmxlCisJICAgIGYgKGxvbmcgZG91YmxlIHgpCisJICAgIHsKKwkgICAgICAgcmV0dXJuICgoeCArICh1bnNpZ25lZCBsb25nIGludCkgMTApICogKC0xIC8geCkgKyBhWzBdCisJCQkrICh4ID8gZiAoeCkgOiAnYycpKTsKKwkgICAgfQorCitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgwIDwgKChEQkxfTUFYX0VYUCA8IExEQkxfTUFYX0VYUCkKKwkJICAgKyAoREJMX01BTlRfRElHIDwgTERCTF9NQU5UX0RJRykKKwkJICAgLSAoTERCTF9NQVhfRVhQIDwgREJMX01BWF9FWFApCisJCSAgIC0gKExEQkxfTUFOVF9ESUcgPCBEQkxfTUFOVF9ESUcpKSkKKwkgICAgJiYgKGludCkgTERCTF9FUFNJTE9OID09IDAKKwkgICldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2xvbmdfZG91YmxlX3dpZGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfdHlwZV9sb25nX2RvdWJsZV93aWRlcj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9sb25nX2RvdWJsZV93aWRlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2RvdWJsZV93aWRlciIgPiY2OyB9CisgIGlmIHRlc3QgJGFjX2N2X3R5cGVfbG9uZ19kb3VibGVfd2lkZXIgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MT05HX0RPVUJMRV9XSURFUiAxCitfQUNFT0YKKworICBmaQorCisgICAgYWNfY3ZfY19sb25nX2RvdWJsZT0kYWNfY3ZfdHlwZV9sb25nX2RvdWJsZV93aWRlcgorICAgIGlmIHRlc3QgJGFjX2N2X2NfbG9uZ19kb3VibGUgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MT05HX0RPVUJMRSAxCitfQUNFT0YKKworICAgIGZpCisKK2lmIHRlc3QgIiR7YWNfY3ZfY19oYXZlX2xvbmdfZG91YmxlfSIgPSAieWVzIiA7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZ19kb3VibGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBsb25nIGRvdWJsZSBhY19fdHlwZV9uZXdfOworaW50CittYWluICgpCit7CitpZiAoKGFjX190eXBlX25ld18gKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfdHlwZV9sb25nX2RvdWJsZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfbG9uZ19kb3VibGU9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfbG9uZ19kb3VibGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbG9uZ19kb3VibGUiID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGRvdWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgbG9uZyBkb3VibGUuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9sb25nX2RvdWJsZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89MCBhY19taWQ9MAorICB3aGlsZSA6OyBkbworICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgZG91YmxlIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz0gYWNfaGk9CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorY2FzZSAkYWNfbG8gaW4KKz8qKSBhY19jdl9zaXplb2ZfbG9uZ19kb3VibGU9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nX2RvdWJsZSIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGRvdWJsZSkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBkb3VibGUpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZT0wCisgICBmaSA7OworZXNhYworZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgZG91YmxlIGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworCisgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CisgIGlmICghIGYpCisgICAgcmV0dXJuIDE7CisgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKKyAgICB7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CisgICAgfQorICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlPWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19kb3VibGUiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBkb3VibGUpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgZG91YmxlKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZ19kb3VibGU9MAorICAgZmkKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb25mdGVzdC52YWwKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19kb3VibGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZSIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9MT05HX0RPVUJMRSAkYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlCitfQUNFT0YKKworCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdWludDhfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1aW50OF90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiB1aW50OF90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX3VpbnQ4X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3VpbnQ4X3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdWludDhfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV91aW50OF90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfdWludDhfdCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVUlOVDhfVCAxCitfQUNFT0YKKworCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDhfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQ4X3QuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50OF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgaW50OF90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludDhfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfaW50OF90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDhfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQ4X3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQ4X3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0lOVDhfVCAxCitfQUNFT0YKKworCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQxNl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVpbnQxNl90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQxNl90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgdWludDE2X3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfdWludDE2X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3VpbnQxNl90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQxNl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VpbnQxNl90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfdWludDE2X3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1VJTlQxNl9UIDEKK19BQ0VPRgorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50MTZfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQxNl90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDE2X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBpbnQxNl90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludDE2X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2ludDE2X3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MTZfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQxNl90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfaW50MTZfdCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfSU5UMTZfVCAxCitfQUNFT0YKKworCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQzMl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVpbnQzMl90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQzMl90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgdWludDMyX3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfdWludDMyX3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3VpbnQzMl90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQzMl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VpbnQzMl90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfdWludDMyX3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1VJTlQzMl9UIDEKK19BQ0VPRgorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50MzJfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQzMl90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBpbnQzMl90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludDMyX3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2ludDMyX3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MzJfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQzMl90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfaW50MzJfdCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfSU5UMzJfVCAxCitfQUNFT0YKKworCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQ2NF90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVpbnQ2NF90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ2NF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgdWludDY0X3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfdWludDY0X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3VpbnQ2NF90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfdWludDY0X3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1VJTlQ2NF9UIDEKK19BQ0VPRgorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50NjRfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQ2NF90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDY0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBpbnQ2NF90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludDY0X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2ludDY0X3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50NjRfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQ2NF90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfaW50NjRfdCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfSU5UNjRfVCAxCitfQUNFT0YKKworCitmaQorCisKKworCisKKworCisKKworCisKKworCisKK2lmIHRlc3QgIiR7SEFWRV9JTlQzMl9UfSIgPSB5ZXM7IHRoZW4KKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBX1VJTlQzMl9UIHVuc2lnbmVkIGludDMyX3QKK19BQ0VPRgorCitlbHNlCisJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfc2hvcnR9IiA9ICI0IjsgdGhlbgorCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBX1VJTlQzMl9UIHVuc2lnbmVkIHNob3J0CitfQUNFT0YKKworCWVsc2UKKwkJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfaW50fSIgPSAiNCI7IHRoZW4KKwkJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFfVUlOVDMyX1QgdW5zaWduZWQgaW50CitfQUNFT0YKKworCQllbHNlCisJCQlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nfSIgPSAiNCI7IHRoZW4KKwkJCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKK19BQ0VPRgorCisJCQllbHNlCisJCQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ0hFQ0tfVFlQRV91aW50MzJfdCAtIHBsZWFzZSByZXBvcnQgdG8gbGFtZS1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IENIRUNLX1RZUEVfdWludDMyX3QgLSBwbGVhc2UgcmVwb3J0IHRvIGxhbWUtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCQkJZmkKKwkJZmkKKwlmaQorZmkKKworCisKKworaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfc2hvcnR9IiA9ICI0IjsgdGhlbgorCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFfSU5UMzJfVCBzaG9ydAorX0FDRU9GCisKK2Vsc2UKKwlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9pbnR9IiA9ICI0IjsgdGhlbgorCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBX0lOVDMyX1QgaW50CitfQUNFT0YKKworCWVsc2UKKwkJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ30iID0gIjQiOyB0aGVuCisJCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBX0lOVDMyX1QgbG9uZworX0FDRU9GCisKKwkJZWxzZQorCQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ0hFQ0tfVFlQRV9pbnQzMl90IC0gcGxlYXNlIHJlcG9ydCB0byBsYW1lLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQ0hFQ0tfVFlQRV9pbnQzMl90IC0gcGxlYXNlIHJlcG9ydCB0byBsYW1lLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkJZmkKKwlmaQorZmkKKworCisKKworaWYgdGVzdCAiJHtIQVZFX0lOVDY0X1R9IiA9IHllczsgdGhlbgorICAgICAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBX1VJTlQ2NF9UIHVuc2lnbmVkIGludDY0X3QKK19BQ0VPRgorCitlbHNlCisJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfaW50fSIgPSAiOCI7IHRoZW4KKwkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgQV9VSU5UNjRfVCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCisJZWxzZQorCQlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nfSIgPSAiOCI7IHRoZW4KKwkJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFfVUlOVDY0X1QgdW5zaWduZWQgbG9uZworX0FDRU9GCisKKwkJZWxzZQorCQkJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ19sb25nfSIgPSAiOCI7IHRoZW4KKwkJCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBX1VJTlQ2NF9UIHVuc2lnbmVkIGxvbmcgbG9uZworX0FDRU9GCisKKwkJCWVsc2UKKwkJCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDSEVDS19UWVBFX3VpbnQ2NF90IC0gcGxlYXNlIHJlcG9ydCB0byBsYW1lLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQ0hFQ0tfVFlQRV91aW50NjRfdCAtIHBsZWFzZSByZXBvcnQgdG8gbGFtZS1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJCQlmaQorCQlmaQorCWZpCitmaQorCisKKworCitpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9pbnR9IiA9ICI4IjsgdGhlbgorCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFfSU5UNjRfVCBpbnQKK19BQ0VPRgorCitlbHNlCisJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ30iID0gIjgiOyB0aGVuCisJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFfSU5UNjRfVCBsb25nCitfQUNFT0YKKworCWVsc2UKKwkJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ19sb25nfSIgPSAiOCI7IHRoZW4KKwkJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFfSU5UNjRfVCBsb25nIGxvbmcKK19BQ0VPRgorCisJCWVsc2UKKwkJCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IENIRUNLX1RZUEVfaW50NjRfdCAtIHBsZWFzZSByZXBvcnQgdG8gbGFtZS1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IENIRUNLX1RZUEVfaW50NjRfdCAtIHBsZWFzZSByZXBvcnQgdG8gbGFtZS1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJCWZpCisJZmkKK2ZpCisKKworCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBJRUVFODU0IGNvbXBsaWFudCA4MCBiaXQgZmxvYXRzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIElFRUU4NTQgY29tcGxpYW50IDgwIGJpdCBmbG9hdHMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FsZXhfY3ZfaWVlZTg1NF9mbG9hdDgwK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhbid0IGNoZWNrIGZvciBJRUVFODU0IGNvbXBsaWFudCA4MCBiaXQgZmxvYXRzIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogY2FuJ3QgY2hlY2sgZm9yIElFRUU4NTQgY29tcGxpYW50IDgwIGJpdCBmbG9hdHMiID4mMjt9CisKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludCAgIGZsb2F0MmxvbmdfSUVFRV9jb21wbGlhbmNlICggdm9pZCApCit7CisgICAgc3RydWN0IHsKKyAgICAgICAgbG9uZyBwYWRkaW5nOyAvKiB0byBwcmV2ZW50IHVuYWxpZ25lZCBhY2Nlc3MgKi8KKyAgICAgICAgZmxvYXQgIGY7CisgICAgfSBzOworICAgIHMuZiA9IDEyNTgyOTEyLjsgaWYgKCAqKGxvbmcqKSgmcy5mKSAhPSAxMjYyNDg1NTA0bCApIHJldHVybiAwOworICAgIHMuZiA9IDEyNjE1Njc5LjsgaWYgKCAqKGxvbmcqKSgmcy5mKSAhPSAxMjYyNTE4MjcxbCApIHJldHVybiAwOworICAgIHMuZiA9IDEzNTgyOTEyLjsgaWYgKCAqKGxvbmcqKSgmcy5mKSAhPSAxMjYzNDg1NTA0bCApIHJldHVybiAwOworICAgIHMuZiA9IDEyNTUwMTQ1LjsgaWYgKCAqKGxvbmcqKSgmcy5mKSAhPSAxMjYyNDUyNzM3bCApIHJldHVybiAwOworICAgIHMuZiA9IDExNTgyOTEyLjsgaWYgKCAqKGxvbmcqKSgmcy5mKSAhPSAxMjYxNDg1NTA0bCApIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCByZXR2YWw7CisKKyAgICByZXR2YWwgPSBmbG9hdDJsb25nX0lFRUVfY29tcGxpYW5jZSgpOworCisgICAgLyogbm8gZXJyb3IgcmV0dXJuIC0+IHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gIXJldHZhbDsKK30KKworX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhbGV4X2N2X2llZWU4NTRfZmxvYXQ4MD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FsZXhfY3ZfaWVlZTg1NF9mbG9hdDgwPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhbGV4X2N2X2llZWU4NTRfZmxvYXQ4MCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWxleF9jdl9pZWVlODU0X2Zsb2F0ODAiID4mNjsgfQoraWYgdGVzdCAiJHthbGV4X2N2X2llZWU4NTRfZmxvYXQ4MH0iID0gInllcyIgOyB0aGVuCisJaWYgdGVzdCAiJHthY19jdl9jX2xvbmdfZG91YmxlfSIgPSAieWVzIiA7IHRoZW4KKwkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGllZWU4NTRfZmxvYXQ4MF90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGllZWU4NTRfZmxvYXQ4MF90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2llZWU4NTRfZmxvYXQ4MF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgaWVlZTg1NF9mbG9hdDgwX3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfaWVlZTg1NF9mbG9hdDgwX3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2llZWU4NTRfZmxvYXQ4MF90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2llZWU4NTRfZmxvYXQ4MF90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2llZWU4NTRfZmxvYXQ4MF90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfaWVlZTg1NF9mbG9hdDgwX3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0lFRUU4NTRfRkxPQVQ4MF9UIDEKK19BQ0VPRgorCitsb25nIGRvdWJsZQorZmkKKworCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0lFRUU4NTRfRkxPQVQ4MCAxCitfQUNFT0YKKworCWZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGllZWU3NTRfZmxvYXQ2NF90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGllZWU3NTRfZmxvYXQ2NF90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2llZWU3NTRfZmxvYXQ2NF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgaWVlZTc1NF9mbG9hdDY0X3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfaWVlZTc1NF9mbG9hdDY0X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2llZWU3NTRfZmxvYXQ2NF90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2llZWU3NTRfZmxvYXQ2NF90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2llZWU3NTRfZmxvYXQ2NF90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfaWVlZTc1NF9mbG9hdDY0X3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0lFRUU3NTRfRkxPQVQ2NF9UIDEKK19BQ0VPRgorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaWVlZTc1NF9mbG9hdDMyX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaWVlZTc1NF9mbG9hdDMyX3QuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaWVlZTc1NF9mbG9hdDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBpZWVlNzU0X2Zsb2F0MzJfdCBhY19fdHlwZV9uZXdfOworaW50CittYWluICgpCit7CitpZiAoKGFjX190eXBlX25ld18gKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfdHlwZV9pZWVlNzU0X2Zsb2F0MzJfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfaWVlZTc1NF9mbG9hdDMyX3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaWVlZTc1NF9mbG9hdDMyX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfaWVlZTc1NF9mbG9hdDMyX3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV9pZWVlNzU0X2Zsb2F0MzJfdCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfSUVFRTc1NF9GTE9BVDMyX1QgMQorX0FDRU9GCisKKworZmkKKworCisKKworCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIExBTUVfTElCUkFSWV9CVUlMRCAxCitfQUNFT0YKKworCisKK2lmIHRlc3QgJHtjcm9zc19jb21waWxpbmd9ID0gInllcyI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqIFlvdSBhcmUgY3Jvc3MgY29tcGlsaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgLSBJIGRpZCBub3QgaGF2ZSBhIGNoYW5nZSB0byBkZXRlcm1pbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICArIHRoZSBzaXplIG9mOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICAgIC0gbG9uZyBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgICArIHRoZSBlbmRpYW5lc3Mgb2YgdGhlIHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqICAgLSBZb3UgaGF2ZSB0byBwcm92aWRlIGFwcHJvcHJpYXRlIGRlZmluZXMgZm9yIHRoZW0gaW4gY29uZmlnLmgsIGUuZy4gKgorICAqICAgICArIGRlZmluZSBTSVpFT0ZfU0hPUlQgdG8gMiBpZiB0aGUgc2l6ZSBvZiBhIHNob3J0IGlzIDIgICAgICAgICAgICAgKgorICAqICAgICArIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gaWYgeW91ciBzeXN0ZW0gaXMgYSBiaWcgZW5kaWFuIHN5c3RlbSAgICAgKgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6CisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogWW91IGFyZSBjcm9zcyBjb21waWxpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAtIEkgZGlkIG5vdCBoYXZlIGEgY2hhbmdlIHRvIGRldGVybWluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICsgdGhlIHNpemUgb2Y6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICAgLSBsb25nIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAgICsgdGhlIGVuZGlhbmVzcyBvZiB0aGUgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICogICAtIFlvdSBoYXZlIHRvIHByb3ZpZGUgYXBwcm9wcmlhdGUgZGVmaW5lcyBmb3IgdGhlbSBpbiBjb25maWcuaCwgZS5nLiAqCisgICogICAgICsgZGVmaW5lIFNJWkVPRl9TSE9SVCB0byAyIGlmIHRoZSBzaXplIG9mIGEgc2hvcnQgaXMgMiAgICAgICAgICAgICAqCisgICogICAgICsgZGVmaW5lIFdPUkRTX0JJR0VORElBTiBpZiB5b3VyIHN5c3RlbSBpcyBhIGJpZyBlbmRpYW4gc3lzdGVtICAgICAqCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA+JjI7fQorZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaXplX3QuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfc2l6ZV90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgc2l6ZV90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpemVfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaXplX3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfdGltZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluICgpCit7CitpZiAoKHN0cnVjdCB0bSAqKSAwKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9oZWFkZXJfdGltZT1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl90aW1lIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCitfQUNFT0YKKworZmkKKworCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3dvcmtpbmdfYWxsb2NhX2grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQKK21haW4gKCkKK3sKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EgKDIgKiBzaXplb2YgKGludCkpOworCQkJICBpZiAocCkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl93b3JraW5nX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3Zfd29ya2luZ19hbGxvY2FfaD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfd29ya2luZ19hbGxvY2FfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfd29ya2luZ19hbGxvY2FfaCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl93b3JraW5nX2FsbG9jYV9oID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorX0FDRU9GCisKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYWxsb2NhLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9mdW5jX2FsbG9jYV93b3JrcytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZmRlZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSAoMSk7CisJCQkJICAgIGlmIChwKSByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgPiY2OyB9CisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK19BQ0VPRgorCitlbHNlCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisKK0FMTE9DQT1cJHtMSUJPQkpESVJ9YWxsb2NhLiRhY19vYmpleHQKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorX0FDRU9GCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9vc19jcmF5K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmIGRlZmluZWQgQ1JBWSAmJiAhIGRlZmluZWQgQ1JBWTIKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29zX2NyYXkiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29zX2NyYXkiID4mNjsgfQoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorICBmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgICAgYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJGFjX2Z1bmMgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWV2YWwgIiRhc19hY192YXI9bm8iCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitfQUNFT0YKKworICAgIGJyZWFrCitmaQorCisgIGRvbmUKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9jX3N0YWNrX2RpcmVjdGlvbitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorCitpbnQKK21haW4gKCkKK3sKKyAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpIDwgMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorX0FDRU9GCisKKworZmkKKworCisKK2ZvciBhY19mdW5jIGluIGdldHRpbWVvZmRheSBzdHJ0b2wKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYworY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkYWNfZnVuYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworaWYgdGVzdCAiWCR7YWNfY3ZfZnVuY19zdHJ0b2x9IiAhPSAiWHllcyI7IHRoZW4KKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBmdW5jdGlvbiBzdHJ0b2wgaXMgbWFuZGF0b3J5IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGZ1bmN0aW9uIHN0cnRvbCBpcyBtYW5kYXRvcnkiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK1NPQ0tFVEZVTkNUSU9OPXVua25vd24KKworZm9yIGFjX2Z1bmMgaW4gc29ja2V0CitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJGFjX2Z1bmMgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWV2YWwgIiRhc19hY192YXI9bm8iCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX3NvY2tldCA9IG5vOyB0aGVuCisJIyBtYXliZSBpdCBpcyBpbiBsaWJzb2NrZXQKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3NvY2tldF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc29ja2V0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc29ja2V0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0ID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfU09DS0VUIDEKK19BQ0VPRgorCisJTElCUz0iJExJQlMgLWxzb2NrZXQiCitmaQorCisJaWYgdGVzdCAiWCR7YWNfY3ZfbGliX3NvY2tldF9zb2NrZXR9IiAhPSAiWHllcyI7IHRoZW4KKwkJU09DS0VURlVOQ1RJT049Tk8KKwllbHNlCisJCWNhc2UgJHtob3N0X29zfSBpbgorCQkqc29sYXJpcyopCisJCQlMSUJTPSIkTElCUyAtbG5zbCIKKwkJCTs7CisJCWVzYWMKKwlmaQorZmkKKworQ0ZMQUdTPSR7Q0ZMQUdTfQorQ09ORklHX0RFRlM9JHtDT05GSUdfREVGU30KK05BU009CitJTkNMVURFUz0iLUlcJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JXCQoc3JjZGlyKSIKK0ZST05URU5EX0xERkxBR1M9CitGUk9OVEVORF9DRkxBR1M9CitMSUJfU09VUkNFUz0KK01BS0VERVA9Ii1NIgorUk1fRj0icm0gLWYiCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uYXNtIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25hc20rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfbmFzbTsgQVNNX0ZPUl9BUkNIPSJpMzg2IgorZWxzZQorICBBU01fRk9SX0FSQ0g9IiIKK2ZpCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gdGVybWNhcC5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gbGFtZS1kZXZAbGlzdHMuc2YubmV0ICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIG5jdXJzZXMvdGVybWNhcC5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gbGFtZS1kZXZAbGlzdHMuc2YubmV0ICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluaXRzY3IgaW4gLWx0ZXJtY2FwIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGluaXRzY3IgaW4gLWx0ZXJtY2FwLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfdGVybWNhcF9pbml0c2NyK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sdGVybWNhcCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBpbml0c2NyICgpOworaW50CittYWluICgpCit7CityZXR1cm4gaW5pdHNjciAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2xpYl90ZXJtY2FwX2luaXRzY3I9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9saWJfdGVybWNhcF9pbml0c2NyPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfdGVybWNhcF9pbml0c2NyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfdGVybWNhcF9pbml0c2NyIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2xpYl90ZXJtY2FwX2luaXRzY3IgPSB5ZXM7IHRoZW4KKyAgSEFWRV9URVJNQ0FQPSJ0ZXJtY2FwIgorZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluaXRzY3IgaW4gLWxjdXJzZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5pdHNjciBpbiAtbGN1cnNlcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2N1cnNlc19pbml0c2NyK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY3Vyc2VzICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGluaXRzY3IgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBpbml0c2NyICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX2N1cnNlc19pbml0c2NyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGliX2N1cnNlc19pbml0c2NyPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfY3Vyc2VzX2luaXRzY3IiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9jdXJzZXNfaW5pdHNjciIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9saWJfY3Vyc2VzX2luaXRzY3IgPSB5ZXM7IHRoZW4KKyAgSEFWRV9URVJNQ0FQPSJjdXJzZXMiCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5pdHNjciBpbiAtbG5jdXJzZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5pdHNjciBpbiAtbG5jdXJzZXMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9uY3Vyc2VzX2luaXRzY3Irc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxuY3Vyc2VzICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGluaXRzY3IgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBpbml0c2NyICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX25jdXJzZXNfaW5pdHNjcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9uY3Vyc2VzX2luaXRzY3I9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9uY3Vyc2VzX2luaXRzY3IiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9uY3Vyc2VzX2luaXRzY3IiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX25jdXJzZXNfaW5pdHNjciA9IHllczsgdGhlbgorICBIQVZFX1RFUk1DQVA9Im5jdXJzZXMiCitmaQorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjb3MgaW4gLWxtIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNvcyBpbiAtbG0uLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9tX2NvcytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG0gICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgY29zICgpOworaW50CittYWluICgpCit7CityZXR1cm4gY29zICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX21fY29zPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGliX21fY29zPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfbV9jb3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9tX2NvcyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9saWJfbV9jb3MgPSB5ZXM7IHRoZW4KKyAgVVNFX0xJQk09Ii1sbSIKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjb3MgaW4gLWxmZm0iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgY29zIGluIC1sZmZtLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfZmZtX2NvcytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGZmbSAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBjb3MgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBjb3MgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl9saWJfZmZtX2Nvcz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9mZm1fY29zPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfZmZtX2NvcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2ZmbV9jb3MiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX2ZmbV9jb3MgPSB5ZXM7IHRoZW4KKyAgVVNFX0xJQk09Ii1sZmZtIC1sbSIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jcG1sIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NwbWwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfY3BtbDsgQ09ORklHX0NQTUw9Im5vIgorZWxzZQorICBDT05GSUdfQ1BNTD0ieWVzIgorZmkKKworaWYgdGVzdCAiJHtDT05GSUdfQ1BNTH0iID0geWVzOyB0aGVuCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgY29zIGluIC1sY3BtbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBjb3MgaW4gLWxjcG1sLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfY3BtbF9jb3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxjcG1sICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGNvcyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGNvcyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2xpYl9jcG1sX2Nvcz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9jcG1sX2Nvcz1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2NwbWxfY29zIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfY3BtbF9jb3MiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX2NwbWxfY29zID0geWVzOyB0aGVuCisgIFVTRV9MSUJNPSItbGNwbWwiCitmaQorCitmaQorQ09ORklHX01BVEhfTElCPSIke1VTRV9MSUJNfSIKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ3RrLXByZWZpeCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ3RrX3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSR3aXRoX2d0a19wcmVmaXg7IGd0a19jb25maWdfcHJlZml4PSIkd2l0aHZhbCIKK2Vsc2UKKyAgZ3RrX2NvbmZpZ19wcmVmaXg9IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1ndGstZXhlYy1wcmVmaXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2d0a19leGVjX3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSR3aXRoX2d0a19leGVjX3ByZWZpeDsgZ3RrX2NvbmZpZ19leGVjX3ByZWZpeD0iJHdpdGh2YWwiCitlbHNlCisgIGd0a19jb25maWdfZXhlY19wcmVmaXg9IiIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ndGt0ZXN0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2d0a3Rlc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfZ3RrdGVzdDsKK2Vsc2UKKyAgZW5hYmxlX2d0a3Rlc3Q9eWVzCitmaQorCisKKyAgZm9yIG1vZHVsZSBpbiAuCisgIGRvCisgICAgICBjYXNlICIkbW9kdWxlIiBpbgorICAgICAgICAgZ3RocmVhZCkKKyAgICAgICAgICAgICBndGtfY29uZmlnX2FyZ3M9IiRndGtfY29uZmlnX2FyZ3MgZ3RocmVhZCIKKyAgICAgICAgIDs7CisgICAgICBlc2FjCisgIGRvbmUKKworICBpZiB0ZXN0IHgkZ3RrX2NvbmZpZ19leGVjX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBndGtfY29uZmlnX2FyZ3M9IiRndGtfY29uZmlnX2FyZ3MgLS1leGVjLXByZWZpeD0kZ3RrX2NvbmZpZ19leGVjX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtHVEtfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgR1RLX0NPTkZJRz0kZ3RrX2NvbmZpZ19leGVjX3ByZWZpeC9iaW4vZ3RrLWNvbmZpZworICAgICBmaQorICBmaQorICBpZiB0ZXN0IHgkZ3RrX2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIC0tcHJlZml4PSRndGtfY29uZmlnX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtHVEtfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgR1RLX0NPTkZJRz0kZ3RrX2NvbmZpZ19wcmVmaXgvYmluL2d0ay1jb25maWcKKyAgICAgZmkKKyAgZmkKKworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImd0ay1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGd0ay1jb25maWc7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HVEtfQ09ORklHK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJEdUS19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfR1RLX0NPTkZJRz0iJEdUS19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9HVEtfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1RLX0NPTkZJRyIgJiYgYWNfY3ZfcGF0aF9HVEtfQ09ORklHPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitHVEtfQ09ORklHPSRhY19jdl9wYXRoX0dUS19DT05GSUcKK2lmIHRlc3QgLW4gIiRHVEtfQ09ORklHIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRHVEtfQ09ORklHIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRHVEtfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyAgbWluX2d0a192ZXJzaW9uPTEuMi4wCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBHVEsgLSB2ZXJzaW9uID49ICRtaW5fZ3RrX3ZlcnNpb24iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgR1RLIC0gdmVyc2lvbiA+PSAkbWluX2d0a192ZXJzaW9uLi4uICRFQ0hPX0MiID4mNjsgfQorICBub19ndGs9IiIKKyAgaWYgdGVzdCAiJEdUS19DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19ndGs9eWVzCisgIGVsc2UKKyAgICBHVEtfQ0ZMQUdTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgIEdUS19MSUJTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tbGlic2AKKyAgICBndGtfY29uZmlnX21ham9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKS5cKFswLTldKlwpLlwoWzAtOV0qXCkvXDEvJ2AKKyAgICBndGtfY29uZmlnX21pbm9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKS5cKFswLTldKlwpLlwoWzAtOV0qXCkvXDIvJ2AKKyAgICBndGtfY29uZmlnX21pY3JvX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbMC05XSpcKS5cKFswLTldKlwpLlwoWzAtOV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGt0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkR1RLX0NGTEFHUyIKKyAgICAgIExJQlM9IiRHVEtfTElCUyAkTElCUyIKKyAgICAgIHJtIC1mIGNvbmYuZ3RrdGVzdAorICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQKK21haW4gKCkKK3sKKyAgaW50IG1ham9yLCBtaW5vciwgbWljcm87CisgIGNoYXIgKnRtcF92ZXJzaW9uOworCisgIHN5c3RlbSAoInRvdWNoIGNvbmYuZ3RrdGVzdCIpOworCisgIC8qIEhQL1VYIDkgKCVAIyEpIHdyaXRlcyB0byBzc2NhbmYgc3RyaW5ncyAqLworICB0bXBfdmVyc2lvbiA9IGdfc3RyZHVwKCIkbWluX2d0a192ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9ndGtfdmVyc2lvbiIpOworICAgICBleGl0KDEpOworICAgfQorCisgIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gIT0gJGd0a19jb25maWdfbWFqb3JfdmVyc2lvbikgfHwKKyAgICAgIChndGtfbWlub3JfdmVyc2lvbiAhPSAkZ3RrX2NvbmZpZ19taW5vcl92ZXJzaW9uKSB8fAorICAgICAgKGd0a19taWNyb192ZXJzaW9uICE9ICRndGtfY29uZmlnX21pY3JvX3ZlcnNpb24pKQorICAgIHsKKyAgICAgIHByaW50ZigiXG4qKiogJ2d0ay1jb25maWcgLS12ZXJzaW9uJyByZXR1cm5lZCAlZC4lZC4lZCwgYnV0IEdUSysgKCVkLiVkLiVkKVxuIiwKKyAgICAgICAgICAgICAkZ3RrX2NvbmZpZ19tYWpvcl92ZXJzaW9uLCAkZ3RrX2NvbmZpZ19taW5vcl92ZXJzaW9uLCAkZ3RrX2NvbmZpZ19taWNyb192ZXJzaW9uLAorICAgICAgICAgICAgIGd0a19tYWpvcl92ZXJzaW9uLCBndGtfbWlub3JfdmVyc2lvbiwgZ3RrX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmICgiKioqIHdhcyBmb3VuZCEgSWYgZ3RrLWNvbmZpZyB3YXMgY29ycmVjdCwgdGhlbiBpdCBpcyBiZXN0XG4iKTsKKyAgICAgIHByaW50ZiAoIioqKiB0byByZW1vdmUgdGhlIG9sZCB2ZXJzaW9uIG9mIEdUSysuIFlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGZpeCB0aGUgZXJyb3JcbiIpOworICAgICAgcHJpbnRmKCIqKiogYnkgbW9kaWZ5aW5nIHlvdXIgTERfTElCUkFSWV9QQVRIIGVudmlyb21lbnQgdmFyaWFibGUsIG9yIGJ5IGVkaXRpbmdcbiIpOworICAgICAgcHJpbnRmKCIqKiogL2V0Yy9sZC5zby5jb25mLiBNYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQgaXNcbiIpOworICAgICAgcHJpbnRmKCIqKiogcmVxdWlyZWQgb24geW91ciBzeXN0ZW0uXG4iKTsKKyAgICAgIHByaW50ZigiKioqIElmIGd0ay1jb25maWcgd2FzIHdyb25nLCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdUS19DT05GSUdcbiIpOworICAgICAgcHJpbnRmKCIqKiogdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgY29weSBvZiBndGstY29uZmlnLCBhbmQgcmVtb3ZlIHRoZSBmaWxlIGNvbmZpZy5jYWNoZVxuIik7CisgICAgICBwcmludGYoIioqKiBiZWZvcmUgcmUtcnVubmluZyBjb25maWd1cmVcbiIpOworICAgIH0KKyNpZiBkZWZpbmVkIChHVEtfTUFKT1JfVkVSU0lPTikgJiYgZGVmaW5lZCAoR1RLX01JTk9SX1ZFUlNJT04pICYmIGRlZmluZWQgKEdUS19NSUNST19WRVJTSU9OKQorICBlbHNlIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gIT0gR1RLX01BSk9SX1ZFUlNJT04pIHx8CisJICAgKGd0a19taW5vcl92ZXJzaW9uICE9IEdUS19NSU5PUl9WRVJTSU9OKSB8fAorICAgICAgICAgICAoZ3RrX21pY3JvX3ZlcnNpb24gIT0gR1RLX01JQ1JPX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIHByaW50ZigiKioqIEdUSysgaGVhZGVyIGZpbGVzICh2ZXJzaW9uICVkLiVkLiVkKSBkbyBub3QgbWF0Y2hcbiIsCisJICAgICBHVEtfTUFKT1JfVkVSU0lPTiwgR1RLX01JTk9SX1ZFUlNJT04sIEdUS19NSUNST19WRVJTSU9OKTsKKyAgICAgIHByaW50ZigiKioqIGxpYnJhcnkgKHZlcnNpb24gJWQuJWQuJWQpXG4iLAorCSAgICAgZ3RrX21ham9yX3ZlcnNpb24sIGd0a19taW5vcl92ZXJzaW9uLCBndGtfbWljcm9fdmVyc2lvbik7CisgICAgfQorI2VuZGlmIC8qIGRlZmluZWQgKEdUS19NQUpPUl9WRVJTSU9OKSAuLi4gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICAgKChndGtfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICAgICAoKGd0a19tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoZ3RrX21pbm9yX3ZlcnNpb24gPT0gbWlub3IpICYmIChndGtfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJcbioqKiBBbiBvbGQgdmVyc2lvbiBvZiBHVEsrICglZC4lZC4lZCkgd2FzIGZvdW5kLlxuIiwKKyAgICAgICAgICAgICAgIGd0a19tYWpvcl92ZXJzaW9uLCBndGtfbWlub3JfdmVyc2lvbiwgZ3RrX21pY3JvX3ZlcnNpb24pOworICAgICAgICBwcmludGYoIioqKiBZb3UgbmVlZCBhIHZlcnNpb24gb2YgR1RLKyBuZXdlciB0aGFuICVkLiVkLiVkLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2ZcbiIsCisJICAgICAgIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgICBwcmludGYoIioqKiBHVEsrIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSBmdHA6Ly9mdHAuZ3RrLm9yZy5cbiIpOworICAgICAgICBwcmludGYoIioqKlxuIik7CisgICAgICAgIHByaW50ZigiKioqIElmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGEgc3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uLCB0aGlzIGVycm9yXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgd3JvbmcgY29weSBvZiB0aGUgZ3RrLWNvbmZpZyBzaGVsbCBzY3JpcHQgaXNcbiIpOworICAgICAgICBwcmludGYoIioqKiBiZWluZyBmb3VuZC4gVGhlIGVhc2llc3Qgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb25cbiIpOworICAgICAgICBwcmludGYoIioqKiBvZiBHVEsrLCBidXQgeW91IGNhbiBhbHNvIHNldCB0aGUgR1RLX0NPTkZJRyBlbnZpcm9ubWVudCB0byBwb2ludCB0byB0aGVcbiIpOworICAgICAgICBwcmludGYoIioqKiBjb3JyZWN0IGNvcHkgb2YgZ3RrLWNvbmZpZy4gKEluIHRoaXMgY2FzZSwgeW91IHdpbGwgaGF2ZSB0b1xuIik7CisgICAgICAgIHByaW50ZigiKioqIG1vZGlmeSB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZlxuIik7CisgICAgICAgIHByaW50ZigiKioqIHNvIHRoYXQgdGhlIGNvcnJlY3QgbGlicmFyaWVzIGFyZSBmb3VuZCBhdCBydW4tdGltZSkpXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiAxOworfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK25vX2d0az15ZXMKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fZ3RrIiA9IHggOyB0aGVuCisgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisgICAgIEhBVkVfR1RLPSJ5ZXMiCisgIGVsc2UKKyAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgICAgIGlmIHRlc3QgIiRHVEtfQ09ORklHIiA9ICJubyIgOyB0aGVuCisgICAgICAgZWNobyAiKioqIFRoZSBndGstY29uZmlnIHNjcmlwdCBpbnN0YWxsZWQgYnkgR1RLIGNvdWxkIG5vdCBiZSBmb3VuZCIKKyAgICAgICBlY2hvICIqKiogSWYgR1RLIHdhcyBpbnN0YWxsZWQgaW4gUFJFRklYLCBtYWtlIHN1cmUgUFJFRklYL2JpbiBpcyBpbiIKKyAgICAgICBlY2hvICIqKiogeW91ciBwYXRoLCBvciBzZXQgdGhlIEdUS19DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIgorICAgICAgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gZ3RrLWNvbmZpZy4iCisgICAgIGVsc2UKKyAgICAgICBpZiB0ZXN0IC1mIGNvbmYuZ3RrdGVzdCA7IHRoZW4KKyAgICAgICAgOgorICAgICAgIGVsc2UKKyAgICAgICAgICBlY2hvICIqKiogQ291bGQgbm90IHJ1biBHVEsgdGVzdCBwcm9ncmFtLCBjaGVja2luZyB3aHkuLi4iCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRHVEtfQ0ZMQUdTIgorICAgICAgICAgIExJQlM9IiRMSUJTICRHVEtfTElCUyIKKyAgICAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKCkKK3sKKyByZXR1cm4gKChndGtfbWFqb3JfdmVyc2lvbikgfHwgKGd0a19taW5vcl92ZXJzaW9uKSB8fCAoZ3RrX21pY3JvX3ZlcnNpb24pKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBHVEsgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgR1RLLiBJZiBpdCBpcyBub3QgZmluZGluZyBHVEssIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiCisgICAgICAgICAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhIFJlZEhhdCA1LjAgc3lzdGVtLCB5b3Ugc2hvdWxkIHJlbW92ZSB0aGUgR1RLIHBhY2thZ2UgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogY2FtZSB3aXRoIHRoZSBzeXN0ZW0gd2l0aCB0aGUgY29tbWFuZCIKKyAgICAgICAgICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqICAgIHJwbSAtLWVyYXNlIC0tbm9kZXBzIGd0ayBndGstZGV2ZWwiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwkgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGUgb3IgbGluay4gU2VlIHRoZSBmaWxlIGNvbmZpZy5sb2cgZm9yIHRoZSIKKyAgICAgICAgICBlY2hvICIqKiogZXhhY3QgZXJyb3IgdGhhdCBvY2N1cmVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgR1RLIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgR1RLIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91IgorICAgICAgICAgIGVjaG8gIioqKiBtYXkgd2FudCB0byBlZGl0IHRoZSBndGstY29uZmlnIHNjcmlwdDogJEdUS19DT05GSUciCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICAgIGZpCisgICAgIGZpCisgICAgIEdUS19DRkxBR1M9IiIKKyAgICAgR1RLX0xJQlM9IiIKKyAgICAgSEFWRV9HVEs9Im5vIgorICBmaQorCisKKyAgcm0gLWYgY29uZi5ndGt0ZXN0CisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdXNlIG9mIEVsZWN0cmljRmVuY2UgbWFsbG9jIGRlYnVnZ2luZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHVzZSBvZiBFbGVjdHJpY0ZlbmNlIG1hbGxvYyBkZWJ1Z2dpbmcuLi4gJEVDSE9fQyIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZWZlbmNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2VmZW5jZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9lZmVuY2U7IENPTkZJR19FRkVOQ0U9IiR7ZW5hYmxldmFsfSIKK2Vsc2UKKyAgQ09ORklHX0VGRU5DRT0ibm8iCitmaQorCisKK2Nhc2UgIiR7Q09ORklHX0VGRU5DRX0iIGluCit5ZXMpCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEVGX1ByaW50IGluIC1sZWZlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEVGX1ByaW50IGluIC1sZWZlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfZWZlbmNlX0VGX1ByaW50K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZWZlbmNlICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIEVGX1ByaW50ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gRUZfUHJpbnQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl9saWJfZWZlbmNlX0VGX1ByaW50PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGliX2VmZW5jZV9FRl9QcmludD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2VmZW5jZV9FRl9QcmludCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2VmZW5jZV9FRl9QcmludCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9saWJfZWZlbmNlX0VGX1ByaW50ID0geWVzOyB0aGVuCisgIEhBVkVfRUZFTkNFPSItbGVmZW5jZSIKK2ZpCisKKwlpZiB0ZXN0ICJ4JHtIQVZFX0VGRU5DRX0iICE9ICJ4LWxlZmVuY2UiOyB0aGVuCisJCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisJZWxzZQorCQlMREFERD0iJHtMREFERH0gJHtIQVZFX0VGRU5DRX0iCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfRUZFTkNFIDEKK19BQ0VPRgorCisJCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHtDT05GSUdfRUZFTkNFfSIgPiY1CitlY2hvICIke0VDSE9fVH0ke0NPTkZJR19FRkVOQ0V9IiA+JjY7IH0KKwlmaQorCTs7CitubykKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR7Q09ORklHX0VGRU5DRX0iID4mNQorZWNobyAiJHtFQ0hPX1R9JHtDT05GSUdfRUZFTkNFfSIgPiY2OyB9CisJOzsKKyopCisJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlIO+/vSR7Q09ORklHX0VGRU5DRX3vv70gZm9yIGVmZW5jZSBvcHRpb24iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlIO+/vSR7Q09ORklHX0VGRU5DRX3vv70gZm9yIGVmZW5jZSBvcHRpb24iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwk7OworZXNhYworCisKK1dBUk5JTkc9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZmlsZWlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9maWxlaW8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0kd2l0aF9maWxlaW87IENPTkZJR19GSUxFSU89IiR7d2l0aHZhbH0iCitlbHNlCisgIENPTkZJR19GSUxFSU89ImxhbWUiCitmaQorCisKK2lmIHRlc3QgIiR7Q09ORklHX0ZJTEVJT30iID0gInNuZGZpbGUiIDsgdGhlbgorCisKK2lmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWc7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QS0dfQ09ORklHK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJFBLR19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJFBLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQS0dfQ09ORklHPSRhY19jdl9wYXRoX1BLR19DT05GSUcKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRQS0dfQ09ORklHIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRQS0dfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIjsgdGhlbgorICBhY19wdF9QS0dfQ09ORklHPSRQS0dfQ09ORklHCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfUEtHX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYWNfcHRfUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X1BLR19DT05GSUc9JGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRworaWYgdGVzdCAtbiAiJGFjX3B0X1BLR19DT05GSUciOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3B0X1BLR19DT05GSUciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3B0X1BLR19DT05GSUciID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9QS0dfQ09ORklHIiA9IHg7IHRoZW4KKyAgICBQS0dfQ09ORklHPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBQS0dfQ09ORklHPSRhY19wdF9QS0dfQ09ORklHCisgIGZpCitlbHNlCisgIFBLR19DT05GSUc9IiRhY19jdl9wYXRoX1BLR19DT05GSUciCitmaQorCitmaQoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisJX3BrZ19taW5fdmVyc2lvbj0wLjkuMAorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbi4uLiAkRUNIT19DIiA+JjY7IH0KKwlpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb247IHRoZW4KKwkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKwllbHNlCisJCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorCQlQS0dfQ09ORklHPSIiCisJZmkKKworZmkKKworcGtnX2ZhaWxlZD1ubworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIFNOREZJTEUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgU05ERklMRS4uLiAkRUNIT19DIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFNOREZJTEVfQ0ZMQUdTIjsgdGhlbgorICAgICAgICBwa2dfY3ZfU05ERklMRV9DRkxBR1M9IiRTTkRGSUxFX0NGTEFHUyIKKyAgICBlbHNlCisgICAgICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyAoZWNobyAiJGFzX21lOiRMSU5FTk86IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcInNuZGZpbGUgPj0gMS4wLjJcIiIpID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgInNuZGZpbGUgPj0gMS4wLjIiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgIHBrZ19jdl9TTkRGSUxFX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgInNuZGZpbGUgPj0gMS4wLjIiIDI+L2Rldi9udWxsYAorZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyAgICBmaQorZWxzZQorCXBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRTTkRGSUxFX0xJQlMiOyB0aGVuCisgICAgICAgIHBrZ19jdl9TTkRGSUxFX0xJQlM9IiRTTkRGSUxFX0xJQlMiCisgICAgZWxzZQorICAgICAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgKGVjaG8gIiRhc19tZTokTElORU5POiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJzbmRmaWxlID49IDEuMC4yXCIiKSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJzbmRmaWxlID49IDEuMC4yIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICBwa2dfY3ZfU05ERklMRV9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgInNuZGZpbGUgPj0gMS4wLjIiIDI+L2Rldi9udWxsYAorZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyAgICBmaQorZWxzZQorCXBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgU05ERklMRV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXNob3J0LWVycm9ycyAtLWVycm9ycy10by1zdGRvdXQgLS1wcmludC1lcnJvcnMgInNuZGZpbGUgPj0gMS4wLjIiYAorICAgICAgICBlbHNlCisJICAgICAgICBTTkRGSUxFX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tZXJyb3JzLXRvLXN0ZG91dCAtLXByaW50LWVycm9ycyAic25kZmlsZSA+PSAxLjAuMiJgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJFNOREZJTEVfUEtHX0VSUk9SUyIgPiY1CisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBIQVZFX1NOREZJTEU9Im5vIgorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorCUhBVkVfU05ERklMRT0ibm8iCitlbHNlCisJU05ERklMRV9DRkxBR1M9JHBrZ19jdl9TTkRGSUxFX0NGTEFHUworCVNOREZJTEVfTElCUz0kcGtnX2N2X1NOREZJTEVfTElCUworICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorCUhBVkVfU05ERklMRT0ieWVzIgorZmkKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHVzZSBvZiBmaWxlIGlvIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdXNlIG9mIGZpbGUgaW8uLi4gJEVDSE9fQyIgPiY2OyB9CisKK2lmIHRlc3QgIiR7Q09ORklHX0ZJTEVJT30iID0gInNuZGZpbGUiIDsgdGhlbgorICBpZiB0ZXN0ICIke0hBVkVfU05ERklMRX0iID0gInllcyIgLW8gIngke1NOREZJTEVfTElCU30iICE9ICJ4IiBcCisgICAgLW8gIngke1NOREZJTEVfQ0ZMQUdTfSIgIT0gIngiOyB0aGVuCisgICAgU05ERklMRV9MSUJTPWBlY2hvICR7U05ERklMRV9MSUJTfWAKKyAgICBTTkRGSUxFX0NGTEFHUz1gZWNobyAke1NOREZJTEVfQ0ZMQUdTfWAKKworICAgIGlmIHRlc3QgLW4gIiR7U05ERklMRV9MSUJTfSIgOyB0aGVuCisgICAgICBGUk9OVEVORF9MREZMQUdTPSIke1NOREZJTEVfTElCU30gJHtGUk9OVEVORF9MREZMQUdTfSIKKyAgICBmaQorICAgIEZST05URU5EX0xEQUREPSItbHNuZGZpbGUgJHtGUk9OVEVORF9MREFERH0iCisKKyAgICBpZiB0ZXN0IC1uICIke1NOREZJTEVfQ0ZMQUdTfSIgOyB0aGVuCisgICAgICBJTkNMVURFUz0iJHtTTkRGSUxFX0NGTEFHU30gJHtJTkNMVURFU30iCisgICAgZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBMSUJTTkRGSUxFIDEKK19BQ0VPRgorCisgIGVsc2UKKyAgICAjIGRlZmF1bHQKKyAgICBDT05GSUdfRklMRUlPPSJsYW1lIgorICAgIFdBUk5JTkc9IiR7V0FSTklOR30gQ291bGQgbm90IGZpbmQgYW55IHNuZGZpbGUgbGliIG9uIHN5c3RlbS4iCisgIGZpCitlbHNlCisgIENPTkZJR19GSUxFSU89ImxhbWUiCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAke0NPTkZJR19GSUxFSU99IiA+JjUKK2VjaG8gIiR7RUNIT19UfSR7Q09ORklHX0ZJTEVJT30iID4mNjsgfQoraWYgdGVzdCAieCR7V0FSTklOR30iICE9ICJ4IiA7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJFdBUk5JTkciID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkV0FSTklORyIgPiYyO30KK2ZpCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdXNlIG9mIGFuYWx5emVyIGhvb2tzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdXNlIG9mIGFuYWx5emVyIGhvb2tzLi4uICRFQ0hPX0MiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWFuYWx5emVyLWhvb2tzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2FuYWx5emVyX2hvb2tzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0kZW5hYmxlX2FuYWx5emVyX2hvb2tzOyBDT05GSUdfQU5BTFlaRVI9IiR7ZW5hYmxldmFsfSIKK2Vsc2UKKyAgQ09ORklHX0FOQUxZWkVSPSJ5ZXMiCitmaQorCisKK2Nhc2UgIiR7Q09ORklHX0FOQUxZWkVSfSIgaW4KK3llcykKKwk7Oworbm8pCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIE5PQU5BTFlTSVMgMQorX0FDRU9GCisKKwk7OworKikKKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUg77+9JHtDT05GSUdfQU5BTFlaRVJ977+9IGZvciBhbmFseXplci1ob29rcyBvcHRpb24iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlIO+/vSR7Q09ORklHX0FOQUxZWkVSfe+/vSBmb3IgYW5hbHl6ZXItaG9va3Mgb3B0aW9uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENPTkZJR19BTkFMWVpFUiIgPiY1CitlY2hvICIke0VDSE9fVH0kQ09ORklHX0FOQUxZWkVSIiA+JjY7IH0KKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB1c2Ugb2YgbXBnMTIzIGRlY29kZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB1c2Ugb2YgbXBnMTIzIGRlY29kZXIuLi4gJEVDSE9fQyIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVjb2RlciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZWNvZGVyK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlY29kZXI7IENPTkZJR19ERUNPREVSPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIENPTkZJR19ERUNPREVSPSJ5ZXMiCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVjb2RlLWxheWVyMSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZWNvZGVfbGF5ZXIxK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlY29kZV9sYXllcjE7IENPTkZJR19ERUNPREVSX0wxPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIENPTkZJR19ERUNPREVSX0wxPSJubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZWNvZGUtbGF5ZXIyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlY29kZV9sYXllcjIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfZGVjb2RlX2xheWVyMjsgQ09ORklHX0RFQ09ERVJfTDI9IiR7ZW5hYmxldmFsfSIKK2Vsc2UKKyAgQ09ORklHX0RFQ09ERVJfTDI9InllcyIKK2ZpCisKKworIGlmIHRlc3QgIngke0NPTkZJR19ERUNPREVSfSIgPSAieHllcyI7IHRoZW4KKyAgTElCX1dJVEhfREVDT0RFUl9UUlVFPQorICBMSUJfV0lUSF9ERUNPREVSX0ZBTFNFPScjJworZWxzZQorICBMSUJfV0lUSF9ERUNPREVSX1RSVUU9JyMnCisgIExJQl9XSVRIX0RFQ09ERVJfRkFMU0U9CitmaQorCisKK2lmIHRlc3QgIiR7Q09ORklHX0RFQ09ERVJ9IiAhPSAibm8iIDsgdGhlbgorCUNPTkZJR19ERUNPREVSPSJ5ZXMgKExheWVyIgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX01QR0xJQiAxCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBERUNPREVfT05fVEhFX0ZMWSAxCitfQUNFT0YKKworCisJaWYgdGVzdCAiJHtDT05GSUdfREVDT0RFUl9MMX0iICE9ICJubyI7IHRoZW4KKwkJQ09ORklHX0RFQ09ERVI9IiR7Q09ORklHX0RFQ09ERVJ9IDEsIgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBVU0VfTEFZRVJfMSAxCitfQUNFT0YKKworCWZpCisJaWYgdGVzdCAiJHtDT05GSUdfREVDT0RFUl9MMn0iICE9ICJubyI7IHRoZW4KKwkJQ09ORklHX0RFQ09ERVI9IiR7Q09ORklHX0RFQ09ERVJ9IDIsIgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBVU0VfTEFZRVJfMiAxCitfQUNFT0YKKworCWZpCisJQ09ORklHX0RFQ09ERVI9IiR7Q09ORklHX0RFQ09ERVJ9IDMpIgorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENPTkZJR19ERUNPREVSIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDT05GSUdfREVDT0RFUiIgPiY2OyB9CisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgdGhlIGxhbWUgZnJvbnRlbmQgc2hvdWxkIGJlIGJ1aWxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgdGhlIGxhbWUgZnJvbnRlbmQgc2hvdWxkIGJlIGJ1aWxkLi4uICRFQ0hPX0MiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZyb250ZW5kIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zyb250ZW5kK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0kZW5hYmxlX2Zyb250ZW5kOyBXSVRIX0ZST05URU5EPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIFdJVEhfRlJPTlRFTkQ9eWVzCitmaQorCitpZiB0ZXN0ICJ4JHtXSVRIX0ZST05URU5EfSIgPSAieHllcyI7IHRoZW4KKwlXSVRIX0ZST05URU5EPWxhbWUke2FjX2V4ZWV4dH0KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorZWxzZQorCVdJVEhfRlJPTlRFTkQ9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgbXAzeCBpcyByZXF1ZXN0ZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBtcDN4IGlzIHJlcXVlc3RlZC4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tcDN4IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21wM3grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfbXAzeDsgV0lUSF9NUDNYPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIFdJVEhfTVAzWD1ubworZmkKKworaWYgdGVzdCAieCR7V0lUSF9NUDNYfSIgPSAieHllcyI7IHRoZW4KKwlXSVRIX01QM1g9bXAzeCR7YWNfZXhlZXh0fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisJV0lUSF9NUDNYPQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworaWYgdGVzdCAiJHtIQVZFX0dUS30iID0gIm5vIjsgdGhlbgorCWlmIHRlc3QgIngke1dJVEhfTVAzWH0iID0gInhtcDN4IjsgdGhlbgorCQl7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBjYW4ndCBidWlsZCBtcDN4IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogY2FuJ3QgYnVpbGQgbXAzeCIgPiYyO30KKwkJV0lUSF9NUDNYPQorCWZpCisJaWYgdGVzdCAieCR7Q09ORklHX0FOQUxZWkVSfSIgIT0gInh5ZXMiOyB0aGVuCisJCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhbid0IGJ1aWxkIG1wM3ggYmVjYXVzZSBvZiBkaXNhYmxlZCBhbmFseXplciBob29rcyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhbid0IGJ1aWxkIG1wM3ggYmVjYXVzZSBvZiBkaXNhYmxlZCBhbmFseXplciBob29rcyIgPiYyO30KKwkJV0lUSF9NUDNYPQorCWZpCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBtcDNydHAgaXMgcmVxdWVzdGVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgbXAzcnRwIGlzIHJlcXVlc3RlZC4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tcDNydHAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbXAzcnRwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0kZW5hYmxlX21wM3J0cDsgV0lUSF9NUDNSVFA9IiR7ZW5hYmxldmFsfSIKK2Vsc2UKKyAgV0lUSF9NUDNSVFA9bm8KK2ZpCisKK2lmIHRlc3QgIngke1dJVEhfTVAzUlRQfSIgPSAieHllcyI7IHRoZW4KKwlpZiB0ZXN0ICR7U09DS0VURlVOQ1RJT059ID0gTk87IHRoZW4KKwkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogZnVuY3Rpb24gc29ja2V0IGlzIG1hbmRhdG9yeSBmb3IgbXAzcnRwIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGZ1bmN0aW9uIHNvY2tldCBpcyBtYW5kYXRvcnkgZm9yIG1wM3J0cCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCWZpCisJV0lUSF9NUDNSVFA9bXAzcnRwJHthY19leGVleHR9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KK2Vsc2UKKwlXSVRIX01QM1JUUD0KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworIworIyB0aGlzIGlzIGZyb20gdm9yYmlzCisjCitjYXNlICRob3N0IGluCisqODYtKi1saW51eCopCisJIyBnbGliYyA8IDIuMS4zIGhhcyBhIHNlcmlvdXMgRlAgYnVnIGluIHRoZSBtYXRoIGlubGluZSBoZWFkZXIKKwkjIHRoYXQgd2lsbCBjcmlwcGxlIFZvcmJpcy4gIExvb2sgdG8gc2VlIGlmIHRoZSBtYWdpYyBGUCBzdGFjaworCSMgY2xvYmJlciBpcyBtaXNzaW5nIGluIHRoZSBtYXRoaW5saW5lIGhlYWRlciwgdGh1cyBpbmRpY2F0aW5nCisJIyB0aGUgYnVnZ3kgdmVyc2lvbgorCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKwkJI2RlZmluZSBfX0xJQkNfSU5URVJOQUxfTUFUSF9JTkxJTkVTIDEKKwkgICAgIAkjZGVmaW5lIF9fT1BUSU1JWkVfXworCQkjaW5jbHVkZSA8bWF0aC5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJsb2cxMC4qZmxkbGcyLipmeGNoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYmFkPW1heWJlCitlbHNlCisgIGJhZD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBnbGliYyBtYXRoaW5saW5lIGJ1ZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGdsaWJjIG1hdGhpbmxpbmUgYnVnLi4uICRFQ0hPX0MiID4mNjsgfQorCWlmIHRlc3QgJHtiYWR9ID0gIm1heWJlIiA7dGhlbgorCSAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisJCQkJI2RlZmluZSBfX0xJQkNfSU5URVJOQUxfTUFUSF9JTkxJTkVTIDEKKwkJCSAgICAgCSNkZWZpbmUgX19PUFRJTUlaRV9fCisJCQkJI2luY2x1ZGUgPG1hdGguaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibG9nMTAuKmZsZGxnMi4qZnhjaC4qc3RcKFswMTIzNDU2Nzg5XSpcKSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGJhZD1ubworZWxzZQorICBiYWQ9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCisKKwlmaQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHtiYWR9IiA+JjUKK2VjaG8gIiR7RUNIT19UfSR7YmFkfSIgPiY2OyB9CisJaWYgdGVzdCAke2JhZH0gPSAieWVzIiA7dGhlbgorIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID4mMjt9CisgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPiYyO30KKyB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAqIFRoZSBnbGliYyBoZWFkZXJzIG9uIHRoaXMgbWFjaGluZSBoYXZlIGEgc2VyaW91cyBidWcgKiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICogVGhlIGdsaWJjIGhlYWRlcnMgb24gdGhpcyBtYWNoaW5lIGhhdmUgYSBzZXJpb3VzIGJ1ZyAqIiA+JjI7fQorIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICogaW4gL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGlubGluZS5oICBUaGlzIGJ1ZyBhZmZlY3RzICAqIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogKiBpbiAvdXNyL2luY2x1ZGUvYml0cy9tYXRoaW5saW5lLmggIFRoaXMgYnVnIGFmZmVjdHMgICoiID4mMjt9CisgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogKiBhbGwgZmxvYXRpbmcgcG9pbnQgY29kZSwgbm90IG9ubHkgTEFNRSwgYnV0IGFsbCBjb2RlICoiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqIGFsbCBmbG9hdGluZyBwb2ludCBjb2RlLCBub3Qgb25seSBMQU1FLCBidXQgYWxsIGNvZGUgKiIgPiYyO30KKyB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAqIGJ1aWx0IG9uIHRoaXMgbWFjaGluZS4gVXBncmFkaW5nIHRvIGdsaWJjIDIuMS4zIGlzICAgKiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICogYnVpbHQgb24gdGhpcyBtYWNoaW5lLiBVcGdyYWRpbmcgdG8gZ2xpYmMgMi4xLjMgaXMgICAqIiA+JjI7fQorIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICogc3Ryb25nbHkgdXJnZWQgdG8gY29ycmVjdCB0aGUgcHJvYmxlbS4gICAgICAgICAgICAgICAqIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogKiBzdHJvbmdseSB1cmdlZCB0byBjb3JyZWN0IHRoZSBwcm9ibGVtLiAgICAgICAgICAgICAgICoiID4mMjt9CisgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogKk5vdGU6IHRoYXQgdXBncmFkaW5nIGdsaWJjIHdpbGwgbm90IGZpeCBhbnkgcHJldmlvdXNseSoiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqTm90ZTogdGhhdCB1cGdyYWRpbmcgZ2xpYmMgd2lsbCBub3QgZml4IGFueSBwcmV2aW91c2x5KiIgPiYyO30KKyB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAqIGJ1aWx0IHByb2dyYW1zOyB0aGlzIGlzIGEgY29tcGlsZS10aW1lIGJ1Zy4gICAgICAgICAgKiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICogYnVpbHQgcHJvZ3JhbXM7IHRoaXMgaXMgYSBjb21waWxlLXRpbWUgYnVnLiAgICAgICAgICAqIiA+JjI7fQorIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICogVG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0gZm9yIHRoaXMgYnVpbGQgb2YgTEFNRSwgICAqIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogKiBUbyB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbSBmb3IgdGhpcyBidWlsZCBvZiBMQU1FLCAgICoiID4mMjt9CisgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogKiBhdXRvY29uZiBpcyBkaXNhYmxpbmcgYWxsIG1hdGggaW5saW5pbmcuICBUaGlzIHdpbGwgICoiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqIGF1dG9jb25mIGlzIGRpc2FibGluZyBhbGwgbWF0aCBpbmxpbmluZy4gIFRoaXMgd2lsbCAgKiIgPiYyO30KKyB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAqIGh1cnQgTEFNRSBwZXJmb3JtYWNlIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIExBTUUgdG8gICAgKiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICogaHVydCBMQU1FIHBlcmZvcm1hY2UgYnV0IGlzIG5lY2Vzc2FyeSBmb3IgTEFNRSB0byAgICAqIiA+JjI7fQorIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICogd29yayBjb3JyZWN0bHkuICBPbmNlIGdsaWJjIGlzIHVwZ3JhZGVkLCByZXJ1biAgICAgICAqIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogKiB3b3JrIGNvcnJlY3RseS4gIE9uY2UgZ2xpYmMgaXMgdXBncmFkZWQsIHJlcnVuICAgICAgICoiID4mMjt9CisgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogKiBjb25maWd1cmUgYW5kIG1ha2UgdG8gYnVpbGQgd2l0aCBpbmxpbmluZy4gICAgICAgICAgICoiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAqIGNvbmZpZ3VyZSBhbmQgbWFrZSB0byBidWlsZCB3aXRoIGlubGluaW5nLiAgICAgICAgICAgKiIgPiYyO30KKyB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA+JjI7fQorIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID4mMjt9CisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgX19OT19NQVRIX0lOTElORVMgMQorX0FDRU9GCisKKwlmaTs7Citlc2FjCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdXNlIG9mIFZCUiBiaXRyYXRlIGhpc3RvZ3JhbSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHVzZSBvZiBWQlIgYml0cmF0ZSBoaXN0b2dyYW0uLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICJ4JHtIQVZFX1RFUk1DQVB9IiAhPSAieCI7IHRoZW4KKyAgVEVSTUNBUF9ERUZBVUxUPSJ5ZXMiCitlbHNlCisgIFRFUk1DQVBfREVGQVVMVD0ibm8iCitmaQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJyaGlzdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9icmhpc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfYnJoaXN0OyBDT05GSUdfQlJISVNUPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIENPTkZJR19CUkhJU1Q9InllcyIKK2ZpCisKK2lmIHRlc3QgIiR7Q09ORklHX0JSSElTVH0iICE9ICJubyIgOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEJSSElTVCAxCitfQUNFT0YKKworCisJaWYgdGVzdCAiJHtURVJNQ0FQX0RFRkFVTFR9IiA9ICJ5ZXMiIDsgdGhlbgorCQlGUk9OVEVORF9MREFERD0iLWwke0hBVkVfVEVSTUNBUH0gJHtGUk9OVEVORF9MREFERH0iCisJCUNPTkZJR19CUkhJU1Q9Inllcywgd2l0aCAke0hBVkVfVEVSTUNBUH0iCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfVEVSTUNBUCAxCitfQUNFT0YKKworCWVsc2UKKwkJQ09ORklHX0JSSElTVD0ieWVzLCBzaW11bGF0ZWQgdGVybWNhcCIKKwlmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHtDT05GSUdfQlJISVNUfSIgPiY1CitlY2hvICIke0VDSE9fVH0ke0NPTkZJR19CUkhJU1R9IiA+JjY7IH0KKyBpZiB0ZXN0ICIke0NPTkZJR19CUkhJU1R9IiAhPSAibm8iOyB0aGVuCisgIFdJVEhfQlJISVNUX1RSVUU9CisgIFdJVEhfQlJISVNUX0ZBTFNFPScjJworZWxzZQorICBXSVRIX0JSSElTVF9UUlVFPScjJworICBXSVRIX0JSSElTVF9GQUxTRT0KK2ZpCisKKworCisKK1dJVEhfVkVDVE9SPW5vCitjYXNlICRob3N0X2NwdSBpbgoreDg2XzY0fGFtZDY0KQorCUNQVVRZUEU9Im5vIgorCWlmIHRlc3QgJGFjX2N2X2hlYWRlcl94bW1pbnRyaW5faCA9IHllcyA7IHRoZW4KKwkJV0lUSF9YTU09eWVzCisJCVdJVEhfVkVDVE9SPXllcworCWZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgVEFLRUhJUk9fSUVFRTc1NF9IQUNLIDEKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFVTRV9GQVNUX0xPRyAxCitfQUNFT0YKKworCTs7CisqODYpCisJQ1BVVFlQRT0iaTM4NiIKKwlpZiB0ZXN0ICRhY19jdl9oZWFkZXJfeG1taW50cmluX2ggPSB5ZXMgOyB0aGVuCisJCVdJVEhfWE1NPXllcworCQlXSVRIX1ZFQ1RPUj15ZXMKKwlmaQorCisJIyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBJRUVFIDc1NCBsYXlvdXQKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgVEFLRUhJUk9fSUVFRTc1NF9IQUNLIDEKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFVTRV9GQVNUX0xPRyAxCitfQUNFT0YKKworCTs7Citwb3dlcnBjKQorCUNQVVRZUEU9Im5vIgorCisJIyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBJRUVFIDc1NCBsYXlvdXQKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgVEFLRUhJUk9fSUVFRTc1NF9IQUNLIDEKK19BQ0VPRgorCisKKwkjIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCBnZXQgZW5hYmxlZCBvbiBhIEc1LiBIT1dUTyBjaGVjayBmb3IgYSBHNT8KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgVVNFX0ZBU1RfTE9HIDEKK19BQ0VPRgorCisJOzsKKyopCisJQ1BVVFlQRT0ibm8iCisJOzsKK2VzYWMKKworIyB3aGljaCB2ZWN0b3IgY29kZSBkbyB3ZSBzdXBwb3J0IHRvIGJ1aWxkIG9uIHRoaXMgbWFjaGluZT8KKyBpZiB0ZXN0ICJ4JHtXSVRIX1hNTX0iID0gInh5ZXMiOyB0aGVuCisgIFdJVEhfWE1NX1RSVUU9CisgIFdJVEhfWE1NX0ZBTFNFPScjJworZWxzZQorICBXSVRIX1hNTV9UUlVFPScjJworICBXSVRIX1hNTV9GQUxTRT0KK2ZpCisKKworIyBuZWVkcyB0byBiZSBkZWZpbmVkIHRvIGxpbmsgaW4gdGhlIGludGVybmFsIHZlY3RvciBsaWIKKyBpZiB0ZXN0ICJ4JHtXSVRIX1ZFQ1RPUn0iID0gInh5ZXMiOyB0aGVuCisgIFdJVEhfVkVDVE9SX1RSVUU9CisgIFdJVEhfVkVDVE9SX0ZBTFNFPScjJworZWxzZQorICBXSVRIX1ZFQ1RPUl9UUlVFPScjJworICBXSVRIX1ZFQ1RPUl9GQUxTRT0KK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIEkgaGF2ZSB0byBidWlsZCB0aGUgaW50ZXJuYWwgdmVjdG9yIGxpYiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIEkgaGF2ZSB0byBidWlsZCB0aGUgaW50ZXJuYWwgdmVjdG9yIGxpYi4uLiAkRUNIT19DIiA+JjY7IH0KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHtXSVRIX1ZFQ1RPUn0iID4mNQorZWNobyAiJHtFQ0hPX1R9JHtXSVRIX1ZFQ1RPUn0iID4mNjsgfQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgRkxPQVQ4IGFzIGZsb2F0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEZMT0FUOCBhcyBmbG9hdC4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1hbGwtZmxvYXQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYWxsX2Zsb2F0K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0kZW5hYmxlX2FsbF9mbG9hdDsgQ09ORklHX0FMTEZMT0FUPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIENPTkZJR19BTExGTE9BVD0ibm8iCitmaQorCitjYXNlICIke0NPTkZJR19BTExGTE9BVH0iIGluCitubykKKwk7OworeWVzKQorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBGTE9BVDggZmxvYXQKK19BQ0VPRgorCisJOzsKKyopCisJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlIO+/vSR7Q09ORklHX0FMTEZMT0FUfe+/vSBmb3IgYWxsLWZsb2F0IG9wdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUg77+9JHtDT05GSUdfQUxMRkxPQVR977+9IGZvciBhbGwtZmxvYXQgb3B0aW9uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHtDT05GSUdfQUxMRkxPQVR9IiA+JjUKK2VjaG8gIiR7RUNIT19UfSR7Q09ORklHX0FMTEZMT0FUfSIgPiY2OyB9CisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm5hc20iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG5hc207IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9OQVNNK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJE5BU00gaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfTkFTTT0iJE5BU00iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9OQVNNPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTkFTTSIgJiYgYWNfY3ZfcGF0aF9OQVNNPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitOQVNNPSRhY19jdl9wYXRoX05BU00KK2lmIHRlc3QgLW4gIiROQVNNIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICROQVNNIiA+JjUKK2VjaG8gIiR7RUNIT19UfSROQVNNIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKK2Nhc2UgIiR7TkFTTX0iIGluCitubykKKwk7OworKikKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYXNzZW1ibGVyIHJvdXRpbmVzIGZvciB0aGlzIHByb2Nlc3NvciB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFzc2VtYmxlciByb3V0aW5lcyBmb3IgdGhpcyBwcm9jZXNzb3IgdHlwZS4uLiAkRUNIT19DIiA+JjY7IH0KKwlmb3IgcmVjdXJzZV9vdmVyIGluICR7QVNNX0ZPUl9BUkNIfQorCWRvCisJCWlmIHRlc3QgIiR7Q1BVVFlQRX0iID0gIiR7cmVjdXJzZV9vdmVyfSI7IHRoZW4KKwkJCWluY2x1ZGVfYXNtX3JvdXRpbmVzPSJ5ZXMiCisJCWZpCisKKwkJY2FzZSAkaG9zdF9vcyBpbgorCQkqZGFyd2luKikKKwkJCSMgY3VycmVudGx5IHdlIGhhdmUgcHJvYmxlbXMgYmVjYXVzZSBvZiBhIHdyb25nCisJCQkjIGxpYnRvb2wgaGFjayBpbiB0aGUgZGFyd2luIGNhc2UgKGZvciBuYXNtIGNvZGUpCisJCQlpbmNsdWRlX2FzbV9yb3V0aW5lcz0ibm8iCisJCQk7OworCQllc2FjCisJZG9uZQorCWlmIHRlc3QgIngke2luY2x1ZGVfYXNtX3JvdXRpbmVzfSIgPSAieHllcyI7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9OQVNNIDEKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIE1NWF9jaG9vc2VfdGFibGUgMQorX0FDRU9GCisKKwllbHNlCisJCWluY2x1ZGVfYXNtX3JvdXRpbmVzPSJubyIKKwkJTkFTTT0ibm8iCisJZmkKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR7aW5jbHVkZV9hc21fcm91dGluZXN9IiA+JjUKK2VjaG8gIiR7RUNIT19UfSR7aW5jbHVkZV9hc21fcm91dGluZXN9IiA+JjY7IH0KKwk7OworZXNhYworIGlmIHRlc3QgIiR7TkFTTX0iICE9ICJubyI7IHRoZW4KKyAgSEFWRV9OQVNNX1RSVUU9CisgIEhBVkVfTkFTTV9GQUxTRT0nIycKK2Vsc2UKKyAgSEFWRV9OQVNNX1RSVUU9JyMnCisgIEhBVkVfTkFTTV9GQUxTRT0KK2ZpCisKKworY2FzZSAkaG9zdF9vcyBpbgorCSpjeWd3aW4qfCptaW5ndzMyKikKKwkJQ1lHV0lOPXllcworCQlOQVNNX0ZPUk1BVD0iLWYgd2luMzIgLURXSU4zMiIKKwkJOzsKKwkqZGFyd2luKikKKwkJTkFTTV9GT1JNQVQ9Ii1mIG1hY2hvIgorCQk7OworCSopCisJCUNZR1dJTj1ubworCQlOQVNNX0ZPUk1BVD0iLWYgZWxmIgorCQk7OworZXNhYworCisjCisjICdleHBvcHQnIGlzIHVzZWQgZm9yICJhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMiLCBub3QgZm9yIG9wdGltaXphdGlvbnMgd2hpY2gKKyMgYXJlIG1hcmtlZCBhcyAiZXhwZXJpbWVudGFsIiBpbiB0aGUgZ3VpZGUgZm9yIHRoZSBjb21waWxlci4KKyMgVGhleSBhcmUgImV4cGVyaW1lbnRhbCIgaGVyZSBpbiB0aGUgTEFNRSBwcm9qZWN0IChhdCBsZWFzdAorIyAiLS1lbmFibGUtZXhwb3B0PWZ1bGwiKS4KKyMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zLi4uICRFQ0hPX0MiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4cG9wdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9leHBvcHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfZXhwb3B0OyBDT05GSUdfRVhQT1BUPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIENPTkZJR19FWFBPUFQ9Im5vIgorZmkKKworCitpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKwkjIGdjYyBkZWZhdWx0cy4gT1Mgc3BlY2lmaWMgb3B0aW9ucyBnbyBpbiB2ZXJzaW91cyBzZWN0aW9ucyBiZWxvdworCSMgZnJvbSB0aGUgZ2NjIG1hbiBwYWdlczogICJ0aGVyZSBpcyBubyByZWFzb24gdG8gdXNlIC1wZWRhbnRpYyIKKwlpZiB0ZXN0ICJ4JHt3aXRoX2dudV9sZH0iID0gInh5ZXMiOyB0aGVuCisJCUNGTEFHUz0iLVdhbGwgLXBpcGUgJHtDRkxBR1N9IgorCWVsc2UKKwkJIyBzb21lIHZlbmRvciBsZCdzIGRvbid0IGxpa2UgJy1waXBlJworCQlDRkxBR1M9Ii1XYWxsICR7Q0ZMQUdTfSIKKwlmaQorCisJIyBHQ0MgdmVyc2lvbiBzcGVjaWZpYyBnZW5lcmljIG9wdGlvbnMKKwljYXNlICIke0dDQ192ZXJzaW9ufSIgaW4KKwkyLjk2KikKKyAgICAgICAgCSMgZm9yIGJ1Z2d5IHZlcnNpb24gb2YgZ2NjIHNoaXBwZWQgd2l0aCBSSDcuMSwgYmFjayBvZiBvbiBzb21lCisgICAgICAgIAkjIG9wdGltaXphdGlvbnMKKyAgICAgICAgCU9QVElNSVpBVElPTj0iLU8gLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZmYXN0LW1hdGggXAorCQkJLWZ1bnJvbGwtbG9vcHMiCisJCU9QVElNSVpBVElPTl9GVUxMPSItZm1vdmUtYWxsLW1vdmFibGVzIC1mcmVkdWNlLWFsbC1naXZzIFwKKwkJCS1mc2NoZWQtaW50ZXJibG9jayAtZmJyYW5jaC1jb3VudC1yZWcgLWZmb3JjZS1hZGRyIFwKKwkJCS1mZm9yY2UtbWVtIgorICAgICAgICAJOzsKKwkzLjAqKQorCQkjIC1mdW5yb2xsLWxvb3BzIHNlZW1zIHRvIHByb2R1Y2UgYnVnZ3kgY29kZSB3aXRoIGdjYyAzLjAuMworCQlPUFRJTUlaQVRJT049Ii1PIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mZmFzdC1tYXRoIgorCQlPUFRJTUlaQVRJT05fRlVMTD0iLWZtb3ZlLWFsbC1tb3ZhYmxlcyAtZnJlZHVjZS1hbGwtZ2l2cyBcCisJCQktZmJyYW5jaC1jb3VudC1yZWcgLWZmb3JjZS1hZGRyIC1mZm9yY2UtbWVtIgorCQk7OworCTMuKnw0LjAuKnw0LjEuKikKKwkJIyAtZm9taXQtZnJhbWUtcG9pbnRlciBzZWVtcyB0byBiZSBidWdneSBvbiBjeWd3aW4KKwkJY2FzZSAke2hvc3Rfb3N9IGluCisJCSpjeWd3aW4qKQorCQkJT01JVF9GUkFNRV9QT0lOVEVSPQorCQkJOzsKKwkJKikKKwkJCU9NSVRfRlJBTUVfUE9JTlRFUj0tZm9taXQtZnJhbWUtcG9pbnRlcgorCQkJOzsKKwkJZXNhYworCisJCU9QVElNSVpBVElPTj0iLU8zICR7T01JVF9GUkFNRV9QT0lOVEVSfSAtZmZhc3QtbWF0aCIKKwkJT1BUSU1JWkFUSU9OX0ZVTEw9Ii1mbW92ZS1hbGwtbW92YWJsZXMgLWZyZWR1Y2UtYWxsLWdpdnMgXAorCQkJLWZicmFuY2gtY291bnQtcmVnIC1mZm9yY2UtYWRkciAtZmZvcmNlLW1lbSIKKwkJOzsKKwk0LiopCisJCU9QVElNSVpBVElPTj0iLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mZmFzdC1tYXRoIgorCQlPUFRJTUlaQVRJT05fRlVMTD0iLWZicmFuY2gtY291bnQtcmVnIC1mZm9yY2UtYWRkciIKKwkJOzsKKwkqKQorCQkjIGRlZmF1bHQKKwkJT1BUSU1JWkFUSU9OPSItTzMgJHtPTUlUX0ZSQU1FX1BPSU5URVJ9IC1mZmFzdC1tYXRoIFwKKwkJCS1mdW5yb2xsLWxvb3BzIgorCQlPUFRJTUlaQVRJT05fRlVMTD0iLWZicmFuY2gtY291bnQtcmVnIC1mZm9yY2UtYWRkciIKKwkJOzsKKwllc2FjCisKKworCSMgR0NDIHZlcnNpb24gaW5kZXBlbmRlbmQgZ2VuZXJpYyBvcHRpb25zCisJT1BUSU1JWkFUSU9OX05PUk09Ii1mc2NoZWR1bGUtaW5zbnMyIgorCisKKwkjIGdlbmVyaWMgQ1BVIHNwZWNpZmljIG9wdGlvbnMKKwljYXNlICR7aG9zdF9jcHV9IGluCisJc3BhcmMpCisJCWNhc2UgIiR7R0NDX3ZlcnNpb259IiBpbgorCQkzLjAqKQorCQkJOzsKKwkJMy4qfDQuKikKKwkJCSMgZG9lc24ndCB3b3JrIG9uIDMuMC54LCBidXQgb24gMy5bMTJdIGFuZAorCQkJIyBob3BlZnVsbHkgb24gZXZlcnkgb3RoZXIgcmVsZWFzZSBhZnRlciB0aGF0IHRvbworCQkJaWYgdGVzdCAteCAvdXNyL2Jpbi9pc2FsaXN0OyB0aGVuCisJCQkJL3Vzci9iaW4vaXNhbGlzdCB8IGdyZXAgc3BhcmN2OHBsdXMgXAorCQkJCQk+L2Rldi9udWxsIDI+JjEgJiYgXAorCQkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSBcCisJCQkJCQktbWNwdT11bHRyYXNwYXJjIFwKKwkJCQkJCS1tdHVuZT11bHRyYXNwYXJjIgorCQkJZmkKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwkqODYpCisJCWNhc2UgIiR7R0NDX3ZlcnNpb259IiBpbgorCQkzLip8NC4qKQorCQkJT1BUSU1JWkFUSU9OPSIke09QVElNSVpBVElPTn0gXAorCQkJCS1tYWNjdW11bGF0ZS1vdXRnb2luZy1hcmdzIgorCQkJOzsKKwkJZXNhYworCQk7OworCWVzYWMKKworCWV4cG9wdF9tc2dfcmVzdWx0X3ByaW50ZWQ9bm8KKwljYXNlICIke0NPTkZJR19FWFBPUFR9IiBpbgorCW5vKQorCQkjIGlmIHNvbWVvbmUgc3VwcGxpZXMgb3duIENGTEFHUywgd2UgZG9uJ3QgYWRkIG91ciBvd24KKwkJaWYgdGVzdCAieCR7YWNfc2F2ZV9DRkxBR1N9IiAhPSAieCI7IHRoZW4KKwkJCU9QVElNSVpBVElPTj0iIgorCQlmaQorCQk7OworCW5vcm18eWVzKQorCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAke09QVElNSVpBVElPTl9OT1JNfSIKKwkJOzsKKwlmdWxsKQorCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAke09QVElNSVpBVElPTl9OT1JNfSBcCisJCQkke09QVElNSVpBVElPTl9GVUxMfSIKKworCQkjIHNvbWUgaGFyZHdhcmUgZGVwZW5kZW5kIG9wdGlvbnMKKwkJY2FzZSAiJHtHQ0NfdmVyc2lvbn0iIGluCisJCTIuOSp8My4qfDQuMC4qfDQuMS4qKQorCQkJIyAibmV3IiBHQ0MsIHVzZSBzb21lICJuZXciIENQVSBzcGVjaWZpYyBvcHRpbWl6YXRpb25zCisJCQljYXNlICR7aG9zdF9jcHV9IGluCisJCQkqNDg2KQorCQkJCU9QVElNSVpBVElPTj0iJHtPUFRJTUlaQVRJT059IC1tY3B1PWk0ODYgXAorCQkJCQktbWZhbmN5LW1hdGgtMzg3IgorCQkJCTs7CisJCQkqNTg2KQorCQkJCU9QVElNSVpBVElPTj0iJHtPUFRJTUlaQVRJT059IC1tY3B1PXBlbnRpdW0gXAorCQkJCQktbWFyY2g9cGVudGl1bSAtbWZhbmN5LW1hdGgtMzg3IgorCQkJCTs7CisJCQkqNjg2KQorCQkJCU9QVElNSVpBVElPTj0iJHtPUFRJTUlaQVRJT059IC1tY3B1PXBlbnRpdW1wcm8gXAorCQkJCQktbWFyY2g9cGVudGl1bXBybyAtbWZhbmN5LW1hdGgtMzg3IFwKKwkJCQkJLW1hbGlnbi1kb3VibGUiCisJCQkJOzsKKwkJCSo4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWZhbmN5LW1hdGgtMzg3IgorCQkJCTs7CisJCQlhbHBoYSopCisJCQkJT1BUSU1JWkFUSU9OPSIke09QVElNSVpBVElPTn0gLW1mcC1yZWdzIgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBGTE9BVCBkb3VibGUKK19BQ0VPRgorCisJCQkJIyBhZGQgIi1tY3B1PTIxMTY0YSAtV2EsLW0yMTE2NGEiIHRvIG9wdGltaXplCisJCQkJIyBmb3IgMjExNjRhIChldjU2KSBDUFUKKwkJCQk7OworCQkJKikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtZmRlbGF5ZWQtYnJhbmNoIgorCQkJCTs7CisJCQllc2FjCisJCQk7OworCQk0LiopCisJCQljYXNlICR7aG9zdF9jcHV9IGluCisJCQkqNDg2KQorCQkJCU9QVElNSVpBVElPTj0iJHtPUFRJTUlaQVRJT059IC1tYXJjaD1pNDg2IgorCQkJCTs7CisJCQkqNTg2KQorCQkJCU9QVElNSVpBVElPTj0iJHtPUFRJTUlaQVRJT059IC1tYXJjaD1pNTg2IFwKKwkJCQkJLW10dW5lPW5hdGl2ZSIKKwkJCQk7OworCQkJKjY4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWFyY2g9aTY4NiBcCisJCQkJCS1tdHVuZT1uYXRpdmUiCisJCQkJOzsKKwkJCSo4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWFyY2g9Z2VuZXJpYyBcCisJCQkJCS1tdHVuZT1uYXRpdmUiCisJCQkJOzsKKwkJCWVzYWMKKwkJCTs7CisJCSopCisJCQkjIG5vIHNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvdGhlciB2ZXJzaW9ucworCQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisJCQlleHBvcHRfbXNnX3Jlc3VsdF9wcmludGVkPXllcworCQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogTEFNRSBkb2Vzbid0IGtub3cgYWJvdXQgeW91ciB2ZXJzaW9uICgke0dDQ192ZXJzaW9ufSkgb2YgZ2NjIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogTEFNRSBkb2Vzbid0IGtub3cgYWJvdXQgeW91ciB2ZXJzaW9uICgke0dDQ192ZXJzaW9ufSkgb2YgZ2NjIiA+JjI7fQorCQkJOzsKKwkJZXNhYworCQk7OworCSopCisJCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSDvv70ke0NPTkZJR19FWFBPUFR977+9IGZvciBleHBvcHQgb3B0aW9uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSDvv70ke0NPTkZJR19FWFBPUFR977+9IGZvciBleHBvcHQgb3B0aW9uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJCTs7CisJZXNhYworCisJaWYgdGVzdCAiJHtleHBvcHRfbXNnX3Jlc3VsdF9wcmludGVkfSIgPSAibm8iIDsgdGhlbgorCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR7Q09ORklHX0VYUE9QVH0iID4mNQorZWNobyAiJHtFQ0hPX1R9JHtDT05GSUdfRVhQT1BUfSIgPiY2OyB9CisJZmkKK2Vsc2UKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRlYnVnIG9wdGlvbnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZGVidWcgb3B0aW9ucy4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9kZWJ1ZzsgQ09ORklHX0RFQlVHPSIke2VuYWJsZXZhbH0iCitlbHNlCisgIENPTkZJR19ERUJVRz0ibm8iCitmaQorCisKK2lmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorCURFQlVHX05PUk1fT1BUPSItTyAtZyAtV2FsbCIKKwlERUJVR19BTk9ZSU5HPSItV2JhZC1mdW5jdGlvbi1jYXN0IC1XY2FzdC1hbGlnbiBcCisJCS1XY2FzdC1xdWFsIC1XY2hhci1zdWJzY3JpcHRzIC1XY29udmVyc2lvbiBcCisJCS1XbWlzc2luZy1wcm90b3R5cGVzIC1XbmVzdGVkLWV4dGVybnMgLVdwb2ludGVyLWFyaXRoIFwKKwkJLVdyZWR1bmRhbnQtZGVjbHMgLVdzaGFkb3cgLVdzdHJpY3QtcHJvdG90eXBlcyBcCisJCS1Xd3JpdGUtc3RyaW5ncyAtV2lubGluZSBcCisJCS1XZm9ybWF0IC1Xc3dpdGNoIC1XYWdncmVnYXRlLXJldHVybiAtV21pc3Npbmctbm9yZXR1cm4gXAorCQktV2ltcGxpY2l0LWludCAtZm5vLWJ1aWx0aW4iCisKKwljYXNlICIke0NPTkZJR19ERUJVR30iIGluCisJbm8pCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIE5ERUJVRyAxCitfQUNFT0YKKworCQk7OworCW5vcm18eWVzKQorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBBQk9SVEZQIDEKK19BQ0VPRgorCisJCU9QVElNSVpBVElPTj0iJHtERUJVR19OT1JNX09QVH0iCisJCTs7CisJYW5veWluZykKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgQUJPUlRGUCAxCitfQUNFT0YKKworCQlPUFRJTUlaQVRJT049IiR7REVCVUdfTk9STV9PUFR9ICR7REVCVUdfQU5PWUlOR30iCisJCTs7CisJYWxvdCkKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgQUJPUlRGUCAxCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBERUJVRyAxCitfQUNFT0YKKworCQlPUFRJTUlaQVRJT049IiR7REVCVUdfTk9STV9PUFR9IgorCQk7OworCSopCisJCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSDvv70ke0NPTkZJR19ERUJVR33vv70gZm9yIGRlYnVnIG9wdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUg77+9JHtDT05GSUdfREVCVUd977+9IGZvciBkZWJ1ZyBvcHRpb24iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwllc2FjCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR7Q09ORklHX0RFQlVHfSIgPiY1CitlY2hvICIke0VDSE9fVH0ke0NPTkZJR19ERUJVR30iID4mNjsgfQorZWxzZQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTElOVVggb24gRGlnaXRhbC9Db21wYXEgQWxwaGEgQ1BVcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Nhc2UgJGhvc3QgaW4KK2FscGhhKi0qLWxpbnV4KikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBDaGVjayBpZiAnY2NjJyBpcyBpbiBvdXIgcGF0aAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiYHdoaWNoIGNjYyAyPi9kZXYvbnVsbCB8IGdyZXAgLWMgY2NjYCIgIT0gIjAiIDsgdGhlbgorCSMgQ29tcGFxJ3MgQyBDb21waWxlcgorCUNDPWNjYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIHNldCAnT1BUSU1JWkFUSU9OID0gLWFyY2ggaG9zdCAtdHVuZSBob3N0JworIyMjIyAgICAgICAgICAgICAgdG8gZ2VuZXJhdGUvdHVuZSBpbnN0cnVjdGlvbnMgZm9yIHRoaXMgbWFjaGluZQorIyMjIyAgICAgJ09QVElNSVpBVElPTiArPSAtbWlncmF0ZSAtZmFzdCAtaW5saW5lIHNwZWVkIC11bnJvbGwgMCcKKyMjIyMgICAgICAgICAgICAgIHR3ZWFrIHRvIHJ1biBhcyBmYXN0IGFzIHBvc3NpYmxlIDopCisjIyMjICAgICAnT1BUSU1JWkFUSU9OICs9IC13MCcKKyMjIyMgICAgICAgICAgICAgIHNldCB3YXJuaW5nIGFuZCBsaW5raW5nIGZsYWdzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJT1BUSU1JWkFUSU9OPSItYXJjaCBob3N0IC10dW5lIGhvc3QiCisJT1BUSU1JWkFUSU9OPSItbWlncmF0ZSAtZmFzdCAtaW5saW5lIHNwZWVkIC11bnJvbGwgMCAkT1BUSU1JWkFUSU9OIgorCU9QVElNSVpBVElPTj0iLXcwICRPUFRJTUlaQVRJT04iCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyB0byBkZWJ1ZywgdW5jb21tZW50CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBGb3IgRGVidWdnaW5nCisJI09QVElNSVpBVElPTj0iLWczICRPUFRJTUlaQVRJT04iCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMgZGVmaW5lIF9fREVDQUxQSEFfXyAoaSB3YXMgZ2V0dGluZyByZS1kZWNsYXJhdGlvbiB3YXJuaW5ncworIyMjIyAgIGluIG1hY2hpbmUuaAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSMgRGVmaW5lIERFQyBBbHBoYQorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBfX0RFQ0FMUEhBX18gMQorX0FDRU9GCisKK2ZpICAjICBnY2Mgb3IgY2NjPworOzsgIyBhbHBoYQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFN1bk9TCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3BhcmMtKi1zdW5vczQqKQorCWlmIHRlc3QgQ0MgPSAiY2MiOyB0aGVuCisJCU9QVElNSVpBVElPTj0iLU8gLXhDQyIKKwkJTUFLRURFUD0iLXhNIgorCQkjIGZvciBnY2MsIHVzZSBpbnN0ZWFkOgorCQkjICAgQ0M9ImdjYyIKKwkJIyAgIE9QVElNSVpBVElPTj0iLU8iCisJCSMgICBNQUtFREVQPSItTSIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFBsZWFzZSBjb250YWN0IGxhbWVAbGlzdHMuc291cmNlZm9yZ2UubmV0IHdpdGggdGhlIG91dHB1dCBvZiB0aGUgY29uZmlndXJlIHJ1biBhbmQgdGhlIGZpbGUgY29uZmlnLmNhY2hlLiBUaGFuayB5b3UgZm9yIHlvdXIgY29vcGVyYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogUGxlYXNlIGNvbnRhY3QgbGFtZUBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb25maWd1cmUgcnVuIGFuZCB0aGUgZmlsZSBjb25maWcuY2FjaGUuIFRoYW5rIHlvdSBmb3IgeW91ciBjb29wZXJhdGlvbi4iID4mMjt9CisJZmkKKzs7ICNTdW5PUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTR0kKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisqLXNnaS1pcml4KikKKwlpZiB0ZXN0IENDID0gImNjIjsgdGhlbgorCQlPUFRJTUlaQVRJT049Ii1PMyAtd29mZiBhbGwiCisJZmkKKzs7ICMgU0dJCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBhcSBBbHBoYSBydW5uaW5nIERlYyBVbml4IChPU0YpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYWxwaGEqLWRlYy1vc2YqKQorCWlmIHRlc3QgQ0MgPSAiY2MiOyB0aGVuCisJCU9QVElNSVpBVElPTj0iLWZhc3QgLU8zIC1zdGQgLWczIC1ub25fc2hhcmVkIgorCWZpCis7OyAjT1NGCitlc2FjCisKKyMgdG9kbzogaW5jbHVkZSB0aGUgZm9sbG93aW5nIHRlc3RzIGluIHRoZSBjYXNlLWxpc3QKK1VOQU1FPWB1bmFtZWAKK0FSQ0g9YHVuYW1lIC1tYAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTU9TWFMgKFJoYXBzb2R5IFBQQykKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiJFVOQU1FIiA9ICJSaGFwc29keSI7IHRoZW4KKyMgICBDQz0iY2MiICAgIyBzaG91bGQgYmUgaGFuZGxlZCBhbHJlYWR5IGJ5IGF1dG9jb25mCisgICBNQUtFREVQPSItbWFrZSIKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNQUMgT1NYICBEYXJ3aW4gUFBDCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIHRlc3QgIiRVTkFNRSIgPSAiRGFyd2luIjsgdGhlbgorICAgTUFLRURFUD0iLW1ha2UiCisgICBDRkxBR1M9IiRDRkxBR1MgLWZuby1jb21tb24iCitmaQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9TLzIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByb3Blcmx5IGluc3RhbGxlZCBFTVggcnVudGltZSAmIGRldmVsb3BtZW50IHBhY2thZ2UgaXMgYSBwcmVyZXF1aXNpdGUuCisjIHRvb2xzIEkgdXNlZDogbWFrZSAzLjc2LjEsIHVuYW1lIDEuMTIsIHNlZCAyLjA1LCBQRC1rc2ggNS4yLjEzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiJFVOQU1FIiA9ICJPUy8yIjsgdGhlbgorICAgU0hFTEw9c2gKKyAgICNDQz1nY2MgIyBzaG91bGQgYWxyZWFkeSBiZSBoYW5kbGVkIGJ5IGNvbmZpZ3VyZQorCisgICAjIGZpbGUgZXh0ZW5zaW9uIHNob3VsZCBhbHJlYWR5IGJlIGhhbmRsZWQgYnkgYXV0b21ha2UgKEkgZG9uJ3Qga25vdywKKyAgICMgcGxlYXNlICBnaXZlIGZlZWRiYWNrIQorICAgI0ZJTEVfRVhURU5TSU9OPSIuZXhlIgorCisjIFVuY29tbWVudCAmIGluc3BlY3QgdGhlIEdUSyBsaW5lcyB0byB1c2UgTVAzeCBHVEsgZnJhbWUgYW5hbHl6ZXIuCisjIFByb3Blcmx5IGluc3RhbGxlZCBYRnJlZTg2L2RldmxpYnMgJiBHVEsrIGlzIGEgcHJlcmVxdWlzaXRlLgorIyBUaGUgZm9sbG93aW5nIHdvcmtzIGZvciBtZSB1c2luZyBYZnJlZTg2L09TMiAzLjMuNSBhbmQgR1RLKyAxLjIuMzoKKyMgICBBQ19ERUZJTkUoSEFWRV9HVEssIDEsIGhhdmUgR1RLKQorIyAgIEFDX0RFRklORShfX1NUX01UX0VSUk5PX18sIDEpCisjICAgSU5DTFVERVM9Ii1JQzovWEZyZWU4Ni9pbmNsdWRlL2d0azEyIC1JQzovWEZyZWU4Ni9pbmNsdWRlL2dsaWIxMiBcCisjICAgICAgICAgICAgIC1JQzovWEZyZWU4Ni9pbmNsdWRlICRJTkNMVURFUyIKKyMgICBGUk9OVEVORF9MREZMQUdTPSItTEM6L1hGcmVlODYvbGliIC1sZ3RrMTIgLWxnZGsxMiAtbGdtb2R1bGUgLWxnbGliMTIgXAorIyAgICAgICAgICAgICAtbFhleHQgLWxYMTEgLWxzaG0gLWxic2QgLWxzb2NrZXQgLWxtICRGUk9OVEVORF9MREZMQUdTIgorIyAgIEZST05URU5EX0NGTEFHUz0iLVptdGQgLVpzeXN2LXNpZ25hbHMgLVpiaW4tZmlsZXMgJEZST05URU5EX0NGTEFHUyIKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBbWlnYU9TCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHlwZSAnTWFrZSBBUkNIPVBQQycgZm9yIFBvd2VyVVAgYW5kICdNYWtlIEFSQ0g9V09TJyBmb3IgV2FycE9TCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIHRlc3QgIiRVTkFNRSIgPSAiQW1pZ2FPUyIgOyB0aGVuCisJQ0M9ImdjYyAtbm9peGVtdWwiCisJT1BUSU1JWkFUSU9OPSIkT1BUSU1JWkFUSU9OIC1tNjgwMjAtNjAgLW02ODg4MSIKKwlNQUtFREVQPSItTU0iCisJaWYgdGVzdCAiJEFSQ0giID0gIldPUyI7IHRoZW4KKwkJQ0M9InBwYy1hbWlnYW9zLWdjYyAtd2FycHVwIgorCQlPUFRJTUlaQVRJT049IiRPUFRJTUlaQVRJT04gLW1tdWx0aXBsZSAtbWNwdT02MDNlIgorCQlBUj0icHBjLWFtaWdhb3MtYXIiCisJCVJBTkxJQj0icHBjLWFtaWdhb3MtcmFubGliIgorCWZpCisJaWYgdGVzdCAiJEFSQ0giLFBQQzsgdGhlbgorCQlDQz0icHBjLWFtaWdhb3MtZ2NjIgorCQlPUFRJTUlaQVRJT049IiRPUFRJTUlaQVRJT04gLW1tdWx0aXBsZSAtbWNwdT02MDNlIgorCQlBUj0icHBjLWFtaWdhb3MtYXIiCisJCVJBTkxJQj0icHBjLWFtaWdhb3MtcmFubGliIgorCWZpCitmaQorCisKK0NGTEFHUz0iJHtPUFRJTUlaQVRJT059ICR7Q0ZMQUdTfSIKK0xEQUREPSIke0xEQUREfSIKK0ZST05URU5EX0xEQUREPSIke0ZST05URU5EX0xEQUREfSAke0NPTkZJR19NQVRIX0xJQn0iCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUgbGlibXAzbGFtZS9NYWtlZmlsZSBsaWJtcDNsYW1lL2kzODYvTWFrZWZpbGUgbGlibXAzbGFtZS92ZWN0b3IvTWFrZWZpbGUgZnJvbnRlbmQvTWFrZWZpbGUgbXBnbGliL01ha2VmaWxlIGRvYy9NYWtlZmlsZSBkb2MvaHRtbC9NYWtlZmlsZSBkb2MvbWFuL01ha2VmaWxlIGluY2x1ZGUvTWFrZWZpbGUgRGxsL01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgZGViaWFuL01ha2VmaWxlIGRzaG93L01ha2VmaWxlIEFDTS9NYWtlZmlsZSBBQ00vQURiZy9NYWtlZmlsZSBBQ00vZGRrL01ha2VmaWxlIEFDTS90aW55eG1sL01ha2VmaWxlIGxhbWUuc3BlYyBtYWMvTWFrZWZpbGUgbWFjb3N4L01ha2VmaWxlIG1hY29zeC9FbmdsaXNoLmxwcm9qL01ha2VmaWxlIG1hY29zeC9MQU1FLnhjb2RlcHJvai9NYWtlZmlsZSB2Y19zb2x1dGlvbi9NYWtlZmlsZSIKKworCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAorIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICAqKSAkYXNfdW5zZXQgJGFjX3ZhciA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKSB8CisgIHNlZCAnCisgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorICAgICB0IGNsZWFyCisgICAgIDpjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6ZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKKyAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgorICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKyAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKK2lmIHRlc3QgLXogIiR7TUFJTlRBSU5FUl9NT0RFX1RSVUV9IiAmJiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9GQUxTRX0iOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiTUFJTlRBSU5FUl9NT0RFXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJNQUlOVEFJTkVSX01PREVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoraWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDWFhfRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ1hYXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENYWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoraWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiR7TElCX1dJVEhfREVDT0RFUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtMSUJfV0lUSF9ERUNPREVSX0ZBTFNFfSI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJMSUJfV0lUSF9ERUNPREVSXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJMSUJfV0lUSF9ERUNPREVSXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitpZiB0ZXN0IC16ICIke1dJVEhfQlJISVNUX1RSVUV9IiAmJiB0ZXN0IC16ICIke1dJVEhfQlJISVNUX0ZBTFNFfSI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJXSVRIX0JSSElTVFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiV0lUSF9CUkhJU1RcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiR7V0lUSF9YTU1fVFJVRX0iICYmIHRlc3QgLXogIiR7V0lUSF9YTU1fRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcIldJVEhfWE1NXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJXSVRIX1hNTVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoraWYgdGVzdCAteiAiJHtXSVRIX1ZFQ1RPUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtXSVRIX1ZFQ1RPUl9GQUxTRX0iOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiV0lUSF9WRUNUT1JcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIldJVEhfVkVDVE9SXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitpZiB0ZXN0IC16ICIke0hBVkVfTkFTTV9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX05BU01fRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcIkhBVkVfTkFTTVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiSEFWRV9OQVNNXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2RlYnVnPWZhbHNlCithY19jc19yZWNoZWNrPWZhbHNlCithY19jc19zaWxlbnQ9ZmFsc2UKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgorICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKK2VzYWMKKworZmkKKworCisKKworIyBQQVRIIG5lZWRzIENSCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorYXNfbmw9JworJworSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorY2FzZSAkMCBpbgorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICB7IChleGl0IDEpOyBleGl0IDE7IH0KK2ZpCisKKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorZm9yIGFzX3ZhciBpbiBFTlYgTUFJTCBNQUlMUEFUSAorZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKK2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQ0RQQVRILgorJGFzX3Vuc2V0IENEUEFUSAorCisKKworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgeworCisgICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KKyAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQorICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKKyAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKKyAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcworICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCisgICMgY2FzZSBhdCBsaW5lIGVuZC4KKyAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCisgICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQorICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBzZWQgLW4gJworICAgIHAKKyAgICAvWyRdTElORU5PLz0KKyAgJyA8JGFzX215c2VsZiB8CisgICAgc2VkICcKKyAgICAgIHMvWyRdTElORU5PLiovJi0vCisgICAgICB0IGxpbmVubworICAgICAgYgorICAgICAgOmxpbmVubworICAgICAgTgorICAgICAgOmxvb3AKKyAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLworICAgICAgdCBsb29wCisgICAgICBzLy1cbi4qLy8KKyAgICAnID4kYXNfbWUubGluZW5vICYmCisgIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisgIC4gIi4vJGFzX21lLmxpbmVubyIKKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluCistbiopCisgIGNhc2UgYGVjaG8gJ3hcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICAqKSAgIEVDSE9fQz0nXGMnOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpcgorZmkKK2VjaG8gPmNvbmYkJC5maWxlCitpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbG5fcz0nbG4gLXMnCisgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgYXNfbG5fcz0nY3AgLXAnCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc190ZXN0X3g9J3Rlc3QgLXgnCitlbHNlCisgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGFzX2xzX0xfb3B0aW9uPUwKKyAgZWxzZQorICAgIGFzX2xzX0xfb3B0aW9uPQorICBmaQorICBhc190ZXN0X3g9JworICAgIGV2YWwgc2ggLWMgJ1wnJworICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCisgICAgICAgIHRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4KKyAgICAgICAgLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworZXhlYyA2PiYxCisKKyMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJFswXSBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBsYW1lICRhc19tZSAzLjk4LjQsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisiCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKK2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZQorY3VycmVudCBjb25maWd1cmF0aW9uLgorCitVc2FnZTogJDAgW09QVElPTlNdIFtGSUxFXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0ICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCisgIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKwkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCisgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQorCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGhlYWRlcnM6CiskY29uZmlnX2hlYWRlcnMKKworQ29uZmlndXJhdGlvbiBjb21tYW5kczoKKyRjb25maWdfY29tbWFuZHMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKK2FjX2NzX3ZlcnNpb249IlxcCitsYW1lIGNvbmZpZy5zdGF0dXMgMy45OC40Citjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEsCisgIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCisKK0NvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKworYWNfcHdkPSckYWNfcHdkJworc3JjZGlyPSckc3JjZGlyJworSU5TVEFMTD0nJElOU1RBTEwnCitNS0RJUl9QPSckTUtESVJfUCcKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgICopCisgICAgYWNfb3B0aW9uPSQxCisgICAgYWNfb3B0YXJnPSQyCisgICAgYWNfc2hpZnQ9c2hpZnQKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGFjX2NzX3JlY2hlY2s9OiA7OworICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCisgICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCisgICAgYWNfY3Nfc2lsZW50PTogOzsKKworICAjIFRoaXMgaXMgYW4gZXJyb3IuCisgIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIgorICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7CisKKyAgZXNhYworICBzaGlmdAorZG9uZQorCithY19jb25maWd1cmVfZXh0cmFfYXJncz0KKworaWYgJGFjX2NzX3NpbGVudDsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCisgIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMICRTSEVMTCAkMCAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIENPTkZJR19TSEVMTD0kU0hFTEwKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICBleGVjICRTSEVMTCAiJDAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKKyAgZWNobyAiJGFjX2xvZyIKK30gPiY1CisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMKKyMgSU5JVC1DT01NQU5EUworIworQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCitkbworICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisgICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworICAgICJsaWJtcDNsYW1lL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYm1wM2xhbWUvTWFrZWZpbGUiIDs7CisgICAgImxpYm1wM2xhbWUvaTM4Ni9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWJtcDNsYW1lL2kzODYvTWFrZWZpbGUiIDs7CisgICAgImxpYm1wM2xhbWUvdmVjdG9yL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYm1wM2xhbWUvdmVjdG9yL01ha2VmaWxlIiA7OworICAgICJmcm9udGVuZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBmcm9udGVuZC9NYWtlZmlsZSIgOzsKKyAgICAibXBnbGliL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1wZ2xpYi9NYWtlZmlsZSIgOzsKKyAgICAiZG9jL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRvYy9NYWtlZmlsZSIgOzsKKyAgICAiZG9jL2h0bWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZG9jL2h0bWwvTWFrZWZpbGUiIDs7CisgICAgImRvYy9tYW4vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZG9jL21hbi9NYWtlZmlsZSIgOzsKKyAgICAiaW5jbHVkZS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpbmNsdWRlL01ha2VmaWxlIiA7OworICAgICJEbGwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgRGxsL01ha2VmaWxlIiA7OworICAgICJtaXNjL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1pc2MvTWFrZWZpbGUiIDs7CisgICAgImRlYmlhbi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkZWJpYW4vTWFrZWZpbGUiIDs7CisgICAgImRzaG93L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRzaG93L01ha2VmaWxlIiA7OworICAgICJBQ00vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgQUNNL01ha2VmaWxlIiA7OworICAgICJBQ00vQURiZy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBBQ00vQURiZy9NYWtlZmlsZSIgOzsKKyAgICAiQUNNL2Rkay9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBBQ00vZGRrL01ha2VmaWxlIiA7OworICAgICJBQ00vdGlueXhtbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBBQ00vdGlueXhtbC9NYWtlZmlsZSIgOzsKKyAgICAibGFtZS5zcGVjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxhbWUuc3BlYyIgOzsKKyAgICAibWFjL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1hYy9NYWtlZmlsZSIgOzsKKyAgICAibWFjb3N4L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1hY29zeC9NYWtlZmlsZSIgOzsKKyAgICAibWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUiIDs7CisgICAgIm1hY29zeC9MQU1FLnhjb2RlcHJvai9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBtYWNvc3gvTEFNRS54Y29kZXByb2ovTWFrZWZpbGUiIDs7CisgICAgInZjX3NvbHV0aW9uL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHZjX3NvbHV0aW9uL01ha2VmaWxlIiA7OworCisgICopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKKyMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorJGRlYnVnIHx8Cit7CisgIHRtcD0KKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgeyB0ZXN0IC16ICIkdG1wIiB8fCB0ZXN0ICEgLWQgIiR0bXAiIHx8IHJtIC1mciAiJHRtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKK30gfHwKK3sKKyAgIGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH0KK30KKworIworIyBTZXQgdXAgdGhlIHNlZCBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMKKworIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKK2lmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCisKK19BQ0VPRgorCisKKworYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworICBjYXQgPmNvbmYkJHN1YnMuc2VkIDw8X0FDRU9GCitTSEVMTCEkU0hFTEwkYWNfZGVsaW0KK1BBVEhfU0VQQVJBVE9SISRQQVRIX1NFUEFSQVRPUiRhY19kZWxpbQorUEFDS0FHRV9OQU1FISRQQUNLQUdFX05BTUUkYWNfZGVsaW0KK1BBQ0tBR0VfVEFSTkFNRSEkUEFDS0FHRV9UQVJOQU1FJGFjX2RlbGltCitQQUNLQUdFX1ZFUlNJT04hJFBBQ0tBR0VfVkVSU0lPTiRhY19kZWxpbQorUEFDS0FHRV9TVFJJTkchJFBBQ0tBR0VfU1RSSU5HJGFjX2RlbGltCitQQUNLQUdFX0JVR1JFUE9SVCEkUEFDS0FHRV9CVUdSRVBPUlQkYWNfZGVsaW0KK2V4ZWNfcHJlZml4ISRleGVjX3ByZWZpeCRhY19kZWxpbQorcHJlZml4ISRwcmVmaXgkYWNfZGVsaW0KK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUhJHByb2dyYW1fdHJhbnNmb3JtX25hbWUkYWNfZGVsaW0KK2JpbmRpciEkYmluZGlyJGFjX2RlbGltCitzYmluZGlyISRzYmluZGlyJGFjX2RlbGltCitsaWJleGVjZGlyISRsaWJleGVjZGlyJGFjX2RlbGltCitkYXRhcm9vdGRpciEkZGF0YXJvb3RkaXIkYWNfZGVsaW0KK2RhdGFkaXIhJGRhdGFkaXIkYWNfZGVsaW0KK3N5c2NvbmZkaXIhJHN5c2NvbmZkaXIkYWNfZGVsaW0KK3NoYXJlZHN0YXRlZGlyISRzaGFyZWRzdGF0ZWRpciRhY19kZWxpbQorbG9jYWxzdGF0ZWRpciEkbG9jYWxzdGF0ZWRpciRhY19kZWxpbQoraW5jbHVkZWRpciEkaW5jbHVkZWRpciRhY19kZWxpbQorb2xkaW5jbHVkZWRpciEkb2xkaW5jbHVkZWRpciRhY19kZWxpbQorZG9jZGlyISRkb2NkaXIkYWNfZGVsaW0KK2luZm9kaXIhJGluZm9kaXIkYWNfZGVsaW0KK2h0bWxkaXIhJGh0bWxkaXIkYWNfZGVsaW0KK2R2aWRpciEkZHZpZGlyJGFjX2RlbGltCitwZGZkaXIhJHBkZmRpciRhY19kZWxpbQorcHNkaXIhJHBzZGlyJGFjX2RlbGltCitsaWJkaXIhJGxpYmRpciRhY19kZWxpbQorbG9jYWxlZGlyISRsb2NhbGVkaXIkYWNfZGVsaW0KK21hbmRpciEkbWFuZGlyJGFjX2RlbGltCitERUZTISRERUZTJGFjX2RlbGltCitFQ0hPX0MhJEVDSE9fQyRhY19kZWxpbQorRUNIT19OISRFQ0hPX04kYWNfZGVsaW0KK0VDSE9fVCEkRUNIT19UJGFjX2RlbGltCitMSUJTISRMSUJTJGFjX2RlbGltCitidWlsZF9hbGlhcyEkYnVpbGRfYWxpYXMkYWNfZGVsaW0KK2hvc3RfYWxpYXMhJGhvc3RfYWxpYXMkYWNfZGVsaW0KK3RhcmdldF9hbGlhcyEkdGFyZ2V0X2FsaWFzJGFjX2RlbGltCitidWlsZCEkYnVpbGQkYWNfZGVsaW0KK2J1aWxkX2NwdSEkYnVpbGRfY3B1JGFjX2RlbGltCitidWlsZF92ZW5kb3IhJGJ1aWxkX3ZlbmRvciRhY19kZWxpbQorYnVpbGRfb3MhJGJ1aWxkX29zJGFjX2RlbGltCitob3N0ISRob3N0JGFjX2RlbGltCitob3N0X2NwdSEkaG9zdF9jcHUkYWNfZGVsaW0KK2hvc3RfdmVuZG9yISRob3N0X3ZlbmRvciRhY19kZWxpbQoraG9zdF9vcyEkaG9zdF9vcyRhY19kZWxpbQorSU5TVEFMTF9QUk9HUkFNISRJTlNUQUxMX1BST0dSQU0kYWNfZGVsaW0KK0lOU1RBTExfU0NSSVBUISRJTlNUQUxMX1NDUklQVCRhY19kZWxpbQorSU5TVEFMTF9EQVRBISRJTlNUQUxMX0RBVEEkYWNfZGVsaW0KK2FtX19pc3JjISRhbV9faXNyYyRhY19kZWxpbQorQ1lHUEFUSF9XISRDWUdQQVRIX1ckYWNfZGVsaW0KK1BBQ0tBR0UhJFBBQ0tBR0UkYWNfZGVsaW0KK1ZFUlNJT04hJFZFUlNJT04kYWNfZGVsaW0KK0FDTE9DQUwhJEFDTE9DQUwkYWNfZGVsaW0KK0FVVE9DT05GISRBVVRPQ09ORiRhY19kZWxpbQorQVVUT01BS0UhJEFVVE9NQUtFJGFjX2RlbGltCitBVVRPSEVBREVSISRBVVRPSEVBREVSJGFjX2RlbGltCitNQUtFSU5GTyEkTUFLRUlORk8kYWNfZGVsaW0KK2luc3RhbGxfc2ghJGluc3RhbGxfc2gkYWNfZGVsaW0KK1NUUklQISRTVFJJUCRhY19kZWxpbQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNISRJTlNUQUxMX1NUUklQX1BST0dSQU0kYWNfZGVsaW0KK21rZGlyX3AhJG1rZGlyX3AkYWNfZGVsaW0KK0FXSyEkQVdLJGFjX2RlbGltCitTRVRfTUFLRSEkU0VUX01BS0UkYWNfZGVsaW0KK2FtX19sZWFkaW5nX2RvdCEkYW1fX2xlYWRpbmdfZG90JGFjX2RlbGltCitBTVRBUiEkQU1UQVIkYWNfZGVsaW0KK2FtX190YXIhJGFtX190YXIkYWNfZGVsaW0KK2FtX191bnRhciEkYW1fX3VudGFyJGFjX2RlbGltCitNQUlOVEFJTkVSX01PREVfVFJVRSEkTUFJTlRBSU5FUl9NT0RFX1RSVUUkYWNfZGVsaW0KK01BSU5UQUlORVJfTU9ERV9GQUxTRSEkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJGFjX2RlbGltCitNQUlOVCEkTUFJTlQkYWNfZGVsaW0KK2FtX19pbmNsdWRlISRhbV9faW5jbHVkZSRhY19kZWxpbQorYW1fX3F1b3RlISRhbV9fcXVvdGUkYWNfZGVsaW0KK0NDISRDQyRhY19kZWxpbQorQ0ZMQUdTISRDRkxBR1MkYWNfZGVsaW0KK0xERkxBR1MhJExERkxBR1MkYWNfZGVsaW0KK0NQUEZMQUdTISRDUFBGTEFHUyRhY19kZWxpbQorYWNfY3RfQ0MhJGFjX2N0X0NDJGFjX2RlbGltCitFWEVFWFQhJEVYRUVYVCRhY19kZWxpbQorT0JKRVhUISRPQkpFWFQkYWNfZGVsaW0KK0RFUERJUiEkREVQRElSJGFjX2RlbGltCitBTURFUF9UUlVFISRBTURFUF9UUlVFJGFjX2RlbGltCitBTURFUF9GQUxTRSEkQU1ERVBfRkFMU0UkYWNfZGVsaW0KK0FNREVQQkFDS1NMQVNIISRBTURFUEJBQ0tTTEFTSCRhY19kZWxpbQorQ0NERVBNT0RFISRDQ0RFUE1PREUkYWNfZGVsaW0KK2FtX19mYXN0ZGVwQ0NfVFJVRSEkYW1fX2Zhc3RkZXBDQ19UUlVFJGFjX2RlbGltCithbV9fZmFzdGRlcENDX0ZBTFNFISRhbV9fZmFzdGRlcENDX0ZBTFNFJGFjX2RlbGltCitDUFAhJENQUCRhY19kZWxpbQorR1JFUCEkR1JFUCRhY19kZWxpbQorRUdSRVAhJEVHUkVQJGFjX2RlbGltCitTRUQhJFNFRCRhY19kZWxpbQorTE5fUyEkTE5fUyRhY19kZWxpbQorRUNITyEkRUNITyRhY19kZWxpbQorQVIhJEFSJGFjX2RlbGltCitSQU5MSUIhJFJBTkxJQiRhY19kZWxpbQorQ1hYISRDWFgkYWNfZGVsaW0KK0NYWEZMQUdTISRDWFhGTEFHUyRhY19kZWxpbQorYWNfY3RfQ1hYISRhY19jdF9DWFgkYWNfZGVsaW0KK19BQ0VPRgorCisgIGlmIHRlc3QgYHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5zZWQgfCBncmVwIC1jIFhgID0gOTc7IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorCithY19lb2Y9YHNlZCAtbiAnL15DRU9GWzAtOV0qJC9zL0NFT0YvMC9wJyBjb25mJCRzdWJzLnNlZGAKK2lmIHRlc3QgLW4gIiRhY19lb2YiOyB0aGVuCisgIGFjX2VvZj1gZWNobyAiJGFjX2VvZiIgfCBzb3J0IC1ucnUgfCBzZWQgMXFgCisgIGFjX2VvZj1gZXhwciAkYWNfZW9mICsgMWAKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitjYXQgPiJcJHRtcC9zdWJzLTEuc2VkIiA8PFxDRU9GJGFjX2VvZgorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorX0FDRU9GCitzZWQgJworcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZworcy9eL3MsQC87IHMvIS9ALHwjXyEhXyN8LworOm4KK3Qgbgorcy8nIiRhY19kZWxpbSInJC8sZy87IHQKK3MvJC9cXC87IHAKK047IHMvXi4qXG4vLzsgcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZzsgYiBuCisnID4+JENPTkZJR19TVEFUVVMgPGNvbmYkJHN1YnMuc2VkCitybSAtZiBjb25mJCRzdWJzLnNlZAorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKK0NFT0YkYWNfZW9mCitfQUNFT0YKKworCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCisgIGNhdCA+Y29uZiQkc3Vicy5zZWQgPDxfQUNFT0YKK0NYWERFUE1PREUhJENYWERFUE1PREUkYWNfZGVsaW0KK2FtX19mYXN0ZGVwQ1hYX1RSVUUhJGFtX19mYXN0ZGVwQ1hYX1RSVUUkYWNfZGVsaW0KK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFISRhbV9fZmFzdGRlcENYWF9GQUxTRSRhY19kZWxpbQorQ1hYQ1BQISRDWFhDUFAkYWNfZGVsaW0KK0Y3NyEkRjc3JGFjX2RlbGltCitGRkxBR1MhJEZGTEFHUyRhY19kZWxpbQorYWNfY3RfRjc3ISRhY19jdF9GNzckYWNfZGVsaW0KK0xJQlRPT0whJExJQlRPT0wkYWNfZGVsaW0KK0xJQlRPT0xfREVQUyEkTElCVE9PTF9ERVBTJGFjX2RlbGltCitVISRVJGFjX2RlbGltCitBTlNJMktOUiEkQU5TSTJLTlIkYWNfZGVsaW0KK0FMTE9DQSEkQUxMT0NBJGFjX2RlbGltCitHVEtfQ09ORklHISRHVEtfQ09ORklHJGFjX2RlbGltCitHVEtfQ0ZMQUdTISRHVEtfQ0ZMQUdTJGFjX2RlbGltCitHVEtfTElCUyEkR1RLX0xJQlMkYWNfZGVsaW0KK1BLR19DT05GSUchJFBLR19DT05GSUckYWNfZGVsaW0KK1NOREZJTEVfQ0ZMQUdTISRTTkRGSUxFX0NGTEFHUyRhY19kZWxpbQorU05ERklMRV9MSUJTISRTTkRGSUxFX0xJQlMkYWNfZGVsaW0KK0xJQl9XSVRIX0RFQ09ERVJfVFJVRSEkTElCX1dJVEhfREVDT0RFUl9UUlVFJGFjX2RlbGltCitMSUJfV0lUSF9ERUNPREVSX0ZBTFNFISRMSUJfV0lUSF9ERUNPREVSX0ZBTFNFJGFjX2RlbGltCitXSVRIX0JSSElTVF9UUlVFISRXSVRIX0JSSElTVF9UUlVFJGFjX2RlbGltCitXSVRIX0JSSElTVF9GQUxTRSEkV0lUSF9CUkhJU1RfRkFMU0UkYWNfZGVsaW0KK1dJVEhfWE1NX1RSVUUhJFdJVEhfWE1NX1RSVUUkYWNfZGVsaW0KK1dJVEhfWE1NX0ZBTFNFISRXSVRIX1hNTV9GQUxTRSRhY19kZWxpbQorV0lUSF9WRUNUT1JfVFJVRSEkV0lUSF9WRUNUT1JfVFJVRSRhY19kZWxpbQorV0lUSF9WRUNUT1JfRkFMU0UhJFdJVEhfVkVDVE9SX0ZBTFNFJGFjX2RlbGltCitOQVNNISROQVNNJGFjX2RlbGltCitIQVZFX05BU01fVFJVRSEkSEFWRV9OQVNNX1RSVUUkYWNfZGVsaW0KK0hBVkVfTkFTTV9GQUxTRSEkSEFWRV9OQVNNX0ZBTFNFJGFjX2RlbGltCitJTkNMVURFUyEkSU5DTFVERVMkYWNfZGVsaW0KK0ZST05URU5EX0xERkxBR1MhJEZST05URU5EX0xERkxBR1MkYWNfZGVsaW0KK0ZST05URU5EX0NGTEFHUyEkRlJPTlRFTkRfQ0ZMQUdTJGFjX2RlbGltCitGUk9OVEVORF9MREFERCEkRlJPTlRFTkRfTERBREQkYWNfZGVsaW0KK0NPTkZJR19NQVRIX0xJQiEkQ09ORklHX01BVEhfTElCJGFjX2RlbGltCitMREFERCEkTERBREQkYWNfZGVsaW0KK0xJQl9NQUpPUl9WRVJTSU9OISRMSUJfTUFKT1JfVkVSU0lPTiRhY19kZWxpbQorTElCX01JTk9SX1ZFUlNJT04hJExJQl9NSU5PUl9WRVJTSU9OJGFjX2RlbGltCitOQVNNX0ZPUk1BVCEkTkFTTV9GT1JNQVQkYWNfZGVsaW0KK01BS0VERVAhJE1BS0VERVAkYWNfZGVsaW0KK1JNX0YhJFJNX0YkYWNfZGVsaW0KK1dJVEhfRlJPTlRFTkQhJFdJVEhfRlJPTlRFTkQkYWNfZGVsaW0KK1dJVEhfTVAzWCEkV0lUSF9NUDNYJGFjX2RlbGltCitXSVRIX01QM1JUUCEkV0lUSF9NUDNSVFAkYWNfZGVsaW0KK0NQVVRZUEUhJENQVVRZUEUkYWNfZGVsaW0KK0NQVUNDT0RFISRDUFVDQ09ERSRhY19kZWxpbQorQ09ORklHX0RFRlMhJENPTkZJR19ERUZTJGFjX2RlbGltCitMSUJPQkpTISRMSUJPQkpTJGFjX2RlbGltCitMVExJQk9CSlMhJExUTElCT0JKUyRhY19kZWxpbQorX0FDRU9GCisKKyAgaWYgdGVzdCBgc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLnNlZCB8IGdyZXAgLWMgWGAgPSA0ODsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCisKK2FjX2VvZj1gc2VkIC1uICcvXkNFT0ZbMC05XSokL3MvQ0VPRi8wL3AnIGNvbmYkJHN1YnMuc2VkYAoraWYgdGVzdCAtbiAiJGFjX2VvZiI7IHRoZW4KKyAgYWNfZW9mPWBlY2hvICIkYWNfZW9mIiB8IHNvcnQgLW5ydSB8IHNlZCAxcWAKKyAgYWNfZW9mPWBleHByICRhY19lb2YgKyAxYAorZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKK2NhdCA+IlwkdG1wL3N1YnMtMi5zZWQiIDw8XENFT0YkYWNfZW9mCisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiIGVuZAorX0FDRU9GCitzZWQgJworcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZworcy9eL3MsQC87IHMvIS9ALHwjXyEhXyN8LworOm4KK3Qgbgorcy8nIiRhY19kZWxpbSInJC8sZy87IHQKK3MvJC9cXC87IHAKK047IHMvXi4qXG4vLzsgcy9bLFxcJl0vXFwmL2c7IHMvQC9AfCNfISFfI3wvZzsgYiBuCisnID4+JENPTkZJR19TVEFUVVMgPGNvbmYkJHN1YnMuc2VkCitybSAtZiBjb25mJCRzdWJzLnNlZAorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKzplbmQKK3MvfCNfISFfI3wvL2cKK0NFT0YkYWNfZW9mCitfQUNFT0YKKworCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97CitzLzoqXCQoc3JjZGlyKToqLzovCitzLzoqXCR7c3JjZGlyfToqLzovCitzLzoqQHNyY2RpckA6Ki86Lworcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvCitzLzoqJC8vCitzL15bXj1dKj1bCSBdKiQvLworfScKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCisKK2ZvciBhY190YWcgaW4gIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgICA6QyAkQ09ORklHX0NPTU1BTkRTCitkbworICBjYXNlICRhY190YWcgaW4KKyAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7CisgIGVzYWMKKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KKyAgOltGSExdKjoqKTs7CisgIDpMKiB8IDpDKjoqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIDpbRkhdLSkgYWNfdGFnPS06LTs7CisgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisgIGVzYWMKKyAgYWNfc2F2ZV9JRlM9JElGUworICBJRlM9OgorICBzZXQgeCAkYWNfdGFnCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgc2hpZnQKKyAgYWNfZmlsZT0kMQorICBzaGlmdAorCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkwpIGFjX3NvdXJjZT0kMTs7CisgIDpbRkhdKQorICAgIGFjX2ZpbGVfaW5wdXRzPQorICAgIGZvciBhY19mCisgICAgZG8KKyAgICAgIGNhc2UgJGFjX2YgaW4KKyAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAorCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorCSB0ZXN0IC1mICIkYWNfZiIgfHwKKwkgICBjYXNlICRhY19mIGluCisJICAgW1xcLyRdKikgZmFsc2U7OworCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKwkgICBlc2FjIHx8CisJICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICAgICAgZXNhYworICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAkYWNfZiIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGZyb20gImBJRlM9OgorCSAgZWNobyAkKiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnYCIgYnkgY29uZmlndXJlLiIKKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgZmkKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIjs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKworICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgeyBhc19kaXI9IiRhY19kaXIiCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKyAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKworICBjYXNlICRhY19tb2RlIGluCisgIDpGKQorICAjCisgICMgQ09ORklHX0ZJTEUKKyAgIworCisgIGNhc2UgJElOU1RBTEwgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKKyAgZXNhYworICBhY19NS0RJUl9QPSRNS0RJUl9QCisgIGNhc2UgJE1LRElSX1AgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKKyAgKi8qKSBhY19NS0RJUl9QPSRhY190b3BfYnVpbGRfcHJlZml4JE1LRElSX1AgOzsKKyAgZXNhYworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCithY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KKworY2FzZSBgc2VkIC1uICcvZGF0YXJvb3RkaXIvIHsKKyAgcAorICBxCit9CisvQGRhdGFkaXJAL3AKKy9AZG9jZGlyQC9wCisvQGluZm9kaXJAL3AKKy9AbG9jYWxlZGlyQC9wCisvQG1hbmRpckAvcAorJyAkYWNfZmlsZV9pbnB1dHNgIGluCisqZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7CisqQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorICBhY19kYXRhcm9vdGRpcl9oYWNrPScKKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworICBzJkBkb2NkaXJAJiRkb2NkaXImZworICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCisgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisgIHMmQG1hbmRpckAmJG1hbmRpciZnCisgICAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKK2VzYWMKK19BQ0VPRgorCisjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKyMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisgIHNlZCAiJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorcyZAY29uZmlndXJlX2lucHV0QCYkY29uZmlndXJlX2lucHV0Jjt0IHQKK3MmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAorcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKK3MmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0CitzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAorcyZATUtESVJfUEAmJGFjX01LRElSX1AmO3QgdAorJGFjX2RhdGFyb290ZGlyX2hhY2sKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgc2VkIC1mICIkdG1wL3N1YnMtMS5zZWQiIHwgc2VkIC1mICIkdG1wL3N1YnMtMi5zZWQiID4kdG1wL291dAorCit0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCit3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCit3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjI7fQorCisgIHJtIC1mICIkdG1wL3N0ZGluIgorICBjYXNlICRhY19maWxlIGluCisgIC0pIGNhdCAiJHRtcC9vdXQiOyBybSAtZiAiJHRtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIjsgbXYgIiR0bXAvb3V0IiAkYWNfZmlsZTs7CisgIGVzYWMKKyA7OworICA6SCkKKyAgIworICAjIENPTkZJR19IRUFERVIKKyAgIworX0FDRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgYGNvbmZ0ZXN0LmRlZmluZXMnLCB0aGF0CisjIHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4KK3JtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAorIyBGaXJzdCwgYXBwZW5kIGEgc3BhY2UgdG8gZXZlcnkgdW5kZWYvZGVmaW5lIGxpbmUsIHRvIGVhc2UgbWF0Y2hpbmcuCitlY2hvICdzLyQvIC8nID5jb25mdGVzdC5kZWZpbmVzCisjIFRoZW4sIHByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCwgb3IgaW4KKyMgYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCwgaW4gY29uZmlnLnN0YXR1cy4gIElmIHNvbWUgbWFjcm9zIHdlcmUKKyMgY2FsbGVkIHNldmVyYWwgdGltZXMgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCAjZGVmaW5lcyBmb3IgdGhlIHNhbWUKKyMgc3ltYm9sLCB3aGljaCBpcyB1c2VsZXNzLiAgQnV0IGRvIG5vdCBzb3J0IHRoZW0sIHNpbmNlIHRoZSBsYXN0CisjIEFDX0RFRklORSBtdXN0IGJlIGhvbm9yZWQuCithY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIFBBUkFNUyBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCwgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIyBQQVJBTVMgaXMgdGhlIHBhcmFtZXRlciBsaXN0IGluIHRoZSBtYWNybyBkZWZpbml0aW9uLS1pbiBtb3N0IGNhc2VzLCBpdCdzCisjIGp1c3QgYW4gZW1wdHkgc3RyaW5nLgorYWNfZEE9J3MsXlxcKFsJICNdKlxcKVteCSBdKlxcKFsJIF0qJworYWNfZEI9J1xcKVsJIChdLiosXFwxZGVmaW5lXFwyJworYWNfZEM9JyAnCithY19kRD0nICwnCisKK3VuaXEgY29uZmRlZnMuaCB8CisgIHNlZCAtbiAnCisJdCByc2V0CisJOnJzZXQKKwlzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8vCisJdCBvaworCWQKKwk6b2sKKwlzL1tcXCYsXS9cXCYvZworCXMvXlwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS8gJyIkYWNfZEEiJ1wxJyIkYWNfZEIiJ1wyJyIke2FjX2RDfSInXDMnIiRhY19kRCInL3AKKwlzL15cKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvJyIkYWNfZEEiJ1wxJyIkYWNfZEIkYWNfZEMiJ1wyJyIkYWNfZEQiJy9wCisgICcgPj5jb25mdGVzdC5kZWZpbmVzCisKKyMgUmVtb3ZlIHRoZSBzcGFjZSB0aGF0IHdhcyBhcHBlbmRlZCB0byBlYXNlIG1hdGNoaW5nLgorIyBUaGVuIHJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKyMgKFRoZSByZWdleHAgY2FuIGJlIHNob3J0LCBzaW5jZSB0aGUgbGluZSBjb250YWlucyBlaXRoZXIgI2RlZmluZSBvciAjdW5kZWYuKQorZWNobyAncy8gJC8vCitzLF5bCSAjXSp1LiosLyogJiAqLywnID4+Y29uZnRlc3QuZGVmaW5lcworCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXM6CithY19tYXhfc2VkX2xpbmVzPTUwCisKKyMgRmlyc3Qgc2VkIGNvbW1hbmQgaXM6CSBzZWQgLWYgZGVmaW5lcy5zZWQgJGFjX2ZpbGVfaW5wdXRzID4iJHRtcC9vdXQxIgorIyBTZWNvbmQgb25lIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICIkdG1wL291dDEiID4iJHRtcC9vdXQyIgorIyBUaGlyZCBvbmUgd2lsbCBiZToJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQyIiA+IiR0bXAvb3V0MSIKKyMgZXQgY2V0ZXJhLgorYWNfaW49JyRhY19maWxlX2lucHV0cycKK2FjX291dD0nIiR0bXAvb3V0MSInCithY19ueHQ9JyIkdG1wL291dDIiJworCit3aGlsZSA6CitkbworICAjIFdyaXRlIGEgaGVyZSBkb2N1bWVudDoKKyAgICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorICAgICMgRmlyc3QsIGNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIGxpbmU6CisgICAgY2F0ID4iXCR0bXAvZGVmaW5lcy5zZWQiIDw8XFxDRU9GCisvXlsJIF0qI1sJIF0qdW5kZWZbCSBdWwkgXSokYWNfd29yZF9yZVsJIF0qXCQvYiBkZWYKKy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSokYWNfd29yZF9yZVsoCSBdL2IgZGVmCitiCis6ZGVmCitfQUNFT0YKKyAgc2VkICR7YWNfbWF4X3NlZF9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgICAgc2VkIC1mICIkdG1wL2RlZmluZXMuc2VkIicgIiRhY19pbiA+JGFjX291dCIgPj4kQ09ORklHX1NUQVRVUworICBhY19pbj0kYWNfb3V0OyBhY19vdXQ9JGFjX254dDsgYWNfbnh0PSRhY19pbgorICBzZWQgMSwke2FjX21heF9zZWRfbGluZXN9ZCBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC50YWlsCisgIGdyZXAgLiBjb25mdGVzdC50YWlsID4vZGV2L251bGwgfHwgYnJlYWsKKyAgcm0gLWYgY29uZnRlc3QuZGVmaW5lcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LmRlZmluZXMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudGFpbAorCitlY2hvICJhY19yZXN1bHQ9JGFjX2luIiA+PiRDT05GSUdfU1RBVFVTCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiA+IiR0bXAvY29uZmlnLmgiCisgICAgY2F0ICIkYWNfcmVzdWx0IiA+PiIkdG1wL2NvbmZpZy5oIgorICAgIGlmIGRpZmYgJGFjX2ZpbGUgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKK2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIHJtIC1mICRhY19maWxlCisgICAgICBtdiAiJHRtcC9jb25maWcuaCIgJGFjX2ZpbGUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iCisgICAgY2F0ICIkYWNfcmVzdWx0IgorICBmaQorICBybSAtZiAiJHRtcC9vdXQxMiIKKyMgQ29tcHV0ZSAkYWNfZmlsZSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRhY19maWxlIHwgJGFjX2ZpbGU6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRhY19maWxlIiA+YCRhc19kaXJuYW1lIC0tICRhY19maWxlIHx8CiskYXNfZXhwciBYJGFjX2ZpbGUgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCRhY19maWxlIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgkYWNfZmlsZSA6ICdYXCgvL1wpJCcgXHwgXAorCSBYJGFjX2ZpbGUgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CitlY2hvIFgkYWNfZmlsZSB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKKyA7OworCisgIDpDKSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKK2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQorIDs7CisgIGVzYWMKKworCisgIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgorICAgICJkZXBmaWxlcyI6QykgdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCisgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCisgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCisgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCisgICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCisgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCisgICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgorICBpZiBzZWQgMTBxICIkbWYiIHwgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGRpcnBhcnQ9YCRhc19kaXJuYW1lIC0tICIkbWYiIHx8CiskYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJG1mIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgZWxzZQorICAgIGNvbnRpbnVlCisgIGZpCisgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQorICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCisgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCisgICMgZXhwYW5zaW9uLgorICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKKyAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8CiskYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgeyBhc19kaXI9JGRpcnBhcnQvJGZkaXIKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWBlY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgIGRvbmUKK2RvbmUKKyA7OworCisgIGVzYWMKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworeyAoZXhpdCAwKTsgZXhpdCAwOyB9CitfQUNFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK2ZpCisKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDI0YTI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTE3NyBAQAorZG5sICRJZDogY29uZmlndXJlLmluLHYgMS4xMzQuMi4zIDIwMTAvMDMvMjIgMjA6MjU6MjYgcm9iZXJ0IEV4cCAkCitkbmwKK2RubAorZG5sIGRvbid0IGZvcmdldCB0byBzZXQgQVNNX0ZPUl9BUkNIIHRvIGEgc3BhY2UgZGVsaW1pdGVkIGxpc3Qgb2YKK2RubCBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlcywgZm9yIHdoaWNoIGFzc2VtYmxlciByb3V0aW5lcyBleGlzdAorZG5sCitkbmwKK2RubCBFeHBvcnRlZCBhbmQgY29uZmlndXJlZCB2YXJpYWJsZXM6CitkbmwgQ0MKK2RubCBDRkxBR1MKK2RubCBMREZMQUdTCitkbmwgTERBREQKK2RubCBOQVNNCisKK2RubCBleHRyYSB2YXJzIGZvciBmcm9udGVuZDoKK2RubCBGUk9OVEVORF9MREZMQUdTCitkbmwgRlJPTlRFTkRfQ0ZMQUdTCitkbmwgRlJPTlRFTkRfTERBREQKKworQUNfUFJFUkVRKDIuNTkpCitBQ19JTklUKFtsYW1lXSxbMy45OC40XSxbbGFtZS1kZXZAbGlzdHMuc2YubmV0XSkKK0FDX0NPTkZJR19TUkNESVIoW2xpYm1wM2xhbWUvbGFtZS5jXSkKKworZG5sIGNoZWNrIHN5c3RlbQorQUNfQ0FOT05JQ0FMX0hPU1QKKworZG5sIGF1dG9tYWtlCitBTV9JTklUX0FVVE9NQUtFCitBQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQorQU1fTUFJTlRBSU5FUl9NT0RFCitBTV9NQUtFX0lOQ0xVREUKKworZG5sIGNoZWNrIGVudmlyb25tZW50CitBQ19BSVgKK0FDX0lTQ19QT1NJWAorQUNfTUlOSVgKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgKmN5Z3dpbiogKSBDWUdXSU49eWVzOzsKKyAgICAgICAgICogKSBDWUdXSU49bm87OworZXNhYworCitkbmwgbGlidG9vbAorIyBBQ19ESVNBQkxFX1NIQVJFRAorQUNfUFJPR19MSUJUT09MCitBQ19TVUJTVChMSUJUT09MX0RFUFMpCitDRkxBR1M9IiR7YWNfc2F2ZV9DRkxBR1N9IgorCisjIGluY3JlYXNlIHRoaXMgd2hlbiB0aGUgc2hhcmVkIGxpYiBiZWNvbWVzIHRvdGFsbHkgaW5jb21wYXRpYmxlCitMSUJfTUFKT1JfVkVSU0lPTj0wCisKKyMgaW5jcmVhc2UgdGhpcyB3aGVuIGNoYW5nZXMgYXJlIG1hZGUsIGJ1dCB0aGV5IGFyZSB1cHdhcmQgY29tcGF0aWJsZQorIyB0byBwcmV2aW91cyB2ZXJzaW9ucworTElCX01JTk9SX1ZFUlNJT049MAorCitkbmwgIyB3b3JrIGFyb3VuZCBmb3IgYSBidWcsIGRvbid0IGtub3cgd2hlcmUgaXQgaXMgZXhhY3RseQoraWYgdGVzdCAiJHthY19jdl9jeWd3aW59IiA9ICJ5ZXMiOyB0aGVuCisJaWYgdGVzdCAiJHtDQ30iICE9ICJnY2MiOyB0aGVuCisJCUFDX01TR19FUlJPUihbUGxlYXNlIHVzZV0KKwkJCVsgICBDQz1nY2MgLi9jb25maWd1cmVdCisJCQlbQWJvcnQgdGhpcyBjb25maWd1cmUgcnVuIGFuZCBhZGQgIkNDPWdjYyIgb3IgeW91IHdpbGxdCisJCQlbc2VlIGVycm9ycyBhbmQgbm8gbGFtZS5leGUgd2lsbCBiZSBidWlsZC5dKQorCWZpCitmaQorCitkbmwgY2hlY2sgcHJvZ3JhbXMKK0FDX1BST0dfQ0MoKQorCitpZiB0ZXN0ICIke0dDQ30iID0gInllcyI7IHRoZW4KKwlBQ19NU0dfQ0hFQ0tJTkcodmVyc2lvbiBvZiBHQ0MpCisJR0NDX3ZlcnNpb249YCR7Q0N9IC0tdmVyc2lvbiB8IHNlZCAtbiAnMXMvXltbXiBdXSogKC4qKSAvLztzLyAuKiQvLzsxcCdgCisJQUNfTVNHX1JFU1VMVCgke0dDQ192ZXJzaW9ufSkKK2ZpCisKK2RubCBtb3JlIGF1dG9tYWtlIHN0dWZmCitBTV9DX1BST1RPVFlQRVMKKworQUNfQ0hFQ0tfSEVBREVSKGRtYWxsb2MuaCkKK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2RtYWxsb2NfaH0iID0gInllcyI7IHRoZW4KKwlBTV9XSVRIX0RNQUxMT0MKK2ZpCisKK2RubCBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KK0FDX0hFQURFUl9TVERDCitBQ19DSEVDS19IRUFERVJTKCBcCisJCSBlcnJuby5oIFwKKwkJIGZjbnRsLmggXAorCQkgbGltaXRzLmggXAorCQkgc3RkaW50LmggXAorCQkgc3RyaW5nLmggXAorCQkgc3lzL3NvdW5kY2FyZC5oIFwKKwkJIHN5cy90aW1lLmggXAorCQkgdW5pc3RkLmggXAorCQkgeG1taW50cmluLmggXAorCQkgbGludXgvc291bmRjYXJkLmgpCisKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfQ19DT05TVAorQUNfQ19JTkxJTkUKK2lmIHRlc3QgJHtjcm9zc19jb21waWxpbmd9ID0gIm5vIjsgdGhlbgorCUFDX0NfQklHRU5ESUFOCitmaQorCitBQ19TWVNfTEFSR0VGSUxFCisKK0FDX0NIRUNLX1NJWkVPRihzaG9ydCkKK0FDX0NIRUNLX1NJWkVPRih1bnNpZ25lZCBzaG9ydCkKK0FDX0NIRUNLX1NJWkVPRihpbnQpCitBQ19DSEVDS19TSVpFT0YodW5zaWduZWQgaW50KQorQUNfQ0hFQ0tfU0laRU9GKGxvbmcpCitBQ19DSEVDS19TSVpFT0YodW5zaWduZWQgbG9uZykKK0FDX0NIRUNLX1NJWkVPRihsb25nIGxvbmcpCitBQ19DSEVDS19TSVpFT0YodW5zaWduZWQgbG9uZyBsb25nKQorQUNfQ0hFQ0tfU0laRU9GKGZsb2F0KQorQUNfQ0hFQ0tfU0laRU9GKGRvdWJsZSkKKworaWYgdGVzdCAkYWNfY3Zfc2l6ZW9mX3Nob3J0IC1lcSAwIFwKKyAgICAtbyAkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0IC1lcSAwIFwKKyAgICAtbyAkYWNfY3Zfc2l6ZW9mX2ludCAtZXEgMCBcCisgICAgLW8gJGFjX2N2X3NpemVvZl91bnNpZ25lZF9pbnQgLWVxIDAgXAorICAgIC1vICRhY19jdl9zaXplb2ZfbG9uZyAtZXEgMCBcCisgICAgLW8gJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nIC1lcSAwIFwKKyAgICAtbyAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyAtZXEgMCBcCisgICAgLW8gJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nX2xvbmcgLWVxIDAgXAorICAgIC1vICRhY19jdl9zaXplb2ZfZmxvYXQgLWVxIDAgXAorICAgIC1vICRhY19jdl9zaXplb2ZfZG91YmxlIC1lcSAwOyB0aGVuCisJZWNobyAnKioqIEkgaGF2ZSBhIHByb2JsZW0gZGV0ZXJtaW5pbmcgdGhlIHNpemUgb2Ygc29tZSB2YXJpYWJsZSB0eXBlcy4gRWl0aGVyJworCWVjaG8gJyoqKiB5b3UgY29tcGlsZXIgaXMgYnJva2VuLCBvciB5b3VyIHN5c3RlbStjb21waWxlciBjb21iaW5hdGlvbiBpcyBub3QnCisJZWNobyAnKioqIHN1cHBvcnRldCBieSB0aGUgImF1dG9jb25mIiBmcmFtZXdvcmsgd2UgdXNlIHRvIGdlbmVyYXRlIHRoaXMnCisJZWNobyAnKioqIGNvbmZpZ3VyZSBzY3JpcHQuJworCWV4aXQgMQorZmkKKworQUNfQ19MT05HX0RPVUJMRQoraWYgdGVzdCAiJHthY19jdl9jX2hhdmVfbG9uZ19kb3VibGV9IiA9ICJ5ZXMiIDsgdGhlbgorCUFDX0NIRUNLX1NJWkVPRihsb25nIGRvdWJsZSkKK2ZpCisKK0FDX0NIRUNLX1RZUEVTKFt1aW50OF90LCBpbnQ4X3QsIHVpbnQxNl90LCBpbnQxNl90LCB1aW50MzJfdCwgaW50MzJfdCwgdWludDY0X3QsIGludDY0X3RdKQorCitBSF9WRVJCQVRJTShbSEFWRV9VSU5UOF9UXSwKK1svKiBhZGQgdWludDhfdCB0eXBlICovCisjdW5kZWYgSEFWRV9VSU5UOF9UCisjaWZuZGVmIEhBVkVfVUlOVDhfVAorCXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworI2VuZGlmXSkKKworQUhfVkVSQkFUSU0oW0hBVkVfSU5UOF9UXSwKK1svKiBhZGQgaW50OF90IHR5cGUgKi8KKyN1bmRlZiBIQVZFX0lOVDhfVAorI2lmbmRlZiBIQVZFX0lOVDhfVAorCXR5cGVkZWYgY2hhciBpbnQ4X3Q7CisjZW5kaWZdKQorCitBSF9WRVJCQVRJTShbSEFWRV9VSU5UMTZfVF0sCitbLyogYWRkIHVpbnQxNl90IHR5cGUgKi8KKyN1bmRlZiBIQVZFX1VJTlQxNl9UCisjaWZuZGVmIEhBVkVfVUlOVDE2X1QKKwl0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OworI2VuZGlmXSkKKworQUhfVkVSQkFUSU0oW0hBVkVfSU5UMTZfVF0sCitbLyogYWRkIGludDE2X3QgdHlwZSAqLworI3VuZGVmIEhBVkVfSU5UMTZfVAorI2lmbmRlZiBIQVZFX0lOVDE2X1QKKwl0eXBlZGVmIHNob3J0IGludDE2X3Q7CisjZW5kaWZdKQorCitpZiB0ZXN0ICIke0hBVkVfSU5UMzJfVH0iID0geWVzOyB0aGVuCisJQUNfREVGSU5FKEFfVUlOVDMyX1QsdW5zaWduZWQgaW50MzJfdCkKK2Vsc2UKKwlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl91bnNpZ25lZF9zaG9ydH0iID0gIjQiOyB0aGVuCisJCUFDX0RFRklORShBX1VJTlQzMl9ULHVuc2lnbmVkIHNob3J0KQorCWVsc2UKKwkJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfaW50fSIgPSAiNCI7IHRoZW4KKwkJCUFDX0RFRklORShBX1VJTlQzMl9ULHVuc2lnbmVkIGludCkKKwkJZWxzZQorCQkJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdW5zaWduZWRfbG9uZ30iID0gIjQiOyB0aGVuCisJCQkJQUNfREVGSU5FKEFfVUlOVDMyX1QsdW5zaWduZWQgbG9uZykKKwkJCWVsc2UKKwkJCQlBQ19NU0dfRVJST1IoW0NIRUNLX1RZUEVfdWludDMyX3QgLSBwbGVhc2UgcmVwb3J0IHRvIGxhbWUtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldF0pCisJCQlmaQorCQlmaQorCWZpCitmaQorCitBSF9WRVJCQVRJTShbSEFWRV9VSU5UMzJfVF0sCitbLyogYWRkIHVpbnQzMl90IHR5cGUgKi8KKyN1bmRlZiBIQVZFX1VJTlQzMl9UCisjaWZuZGVmIEhBVkVfVUlOVDMyX1QKKyN1bmRlZiBBX1VJTlQzMl9UCisJdHlwZWRlZiBBX1VJTlQzMl9UIHVpbnQzMl90OworI2VuZGlmXSkKKworaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfc2hvcnR9IiA9ICI0IjsgdGhlbgorCUFDX0RFRklORShBX0lOVDMyX1Qsc2hvcnQpCitlbHNlCisJaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfaW50fSIgPSAiNCI7IHRoZW4KKwkJQUNfREVGSU5FKEFfSU5UMzJfVCxpbnQpCisJZWxzZQorCQlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9sb25nfSIgPSAiNCI7IHRoZW4KKwkJCUFDX0RFRklORShBX0lOVDMyX1QsbG9uZykKKwkJZWxzZQorCQkJQUNfTVNHX0VSUk9SKFtDSEVDS19UWVBFX2ludDMyX3QgLSBwbGVhc2UgcmVwb3J0IHRvIGxhbWUtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldF0pCisJCWZpCisJZmkKK2ZpCisKK0FIX1ZFUkJBVElNKFtIQVZFX0lOVDMyX1RdLAorWy8qIGFkZCBpbnQzMl90IHR5cGUgKi8KKyN1bmRlZiBIQVZFX0lOVDMyX1QKKyNpZm5kZWYgSEFWRV9JTlQzMl9UCisjdW5kZWYgQV9JTlQzMl9UCisJdHlwZWRlZiBBX0lOVDMyX1QgaW50MzJfdDsKKyNlbmRpZl0pCisKK2lmIHRlc3QgIiR7SEFWRV9JTlQ2NF9UfSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKEFfVUlOVDY0X1QsdW5zaWduZWQgaW50NjRfdCkKK2Vsc2UKKwlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl91bnNpZ25lZF9pbnR9IiA9ICI4IjsgdGhlbgorCQlBQ19ERUZJTkUoQV9VSU5UNjRfVCx1bnNpZ25lZCBpbnQpCisJZWxzZQorCQlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nfSIgPSAiOCI7IHRoZW4KKwkJCUFDX0RFRklORShBX1VJTlQ2NF9ULHVuc2lnbmVkIGxvbmcpCisJCWVsc2UKKwkJCWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmdfbG9uZ30iID0gIjgiOyB0aGVuCisJCQkJQUNfREVGSU5FKEFfVUlOVDY0X1QsdW5zaWduZWQgbG9uZyBsb25nKQorCQkJZWxzZQorCQkJCUFDX01TR19FUlJPUihbQ0hFQ0tfVFlQRV91aW50NjRfdCAtIHBsZWFzZSByZXBvcnQgdG8gbGFtZS1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0XSkKKwkJCWZpCisJCWZpCisJZmkKK2ZpCisKK0FIX1ZFUkJBVElNKFtIQVZFX1VJTlQ2NF9UXSwKK1svKiBhZGQgdWludDY0X3QgdHlwZSAqLworI3VuZGVmIEhBVkVfVUlOVDY0X1QKKyNpZm5kZWYgSEFWRV9VSU5UNjRfVAorI3VuZGVmIEFfVUlOVDY0X1QKKwl0eXBlZGVmIEFfVUlOVDY0X1QgdWludDY0X3Q7CisjZW5kaWZdKQorCitpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9pbnR9IiA9ICI4IjsgdGhlbgorCUFDX0RFRklORShBX0lOVDY0X1QsaW50KQorZWxzZQorCWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2xvbmd9IiA9ICI4IjsgdGhlbgorCQlBQ19ERUZJTkUoQV9JTlQ2NF9ULGxvbmcpCisJZWxzZQorCQlpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9sb25nX2xvbmd9IiA9ICI4IjsgdGhlbgorCQkJQUNfREVGSU5FKEFfSU5UNjRfVCxsb25nIGxvbmcpCisJCWVsc2UKKwkJCUFDX01TR19FUlJPUihbQ0hFQ0tfVFlQRV9pbnQ2NF90IC0gcGxlYXNlIHJlcG9ydCB0byBsYW1lLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXRdKQorCQlmaQorCWZpCitmaQorCitBSF9WRVJCQVRJTShbSEFWRV9JTlQ2NF9UXSwKK1svKiBhZGQgaW50NjRfdCB0eXBlICovCisjdW5kZWYgSEFWRV9JTlQ2NF9UCisjaWZuZGVmIEhBVkVfSU5UNjRfVAorI3VuZGVmIEFfSU5UNjRfVAorCXR5cGVkZWYgQV9JTlQ2NF9UIGludDY0X3Q7CisjZW5kaWZdKQorCithbGV4X0lFRUU4NTRfRkxPQVQ4MAoraWYgdGVzdCAiJHthbGV4X2N2X2llZWU4NTRfZmxvYXQ4MH0iID0gInllcyIgOyB0aGVuCisJaWYgdGVzdCAiJHthY19jdl9jX2xvbmdfZG91YmxlfSIgPSAieWVzIiA7IHRoZW4KKwkJQUNfQ0hFQ0tfVFlQRVMoaWVlZTg1NF9mbG9hdDgwX3QsIGxvbmcgZG91YmxlKQorCQlBSF9WRVJCQVRJTShbSEFWRV9JRUVFODU0X0ZMT0FUODBfVF0sCitbLyogYWRkIGllZWU4NTRfZmxvYXQ4MF90IHR5cGUgKi8KKyN1bmRlZiBIQVZFX0lFRUU4NTRfRkxPQVQ4MF9UCisjaWZuZGVmIEhBVkVfSUVFRTg1NF9GTE9BVDgwX1QKKwl0eXBlZGVmIGxvbmcgZG91YmxlIGllZWU4NTRfZmxvYXQ4MF90OworI2VuZGlmXSkKKworCQlBQ19ERUZJTkUoSEFWRV9JRUVFODU0X0ZMT0FUODAsIDEsIFtzeXN0ZW0gaGFzIDgwIGJpdCBmbG9hdHNdKQorCWZpCitmaQorQUNfQ0hFQ0tfVFlQRVMoW2llZWU3NTRfZmxvYXQ2NF90LCBpZWVlNzU0X2Zsb2F0MzJfdF0pCisKK0FIX1ZFUkJBVElNKFtIQVZFX0lFRUU3NTRfRkxPQVQ2NF9UXSwKK1svKiBhZGQgaWVlZTc1NF9mbG9hdDY0X3QgdHlwZSAqLworI3VuZGVmIEhBVkVfSUVFRTc1NF9GTE9BVDY0X1QKKyNpZm5kZWYgSEFWRV9JRUVFNzU0X0ZMT0FUNjRfVAorCXR5cGVkZWYgZG91YmxlIGllZWU3NTRfZmxvYXQ2NF90OworI2VuZGlmXSkKKworQUhfVkVSQkFUSU0oW0hBVkVfSUVFRTc1NF9GTE9BVDMyX1RdLAorWy8qIGFkZCBpZWVlNzU0X2Zsb2F0MzJfdCB0eXBlICovCisjdW5kZWYgSEFWRV9JRUVFNzU0X0ZMT0FUMzJfVAorI2lmbmRlZiBIQVZFX0lFRUU3NTRfRkxPQVQzMl9UCisJdHlwZWRlZiBmbG9hdCBpZWVlNzU0X2Zsb2F0MzJfdDsKKyNlbmRpZl0pCisKK0FDX0RFRklORShMQU1FX0xJQlJBUllfQlVJTEQsIDEsIFtyZXF1ZXN0ZWQgYnkgRnJhbmssIHNlZW1zIHRvIGJlIHRlbXBvcmFyeSBuZWVkZWQgZm9yIGEgc21vb3RoIHRyYW5zaXRpb25dKQorCisKK2lmIHRlc3QgJHtjcm9zc19jb21waWxpbmd9ID0gInllcyI7IHRoZW4KKwlBQ19NU0dfV0FSTihbXQorICBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipdCisgIFsqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl0KKyAgWyogWW91IGFyZSBjcm9zcyBjb21waWxpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXQorICBbKiAgIC0gSSBkaWQgbm90IGhhdmUgYSBjaGFuZ2UgdG8gZGV0ZXJtaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpdCisgIFsqICAgICArIHRoZSBzaXplIG9mOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl0KKyAgWyogICAgICAgLSBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXQorICBbKiAgICAgICAtIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpdCisgIFsqICAgICAgIC0gaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl0KKyAgWyogICAgICAgLSB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXQorICBbKiAgICAgICAtIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpdCisgIFsqICAgICAgIC0gdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl0KKyAgWyogICAgICAgLSBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXQorICBbKiAgICAgICAtIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpdCisgIFsqICAgICAgIC0gbG9uZyBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl0KKyAgWyogICAgICsgdGhlIGVuZGlhbmVzcyBvZiB0aGUgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXQorICBbKiAgIC0gWW91IGhhdmUgdG8gcHJvdmlkZSBhcHByb3ByaWF0ZSBkZWZpbmVzIGZvciB0aGVtIGluIGNvbmZpZy5oLCBlLmcuICpdCisgIFsqICAgICArIGRlZmluZSBTSVpFT0ZfU0hPUlQgdG8gMiBpZiB0aGUgc2l6ZSBvZiBhIHNob3J0IGlzIDIgICAgICAgICAgICAgKl0KKyAgWyogICAgICsgZGVmaW5lIFdPUkRTX0JJR0VORElBTiBpZiB5b3VyIHN5c3RlbSBpcyBhIGJpZyBlbmRpYW4gc3lzdGVtICAgICAqXQorICBbKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpdCisgIFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKl0pCitmaQorCitBQ19UWVBFX1NJWkVfVAorQUNfSEVBREVSX1RJTUUKKworZG5sIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCitBQ19GVU5DX0FMTE9DQQorQUNfQ0hFQ0tfRlVOQ1MoZ2V0dGltZW9mZGF5IHN0cnRvbCkKKworaWYgdGVzdCAiWCR7YWNfY3ZfZnVuY19zdHJ0b2x9IiAhPSAiWHllcyI7IHRoZW4KKwlBQ19NU0dfRVJST1IoW2Z1bmN0aW9uIHN0cnRvbCBpcyBtYW5kYXRvcnldKQorZmkKKworZG5sIENoZWNrIGlmIHdlIGFyZSBvbiBhIG1pbmd3IHN5c3RlbSwgd2hpY2ggbmVlZHMgbGlid3NvY2szMgorU09DS0VURlVOQ1RJT049dW5rbm93bgorQUNfQ0hFQ0tfRlVOQ1Moc29ja2V0KQoraWYgdGVzdCAkYWNfY3ZfZnVuY19zb2NrZXQgPSBubzsgdGhlbgorCSMgbWF5YmUgaXQgaXMgaW4gbGlic29ja2V0CisJQUNfQ0hFQ0tfTElCKHNvY2tldCwgc29ja2V0LCBbQUNfREVGSU5FKEhBVkVfU09DS0VUKQorCUxJQlM9IiRMSUJTIC1sc29ja2V0Il0pCisJaWYgdGVzdCAiWCR7YWNfY3ZfbGliX3NvY2tldF9zb2NrZXR9IiAhPSAiWHllcyI7IHRoZW4KKwkJU09DS0VURlVOQ1RJT049Tk8KKwllbHNlCisJCWNhc2UgJHtob3N0X29zfSBpbgorCQkqc29sYXJpcyopCisJCQlMSUJTPSIkTElCUyAtbG5zbCIKKwkJCTs7CisJCWVzYWMKKwlmaQorZmkKKworZG5sIEluaXRpYWxpemUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBNYWtlZmlsZQorQ0ZMQUdTPSR7Q0ZMQUdTfQorQ09ORklHX0RFRlM9JHtDT05GSUdfREVGU30KK05BU009CitJTkNMVURFUz0iLUlcJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JXCQoc3JjZGlyKSIKK0ZST05URU5EX0xERkxBR1M9CitGUk9OVEVORF9DRkxBR1M9CitMSUJfU09VUkNFUz0KK01BS0VERVA9Ii1NIgorUk1fRj0icm0gLWYiCisKK0FDX0FSR19FTkFCTEUobmFzbSwKKyAgWyAgLS1lbmFibGUtbmFzbSAgICAgICAgICAgICAgQWxsb3cgdGhlIHVzZSBvZiBuYXNtIGlmIGF2YWlsYWJsZV0sCisgIEFTTV9GT1JfQVJDSD0iaTM4NiIsIEFTTV9GT1JfQVJDSD0iIikKKworZG5sIENoZWNrcyBmb3IgbGlicmFyaWVzLgorCitBQ19DSEVDS19IRUFERVJTKHRlcm1jYXAuaCkKK0FDX0NIRUNLX0hFQURFUlMobmN1cnNlcy90ZXJtY2FwLmgpCitBQ19DSEVDS19MSUIodGVybWNhcCwgaW5pdHNjciwgSEFWRV9URVJNQ0FQPSJ0ZXJtY2FwIikKK0FDX0NIRUNLX0xJQihjdXJzZXMsIGluaXRzY3IsIEhBVkVfVEVSTUNBUD0iY3Vyc2VzIikKK0FDX0NIRUNLX0xJQihuY3Vyc2VzLCBpbml0c2NyLCBIQVZFX1RFUk1DQVA9Im5jdXJzZXMiKQorIAorZG5sIG1hdGggbGliCitBQ19DSEVDS19MSUIobSwgY29zLCBVU0VfTElCTT0iLWxtIikKK2RubCBmcmVlIGZhc3QgbWF0aCBsaWJyYXJ5CitBQ19DSEVDS19MSUIoZmZtLCBjb3MsIFVTRV9MSUJNPSItbGZmbSAtbG0iKQorZG5sIENvbXBhcSBmYXN0IG1hdGggbGlicmFyeS4KK0FDX0FSR19FTkFCTEUoY3BtbCwKKyAgWyAgLS1kaXNhYmxlLWNwbWwgICAgICAgICAgICAgIERvIG5vdCB1c2UgQ29tcGFxJ3MgZmFzdCBNYXRoIExpYnJhcnldLAorICBDT05GSUdfQ1BNTD0ibm8iLCBDT05GSUdfQ1BNTD0ieWVzIikKK2lmIHRlc3QgIiR7Q09ORklHX0NQTUx9IiA9IHllczsgdGhlbgorICAgICAgQUNfQ0hFQ0tfTElCKGNwbWwsIGNvcywgVVNFX0xJQk09Ii1sY3BtbCIpCitmaQorQ09ORklHX01BVEhfTElCPSIke1VTRV9MSUJNfSIKKworZG5sIGNvbmZpZ3VyZSB1c2Ugb2YgZmVhdHVyZXMKKworQU1fUEFUSF9HVEsoMS4yLjAsIEhBVkVfR1RLPSJ5ZXMiLCBIQVZFX0dUSz0ibm8iKQorCitkbmwgRWxlY3RyaWNGZW5jZSBtYWxsb2MgZGVidWdnaW5nCitBQ19NU0dfQ0hFQ0tJTkcodXNlIG9mIEVsZWN0cmljRmVuY2UgbWFsbG9jIGRlYnVnZ2luZykKK0FDX0FSR19FTkFCTEUoZWZlbmNlLAorICBbICAtLWVuYWJsZS1lZmVuY2UgICAgICAgICAgICBVc2UgRWxlY3RyaWNGZW5jZSBmb3IgbWFsbG9jIGRlYnVnZ2luZ10sCisgIENPTkZJR19FRkVOQ0U9IiR7ZW5hYmxldmFsfSIsIENPTkZJR19FRkVOQ0U9Im5vIikKKworY2FzZSAiJHtDT05GSUdfRUZFTkNFfSIgaW4KK3llcykKKwlBQ19DSEVDS19MSUIoZWZlbmNlLCBFRl9QcmludCwgSEFWRV9FRkVOQ0U9Ii1sZWZlbmNlIikKKwlpZiB0ZXN0ICJ4JHtIQVZFX0VGRU5DRX0iICE9ICJ4LWxlZmVuY2UiOyB0aGVuCisJCUFDX01TR19SRVNVTFQoeWVzLCBidXQgbGliZWZlbmNlIG5vdCBmb3VuZCkKKwllbHNlCisJCUxEQUREPSIke0xEQUREfSAke0hBVkVfRUZFTkNFfSIKKwkJQUNfREVGSU5FKEhBVkVfRUZFTkNFLCAxLCB3ZSBsaW5rIGFnYWluc3QgbGliZWZlbmNlKQorCQlBQ19NU0dfUkVTVUxUKCR7Q09ORklHX0VGRU5DRX0pCisJZmkKKwk7Oworbm8pCisJQUNfTVNHX1JFU1VMVCgke0NPTkZJR19FRkVOQ0V9KQorCTs7CisqKQorCUFDX01TR19FUlJPUihiYWQgdmFsdWUg77+9JHtDT05GSUdfRUZFTkNFfe+/vSBmb3IgZWZlbmNlIG9wdGlvbikKKwk7OworZXNhYworCisKK2RubCBsaWJzbmRmaWxlCitXQVJOSU5HPQorQUNfQVJHX1dJVEgoZmlsZWlvLCAKKyAgWyAgLS13aXRoLWZpbGVpbz1sYW1lICAgICAgICAgVXNlIGxhbWUncyBpbnRlcm5hbCBmaWxlIGlvIHJvdXRpbmVzIFtkZWZhdWx0XV0KKyAgWyAgICAgICAgICAgICA9c25kZmlsZSAgICAgIFVzZSBFcmlrIGRlIENhc3RybyBMb3BvJ3MgbGlic25kZmlsZV0KKyAgWyAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBzdGRpbiBwb3NzaWJsZSBjdXJyZW50bHkpXSwKKyAgQ09ORklHX0ZJTEVJTz0iJHt3aXRodmFsfSIsIENPTkZJR19GSUxFSU89ImxhbWUiKQorCitpZiB0ZXN0ICIke0NPTkZJR19GSUxFSU99IiA9ICJzbmRmaWxlIiA7IHRoZW4KKyAgUEtHX0NIRUNLX01PRFVMRVMoU05ERklMRSwgc25kZmlsZSA+PSAxLjAuMiwgSEFWRV9TTkRGSUxFPSJ5ZXMiLCBIQVZFX1NOREZJTEU9Im5vIikKK2ZpCisKK0FDX01TR19DSEVDS0lORyh1c2Ugb2YgZmlsZSBpbykKKworaWYgdGVzdCAiJHtDT05GSUdfRklMRUlPfSIgPSAic25kZmlsZSIgOyB0aGVuCisgIGlmIHRlc3QgIiR7SEFWRV9TTkRGSUxFfSIgPSAieWVzIiAtbyAieCR7U05ERklMRV9MSUJTfSIgIT0gIngiIFwKKyAgICAtbyAieCR7U05ERklMRV9DRkxBR1N9IiAhPSAieCI7IHRoZW4KKyAgICBTTkRGSUxFX0xJQlM9YGVjaG8gJHtTTkRGSUxFX0xJQlN9YAorICAgIFNOREZJTEVfQ0ZMQUdTPWBlY2hvICR7U05ERklMRV9DRkxBR1N9YAorCisgICAgaWYgdGVzdCAtbiAiJHtTTkRGSUxFX0xJQlN9IiA7IHRoZW4KKyAgICAgIEZST05URU5EX0xERkxBR1M9IiR7U05ERklMRV9MSUJTfSAke0ZST05URU5EX0xERkxBR1N9IgorICAgIGZpCisgICAgRlJPTlRFTkRfTERBREQ9Ii1sc25kZmlsZSAke0ZST05URU5EX0xEQUREfSIKKworICAgIGlmIHRlc3QgLW4gIiR7U05ERklMRV9DRkxBR1N9IiA7IHRoZW4KKyAgICAgIElOQ0xVREVTPSIke1NOREZJTEVfQ0ZMQUdTfSAke0lOQ0xVREVTfSIKKyAgICBmaQorCisgICAgQUNfREVGSU5FKExJQlNOREZJTEUsIDEsIHNldCB0byAxIGlmIHlvdSBoYXZlIGxpYnNuZGZpbGUpCisgIGVsc2UKKyAgICAjIGRlZmF1bHQKKyAgICBDT05GSUdfRklMRUlPPSJsYW1lIgorICAgIFdBUk5JTkc9IiR7V0FSTklOR30gQ291bGQgbm90IGZpbmQgYW55IHNuZGZpbGUgbGliIG9uIHN5c3RlbS4iCisgIGZpCitlbHNlCisgIENPTkZJR19GSUxFSU89ImxhbWUiCitmaSAKK0FDX01TR19SRVNVTFQoJHtDT05GSUdfRklMRUlPfSkKK2lmIHRlc3QgIngke1dBUk5JTkd9IiAhPSAieCIgOyB0aGVuCisgIEFDX01TR19XQVJOKCRXQVJOSU5HKQorZmkKKworCitkbmwgY2hlY2sgaWYgd2Ugc2hvdWxkIHJlbW92ZSBob29rcyBmb3IgYW5hbHl6ZXIgY29kZSBpbiBsaWJyYXJ5CitkbmwgZGVmYXVsdCBsaWJyYXJ5IG11c3QgaW5jbHVkZSB0aGVzZSBob29rcworQUNfTVNHX0NIRUNLSU5HKHVzZSBvZiBhbmFseXplciBob29rcykKK0FDX0FSR19FTkFCTEUoYW5hbHl6ZXItaG9va3MsCisgIFsgIC0tZGlzYWJsZS1hbmFseXplci1ob29rcyAgIEV4Y2x1ZGUgYW5hbHl6ZXIgaG9va3NdLAorICBDT05GSUdfQU5BTFlaRVI9IiR7ZW5hYmxldmFsfSIsIENPTkZJR19BTkFMWVpFUj0ieWVzIikKKworY2FzZSAiJHtDT05GSUdfQU5BTFlaRVJ9IiBpbgoreWVzKQorCTs7CitubykKKwlBQ19ERUZJTkUoTk9BTkFMWVNJUywgMSwgYnVpbGQgd2l0aG91dCBob29rcyBmb3IgYW5hbHl6ZXIpCisJOzsKKyopCisJQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSDvv70ke0NPTkZJR19BTkFMWVpFUn3vv70gZm9yIGFuYWx5emVyLWhvb2tzIG9wdGlvbikKKwk7OworZXNhYworQUNfTVNHX1JFU1VMVCgkQ09ORklHX0FOQUxZWkVSKQorCisKK2RubCBtcGcxMjMgZGVjb2RlcgorQUNfTVNHX0NIRUNLSU5HKHVzZSBvZiBtcGcxMjMgZGVjb2RlcikKK0FDX0FSR19FTkFCTEUoZGVjb2RlciwgCisgIFsgIC0tZGlzYWJsZS1kZWNvZGVyICAgICAgICAgIEV4Y2x1ZGUgbXBnMTIzIGRlY29kZXJdLAorICBDT05GSUdfREVDT0RFUj0iJHtlbmFibGV2YWx9IiwgQ09ORklHX0RFQ09ERVI9InllcyIpCitBQ19BUkdfRU5BQkxFKGRlY29kZS1sYXllcjEsIAorICBbICAtLWVuYWJsZS1kZWNvZGUtbGF5ZXIxICAgICBJbmNsdWRlIGxheWVyMSBkZWNvZGluZyBbZGVmYXVsdD1ub11dLAorICBDT05GSUdfREVDT0RFUl9MMT0iJHtlbmFibGV2YWx9IiwgQ09ORklHX0RFQ09ERVJfTDE9Im5vIikKK0FDX0FSR19FTkFCTEUoZGVjb2RlLWxheWVyMiwgCisgIFsgIC0tZGlzYWJsZS1kZWNvZGUtbGF5ZXIyICAgIEV4Y2x1ZGUgbGF5ZXIyIGRlY29kaW5nXSwKKyAgQ09ORklHX0RFQ09ERVJfTDI9IiR7ZW5hYmxldmFsfSIsIENPTkZJR19ERUNPREVSX0wyPSJ5ZXMiKQorCitBTV9DT05ESVRJT05BTChMSUJfV0lUSF9ERUNPREVSLCB0ZXN0ICJ4JHtDT05GSUdfREVDT0RFUn0iID0gInh5ZXMiKQorCitpZiB0ZXN0ICIke0NPTkZJR19ERUNPREVSfSIgIT0gIm5vIiA7IHRoZW4KKwlDT05GSUdfREVDT0RFUj0ieWVzIChMYXllciIKKwlBQ19ERUZJTkUoSEFWRV9NUEdMSUIsIDEsIGJ1aWxkIHdpdGggbXBnbGliIHN1cHBvcnQpCisJQUNfREVGSU5FKERFQ09ERV9PTl9USEVfRkxZLCAxLCBhbGxvdyB0byBjb21wdXRlIGEgbW9yZSBhY2N1cmF0ZSByZXBsYXlnYWluIHZhbHVlKQorICAKKwlpZiB0ZXN0ICIke0NPTkZJR19ERUNPREVSX0wxfSIgIT0gIm5vIjsgdGhlbgorCQlDT05GSUdfREVDT0RFUj0iJHtDT05GSUdfREVDT0RFUn0gMSwiCisJCUFDX0RFRklORShVU0VfTEFZRVJfMSwgMSwgYnVpbGQgd2l0aCBsYXllciAxIGRlY29kaW5nKQorCWZpCisJaWYgdGVzdCAiJHtDT05GSUdfREVDT0RFUl9MMn0iICE9ICJubyI7IHRoZW4KKwkJQ09ORklHX0RFQ09ERVI9IiR7Q09ORklHX0RFQ09ERVJ9IDIsIgorCQlBQ19ERUZJTkUoVVNFX0xBWUVSXzIsIDEsIGJ1aWxkIHdpdGggbGF5ZXIgMiBkZWNvZGluZykKKwlmaQorCUNPTkZJR19ERUNPREVSPSIke0NPTkZJR19ERUNPREVSfSAzKSIKK2ZpCitBQ19NU0dfUkVTVUxUKCRDT05GSUdfREVDT0RFUikKKworCitBQ19NU0dfQ0hFQ0tJTkcoaWYgdGhlIGxhbWUgZnJvbnRlbmQgc2hvdWxkIGJlIGJ1aWxkKQorQUNfQVJHX0VOQUJMRShmcm9udGVuZCwKKyAgWyAgLS1kaXNhYmxlLWZyb250ZW5kICAgICAgICAgRG8gbm90IGJ1aWxkIHRoZSBsYW1lIGV4ZWN1dGFibGUgW2RlZmF1bHQ9YnVpbGRdXSwKKyAgICBXSVRIX0ZST05URU5EPSIke2VuYWJsZXZhbH0iLCBXSVRIX0ZST05URU5EPXllcykKK2lmIHRlc3QgIngke1dJVEhfRlJPTlRFTkR9IiA9ICJ4eWVzIjsgdGhlbgorCVdJVEhfRlJPTlRFTkQ9bGFtZSR7YWNfZXhlZXh0fQorCUFDX01TR19SRVNVTFQoeWVzKQorZWxzZQorCVdJVEhfRlJPTlRFTkQ9CisJQUNfTVNHX1JFU1VMVChubykKK2ZpCisKKworCitBQ19NU0dfQ0hFQ0tJTkcoaWYgbXAzeCBpcyByZXF1ZXN0ZWQpCitBQ19BUkdfRU5BQkxFKG1wM3gsCisgIFsgIC0tZW5hYmxlLW1wM3ggICAgICAgICAgICAgIEJ1aWxkIEdUSyBmcmFtZSBhbmFseXplciBbZGVmYXVsdD1ub11dLAorICAgIFdJVEhfTVAzWD0iJHtlbmFibGV2YWx9IiwgV0lUSF9NUDNYPW5vKQoraWYgdGVzdCAieCR7V0lUSF9NUDNYfSIgPSAieHllcyI7IHRoZW4KKwlXSVRIX01QM1g9bXAzeCR7YWNfZXhlZXh0fQorCUFDX01TR19SRVNVTFQoeWVzKQorZWxzZQorCVdJVEhfTVAzWD0KKwlBQ19NU0dfUkVTVUxUKG5vKQorZmkKKworaWYgdGVzdCAiJHtIQVZFX0dUS30iID0gIm5vIjsgdGhlbgorCWlmIHRlc3QgIngke1dJVEhfTVAzWH0iID0gInhtcDN4IjsgdGhlbgorCQlBQ19NU0dfV0FSTihjYW4ndCBidWlsZCBtcDN4LCBubyBHVEsgaW5zdGFsbGVkKQorCQlXSVRIX01QM1g9CisJZmkKKwlpZiB0ZXN0ICJ4JHtDT05GSUdfQU5BTFlaRVJ9IiAhPSAieHllcyI7IHRoZW4KKwkJQUNfTVNHX1dBUk4oY2FuJ3QgYnVpbGQgbXAzeCBiZWNhdXNlIG9mIGRpc2FibGVkIGFuYWx5emVyIGhvb2tzKQorCQlXSVRIX01QM1g9CisJZmkKK2ZpCisKK0FDX01TR19DSEVDS0lORyhpZiBtcDNydHAgaXMgcmVxdWVzdGVkKQorQUNfQVJHX0VOQUJMRShtcDNydHAsCisgIFsgIC0tZW5hYmxlLW1wM3J0cCAgICAgICAgICAgIEJ1aWxkIG1wM3J0cCBbZGVmYXVsdD1ub11dLAorICAgIFdJVEhfTVAzUlRQPSIke2VuYWJsZXZhbH0iLCBXSVRIX01QM1JUUD1ubykKK2lmIHRlc3QgIngke1dJVEhfTVAzUlRQfSIgPSAieHllcyI7IHRoZW4KKwlpZiB0ZXN0ICR7U09DS0VURlVOQ1RJT059ID0gTk87IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFtmdW5jdGlvbiBzb2NrZXQgaXMgbWFuZGF0b3J5IGZvciBtcDNydHBdKQorCWZpCisJV0lUSF9NUDNSVFA9bXAzcnRwJHthY19leGVleHR9CisJQUNfTVNHX1JFU1VMVCh5ZXMpCitlbHNlCisJV0lUSF9NUDNSVFA9CisJQUNfTVNHX1JFU1VMVChubykKK2ZpCisKKworIworIyB0aGlzIGlzIGZyb20gdm9yYmlzCisjCitkbmwgY2hlY2sgR0xJQkMKK2Nhc2UgJGhvc3QgaW4gCisqODYtKi1saW51eCopCisJIyBnbGliYyA8IDIuMS4zIGhhcyBhIHNlcmlvdXMgRlAgYnVnIGluIHRoZSBtYXRoIGlubGluZSBoZWFkZXIKKwkjIHRoYXQgd2lsbCBjcmlwcGxlIFZvcmJpcy4gIExvb2sgdG8gc2VlIGlmIHRoZSBtYWdpYyBGUCBzdGFjaworCSMgY2xvYmJlciBpcyBtaXNzaW5nIGluIHRoZSBtYXRoaW5saW5lIGhlYWRlciwgdGh1cyBpbmRpY2F0aW5nCisJIyB0aGUgYnVnZ3kgdmVyc2lvbgorCisJQUNfRUdSRVBfQ1BQKGxvZzEwLipmbGRsZzIuKmZ4Y2gsWworCQkjZGVmaW5lIF9fTElCQ19JTlRFUk5BTF9NQVRIX0lOTElORVMgMQorCSAgICAgCSNkZWZpbmUgX19PUFRJTUlaRV9fCisJCSNpbmNsdWRlIDxtYXRoLmg+CisJCV0sYmFkPW1heWJlLGJhZD1ubykKKworCUFDX01TR19DSEVDS0lORyhnbGliYyBtYXRoaW5saW5lIGJ1ZykKKwlpZiB0ZXN0ICR7YmFkfSA9ICJtYXliZSIgO3RoZW4KKwkgICAgICBBQ19FR1JFUF9DUFAobG9nMTAuKmZsZGxnMi4qZnhjaC4qc3RcKFtbMDEyMzQ1Njc4OV1dKlwpLAorCQkJCVsKKwkJCQkjZGVmaW5lIF9fTElCQ19JTlRFUk5BTF9NQVRIX0lOTElORVMgMQorCQkJICAgICAJI2RlZmluZSBfX09QVElNSVpFX18KKwkJCQkjaW5jbHVkZSA8bWF0aC5oPgorCQkJCV0sYmFkPW5vLGJhZD15ZXMpCisJZmkKKwlBQ19NU0dfUkVTVUxUKCR7YmFkfSkKKwlpZiB0ZXN0ICR7YmFkfSA9ICJ5ZXMiIDt0aGVuCisgQUNfTVNHX1dBUk4oWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyBBQ19NU0dfV0FSTihbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipdKQorIEFDX01TR19XQVJOKFsqIFRoZSBnbGliYyBoZWFkZXJzIG9uIHRoaXMgbWFjaGluZSBoYXZlIGEgc2VyaW91cyBidWcgKl0pCisgQUNfTVNHX1dBUk4oWyogaW4gL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGlubGluZS5oICBUaGlzIGJ1ZyBhZmZlY3RzICAqXSkKKyBBQ19NU0dfV0FSTihbKiBhbGwgZmxvYXRpbmcgcG9pbnQgY29kZSwgbm90IG9ubHkgTEFNRSwgYnV0IGFsbCBjb2RlICpdKQorIEFDX01TR19XQVJOKFsqIGJ1aWx0IG9uIHRoaXMgbWFjaGluZS4gVXBncmFkaW5nIHRvIGdsaWJjIDIuMS4zIGlzICAgKl0pCisgQUNfTVNHX1dBUk4oWyogc3Ryb25nbHkgdXJnZWQgdG8gY29ycmVjdCB0aGUgcHJvYmxlbS4gICAgICAgICAgICAgICAqXSkKKyBBQ19NU0dfV0FSTihbKk5vdGU6IHRoYXQgdXBncmFkaW5nIGdsaWJjIHdpbGwgbm90IGZpeCBhbnkgcHJldmlvdXNseSpdKQorIEFDX01TR19XQVJOKFsqIGJ1aWx0IHByb2dyYW1zOyB0aGlzIGlzIGEgY29tcGlsZS10aW1lIGJ1Zy4gICAgICAgICAgKl0pCisgQUNfTVNHX1dBUk4oWyogVG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0gZm9yIHRoaXMgYnVpbGQgb2YgTEFNRSwgICAqXSkKKyBBQ19NU0dfV0FSTihbKiBhdXRvY29uZiBpcyBkaXNhYmxpbmcgYWxsIG1hdGggaW5saW5pbmcuICBUaGlzIHdpbGwgICpdKQorIEFDX01TR19XQVJOKFsqIGh1cnQgTEFNRSBwZXJmb3JtYWNlIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIExBTUUgdG8gICAgKl0pCisgQUNfTVNHX1dBUk4oWyogd29yayBjb3JyZWN0bHkuICBPbmNlIGdsaWJjIGlzIHVwZ3JhZGVkLCByZXJ1biAgICAgICAqXSkKKyBBQ19NU0dfV0FSTihbKiBjb25maWd1cmUgYW5kIG1ha2UgdG8gYnVpbGQgd2l0aCBpbmxpbmluZy4gICAgICAgICAgICpdKQorIEFDX01TR19XQVJOKFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKl0pCisgQUNfTVNHX1dBUk4oWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworCUFDX0RFRklORShfX05PX01BVEhfSU5MSU5FUywgMSwgd29yayBhcm91bmQgYSBnbGliYyBidWcpCisJZmk7OworZXNhYworCisKK2RubCBjb25maWd1cmUgdXNlIG9mIFZCUiBiaXRyYXRlIGhpc3RvZ3JhbQorZG5sIHRvZG86IGFsd2F5cyB1c2UgeWVzIGFzIGRlZmF1bHQsIHVzZSBzaW11bGF0aW9uIGluc3RlYWQgPworQUNfTVNHX0NIRUNLSU5HKHVzZSBvZiBWQlIgYml0cmF0ZSBoaXN0b2dyYW0pCitpZiB0ZXN0ICJ4JHtIQVZFX1RFUk1DQVB9IiAhPSAieCI7IHRoZW4KKyAgVEVSTUNBUF9ERUZBVUxUPSJ5ZXMiCitlbHNlCisgIFRFUk1DQVBfREVGQVVMVD0ibm8iCitmaQorQUNfQVJHX0VOQUJMRShicmhpc3QsIAorICBbICAtLWRpc2FibGUtYnJoaXN0ICAgICAgICAgIEluY2x1ZGUgdGhlIFZCUiBiaXRyYXRlIGhpc3RvZ3JhbSBmZWF0dXJlXQorICBbICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHQ9eWVzXV0sCisgIENPTkZJR19CUkhJU1Q9IiR7ZW5hYmxldmFsfSIsIENPTkZJR19CUkhJU1Q9InllcyIpCitpZiB0ZXN0ICIke0NPTkZJR19CUkhJU1R9IiAhPSAibm8iIDsgdGhlbgorCUFDX0RFRklORShCUkhJU1QsIDEsIGVuYWJsZSBWQlIgYml0cmF0ZSBoaXN0b2dyYW0pCisKKwlpZiB0ZXN0ICIke1RFUk1DQVBfREVGQVVMVH0iID0gInllcyIgOyB0aGVuCisJCUZST05URU5EX0xEQUREPSItbCR7SEFWRV9URVJNQ0FQfSAke0ZST05URU5EX0xEQUREfSIKKwkJQ09ORklHX0JSSElTVD0ieWVzLCB3aXRoICR7SEFWRV9URVJNQ0FQfSIKKwkJQUNfREVGSU5FKEhBVkVfVEVSTUNBUCwgMSwgaGF2ZSB0ZXJtY2FwKQorCWVsc2UKKwkJQ09ORklHX0JSSElTVD0ieWVzLCBzaW11bGF0ZWQgdGVybWNhcCIKKwlmaQorZmkKK0FDX01TR19SRVNVTFQoJHtDT05GSUdfQlJISVNUfSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfQlJISVNULCB0ZXN0ICIke0NPTkZJR19CUkhJU1R9IiAhPSAibm8iKQorCisKKworZG5sICMjIyBwcm9jZXNzb3Igc3BlY2lmaWMgb3B0aW9ucyAjIyMKK1dJVEhfVkVDVE9SPW5vCitjYXNlICRob3N0X2NwdSBpbgoreDg2XzY0fGFtZDY0KQorCUNQVVRZUEU9Im5vIgorCWlmIHRlc3QgJGFjX2N2X2hlYWRlcl94bW1pbnRyaW5faCA9IHllcyA7IHRoZW4KKwkJV0lUSF9YTU09eWVzCisJCVdJVEhfVkVDVE9SPXllcworCWZpCisKKwlBQ19ERUZJTkUoVEFLRUhJUk9fSUVFRTc1NF9IQUNLLCAxLCBJRUVFNzU0IGNvbXBhdGlibGUgbWFjaGluZSkKKwlBQ19ERUZJTkUoVVNFX0ZBU1RfTE9HLCAxLCBmYXN0ZXIgbG9nIGltcGxlbWVudGF0aW9uIHdpdGggbGVzcyBidXQgZW5vdWcKK2ggcHJlY2lzc2lvbikKKwk7OworKjg2KQorCUNQVVRZUEU9ImkzODYiCisJaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3htbWludHJpbl9oID0geWVzIDsgdGhlbgorCQlXSVRIX1hNTT15ZXMKKwkJV0lUSF9WRUNUT1I9eWVzCisJZmkKKworCSMgdXNlIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUgSUVFRSA3NTQgbGF5b3V0CisJQUNfREVGSU5FKFRBS0VISVJPX0lFRUU3NTRfSEFDSywgMSwgSUVFRTc1NCBjb21wYXRpYmxlIG1hY2hpbmUpCisJQUNfREVGSU5FKFVTRV9GQVNUX0xPRywgMSwgZmFzdGVyIGxvZyBpbXBsZW1lbnRhdGlvbiB3aXRoIGxlc3MgYnV0IGVub3VnaCBwcmVjaXNzaW9uKQorCTs7Citwb3dlcnBjKQorCUNQVVRZUEU9Im5vIgorCisJIyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBJRUVFIDc1NCBsYXlvdXQKKwlBQ19ERUZJTkUoVEFLRUhJUk9fSUVFRTc1NF9IQUNLLCAxLCBJRUVFNzU0IGNvbXBhdGlibGUgbWFjaGluZSkKKworCSMgVGhlIGZvbGxvd2luZyBzaG91bGQgbm90IGdldCBlbmFibGVkIG9uIGEgRzUuIEhPV1RPIGNoZWNrIGZvciBhIEc1PworCUFDX0RFRklORShVU0VfRkFTVF9MT0csIDEsIGZhc3RlciBsb2cgaW1wbGVtZW50YXRpb24gd2l0aCBsZXNzIGJ1dCBlbm91Z2ggcHJlY2lzc2lvbikKKwk7OworKikKKwlDUFVUWVBFPSJubyIKKwk7OworZXNhYworCisjIHdoaWNoIHZlY3RvciBjb2RlIGRvIHdlIHN1cHBvcnQgdG8gYnVpbGQgb24gdGhpcyBtYWNoaW5lPworQU1fQ09ORElUSU9OQUwoV0lUSF9YTU0sIHRlc3QgIngke1dJVEhfWE1NfSIgPSAieHllcyIpCisKKyMgbmVlZHMgdG8gYmUgZGVmaW5lZCB0byBsaW5rIGluIHRoZSBpbnRlcm5hbCB2ZWN0b3IgbGliCitBTV9DT05ESVRJT05BTChXSVRIX1ZFQ1RPUiwgdGVzdCAieCR7V0lUSF9WRUNUT1J9IiA9ICJ4eWVzIikKK0FDX01TR19DSEVDS0lORyhpZiBJIGhhdmUgdG8gYnVpbGQgdGhlIGludGVybmFsIHZlY3RvciBsaWIpCitBQ19NU0dfUkVTVUxUKCR7V0lUSF9WRUNUT1J9KQorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEZMT0FUOCBhcyBmbG9hdCkKK0FDX0FSR19FTkFCTEUoYWxsLWZsb2F0LAorICBbICAtLWVuYWJsZS1hbGwtZmxvYXQgICAgICAgICBXaGV0aGVyIHRvIG1ha2UgYWxsIGZsb3RpbmcgcG9pbnQgdmFyaWFibGVzIGFzIGZsb2F0LCBub3QgZG91YmxlXQorICBbICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHQ9bm9dXSwgICAKKyAgICBDT05GSUdfQUxMRkxPQVQ9IiR7ZW5hYmxldmFsfSIsIENPTkZJR19BTExGTE9BVD0ibm8iKQorY2FzZSAiJHtDT05GSUdfQUxMRkxPQVR9IiBpbgorbm8pCisJOzsKK3llcykKKwlBQ19ERUZJTkUoRkxPQVQ4LCBmbG9hdCwgZmxvYXQgaW5zdGVhZCBvZiBkb3VibGUpCisJOzsKKyopCisJQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSDvv70ke0NPTkZJR19BTExGTE9BVH3vv70gZm9yIGFsbC1mbG9hdCBvcHRpb24pCisJOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoJHtDT05GSUdfQUxMRkxPQVR9KQorCisKKworQUNfUEFUSF9QUk9HKE5BU00sIG5hc20sIG5vKQorY2FzZSAiJHtOQVNNfSIgaW4KK25vKQorCTs7CisqKQorCUFDX01TR19DSEVDS0lORyhmb3IgYXNzZW1ibGVyIHJvdXRpbmVzIGZvciB0aGlzIHByb2Nlc3NvciB0eXBlKQorCWZvciByZWN1cnNlX292ZXIgaW4gJHtBU01fRk9SX0FSQ0h9CisJZG8KKwkJaWYgdGVzdCAiJHtDUFVUWVBFfSIgPSAiJHtyZWN1cnNlX292ZXJ9IjsgdGhlbgorCQkJaW5jbHVkZV9hc21fcm91dGluZXM9InllcyIKKwkJZmkKKworCQljYXNlICRob3N0X29zIGluCisJCSpkYXJ3aW4qKQorCQkJIyBjdXJyZW50bHkgd2UgaGF2ZSBwcm9ibGVtcyBiZWNhdXNlIG9mIGEgd3JvbmcKKwkJCSMgbGlidG9vbCBoYWNrIGluIHRoZSBkYXJ3aW4gY2FzZSAoZm9yIG5hc20gY29kZSkKKwkJCWluY2x1ZGVfYXNtX3JvdXRpbmVzPSJubyIKKwkJCTs7CisJCWVzYWMKKwlkb25lCisJaWYgdGVzdCAieCR7aW5jbHVkZV9hc21fcm91dGluZXN9IiA9ICJ4eWVzIjsgdGhlbgorCQlBQ19ERUZJTkUoSEFWRV9OQVNNLCAxLCBoYXZlIG5hc20pCisJCUFDX0RFRklORShNTVhfY2hvb3NlX3RhYmxlLCAxLCB1c2UgTU1YIHZlcnNpb24gb2YgY2hvb3NlX3RhYmxlKQorCWVsc2UKKwkJaW5jbHVkZV9hc21fcm91dGluZXM9Im5vIgorCQlOQVNNPSJubyIKKwlmaQorCUFDX01TR19SRVNVTFQoJHtpbmNsdWRlX2FzbV9yb3V0aW5lc30pCisJOzsKK2VzYWMKK0FNX0NPTkRJVElPTkFMKEhBVkVfTkFTTSwgdGVzdCAiJHtOQVNNfSIgIT0gIm5vIikKKworY2FzZSAkaG9zdF9vcyBpbgorCSpjeWd3aW4qfCptaW5ndzMyKikKKwkJQ1lHV0lOPXllcworCQlOQVNNX0ZPUk1BVD0iLWYgd2luMzIgLURXSU4zMiIKKwkJOzsKKwkqZGFyd2luKikKKwkJTkFTTV9GT1JNQVQ9Ii1mIG1hY2hvIgorCQk7OworCSopCisJCUNZR1dJTj1ubworCQlOQVNNX0ZPUk1BVD0iLWYgZWxmIgorCQk7OworZXNhYworCisjCisjICdleHBvcHQnIGlzIHVzZWQgZm9yICJhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMiLCBub3QgZm9yIG9wdGltaXphdGlvbnMgd2hpY2gKKyMgYXJlIG1hcmtlZCBhcyAiZXhwZXJpbWVudGFsIiBpbiB0aGUgZ3VpZGUgZm9yIHRoZSBjb21waWxlci4KKyMgVGhleSBhcmUgImV4cGVyaW1lbnRhbCIgaGVyZSBpbiB0aGUgTEFNRSBwcm9qZWN0IChhdCBsZWFzdAorIyAiLS1lbmFibGUtZXhwb3B0PWZ1bGwiKS4KKyMKK0FDX01TR19DSEVDS0lORyhmb3IgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zKQorQUNfQVJHX0VOQUJMRShleHBvcHQsCisgIFsgIC0tZW5hYmxlLWV4cG9wdD1mdWxsLG5vcm0gIFdoZXRoZXIgdG8gZW5hYmxlIGV4cGVyaW1lbnRhbCBvcHRpbWl6YXRpb25zXQorICBbICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHQ9bm9dXSwgICAKKyAgICBDT05GSUdfRVhQT1BUPSIke2VuYWJsZXZhbH0iLCBDT05GSUdfRVhQT1BUPSJubyIpCisKK2lmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorCSMgZ2NjIGRlZmF1bHRzLiBPUyBzcGVjaWZpYyBvcHRpb25zIGdvIGluIHZlcnNpb3VzIHNlY3Rpb25zIGJlbG93CisJIyBmcm9tIHRoZSBnY2MgbWFuIHBhZ2VzOiAgInRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2UgLXBlZGFudGljIgorCWlmIHRlc3QgIngke3dpdGhfZ251X2xkfSIgPSAieHllcyI7IHRoZW4KKwkJQ0ZMQUdTPSItV2FsbCAtcGlwZSAke0NGTEFHU30iCisJZWxzZQorCQkjIHNvbWUgdmVuZG9yIGxkJ3MgZG9uJ3QgbGlrZSAnLXBpcGUnCisJCUNGTEFHUz0iLVdhbGwgJHtDRkxBR1N9IgorCWZpCisKKwkjIEdDQyB2ZXJzaW9uIHNwZWNpZmljIGdlbmVyaWMgb3B0aW9ucworCWNhc2UgIiR7R0NDX3ZlcnNpb259IiBpbgorCTIuOTYqKQorICAgICAgICAJIyBmb3IgYnVnZ3kgdmVyc2lvbiBvZiBnY2Mgc2hpcHBlZCB3aXRoIFJINy4xLCBiYWNrIG9mIG9uIHNvbWUKKyAgICAgICAgCSMgb3B0aW1pemF0aW9ucworICAgICAgICAJT1BUSU1JWkFUSU9OPSItTyAtZm9taXQtZnJhbWUtcG9pbnRlciAtZmZhc3QtbWF0aCBcCisJCQktZnVucm9sbC1sb29wcyIKKwkJT1BUSU1JWkFUSU9OX0ZVTEw9Ii1mbW92ZS1hbGwtbW92YWJsZXMgLWZyZWR1Y2UtYWxsLWdpdnMgXAorCQkJLWZzY2hlZC1pbnRlcmJsb2NrIC1mYnJhbmNoLWNvdW50LXJlZyAtZmZvcmNlLWFkZHIgXAorCQkJLWZmb3JjZS1tZW0iCisgICAgICAgIAk7OworCTMuMCopCisJCSMgLWZ1bnJvbGwtbG9vcHMgc2VlbXMgdG8gcHJvZHVjZSBidWdneSBjb2RlIHdpdGggZ2NjIDMuMC4zCisJCU9QVElNSVpBVElPTj0iLU8gLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZmYXN0LW1hdGgiCisJCU9QVElNSVpBVElPTl9GVUxMPSItZm1vdmUtYWxsLW1vdmFibGVzIC1mcmVkdWNlLWFsbC1naXZzIFwKKwkJCS1mYnJhbmNoLWNvdW50LXJlZyAtZmZvcmNlLWFkZHIgLWZmb3JjZS1tZW0iCisJCTs7CisJMy4qfDQuMC4qfDQuMS4qKQorCQkjIC1mb21pdC1mcmFtZS1wb2ludGVyIHNlZW1zIHRvIGJlIGJ1Z2d5IG9uIGN5Z3dpbgorCQljYXNlICR7aG9zdF9vc30gaW4KKwkJKmN5Z3dpbiopCisJCQlPTUlUX0ZSQU1FX1BPSU5URVI9CisJCQk7OworCQkqKQorCQkJT01JVF9GUkFNRV9QT0lOVEVSPS1mb21pdC1mcmFtZS1wb2ludGVyCisJCQk7OworCQllc2FjCisKKwkJT1BUSU1JWkFUSU9OPSItTzMgJHtPTUlUX0ZSQU1FX1BPSU5URVJ9IC1mZmFzdC1tYXRoIgorCQlPUFRJTUlaQVRJT05fRlVMTD0iLWZtb3ZlLWFsbC1tb3ZhYmxlcyAtZnJlZHVjZS1hbGwtZ2l2cyBcCisJCQktZmJyYW5jaC1jb3VudC1yZWcgLWZmb3JjZS1hZGRyIC1mZm9yY2UtbWVtIgorCQk7OworCTQuKikKKwkJT1BUSU1JWkFUSU9OPSItTzMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZmYXN0LW1hdGgiCisJCU9QVElNSVpBVElPTl9GVUxMPSItZmJyYW5jaC1jb3VudC1yZWcgLWZmb3JjZS1hZGRyIgorCQk7OworCSopCisJCSMgZGVmYXVsdAorCQlPUFRJTUlaQVRJT049Ii1PMyAke09NSVRfRlJBTUVfUE9JTlRFUn0gLWZmYXN0LW1hdGggXAorCQkJLWZ1bnJvbGwtbG9vcHMiCisJCU9QVElNSVpBVElPTl9GVUxMPSItZmJyYW5jaC1jb3VudC1yZWcgLWZmb3JjZS1hZGRyIgorCQk7OworCWVzYWMKKworCisJIyBHQ0MgdmVyc2lvbiBpbmRlcGVuZGVuZCBnZW5lcmljIG9wdGlvbnMKKwlPUFRJTUlaQVRJT05fTk9STT0iLWZzY2hlZHVsZS1pbnNuczIiCisKKworCSMgZ2VuZXJpYyBDUFUgc3BlY2lmaWMgb3B0aW9ucworCWNhc2UgJHtob3N0X2NwdX0gaW4KKwlzcGFyYykKKwkJY2FzZSAiJHtHQ0NfdmVyc2lvbn0iIGluCisJCTMuMCopCisJCQk7OworCQkzLip8NC4qKQorCQkJIyBkb2Vzbid0IHdvcmsgb24gMy4wLngsIGJ1dCBvbiAzLlsxMl0gYW5kCisJCQkjIGhvcGVmdWxseSBvbiBldmVyeSBvdGhlciByZWxlYXNlIGFmdGVyIHRoYXQgdG9vCisJCQlpZiB0ZXN0IC14IC91c3IvYmluL2lzYWxpc3Q7IHRoZW4KKwkJCQkvdXNyL2Jpbi9pc2FsaXN0IHwgZ3JlcCBzcGFyY3Y4cGx1cyBcCisJCQkJCT4vZGV2L251bGwgMj4mMSAmJiBcCisJCQkJCU9QVElNSVpBVElPTj0iJHtPUFRJTUlaQVRJT059IFwKKwkJCQkJCS1tY3B1PXVsdHJhc3BhcmMgXAorCQkJCQkJLW10dW5lPXVsdHJhc3BhcmMiCisJCQlmaQorCQkJOzsKKwkJZXNhYworCQk7OworCSo4NikKKwkJY2FzZSAiJHtHQ0NfdmVyc2lvbn0iIGluCisJCTMuKnw0LiopCisJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSBcCisJCQkJLW1hY2N1bXVsYXRlLW91dGdvaW5nLWFyZ3MiCisJCQk7OworCQllc2FjCisJCTs7CisJZXNhYworCisJZXhwb3B0X21zZ19yZXN1bHRfcHJpbnRlZD1ubworCWNhc2UgIiR7Q09ORklHX0VYUE9QVH0iIGluCisJbm8pCisJCSMgaWYgc29tZW9uZSBzdXBwbGllcyBvd24gQ0ZMQUdTLCB3ZSBkb24ndCBhZGQgb3VyIG93bgorCQlpZiB0ZXN0ICJ4JHthY19zYXZlX0NGTEFHU30iICE9ICJ4IjsgdGhlbiAKKwkJCU9QVElNSVpBVElPTj0iIgorCQlmaQorCQk7OworCW5vcm18eWVzKQorCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAke09QVElNSVpBVElPTl9OT1JNfSIKKwkJOzsKKwlmdWxsKQorCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAke09QVElNSVpBVElPTl9OT1JNfSBcCisJCQkke09QVElNSVpBVElPTl9GVUxMfSIKKworCQkjIHNvbWUgaGFyZHdhcmUgZGVwZW5kZW5kIG9wdGlvbnMKKwkJY2FzZSAiJHtHQ0NfdmVyc2lvbn0iIGluCisJCTIuOSp8My4qfDQuMC4qfDQuMS4qKQorCQkJIyAibmV3IiBHQ0MsIHVzZSBzb21lICJuZXciIENQVSBzcGVjaWZpYyBvcHRpbWl6YXRpb25zCisJCQkjIHVzZSAtbXR1bmUgaW5zdGVhZCBvZiAtbTQ4NiBvciAtbWNwdT0gZXRjLCBzaW5jZSB0aGV5IGFyZQorCQkJIyBkZXByZWNhdGVkIGJ5IEdDQyA8cmJyaXRvPgorCQkJY2FzZSAke2hvc3RfY3B1fSBpbgorCQkJKjQ4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWNwdT1pNDg2IFwKKwkJCQkJLW1mYW5jeS1tYXRoLTM4NyIKKwkJCQk7OworCQkJKjU4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWNwdT1wZW50aXVtIFwKKwkJCQkJLW1hcmNoPXBlbnRpdW0gLW1mYW5jeS1tYXRoLTM4NyIKKwkJCQk7OworCQkJKjY4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWNwdT1wZW50aXVtcHJvIFwKKwkJCQkJLW1hcmNoPXBlbnRpdW1wcm8gLW1mYW5jeS1tYXRoLTM4NyBcCisJCQkJCS1tYWxpZ24tZG91YmxlIgorCQkJCTs7CisJCQkqODYpCisJCQkJT1BUSU1JWkFUSU9OPSIke09QVElNSVpBVElPTn0gLW1mYW5jeS1tYXRoLTM4NyIKKwkJCQk7OworCQkJYWxwaGEqKQorCQkJCU9QVElNSVpBVElPTj0iJHtPUFRJTUlaQVRJT059IC1tZnAtcmVncyIKKwkJCQlBQ19ERUZJTkUoRkxPQVQsIGRvdWJsZSwgZG91YmxlIGlzIGZhc3RlciB0aGFuIGZsb2F0IG9uIEFscGhhKQorCQkJCSMgYWRkICItbWNwdT0yMTE2NGEgLVdhLC1tMjExNjRhIiB0byBvcHRpbWl6ZQorCQkJCSMgZm9yIDIxMTY0YSAoZXY1NikgQ1BVCisJCQkJOzsKKwkJCSopCisJCQkJT1BUSU1JWkFUSU9OPSIke09QVElNSVpBVElPTn0gLWZkZWxheWVkLWJyYW5jaCIKKwkJCQk7OworCQkJZXNhYworCQkJOzsKKwkJNC4qKQorCQkJY2FzZSAke2hvc3RfY3B1fSBpbgorCQkJKjQ4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWFyY2g9aTQ4NiIKKwkJCQk7OworCQkJKjU4NikKKwkJCQlPUFRJTUlaQVRJT049IiR7T1BUSU1JWkFUSU9OfSAtbWFyY2g9aTU4NiBcCisJCQkJCS1tdHVuZT1uYXRpdmUiCisJCQkJOzsKKwkJCSo2ODYpCisJCQkJT1BUSU1JWkFUSU9OPSIke09QVElNSVpBVElPTn0gLW1hcmNoPWk2ODYgXAorCQkJCQktbXR1bmU9bmF0aXZlIgorCQkJCTs7CisJCQkqODYpCisJCQkJT1BUSU1JWkFUSU9OPSIke09QVElNSVpBVElPTn0gLW1hcmNoPWdlbmVyaWMgXAorCQkJCQktbXR1bmU9bmF0aXZlIgorCQkJCTs7CisJCQllc2FjCisJCQk7OworCQkqKQorCQkJIyBubyBzcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb3RoZXIgdmVyc2lvbnMKKwkJCUFDX01TR19SRVNVTFQobm8pCisJCQlleHBvcHRfbXNnX3Jlc3VsdF9wcmludGVkPXllcworCQkJQUNfTVNHX1dBUk4oTEFNRSBkb2Vzbid0IGtub3cgYWJvdXQgeW91ciB2ZXJzaW9uICgke0dDQ192ZXJzaW9ufSkgb2YgZ2NjLCBwbGVhc2UgcmVwb3J0IGl0IHRvIGxhbWUtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgdHJ5IHRoZSBsYXRlc3QgTEFNRSB2ZXJzaW9uIGZpcnN0ISkKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwkqKQorCQlBQ19NU0dfRVJST1IoYmFkIHZhbHVlIO+/vSR7Q09ORklHX0VYUE9QVH3vv70gZm9yIGV4cG9wdCBvcHRpb24pCisJCTs7CisJZXNhYworCisJaWYgdGVzdCAiJHtleHBvcHRfbXNnX3Jlc3VsdF9wcmludGVkfSIgPSAibm8iIDsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKCR7Q09ORklHX0VYUE9QVH0pCisJZmkKK2Vsc2UKKwlBQ19NU0dfUkVTVUxUKG5vKQorZmkKKworCisKKworCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIGRlYnVnIG9wdGlvbnMpCitBQ19BUkdfRU5BQkxFKGRlYnVnLAorICBbICAtLWVuYWJsZS1kZWJ1Zz1hbG90LG5vcm0gICBFbmFibGUgZGVidWdnaW5nIChkaXNhYmxlcyBvcHRpbWl6YXRpb25zKV0KKyAgWyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0PW5vXV0sCisgICAgQ09ORklHX0RFQlVHPSIke2VuYWJsZXZhbH0iLCBDT05GSUdfREVCVUc9Im5vIikKKworaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisJREVCVUdfTk9STV9PUFQ9Ii1PIC1nIC1XYWxsIgorCURFQlVHX0FOT1lJTkc9Ii1XYmFkLWZ1bmN0aW9uLWNhc3QgLVdjYXN0LWFsaWduIFwKKwkJLVdjYXN0LXF1YWwgLVdjaGFyLXN1YnNjcmlwdHMgLVdjb252ZXJzaW9uIFwKKwkJLVdtaXNzaW5nLXByb3RvdHlwZXMgLVduZXN0ZWQtZXh0ZXJucyAtV3BvaW50ZXItYXJpdGggXAorCQktV3JlZHVuZGFudC1kZWNscyAtV3NoYWRvdyAtV3N0cmljdC1wcm90b3R5cGVzIFwKKwkJLVd3cml0ZS1zdHJpbmdzIC1XaW5saW5lIFwKKwkJLVdmb3JtYXQgLVdzd2l0Y2ggLVdhZ2dyZWdhdGUtcmV0dXJuIC1XbWlzc2luZy1ub3JldHVybiBcCisJCS1XaW1wbGljaXQtaW50IC1mbm8tYnVpbHRpbiIKKworCWNhc2UgIiR7Q09ORklHX0RFQlVHfSIgaW4KKwlubykKKwkJQUNfREVGSU5FKE5ERUJVRywgMSwgbm8gZGVidWcgYnVpbGQpCisJCTs7CisJbm9ybXx5ZXMpCisJCUFDX0RFRklORShBQk9SVEZQLCAxLCBkZWJ1ZyBkZWZpbmUpCisJCU9QVElNSVpBVElPTj0iJHtERUJVR19OT1JNX09QVH0iCisJCTs7CisJYW5veWluZykKKwkJQUNfREVGSU5FKEFCT1JURlAsIDEsIGRlYnVnIGRlZmluZSkKKwkJT1BUSU1JWkFUSU9OPSIke0RFQlVHX05PUk1fT1BUfSAke0RFQlVHX0FOT1lJTkd9IgorCQk7OworCWFsb3QpCisJCUFDX0RFRklORShBQk9SVEZQLCAxLCBkZWJ1ZyBkZWZpbmUpCisJCUFDX0RFRklORShERUJVRywgMSwgYWxvdCBvZiBkZWJ1ZyBvdXRwdXQpCisJCU9QVElNSVpBVElPTj0iJHtERUJVR19OT1JNX09QVH0iCisJCTs7CisJKikKKwkJQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSDvv70ke0NPTkZJR19ERUJVR33vv70gZm9yIGRlYnVnIG9wdGlvbikKKwllc2FjCisKKwlBQ19NU0dfUkVTVUxUKCR7Q09ORklHX0RFQlVHfSkKK2Vsc2UKKwlBQ19NU0dfUkVTVUxUKG5vKQorZmkKKworCisKK2RubCAjIyMgIHN5c3RlbSBzcGVjaWZpYyBvcHRpb25zICAjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTElOVVggb24gRGlnaXRhbC9Db21wYXEgQWxwaGEgQ1BVcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Nhc2UgJGhvc3QgaW4KK2FscGhhKi0qLWxpbnV4KikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyBDaGVjayBpZiAnY2NjJyBpcyBpbiBvdXIgcGF0aAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiYHdoaWNoIGNjYyAyPi9kZXYvbnVsbCB8IGdyZXAgLWMgY2NjYCIgIT0gIjAiIDsgdGhlbgorCSMgQ29tcGFxJ3MgQyBDb21waWxlcgorCUNDPWNjYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIHNldCAnT1BUSU1JWkFUSU9OID0gLWFyY2ggaG9zdCAtdHVuZSBob3N0JyAKKyMjIyMgICAgICAgICAgICAgIHRvIGdlbmVyYXRlL3R1bmUgaW5zdHJ1Y3Rpb25zIGZvciB0aGlzIG1hY2hpbmUKKyMjIyMgICAgICdPUFRJTUlaQVRJT04gKz0gLW1pZ3JhdGUgLWZhc3QgLWlubGluZSBzcGVlZCAtdW5yb2xsIDAnIAorIyMjIyAgICAgICAgICAgICAgdHdlYWsgdG8gcnVuIGFzIGZhc3QgYXMgcG9zc2libGUgOikKKyMjIyMgICAgICdPUFRJTUlaQVRJT04gKz0gLXcwJyAKKyMjIyMgICAgICAgICAgICAgIHNldCB3YXJuaW5nIGFuZCBsaW5raW5nIGZsYWdzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJT1BUSU1JWkFUSU9OPSItYXJjaCBob3N0IC10dW5lIGhvc3QiCisJT1BUSU1JWkFUSU9OPSItbWlncmF0ZSAtZmFzdCAtaW5saW5lIHNwZWVkIC11bnJvbGwgMCAkT1BUSU1JWkFUSU9OIgorCU9QVElNSVpBVElPTj0iLXcwICRPUFRJTUlaQVRJT04iCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyB0byBkZWJ1ZywgdW5jb21tZW50CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJIyBGb3IgRGVidWdnaW5nCisJI09QVElNSVpBVElPTj0iLWczICRPUFRJTUlaQVRJT04iCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMgZGVmaW5lIF9fREVDQUxQSEFfXyAoaSB3YXMgZ2V0dGluZyByZS1kZWNsYXJhdGlvbiB3YXJuaW5ncworIyMjIyAgIGluIG1hY2hpbmUuaAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSMgRGVmaW5lIERFQyBBbHBoYQorCUFDX0RFRklORShfX0RFQ0FMUEhBX18sIDEsIHdlJ3JlIG9uIERFQyBBbHBoYSkKK2ZpICAjICBnY2Mgb3IgY2NjPworOzsgIyBhbHBoYQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFN1bk9TCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3BhcmMtKi1zdW5vczQqKQorCWlmIHRlc3QgQ0MgPSAiY2MiOyB0aGVuCisJCU9QVElNSVpBVElPTj0iLU8gLXhDQyIKKwkJTUFLRURFUD0iLXhNIgorCQkjIGZvciBnY2MsIHVzZSBpbnN0ZWFkOgorCQkjICAgQ0M9ImdjYyIKKwkJIyAgIE9QVElNSVpBVElPTj0iLU8iCisJCSMgICBNQUtFREVQPSItTSIKK0FDX01TR19XQVJOKFtQbGVhc2UgY29udGFjdCBsYW1lQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbmZpZ3VyZSBydW4gYW5kIHRoZSBmaWxlIGNvbmZpZy5jYWNoZS4gVGhhbmsgeW91IGZvciB5b3VyIGNvb3BlcmF0aW9uLl0pCisJZmkKKzs7ICNTdW5PUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTR0kKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisqLXNnaS1pcml4KikKKwlpZiB0ZXN0IENDID0gImNjIjsgdGhlbgorCQlPUFRJTUlaQVRJT049Ii1PMyAtd29mZiBhbGwiCisJZmkKKzs7ICMgU0dJCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBhcSBBbHBoYSBydW5uaW5nIERlYyBVbml4IChPU0YpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYWxwaGEqLWRlYy1vc2YqKQorCWlmIHRlc3QgQ0MgPSAiY2MiOyB0aGVuCisJCU9QVElNSVpBVElPTj0iLWZhc3QgLU8zIC1zdGQgLWczIC1ub25fc2hhcmVkIgorCWZpCis7OyAjT1NGCitlc2FjCisKKyMgdG9kbzogaW5jbHVkZSB0aGUgZm9sbG93aW5nIHRlc3RzIGluIHRoZSBjYXNlLWxpc3QKK1VOQU1FPWB1bmFtZWAKK0FSQ0g9YHVuYW1lIC1tYAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTU9TWFMgKFJoYXBzb2R5IFBQQykKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiJFVOQU1FIiA9ICJSaGFwc29keSI7IHRoZW4KKyMgICBDQz0iY2MiICAgIyBzaG91bGQgYmUgaGFuZGxlZCBhbHJlYWR5IGJ5IGF1dG9jb25mCisgICBNQUtFREVQPSItbWFrZSIKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNQUMgT1NYICBEYXJ3aW4gUFBDCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIHRlc3QgIiRVTkFNRSIgPSAiRGFyd2luIjsgdGhlbgorICAgTUFLRURFUD0iLW1ha2UiCisgICBDRkxBR1M9IiRDRkxBR1MgLWZuby1jb21tb24iCitmaQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9TLzIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByb3Blcmx5IGluc3RhbGxlZCBFTVggcnVudGltZSAmIGRldmVsb3BtZW50IHBhY2thZ2UgaXMgYSBwcmVyZXF1aXNpdGUuCisjIHRvb2xzIEkgdXNlZDogbWFrZSAzLjc2LjEsIHVuYW1lIDEuMTIsIHNlZCAyLjA1LCBQRC1rc2ggNS4yLjEzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiJFVOQU1FIiA9ICJPUy8yIjsgdGhlbgorICAgU0hFTEw9c2gKKyAgICNDQz1nY2MgIyBzaG91bGQgYWxyZWFkeSBiZSBoYW5kbGVkIGJ5IGNvbmZpZ3VyZQorCisgICAjIGZpbGUgZXh0ZW5zaW9uIHNob3VsZCBhbHJlYWR5IGJlIGhhbmRsZWQgYnkgYXV0b21ha2UgKEkgZG9uJ3Qga25vdywKKyAgICMgcGxlYXNlICBnaXZlIGZlZWRiYWNrIQorICAgI0ZJTEVfRVhURU5TSU9OPSIuZXhlIgorCisjIFVuY29tbWVudCAmIGluc3BlY3QgdGhlIEdUSyBsaW5lcyB0byB1c2UgTVAzeCBHVEsgZnJhbWUgYW5hbHl6ZXIuCisjIFByb3Blcmx5IGluc3RhbGxlZCBYRnJlZTg2L2RldmxpYnMgJiBHVEsrIGlzIGEgcHJlcmVxdWlzaXRlLgorIyBUaGUgZm9sbG93aW5nIHdvcmtzIGZvciBtZSB1c2luZyBYZnJlZTg2L09TMiAzLjMuNSBhbmQgR1RLKyAxLjIuMzoKKyMgICBBQ19ERUZJTkUoSEFWRV9HVEssIDEsIGhhdmUgR1RLKQorIyAgIEFDX0RFRklORShfX1NUX01UX0VSUk5PX18sIDEpCisjICAgSU5DTFVERVM9Ii1JQzovWEZyZWU4Ni9pbmNsdWRlL2d0azEyIC1JQzovWEZyZWU4Ni9pbmNsdWRlL2dsaWIxMiBcCisjICAgICAgICAgICAgIC1JQzovWEZyZWU4Ni9pbmNsdWRlICRJTkNMVURFUyIKKyMgICBGUk9OVEVORF9MREZMQUdTPSItTEM6L1hGcmVlODYvbGliIC1sZ3RrMTIgLWxnZGsxMiAtbGdtb2R1bGUgLWxnbGliMTIgXAorIyAgICAgICAgICAgICAtbFhleHQgLWxYMTEgLWxzaG0gLWxic2QgLWxzb2NrZXQgLWxtICRGUk9OVEVORF9MREZMQUdTIgorIyAgIEZST05URU5EX0NGTEFHUz0iLVptdGQgLVpzeXN2LXNpZ25hbHMgLVpiaW4tZmlsZXMgJEZST05URU5EX0NGTEFHUyIKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBbWlnYU9TCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHlwZSAnTWFrZSBBUkNIPVBQQycgZm9yIFBvd2VyVVAgYW5kICdNYWtlIEFSQ0g9V09TJyBmb3IgV2FycE9TCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIHRlc3QgIiRVTkFNRSIgPSAiQW1pZ2FPUyIgOyB0aGVuCisJQ0M9ImdjYyAtbm9peGVtdWwiCisJT1BUSU1JWkFUSU9OPSIkT1BUSU1JWkFUSU9OIC1tNjgwMjAtNjAgLW02ODg4MSIKKwlNQUtFREVQPSItTU0iCisJaWYgdGVzdCAiJEFSQ0giID0gIldPUyI7IHRoZW4KKwkJQ0M9InBwYy1hbWlnYW9zLWdjYyAtd2FycHVwIgorCQlPUFRJTUlaQVRJT049IiRPUFRJTUlaQVRJT04gLW1tdWx0aXBsZSAtbWNwdT02MDNlIgorCQlBUj0icHBjLWFtaWdhb3MtYXIiCisJCVJBTkxJQj0icHBjLWFtaWdhb3MtcmFubGliIgorCWZpCisJaWYgdGVzdCAiJEFSQ0giLFBQQzsgdGhlbgorCQlDQz0icHBjLWFtaWdhb3MtZ2NjIgorCQlPUFRJTUlaQVRJT049IiRPUFRJTUlaQVRJT04gLW1tdWx0aXBsZSAtbWNwdT02MDNlIgorCQlBUj0icHBjLWFtaWdhb3MtYXIiCisJCVJBTkxJQj0icHBjLWFtaWdhb3MtcmFubGliIgorCWZpCitmaQorCisKK0NGTEFHUz0iJHtPUFRJTUlaQVRJT059ICR7Q0ZMQUdTfSIKK0xEQUREPSIke0xEQUREfSIKK0ZST05URU5EX0xEQUREPSIke0ZST05URU5EX0xEQUREfSAke0NPTkZJR19NQVRIX0xJQn0iCisKKworQUNfU1VCU1QoSU5DTFVERVMpCisKK0FDX1NVQlNUKEZST05URU5EX0xERkxBR1MpCitBQ19TVUJTVChGUk9OVEVORF9DRkxBR1MpCitBQ19TVUJTVChGUk9OVEVORF9MREFERCkKK0FDX1NVQlNUKENPTkZJR19NQVRIX0xJQikKK0FDX1NVQlNUKExEQUREKQorCitBQ19TVUJTVChMSUJfTUFKT1JfVkVSU0lPTikKK0FDX1NVQlNUKExJQl9NSU5PUl9WRVJTSU9OKQorCitBQ19TVUJTVChOQVNNKQorQUNfU1VCU1QoTkFTTV9GT1JNQVQpCisKK0FDX1NVQlNUKE1BS0VERVApCitBQ19TVUJTVChSTV9GKQorCitBQ19TVUJTVChMSUJUT09MX0RFUFMpCisKK0FDX1NVQlNUKFdJVEhfRlJPTlRFTkQpCitBQ19TVUJTVChXSVRIX01QM1gpCitBQ19TVUJTVChXSVRIX01QM1JUUCkKKworQUNfU1VCU1QoQ1BVVFlQRSkKK0FDX1NVQlNUKENQVUNDT0RFKQorCitBQ19TVUJTVChDT05GSUdfREVGUykKKworQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBsaWJtcDNsYW1lL01ha2VmaWxlIGxpYm1wM2xhbWUvaTM4Ni9NYWtlZmlsZSBsaWJtcDNsYW1lL3ZlY3Rvci9NYWtlZmlsZSBmcm9udGVuZC9NYWtlZmlsZSBtcGdsaWIvTWFrZWZpbGUgZG9jL01ha2VmaWxlIGRvYy9odG1sL01ha2VmaWxlIGRvYy9tYW4vTWFrZWZpbGUgaW5jbHVkZS9NYWtlZmlsZSBEbGwvTWFrZWZpbGUgbWlzYy9NYWtlZmlsZSBkZWJpYW4vTWFrZWZpbGUgZHNob3cvTWFrZWZpbGUgQUNNL01ha2VmaWxlIEFDTS9BRGJnL01ha2VmaWxlIEFDTS9kZGsvTWFrZWZpbGUgQUNNL3Rpbnl4bWwvTWFrZWZpbGUgbGFtZS5zcGVjIG1hYy9NYWtlZmlsZSBtYWNvc3gvTWFrZWZpbGUgbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUgbWFjb3N4L0xBTUUueGNvZGVwcm9qL01ha2VmaWxlXSB2Y19zb2x1dGlvbi9NYWtlZmlsZSkKKworQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9kZWJpYW4vTWFrZWZpbGUuYW0gYi9kZWJpYW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkYWZmMAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE5IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS41LjEwLjEgMjAxMC8wMy8yMSAxMjoyODo0NCByb2JlcnQgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCitFWFRSQV9ESVNUID0gXAorCWNoYW5nZWxvZyBcCisJY29tcGF0IFwKKwljb250cm9sIFwKKwljb3B5cmlnaHQgXAorCWxpYm1wM2xhbWUwLWRldi5kb2NzIFwKKwlsaWJtcDNsYW1lMC1kZXYuZmlsZXMgXAorCWxpYm1wM2xhbWUwLmZpbGVzIFwKKwlsYW1lLmRvY3MgXAorCWxhbWUuZmlsZXMgXAorCXJ1bGVzCisKK2Rpc3QtaG9vazoKKwljaG1vZCAreCAkKGRpc3RkaXIpL3J1bGVzCisKZGlmZiAtLWdpdCBhL2RlYmlhbi9NYWtlZmlsZS5pbiBiL2RlYmlhbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE2MDhlCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzc0IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBnbG9iYWwgc2VjdGlvbiBmb3IgZXZlcnkgTWFrZWZpbGUuYW0KK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAorCSQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCitzdWJkaXIgPSBkZWJpYW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gMS45IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRVhUUkFfRElTVCA9IFwKKwljaGFuZ2Vsb2cgXAorCWNvbXBhdCBcCisJY29udHJvbCBcCisJY29weXJpZ2h0IFwKKwlsaWJtcDNsYW1lMC1kZXYuZG9jcyBcCisJbGlibXAzbGFtZTAtZGV2LmZpbGVzIFwKKwlsaWJtcDNsYW1lMC5maWxlcyBcCisJbGFtZS5kb2NzIFwKKwlsYW1lLmZpbGVzIFwKKwlydWxlcworCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBkZWJpYW4vTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGRlYmlhbi9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicwordGFnczogVEFHUworVEFHUzoKKworY3RhZ3M6IENUQUdTCitDVEFHUzoKKworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgXAorCSAgZGlzdC1ob29rCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3QtaG9vayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgXAorCWluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBlbmQgZ2xvYmFsIHNlY3Rpb24KKworZGlzdC1ob29rOgorCWNobW9kICt4ICQoZGlzdGRpcikvcnVsZXMKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2RlYmlhbi9jaGFuZ2Vsb2cgYi9kZWJpYW4vY2hhbmdlbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzUwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY2hhbmdlbG9nCkBAIC0wLDAgKzEsMjQyIEBACitsYW1lICgzLjk4LjMpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIGJ1Z2ZpeCB2ZXJzaW9uLgorICAqIGRlYmlhbi9ydWxlczoKKyAgICArIHJlbW92ZSBleGNlc3NpdmUgcXVvdGluZyBmcm9tIHRoZSBMREZMQUdTIHZhcmlhYmxlLgorICAgICsgcmVtb3ZlIHVzZWxlc3MgY29tbWVudHMgZnJvbSB0aGUgZmlsZSwgdG8gbWFrZSBpdCB0aWRpZXIuCisgICAgKyBtYWtlIHRoZSBkZXRlY3Rpb24gb2YgdGhlIGNyb3NzLWNvbXBpbGF0aW9uIG1vcmUgcm9idXN0LgorICAgICsgYXZvaWQgcGFzc2luZyAtTzIgdG8gQ0ZMQUdTLCBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSBmb3Igc2l6ZS4KKyAgKiBkZWJpYW4vY29udHJvbDoKKyAgICArIGFkZCAke21pc2M6RGVwZW5kc30gdG8gZWFjaCBiaW5hcnkgcGFja2FnZSAoZHVlIHRvIGRlYmhlbHBlcikuCisgICogZGViaWFuL2NvcHlyaWdodDoKKyAgICArIHVwZGF0ZSBjb3B5cmlnaHQgeWVhcnMuCisgICAgKyBhZGQgdGhlIMKpIHN5bWJvbCwgc2luY2UgKEMpIG1heSBub3QgaGF2ZSBsZWdhbCB2YWx1ZS4KKyAgICArIHVwZGF0ZSByZWZlcmVuY2UgdG8gYSB2ZXJzaW9uZWQgTEdQTC4KKworIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgV2VkLCAyNCBGZWIgMjAxMCAwNDo1MTozNCAtMDMwMAorCitsYW1lICgzLjk4LjEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHZlcnNpb246CisgICAgKyBGaXggZXhlY3V0YWJsZSBzdGFja3MgKFRoYW5rcyB0byBHZW50b28gcGVvcGxlKTsKKyAgICArIEZpeCBmb3IgdGV4dCByZWxvY2F0aW9ucyAoVGhhbmtzIHRvIHRoZSBQYVggVGVhbSBhbmQgR2VudG9vIHBlb3BsZSkuCisgICogY2hhbmdlcyBhcmUgbm93IChtb3N0bHkpIGNvbW1pdHRlZCB0byBjaGFuZ2Vsb2cuCisgICogZGViaWFuL3J1bGVzOiBpbmNsdWRlIC1XbCwtLWFzLW5lZWRlZCBmb3IgdGhlIGxvYWRlciBhdCBjb21waWxlIHRpbWUuCisgICogTnVtZXJvdXMgaW1wcm92ZW1lbnRzIHRoYW5rcyB0byBGYWJpYW4gR3JlZmZyYXRoLiBTaW5jZXJlIHRoYW5rcy4KKworIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgU2F0LCAxMiBKdWwgMjAwOCAwOToxNDo1NCAtMDMwMAorCitsYW1lICgzLjk4KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIFByZXBhcmF0aW9uIGZvciB0aGUgZmluYWwgcmVsZWFzZS4KKworIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgU3VuLCAyOSBKdW4gMjAwOCAxODoyOTowOSAtMDMwMAorCitsYW1lICgzLjk4fmJldGE4K2N2czIwMDgwNjI0KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIFByZXBhcmF0aW9uIGZvciB0aGUgbmV3IHVwc3RyZWFtIHJlbGVhc2UgKGxhbWUgMy45OCBmaW5hbCkuCisgICogZGViaWFuL2NvbnRyb2w6IGVsaW1pbmF0ZSBidWlsZCBkZXBlbmRlbmN5IG9uIGd0azEuMi1kZXYuCisgICogZGViaWFuL3J1bGVzOiBpbmNsdWRlIC1XZXh0cmEgaW4gdGhlIENGTEFHUyB2YXJpYWJsZS4KKyAgKiBkZWJpYW4vcnVsZXM6IGV4cGxpY2l0bHkgZGlzYWJsZSBzb21lIGZlYXR1cmVzIGZyb20gdGhlIGJ1aWxkLgorCisgLS0gUm9nw6lyaW8gQnJpdG8gPHJicml0b0B1c2Vycy5zZi5uZXQ+ICBUdWUsIDI0IEp1biAyMDA4IDE1OjE2OjIyIC0wMzAwCisKK2xhbWUgKDMuOTh+YmV0YTgrY3ZzMjAwODA1MTQpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogRml4aW5nIGRlYmlhbiBwYWNrYWdpbmcgZGV0YWlscy4KKyAgKiBkZWJpYW4vcnVsZXM6IHB1dCBkZXRlY3Rpb24gb2YgYXJjaGl0ZWN0dXJlcyBmb3IgY3Jvc3MtY29tcGlsYXRpb24uCisgICogZGViaWFuL3J1bGVzOiBpbmNsdWRlZCBzdXBwb3J0IGZvciBub29wdCBvcHRpb24uCisgICogZGViaWFuL3J1bGVzOiB0YWtlIG1vcmUgY2FyZSBvZiBidWlsZGluZyBldmVyeXRoaW5nIHVuZGVyIGRlYmlhbi90bXAuCisgICogZGViaWFuL2NvbnRyb2w6IHVwZGF0ZWQgdG8gU3RhbmRhcmRzLVZlcnNpb24gMy43LjMgKG5vIGNoYW5nZXMpLgorICAqIGRlYmlhbi9jb250cm9sOiBwdXQgY29ycmVjdGx5IENvbmZsaWN0czogYW5kIFJlcGxhY2VzIGluIGxpYm1wM2xhbWUweywtZGV2fS4KKyAgKiBkZWJpYW4vbGFtZS5kb2NzOiByZW1vdmUgVE9ETyBhbmQgc29ydCBieSBuYW1lLgorICAqIGRlYmlhbi9saWJtcDNsYW1lMC1kZXYuZG9jczogaW5jbHVkZSBUT0RPLgorICAqIGRlYmlhbi9saWJtcDNsYW1lMC1kZXY6IGluY2x1ZGUgbGlibGFtZTAuc28gaW4gdGhlIHBhY2thZ2UuCisgICogZGViaWFuL3dhdGNoOiBpbmNsdWRlIHdhdGNoZmlsZS4KKworIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgV2VkLCAxNCBNYXkgMjAwOCAwMTo0NDo0NiAtMDMwMAorCitsYW1lICgzLjk4fmFscGhhMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZSB3aXRoIHZhcmlvdXMgaW1wcm92ZW1lbnRzOworICAqIFVzZSBsaWJzbmRmaWxlIGZvciBpbnB1dCBmaWxlczsKKyAgKiBSZW1vdmUgdGhlIHBhcnRzIHRoYXQgZGVwZW5kIG9uIGd0ay0xLjI7CisgICogZGViaWFuL3J1bGVzOiByZW1vdmUgdGhlIERIX0NPTVBBVCB2YXJpYWJsZTsKKyAgKiBkZWJpYW4vY29udHJvbDogdXNlICR7YmluYXJ5OlZlcnNpb259IHRvIGJlIHVwLXRvLWRhdGU7CisgICogZGViaWFuL2NvbnRyb2w6IHVzZSBkZWJoZWxwZXIgdmVyc2lvbiA+PSA1OworCQorIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgV2VkLCAwOSBKYW4gMjAwOCAxNzoxMjoxOSAtMDIwMAorCitsYW1lICgzLjk4fmFscGhhMCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBkZWJpYW4vY29weXJpZ2h0OiB1cGRhdGVkIEZTRiByZWFsIGFkZHJlc3M7CisgICogZGViaWFuL3J1bGVzOiBzbWFsbCBmaXhlczsKKyAgKiBkb2MvbWFuL2xhbWUuMTogdXNlZCBhY2NlbnRlZCBjaGFyYWN0ZXJzIGluIHRyb2ZmIGZvcm1hdC4KKworIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgTW9uLCAxMCBPY3QgMjAwNSAwMzozMzozMSAtMDMwMAorCitsYW1lICgzLjk3LTgpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogZGViaWFuL3J1bGVzOiBlbmFibGUgZnVsbCBvcHRpbWl6YXRpb24sIG5vdyB0aGF0IGl0IHdvcmtzIHdpdGggR0NDIDQuCisKKyAtLSBSb2fDqXJpbyBCcml0byA8cmJyaXRvQHVzZXJzLnNmLm5ldD4gIE1vbiwgIDUgU2VwIDIwMDUgMDE6MjQ6NDQgLTAzMDAKKworbGFtZSAoMy45Ny03KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIGRlYmlhbi9jb250cm9sOiBtYWtlIGxpYm1wM2xhbWUwIHByb3ZpZGUgYW5kIHJlcGxhY2UgbGlibGFtZTAuCisKKyAtLSBSb2fDqXJpbyBCcml0byA8cmJyaXRvQHVzZXJzLnNmLm5ldD4gIFR1ZSwgMTYgQXVnIDIwMDUgMDQ6MzY6NDYgLTAzMDAKKworbGFtZSAoMy45Ny02KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIGRlYmlhbi9jb250cm9sOiBtYWtlIGxpYm1wM2xhbWUwIHByb3ZpZGUgbGlibGFtZTAgZm9yIGxlZ2FjeSBhcHBzOworICAqIGRlYmlhbi9jb250cm9sOiBmaXggdHlwbyBpbiBkZXNjcmlwdGlvbiBvZiBsaWJtcDNsYW1lMC1kZXY7CisgICogZGViaWFuL2xpYm1wM2xhbWUwLWRldi5maWxlczogZG9uJ3Qgc2hpcCBzaGFyZWQgbGlicmFyaWVzLgorCisgLS0gUm9nw6lyaW8gQnJpdG8gPHJicml0b0B1c2Vycy5zZi5uZXQ+ICBUdWUsIDE2IEF1ZyAyMDA1IDA0OjAzOjQyIC0wMzAwCisKK2xhbWUgKDMuOTctNSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBkZWJpYW4vY29udHJvbDogZml4IHVzZSBvZiBTT05BTUUgaW4gdGhlIHBhY2thZ2U7CisgICogZGViaWFuL2xpYmxhbWUwLio6IHJlbmFtZWQgdG8gbGlibXAzbGFtZTAuKiBhcyBwZXIgYWJvdmU7CisgICogZGViaWFuL2xpYmxhbWUtZGV2OiBpZGVtOworICAqIGRlYmlhbi9ydWxlczogaW5jb3Jwb3JhdGUgc29tZSBjaGFuZ2VzIGJ5IENocmlzdGlhbiBNYXJpbGxhdC4KKworIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgTW9uLCAxNSBBdWcgMjAwNSAwMDo0NzoyNSAtMDMwMAorCitsYW1lICgzLjk3LTQpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogZGViaWFuL2NvbnRyb2w6IGV4Y2x1ZGUgbGlic25kZmlsZTAtZGV2IGFzIGEgYnVpbGQgZGVwZW5kZW5jeS4KKyAgKiBkZWJpYW4vY29udHJvbDogaW5jbHVkZSBsaWJndGsxLjItZGV2IGFzIGEgYnVpbGQgZGVwZW5kZW5jeS4KKyAgKiBkZWJpYW4vcnVsZXM6IHMvLS13aXRoLWZpbGVpbz1zbmRmaWxlLy0td2l0aC1maWxlaW89bGFtZS8sIHNpbmNlCisgICAgZ3JhYmJpbmcgaW5wdXQgZnJvbSBzdGRpbiBpcyBhIHZlcnkgaW1wb3J0YW50IGZlYXR1cmUuCisKKyAtLSBSb2fDqXJpbyBCcml0byA8cmJyaXRvQHVzZXJzLnNmLm5ldD4gIEZyaSwgIDUgQXVnIDIwMDUgMDI6MDE6NDAgLTAzMDAKKworbGFtZSAoMy45Ny0zKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIGRvYy9tYW4vbGFtZS4xOiBkb2N1bWVudCB0aGUgLS17dW4sfXNpZ25lZCBvcHRpb25zLgorICAqIGRvYy9tYW4vbGFtZS4xOiBkb2N1bWVudCB0aGUgLS17YmlnLGxpdHRsZX0tZW5kaWFuIG9wdGlvbnMuCisgICogZGViaWFuL2NvbnRyb2w6IGluY2x1ZGUgbGlic25kZmlsZTAtZGV2IGFzIGEgYnVpbGQgZGVwZW5kZW5jeS4KKyAgKiBkZWJpYW4vcnVsZXM6IHMvLS13aXRoLWZpbGVpbz1sYW1lLy0td2l0aC1maWxlaW89c25kZmlsZS8gLgorCQorIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgV2VkLCAgMyBBdWcgMjAwNSAyMTozNToxNyAtMDMwMAorCitsYW1lICgzLjk3LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogZGViaWFuL3J1bGVzOiB1c2UgZGhfaW5zdGFsbG1hbiBpbnN0ZWFkIG9mIGRoX2luc3RhbGxtYW5wYWdlcy4KKyAgKiBkb2MvbWFuL2xhbWUuMTogZXNjYXBlIG1pbnVzIHNpZ25hbHMgd2l0aCBiYWNrc2xhc2guCisJCisgLS0gUm9nw6lyaW8gQnJpdG8gPHJicml0b0B1c2Vycy5zZi5uZXQ+ICBXZWQsIDI3IEp1bCAyMDA1IDA0OjU4OjM5IC0wMzAwCisKK2xhbWUgKDMuOTctMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBQcmVwYXJhdGlvbiBmb3IgdGhlIGJldGEgcmVsZWFzZSBvZiBsYW1lIDMuOTcuCisgICogU3RpbGwgbW9yZSBpbXByb3ZlbWVudHMgdG8gY29tZS4KKworIC0tIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0PiAgVHVlLCAyNiBKdWwgMjAwNSAxODoxNjozNCAtMDMwMAorCitsYW1lICgzLjk3LTAuMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBGaXhlZCBkZWJpYW4vY29udHJvbCBhY2NvcmRpbmcgdG8gdGhlIERlYmlhbiBMaWJyYXJ5IFBhY2thZ2luZyBHdWlkZQorCisgLS0gSmFjayBCYXRlcyA8bXM0MTlAZnJlZXpvbmUuY28udWs+ICBUaHUsIDEyIE1heSAyMDA1IDEzOjQxOjI4IC0wNzAwCisKK2xhbWUgKDMuOTctMC4xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIFByZXBhcmF0aW9uIGZvciBuZXcgdXBzdHJlYW0gcmVsZWFzZS4KKyAgKiBkZWJpYW4vY29udHJvbDogbW9kaWZpZWQgc2hvcnQgZGVzY3JpcHRpb25zIHRvIGJlIGxvd2VyIGNhc2UuCisKKyAtLSBSb2fDqXJpbyBCcml0byA8cmJyaXRvQHVzZXJzLnNmLm5ldD4gIEZyaSwgMTggTWFyIDIwMDUgMDE6MTg6NDIgLTAzMDAKKworbGFtZSAoMy45Ni0wLjEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworIAorICAqIFVwZGF0ZSBkZWJpYW4gcGFja2FnaW5nIGZvciBsYW1lIDMuOTYKKyAKKyAtLSBHZW9mZnJleSBULiBEYWlyaWtpIDxkYWlyaWtpQGRhaXJpa2kub3JnPiAgRnJpLCA5IEFwciAyMDA0IDEwOjI4OjEyIC0wNzAwCisKK2xhbWUgKDMuOTQtMC4xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIFVwZGF0ZSBwYWNrYWdpbmcgZm9yIGxhbWUgMy45NCBhbHBoYSAxNDsKKyAgKiBNYWRlIHByb2dyZXNzIHRvIG1ha2UgdGhlIHBhY2thZ2UgYXMgbGludGlhbi1jbGVhbiBhcyBwb3NzaWJsZToKKyAgKiBkZWJpYW4vY29weXJpZ2h0OiByZW1vdmVkIHRoZSB0cmFjZXMgb2YgdGhlIHNrZWxldG9uIGZpbGU7CisgICogZGViaWFuL3J1bGVzOiBhdm9pZCB1c2luZyAtLWhvc3QsIGFzIHBlciB3YXJuaW5nIG9mIC4vY29uZmlndXJlOworICAqIGRlYmlhbi9ydWxlczogdXNlIHRyaWNrIHRvIGF2b2luZCBnZW5lcmF0aW5nIGEgbGlicmFyeSB3aXRoIHJwYXRoOworICAqIGRlYmlhbi9sYW1lLmRvY3M6IGF2b2lkIGdlbmVyYXRpbmcgZHVwbGljYXRlIGh0bWwgZG9jdW1lbnRhdGlvbjsKKyAgKiBkZWJpYW4vY29udHJvbDogYWRkZWQgZGVwZW5kZW5jeSBvbiBkZWJoZWxwZXIgPj0gMzsKKyAgKiBzdGlsbCBtb3JlIHdvcmsgbGVmdCwgYnV0IHByb2dyZXNzaW5nIGFueXdheSAoaS5lLiwgY2hhbmdlcyBsaXN0ZWQgaW4KKyAgICAvdXNyL3NoYXJlL2RvYy9kZWJpYW4tcG9saWN5L3VwZ3JhZGluZy1jaGVja2xpc3QudHh0Lmd6IHNob3VsZCBiZQorICAgIGFwcGxpZWQpLgorCisgLS0gUm9nw6lyaW8gQnJpdG8gPHJicml0b0B1c2Vycy5zZi5uZXQ+ICBUdWUsIDE1IEp1bCAyMDAzIDE5OjMwOjQyIC0wMzAwCisKK2xhbWUgKDMuOTMtMC4xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIFByZXZlbnQgbGFtZSAzLjkzIHNoaXBwaW5nIGFuZCBzdGlsbCBidWlsZGluZyBhIDMuOTIgZGViaWFuIHBhY2thZ2U7CisgICogVXNlIC0tZW5hYmxlLW5hc20sIGFzIGlzIHNob3VsZG4ndCBicmVhayBjb21waWxhdGlvbiBvbiBub24teDg2OworICAqIFVzZSAtLWVuYWJsZS1leHBvcHQsIHRvIGdldCBhIGJpdCBtb3JlIG9mIHNwZWVkLgorCisgLS0gUm9nw6lyaW8gQnJpdG8gPHJicml0b0B1c2Vycy5zZi5uZXQ+ICBTdW4sIDI1IEF1ZyAyMDAyIDE4OjU4OjE2IC0wMzAwCisKK2xhbWUgKDMuOTItMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZS4KKyAgKiBDbG9zZXM6ICM1NzgxMzUuCisKKyAtLSBSb2fDqXJpbyBCcml0byA8bGludXhzdXBAaWcuY29tLmJyPiAgU3VuLCAyOCBKdWwgMjAwMiAwMzowODowNCAtMDMwMAorCitsYW1lICgzLjkxLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisKKyAtLSBSb2dlcmlvIEJyaXRvIDxsaW51eHN1cEBpZy5jb20uYnI+ICBTdW4sIDIwIEphbiAyMDAyIDIwOjUwOjE5IC0wMjAwCisKK2xhbWUgKDMuOTAuMS0wKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlLgorICAqIGRlYmlhbi9jb250cm9sOiBuYXNtIGlzIG9ubHkgYSBidWlsZC1kZXBlbmRlbmN5IG9uIHg4NjsKKyAgKiBkZWJpYW4vY29udHJvbDogYWRkZWQgZGViaGVscGVyIHRvIGJ1aWxkLWRlcGVuZGVuY3kgbGlzdDsKKyAgKiBkZWJpYW4vY29udHJvbDogY2hhbmdlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYmluYXJ5IHBhY2thZ2VzOworICAqIGRlYmlhbi9ydWxlczogZW5hYmxlZCBleHBlcmltZW50YWwvYWdyZXNzaXZlIG9wdGltaXphdGlvbnM7CisgICogZGViaWFuL3J1bGVzOiBlZmZlY3RpdmVseSBzcHJlYWQgdGhlIGluc3RhbGxlZCBmaWxlcyBpbiBiaW5hcnkgcGFja2FnZXM7CisgICogZGViaWFuL3J1bGVzOiBub3cgZGhfbWFrZXNobGlicyBjcmVhdGVzIGdvb2QgcG9zdGluc3QgYW5kIHByZXJtIHNjcmlwdHM7CisgICogQ2hhbmdlZCB0aGUgbGFtZS1kZXYgcGFja2FnZSB0byBsaWJsYW1lMC1kZXY7CisgICogUmVtb3ZlZCByZWZlcmVuY2VzIHRvIGxhbWUtZXh0cmFzLCBzaW5jZSBpdCBkb2Vzbid0IGV4aXN0IGFueW1vcmU7CisgICogQWRkZWQgTElDRU5DRSB0byBjb3B5cmlnaHQgYW5kIGV4Y2x1ZGVkIGl0IGZyb20gdGhlIGJpbmFyeSBwYWNrYWdlOworICAqIFJlbW92ZWQgSU5TVEFMTCBmcm9tIHRoZSBiaW5hcnkgcGFja2FnZTsKKyAgKiBsYW1lIGlzIG5vdyBhbG1vc3QgbGludGlhbiBjbGVhbiAodGhlIG9ubHkgcHJvYmxlbSByZW1haW5pbmcgaXMKKyAgICBhbiBycGF0aCBpbiBsaWJsYW1lIGJ1aWxkIHByb2Nlc3MpLgorCisgLS0gUm9nZXJpbyBCcml0byA8bGludXhzdXBAaWcuY29tLmJyPiAgRnJpLCAyOCBEZWMgMjAwMSAwNDowODo1NyAtMDIwMAorCitsYW1lICgzLjkwLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHJlbGVhc2UuCisKKyAtLSBWaXJhbCA8dmlyYWxAZGViaWFuLm9yZz4gIFR1ZSwgMjEgQXVnIDIwMDEgMTM6NTA6MTQgKzA1MzAKKworbGFtZSAoMy44OS0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5ldyB1cHN0cmVhbSB2ZXJzaW9uLgorICAqIEFkZGVkIC0taG9zdD0kJChkcGtnLWFyY2hpdGVjdHVyZSAtcURFQl9IT1NUX0dOVV9UWVBFKSB0byBjb25maWd1cmUuCisgICogQWRkZWQgbGlibGFtZTAgcGFja2FnZS4KKyAgKiBBZGRlZCBkb2MtYmFzZSBlbnRyeS4KKyAgKiBBY3R1YWwgQ2hhbmdlTG9nIGlzIGluc3RhbGxlZCBub3cgaW5zdGVhZCBvZiBoaXN0b3J5Lmh0bWwKKyAgCisgLS0gVmlyYWwgPHZpcmFsQGRlYmlhbi5vcmc+ICBTdW4sIDIyIEp1bCAyMDAxIDAzOjA3OjMwICswNTMwCisKK2xhbWUgKDMuODgtMCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBVcGRhdGVkIGRlYmlhbi8gZGlyZWN0b3J5IHRvIHVzZSBjb25maWd1cmUuCisKKyAtLSBJbmdvIFNhaXR6IDxJbmdvLlNhaXR6QHN0dWQudW5pLWhhbm5vdmVyLmRlPiAgTW9uLCAxMSBEZWMgMjAwMCAwODo0MzoyNiArMDEwMAorCitsYW1lICgzLjg2LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogSW5pdGlhbCBSZWxlYXNlLgorCisgLS0gU3RlZmFuIEthcnJtYW5uIDxTLkthcnJtYW5uQGdteC5uZXQ+ICBUaHUsIDMxIEF1ZyAyMDAwIDIyOjE1OjA3ICswMjAwCisKK0xvY2FsIHZhcmlhYmxlczoKK21vZGU6IGRlYmlhbi1jaGFuZ2Vsb2cKK0VuZDoKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb21wYXQgYi9kZWJpYW4vY29tcGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDZmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29tcGF0CkBAIC0wLDAgKzEgQEAKKzUKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb250cm9sIGIvZGViaWFuL2NvbnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NWYxZgotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jb250cm9sCkBAIC0wLDAgKzEsNTEgQEAKK1NvdXJjZTogbGFtZQorU2VjdGlvbjogc291bmQKK1ByaW9yaXR5OiBvcHRpb25hbAorTWFpbnRhaW5lcjogUm9nw6lyaW8gQnJpdG8gPHJicml0b0B1c2Vycy5zZi5uZXQ+CitCdWdzOiBtYWlsdG86bGFtZS1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0CitIb21lcGFnZTogaHR0cDovL2xhbWUuc291cmNlZm9yZ2UubmV0LworQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA1KSwgbGlibmN1cnNlczUtZGV2LCBuYXNtIFtpMzg2XSwgbGlic25kZmlsZTEtZGV2CitTdGFuZGFyZHMtVmVyc2lvbjogMy43LjMKKworUGFja2FnZTogbGFtZQorQXJjaGl0ZWN0dXJlOiBhbnkKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBvcGVuIHNvdXJjZSBNUDMgZW5jb2RlcgorIExhbWUgaXMgYSBwcm9ncmFtIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjb21wcmVzc2VkCisgYXVkaW8gZmlsZXMuIChMYW1lIGFpbnQgTVAzIGVuY29kZXIpLiBUaGVzZSBhdWRpbyBmaWxlcworIGNhbiBiZSBwbGF5ZWQgYmFjayBieSBwb3B1bGFyIG1wMyBwbGF5ZXJzIHN1Y2ggYXMgbXBnMTIzLgorIFRvIHJlYWQgZnJvbSBzdGRpbiwgdXNlICItIiBmb3IgPGluZmlsZT4uIFRvIHdyaXRlIHRvCisgc3Rkb3V0LCB1c2UgYSAiLSIgZm9yIDxvdXRmaWxlPi4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBmcm9udGVuZCBlbmNvZGVyIGJpbmFyeS4KKworUGFja2FnZTogbGlibXAzbGFtZTAKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBsaWJzCitDb25mbGljdHM6IGxpYmxhbWUwCitSZXBsYWNlczogbGlibGFtZTAKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBzaGFyZWQgbGlicmFyaWVzIGZvciBNUDMgZW5jb2RpbmcKKyBMYW1lIGlzIGEgcHJvZ3JhbSB3aGljaCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgY29tcHJlc3NlZAorIGF1ZGlvIGZpbGVzLiAoTGFtZSBhaW50IE1QMyBlbmNvZGVyKS4gVGhlc2UgYXVkaW8gZmlsZXMKKyBjYW4gYmUgcGxheWVkIGJhY2sgYnkgcG9wdWxhciBtcDMgcGxheWVycyBzdWNoIGFzIG1wZzEyMy4KKyBUbyByZWFkIGZyb20gc3RkaW4sIHVzZSAiLSIgZm9yIDxpbmZpbGU+LiBUbyB3cml0ZSB0bworIHN0ZG91dCwgdXNlIGEgIi0iIGZvciA8b3V0ZmlsZT4uCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZHluYW1pYyBsaWJyYXJ5LgorCitQYWNrYWdlOiBsaWJtcDNsYW1lMC1kZXYKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBsaWJkZXZlbAorRGVwZW5kczogbGlibXAzbGFtZTAgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCAke21pc2M6RGVwZW5kc30KK0NvbmZsaWN0czogbGlibGFtZS1kZXYKK1JlcGxhY2VzOiBsaWJsYW1lLWRldgorRGVzY3JpcHRpb246IGRldmVsb3BtZW50IGZpbGVzIGZvciBsYW1lCisgTGFtZSBpcyBhIHByb2dyYW0gd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGNvbXByZXNzZWQKKyBhdWRpbyBmaWxlcy4gKExhbWUgYWludCBNUDMgZW5jb2RlcikuIFRoZXNlIGF1ZGlvIGZpbGVzCisgY2FuIGJlIHBsYXllZCBiYWNrIGJ5IHBvcHVsYXIgbXAzIHBsYXllcnMgc3VjaCBhcyBtcGcxMjMuCisgVG8gcmVhZCBmcm9tIHN0ZGluLCB1c2UgIi0iIGZvciA8aW5maWxlPi4gVG8gd3JpdGUgdG8KKyBzdGRvdXQsIHVzZSBhICItIiBmb3IgPG91dGZpbGU+LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHN0YXRpYyBsaWJyYXJ5IGFuZCBoZWFkZXIgZmlsZXMKKyBmb3IgZGV2ZWxvcG1lbnQgd2l0aCBsYW1lLgpkaWZmIC0tZ2l0IGEvZGViaWFuL2NvcHlyaWdodCBiL2RlYmlhbi9jb3B5cmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2NmNjOQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jb3B5cmlnaHQKQEAgLTAsMCArMSw1NiBAQAorVGhpcyBwYWNrYWdlIHdhcyBvcmlnaW5hbGx5IGRlYmlhbml6ZWQgYnkgU3RlZmFuIEthcnJtYW5uIDxTLkthcnJtYW5uQGdteC5uZXQ+CitvbiBUaHUsIDMxIEF1ZyAyMDAwIDIyOjE1OjA3ICswMjAwLgorCitUaGUgY3VycmVudCBtYWludGFpbmVyIGlzIFJvZ8OpcmlvIEJyaXRvIDxyYnJpdG9AdXNlcnMuc2YubmV0Pi4KKworSXQgd2FzIGRvd25sb2FkZWQgZnJvbSB0aGUgQ1ZTIHJlcG9zaXRvcnkgYXQgPGh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvbGFtZT4uCisKK1Vwc3RyZWFtIEF1dGhvcnM6IHBsZWFzZSwgc2VlIHRoZSBmaWxlIGh0bWwvY29udHJpYnV0b3JzLmh0bWwgZm9yIGEKK2xpc3Qgb2YgY29udHJpYnV0b3JzIHRvIHRoZSBsYW1lIHByb2plY3QuCisKK0NvcHlyaWdodDogMTk5OS0yMDEwIHNlZSBodG1sL2NvbnRyaWJ1dG9ycy5odG1sCisKKyAgICBMQU1FIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBMQU1FIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICAgIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworQWRkaXRpb25hbGx5LCB0aGUgb3JpZ2luYWwgc29mdHdhcmUncyBMSUNFTkNFIGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKKworLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCitDYW4gSSB1c2UgTEFNRSBpbiBteSBjb21tZXJjaWFsIHByb2dyYW0/ICAKKworWWVzLCB5b3UgY2FuLCB1bmRlciB0aGUgcmVzdHJpY3Rpb25zIG9mIHRoZSBMR1BMLiAgVGhlIGVhc2llc3QKK3dheSB0byBkbyB0aGlzIGlzIHRvOgorCisxLiBMaW5rIHRvIExBTUUgYXMgc2VwYXJhdGUgbGlicmFyeSAobGlibXAzbGFtZS5hIG9uIHVuaXggb3IgCisgICBsYW1lX2VuYy5kbGwgb24gd2luZG93cykKKworMi4gRnVsbHkgYWNrbm93bGVkZ2UgdGhhdCB5b3UgYXJlIHVzaW5nIExBTUUsIGFuZCBnaXZlIGEgbGluaworICAgdG8gb3VyIHdlYiBzaXRlLCB3d3cubXAzZGV2Lm9yZworCiszLiBJZiB5b3UgbWFrZSBtb2RpZmljYXRpb25zIHRvIExBTUUsIHlvdSAqbXVzdCogcmVsZWFzZSB0aGVzZQorICAgdGhlc2UgbW9kaWZpY2F0aW9ucyBiYWNrIHRvIHRoZSBMQU1FIHByb2plY3QsIHVuZGVyIHRoZSBMR1BMLgorCisqKiogSU1QT1JUQU5UIE5PVEUgKioqCisKK1RoZSBkZWNvZGluZyBmdW5jdGlvbnMgcHJvdmlkZWQgaW4gTEFNRSB1c2UgdGhlIG1wZ2xpYiBkZWNvZGluZyBlbmdpbmUgd2hpY2gKK2lzIHVuZGVyIHRoZSBHUEwuICBUaGV5IG1heSBub3QgYmUgdXNlZCBieSBhbnkgcHJvZ3JhbSBub3QgcmVsZWFzZWQgdW5kZXIgdGhlCitHUEwgdW5sZXNzIHlvdSBvYnRhaW4gc3VjaCBwZXJtaXNzaW9uIGZyb20gdGhlIE1QRzEyMyBwcm9qZWN0ICh3d3cubXBnMTIzLmRlKS4KKy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitPbiBEZWJpYW4gc3lzdGVtcywgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGNhbiBiZSBmb3VuZCBpbiBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvTEdQTC0yJy4KKworVGhlIERlYmlhbiBwYWNrYWdpbmcgaXMgQ29weXJpZ2h0IMKpIDIwMDUtMjAxMCwgUm9nw6lyaW8gQnJpdG8gPHJicml0b0B1c2Vycy5zZi5uZXQ+CithbmQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgdXBzdHJlYW0gc29mdHdhcmUuCmRpZmYgLS1naXQgYS9kZWJpYW4vbGFtZS5kb2NzIGIvZGViaWFuL2xhbWUuZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ5ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2xhbWUuZG9jcwpAQCAtMCwwICsxIEBACitVU0FHRQpkaWZmIC0tZ2l0IGEvZGViaWFuL2xhbWUuZmlsZXMgYi9kZWJpYW4vbGFtZS5maWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDA2ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2xhbWUuZmlsZXMKQEAgLTAsMCArMSwyIEBACit1c3IvYmluL2xhbWUKK3Vzci9zaGFyZS9kb2MvbGFtZS9odG1sLyouaHRtbApkaWZmIC0tZ2l0IGEvZGViaWFuL2xhbWUubWFucGFnZXMgYi9kZWJpYW4vbGFtZS5tYW5wYWdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYThhZGRkCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2xhbWUubWFucGFnZXMKQEAgLTAsMCArMSBAQAorZG9jL21hbi9sYW1lLjEKZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJtcDNsYW1lMC1kZXYuZG9jcyBiL2RlYmlhbi9saWJtcDNsYW1lMC1kZXYuZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU2OWMyCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2xpYm1wM2xhbWUwLWRldi5kb2NzCkBAIC0wLDAgKzEsNSBAQAorQVBJCitIQUNLSU5HCitSRUFETUUKK1NUWUxFR1VJREUKK1RPRE8KZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJtcDNsYW1lMC1kZXYuZmlsZXMgYi9kZWJpYW4vbGlibXAzbGFtZTAtZGV2LmZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzJmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vbGlibXAzbGFtZTAtZGV2LmZpbGVzCkBAIC0wLDAgKzEsMyBAQAordXNyL2luY2x1ZGUvbGFtZS9sYW1lLmgKK3Vzci9saWIvKi57YSxsYX0KK3Vzci9saWIvbGlibXAzbGFtZSouc28KZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJtcDNsYW1lMC5maWxlcyBiL2RlYmlhbi9saWJtcDNsYW1lMC5maWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTIzNWMyCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2xpYm1wM2xhbWUwLmZpbGVzCkBAIC0wLDAgKzEgQEAKK3Vzci9saWIvbGlibXAzbGFtZS5zby4qCmRpZmYgLS1naXQgYS9kZWJpYW4vcnVsZXMgYi9kZWJpYW4vcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDI4NGU5NwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9ydWxlcwpAQCAtMCwwICsxLDg1IEBACisjIS91c3IvYmluL21ha2UgLWYKKyMgVW5jb21tZW50IHRoaXMgdG8gdHVybiBvbiB2ZXJib3NlIG1vZGUuCisjZXhwb3J0IERIVkVSQk9TRT0xCisKKyMgVmFyaWFibGVzIGZvciBjcm9zcyBjb21waWxpbmcKK0RFQl9IT1NUX0dOVV9UWVBFID89ICQoc2hlbGwgZHBrZy1hcmNoaXRlY3R1cmUgLXFERUJfSE9TVF9HTlVfVFlQRSkKK0RFQl9CVUlMRF9HTlVfVFlQRSA/PSAkKHNoZWxsIGRwa2ctYXJjaGl0ZWN0dXJlIC1xREVCX0JVSUxEX0dOVV9UWVBFKQorCitpZmVxICgkKERFQl9CVUlMRF9HTlVfVFlQRSksJChERUJfSE9TVF9HTlVfVFlQRSkpCisJY29uZmZsYWdzICs9IC0tYnVpbGQ9JChERUJfSE9TVF9HTlVfVFlQRSkKK2Vsc2UKKwljb25mZmxhZ3MgKz0gLS1idWlsZD0kKERFQl9CVUlMRF9HTlVfVFlQRSkgLS1ob3N0PSQoREVCX0hPU1RfR05VX1RZUEUpCitlbmRpZgorCitDRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhCitMREZMQUdTPSAtV2wsLS1hcy1uZWVkZWQKKworaWZuZXEgKCwkKGZpbmRzdHJpbmcgbm9vcHQsJChERUJfQlVJTERfT1BUSU9OUykpKQorCUNGTEFHUyArPSAtTzAKK2VuZGlmCisKK2NvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCitjb25maWd1cmUtc3RhbXA6CisJZGhfdGVzdGRpcgorCS4vY29uZmlndXJlIFwKKwkJLS1wcmVmaXg9L3VzciBcCisJCS0tbWFuZGlyPS91c3Ivc2hhcmUvbWFuIFwKKwkJLS13aXRoLWZpbGVpbz1zbmRmaWxlIFwKKwkJLS13aXRob3V0LXZvcmJpcyBcCisJCS0tZW5hYmxlLW5hc20gXAorCQktLXdpdGgtcGljIFwKKwkJLS1kaXNhYmxlLW1wM3ggXAorCQktLWRpc2FibGUtbXAzcnRwIFwKKwkJLS1kaXNhYmxlLWd0a3Rlc3QgXAorCQktLWVuYWJsZS1leHBvcHQ9ZnVsbCBcCisJCUNGTEFHUz0iJChDRkxBR1MpIiBMREZMQUdTPSIkKExERkxBR1MpIgorCisJdG91Y2ggY29uZmlndXJlLXN0YW1wCisKK2J1aWxkOiBjb25maWd1cmUtc3RhbXAgYnVpbGQtc3RhbXAKK2J1aWxkLXN0YW1wOgorCWRoX3Rlc3RkaXIKKworCSQoTUFLRSkKKworCXRvdWNoIGJ1aWxkLXN0YW1wCisKK2NsZWFuOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCXJtIC1mIGJ1aWxkLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAorCisJWyAhIC1mIE1ha2VmaWxlIF0gfHwgJChNQUtFKSBkaXN0Y2xlYW4KKwlkaF9jbGVhbiBjb25mY2FjaGUgbGlibXAzbGFtZS9pMzg2L2Nob29zZV90YWJsZS5uYXMubHN0IFwKKwlsaWJtcDNsYW1lL2kzODYvY3B1X2ZlYXQubmFzLmxzdCBsaWJtcDNsYW1lL2kzODYvc2NhbGFyLm5hcy5sc3QKKworaW5zdGFsbDogYnVpbGQKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9jbGVhbiAtaworCWRoX2luc3RhbGxkaXJzCisKKwkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAorCitiaW5hcnktaW5kZXA6IGJ1aWxkIGluc3RhbGwKKworYmluYXJ5LWFyY2g6IGJ1aWxkIGluc3RhbGwKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9tb3ZlZmlsZXMgLS1zb3VyY2VkaXI9ZGViaWFuL3RtcAorCWRoX2luc3RhbGxkb2NzCisJZGhfaW5zdGFsbG1hbgorCWRoX2luc3RhbGxjaGFuZ2Vsb2dzIENoYW5nZUxvZworCWRoX3N0cmlwCisJZGhfY29tcHJlc3MKKwlkaF9maXhwZXJtcworCWRoX21ha2VzaGxpYnMKKwlkaF9pbnN0YWxsZGViCisJZGhfc2hsaWJkZXBzCisJZGhfZ2VuY29udHJvbAorCWRoX21kNXN1bXMKKwlkaF9idWlsZGRlYgorCitiaW5hcnk6IGJpbmFyeS1pbmRlcCBiaW5hcnktYXJjaAorLlBIT05ZOiBidWlsZCBjbGVhbiBiaW5hcnktaW5kZXAgYmluYXJ5LWFyY2ggYmluYXJ5IGluc3RhbGwKZGlmZiAtLWdpdCBhL2RlYmlhbi93YXRjaCBiL2RlYmlhbi93YXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRhZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3dhdGNoCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbj0zCisKK2h0dHA6Ly9zZi5uZXQvbGFtZS9sYW1lLShbXGQuXSopLnRhci5negpkaWZmIC0tZ2l0IGEvZGVwY29tcCBiL2RlcGNvbXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ3MDFkYQotLS0gL2Rldi9udWxsCisrKyBiL2RlcGNvbXAKQEAgLTAsMCArMSw1MzAgQEAKKyMhIC9iaW4vc2gKKyMgZGVwY29tcCAtIGNvbXBpbGUgYSBwcm9ncmFtIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzIGFzIHNpZGUtZWZmZWN0cworCitzY3JpcHR2ZXJzaW9uPTIwMDUtMDctMDkuMTEKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KKyAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRkZXBtb2RlIiB8fCB0ZXN0IC16ICIkc291cmNlIiB8fCB0ZXN0IC16ICIkb2JqZWN0IjsgdGhlbgorICBlY2hvICJkZXBjb21wOiBWYXJpYWJsZXMgc291cmNlLCBvYmplY3QgYW5kIGRlcG1vZGUgbXVzdCBiZSBzZXQiIDE+JjIKKyAgZXhpdCAxCitmaQorCisjIERlcGVuZGVuY2llcyBmb3Igc3ViL2Jhci5vIG9yIHN1Yi9iYXIub2JqIGdvIGludG8gc3ViLy5kZXBzL2Jhci5Qby4KK2RlcGZpbGU9JHtkZXBmaWxlLWBlY2hvICIkb2JqZWN0IiB8CisgIHNlZCAnc3xbXlxcL10qJHwnJHtERVBESVItLmRlcHN9Jy8mfDtzfFwuXChbXi5dKlwpJHwuUFwxfDtzfFBvYmokfFBvfCdgfQordG1wZGVwZmlsZT0ke3RtcGRlcGZpbGUtYGVjaG8gIiRkZXBmaWxlIiB8IHNlZCAncy9cLlwoW14uXSpcKSQvLlRcMS8nYH0KKworcm0gLWYgIiR0bXBkZXBmaWxlIgorCisjIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKKyMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCisjIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCisjIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgoraWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KKyAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCisgIGdjY2ZsYWc9LU0KKyAgZGVwbW9kZT1nY2MKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBkYXNobXN0ZG91dCB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50LgorICAgZGFzaG1mbGFnPS14TQorICAgZGVwbW9kZT1kYXNobXN0ZG91dAorZmkKKworY2FzZSAiJGRlcG1vZGUiIGluCitnY2MzKQorIyMgZ2NjIDMgaW1wbGVtZW50cyBkZXBlbmRlbmN5IHRyYWNraW5nIHRoYXQgZG9lcyBleGFjdGx5IHdoYXQKKyMjIHdlIHdhbnQuICBZYXkhICBOb3RlOiBmb3Igc29tZSByZWFzb24gbGlidG9vbCAxLjQgZG9lc24ndCBsaWtlCisjIyBpdCBpZiAtTUQgLU1QIGNvbWVzIGFmdGVyIHRoZSAtTUYgc3R1ZmYuICBIbW0uCisgICIkQCIgLU1UICIkb2JqZWN0IiAtTUQgLU1QIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBtdiAiJHRtcGRlcGZpbGUiICIkZGVwZmlsZSIKKyAgOzsKKworZ2NjKQorIyMgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBnZXQgZGVwZW5kZW5jeSBvdXRwdXQgZnJvbSBnY2MuICBIZXJlJ3MKKyMjIHdoeSB3ZSBwaWNrIHRoaXMgcmF0aGVyIG9ic2N1cmUgbWV0aG9kOgorIyMgLSBEb24ndCB3YW50IHRvIHVzZSAtTUQgYmVjYXVzZSB3ZSdkIGxpa2UgdGhlIGRlcGVuZGVuY2llcyB0byBlbmQKKyMjICAgdXAgaW4gYSBzdWJkaXIuICBIYXZpbmcgdG8gcmVuYW1lIGJ5IGhhbmQgaXMgdWdseS4KKyMjICAgKFdlIG1pZ2h0IGVuZCB1cCBkb2luZyB0aGlzIGFueXdheSB0byBzdXBwb3J0IG90aGVyIGNvbXBpbGVycy4pCisjIyAtIFRoZSBERVBFTkRFTkNJRVNfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG1ha2VzIGdjYyBhY3QgbGlrZQorIyMgICAtTU0sIG5vdCAtTSAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuCisjIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCisjIyAgIHRoYW4gcmVuYW1pbmcpLgorICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KKyAgICBnY2NmbGFnPS1NRCwKKyAgZmkKKyAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIGFscGhhPUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKKyMjIFRoZSBzZWNvbmQgLWUgZXhwcmVzc2lvbiBoYW5kbGVzIERPUy1zdHlsZSBmaWxlIG5hbWVzIHdpdGggZHJpdmUgbGV0dGVycy4KKyAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCisgICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisjIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSBgZGVsZXRlZCBoZWFkZXIgZmlsZScgcHJvYmxlbS4KKyMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCisjIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKKyMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCisjIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCisjIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgYDonLiAgT24gdGhlIHRoZW9yeQorIyMgdGhhdCB0aGUgc3BhY2UgbWVhbnMgc29tZXRoaW5nLCB3ZSBhZGQgYSBzcGFjZSB0byB0aGUgb3V0cHV0IGFzCisjIyB3ZWxsLgorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaHApCisgICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQorICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCisgICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGV4aXQgMQorICA7OworCitzZ2kpCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICIkQCIgIi1XcCwtTUR1cGRhdGUsJHRtcGRlcGZpbGUiCisgIGVsc2UKKyAgICAiJEAiIC1NRHVwZGF0ZSAiJHRtcGRlcGZpbGUiCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuICAjIHllcywgdGhlIHNvdXJjZWZpbGUgZGVwZW5kIG9uIG90aGVyIGZpbGVzCisgICAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKworICAgICMgQ2xpcCBvZmYgdGhlIGluaXRpYWwgZWxlbWVudCAodGhlIGRlcGVuZGVudCkuICBEb24ndCB0cnkgdG8gYmUKKyAgICAjIGNsZXZlciBhbmQgcmVwbGFjZSB0aGlzIHdpdGggc2VkIGNvZGUsIGFzIElSSVggc2VkIHdvbid0IGhhbmRsZQorICAgICMgbGluZXMgd2l0aCBtb3JlIHRoYW4gYSBmaXhlZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoNDA5NiBpbgorICAgICMgSVJJWCA2LjIgc2VkLCA4MTkyIGluIElSSVggNi41KS4gIFdlIGFsc28gcmVtb3ZlIGNvbW1lbnQgbGluZXM7CisgICAgIyB0aGUgSVJJWCBjYyBhZGRzIGNvbW1lbnRzIGxpa2UgYCM6ZmVjJyB0byB0aGUgZW5kIG9mIHRoZQorICAgICMgZGVwZW5kZW5jeSBsaW5lLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIHwgXAorICAgIHRyICcKKycgJyAnID4+ICRkZXBmaWxlCisgICAgZWNobyA+PiAkZGVwZmlsZQorCisgICAgIyBUaGUgc2Vjb25kIHBhc3MgZ2VuZXJhdGVzIGEgZHVtbXkgZW50cnkgZm9yIGVhY2ggaGVhZGVyIGZpbGUuCisgICAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIFwKKyAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyAtZSAncy8kLzovJyBcCisgICA+PiAkZGVwZmlsZQorICBlbHNlCisgICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKKyAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKKyAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworYWl4KQorICAjIFRoZSBDIGZvciBBSVggQ29tcGlsZXIgdXNlcyAtTSBhbmQgb3V0cHV0cyB0aGUgZGVwZW5kZW5jaWVzCisgICMgaW4gYSAudSBmaWxlLiAgSW4gb2xkZXIgdmVyc2lvbnMsIHRoaXMgZmlsZSBhbHdheXMgbGl2ZXMgaW4gdGhlCisgICMgY3VycmVudCBkaXJlY3RvcnkuICBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUKKyAgIyBzdGFydCBvZiBlYWNoIGxpbmU7ICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgIyBWZXJzaW9uIDYgdXNlcyB0aGUgZGlyZWN0b3J5IGluIGJvdGggY2FzZXMuCisgIHN0cmlwcGVkPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAncy9cKC4qXClcLi4qJC9cMS8nYAorICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIiRAIiAtV2MsLU0KKyAgZWxzZQorICAgICIkQCIgLU0KKyAgZmkKKyAgc3RhdD0kPworCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiA6CisgIGVsc2UKKyAgICBzdHJpcHBlZD1gZWNobyAiJHN0cmlwcGVkIiB8IHNlZCAncyxeLiovLCwnYAorICAgIHRtcGRlcGZpbGU9IiRzdHJpcHBlZC51IgorICBmaQorCisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICBvdXRuYW1lPSIkc3RyaXBwZWQubyIKKyAgICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJy4KKyAgICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiwkb2JqZWN0IDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgc2VkIC1lICJzLF4kb3V0bmFtZTogXCguKlwpJCxcMTosIiA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICBlbHNlCisgICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKKyAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKKyAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaWNjKQorICAjIEludGVsJ3MgQyBjb21waWxlciB1bmRlcnN0YW5kcyBgLU1EIC1NRiBmaWxlJy4gIEhvd2V2ZXIgb24KKyAgIyAgICBpY2MgLU1EIC1NRiBmb28uZCAtYyAtbyBzdWIvZm9vLm8gc3ViL2Zvby5jCisgICMgSUNDIDcuMCB3aWxsIGZpbGwgZm9vLmQgd2l0aCBzb21ldGhpbmcgbGlrZQorICAjICAgIGZvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBmb28ubzogc3ViL2Zvby5oCisgICMgd2hpY2ggaXMgd3JvbmcuICBXZSB3YW50OgorICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5jCisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmgKKyAgIyAgICBzdWIvZm9vLmM6CisgICMgICAgc3ViL2Zvby5oOgorICAjIElDQyA3LjEgd2lsbCBvdXRwdXQKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jIHN1Yi9mb28uaAorICAjIGFuZCB3aWxsIHdyYXAgbG9uZyBsaW5lcyB1c2luZyBcIDoKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jIC4uLiBcCisgICMgICAgIHN1Yi9mb28uaCAuLi4gXAorICAjICAgICAuLi4KKworICAiJEAiIC1NRCAtTUYgIiR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJywKKyAgIyBvciBgZm9vLm86IGRlcDEuaCBkZXAyLmggXCcsIG9yIGAgZGVwMy5oIGRlcDQuaCBcJy4KKyAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICBzZWQgInMsXlteOl0qOiwkb2JqZWN0IDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyAgIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICBzZWQgJ3MsXlteOl0qOiBcKC4qXCkkLFwxLDtzL15cXCQvLzsvXiQvZDsvOiQvZCcgPCAiJHRtcGRlcGZpbGUiIHwKKyAgICBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCit0cnU2NCkKKyAgICMgVGhlIFRydTY0IGNvbXBpbGVyIHVzZXMgLU1EIHRvIGdlbmVyYXRlIGRlcGVuZGVuY2llcyBhcyBhIHNpZGUKKyAgICMgZWZmZWN0LiAgYGNjIC1NRCAtbyBmb28ubyAuLi4nIHB1dHMgdGhlIGRlcGVuZGVuY2llcyBpbnRvIGBmb28uby5kJy4KKyAgICMgQXQgbGVhc3Qgb24gQWxwaGEvUmVkaGF0IDYuMSwgQ29tcGFxIENDQyBWNi4yLTUwNCBzZWVtcyB0byBwdXQKKyAgICMgZGVwZW5kZW5jaWVzIGluIGBmb28uZCcgaW5zdGVhZCwgc28gd2UgY2hlY2sgZm9yIHRoYXQgdG9vLgorICAgIyBTdWJkaXJlY3RvcmllcyBhcmUgcmVzcGVjdGVkLgorICAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKKyAgIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQorICAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorCisgICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aCBUcnU2NCBjYywgc2hhcmVkIG9iamVjdHMgY2FuIGFsc28gYmUgdXNlZCB0byBtYWtlIGEKKyAgICAgICMgc3RhdGljIGxpYnJhcnkuICBUaGlzIG1lY2FuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCisgICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgorICAgICAgIworICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKKyAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCisgICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCisgICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCisgICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcworICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgorICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40CisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAorICAgICAgIiRAIiAtTUQKKyAgIGZpCisKKyAgIHN0YXQ9JD8KKyAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICAgZWxzZQorICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgICAgIGV4aXQgJHN0YXQKKyAgIGZpCisKKyAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICBkbworICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgIGRvbmUKKyAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICAgZWxzZQorICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgIGZpCisgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICA7OworCisjbm9zaWRlZWZmZWN0KQorICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKKyAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KKworZGFzaG1zdGRvdXQpCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIHRlc3QgLXogIiRkYXNobWZsYWciICYmIGRhc2htZmxhZz0tTQorICAjIFJlcXVpcmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgYDonCisgICMgaW4gdGhlIHRhcmdldCBuYW1lLiAgVGhpcyBpcyB0byBjb3BlIHdpdGggRE9TLXN0eWxlIGZpbGVuYW1lczoKKyAgIyBhIGRlcGVuZGVuY3kgc3VjaCBhcyBgYzovZm9vL2JhcicgY291bGQgYmUgc2VlbiBhcyB0YXJnZXQgYGMnIG90aGVyd2lzZS4KKyAgIiRAIiAkZGFzaG1mbGFnIHwKKyAgICBzZWQgJ3M6XlsgIF0qW146IF1bXjpdW146XSpcOlsgICAgXSo6JyIkb2JqZWN0IidcOiA6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitkYXNoWG1zdGRvdXQpCisgICMgVGhpcyBjYXNlIG9ubHkgZXhpc3RzIHRvIHNhdGlzZnkgZGVwZW5kLm00LiAgSXQgaXMgbmV2ZXIgYWN0dWFsbHkKKyAgIyBydW4sIGFzIHRoaXMgbW9kZSBpcyBzcGVjaWFsbHkgcmVjb2duaXplZCBpbiB0aGUgcHJlYW1ibGUuCisgIGV4aXQgMQorICA7OworCittYWtlZGVwZW5kKQorICAiJEAiIHx8IGV4aXQgJD8KKyAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorICAjIFggbWFrZWRlcGVuZAorICBzaGlmdAorICBjbGVhcmVkPW5vCisgIGZvciBhcmcgaW4gIiRAIjsgZG8KKyAgICBjYXNlICRjbGVhcmVkIGluCisgICAgbm8pCisgICAgICBzZXQgIiI7IHNoaWZ0CisgICAgICBjbGVhcmVkPXllcyA7OworICAgIGVzYWMKKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1EKnwtSSopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgIyBTdHJpcCBhbnkgb3B0aW9uIHRoYXQgbWFrZWRlcGVuZCBtYXkgbm90IHVuZGVyc3RhbmQuICBSZW1vdmUKKyAgICAjIHRoZSBvYmplY3QgdG9vLCBvdGhlcndpc2UgbWFrZWRlcGVuZCB3aWxsIHBhcnNlIGl0IGFzIGEgc291cmNlIGZpbGUuCisgICAgLSp8JG9iamVjdCkKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgb2JqX3N1ZmZpeD0iYGVjaG8gJG9iamVjdCB8IHNlZCAncy9eLipcLi8uLydgIgorICB0b3VjaCAiJHRtcGRlcGZpbGUiCisgICR7TUFLRURFUEVORC1tYWtlZGVwZW5kfSAtbyIkb2JqX3N1ZmZpeCIgLWYiJHRtcGRlcGZpbGUiICIkQCIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICBzZWQgJzEsMmQnICIkdG1wZGVwZmlsZSIgfCB0ciAnICcgJworJyB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZSIuYmFrCisgIDs7CisKK2NwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQuCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIiRAIiAtRSB8CisgICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKKyAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAorICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCisgICIkQCIgfHwgZXhpdCAkPworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgKikKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIiRAIiAtRSB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgorICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitub25lKQorICBleGVjICIkQCIKKyAgOzsKKworKikKKyAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZG9jL01ha2VmaWxlLmFtIGIvZG9jL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NTJhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS4yIDIwMDEvMDEvMTUgMTU6MTY6MDggYWxlaWRpbmdlciBFeHAgJAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCisKK1NVQkRJUlMgPSBodG1sIG1hbgpkaWZmIC0tZ2l0IGEvZG9jL01ha2VmaWxlLmluIGIvZG9jL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWM4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MTUgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKK3N1YmRpciA9IGRvYworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCisJaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKKwlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkZMQUdTID0gQEZGTEFHU0AKK0ZST05URU5EX0NGTEFHUyA9IEBGUk9OVEVORF9DRkxBR1NACitGUk9OVEVORF9MREFERCA9IEBGUk9OVEVORF9MREFEREAKK0ZST05URU5EX0xERkxBR1MgPSBARlJPTlRFTkRfTERGTEFHU0AKK0dSRVAgPSBAR1JFUEAKK0dUS19DRkxBR1MgPSBAR1RLX0NGTEFHU0AKK0dUS19DT05GSUcgPSBAR1RLX0NPTkZJR0AKK0dUS19MSUJTID0gQEdUS19MSUJTQAorSU5DTFVERVMgPSBASU5DTFVERVNACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IDEuOSBmb3JlaWduICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK1NVQkRJUlMgPSBodG1sIG1hbgorYWxsOiBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGRvYy9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgZG9jL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCiskKFJFQ1VSU0lWRV9UQVJHRVRTKToKKwlAZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCiskKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKKwlAZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCWNhc2UgIiRAIiBpbiBcCisJICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCisJICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCisJZXNhYzsgXAorCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCXJldj0iJCRyZXYgLiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCitjdGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKKwlkb25lCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICB0YWdzPSIkJHRhZ3MgJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICQkdGFncyAkJHVuaXF1ZTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgICAgZGlzdGRpcj1gJChhbV9fY2QpICQoZGlzdGRpcikgJiYgcHdkYDsgXAorCSAgICB0b3BfZGlzdGRpcj1gJChhbV9fY2QpICQodG9wX2Rpc3RkaXIpICYmIHB3ZGA7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCR0b3BfZGlzdGRpciIgXAorCSAgICAgICAgZGlzdGRpcj0iJCRkaXN0ZGlyLyQkc3ViZGlyIiBcCisJCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKKwkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktcmVjdXJzaXZlCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1yZWN1cnNpdmUKKworaW5mbzogaW5mby1yZWN1cnNpdmUKKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktcmVjdXJzaXZlCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLXJlY3Vyc2l2ZQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1yZWN1cnNpdmUKKworcGRmLWFtOgorCitwczogcHMtcmVjdXJzaXZlCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAorCWFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwljdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCisJaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAorCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9NYWtlZmlsZS5hbSBiL2RvYy9odG1sL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWEwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIzIEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS41IDIwMDgvMDYvMjggMjI6MzY6MjIgcm9iZXJ0IEV4cCAkCisKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIGFuc2kya25yCisKK2RvY2RpciA9ICQoZGF0YWRpcikvZG9jCitwa2dkb2NkaXIgPSAkKGRvY2RpcikvJChQQUNLQUdFKQoraHRtbGRpciA9ICQoZG9jZGlyKS9odG1sCitwa2dodG1sZGlyID0gJChwa2dkb2NkaXIpL2h0bWwKKworcGtnaHRtbF9EQVRBID0gXAorICAgICAgICBiYXNpYy5odG1sIFwKKwljb250cmlidXRvcnMuaHRtbCBcCisJZXhhbXBsZXMuaHRtbCBcCisJaGlzdG9yeS5odG1sIFwKKwlpZDMuaHRtbCBcCisJaW5kZXguaHRtbCBcCisJbGFtZS5jc3MgXAorCW1vZGVzLmh0bWwgXAorCW5vZGU2Lmh0bWwgXAorCXN3aXRjaHMuaHRtbAorCitFWFRSQV9ESVNUID0gJChwa2dodG1sX0RBVEEpCisKZGlmZiAtLWdpdCBhL2RvYy9odG1sL01ha2VmaWxlLmluIGIvZG9jL2h0bWwvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljYzU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzk2IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IGRvYy9odG1sCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBgZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQocGtnaHRtbGRpcikiCitwa2dodG1sREFUQV9JTlNUQUxMID0gJChJTlNUQUxMX0RBVEEpCitEQVRBID0gJChwa2dodG1sX0RBVEEpCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gJChkYXRhZGlyKS9kb2MKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gJChkb2NkaXIpL2h0bWwKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIGFuc2kya25yCitwa2dkb2NkaXIgPSAkKGRvY2RpcikvJChQQUNLQUdFKQorcGtnaHRtbGRpciA9ICQocGtnZG9jZGlyKS9odG1sCitwa2dodG1sX0RBVEEgPSBcCisgICAgICAgIGJhc2ljLmh0bWwgXAorCWNvbnRyaWJ1dG9ycy5odG1sIFwKKwlleGFtcGxlcy5odG1sIFwKKwloaXN0b3J5Lmh0bWwgXAorCWlkMy5odG1sIFwKKwlpbmRleC5odG1sIFwKKwlsYW1lLmNzcyBcCisJbW9kZXMuaHRtbCBcCisJbm9kZTYuaHRtbCBcCisJc3dpdGNocy5odG1sCisKK0VYVFJBX0RJU1QgPSAkKHBrZ2h0bWxfREFUQSkKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBkb2MvaHRtbC9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgZG9jL2h0bWwvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtcGtnaHRtbERBVEE6ICQocGtnaHRtbF9EQVRBKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQocGtnaHRtbGRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBrZ2h0bWxkaXIpIgorCUBsaXN0PSckKHBrZ2h0bWxfREFUQSknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBmPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiICQocGtnaHRtbERBVEFfSU5TVEFMTCkgJyQkZCQkcCcgJyQoREVTVERJUikkKHBrZ2h0bWxkaXIpLyQkZiciOyBcCisJICAkKHBrZ2h0bWxEQVRBX0lOU1RBTEwpICIkJGQkJHAiICIkKERFU1RESVIpJChwa2dodG1sZGlyKS8kJGYiOyBcCisJZG9uZQorCit1bmluc3RhbGwtcGtnaHRtbERBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChwa2dodG1sX0RBVEEpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBmPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChwa2dodG1sZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKHBrZ2h0bWxkaXIpLyQkZiI7IFwKKwlkb25lCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChEQVRBKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQocGtnaHRtbGRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1wa2dodG1sREFUQQorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1wa2dodG1sREFUQQorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcGtnaHRtbERBVEEgaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtcGtnaHRtbERBVEEKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvYmFzaWMuaHRtbCBiL2RvYy9odG1sL2Jhc2ljLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjMDkzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL2Jhc2ljLmh0bWwKQEAgLTAsMCArMSwxNTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+QmFzaWMgY29tbWFuZCBsaW5lIHN3aXRjaCByZWZlcmVuY2U8L1RJVExFPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IkNvbW1hbmQgbGluZSBzd2l0Y2ggcmVmZXJlbmNlIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJsYW1lIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzb184ODU5XzEiPgorPExJTksgUkVMPSJTVFlMRVNIRUVUIiBIUkVGPSJsYW1lLmNzcyI+Cis8L0hFQUQ+Cis8Qk9EWSBURVhUPSMwMDAwMDAKKyAgICAgICAgQkdDT0xPUj0jRjlGQkZCIExJTks9IzAwNjY2NiBWTElOSz0jNEM0QzRDCisgICAgICAgIEFMSU5LPSM5OTU1MDA+Cis8SDE+QmFzaWMgY29tbWFuZCBsaW5lIHN3aXRjaCByZWZlcmVuY2U8L0gxPgorPGJyPgorT25seSB0aGUgbW9zdCB1c3VhbCBzd2l0Y2hlcyBhcmUgZGVzY3JpYmVkIGhlcmUuIEhvd2V2ZXIgdGhvc2Ugc2hvdWxkIGJlIHN1ZmZpY2llbnQgCitmb3IgdGhlIHZhc3QgbWFqb3JpdHkgb2YgdXNlcnMuIAorPFA+IAorPFRBQkxFIENFTExQQURESU5HPTMgQk9SREVSPSIxIj4KKyAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgPFREIEFMSUdOPSJMRUZUIiBub3dyYXA+PGI+c3dpdGNoPC9iPjwvVEQ+CisgICAgPFREIEFMSUdOPSJMRUZUIiBub3dyYXA+PGI+cGFyYW1ldGVyPC9iPjwvVEQ+CisgIDwvVFI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1hYnIiPi0tYWJyPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+YXZlcmFnZSBiaXRyYXRlIGVuY29kaW5nPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjYiI+LWI8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5iaXRyYXRlICg4Li4uMzIwKTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1kZWNvZGUiPi0tZGVjb2RlPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+ZGVjb2Rpbmcgb25seTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI2YiPi1mPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGZhc3QgbW9kZTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI2giPi1oPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+aGlnaCBxdWFsaXR5PC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLWhlbHAiPi0taGVscDwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPiBoZWxwPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjbSI+LW0gbTwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPm1vbm8gbW9kZTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI1YiPi1WPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+VkJSIHF1YWxpdHkgc2V0dGluZyAoMC4uLjkpPC90ZD4KKyAgPC90cj4KKzwvVEFCTEU+Cis8QlI+Cis8ZGw+IAorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1hYnIgbjwva2JkPjxhIG5hbWU9Ii1hYnIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2F2ZXJhZ2UgCisgICAgYml0cmF0ZSBlbmNvZGluZzwvYT48L3N0cm9uZz4gCis8L2RsPgorPGRsPiAKKyAgPGRkPlR1cm5zIG9uIGVuY29kaW5nIHdpdGggYSB0YXJnZXRlZCBhdmVyYWdlIGJpdHJhdGUgb2YgbiBrYml0cywgYWxsb3dpbmcgdG8gCisgICAgdXNlIGZyYW1lcyBvZiBkaWZmZXJlbnQgc2l6ZXMuIFRoZSBhbGxvd2VkIHJhbmdlIG9mIG4gaXMgOC0zMjAsIHlvdSBjYW4gdXNlIAorICAgIGFueSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGF0IHJhbmdlLiAKKyAgPGR0Pjxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKzwvZGw+Cis8ZGw+IAorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LWIgbjwva2JkPjxhIG5hbWU9ImIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2JpdHJhdGU8L2E+PC9zdHJvbmc+IAorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD5Gb3IgTVBFRzEgKHNhbXBsaW5nIGZyZXF1ZW5jaWVzIG9mIDMyLCA0NC4xIGFuZCA0OCBrSHopPGJyPgorICAgIG4gPSAzMiw0MCw0OCw1Niw2NCw4MCw5NiwxMTIsMTI4LDE2MCwxOTIsMjI0LDI1NiwzMjA8YnI+CisgICAgPGJyPgorICAgIEZvciBNUEVHMiAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgMTYsIDIyLjA1IGFuZCAyNCBrSHopPGJyPgorICAgIG4gPSA4LDE2LDI0LDMyLDQwLDQ4LDU2LDY0LDgwLDk2LDExMiwxMjgsMTQ0LDE2MDxicj4KKyAgICA8YnI+CisgICAgRGVmYXVsdCBpcyAxMjgga2JzIGZvciBNUEVHMSBhbmQgODAga2JzIGZvciBNUEVHMi4gCisgIDxkdD48YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+Cis8L2RsPgorPGRsPiAKKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi0tZGVjb2RlPC9rYmQ+PGEgbmFtZT0iLWRlY29kZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGVjb2RpbmcgCisgICAgb25seTwvYT48L3N0cm9uZz4gPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+VXNlcyBMQU1FIGZvciBkZWNvZGluZyB0byBhIFdBViBmaWxlLiBUaGUgaW5wdXQgZmlsZSBjYW4gYmUgYW55IGlucHV0IHR5cGUgCisgICAgc3VwcG9ydGVkIGJ5IGVuY29kaW5nLCBpbmNsdWRpbmcgbGF5ZXIgSSxJSSxJSUkgKE1QMykuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LWY8L2tiZD48YSBuYW1lPSJmIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmYXN0IG1vZGU8L2E+PC9zdHJvbmc+IAorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gVGhpcyBzd2l0Y2ggZm9yY2VzIHRoZSBlbmNvZGVyIHRvIHVzZSBhIGZhc3RlciBlbmNvZGluZyBtb2RlLCBidXQgd2l0aCAKKyAgICBhIGxvd2VyIHF1YWxpdHkuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LWg8L2tiZD48YSBuYW1lPSJoIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtoaWdoIHF1YWxpdHk8L2E+PC9zdHJvbmc+IAorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gVXNlIHNvbWUgcXVhbGl0eSBpbXByb3ZlbWVudHMuIEVuY29kaW5nIHdpbGwgYmUgc2xvd2VyLCBidXQgdGhlIHJlc3VsdCAKKyAgICB3aWxsIGJlIG9mIGhpZ2hlciBxdWFsaXR5Ljxicj4KKyAgICBUaGlzIHN3aXRjaCBpcyBhbHdheXMgZW5hYmxlZCB3aGVuIHVzaW5nIFZCUi4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLWhlbHA8L2tiZD48YSBuYW1lPSItaGVscCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aGVscDwvYT48L3N0cm9uZz4gCisgIDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBEaXNwbGF5IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIG9wdGlvbnMuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LW0gbTwva2JkPjxhIG5hbWU9Im0iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO21vbm8gCisgICAgbW9kZTwvYT48L3N0cm9uZz4gPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+VGhlIGlucHV0IHdpbGwgYmUgZW5jb2RlZCBhcyBhIG1vbm8gc2lnbmFsLiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi1WIDAuLi45PC9rYmQ+PGEgbmFtZT0iViI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VkJSIHF1YWxpdHkgCisgICAgc2V0dGluZzwvYT48L3N0cm9uZz48L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gRW5hYmxlIFZCUiAoVmFyaWFibGUgQml0UmF0ZSkgYW5kIHNwZWNpZmllcyB0aGUgdmFsdWUgb2YgVkJSIHF1YWxpdHkuPGJyPgorICAgIGRlZmF1bHQ9NDxicj4KKyAgICAwPWhpZ2hlc3QgcXVhbGl0eS4gCis8L2RsPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvY29udHJpYnV0b3JzLmh0bWwgYi9kb2MvaHRtbC9jb250cmlidXRvcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQ5ZWZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvY29udHJpYnV0b3JzLmh0bWwKQEAgLTAsMCArMSwxNzMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8IS0tIHNhdmVkIGZyb20gdXJsPSgwMDUxKWh0dHA6Ly9pbnRlcm5ldC5yb2FkcnVubmVyLmNvbS9+bXQvbXAzL2hpc3RvcnkuaHRtbCAtLT4KKzxIVE1MPjxIRUFEPjxUSVRMRT5Db250cmlidXRvcnM8L1RJVExFPgorPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlPgorPE1FVEEgY29udGVudD0iTVNIVE1MIDUuMDAuMjAxNC4yMTAiIG5hbWU9R0VORVJBVE9SPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibGFtZS5jc3MiPjwvSEVBRD4KKzxCT0RZIGFMaW5rPSNiYmJiYmIgYmdDb2xvcj0jZmZmZmZmIGxpbms9Izg4ODg4OCB0ZXh0PSMwMDAwMDAgdkxpbms9IzU1NTU1NT4KKzxDRU5URVI+CisgIDxIMT5Db250cmlidXRvcnM8L0gxPgorPC9DRU5URVI+Cis8SFI+Cis8SDQ+VGhlIGZvbGxvd2luZyBwZW9wbGUgY29udHJpYnV0ZWQgdG8gdGhlIExBTUUgZGV2ZWxvcG1lbnQ6PC9IND4KKzxwPiBMYXVyaSBBaG9uZW48YnI+CisgIFNha2FyaSBBaWx1czxicj4KKyAgVGVybyBBdXZpbmVuPGJyPgorICBNaWNoYWwgQmFjaWs8YnI+CisgIEFsZXggQmFsbGVnb295PGJyPgorICBXaWxmcmllZCBCZWhuZTxicj4KKyAgQm9iIEJlbGw8YnI+CisgIFNpbW9uIEJsYW5kZm9yZDxicj4KKyAgU2VnaGVyIEJvZXNzZW5rb29sPGJyPgorICBGbG9yaWFuIEJvbWU8YnI+CisgIExpb25lbCBCb25uZXQ8YnI+CisgIEdhYnJpZWwgQm91dmlnbmU8YnI+CisgIFJvZyZlYWN1dGU7cmlvIFRoZW9kb3JvIGRlIEJyaXRvPGJyPgorICBFcmlrIGRlIENhc3RybyBMb3BvPGJyPgorICBEYXZpZCBDaGFuZGxlcjxicj4KKyAgTWljaGFlbCBDaGVuZzxicj4KKyAgSm9obiBEYWhsc3Ryb208YnI+CisgIEdvcmFuIERva2ljPGJyPgorICBKYW1lcyBEcm9wcG88YnI+CisgIFNlcmdleSBEdWJvdjxicj4KKyAgRG9taW5pcXVlIER1dml2aWVyPGJyPgorICBKb2huIEVkd2FyZHM8YnI+CisgIEFsdmFybyBNYXJ0aW5leiBFY2hldmFycmlhPGJyPgorICBKb2FraW0gRW5lcnN0YW08YnI+CisgIEFsYmVydCBGYWJlcjxicj4KKyAgTmlscyBGYWVyYmVyPGJyPgorICBTYW1pIEZhcmluPGJyPgorICBNaWtoYWlsIE0uIEZlZG90b3Y8YnI+CisgIEpvc2VwaCBGb3VyaWVyPGJyPgorICBKYW5pIEZyaWxhbmRlcjxicj4KKyAgUmljaGFyZCBHb3J0b248YnI+CisgIENhc3BlciBHcmlwZW5iZXJnPGJyPgorICBTdGVmZmFuIEhhZXVzZXI8YnI+CisgIEplcmVteSBIYWxsPGJyPgorICBQYXVsIEhhcnRtYW48YnI+CisgIEpvaG4gSGF5d2FyZC1XYXJidXJ0b248YnI+CisgIFBlZGVyIEhlZGx1bmQgPGJyPgorICBSb2JlcnQgSGVnZW1hbm48YnI+CisgIE1hdGhldyBIZW5kcnk8YnI+CisgIE1hZ251cyBIb2xtZ3JlbiA8YnI+CisgIFZpdGFseSBJdmFub3Y8YnI+CisgIEJlbiAiSmFjb2JzIjxicj4KKyAgVGFtaXRvIEthaml5YW1hPGJyPgorICBUaSBLYW4gPGJyPgorICBNbyBLYXR6PGJyPgorICBJd2FzYSBLYXptaTxicj4KKyAgUmFsZiBLZW1wa2VucyA8YnI+CisgIEZyYW5rIEtsZW1tPGJyPgorICBBbGVrc2FuZGVyIEtvcnp5bnNraTxicj4KKyAgSm9hY2hpbSBLdWViYXJ0IDxicj4KKyAgTGVvbmlkIEt1bGFrb3Y8YnI+CisgIERtaXRyeSBLdXRzYW5vdjxicj4KKyAgSmFybW8gTGFha2tvbmVuIDxicj4KKyAgQW4gdmFuIExhbTxicj4KKyAgRGVubmlzIExhbWJlIEpyPGJyPgorICBKdWhhIExhdWthbGE8YnI+CisgIEdyZWcgTGVoZXkgPGJyPgorICBGZWxpeCB2b24gTGVpdG5lcjxicj4KKyAgUmFmYWVsIEx1ZWJiZXJ0PGJyPgorICBNYWNpazxicj4KKyAgTGFycyBNYWduZSBJbmdlYnJpZ3RzZW48YnI+CisgIFNjb3R0IE1hbmxleTxicj4KKyAgVmxhZGltaXIgTWFyZWs8YnI+CisgIEdvcmFuIE1hcmtvdmljPGJyPgorICBTZXJnZXkgQS4gTWFzbHlha292PGJyPgorICBDaHJpcyBNYXRyYWtpZGlzPGJyPgorICBHcmVnIE1heHdlbGw8YnI+CisgIENocmlzIE1pbGxlcjxicj4KKyAgU2NvdHQgTWlsbGVyPGJyPgorICBEYXJpbiBNb3JyaXNvbjxicj4KKyAgVG9tYXN6IE1vdHlsZXdza2k8YnI+CisgIEtpbW1vIE11c3RvbmVuIDxicj4KKyAgRGFuIE5lbHNvbjxicj4KKyAgTnlhb2NoaTxicj4KKyAgQW50b24gT2xleW5pa292PGJyPgorICBNaWtlIE9saXBoYW50PGJyPgorICBBbmRyJmVhY3V0ZTsgT3N0ZXJodWVzPGJyPgorICBKb2hhbm5lcyBPdmVybWFubjxicj4KKyAgR2lhbi1DYXJsbyBQYXNjdXR0bzxicj4KKyAgSmFuIFBlbWFuPGJyPgorICBKYW4gUmFmYWo8YnI+CisgIEdlcnRqYW4gdmFuIFJhdGluZ2VuPGJyPgorICBNaWd1ZWwgUmV2aWxsYSBSb2RyaWd1ZXo8YnI+CisgIFNoYXduIFJpbGV5PGJyPgorICBUaW0gUnVkZGljazxicj4KKyAgSW5nbyBTYWl0ejxicj4KKyAgQ29ucmFkIFNhbmRlcnNvbjxicj4KKyAgU2VyZ2V5IFNhcGVsaW48YnI+CisgIFdpbGxpYW0gU2NoZWx0ZXI8YnI+CisgIEp1c3RpbiBTY2hvZW1hbjxicj4KKyAgQW50b24gU2VyZ3Vub3Y8YnI+CisgIE5hb2tpIFNoaWJhdGE8YnI+CisgIFNpZ2Jq+HJuIFNrauZyZXQ8YnI+CisgIE5hdGhhbiBTbGluZ2VybGFuZDxicj4KKyAgUGF0cmljayBEZSBTbWV0PGJyPgorICBBY3kgU3RhcHA8YnI+CisgIE1hcmsgU3RlcGhlbnM8YnI+CisgIEpvbmF0aGFuIFN0b3R0PGJyPgorICBBbGV4YW5kZXIgU3R1bXBmIDxicj4KKyAgU3RlcGhhbmUgVGF2ZW5hcmQ8YnI+CisgIE1hcmsgVGF5bG9yPGJyPgorICBNaWtoYWlsIFRldGVyaW4gPGJyPgorICBCcmFkIFRocmVhdHQ8YnI+CisgIFRha2VoaXJvIFRvbWluYWdhPGJyPgorICBXYXJyZW4gVG9vbWV5PGJyPgorICBBdHJvIFRvc3NhdmFpbmVuIDxicj4KKyAgUm9lbCBWYW4gRGVuIEJlcmdoZTxicj4KKyAgS3lsZSBWYW5kZXJCZWVrPGJyPgorICBMaW51cyBXYWxsZWlqPGJyPgorICBNYXJ0aW4gV2VnaG9mZXI8YnI+CisgIFdpbGxpYW0gV2VsY2g8YnI+CisgIEdlcmhhcmQgV2VzcDxicj4KKyAgQWxmcmVkIFdleWVyczxicj4KKyAgQ2hyaXN0b3BoZXIgV2lzZTxicj4KKyAgRXRoYW4gWWVvPGJyPgorICBDaHVjayBaZW5rdXMgPC9wPgorPHA+Jm5ic3A7PC9wPgorPGg0Pk9yaWdpbmFsIElTTyBjb250cmlidXRvcnM6PC9oND4KKzxwPkJpbGwgQXNwcm9tb250ZTxicj4KKyAgU2hhdW4gQXN0YXJhYmFkaTxicj4KKyAgUi4gQml0dG5lcjxicj4KKyAgS2FybGhlaW56IEJyYW5kZW5idXJnPGJyPgorICBXLiBKb3NlcGggQ2FydGVyPGJyPgorICBKYWNrIENoYW5nPGJyPgorICBNaWtlIENvbGVtYW48YnI+CisgIEpvaG5hdGhhbiBEZXZpbmU8YnI+CisgIEVybnN0IEViZXJsZWluPGJyPgorICBEYW4gRWxsaXM8YnI+CisgIFBldGVyIEZhcnJldHQ8YnI+CisgIEplYW4tR2VvcmdlcyBGcml0c2NoPGJyPgorICBWbGFkIEZydWNodGVyPGJyPgorICBIZW5kcmlrIEZ1Y2hzPGJyPgorICBCZXJuaGFyZCBHcmlsbDxicj4KKyAgQW1pdCBHdWxhdGk8YnI+CisgIE11bnNpIEhhcXVlPGJyPgorICBDaHVjayBIc2lhbzxicj4KKyAgVG9zaGl5dWtpIElzaGlubzxicj4KKyAgTWFzYWhpcm8gSXdhZGFyZTxicj4KKyAgRWFybCBKZW5uaW5nczxicj4KKyAgSmFtZXMgSm9obnN0b248YnI+CisgIExlb24gdi5kLiBLZXJraG9mPGJyPgorICBEb24gTGVlPGJyPgorICBNaWtlIExpPGJyPgorICBZdS1UYW5nIExpbjxicj4KKyAgU29yZW4gTmVpbHNlbjxicj4KKyAgU2ltYW8gRi4gQ2FtcG9zIE5ldG88YnI+CisgIE1hcmsgUGFsZXk8YnI+CisgIERhdmlzIFBhbjxicj4KKyAgVGFuIEFoIFBlbmc8YnI+CisgIEtldmluIFBldGVyc29uPGJyPgorICBKdWFuIFBpbmVkYTxicj4KKyAgRXJuc3QgRi4gU2Nocm9lZGVyPGJyPgorICBQZXRlciBTaWViZXJ0PGJyPgorICBKZW5zIFNwaWxsZTxicj4KKyAgSm9obiBTdGV3YXJ0PGJyPgorICBTYW0gU3Rld2FydDxicj4KKyAgQWwgVGFiYXlveW9uPGJyPgorICBLYXRoeSBXYW5nPGJyPgorICBGcmFuei1PdHRvIFdpdHRlPGJyPgorICBEb3VnbGFzIFdvbmc8L3A+Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9leGFtcGxlcy5odG1sIGIvZG9jL2h0bWwvZXhhbXBsZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmU1ZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvZXhhbXBsZXMuaHRtbApAQCAtMCwwICsxLDQ0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKyAgIDxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IlNvbWUgZXhhbXBsZXMiPgorICAgPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9ImxhbWUiPgorICAgPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorICAgPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorICAgPE1FVEEgTkFNRT0iR0VORVJBVE9SIiBDT05URU5UPSJNb3ppbGxhLzQuMDggW2VuXSAoWDExOyBJOyBMaW51eCAyLjAuMzYgaTY4NikgW05ldHNjYXBlXSI+CisgICA8VElUTEU+U29tZSBjb21tYW5kIGxpbmUgZXhhbXBsZXM8L1RJVExFPgorPExJTksgUkVMPSJTVFlMRVNIRUVUIiBIUkVGPSJsYW1lLmNzcyI+Cis8L0hFQUQ+Cis8Qk9EWSBURVhUPSIjMDAwMDAwIiBCR0NPTE9SPSIjRjlGQkZCIiBMSU5LPSIjMDA2NjY2IiBWTElOSz0iIzRDNEM0QyIgQUxJTks9IiM5OTU1MDAiPgorPEgxPjxGT05UIEZBQ0U9IkhlbHZldGljYSI+U29tZSBjb21tYW5kIGxpbmUgZXhhbXBsZXM8L0ZPTlQ+PC9IMT4KKzxVTD4KKyAgPExJPiBGaXhlZCBiaXQgcmF0ZSAxMjhrYnBzIGVuY29kaW5nOjxicj4KKyAgICA8a2JkPmxhbWUgc2FtcGxlLndhdiBzYW1wbGUubXAzPC9rYmQ+PGJyPgorICAgIDxicj4KKyAgPC9MST4KKyAgPExJPiBGaXhlZCBiaXQgcmF0ZSBqc3RlcmVvIDEyOGticHMgZW5jb2RpbmcsIGhpZ2ggcXVhbGl0eSAocmVjb21tZW5kZWQpOjxicj4KKyAgICA8a2JkPmxhbWUgLWggc2FtcGxlLndhdiBzYW1wbGUubXAzPC9rYmQ+PGJyPgorICAgIDxicj4KKyAgPC9MST4KKyAgPExJPiBBdmVyYWdlIGJpdCByYXRlIDExMmticHMgZW5jb2Rpbmc6PGJyPgorICAgIDxrYmQ+bGFtZSAtLWFiciAxMTIgc2FtcGxlLndhdiBzYW1wbGUubXAzPC9rYmQ+PGJyPgorICAgIDxicj4KKyAgPC9MST4KKyAgPExJPkZhc3QgZW5jb2RlLCBsb3cgcXVhbGl0eSAobm8gcHN5Y2hvLWFjb3VzdGljcyk6PGJyPgorICAgIDxrYmQ+bGFtZSAtZiBzYW1wbGUud2F2IHNhbXBsZS5tcDM8YnI+CisgICAgPGJyPgorICAgIDwva2JkPjwvTEk+CisgIDxMST5WYXJpYWJsZSBiaXRyYXRlICh1c2UgLVYgbiB0byBhZGp1c3QgcXVhbGl0eS9maWxlc2l6ZSk6PGJyPgorICAgIDxrYmQ+bGFtZSAtaCAtViA2IHNhbXBsZS53YXYgc2FtcGxlLm1wMzxicj4KKyAgICA8YnI+CisgICAgPC9rYmQ+PC9MST4KKyAgPExJPlN0cmVhbWluZyBtb25vIDIyLjA1IGtIeiByYXcgcGNtLCAyNCBrYnBzIG91dHB1dDo8YnI+CisgICAgPGtiZD5jYXQgaW5wdXRmaWxlIHwgbGFtZSAtciAtbSBtIC1iIDI0IC1zIDIyLjA1IC0tID4gb3V0cHV0PGJyPgorICAgIDxicj4KKyAgICA8L2tiZD48L0xJPgorICA8TEk+U3RyZWFtaW5nIG1vbm8gNDQuMSBrSHogcmF3IHBjbSwgd2l0aCBkb3duc2FtcGxpbmcgdG8gMjIuMDUga0h6Ojxicj4KKyAgICA8a2JkPmNhdCBpbnB1dGZpbGUgfCBsYW1lIC1yIC1tIG0gLWIgMjQgLS1yZXNhbXBsZSAyMi4wNSAtLSA+IG91dHB1dDwva2JkPjwvTEk+Cis8L1VMPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvaGlzdG9yeS5odG1sIGIvZG9jL2h0bWwvaGlzdG9yeS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Nzc1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9oaXN0b3J5Lmh0bWwKQEAgLTAsMCArMSwzMjkxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorCisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorCisgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcgW2VuXSAoWDExOyBJOyBMaW51eCAyLjIuMTItMjAgaTY4NikgW05ldHNjYXBlXSI+CisKKyAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgIDx0aXRsZT5MQU1FIENoYW5nZWxvZzwvdGl0bGU+CisKKworPC9oZWFkPgorCisKKzxib2R5IHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7IiBhbGluaz0iI2JiYmJiYiIgbGluaz0iIzg4ODg4OCIgdmxpbms9IiM1NTU1NTUiPgorCis8Y2VudGVyPgorPGgxPkhpc3Rvcnk8L2gxPgorCis8L2NlbnRlcj4KKworU3RhcnRpbmcgd2l0aCBMQU1FIDMuMDogPGJyPgorCis8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+cmVkID0gZmVhdHVyZXMgYW5kIGJ1ZyBmaXhlcyB3aGljaAorYWZmZWN0IHF1YWxpdHk8L2ZvbnQ+IDxicj4KKworPGZvbnQgY29sb3I9IiMzMzY2ZmYiPmJsdWUgPSBmZWF0dXJlcyBhbmQgYnVnIGZpeGVzIHdoaWNoCithZmZlY3Qgc3BlZWQ8L2ZvbnQ+IDxicj4KKworYmxhY2sgPSB1c2FiaWxpdHksIHBvcnRhYmlsaXR5LCBvdGhlcgorPGhyPgorCis8aHI+Cis8aDM+TEFNRSAzLjk4LjQgJm5ic3A7ICZuYnNwO01hcmNoIDIyIDIwMTA8L2gzPgorPHVsPgorICA8bGk+Sm9zZXBoIEZseW5uCisgICAgPHVsPgorICAgICAgPGxpPkltcHJvdmVtZW50cyBmb3IgTEFNRSBEaXJlY3RTaG93IGZpbHRlcjoKKyAgICA8dWw+CisgICAgICA8bGk+QWRkZWQgc3VwcG9ydCBmb3IgdGhlIERpcmVjdFNob3cgSUFNU3RyZWFtQ29uZmlnIEludGVyZmFjZSB0byB0aGUgTEFNRSBlbmNvZGVyIGZpbHRlciBvdXRwdXQgcGluLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5Nb2RpZmllZCB0aGUgRGlyZWN0U2hvdyBmaWx0ZXIgcmVnaXN0cmF0aW9uIHNlY3Rpb24gc28gdGhhdCB0aGUgTEFNRSBFbmNvZGVyIGZpbHRlciBpcyBjb3JyZWN0bHkgcmVnaXN0ZXJlZCBpbiB0aGUgQXVkaW8gQ29tcHJlc3NvcnMgZmlsdGVyIGNhdGVnb3J5LiBUaGlzIHdpbGwgYWxsb3cgdGhpcmQtcGFydHkgZW5jb2RpbmcgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBEaXJlY3RTaG93IFN5c3RlbSBEZXZpY2UgRW51bWVyYXRvciBJbnRlcmZhY2UgdG8gY29ycmVjdGx5IGRldGVjdCB0aGUgTEFNRSBlbmNvZGVyIHdoZW4gcXVlcnlpbmcgdGhlIEF1ZGlvIENvbXByZXNzb3JzIGZpbHRlciBncm91cC4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+TW9kaWZpZWQgdGhlIGZpbHRlciByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgTVAzIGF1ZGlvIHN1YnR5cGUgaXMgY29ycmVjdGx5IHJlcG9ydGVkIGFzIGJlaW5nIHN1cHBvcnRlZCBvbiB0aGUgZW5jb2RlciBvdXRwdXQgcGluLiBUaGlzIHdpbGwgYWxsb3cgdGhpcmQtcGFydHkgZW5jb2RpbmcgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBEaXJlY3RTaG93IElGaWx0ZXJNYXBwZXIyIEludGVyZmFjZSB0byByZWNvZ25pemUgdGhhdCB0aGUgTEFNRSBlbmNvZGVyIHN1cHBvcnRzIE1QMyBvdXRwdXQuCisgICAgICA8L2xpPgorICAgICAgPGxpPkFsdGVyZWQgdGhlIEZpbHRlciBNZXJpdCBWYWx1ZSB0aGF0IHdhcyBiZWluZyB1c2VkIHdoZW4gdGhlIGZpbHRlciB3YXMgcmVnaXN0ZXJlZCBzbyB0aGF0IGl0IGlzIG5vdyB1c2luZyB0aGUgc3RhbmRhcmQgRGlyZWN0U2hvdyBjb21wcmVzc29yIGZpbHRlciBtZXJpdCB2YWx1ZSBvZiBNRVJJVF9ET19OT1RfVVNFICgweDIwMDAwMCkuIFByZXZpb3VzbHksIHRoZSBmaWx0ZXIgd2FzIGJlaW5nIHJlZ2lzdGVyZWQgdXNpbmcgYSB2YWx1ZSBvZiBNRVJJVF9TV19DT01QUkVTU09SICgweDEwMDAwMCksIHdoaWNoIHdhcyBhdCBhIGxvd2VyIHByaW9yaXR5IChpLmUuIHdvcnNlIHByaW9yaXR5KSB0aGFuIE1FUklUX0RPX05PVF9VU0UuIFRoaXMgcHJldmVudGVkIHRoZSBMQU1FIEVuY29kZXIgZmlsdGVyIGZyb20gYmVpbmcgc2VsZWN0ZWQgZm9yIHVzZSBieSBzb21lIHRoaXJkLXBhcnR5IGVuY29kaW5nIGFwcGxpY2F0aW9ucy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+QWRkZWQgY29kZSB0byBjYWxjdWxhdGUgdGhlIGZyYW1lIGxlbmd0aCBvZiB0aGUgYXVkaW8gZnJhbWVzIHVzZWQgZm9yIHRoZSBuQmxvY2tTaXplIGVsZW1lbnQgb2YgdGhlIFdBVkVGT1JNQVRFWCBvdXRwdXQgc3RydWN0dXJlLiBQcmV2aW91c2x5IHRoaXMgdmFsdWUgd2FzIHNpbXBseSBoYXJkLWNvZGVkIHRvIDEuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisKKyAgPGxpPlJvYmVydCBIZWdlbWFubgorICAgIDx1bD4KKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Rml4IGZvciBCdWd0cmFja2VyIGl0ZW0gPGk+WyAyOTczODc3IF0gQSBwcm9ibGVtIHJlZ2FyZGluZyB0aGUgbmV3IGRyYWluIGNvZGU8L2k+PC9mb250PgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorPC91bD4KKworPGgzPkxBTUUgMy45OC4zICZuYnNwOyAmbmJzcDtGZWJydWFyeSAyNyAyMDEwPC9oMz4KKzx1bD4KKyAgPGxpPlJvZyZlYWN1dGU7cmlvIEJyaXRvOgorICAgIDx1bD4KKyAgICAgIDxsaT5VcGRhdGUgdGhlIGRlYmlhbiBwYWNrYWdpbmcgZm9yIHRoZSBuZXcgcmVsZWFzZS4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKyAgPGxpPlJvYmVydCBIZWdlbWFubgorICAgIDx1bD4KKyAgICAgIDxsaT5UaGUgPGI+aWdub3JlLXRhZy1lcnJvcnM8L2I+IHN3aXRjaCBoYWQgbm8gZWZmZWN0IHdoZW4gZW1iZWRkaW5nIGFsYnVtIGFydCwgZml4ZWQuPC9saT4KKyAgICAgIDxsaT5MaWJyYXJ5IEFQSSBjaGFuZ2U6IGxhbWVfZGVjb2RlIGZ1bmN0aW9ucyBhcmUgbm93IG9ic29sZXRlIGJ1dCBzdGlsbCBwcmVzZW50LCBwbGVhc2UgdXNlIGhpcF9kZWNvZGUgaW5zdGVhZC4KKyAgICAgIFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzOiBsYW1lX2RlY29kZSBmdW5jdGlvbnMgdXNlIGEgc2luZ2xlIGdsb2JhbCB2YXJpYWJsZSB3aXRoaW4gdGhlIGxpYnJhcnkKKyAgICAgIHRvIHN0b3JlIGRlY29kZXIgc2V0dXAsIGhpcF9kZWNvZGUgZnVuY3Rpb25zIGRvbid0LgorICAgICAgVGhlIGVuY29kZXIgbm93IHVzZXMgaGlwX2RlY29kZSBpbnRlcm5hbGx5IGFuZCBpdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIDxiPmNsaXBkZXRlY3Q8L2I+CisgICAgICBmZWF0dXJlIHdoaWxlIHJlZW5jb2RpbmcgbXAzIHRvIG1wMy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+V29ya2Fyb3VuZCBmb3IgRkZNUEVHIGJ1Zywgd2hpY2ggdXNlcyB0byBjYWxsIGxhbWVfZW5jb2RlX2ZsdXNoIG1vcmUgdGhhbiBvbmNlIGluIGEgbG9vcC4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+V2luZG93czogcHJvZ3JhbSBpY29uIGFuZCB2ZXJzaW9uIGluZm8gYWRkZWQgKHdoZW4gYnVpbGRpbmcgd2l0aCBWQzkpCisgICAgICA8L2xpPgorICAgICAgPGxpPkZpeCBmb3IgQnVndHJhY2tlciBpdGVtIDxpPlsgMjY4ODQxMyBdIGxpYiBuYW1lIHByb2JsZW0gaW4gTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gNjwvaT4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+Rml4IGZvciBCdWd0cmFja2VyIGl0ZW1zIDxpPlsgMjA1MTg3MCwgMjQyMzY1MCwgMjkyODY4NCBdIHNldmVyYWwgc21hbGwgZG9jdW1lbnRhdGlvbiBpc3N1ZXM8L2k+CisgICAgICA8L2xpPgorICAgICAgPGxpPkZpeCBmb3IgQnVndHJhY2tlciBpdGVtIDxpPlsgMjcyMzUxOCBdIHJlc2FtcGxpbmcgaW4gMy45OCBhbmQgMy45OWFscGhhPC9pPgorICAgICAgPC9saT4KKyAgICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDI4OTE4NzkgXSBCZWNhdXNlIG9mIFdpbmRvd3MgQVBJIGNoYW5nZSwgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSA8Yj5wcm9yaXR5PC9iPiBzd2l0Y2guPC9pPgorICAgICAgPC9saT4KKyAgICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDI4OTMxMDEgXSBBY2Nlc3MgVmlvbGF0aW9uIGluIEJsYWRlTVAzRW5jRExMIGlmIFVOSUNPREUgd2FzIGRlZmluZWQuPC9pPgorICAgICAgPC9saT4KKyAgICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDI4ODczNTkgXSBXcm9uZyBsZW5ndGggaW4gSUQzdjIgdGFnIHdoZW4gbnVtX3NhbXBsZXMgaXNuJ3Qgc2V0PC9pPgorICAgICAgPC9saT4KKyAgICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDI4NzI1OTAgXSBMYW1lVEFHOiAiTXVzaWMgbGVuZ3RoIiBtaXNzbWF0Y2ggaW4gTEFNRSAzLjk4PC9pPgorICAgICAgPC9saT4KKyAgICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDI4MjQyOTYgXSB3cm9uZyBlbmNfcGFkZGluZyB2YWx1ZSBpbiBMQU1FIDMuOTlhIGFuZCAzLjk4LjMgKGZyb20gQ1ZTKTwvaT4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPlJldmlzaXRpbmcgdGhlIEZoRyBkZWNvZGVyIHByb2JsZW0gKEZoRyBWMS41IGJ1aWxkIDUwLCBzaGlwcyB3aXRoIE1TIFdpbmRvd3MpOgorICAgICAgZW5hYmxpbmcgdGhlIG5ldy1kcmFpbi1jb2RlIHNlZW1zIHRvIHNvbHZlIHRoYXQgaXNzdWUgYmV0dGVyLCB0aGFuIHJlc3RyaWN0aW5nIHRoZSBidWZmZXIgc2l6ZSAoc2VlIGJlbG93OiAzLjk4IGJldGEgMSwgTWF5IDE2IDIwMDcpLjwvZm9udD4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+UGF0Y2ggc3VibWl0dGVkIGJ5IEJlcm5oYXJkIERvZWJsZXIsIHRyYWNrZXIgaXRlbSA8aT5bIDI4MDc2NzYgXSBFcnJvciB3aGVuIGJ1aWxkaW5nIExhbWUgd2l0aCBOQVNNIHN1cHBvcnQ8L2k+CisgICAgICA8L2xpPgorICAgICAgPGxpPlBhdGNoIHN1Ym1pdHRlZCBieSBNYW5jdXNvIFJhZmZhZWxlLCB0cmFja2VyIGl0ZW0gPGk+WyAyNDA2NDIwIF0gY29tcGlsZSBsYW1lX2VuYy5kbGwgdW5kZXIgY3lnd2luPC9pPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorPC91bD4gIAorICAKKzxoMz5MQU1FIDMuOTguMiAmbmJzcDsgJm5ic3A7U2VwdGVtYmVyIDIyIDIwMDg8L2gzPgorPHVsPgorICA8bGk+Um9iZXJ0IEhlZ2VtYW5uPC9saT4KKyAgPHVsPgorICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDIxMjMyMDYgXSBsYW1lIDMuOTguMSBzZWdmYXVsdHMgd2l0aCAtaDwvaT4KKyAgPC9saT4KKyAgPC91bD4KKzwvdWw+CisgIAorPGgzPkxBTUUgMy45OC4xICZuYnNwOyAmbmJzcDtTZXB0ZW1iZXIgMjEgMjAwODwvaDM+Cis8dWw+CisgIDxsaT5Sb2cmZWFjdXRlO3JpbyBCcml0bzoKKyAgICA8dWw+CisgICAgICA8bGk+TW9yZSBmaXhlcyBmb3IgdGhlIGFieCB0b29sIGZvciBVbml4IHN5c3RlbXM6CisJPHVsPgorCSAgPGxpPlBsdWdnZWQgYSBtZW1vcnkgbGVhay48L2xpPgorCSAgPGxpPkZpeGVkIGFuIGVuZGlhbm5lc3MgcHJvYmxlbTogdXNlcnMgb2YgYmlnLWVuZGlhbiBtYWNoaW5lcworCSAgY2FuIG5vdyBkbyBhYnggdGVzdHMuPC9saT4KKwk8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaT5GaXhlZCBoaXN0b3J5J3MgSFRNTCBkb2N0eXBlPC9saT4KKyAgICAgIDxsaT4KKwlGaXhlZCBoaXN0b3J5IHNvIHRoYXQgaXQgPGVtPmZpbmFsbHk8L2VtPiB2YWxpZGF0ZXMKKwlhdCA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy8iPlczJ3MgdmFsaWRhdG9yPC9hPgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKwlGaXhlZCBjb21waWxhdGlvbiBvZiBmcm9udGVuZCA8Y29kZT5tcDNydHAuYzwvY29kZT4uIFRoYW5rcyB0byBLcmlzIEthcmFzLgorCUJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDIwMTU0MzIgXSBtcDNydHAgbWlzc2luZyB1aW50MTZfdCBpbiBsYW1lIDMuOTg8L2k+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT5Sb2JlcnQgSGVnZW1hbm46CisgICAgPHVsPgorICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDIwMzE3MDQgXSAtLWlkM3YxLW9ubHkgZGlkbnQgd29yayBpbiAzLjk4LWZpbmFsPC9pPjwvbGk+CisgICAgPGxpPkZpeCBmb3IgQnVndHJhY2tlciBpdGVtIDxpPlsgMjAyMjAzNSBdIGVuY29kZXJfcGFkZGluZyB2YWx1ZSBhbmQgcmVzYW1wbGluZzwvaT48L2xpPgorICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDIwMjkyODIgXSBGcmVxdWVuY3kgZmlsdGVyaW5nIEFQSSBicm9rZW4gaW4gMy45ODwvaT48L2xpPgorICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDIwMzk2NDggXSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgaW4gcGFyc2VfYXJncygpIGZ1bmN0aW9uIGluIHBhcnNlLmM8L2k+PC9saT4KKyAgICA8bGk+Rml4IGZvciBzb21lIHRhZ2dpbmcgaXNzdWVzOgorICAgIDx1bD4KKyAgICA8bGk+TWFkZSBzZWFyY2ggZm9yIElEM3YxIGdlbnJlcyBtb3JlIHNsb3BweSwgYWJicmV2YXRpb25zIG1heSBtYXRjaCBtb3JlIG9mdGVuIGFzIHNvbWUgc2ltcGxlIHR5cG9zLgorICAgICAgICBFeGFtcGxlczo8dWw+PGxpPi0tdGcgIkFsdC4gUm9jayIgbWF0Y2hlcyBnZW5yZSAiQWx0ZXJuYXRlIFJvY2siPC9saT4KKyAgICAgICAgICAgICAgICAgPGxpPi0tdGcgImFjYXBlbGEiIG1hdGNoZXMgZ2VucmUgIkEgQ2FwcGVsbGEiPC9saT4KKyAgICAgICAgICAgICAgICAgPC91bD48L2xpPgorICAgIDxsaT5OZXcgc3dpdGNoIC0tcGFkLWlkM3YyLXNpemUgIm4iOiBhZGRzIElEM3YyIHRhZyB3aXRoIG4gcGFkZGluZyBieXRlcy48L2xpPgorICAgIDwvdWw+PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorPC91bD4KKworPGgzPkxBTUUgMy45OCAmbmJzcDsgJm5ic3A7SnVseSA0IDIwMDg8L2gzPgorPHVsPgorICA8bGk+QW50b24gU2VyZ3Vub3Y6CisgICAgPHVsPgorICAgICAgPGxpPkZyb250ZW5kIERpcmVjdFNob3c6IGVuYWJsaW5nIExBTUUgZHNob3cgZmlsdGVyIHRvIGNvbm5lY3QgdG8gIkZpbGUgV3JpdGVyIEZpbHRlciIuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT5Sb2cmZWFjdXRlO3JpbyBCcml0bzoKKyAgICA8dWw+CisgICAgICA8bGk+VXBkYXRlcyB0byB0aGUgRGViaWFuIFBhY2thZ2luZzwvbGk+CisgICAgICA8bGk+Rml4ZXMgdG8gdGhlIGFieCB0b29sIGZvciBVbml4IHN5c3RlbXMgKHNvIHRoYXQgbW9yZSBwZW9wbGUKKyAgICAgIGNhbiBldmFsdWF0ZSBMQU1FJ3MgY29tcHJlc3Npb24gYWdhaW5zdCB0aGUgb3JpZ2luYWwgZmlsZXMpPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICA8bGk+QWxleGFuZGVyIExlaWRpbmdlcjoKKyAgICA8dWw+CisgICAgICA8bGk+ZXhwbGljaXRlbHkgbGluayB0aGUgbWF0aCBsaWIgdG8gdGhlIGxhbWUgbGliPC9saT4KKyAgICAgIDxsaT5hZGQgc3dpdGNoIHRvIGRpc2FibGUgdGhlIHVzZSBvZiB0aGUgY29tcGFxIG9wdGltaXplZCBtYXRoIGxpYjwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKzwvdWw+CisKKzxoMz5MQU1FIDMuOTggYmV0YSA4Jm5ic3A7ICZuYnNwO0FwcmlsIDEzIDIwMDg8L2gzPgorPHVsPgorICA8bGk+Um9iZXJ0IEhlZ2VtYW5uOgorICAgIDx1bD4KKyAgICAgIDxsaT5MQU1FIG5vdyBhY2NlcHRzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gdGhlIHJhbmdlIFswLC4uLiwxMFsgYXMgVkJSIHF1YWxpdHkgc2V0dGluZywgbGlrZSA8Yj4tVjUuNjc4PC9iPgorICAgICAgPC9saT4KKyAgICAgIDxsaT5Gb3VuZCBhbmQgZml4ZWQgc29tZSBzdXNwaWNpb3VzIGNvZGUgaW4gYWRkaXRpdmUgbWFza2luZyBjYWxjdWxhdGlvbiBmb3IgVkJSLU5FVworICAgICAgPC9saT4KKyAgICAgIDxsaT5idWctZml4Ojxmb250IGNvbG9yPSIjZmYwMDAwIj5leHBlcmltZW50YWwgY29kZSB3YXMgZGVmYXVsdGVkIGJ5IGFjY2lkZW50IGZvciBWQlItTkVXPC9mb250PgorICAgICAgPC9saT4KKyAgICAgIDxsaT5maXggZm9yIHNvbWUgZW5kaWFuZXNzIHByb2JsZW0gb24gYmlnLWVuZGlhbiBtYWNoaW5lcworICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorPC91bD4KKworPGgzPkxBTUUgMy45OCBiZXRhIDcmbmJzcDsgJm5ic3A7QXByaWwgNiAyMDA4PC9oMz4KKworPHVsPgorICA8bGk+Um9iZXJ0IEhlZ2VtYW5uOgorICAgIDx1bD4KKyAgICAgIDxsaT5saWJtcDNsYW1lIEFQSTogYWxsb3cgZnJvbnRlbmRzIHRvIHNlcGFyYXRlbHkgcmV0cmlldmUgTEFNRS9YaW5nIGFuZCBJRDMgZGF0YSwgYmVjYXVzZSB0aGUgb2xkIGxpYnJhcnkgYXV0b21hdGlzbSAKKyAgICAgICAgICBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIG1ha2UgZnVsbHkgYnVmZmVyZWQgZW5jb2Rlcy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+bGlibXAzbGFtZSBBUEk6IGFkZGVkIHNvbWUgZXhwZXJpbWVudGFsIHVuaWNvZGUgSUQzIHRhZ2dpbmcgY29kZS4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZnJvbnRlbmRzOiB3cml0ZSBpdHNlbGYgZmluYWwgSUQzIHRhZ3MgYW5kIExBTUUvWGluZyBoZWFkZXIgZnJhbWUKKyAgICAgIDwvbGk+CisgICAgICA8bGk+bGFtZV9lbmMuZGxsOiB3cml0ZXMgaXRzZWxmIGZpbmFsIExBTUUvWGluZyBoZWFkZXIgZnJhbWUKKyAgICAgIDwvbGk+CisgICAgICA8bGk+TGF0ZXN0IGNoYW5nZXMgdG8gdGhlIG5ldyBWQlIgcHN5bW9kZWw6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+dXNlcyBhIGRpZmZlcmVudCBzcHJlYWRpbmcgZnVuY3Rpb24KKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+YnVnLWZpeCBmb3Igb3V0LW9mLWJvdW5kcyBhcnJheSBhY2Nlc3MgKHByb2dyYW0gc3RhY2sgY29ycnVwdGlvbiBwb3NzaWJsZSk8L2ZvbnQ+CisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKzwvdWw+CisKKzxoMz5MQU1FIDMuOTggYmV0YSA2Jm5ic3A7ICZuYnNwO0RlY2VtYmVyIDE2IDIwMDc8L2gzPgorCis8dWw+CisgIDxsaT5Sb2JlcnQgSGVnZW1hbm46CisgICAgPHVsPgorICAgIAorICAgICAgPGxpPkZlYXR1cmUgcmVxdWVzdCA8aT5bIDE4MTE0ODMgXSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFIHN1cHBvcnQgKFBDTSk8L2k+CisgICAgICA8L2xpPgorICAgICAgCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPkZpeCBmb3Igc29tZSByYXJlIHNjYWxlZmFjdG9yIHNlbGVjdGlvbiBpc3N1ZSB0aGUgbmV3ZXIgdmJyIGNvZGUgaGFkIGF0IGxvdyBjb21wcmVzc2lvbiBsZXZlbHMKKyAgICAgIDwvZm9udD48L2xpPgorICAgICAgCisgICAgICA8bGk+Rml4IGZvciBCdWd0cmFja2VyIGl0ZW08aT5bIDE4MTM0OTYgXSBBSUZGIHBhcnNpbmcgYnVnPC9pPgorICAgICAgPC9saT4KKyAgICAgIAorICAgICAgPGxpPkxhdGVzdCBjaGFuZ2VzIHRvIHRoZSBuZXcgVkJSIGNvZGU6CisgICAgICA8dWw+CisgICAgICAKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+aXQgbm93IGhhcyBpdHMgb3duIHBzeSBtb2RlbCwgYSBkZXJpdmF0aW9uIGZyb20gTlNQU1kuPC9mb250PgorICAgICAgPC9saT4KKyAgICAgIAorICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5zb21lIG1vcmUgdHVuaW5nIGhhcyBiZWVuIGRvbmUgZm9yIHRoaXMgbmV3IHBzeSBtb2RlbC48L2ZvbnQ+CisgICAgICAgIE1hbnkgdGhhbmtzIHRvIEhvcnN0IEFsYnJlY2h0IGFuZCBNeWxlcyBUaGFpc3MuCisgICAgICA8L2xpPgorICAgICAgCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPnRoZSAib3V0LW9mLWJpdHMiIHN0cmF0ZWd5IGlzIHJld29ya2VkPC9mb250PgorICAgICAgPC9saT4KKyAgICAgIAorICAgICAgPC91bD4KKyAgICAgIAorICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5JdCB3YXMgcG9zc2libGUsIHRoYXQgdGhlICJpbnRlcmNoYW5uZWwgbWFza2luZyBlZmZlY3RzIGZlYXR1cmUiCisgICAgICAgIHdhcyB1c2VkIGJ5IHRoZSBkdWFsLWNoYW5uZWwtbW9kZSBmb3IgYmktbGluZ3VhbCBlbmNvZGluZ3MgdG9vLiBJdCB3YXMgbWVhbnQgdG8gd29yaworICAgICAgICBvbiBzdGVyZW8gTC9SIGNoYW5uZWxzIG9ubHkuPC9mb250PgorICAgICAgPC9saT4KKyAgICAgIAorICAgIDwvdWw+CisgIDwvbGk+Cis8L3VsPgorCis8aDM+TEFNRSAzLjk4IGJldGEgNSZuYnNwOyAmbmJzcDtBdWd1c3QgMTIgMjAwNzwvaDM+CisKKzx1bD4KKworICA8bGk+Sm9uYXRoYW4gU3RvdHQ6CisgIAorICAgIDx1bD4KKworICAgICAgPGxpPkJ1ZyB0cmFja2VyIGl0ZW1zOiA8aT5bIDE1OTA2OTMgXSBJRDN2MiB0YWcgbm90IHdyaXRpbmcsIFsgMTYzNjI2NyBdIElEM3YyIHRhZ3Mgb3ZlcndyaXR0ZW48L2k+PGJyPgorICAgICAgSWYgdGhlIG91dHB1dCBmaWxlIGlzIG9wZW5lZCAnd3JpdGUtb25seScsIHRoZW4gTEFNRSBjYW4ndCB1cGRhdGUgdGhlIExBTUUgdGFnLgorICAgICAgSW4gdGhpcyBjYXNlIExBTUUgc2lsZW50bHkgb3Zlcndyb3RlIHRoZSBmaXJzdCBieXRlcyBvZiB0aGUgZmlsZSBhbmQgYW4KKyAgICAgIG9wdGlvbmFsIElEM3YyIHRhZyBkaXNhcHBlYXJlZC4gTm93IGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIGFuZAorICAgICAgbm8gZGF0YSBpcyB3cml0dGVuIGluIHRoaXMgY2FzZS4gICAgICAgCisgICAgICA8L2xpPgorICAgICAgCisgICAgPC91bD4KKworICA8L2xpPgorICAKKyAgPGxpPlJvYmVydCBIZWdlbWFubjoKKyAgICA8dWw+CisgICAgCisgICAgICAgIDxsaT5GaXggZm9yIEJ1Z3RyYWNrZXIgaXRlbSA8aT5bIDE3MTk1OTMgXSBUcmFjayBudW1iZXJzID4gMjU1IG5vdCBhbGxvd2VkIGV2ZW4gd2l0aCAtLWlkM3YyLW9ubHk8L2k+CisgICAgICAgIAorICAgICAgICA8bGk+Rml4IGZvciBCdWd0cmFja2VyIGl0ZW0gPGk+WyAxNzQyNjIzIF0gZmFpbChsYW1lIC0tbXAzaW5wdXQgLW0gbSAtYiAxMjggLS1yZXNhbXBsZSA4ICoubXAzICoqLm1wMyk8L2k+PGJyPgorICAgICAgICBUaGUgcHJvYmxlbSBoZXJlIHdhcywgdGhlIGlucHV0IGZpbGVzIGFyZSBNUEVHLTEgTGF5ZXIyIGZpbGVzIG5hbWVkIGFzIE1QM3MuIEV2ZW4gaWYgeW91IGxlYXZlIG91dAorICAgICAgICB0aGUgLS1tcDNpbnB1dCBzd2l0Y2ggTEFNRSB0cmllZCB0byBkZWNvZGUgdGhlIGlucHV0IGZpbGVzIGFzIExheWVyMyBmaWxlcyBiZWNhdXNlIG9mIHRoZSBmaWxlIG5hbWUKKyAgICAgICAgZXh0ZW5zaW9uIGFuZCBiZWNhdXNlIGl0IGZvdW5kIHNvbWUgdmFsaWQgbG9va2luZyBMYXllcjMgc3luY2hyb25pemF0aW9uIGhlYWRlci4KKyAgICAgICAgVGhlIGZpeGVkIExBTUUgdmVyc2lvbiBkb2VzIG5vdCBhc3N1bWUgdGhlIGZpbGUgbmFtZSBleHRlbnNpb24gaXMgYWx3YXlzIGNvcnJlY3QgYW5kIHRyZWF0cyB0aGUgZmlsZXMKKyAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBmaXJzdCBmb3VuZCBNUEVHIHN5bmMgd29yZC4gVGhlIGZpbGVzIGluIHF1ZXN0aW9uIGFyZSBub3cgY29ycmVjdGx5IGRldGVjdGVkIGFzCisgICAgICAgIExheWVyMiBmaWxlcyBhbmQgdHJhbnNjb2RpbmcgZG9lcyBzdWNjZWVkLgorICAgICAgICA8L2xpPgorICAgICAgICAKKyAgICAgICAgPGxpPkZpeCBmb3IgQnVndHJhY2tlciBpdGVtIDxpPlsgMTQ0NTE3NSBdIElucHV0IGJlaW5nIHN0ZGluIGZhaWxzIGluIFdpbmRvd3Mgb24gV0FWIGZpbGVzPC9pPjxicj4KKyAgICAgICAgVGhlIHByb2JsZW0gaGVyZSB3YXMsIHNlZWtpbmcgb24gcGlwZXMgc2hvd3Mgc29tZSBkaWZmZXJlbnQgYmVoYXZpb3VyIGRlcGVuZGluZyBvbiBDLUxpYnJhcnkKKyAgICAgICAgaW1wbGVtZW50YXRpb25zLiBUaGUgd29ya2Fyb3VuZCB0cmllcyB0byBkZXRlY3QgaXQncyB3b3JraW5nIG9uIGEgcGlwZSBhbmQgZG9pbmcgc29tZQorICAgICAgICByZWFkaW5nIGluc3RlYWQgb2Ygc2Vla2luZyBpbiB0aGF0IGNhc2UuCisgICAgICAgIDwvbGk+CisgICAgICAgIAorICAgICAgICA8bGk+Rml4aW5nIHNvbWUgbWVtb3J5IGxlYWsgaW4gdGhlICdsYW1lX2VuYy5kbGwnLgorICAgICAgICA8L2xpPgorICAgICAgICAKKyAgICAgICAgPGxpPkZpeCBmb3IgQnVndHJhY2tlciBpdGVtcyA8aT5bIDExNjA3NTcsIDExNjA3NDEgXSAtLWxpdHRsZS1lbmRpYW4gLyAtLWJpZy1lbmRpYW4gbm90IHdvcmtpbmc8L2k+PGJyPgorICAgICAgICBUaGVzZSBzd2l0Y2hlcyB3aGVyZSBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBMaWJzbmRmaWxlIG9ubHkuCisgICAgICAgIDwvbGk+CisgICAgICAgIAorICAgICAgICA8bGk+Rml4IGZvciBCdWd0cmFja2VyIGl0ZW0gPGk+WyAxNzQ2MzM2IF0gSW5jb3JyZWN0IEJpdHJhdGUgd2l0aCBBQlIgdW5kIC0tcmVzYW1wbGUsIExBTUUgMy45OGI0PC9pPjxicj4KKyAgICAgICAgU29tZSBlYXJsaWVyIGJ1Zy1maXggaGFkIHNvbWUgdHlwby4gQXMgYSByZXN1bHQsIHdoZW4gYWRkaW5nIGEgJy0tcmVzYW1wbGUgMTIzJyBzd2l0Y2gsIAorICAgICAgICB0aGUgYXZlcmFnZSBiaXRyYXRlIHJpc2VkIHVwdG8gbWF4aW11bSBiaXRyYXRlLgorICAgICAgICA8L2xpPgorICAgICAgICAKKyAgICA8L3VsPgorICA8L2xpPgorICAKKzwvdWw+CisKKzxoMz5MQU1FIDMuOTggYmV0YSA0Jm5ic3A7ICZuYnNwO0p1bmUgMjMgMjAwNzwvaDM+CisKKzx1bD4KKworICA8bGk+RGVubmlzIExhbWJlIEpyOiBBZGRlZCBzdXBwb3J0IGZvciB0b3RhbCB0cmFjayBjb3VudCAoaWQzdjIpIGluIHRoZSBmcm9udGVuZAorICA8L2xpPgorICAKKyAgPGxpPk55YW9jaGk6CisgICAgPHVsPgorCisgICAgICA8bGk+QWJpbGl0eSB0byBzZXQgdXNlci1kZWZpbmVkIElEM3YyLjMgZnJhbWU8L2xpPgorICAgICAgCisgICAgICA8bGk+QWJpbGl0eSB0byBpbmNsdWRlIGFsYnVtQXJ0IGluIElEM3YyLjMgdGFnPC9saT4KKyAgICAgIAorICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+Um9iZXJ0IEhlZ2VtYW5uOgorICAgIDx1bD4KKworICAgICAgPGxpPkJ1Z2ZpeDogdGhlICJwbGF5IGxlbmd0aCBpbiBtcyIsIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgSUQzdjIgdGFnIFRMRU4sIHdhcyBub3QgY29ycmVjdGx5IGNvbXB1dGVkLgorICAgICAgICAgICAgICAgIFNvbWUgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIHBsYXllcnMgd2VyZSBjb25mdXNlZCBieSB0aGlzIGdhcmJhZ2UgZGF0YS48L2xpPgorICAgICAgCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPk91dCBvZiBiaXRzIHN0cmF0ZWd5IGZvciB0aGUgbmV3ZXIgVkJSIGNvZGUgb3ZlcmhhdWxlZDwvZm9udD48L2xpPiAKKyAgICAgIAorICAgICAgPGxpPkxBTUUgQVBJOiB0aGUgSUQzIHRhZyBmdW5jdGlvbnMgZG8gbm90IHN0b3JlIHRoZSBwb2ludGVycyBwYXNzZWQgYW55bW9yZSwKKyAgICAgIHRoZXkgZG8gbWFrZSBkZWVwIGNvcGllcyBvZiBzdHJpbmdzIHBhc3NlZCBhcyBwYXJhbWV0ZXJzLgorICAgICAgPC9saT4KKyAgICAgIAorICAgICAgPGxpPkNoYW5nZXMgaW4gTEFNRSBmcm9udGVuZCBzd2l0Y2hlcyByZWdhcmRpbmcgSUQzIHRhZ3M6CisgICAgICA8YnI+PHR0Pi0tdGcgIk15R2VucmUiPC90dD4gd2lsbCByb3V0ZSB1bmtub3duIElEM3YxIGdlbnJlcyB0byAiT3RoZXIiIGZvciBJRDN2MSB0YWdzCisgICAgICBhbmQgd2lsbCBiZSBzdG9yZWQgYXMgcGxhaW4gdGV4dCAiTXlHZW5yZSIgZm9yIElEM3YyIHRhZ3MuIEdlbnJlcyBnaXZlbiBieSBrbm93bgorICAgICAgSUQzdjEgbnVtYmVycyB3aWxsIGJlIHN0b3JlZCBhcyBpdHMgY29ycmVzcG9uZGluZyB0ZXh0IGluIElEM3YyIHRhZ3MuCisgICAgICA8YnI+PHR0Pi0tdG4gIjAyLzAyIjwvdHQ+IHdpbGwgc3RvcmUgdGhlIHRyYWNrIG51bWJlciBzcGVjaWZpZWQgYXMgcGxhaW4gdGV4dCBhcy1pcworICAgICAgZm9yIElEM3YyIHRhZ3MuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisKKyAgPC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjk4IGJldGEgMyZuYnNwOyAmbmJzcDtNYXkgMjIgMjAwNzwvaDM+CisKKzx1bD4KKworICA8bGk+Um9iZXJ0IEhlZ2VtYW5uOgorICAgIDx1bD4KKworICAgICAgPGxpPkZpeGVzIHJlZ2FyZGluZyBtYXggbnVtYmVyIG9mIGJpdHMgbGltaXRhdGlvbjwvbGk+CisgICAgICAKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKzwvdWw+CisKKzxicj4KKworPGgzPkxBTUUgMy45OCBiZXRhIDImbmJzcDsgJm5ic3A7TWF5IDIwIDIwMDc8L2gzPgorCis8dWw+CisKKyAgPGxpPlJvYmVydCBIZWdlbWFubjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT5CdWcgdHJhY2tlciBpdGVtOiA8aT5bIDE2OTM0NjEgXTs8L2k+CisgICAgICBGaXhlZCBtZW1vcnkgbGVha3MgaW4gQUNNIGNvZGVjPC9saT4KKyAgICAgIAorICAgICAgPGxpPkZpeGVkIGVuY29kaW5nIG9mIG5vbi1zdGFuZGFyZCBzYW1wbGluZyByYXRlcyBpbiBDQlI8L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPkltcHJvdmVkIFZCUiBzdHJhdGVneSB3aGVuIHJ1bm5pbmcgb3V0IG9mIGJpdHM8L2ZvbnQ+PC9saT4KKyAgICAgIAorICAgIDwvdWw+CisKKyAgPC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjk4IGJldGEgMSZuYnNwOyAmbmJzcDtNYXkgMTYgMjAwNzwvaDM+CisKKzx1bD4KKworICA8bGk+QWxleGFuZGVyIExlaWRpbmdlcjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT5BZGQgVExFTiAoSUQzdjIpIHN1cHBvcnQgKFN1Ym1pdHRlZCBieTogTGludXMgV2FsbGVpaikuPC9saT4KKworICAgICAgPGxpPkFkZCBudW1iZXIgb2YgdG90YWwgdHJhY2tzIHBlciBhbGJ1bSAoSUQzdjIpIHN1cHBvcnQKKyhTdWJtaXR0ZWQgYnk6IEt5bGUgVmFuZGVyQmVlaykuPC9saT4KKworICAgICAgPGxpPlNvbWUgc2VhdGJlbHRzIGZvciBvdmVyZmxvd2luZyBhcnJheXMgaW4gdGhlIElEM3YyCitzdXBwb3J0LjwvbGk+CisKKyAgICAgIDxsaT5VcGRhdGUgdGhlIFJQTSBzcGVjIChTdWJtaXR0ZWQgYnk6IEt5bGUgVmFuZGVyQmVlaykuPC9saT4KKworICAgICAgPGxpPkZpeCBzb21lIG1lbS1sZWFrcyBpbiB0aGUgZXJyb3IgY2FzZS48L2xpPgorCisgICAgICA8bGk+VXBkYXRlIHRvIG5ld2VyIGF1dG90b29scyB2ZXJzaW9ucy48L2xpPgorCisgICAgICA8bGk+VXBkYXRlIHRvIHVzZSBhIHJlY2VudCBsaWJzbmRmaWxlIChzdWJtaXR0ZWQgYnkKK2xpYnNuZGZpbGUgYXV0aG9yKS48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPkludHJpbnNpY3Mgc3VwcG9ydAorZW5hYmxlZCBmb3IgZ2NjPC9mb250PjwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKyAgPGxpPlJvYmVydCBIZWdlbWFubjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+VGhlIG5ld2VyIFZCUiBjb2RlIGlzIG5vdyBMQU1FJ3MgZGVmYXVsdAorICAgICAgIFZCUiByb3V0aW5lPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Rml4ZWQ6IGluIGNhc2Ugb2YKK25vdCBlbm91Z2ggYml0cyB0aGUgbmV3IHZiciBjb2RlIGluY29ycmVjdGx5IHVzZWQgb2xkIHZiciByb3V0aW5lPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+SW1wcm92ZWQgQVRICithZGp1c3RtZW50IGluIGxvdyB2b2x1bWUgY2FzZXM8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5GaXhlZCAoUFNZIG1vZGVsKTogbWFwcGluZyBmcm9tIGNvbnZvbHV0aW9uIGJhbmRzCisgICAgICB0byBwYXJ0aXRpb24gYmFuZHMgd2FzIGJyb2tlbiBzaW5jZSB3ZSByZXBsYWNlZCB0YWJsZXMgYnkgb3duIGNhbGN1bGF0aW9uCisgICAgICBzZXZlcmFsIHllYXJzIGFnbzwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPkZpeGVkIChQU1kgbW9kZWwpOiBsb3NzIG9mIGZyYWN0aW9uIGluIGVxdWFsIGxvdWRuZXNzIHdlaWdodGluZzwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPkZpeGVkIChQU1kgbW9kZWwpOiBpbiBOU1BTWSBoaWdocGFzcyBmaWx0ZXIsIG91dCBvZiBib3VuZHMgYWNjZXNzIGluIGZpcmNvZWY8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5Lbm93biBwcm9ibGVtIHNhbXBsZXMgZm9yIHRoZSBuZXcgVkJSIGNvZGU6CisgICAgICBtYW55IG9mIHRoZW0gYXJlIGF0IGFuIGFjY2VwdGFibGUgcXVhbGl0eSBsZXZlbCBub3c7PC9mb250PgorICAgICAgd2l0aCBhIGJpZyA8Yj4nVGhhbmsgWW91JzwvYj4gdG8gRnJhbmNpcyBOaWVjaGNpYWw8L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPk1vZGlmaWVkIFZCUiBzdHJhdGVneSB0byBoYW5kbGUgb3V0IG9mIGJpdHMgY2FzZXM8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPlJlc3RyaWN0ZWQgYml0cmVzZXJ2b2lyIHNpemUgZm9yIDMyMCBrYnBzIGZyYW1lcyB0bworICAgICAgdGhlIHNpemUgdXNlZCBmb3Igc2lkZWluZm8sIGJlY2F1c2Ugb2YgZGVjb2RpbmcgcHJvYmxlbXMKKyAgICAgIHdpdGggRmhHIGRlY29kZXJzIGluc3RhbGxlZCBvbiBhbG1vc3QgZXZlcnkgV2luZG93cyBzeXN0ZW08L2xpPgorCisgICAgICA8bGk+TEFNRSBhYm9ydHMgb24gdW5zdXBwb3J0ZWQgaW5wdXQgZmlsZXMKKyAgICAgIG9yIHVucmVjb2duaXplZCBwYXJhbWV0ZXIgb3B0aW9ucyBwYXNzZWQgbW9yZSBvZnRlbiBub3cgPC9saT4KKworICAgICAgPGxpPkJ1ZyB0cmFja2VyIGl0ZW06IDxpPlsgMTU5NjMwNiBdICJmYXRhbCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24iOzwvaT4KKyAgICAgIGFuIGludmFsaWQgTVBFRyBzYW1wbGVyYXRlIHdhcyByZXR1cm5lZCBieSBvcHRpbXVtX3NhbXBsZWZyZXEgZnVuY3Rpb248L2xpPgorCisgICAgICA8bGk+QnVnIHRyYWNrZXIgaXRlbTogPGk+WyAxNTg1OTQyIF0gbGFtZSBub3QgLS1zaWxlbnQgd2hlbiBURVJNIG5vdCBzZXQ7PC9pPgorICAgICAgaW4gY2FzZSBMQU1FIHdhcyBidWlsZCB3aXRoIFRFUk1DQVAgZGVmaW5lZCBhbmQgbm8gVEVSTQorICAgICAgZW52aXJvbm1lbnQgaXMgZGVmaW5lZCwgbm93IHdlIGRvIG5vdCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIGFuZAorICAgICAgc2lsZW50bHkgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGFzIGlmIExBTUUgd2FzCisgICAgICBjb21waWxlZCB3aXRob3V0IFRFUk1DQVAgZGVmaW5lZC48L2xpPgorCisgICAgICA8bGk+QnVnIHRyYWNrZXIgaXRlbTogPGk+WyAxNzExOTgwIF0gTEFNRSB3cml0ZXMgaW52YWxpZCBYaW5nIGhlYWRlciB3aGVuIElEMyB0YWdzIGV4aXN0OzwvaT4KKyAgICAgIExBTUUgd2FzIHNvbWV0aW1lcyB3cml0aW5nIGFuIGludmFsaWQgWGluZy9JbmZvIGhlYWRlcjwvbGk+CisKKyAgICAgIDxsaT5GZWF0dXJlIHJlcXVlc3Q6IDxpPlsgMTU4ODI4MyBdIEZsdXNoaW5nIG91dHB1dCBzdHJlYW0gaW4gbGFtZS5leGU7PC9pPgorICAgICAgICAgICdmbHVzaCcgb3B0aW9uIGFkZGVkPC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjMzM2NmZmIj5BZGRlZCBGRlRTU0UgYW5kIEZGVDNETk9XIGFzc2VtYmxlciBjb2RlIGZyb20KKyAgICAgICAgICBMYW1lNCBicmFuY2g8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPkNoYW5nZXMgaW4gbGFtZSBmcm9udGVuZCBzd2l0Y2hlczoKKyAgICAgICAtayByZW1vdmVkLCBhZGQgbG93cGFzcyBhbmQgaGlnaHBhc3Mgc3dpdGNoZXMgaWYgeW91IG5lZWQgdG8gY2hhbmdlCisgICAgICAgdGhlbTsgLS1zaG9ydC9ub3Nob3J0L2FsbHNob3J0IC0gZGVncmFkZWQgaW50byBERVZFTE9QRVIgT05MWSBzd2l0Y2hlcworICAgICAgICAgIG5vcm1hbCB1c2VycyBzaG91bGRuJ3QgdXNlIHRoZW07IC1YIC1aIGRlZ3JhZGVkIHRvCisgICAgICAgICAgREVWRUxPUEVSIE9OTFkgc3dpdGNoZXMsIC1YIGlzIHRvbyB0b3VnaCB0byBjb21tdW5pY2F0ZSB0bworICAgICAgICAgIGVuZCB1c2VycyBhbmQgLVogaXNuJ3QgdXNlZCBhY3R1YWx5PC9saT4KKworICAgICAgPGxpPkZpeGVkIHNvbWUgY29uc29sZSBwcmludGluZyBwcm9ibGVtczwvbGk+CisKKyAgICAgIDxsaT5XaW5kb3dzOiBBQ00gY29kZSBub3cgdXNlcyBMQU1FIGxpYnJhcnkgQVBJIG9ubHksIGFsbAorICAgICAgcmVmZXJlbmNlcyB0byBwcml2YXRlIGluY2x1ZGUgZmlsZXMgYXJlIHJlbW92ZWQ8L2xpPgorCisgICAgICA8bGk+V2luZG93czogRGlyZWN0U2hvdyBjb2RlIG5vdyB1c2VzIExBTUUgbGlicmFyeSBBUEkgb25seSwgYWxsCisgICAgICByZWZlcmVuY2VzIHRvIHByaXZhdGUgaW5jbHVkZSBmaWxlcyBhcmUgcmVtb3ZlZDwvbGk+CisKKyAgICAgIDxsaT5XaW5kb3dzOiBkaXNhYmxlZCBjb2RlIHRoYXQgcmVzZXRzIHByb2Nlc3NvciBhZmZpbml0eSwKKyAgICAgIGJlY2F1c2UgdGhpcyBkb2Vzbid0IGJlbG9uZyB0byBMQU1FLCBidXQgc2VlbXMgdG8gd29yayBhcm91bmQKKyAgICAgIHNvbWUgcHJvYmxlbXMgdGhlIHBhcmVudCBwcm9jZXNzIGhhcyAoaW4gbW9zdCBjYXNlcyBFQUMpPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+Sm9objMzOgorICAgIDx1bD4KKworICAgICAgPGxpPkZpeGVkIG1wMiBhbmQgbXAzIGRlY29kaW5nOiBGb3IgbXAzIGFuZCBtcDIgZGVjb2RpbmcsCit0aGlzIG5vdyB5aWVsZHMgdGhlIHNhbWUgb3V0cHV0IGFzIGZvb2JhcjIwMDAgYnV0IHRoZSBlcnJvciBjaGVja2luZworcmVtYWlucyB1bmNoYW5nZWQ8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5HYWJyaWVsIEJvdXZpZ25lOgorICAgIDx1bD4KKworICAgICAgPGxpPlZDOCBwcm9qZWN0IGZpbGVzPC9saT4KKworICAgICAgPGxpPkFkZGVkIHN1cHBvcnQgZm9yIHg2NCB1bmRlciBWQzg8L2xpPgorCisgICAgICA8bGk+UmVzdHJpY3RlZCBNUEVHIDIuNSB0byA2NGticHMgZnJhbWVzPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+VGFrZWhpcm8gVG9taW5hZ2E6CisgICAgPHVsPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPlNTRSB2ZXJzaW9uIG9mIEZGVDwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCis8L3VsPgorCis8YnI+CisKKzxoMz5MQU1FIDMuOTcmbmJzcDsgJm5ic3A7U2VwdGVtYmVyIDI0IDIwMDY8L2gzPgorCis8dWw+CisKKyAgPGxpPjMuOTcgYmV0YSAzIGJlY29tZXMgMy45NyA8L2xpPgorCis8L3VsPgorCis8YnI+CisKKzxoMz5MQU1FIDMuOTcgYmV0YSAzJm5ic3A7ICZuYnNwO0F1Z3VzdCAxOSAyMDA2PC9oMz4KKworPHVsPgorCisgIDxsaT5HYWJyaWVsIEJvdXZpZ25lOgorICAgIDx1bD4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5Xb3JrYXJvdW5kIGFnYWluc3QgYQorc2hvcnQgYmxvY2tzIGRldGVjdGlvbiBpc3N1ZTwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCis8L3VsPgorCis8YnI+CisKKzxoMz5MQU1FIDMuOTcgYmV0YSAyJm5ic3A7ICZuYnNwO05vdmVtYmVyIDI2IDIwMDU8L2gzPgorCis8dWw+CisKKyAgPGxpPkdhYnJpZWwgQm91dmlnbmU6CisgICAgPHVsPgorCisgICAgICA8bGk+Rml4ZWQgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3Igd2hlbiBpbnB1dCBpcyBub3QgdXNpbmcgYQorc3RhbmRhcmQgc2FtcGxpbmcgZnJlcXVlbmN5PC9saT4KKworICAgICAgPGxpPkZpeGVkIGEgcG9zc2libGUgYXNzZXJ0aW9uIGZhaWx1cmUgaW4gdmVyeSBsb3cgYml0cmF0ZQorZW5jb2Rpbmc8L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPlNsaWdodCBjaGFuZ2UKK3JlZ2FyZGluZyBBVEggYWRqdXN0bWVudCB3aXRoIFY1PC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+UmVpbnN0YXRlZCBiaXQKK3Jlc2Vydm9pciBmb3IgMzIwa2JwcyBDQlI8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjMzM2NmZmIj5SZXBsYXlHYWluIGFuYWx5c2lzCitzaG91bGQgbm93IGJlIGZhc3RlciB3aGVuIGVuY291bnRlcmluZyBzaWxlbnQgcGFydHM8L2ZvbnQ+PC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+VGFrZWhpcm8gVG9taW5hZ2E6CisgICAgPHVsPgorCisgICAgICA8bGk+Rml4ZWQgYSBwb3NzaWJsZSBsaW5rIHByb2JsZW0gb2YgYXNzZW1ibHkgY29kZTwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKzwvdWw+CisKKzxicj4KKworPGgzPkxBTUUgMy45NyBiZXRhIDEmbmJzcDsgJm5ic3A7U2VwdGVtYmVyIDEyIDIwMDU8L2gzPgorCis8dWw+CisKKyAgPGxpPlRha2VoaXJvIFRvbWluYWdhOgorICAgIDx1bD4KKworICAgICAgPGxpPkZpeGVkIGFuIG91dCBvZiBhcnJheSBhY2Nlc3MgaW4gbXAzcnRwIDwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Rml4ZWQgYSBxdWFsaXR5CitzZXR0aW5nIGluIERMTDwvZm9udD48L2xpPgorCisgICAgICA8bGk+Rml4ZWQgZGlzcGxheSB3aGVuIHVzaW5nIC0tc2lsZW50PC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+Vml0YWx5IEl2YW5vdjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT5VcGRhdGVkIERpcmVjdFNob3cgaW50ZXJmYWNlPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+Um9iZXJ0IEhlZ2VtYW5uOgorICAgIDx1bD4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5GaXhlZCBhbiBvdXQgb2YKK2FycmF5IGFjY2VzczwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPkZpeGVkIHNvbWUgc21hbGwKK3JvdW5kaW5nIHByb2JsZW0gaW4gdmJyLW5ldyBxdWFudGl6YXRpb24gcm91dGluZXM8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5GaXhlZCBhIGJ1ZyBpbgordmJyLW5ldyByZWdhcmRpbmcgaGlnaCBmcmVxdWVuY2llcyAoc2ZiMjEpIHdoZW4gdXNpbmcgLVk8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5GaXhlZCBhIGZldyBidWdzIGluCit2YnItbmV3IHdoZW4gdXNpbmcgLVk8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5VcGRhdGVkIHNjYWxlZmFjdG9ycworYWxsb2NhdGlvbiBzY2hlbWUgaW4gdmJyLW5ldzwvZm9udD48L2xpPgorCisgICAgICA8bGk+Rml4ZWQgbWluZ3czMiBjb25maWd1cmUgcHJvYmxlbXM8L2xpPgorCisgICAgICA8bGk+UmVzb2x2ZWQgc29tZSBjb21waWxlciB3YXJuaW5nczwvbGk+CisKKyAgICAgIDxsaT5VcGRhdGVkIGNvbW1hbmQtbGluZSB2aXN1YWxpc2F0aW9uPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+R2FicmllbCBCb3V2aWduZToKKyAgICA8dWw+CisKKyAgICAgIDxsaT5DaGFuZ2VkIHNvbWUgRkxPQVQ4IHRvIEZMT0FUPC9saT4KKworICAgICAgPGxpPkFkZGVkIHByb2plY3QgZmlsZXMgZm9yIFZDNzwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+UmV3b3JrZWQgLXExIGFuZCAtcTA8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5VcGRhdGVkIHByZXNldHM8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5GaXhlZCBhbiBlcnJvciBpbgorSVNPIHF1YW50aXphdGlvbiBvbiBzeXN0ZW1zIG5vdCB1c2luZyB0aGUgSUVFRTc1NCBoYWNrPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+RmFzdGVyIHF1YW50aXphdGlvbjwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPlNTRSB2ZXJzaW9uIG9mCitpbml0X3hycG93PC9mb250PjwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKyAgPGxpPlJvZyZlYWN1dGU7cmlvIEJyaXRvOgorICAgIDx1bD4KKworICAgICAgPGxpPlVwZGF0ZWQgRGViaWFuIHBhY2thZ2luZzwvbGk+CisKKyAgICAgIDxsaT5Eb2N1bWVudGF0aW9uIHdvcms8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5DaHJpcyBNaWxsZXI6CisgICAgPHVsPgorCisgICAgICA8bGk+U3VwcG9ydCBmb3IgeDY0IHBsYXRmb3JtIFNESyBpbiBtYWtlZmlsZS5tc3ZjPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjk2LjEgJm5ic3A7ICZuYnNwO0p1bHkgMjUgMjAwNDwvaDM+CisKKzx1bD4KKworICA8bGk+Um9iZXJ0IEhlZ2VtYW5uOgorICAgIDx1bD4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5GaXhlZCBhIHJhcmUgYnVnIGluCit2YnItbmV3IChjb3VsZCBsZWFkIHRvIGNyYXNoZXMgb3IgZGF0YSBjb3JydXB0aW9uKTwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5HYWJyaWVsIEJvdXZpZ25lOgorICAgIDx1bD4KKworICAgICAgPGxpPnNvbWUgZml4ZXMgaW4gQUNNIGNvZGVjPC9saT4KKworICAgICAgPGxpPmZpeGVkIHBhZGRpbmcgd2hlbiBlbmNvZGluZyB0byAzMjBrYnBzPC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5maXhlZCBibG9jayBzaXplCitzZWxlY3Rpb24gZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsczwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCis8L3VsPgorCis8YnI+CisKKzxoMz5MQU1FIDMuOTYgJm5ic3A7ICZuYnNwO0FwcmlsIDExIDIwMDQ8L2gzPgorCis8dWw+CisKKyAgPGxpPkdhYnJpZWwgQm91dmlnbmU6CisgICAgPHVsPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPm5ldyBxdWFudGl6YXRpb24KK3NlbGVjdGlvbiBtb2RlICh1c2VkIGluIEFCUi9DQlIpPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+c2V0IHNmc2NhbGUgZm9yCitBQlIvQ0JSIHVwIHRvIDE2MGticHM8L2ZvbnQ+PC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjk2IGJldGEgMiAmbmJzcDsgJm5ic3A7TWFyY2ggMjggMjAwNDwvaDM+CisKKzx1bD4KKworICA8bGk+VGFrZWhpcm8gVG9taW5hZ2E6CisgICAgPHVsPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPnJlbW92ZWQgdW5uZWNlc3NhcnkKK2ludGVnZXIgY29udmVydGlvbiBpbiByZXNhbXBsaW5nPC9mb250PjwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKyAgPGxpPlJvYmVydCBIZWdlbWFubjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+cmV3b3JrZWQgc2NhbGVmYWN0b3IKK2FsbG9jYXRpb24gaW4gdmJyLW5ldzwvZm9udD48L2xpPgorCisgICAgICA8bGk+Zml4ZWQgYSBmcmVlZm9ybWF0IGRlY29kaW5nIHByb2JsZW08L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5HYWJyaWVsIEJvdXZpZ25lOgorICAgIDx1bD4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj51cGRhdGVkIG1pbmltYWwKK2JpdHJhdGUgZm9yIFYxIGFuZCBWMjwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5BbGVrc2FuZGVyIEtvcnp5bnNraToKKyAgICA8dWw+CisKKyAgICAgIDxsaT5hZGRlZCBhYmlsaXR5IHRvIGRpc2FibGUgUmVwbGF5R2FpbiBhbmFseXNpczwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKzwvdWw+CisKKzxicj4KKworPGgzPkxBTUUgMy45NiBiZXRhICZuYnNwOyAmbmJzcDtNYXJjaCA3IDIwMDQ8L2gzPgorCis8dWw+CisKKyAgPGxpPlRha2VoaXJvIFRvbWluYWdhOgorICAgIDx1bD4KKworICAgICAgPGxpPmZpeGVkIGRlY29kaW5nIGlzc3VlPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+QWxla3NhbmRlciBLb3J6eW5za2k6CisgICAgPHVsPgorCisgICAgICA8bGk+Y2hhbmdlZCBpbnRlcm5hbCBSZXBsYXlHYWluIGhhbmRsaW5nPC9saT4KKworICAgICAgPGxpPmZpeGVkIHNvbWUgaXNzdWVzIHdoZW4gUmVwbGF5R2FpbiBpcyB1c2VkIHdpdGgKK3Jlc2FtcGxpbmc8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5Sb2JlcnQgSGVnZW1hbm46CisgICAgPHVsPgorCisgICAgICA8bGk+YWRkZWQgc3RhbmRhcmQgSVNPIHF1YW50aXphdGlvbiBmb3IgdmJyLW5ldywgdXNlZCBhdAorbG93ZXIgcXVhbGl0eSBzZXR0aW5nczwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+ZmFzdGVyIGNvdW50X2JpdHMKK2ZvciB2YnItbmV3PC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+ZmFzdGVyCitmaW5kX3NjYWxlZmFjX2F2ZSBmdW5jdGlvbiBmb3IgdmJyLW5ldzwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPmZpeGVkIGFuIG91dCBvZgorYXJyYXkgYWNjZXNzIGluIHBzeWNob2Fjb3VzdGljIG1vZGVsczsgdGhpcyBidWcgY291bGQgbWFrZSBzb21lIHBzeQorY2FsY3VsYXRpb25zIHdvcnRobGVzcyBhbmQgc29tZXRpbWVzIGxldCBsYW1lIGNyYXNoPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Zml4ZWQgYW4gZXJyb3Igb24KK3NpbGVudCBzY2FsZWZhY3RvciBiYW5kczsgdGhpcyBidWcgcmVzdWx0ZWQgaW4gaHVmZm1hbiBkYXRhIG92ZXJydW4KK3Byb2JsZW1zIHdoaWxlIGRlY29kaW5nLCByZXN1bHRpbmcgaW4gYXVkaWJsZSBnbGl0Y2hlczwvZm9udD48L2xpPgorCisgICAgICA8bGk+Zml4ZWQgYSBmcmVlZm9ybWF0IGRlY29kaW5nIGJ1ZzwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKyAgPGxpPkdhYnJpZWwgQm91dmlnbmU6CisgICAgPHVsPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPmFkanVzdGVkIHNob3J0IGJsb2NrCit0aHJlc2hvbGRzPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT5maXhlZCBzb21lIGFycmF5IGFkZHJlc3NpbmcgYnVnczwvbGk+CisKKyAgICAgIDxsaT5tYWRlIFJlcGxheUdhaW4gYW5hbHlzaXMgcmVlbnRyYW50PC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+RGF2aWQgQ2hhbmRsZXI6IGZpeGVkIGEgY3Jhc2ggaW4gcXVhbnRpemVfeHJwb3cgPC9saT4KKworICA8bGk+TWljaGFsIEJhY2lrOiBmaXhlZCBhIGNyYXNoIHdoZW4gdXNpbmcgOGtIeiA8L2xpPgorCisgIDxsaT5Hb3JhbiBNYXJrb3ZpYzogZml4ZWQgc29tZSBkZWNvZGluZyBidWdzIDwvbGk+CisKKyAgPGxpPkpvaG4gRWR3YXJkczogZml4ZWQgYSB0b28gc21hbGwgYnVmZmVyIGluIFJlcGxheUdhaW4gY29kZTwvbGk+CisKKzwvdWw+CisKKzxicj4KKworPGgzPkxBTUUgMy45NS4xICZuYnNwOyAmbmJzcDtKYW51YXJ5IDEyIDIwMDQ8L2gzPgorCis8dWw+CisKKyAgPGxpPkdhYnJpZWwgQm91dmlnbmU6CisgICAgPHVsPgorCisgICAgICA8bGk+Zml4ZWQgYSBjcmFzaCB3aGVuIHVzaW5nIHZici1uZXc8L2xpPgorCisgICAgICA8bGk+Y2hhbmdlZCBSZXBsYXlHYWluIHJlZmVyZW5jZSBsZXZlbCB0byA4OWRCPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjk1ICZuYnNwOyAmbmJzcDtKYW51YXJ5IDExIDIwMDQ8L2gzPgorCis8dWw+CisKKyAgPGxpPkdhYnJpZWwgQm91dmlnbmU6CisgICAgPHVsPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPmZpeGVkIGxvd3Bhc3MgdmFsdWVzCit3aGVuIHVzaW5nIHZiciB3aXRoIG1vbm8gZmlsZXM8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjMzM2NmZmIj5mYXN0ZXIgcXVhbnRpemF0aW9uCitsb29wczwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPmZhc3RlciBjb3VudF9iaXRzPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT5maXhlZCBhIGJ1ZmZlciByZXF1aXJlbWVudCBlcnJvciBpbiBBQ00gY29kZWM8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5UYWtlaGlybyBUT01JTkFHQToKKyAgICA8dWw+CisKKyAgICAgIDxsaT5maXhlZCBtcGdsaWIgYW5kIG90aGVyIGRlY29kaW5nIHN1cHBvcnQgY29kZSB0byBwcmV2ZW50Cit0aGUgY3Jhc2ggd2hlbiBpbnZhbGlkIG1wMyBpbnB1dDwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKyAgPGxpPnJlbW92ZWQgTGF5ZXIgSSBkZWNvZGluZyBzdXBwb3J0PC9saT4KKworICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPnVzZSBGYXN0TG9nIGFuZCBJRUVFIDc1NAoraGFjayBvbiBQb3dlclBDIHRvbyAoYXBwcm94LiAxMCBwZXJjZW50IGZhc3Rlcik8L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjk0IGJldGEgRGVjZW1iZXIgMTUgMjAwMzwvaDM+CisKKzx1bD4KKworICA8bGk+VGFrZWhpcm8gVG9taW5hZ2E6CisgICAgPHVsPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPmZpeGVkIGJsb2NrCitzd2l0Y2hpbmcgb2YgbnNwc3l0dW5lPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+YmVzdCBodWZmbWFuIGRpdmlkZQoraW4gdGhlIGlubmVyIGxvb3AuPC9mb250PiBUaGlzIHNob3VsZCBpbXByb3ZlIHRoZSBxdWFsaXR5LCBidXQKK1BBSU5GVUxMWSBzbG93LiBTbyBpdCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LiBVc2UgLXEwIHRvIHVzZSBpdC48L2xpPgorCisgICAgICA8bGk+Q2hhbmdlZCAtcSBvcHRpb24gbWFwcGluZy4gIi1xMiIgdW50aWwgdmVyc2lvbiAzLjkzIGlzCitub3cgIi1xMyIuPC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5zYXZpbmcgYml0cyBieQorYmV0dGVyIHNjYWxlZmFjdG9yIHN0b3Jpbmc8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPnJlbW92ZWQgVm9yYmlzIHN1cHBvcnQ8L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPnN1YnN0ZXAgcXVhbnRpemF0aW9uLjwvZm9udD5UaGlzCitzaG91bGQgaGVscCBicmVha2luZyB0aGUgU0ZCMjEgYmxvYXRpbmcgcHJvYmxlbTwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+bWFkZSBwc3ljaG9hY291c3RpYworbW9kZWwgYXdhcmUgb2YgQVRIIGFkanVzdGVtZW50czwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPnVzZSBBVEggdmFsdWUgYXMKK3Nob3J0IGJsb2NrIG1hc2tpbmcgbG93ZXIgbGltaXQ8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5zZXZlcmFsIGZpeGVzIGluCitwc3ljaG9hY291c3RpYyBtb2RlbDwvZm9udD48L2xpPgorCisgICAgICA8bGk+bW9yZSByb2J1c3QgZGVjb2Rpbmc8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5NYXJrIFRheWxvciAvIEdhYnJpZWwgQm91dmlnbmU6IGZpeGVkIGlzc3VlcyBpbiBWQlIgaGVhZGVyPC9saT4KKworICA8bGk+TWFyayBUYXlsb3I6IHdvcmthcm91bmQgYWdhaW5zdCBzb21lIGhhcmR3YXJlIGRlY29kZXIKK2RlZmZpY2llbmNpZXM8L2xpPgorCisgIDxsaT5BbGVrc2FuZGVyIEtvcnp5bnNraTogYWJpbGl0eSB0byBjb21wdXRlIHRoZSAiUmFkaW8iCitSZXBsYXlHYWluIGFuZCBkZXRlY3QgY2xpcHBpbmcgb24gdGhlIGZseS4gVGhlIFJlcGxheUdhaW4gdmFsdWUgaXMKK3N0b3JlZCBpbiB0aGUgTGFtZSB0YWcuPC9saT4KKworICA8bGk+R2FicmllbCBCb3V2aWduZToKKyAgICA8dWw+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+d29yayBvbiBwcmVzZXRzPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+dXNlIHByZXNldHMgYnkKK2RlZmF1bHQgZm9yIGNici9hYnI8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj51c2UgcHJlc2V0cyBieQorZGVmYXVsdCBmb3IgdmJyPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+YW5hbG9nIHNpbGVuY2UKK2RldGVjdGlvbiBpbiBwYXJ0aXRpb25uZWQgc2ZiMjE8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjMzM2NmZmIj5kbyBub3QgY29tcHV0ZSBub2lzZQoraW4gdXBwZXIgMCBwYXJ0IG9mIHRoZSBzcGVjdHJ1bTwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPm9ubHkgY29tcHV0ZSBub2lzZQoraW4gbW9kaWZpZWQgc2NhbGVmYWN0b3IgYmFuZHM8L2ZvbnQ+PC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+R3VpbGxhdW1lIExlc3NhcmQ6CisgICAgPHVsPgorCisgICAgICA8bGk+bm9nYXAgcmVsYXRlZCBjaGFuZ2VzPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+QWxleGFuZGVyIExlaWRpbmdlcjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT5wcmV2ZW50IGNsb3NpbmcgdGhlIGlucHV0IGZkIHByZW1hdHVyZWx5IGlmIHRoZSBpbnB1dAoraXMgYSBuYW1lZCBwaXBlPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjkzLjEgJm5ic3A7ICZuYnNwO0RlY2VtYmVyIDEgMjAwMjwvaDM+CisKKzx1bD4KKworICA8bGk+R2FicmllbCBCb3V2aWduZToKKyAgICA8dWw+CisKKyAgICAgIDxsaT5wcmVzZXQgbWVkaXVtIGFkZGVkIHRvIHRoZSBkbGwgaW50ZXJmYWNlPC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5maXggZm9yIGFici9jYnIKK3ByZXNldHM8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5maXggLXEwIHN3aXRjaDwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5BbGV4YW5kZXIgTGVpZGluZ2VyOiBmaXggbGluayBwcm9ibGVtIG9uIHN5c3RlbXMgd2hlcmUKK3NvY2tldCgpIHJlc2lkZXMgaW4gbGlic29ja2V0PC9saT4KKworPC91bD4KKworPGJyPgorCis8aDM+TEFNRSAzLjkzICZuYnNwOyAmbmJzcDtOb3ZlbWJlciAxNiAyMDAyPC9oMz4KKworPHVsPgorCisgIDxsaT5UYWtlaGlybyBUb21pbmFnYToKKyAgICA8dWw+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Yml0IGFsbG9jYXRpb24gZm9yCitwcmUtZWNobyBjb250cm9sIGltcHJvdmVkIGZvciBzaW5nbGUgY2hhbm5lbCBlbmNvZGluZ3M8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5zdWJzdGVwIG5vaXNlIHNoYXBpbmc8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPjxmb250IGNvbG9yPSIjMzM2NmZmIj5vcHRpbWl6YXRpb25zIGJ5CitjaGFuZ2luZyBkYXRhIHN0cnVjdHVyZTwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPm5vaXNlIHNoYXBpbmcgbW9kZWwKKzIgZml4PC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+bnNwc3l0dW5lIEZJUiBmaWx0ZXIKK2NsZWFuIHVwPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Zml4IHNtYWxsIHBzeW1vZGVsCitidWdzKERDIGN1cnJlbnQgZXN0aW1hdGlvbiwgcHJlZWNobyBkZXRlY3Rpb24gb2Ygbm9uLVZCUiBtb2RlLCBhbmQKK25zcHN5bW9kZSBpbml0aWFsaXphdGlvbik8L2ZvbnQ+PC9saT4KKworICAgICAgPGxpPnBvcnRhYmlsaXR5IGZpeGVzIGZvciBUcnU2NCBVTklYPC9saT4KKworICAgIDwvdWw+CisKKyAgPC9saT4KKworICA8bGk+QWxiZXJ0IEZhYmVyOiBzb21lIGZpeGVzIGluIHRoZSBETEw8L2xpPgorCisgIDxsaT5TaW1vbiBCbGFuZGZvcmQ6IGZpeGVzIGZvciBjaGFubmVsIHNjYWxpbmcgaW4gbW9ubyBtb2RlPC9saT4KKworICA8bGk+PGZvbnQgY29sb3I9IiMzMzY2ZmYiPkRvbWluaXF1ZSBEdXZpdmllcjogc29tZQorb3B0aW1pemF0aW9ucyBhbmQgYSBmYXN0ZXIgbG9nMTAgZnVuY3Rpb248L2ZvbnQ+PC9saT4KKworICA8bGk+TWFyayBUYXlsb3I6CisgICAgPHVsPgorCisgICAgICA8bGk+c29tZSB0YWcgcmVsYXRlZCBmaXhlcyBpbiB0aGUgZGlyZWN0IHNob3cgZmlsdGVyIGFuZCBpbgordGhlIEFDTSBjb2RlYzwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+Zml4ZWQgYSBtb25vCitlbmNvZGluZyBidWcgZm91bmQgYnkgSnVzdGluIFNjaG9lbWFuPC9mb250PjwvbGk+CisKKyAgICAgIDxsaT5jYWxjX25vaXNlIGJ1ZyBmaXg8L2xpPgorCisgICAgICA8bGk+b3RoZXIgZml4ZXM8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5BbGV4YW5kZXIgTGVpZGluZ2VyOgorICAgIDx1bD4KKworICAgICAgPGxpPnVwZGF0ZSB0byBhdXRvY29uZiAyLjUzLCByZXdyaXRlIHNvbWUgY29uZmlndXJlIHRlc3RzPC9saT4KKworICAgICAgPGxpPkFrb3MgTWFyb3k6IGRldGVybWluZSBnY2MgdmVyc2lvbiBldmVuIHdpdGggZ2NjIDMuMTwvbGk+CisKKyAgICAgIDxsaT5BbmRyZXcgQmFjaG1hbm46IGNvbXBpbGUgc2hhcmVkIGxpYnMgb24gQmVPUyAoYW5kCitwZXJoYXBzIG90aGVyIGFyY2hlcyk8L2xpPgorCisgICAgICA8bGk+dWx0cmFzcGFyYyBzd2l0Y2hlcyBmb3IgZ2NjIDMuMTwvbGk+CisKKyAgICAgIDxsaT5maXhlcyBmb3IgU3VuT1MgNC54PC9saT4KKworICAgICAgPGxpPmZpeGVzIGZvciA2NGJpdCBhcmNoZXM8L2xpPgorCisgICAgICA8bGk+Q0ZMQUdTIGZpeCBmb3IgSVJJWDwvbGk+CisKKyAgICAgIDxsaT5kb24ndCBvdmVycmlkZSBDRkxBR1MgaWYgZXhwdG9wdCBpc24ndCByZXF1ZXN0ZWQ8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5Sb2JlcnQgSGVnZW1hbjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+c29tZSBmaXhlczwvZm9udD48L2xpPgorCisgICAgICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPnNvbWUgZml4ZXMgZm9yIFZCUjwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCisgIDxsaT5HYWJyaWVsIEJvdXZpZ25lOgorICAgIDx1bD4KKworICAgICAgPGxpPi0tbm9hc20gc3dpdGNoLiBNaWdodCBoZWxwIEN5cml4L1ZpYSB1c2VyczwvbGk+CisKKyAgICAgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+cHJlc2V0cyBhbmQKK2FsdC1wcmVzZXRzIG1lcmdlZDwvZm9udD48L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCis8L3VsPgorCis8YnI+CisKKzxoMz5MQU1FIDMuOTIgJm5ic3A7ICZuYnNwO0FwcmlsIDE0IDIwMDI8L2gzPgorCis8dWw+CisKKyAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5BbGV4YW5kZXIKK0xlaWRpbmdlcjombmJzcDsgYWRkIG5vbiBsaW5lYXIgcHN5bW9kZWwgKGNvbXBpbGUgdGltZSBvcHRpb24sCitkaXNhYmxlZCBieSBkZWZhdWx0KTwvZm9udD4sIHdvcmthcm91bmQgYSBidWcgaW4gZ2NjIDMuMC4zCisoY29tcGlsZXIgb3B0aW9ucywgYmFzZWQgdXBvbiBzdWdnZXN0aW9ucyBmcm9tIHZhcmlvdXMgcGVvcGxlLCBzZWUKK2FyY2hpdmVzIGFuZCBjaGFuZ2Vsb2cgZm9yIG1vcmUpPC9saT4KKworICA8bGk+U3RldmUgTGhvbW1lOiZuYnNwOyBBQ00gd3JhcHBlciAoTVMtV2luZG93cyBjb2RlYyk8L2xpPgorCisgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+U3RldmUgTGhvbW1lOiZuYnNwOworbGVzcyBtZW1vcnkgY29weWluZyBvbiBzdGVyZW8gKGludGVybGVhdmVkKSBpbnB1dDwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlRha2VoaXJvIFRvbWluYWdhOgorSW50ZXItY2hhbm5lbCBtYXNraW5nLCBlbmFibGVzIHdpdGggLS1pbnRlcmNoIHggb3B0aW9uPC9mb250PjwvbGk+CisKKyAgPGxpPiBGb3IgYnVnZ3kgdmVyc2lvbnMgb2YgZ2NjIGNvbXBpbGVyICgyLjk2KiksIGJhY2sgb2ZmIG9uCitzb21lIG9mIHRoZSBhZHZhbmNlZCBjb21waWxlciBvcHRpb25zPGJyPgorCisgIDwvbGk+CisKKzwvdWw+CisKKzxicj4KKworPGgzPkxBTUUgMy45MSAmbmJzcDsgJm5ic3A7RGVjZW1iZXIgMjkgMjAwMTwvaDM+CisKKzx1bD4KKworICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPkRhcmluCitNb3JyaXNvbjombmJzcDsgQnVnZml4IGZvciAtLWFsdC1wcmVzZXQgKGZvciBjb250ZW50IHdpdGggbG93Cit2b2x1bWUsIGNsZWFuIHZvY2FscyksIG9ubHkgaW1wb3J0YW50IGZvciB0aGUgImZhc3Qgc3RhbmRhcmQiIHByZXNldDwvZm9udD4KKyAgPC9saT4KKworICA8bGk+QWxleGFuZGVyIExlaWRpbmdlcjoKKyAgICA8dWw+CisKKyAgICAgIDxsaT5hZGQgc29tZSBtaXNzaW5nIGZpbGVzIHRvIHRoZSBkaXN0cmlidXRpb248L2xpPgorCisgICAgICA8bGk+YWRkIC0tYWx0LXByZXNldCB0byB0aGUgbWFuIHBhZ2U8L2xpPgorCisgICAgPC91bD4KKworICA8L2xpPgorCis8L3VsPgorCis8YnI+CisKKzxoMz5MQU1FIDMuOTAgJm5ic3A7ICZuYnNwO0RlY2VtYmVyIDIxIDIwMDE8L2gzPgorCis8dWw+CisKKyAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5NYW55IHNtYWxsIGltcHJvdmVtZW50cworYW5kIGJ1ZyBmaXhlcyBub3QgYWRkZWQgdG8gaGlzdG9yeTwvZm9udD48L2xpPgorCisgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Sm9obgorRGFobHN0cm9tOiZuYnNwOyBtb3JlIGZpbmUgdHVuaW5nIG9uIHRoZSBhdXRvIGFkanVzdG1lbnQgb2YgdGhlIEFUSDwvZm9udD48L2xpPgorCisgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+Um9iZXJ0CitIZWdlbWFubjombmJzcDsgc21hbGwgc3BlZWQgYW5kIHF1YWxpdHkgaW1wcm92ZW1lbnRzIGZvciB0aGUgb2xkCitWQlIgY29kZSAoLS12YnItb2xkKS48L2ZvbnQ+IDwvbGk+CisKKyAgPGxpPjxmb250IGNvbG9yPSIjZmYwMDAwIj5Sb2JlcnQKK0hlZ2VtYW5uOiZuYnNwOyBzb21lIHNob3J0IGJsb2NrIGJ1ZyBmaXhlczwvZm9udD4gPC9saT4KKworICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPlJvYmVydAorSGVnZW1hbm46Jm5ic3A7IEJpZyBpbXByb3ZlbWVudHMgdG8gLS12YnItbXRyaCwgbm93IGVuY29kZXMgbXVjaAorbW9yZSBmcmVxdWVuY2llcyBvdmVyIDE2a2h6PC9mb250PiA8L2xpPgorCisgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Um9iZXJ0CitIZWdlbWFubjombmJzcDsgLS12YnItbmV3IGNvZGUgZGlzYWJsZWQgKG91dGRhdGVkIGFuZCBsb3dlcgorcXVhbGl0eSkgYW5kIHJlcGxhY2VkIHdpdGggLS12YnItbXRyaCAoQm90aCAtLXZici1uZXcgYW5kIC0tdmJyLW10cmgKK25vdyBkZWZhdWx0IHRvIG10cmgpPC9mb250PiA8L2xpPgorCisgIDxsaT5Sb2JlcnQgSGVnZW1hbm46Jm5ic3A7IHJlb3JkZXJpbmcgb2YgLS1sb25naGVscCB0byBnaXZlCittb3JlIGluZm9ybWF0aW9uLCAtLWV4dHJhaGVscCBkcm9wcGVkIDwvbGk+CisKKyAgPGxpPkRhcmluIE1vcnJpc29uOiZuYnNwOyBUb3RhbGx5IHJldmFtcGVkIGFuZCBleHRyZW1lbHkKK2hpZ2ggcXVhbGl0eSB1bmlmaWVkIHByZXNldCBzeXN0ZW0gYW5kIG90aGVyIGdlbmVyYWwgcXVhbGl0eQoraW1wcm92ZW1lbnRzIG5vdyBhdmFpbGFibGUgd2l0aCAtLWFsdC1wcmVzZXRzOgorICAgIDx1bD4KKworICAgICAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+c29tZSBpbXByb3ZlbWVudHMKK3RvIHBzeWNob2Fjb3VzdGljcyAodmFzdCBpbXByb3ZlbWVudHMgb3ZlciBkZWZhdWx0IEwuQS5NLkUuIG1vZGVzKSB3aGVuCistLWFsdC1wcmVzZXQgaXMgdXNlZCBpbmNsdWRpbmc6PC9mb250PgorCisgICAgICA8dWw+CisKKyAgICAgICAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+SW1wcm92ZWQgdHVuaW5nCitvZiBzaG9ydCBibG9jayB1c2FnZS48L2ZvbnQ+PC9saT4KKworICAgICAgICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5JbXByb3ZlZAorcXVhbnRpemF0aW9uIHNlbGVjdGlvbiB1c2FnZSAodGhlIC1YIG1vZGVzKSwgbm93IGFkYXB0cyBiZXR3ZWVuCithcHByb3ByaWF0ZSBtb2RlcyBvbiB0aGUgZmx5LiBBbHNvIGhlbHBzIG9uICJkcm9wb3V0IiBwcm9ibGVtcyBhbmQgd2l0aAorcHJlLWVjaG8gY2FzZXMuPC9mb250PjwvbGk+CisKKyAgICAgICAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+SW1wcm92ZWQgam9pbnQKK3N0ZXJlbyB1c2FnZS4gVGhyZXNob2xkcyBhcmUgYmV0dGVyIHR1bmVkIG5vdyBhbmQgZml4IHNvbWUgImRyb3BvdXQiCitwcm9ibGVtcyBMLkEuTS5FLiBzdWZmZXJzIGZyb20gb24gY2xpcHMgbGlrZSBzZXJpb3VzdHJvdWJsZS48L2ZvbnQ+PC9saT4KKworICAgICAgICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5JbXByb3ZlZCBub2lzZQorc2hhcGluZyB1c2FnZS4gTm93IHN3aXRjaGVzIGJldHdlZW4gbm9pc2Ugc2hhcGluZyBtb2RlcyBvbiB0aGUgZmx5CisodG9nZ2xlcyAtWiBvbiBhbmQgb2ZmIHdoZW4gYXBwcm9wcmlhdGUpIHdoaWNoIGFsbG93cyBsb3dlciBiaXRyYXRlcworYnV0IHdpdGhvdXQgdGhlIHF1YWxpdHkgY29tcHJvbWlzZS48L2ZvbnQ+PC9saT4KKworICAgICAgICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5DbGlwcyB2YXN0bHkKK2ltcHJvdmVkIG92ZXIgZGVmYXVsdCBMLkEuTS5FLiBtb2RlcyAodmJyL2Nici9hYnIsIGluY2x1ZGluZyAtLXIzbWl4KToKK2Nhc3RhbmV0cywgZmxvcmlkYV9zZXEsIGRlYXRoMiwgZmF0Ym95LCBzcGFobSwgZ2J0aW5jLCByYXZlYmFzZSwgc2hvcnQsCitmbG9yaWRhX3NlcSwgaGloYXQsIGJhc3NkcnVtLCAybmRfdmVudF9jbGlwLCBzZXJpb3VzdHJvdWJsZSwgYmxvb2RsaW5lLAorYW5kIG90aGVycy4gTm8gZGVncmFkZWQgY2xpcHMga25vd24uPC9mb250PjwvbGk+CisKKyAgICAgICAgPGxpPiBWQlIgYml0cmF0ZXMgYXJlIG5vdyBtb3JlICJzdGFibGUiIHdpdGggbGVzcworZmx1Y3R1YXRpb24gLS0gbm90IGRpcHBpbmcgdG9vIGxvdyBvbiBzb21lIG11c2ljIGFuZCBub3QgaW5jcmVhc2luZyB0b28KK2hpZ2ggdW5uZWNlc3NhcmlseSBvbiBvdGhlciBtdXNpYy4gIi0tYWx0LXByZXNldCBzdGFuZGFyZCIgcHJvdmlkZXMKK2JpdHJhdGVzIHJvdWdobHkgd2l0aGluIHRoZSByYW5nZSBvZiAxODAtMjIwa2Jwcywgb2Z0ZW4gYXZlcmFnaW5nIGNsb3NlCit0byAxOTJrYnBzLjwvbGk+CisKKyAgICAgIDwvdWw+PC9saT4KKworICAgICAgPGxpPiAtLWFsdC1wcmVzZXRzIHJlcGxhY2UgdGhlIC0tZG0tcHJlc2V0cyBhbmQgIm1ldGFsIgorcHJlc2V0IGlzIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggZ2VuZXJpYyBhYnIgYW5kIGNiciBwcmVzZXRzLjwvbGk+CisKKyAgICAgIDxsaT4gLS1hbHQtcHJlc2V0IGV4dHJlbWUgKG5vdGUgdGhlICdlJykgcmVwbGFjZXMgeHRyZW1lIHRvCitoZWxwIGVsaW1pbmF0ZSBzb21lIGNvbmZ1c2lvbjwvbGk+CisKKyAgICAgIDxsaT4gLS1hbHQtcHJlc2V0IHZiciBtb2RlcyBub3cgaGF2ZSBhIGZhc3Qgb3B0aW9uIHdoaWNoCitvZmZlcnMgYWxtb3N0IG5vIGNvbXByb21pc2UgaW4gc3BlZWQuPC9saT4KKworICAgICAgPGxpPiAtLWFsdC1wcmVzZXQgc3RhbmRhcmQgKGFuZCAiZmFzdCBzdGFuZGFyZCIpIGFyZSBub3cKK211Y2ggbG93ZXIgaW4gYml0cmF0ZSwgbWF0Y2hpbmcgLS1yM21peCB3aXRoIGFuIG92ZXJhbGwgYXZlcmFnZSwgdGhvdWdoCitvZmZlcmluZyBoaWdoZXIgcXVhbGl0eSBlc3BlY2lhbGx5IG9uIGRpZmZpY3VsdCB0ZXN0IHNhbXBsZXMuPC9saT4KKworICAgICAgPGxpPiAtLWFsdC1wcmVzZXRzIGFyZSBubyBsb25nZXIganVzdCAicHJlc2V0cyIgYXMgaW4gYQorY29sbGVjdGlvbiBvZiBzd2l0Y2hlcywgaW5zdGVhZCB0aGV5IGFyZSBub3cgcXVhbGl0eSAibW9kZXMiIGJlY2F1c2Ugb2YKK3NwZWNpYWwgY29kZSBsZXZlbCB0dW5pbmdzICh0aG9zZSBtZW50aW9uZWQgYWJvdmUpLjwvbGk+CisKKyAgICAgIDxsaT4gVXNlIC0tYWx0LXByZXNldCBoZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvbGk+CisKKyAgICA8L3VsPgorCisgIDwvbGk+CisKKyAgPGxpPlJvZWwgVmRCOiBtb3JlIHR1bmluZyBvbiB0aGUgLS1yM21peCBwcmVzZXQgPC9saT4KKworICA8bGk+Sm9uIERlZSwgUm9lbCBWZEI6Jm5ic3A7IElORk8gdGFnPC9saT4KKworICA8bGk+QWxleGFuZGVyIExlaWRpbmdlciwgbXAzZ2FpbkBob3RtYWlsLmNvbTombmJzcDsgYWRkZWQKKy0tc2NhbGUtbCBhbmQgLS1zY2FsZS1yIHRvIHNjYWxlIHN0ZXJlbyBjaGFubmVscyBpbmRlcGVuZGFudGx5IDwvbGk+CisKKyAgPGxpPlRha2VoaXJvIFRvbWluYWdhOiZuYnNwOyA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+bmV3Citub2lzZSBzaGFwaW5nIG1vZGUsIG9mZmVyaW5nIG1vcmUgImN1dHRpbmcgZWRnZSIgc2hhcGluZyBhY2NvcmRpbmcgdG8KK21hc2tpbmcsIGVuYWJsZWQgdmlhIC1xMDwvZm9udD4gPC9saT4KKworICA8bGk+TWFyayBUYXlsb3I6Jm5ic3A7IE1vcmUgd29yayBvbiAtLW5vZ2FwIDwvbGk+CisKKyAgPGxpPkdhYnJpZWwgQm91dmlnbmU6Jm5ic3A7IFNtYWxsIGNoYW5nZXMgdG8gYWJyIGNvZGUgZm9yCittb3JlIGFjY3VyYXRlIGZpbmFsIGJpdHJhdGUgPC9saT4KKworICA8bGk+R2FicmllbCBCb3V2aWduZSwgbXAzZ2FpbkBob3RtYWlsLmNvbTombmJzcDsKK1ByZWxpbWluYXJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cucmVwbGF5Z2Fpbi5vcmciPgorUmVwbGF5R2FpbjwvYT4gYW5hbHlzaXMgY29kZSBhZGRlZCAobm90IGZ1bmN0aW9uYWwgeWV0KSA8L2xpPgorCisgIDxsaT5HYWJyaWVsIEJvdXZpZ25lLCBBbGV4YW5kZXIgTGVpZGluZ2VyOiZuYnNwOworRG9jdW1lbnRhdGlvbiB1cGRhdGVzIDwvbGk+CisKKyAgPGxpPkpvaG4gRGFobHN0cm9tLCBEU1BndXJ1QG1hdGguY29tOiZuYnNwOyBmbG9hdGluZyBwb2ludAoraW50ZXJmYWNlIGZ1bmN0aW9uIGluIHRoZSBXaW5kb3dzIERMTDwvbGk+CisKKzwvdWw+CisKKzxicj4KKworPGgzPkxBTUUgMy44OWJldGEmbmJzcDsgJm5ic3A7SnVseSA1IDIwMDE8L2gzPgorCis8dWw+CisKKyAgPGxpPiBKb2huIFN0ZXdhcnQ6Jm5ic3A7IGxvbmcgZmlsZW5hbWUgc3VwcG9ydCBmb3IgV2luOXgvTlQuPC9saT4KKworICA8bGk+IFRha2VoaXJvIFRvbWluYWdhOiZuYnNwOyBMQU1FIGNhbiBjYWxjdWxhdGUgdGhlIENSQyBvZgorVkJSIGhlYWRlciwgc28gbm93ICJsYW1lIC1wdiIgd29ya3MgZmluZS48L2xpPgorCisgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Um9iZXJ0CitIZWdlbWFubjombmJzcDsgSW1wcm92ZW1lbnRzIG9mIHRoZSBuZXcgVkJSIGNvZGUgKC0tdmJyLW10cmgpLjwvZm9udD48L2xpPgorCisgIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZmZiI+Um9iZXJ0IEhlZ2VtYW5uOiBOZXcgVkJSCitjb2RlICgtLXZici1tdHJoKSBpcyBub3cgZGVmYXVsdGVkIHRvIGdldCBtb3JlIGZlZWRiYWNrLiBUaGUgVkJSIHNwZWVkCitpcyBub3cgb24gcGFyIHdpdGggQ0JSLiBXZSB3aWxsIHVzZSB0aGUgb2xkIFZCUiBjb2RlIGluIHRoZSByZWxlYXNlLjwvZm9udD48L2xpPgorCisgIDxsaT48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+R2FicmllbCBCb3V2aWduZTogQ2hhbmdlCitvZiB0aGUgbWF4aW11bSBmcmFtZSBzaXplIGxpbWl0LiBMQU1FIHNob3VsZCBub3cgYmUgbW9yZSBmcmllbmRseSB3aXRoCitoYXJkd2FyZSBwbGF5ZXJzLjwvZm9udD48L2xpPgorCisgIDxsaT5HYWJyaWVsIEJvdXZpZ25lOiBTaXplIG9mIFZCUiBpcyBub3cgbW9yZSBiYWxhbmNlZAorYWNjb3JkaW5nIHRvIHRoZSAtViB2YWx1ZS48L2xpPgorCisgIDxsaT5BbGV4YW5kZXIgTGVpZGluZ2VyOiBGaW5pc2hlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCitzZXQvZ2V0IGZ1bmN0aW9ucy48L2xpPgorCisgIDxsaT5Kb2huIERhaGxzdHJvbTogTEFNRSBub3cgaGFuZGxlcyAyNGJpdHMgaW5wdXQ8L2xpPgorCisgIDxsaT5NYXJrIFRheWxvcjogYnVncyBpbiBsYW1lIC0tZGVjb2RlIGNhdXNpbmcgdHJ1bmNhdGlvbiBvZgorbXAzIGZpbGUgZml4ZWQ8L2xpPgorCisgIDxsaT5NYXJrIFRheWxvcjogcHJlbGltaW5hcnkgLS1ub2dhcCBzdXBwb3J0PC9saT4KKworICA8bGk+IkZpbmFsIiBBUEkgY29tcGxldGVkOiBzaGFyZWQgbGlicmFyeSBzYWZlISAmbmJzcDtUaGlzCitBUEkgaXMgZnJvemVuIGFuZCBzaG91bGQgYmUgYmFja3dvcmRzIGNvbXBhdGlhYmxlIHdpdGggZnV0dXJlIHZlcnNpb25zCitvZiBsaWJtcDNsYW1lLnNvLCBidXQgd2Ugd2lsbCBjb250aW51ZSB0byBhZGQgbmV3IGZ1bmN0aW9uYWxpdHkuCismbmJzcDs8YnI+CisKKyAgPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuODhiZXRhJm5ic3A7Jm5ic3A7IE1hcmNoIDI1IDIwMDE8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+QSBsb3Qgb2Ygd29yayB0aGF0IHdhcworbmV2ZXIgYWRkZWQgdG8gdGhlIEhpc3RvcnkhPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+RnJhbmsgS2xlbW0gYW5kCitHYWJyaWVsIEJvdXZpZ25lOiZuYnNwOyBOZXcgQVRIIGZvcm11bGEuJm5ic3A7IEJpZyBpbXByb3ZlbWVudAorZm9yIGhpZ2ggYml0cmF0ZSBlbmNvZGluZ3MuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+VGFrZWhpcm8gVG9taW5hZ2E6CitUZW1wb3JhbCBtYXNraW5nPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+R2FicmllbCBCb3V2aWduZS9NYXJrCitUYXlsb3I6IGF1dG8gYWRqdXN0bWVudCBvZiBBVEg8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5Sb2JlcnQKK0hlZ2VtYW5uOiZuYnNwOyBCZXR0ZXIgb3V0ZXJfbG9vcCBzdG9wcGluZyBjcml0ZXJpb24uJm5ic3A7CitFbmFibGVkIHdpdGggLXEyIG9yIGJldHRlci48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5Sb2JlcnQgSGVnZW1hbm4vTmFva2kKK1NoaWJhdGE6Jm5ic3A7IHNsb3cvY2FyZWZ1bGwgbm9pc2Ugc2hhcGluZy4mbmJzcDsKKy1xMy4uOTombmJzcDsgYW1wbGlmeSBhbGwgZGlzdG9ydGVkIGJhbmRzLiZuYnNwOyAtcTI6IGFtcGxpZnkKK2Rpc3RvcnRlZCBiYW5kcyB3aXRoaW4gNTAlLiZuYnNwOyAtcTEtMDombmJzcDsgYW1wbGlmeSBvbmx5Cittb3N0IGRpc3RvcnRlZCBiYW5kIGF0IGVhY2ggaXRlcmF0aW9uLjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlRha2VoaXJvIFRvbWluYWdhOgorSW50ZXJmcmFtZSwgc2hvcnRibG9jayB0ZW1wb3JhbCBtYXNraW5nLjwvZm9udD48L2xpPgorCisgIDxsaT4gVGFrZWhpcm8gVG9taW5hZ2E6Jm5ic3A7IExBTUUgcmVzdHJ1Y3R1cmVkIGludG8gYQorc2hhcmVkIGxpYnJhcnkgYW5kIGZyb250IGVuZCBhcHBsaWNhdGlvbi4mbmJzcDsgU2xpZ2h0IGNoYW5nZXMgdG8KK3RoZSBBUEkuIE1vcmUgY2hhbmdlcyBhcmUgY29taW5nIHRvIHR1cm4gTEFNRSBpbnRvIGEgdHJ1ZSBzaGFyZWQKK2xpYnJhcnkgKHJpZ2h0IG5vdyB5b3UgaGF2ZSB0byByZWNvbXBpbGUgaWYgeW91IHVwZ3JhZGUgdGhlIGxpYnJhcnkgOi0oPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5OYW9raSBTaGliYXRhOjwvZm9udD4KKworICAgIDx1bD4KKworICAgICAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+aW1wcm92ZW1lbnRzIHRvCisJICBwc3ljaG9hY291c3RpY3M8L2ZvbnQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiPgorCSAgKC0tbnNwc3l0dW5lKTwvZm9udD4KKworICAgICAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+QlVHIGluIGxvbmcgYmxvY2sKKwkgIHByZSBlY2hvIGNvbnRyb2wgZml4ZWQgPC9mb250Pjxmb250IGNvbG9yPSIjMDAwMDAwIj4KKwkgIChzb21lIG91dCBvZiByYW5nZSBhcnJheSBhY2Nlc3MgaW4gTS9TIHBzeWNob2Fjb3VzdGljcyk8L2ZvbnQ+PC9saT4KKworICAgIDwvdWw+CisgIDwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+UmFsZgorS2VtcGtlbnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7IFZpc3VhbCBCYXNpYyBTY3JpcHQgZm9yIGxhbWUsCitzdWdnZXN0ZWQgdG8gcHV0IGl0IG9uIHlvdXIgV2luZG93cyBEZXNrdG9wIGFuZCB5b3UgY2FuIGRyYWcnbidkcm9wCitXYXZlcyB0byBlbmNvZGUgb24gaXQuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+QWxleGFuZGVyCitTdHVtcGY6Jm5ic3A7Jm5ic3A7Jm5ic3A7IGltcHJvdmVkIGxhbWUuYmF0IGZvciA0RG9zIHVzZXJzPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+TWFyayBUYXlsb3I6IFNldmVyYWwKK2J1Z3MgZml4ZWQgaW4gdGhlIHJlc2FtcGxpbmcgY29kZS48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5GcmFuayBLbGVtbSwgUm9iZXJ0CitIZWdlbWFubjombmJzcDsmbmJzcDsmbmJzcDsgYWRkZWQgYXNzZW1ibGVyIGNvZGUgZm9yIENQVQorZmVhdHVyZSBkZXRlY3Rpb24gb24gcnVudGltZSAoTU1YLCAzRE5vdywgU0lNRCk8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5UYWtlaGlybyBUb21pbmFnYToKKzNETm93IEZGVCBjb2RlLjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMwMDAwMDAiPkZsb3JpYW4gQm9tZSwKK0FsZXhhbmRlciBMZWlkaW5nZXI6Jm5ic3A7Jm5ic3A7Jm5ic3A7IG1vcmUgd29yayBvbgorY29uZmlndXJlIHN0dWZmPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+QWxleGFuZGVyCitMZWlkaW5nZXI6Jm5ic3A7Jm5ic3A7IGF1dG9tYWtlL2xpYnRvb2wgZ2VuZXJhdGVkIE1ha2VmaWxlcyBhbmQKK1RPTlMgb2Ygb3RoZXIgd29yay48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5BbGV4YW5kZXIKK0xlaWRpbmdlcjombmJzcDsmbmJzcDsgTXVjaCB3b3JrIHRvd2FyZHMgc2hhcmVkIGxpYnJhcnkgc3R5bGUKK0FQSS48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5Bbm9ueW1vdXM6IE5ldyBtb3JlCitlZmZpY2llbnQgUlRQIGNvZGUuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TWFyayBUYXlsb3I6Citwc3ljaG8tYWNvdXN0aWMgZGF0YSBub3cgY29tcHV0ZWQgZm9yIGFsbCBzY2FsZWZhY3RvciBiYW5kcyAodXAgdG8gMjQKK2tIeik8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5NYXJrIFRheWxvciwgVGFrZWhpcm8KK1RvbWluYWdhOiBBbGwgSVNPIHRhYmxlIGRhdGEgcmVwbGFjZWQgYnkgZm9ybXVsYXMgLSBzaG91bGQgaW1wcm92ZQorTVBFRzIuNSByZXN1bHRzIGZvciB3aGljaCB3ZSBuZXZlciBoYWQgY29ycmVjdCB0YWJsZSBkYXRhLjwvZm9udD48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy44N2FscGhhJm5ic3A7IFNlcHRlbWJlciAyNSAyMDAwPC9oMz4KKworPHVsPgorCisgIDxsaT4gTWFyayBUYXlsb3I6Jm5ic3A7IEJ1ZyBmaXhlZCBpbiBMQU1FL21wZ2xpYiBlcnJvcgorcmVjb3Zlcnkgd2hlbiBlbmNvdW50ZXJpbmcgYSBjb3JydXB0Jm5ic3A7IE1QMyBmcmFtZSBkdXJpbmcKKypkZWNvZGluZyouPC9saT4KKworICA8bGk+IEFsYmVydCBGYWJlcjombmJzcDsgYWRkZWQgTGF5ZXJJK0lJIGRlY29kaW5nIHN1cHBvcnQ8L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMwMDAwMDAiPkZyYW5rIEtsZW1tOiZuYnNwOworYWRkZWQgaW1wcm92ZWQgQ1JDIGNhbGN1bGF0aW9uPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+RnJhbmsgS2xlbW06CitzdWJzdGFudGlhbCBjb2RlIGNsZWFudXAvaW1wcm92ZW1lbnRzPC9mb250PjwvbGk+CisKKyAgPGxpPiBSb2JlcnQgSGVnZW1hbm46Jm5ic3A7IEJ1ZyBmaXhlcworCisgIDx1bD4KKworICAgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPmluIGh1ZmZtYW5faW5pdDwvZm9udD4sCitjb3VsZCBsZWFkIHRvIHNlZ21lbnRhdGlvbiBmYXVsdHMgKG9ubHkgaW4gcmFyZSBjYXNlcywgbW9zdCBsaWtlbHkgYXQKK2xvd2VyIHNhbXBsZSByYXRlcyk8L2xpPgorCisgICAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TS9TIHN3aXRjaGluZyBhdAorbG93ZXIgc2FtcGxlIHJhdGVzPC9mb250PiAodGhlIGZhY3QgdGhlcmUgaXMgbm8gMm5kIGdyYW51bGUgd2FzCitpZ25vcmVkKTwvbGk+CisKKyAgPC91bD4KKyAgPC9saT4KKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+Um9iZXJ0CitIZWdlbWFubjombmJzcDsgc3BlZWQgdXAgaW4mbmJzcDsgVkJSPC9mb250PjwvbGk+CisKKyAgPGxpPiBKYXJtbyBMYWFra29uZW46Jm5ic3A7IEFtaWdhL0dDQyBzZXR0aW5ncyBmb3IKK01ha2VmaWxlLnVuaXguPC9saT4KKworICA8bGk+IE1hZ251cyBIb2xtZ3JlbjombmJzcDsgUkVBRE1FIGFuZCBNYWtlZmlsZSBmb3IgKGZyZWUpCitCb3JsYW5kIEMrKyZuYnNwOyBjb21waWxlci4gV2lsbCBhbHNvIGNvbXBpbGUgbGFtZV9lbmMuZGxsLCBidXQKK3RoaXMgaXMgdW50ZXN0ZWQuPC9saT4KKworICA8bGk+IEZsb3JpYW4gQm9tZTombmJzcDsmbmJzcDsgTEFNRSBmaW5hbGx5IGhhcworYSZuYnNwOyAuL2NvbmZpZ3VyZSBzY3JpcHQhITwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjg2YmV0YSZuYnNwOyBBdWd1c3QgNiAyMDAwPC9oMz4KKworPHVsPgorCisgIDxsaT4gQ2hyaXN0b3BoZXIgV2lzZTombmJzcDsgQSBtYWtlZmlsZSBmb3IgREpHUFAsIHRoZSBET1MKK3ZlcnNpb24gb2YgZ2NjLiZuYnNwOyBOb3cgbW9zdCB3aW5kb3dzIHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvCitjb21waWxlIExBTUUgd2l0aCBtaW5pbWFsIGVmZm9ydC48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlJvYmVydAorSGVnZW1hbm46Jm5ic3A7IG9sZCBWQlI6Jm5ic3A7Jm5ic3A7IGZpeGVkIHNvbWUgYnVncyBhbmQKK1Rha2VoaXJvJ3Mgc2NhbGVmYWNfc2NhbGUgZmVhdHVyZSAobm90IHlldCBvbiBieSZuYnNwOworZGVmYXVsdC4pJm5ic3A7IG9sZGVyIExBTUUgdmVyc2lvbnMgZGlkIG5vdCBhbGxvdyB0byBzcGVudCBtb3JlCit0aGFuIDI1MDAgYml0cyBvZiA0MDk1IHBvc3NpYmxlIGJpdHMgdG8gYSBncmFudWxlIHBlciBjaGFubmVsLCBub3cKK2ZpeGVkLjwvZm9udD48L2xpPgorCisgIDxsaT4gUm9iZXJ0IEhlZ2VtYW5uOiZuYnNwOyBuZXcgVkJSOiZuYnNwOyZuYnNwOworYW5hbG9nIHNpbGVuY2UgdHJlYXRtZW50IGxpa2UgaW4gb2xkIFZCUjwvbGk+CisKKyAgPGxpPiBXaWxsaWFtIFdlbGNoOiZuYnNwOyBJbXByb3ZlZCBvcHRpb25zIGZvciBMaW51eC9BbHBoYQorZ2NjIGFuZCBjY2MgY29tcGlsZXJzIGluIE1ha2VmaWxlLjwvbGk+CisKKyAgPGxpPiBNYXRoZXcgSGVuZHJ5OiZuYnNwOyBzZXR0aW5nIGFwcHJvcHJpYXRlIENSQyBiaXQgZm9yCithZGRpdGlvbmFsIFhpbmctVkJSIHRhZ2dpbmcgZnJhbWU8L2xpPgorCisgIDxsaT4gRG9uIE1lbHRvbjombmJzcDsgYWRkZWQgSUQzIHZlcnNpb24gMiBUQUcgc3VwcG9ydDwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+Sm9obiBEYWhsc3Ryb206IGZpeGVkCitidWcgYWxsb3dpbmcgdGltaW5nIGluZm9ybWF0aW9uIChmb3Igc3RhdHVzIGluIGNvbW1hbmQgbGluZSBlbmNvZGVyKSB0bworb3ZlcmZsb3cuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+VGFtaXRvIEtBSklZQU1BLCBGaXhlZAorc2V2ZXJhbCBidWdzIGluIHRoZSBMQU1FL1ZvcmJpcyBpbnRlcmZhY2UuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+TWFyayBUYXlsb3I6Jm5ic3A7CitsYW1lIC0tZGVjb2RlIHdpbGwgcmVjb2duaXplIDxhIGhyZWY9Imh0dHA6Ly9hbGJ1bWlkLmNqYi5uZXQiPkFsYnVtCitJRCB0YWdzPC9hPjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk5hb2tpCitTaGliYXRhOiZuYnNwOyBBZGRpdGl2ZSBtYXNraW5nIGFuZCBvdGhlciBpbXByb3ZlbWVudHMgdG8gcHN5Y2hvCithY291c3RpY3MuJm5ic3A7IChub3QgeWV0IG9uIGJ5IGRlZmF1bHQpPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjg1YmV0YSZuYnNwOyZuYnNwOyBKdWx5IDMgMjAwMDwvaDM+CisKKzx1bD4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IG1pZC9zaWRlIHN0ZXJlbyBkZW1hc2tpbmcgdGhyZXNob2xkcyB1cGRhdGVkLjwvZm9udD48L2xpPgorCisgIDxsaT4gVGFrZWhpcm8gVG9taW5hZ2E6IE5ldyBzaG9ydCBibG9jayBNRENUIGNvZWZmaWNpZW50IGRhdGEKK3N0cnVjdHVyZS4mbmJzcDsgU2hvdWxkIGFsbG93IGZvciBmdXR1cmUgc3BlZWQgaW1wcm92ZW1lbnRzLjwvbGk+CisKKyAgPGxpPiBSb2JlcnQgSGVnZW1hbm46Jm5ic3A7IGZpeGVkIGJ1ZyBpbiBvbGQgVkJSIHJvdXRpbmUsCit0aGUgLS1ub2F0aCBtb2RlIG1lc3NlZCB1cCB0aGUgVkJSIHJvdXRpbmUgcmVzdWx0aW5nIGluIHZlcnkgbGFyZ2UgZmlsZXM8L2xpPgorCisgIDxsaT4gUm9iZXJ0IEhlZ2VtYW5uOiBmb3VuZCBidWdzIGluIHNvbWUgc2VjdGlvbnMgd2hlbiB1c2luZyAzMgorYml0IGZsb2F0aW5nIHBvaW50LiZuYnNwOyBEZWZhdWx0IGlzIG5vdyBiYWNrIHRvIDY0Yml0IGZsb2F0aW5nCitwb2ludC48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlRha2VoaXJvCitUb21pbmFnYTombmJzcDsgTW9kaWZpZWQgUEUgZm9ybXVsYSB0byB1c2UgQVRILjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMwMDAwMDAiPlMuVC5MLjombmJzcDsKK1JFQURNRS5ESkdQUCAtIGluc3RydWN0aW9ucyBmb3IgY29tcGlsaW5nIExBTUUgd2l0aCBESkdQUCwgdGhlIGRvcwordmVyc2lvbiBvZiBnY2MuPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjg0YmV0YSZuYnNwOyBKdW5lIDMwJm5ic3A7IDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiBNYXJrIFdlaW5zdGVpbjombmJzcDsgLndhdiBmaWxlIG91dHB1dCAod2l0aCAtLWRlY29kZQorb3B0aW9uKSB3YXMgd3JpdGluZyB0aGUgd3JvbmcgZmlsZXNpemUgaW4gdGhlIC53YXYgZmlsZS4mbmJzcDsgTm93CitmaXhlZC48L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6Jm5ic3A7IChvcHRpb25hbCkgVm9yYmlzIHN1cHBvcnQsIGJvdGgKK2VuY29kaW5nIGFuZCBkZWNvZGluZy4mbmJzcDsgTEFNRSBjYW4gbm93IHByb2R1Y2UgLm9nZyBmaWxlcywgb3IKK2V2ZW4gcmUtZW5jb2RlIHlvdXIgZW50aXJlIC5vZ2cgY29sbGVjdGlvbiBpbnRvCittcDMuJm5ic3A7Jm5ic3A7IChKdXN0IGtpZGRpbmc6IGl0IGlzIGFsd2F5cyBhIGJhZCBpZGVhIHRvCitjb252ZXJ0IGZyb20gb25lIGxvc3N5IGZvcm1hdCB0byBhbm90aGVyKTwvbGk+CisKKyAgPGxpPiA/OiBCdWcgZml4ZWQgY2F1c2luZyBWQlIgdG8gY3Jhc2ggdW5kZXIKK3dpbmRvd3MuJm5ic3A7Jm5ic3A7IChwcmV0YWJbXSBhcnJheSBvdmVyZmxvdyk8L2xpPgorCisgIDxsaT4gU2VyZ2V5IFNhcGVsaW46IEFub3RoZXIgYnVnIGZvdW5kIGluIHRoZSBtcGcxMjMgTVBFRzIKK3RhYmxlcy4mbmJzcDsgTm93IGZpeGVkIGZvciB0aGUgbXBnMTIzIGJhc2VkIGRlY29kZXIgaW4gTEFNRS48L2xpPgorCisgIDxsaT4gTWFyY28gUmVtb25kaW5pOiZuYnNwOyBWQlIgaGlzdG9ncmFtIHdvcmtzIGluCit3aW4zMi4mbmJzcDsgY29tcGlsZSB3aXRoIC1EQlJISVNUIC1ETk9URVJNQ0FQPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IExBTUUgQ0JSIHdpbGwgbm93IHVzZSBzY2FsZWZhY19zY2FsZSB0byBleHBhbmQgdGhlCitkeW5hbWljIHJhbmdlIG9mIHRoZSBzY2FsZWZhY3RvcnMuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+SXdhc2EgS2F6bWk6Jm5ic3A7CitMaWJyYXJ5IGltcHJvdmVtZW50czombmJzcDsgZXhpdCgpJ3MsIHByaW50ZiwgZnByaW50ZidzIGFyZSBiZWluZworcmVwbGFjZWQgYnkgaW50ZXJjZXB0YWJsZSBtYWNyb3MuPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjgzYmV0YSZuYnNwOyBNYXkgMTkmbmJzcDsgMjAwMDwvaDM+CisKKzx1bD4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5NYXJrIFRheWxvcjombmJzcDsKK0J1ZyBpbiBidWZmZXJpbmcgcm91dGluZXM6Jm5ic3A7IGluIHNvbWUgY2FzZXMsIGNvdWxkIGNhdXNlCitNRENUJm5ic3A7IHRvIHJlYWQgcGFzdCBlbmQgb2YgYnVmZmVyLiZuYnNwOyBSYXJlIGluIE1QRUcyLAorZXZlbiBtb3JlIHJhcmUgZm9yIE1QRUcxLCBidXQgcG90ZW50aWFsbHkgc2VyaW91cyE8L2ZvbnQ+PC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiZuYnNwOyBNRENUL3BvbHlwaGFzZSBmaWx0ZXJiYW5rIHdhcyBub3QKK2JlaW5nICJwcmltZWQiIHByb3Blcmx5LiZuYnNwOyBEb2VzIG5vdCBlZmZlY3Qgb3V0cHV0IHVubGVzcyB5b3UKK3NldCB0aGUgZW5jb2RlciBkZWxheSBsb3dlciB0aGFuIHRoZSBkZWZhdWx0IG9mIDU3NiBzYW1wbGVzLjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TWFyayBUYXlsb3I6Jm5ic3A7CisidmRiaiIgYW5kICJDYXN0ZXIiJm5ic3A7IGZvdW5kIHNldmVyYWwgVkJSIGJ1Z3MgKG5vdworZml4ZWQpOiZuYnNwOyZuYnNwOyAxLiZuYnNwOyBBbmFsb2cgc2lsZW5jZSBkZXRlY3Rpb24gb25seQorY2hlY2tlZCBmcmVxdWVuY2llcyB1cCB0byAxNiBrSHouJm5ic3A7IDIuJm5ic3A7IFZCUiBtb2RlIGNvdWxkCitzdGlsbCBzb21laG93IGF2b2lkIC1GIG1vZGUuJm5ic3A7IDMuJm5ic3A7IFZCUiBtb2RlIHdvdWxkCitpZ25vcmUgbm9pc2UgYWJvdmUgMTYga0h6IChzY2FsZWZhY3RvciBiYW5kIDIyKSwgTm93IGNhbGNfbm9pc2UxIHdpbGwKK2NvbXB1dGUgdGhlIG5vaXNlIGluIHRoaXMgYmFuZCB3aGVuIGluIFZCUiBtb2RlLiZuYnNwOyBOb3QKK2NhbGN1bGF0ZWQgaW4gQ0JSJm5ic3A7IG1vZGUgc2luY2UgQ0JSIGFsZ29yaXRobSBoYXMgbm8gd2F5IG9mCit1c2luZyB0aGlzIGluZm9ybWF0aW9uLjwvZm9udD48L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6Jm5ic3A7IHNjYWxlZmFjdG9yIGJhbmQgMjIgaW5mbworKG1hc2tpbmcoPUFUSCksJm5ic3A7IG5vaXNlIGFuZCBlbmVyZ3kpIG5vdyBkaXNwbGF5ZWQgaW4gZnJhbWUKK2FuYWx5emVyLjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+VkJSIGNvZGUgQVRIIHR1bmluZword2FzIGRpc2FibGVkIGJ5IGFjY2lkZW50IGluIDMuODEsIG5vdyBmaXhlZC48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5NYXJrIFRheWxvcjombmJzcDsKK2xhbWUgLS1kZWNvZGUgd2lsbCBwcm9kdWNlIC53YXYgZmlsZXMuJm5ic3A7IChvb3BzIC0gc2l6ZSBpcyBvZmYgYnkKK2EgZmFjdG9yIG9mIDQpPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjgyYmV0YSZuYnNwOyZuYnNwOyBNYXkgMTEgMjAwMDwvaDM+CisKKzx1bD4KKworICA8bGk+IFJvYmVydCBIZWdlbWFubjombmJzcDsgRml4ZWQgYnVnIGluIGhpZ2ggYml0cmF0ZSBqb2ludAorc3RlcmVvIGVuY29kaW5ncy48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPk5hb2tpCitTaGliYXRhOiZuYnNwOyBuZXcgbG9uZyBibG9jayBNRENUIHJvdXRpbmU8L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuODFiZXRhJm5ic3A7IE1heSA4IDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiBhbGwgSVNPIGNvZGUgcmVtb3ZlZCE8L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPlRha2VoaXJvIFRvbWluYWdhIGFuZAorTmFva2kgU2hpYmF0YTombmJzcDsgbmV3IHdpbmRvdyBzdWJiYW5kIHJvdXRpbmVzLjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMwMDAwMDAiPk5hb2tpCitTaGliYXRhOiZuYnNwOyBCdWcgZml4IGluIG1wZ2xpYiAoZGVjb2RpbmcpIGxpYjombmJzcDsgaW4gc29tZQorY2FzZXMsIE1EQ1QgY29lZmZpY2llbnRzIGZyb20gcHJldmlvdXMgZ3JhbnVsZSB3YXMgaW5jb3JyZWN0bHkgdXNlZCBmb3IKK3RoZSBuZXh0IGdyYW51bGUuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+SVNPIDc2ODAgYml0IGJ1ZmZlcgorbGltaXRhdGlvbiByZW1vdmVkLiZuYnNwOyBJdCBjYW4gYmUgcmVhY3RpdmF0ZWQgd2l0aAorIi0tc3RyaWN0bHktZW5mb3JjZS1JU08iJm5ic3A7IFBsZWFzZSByZXBvcnQgYW55IHRyb3VibGUgd2l0aCBoaWdoCitiaXRyYXRlcy48L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuODBiZXRhJm5ic3A7IE1heSA2IDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+VGFrZWhpcm8KK1RvbWluYWdhOiZuYnNwOyBtb3JlIGVmZmljaWVudCBhbmQgZmFzdGVyIGh1ZmZtYW4gZW5jb2RpbmchPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+VGFrZWhpcm8gVG9taW5hZ2EgYW5kCitNYXJrIFRheWxvcjombmJzcDsgbXVjaCBpbXByb3ZlZCBzaG9ydCBibG9jayBjb21wcmVzc2lvbiE8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5Ub21hc3ogTW90eWxld3NraSBhbmQKK01hcmsgVGF5bG9yOiZuYnNwOyBNUEVHMi41IG5vdyBzdXBwb3J0ZWQhPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+TWFyayBUYXlsb3I6CitpbmNvcnBvcmF0ZWQgVGFrZWhpcm8ncyBiaXRzdHJlYW0uYyEmbmJzcDsgYml0c3RyZWFtLmMgdXNlZCBieQorZGVmYXVsdCwgYnV0IG9sZCBJU08gYml0c3RyZWFtIGNvZGUgY2FuIGFsc28gYmUgdXNlZC48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5TY290dCZuYnNwOyBNYW5sZXkKK2FuZCBNYXJrIFRheWxvcjombmJzcDsgZ29vZCByZXNhbXBsaW5nIHJvdXRpbmUgZmluYWx5IGluCitMQU1FLiZuYnNwOyB1c2VzIGEgMTkgcG9pbnQgRklSIGZpbHRlciB3aXRoIEJsYWNrbWFuCit3aW5kb3cuJm5ic3A7IFZlcnkgc2xvdyBmb3Igbm9uIGludGVnZXIgcmVzYW1wbGluZyByYXRpb3MuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+SXdhc2EgS2F6bWk6Jm5ic3A7CitmaXhlZCBTSUdCVVMgZXJyb3I6Jm5ic3A7IFZCUiBhbmQgaWQzIHRhZ3Mgd2VyZSB1c2luZyBkYXRhIGFmdGVyIGl0Cit3YXMgZnJlZSgpJ2QuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Um9iZXJ0CitIZWdlbWFubjombmJzcDsgSW1wcm92ZWQgVkJSIHR1bmluZy4mbmJzcDsgI2RlZmluZQorUkhfUVVBTElUWV9DT05UUk9MIGFuZCAjUkhfU0lERV9WQlIgbm93IHRoZSBkZWZhdWx0cy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5Sb2JlcnQKK0hlZ2VtYW5uOiZuYnNwOyZuYnNwOyBMQU1FIHZlcnNpb24gc3RyaW5nIG5vdyBhZGRlZCB0bworYW5jaWxsYXJ5IGRhdGEuPC9mb250PjwvbGk+CisKKyAgPGxpPiBLaW1tbyBNdXN0b25lbjombmJzcDsgVkJSIGhpc3RvZ3JhbSBzdXBwb3J0IGZvciBBbWlnYS48L2xpPgorCisgIDxsaT4gQ2FzcGVyIEdyaXBlbmJlcmc6Jm5ic3A7IFZCUiBzdGF0cyAoYnV0IG5vdCBoaXN0b2dyYW0pCitmb3IgRE9TIHZlcnNvbi48L2xpPgorCisgIDxsaT4gUm9iZXJ0IEhlZ2VtYW5uOiZuYnNwOyByYXJlIFZCUiBvdmVyZmxvdyBidWcgZml4ZWQuPC9saT4KKworICA8bGk+IFphY2s6Jm5ic3A7IC1GIG9wdGlvbiBzdHJpY3RseSBlbmZvcmNlcyB0aGUgVkJSIG1pbgorYml0cmF0ZS4mbmJzcDsgV2l0aG91dCAtRiwgTEFNRSB3aWxsIGlnbm9yZSB0aGUgbWluaW11bSBiaXRyYXRlCit3aGVuIGVuY29kaW5nIGFuYWxvZyBzaWxlbmNlLjwvbGk+CisKKyAgPGxpPiBTaGF3biBSaWxleTombmJzcDsgVXNlciBjYW4gbm93IHNwZWNpZnkgYSBjb21wcmVzc2lvbgorcmF0aW8gKC0tY29tcCAmbHQ7YXJnJmd0OykgaW5zdGVhZCBvZiBhIGJpdCByYXRlLiZuYnNwOworRGVmYXVsdCBzZXR0aW5ncyBiYXNlZCBvbiBhIGNvbXByZXNzaW9uIHJhdGlvIG9mIDExLjA8L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6Jm5ic3A7IGZyZWUgZm9ybWF0IGJpdHN0cmVhbXMgY2FuIGJlCitjcmVhdGVkIHdpdGggLS1mcmVlZm9ybWF0LCBhbmQgc3BlY2lmeSBhbnkgaW50ZWdlciBiaXRyYXRlIGZyb20gOCB0bworMzIwa2JzIHdpdGggLWIuPC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiBsYW1lIGJlIHVzZWQgYXMgYSBkZWNvZGVyIChvdXRwdXQgcmF3IHBjbQorb25seSk6Jm5ic3A7IGxhbWUgLS1kZWNvZGUgaW5wdXQubXAzIG91dHB1dC5wY208L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy43MCZuYnNwOyZuYnNwOyBBcHJpbCA2IDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiAiTEFNRSAzLjY5YmV0YSIgYmVjb21lcyBMQU1FIDMuNzAgInN0YWJsZSI8L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy42OWJldGEmbmJzcDsmbmJzcDsgQXByaWwgNiAyMDAwPC9oMz4KKworPHVsPgorCisgIDxsaT4gInNwYWhtIjombmJzcDsgZGVmYXVsdCBtb2RlIHNlbGVjdGlvbiBidWcKK2ZpeGVkLiZuYnNwOyBJbiBzb21lIGNhc2VzLCBsYW1lIHdhcyBkZWZhdWx0aW5nIHRvIHJlZ3VsYXIgc3RlcmVvCitpbnN0ZWFkIG9mIGpzdGVyZW8gd2hlbiB0aGUgdXNlciBkaWQgbm90IHNwZWNpZnkgYSBtb2RlLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjY4YmV0YSZuYnNwOyBBcHJpbCA0IDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiBNYXJrIFRheWxvcjogbW9ubyBlbmNvZGluZyBidWcgaW4gRExMIGZpeGVkLjwvbGk+CisKKyAgPGxpPiBJbmdvIFNhaXR6OiBidWcgaW4gLS1jd2xpbWl0IGFyZ3VtZW50IHBhcnNpbmcgZml4ZWQuPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5TY290dCBNYW5seTogYnVnIGluCis0LXBvaW50IHJlc2FtcGxlIGNvZGUgZml4ZWQuPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjY3YmV0YSZuYnNwOyBNYXJjaCAyNyAyMDAwPC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlJvYmVydAorSGVnZW1hbm46Jm5ic3A7IGpzdGVyZW8gbm93IGVuYWJsZWQgZm9yIE1QRUcyIGVuY29kaW5nczwvZm9udD48L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6IG9sZCBNL1Mgc3RlcmVvIG1vZGUgd2hpY2ggdXNlZCBML1IgbWFza2luZ3MKK2hhcyBiZWVuIHJlbW92ZWQuPC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiBYaW5nIE1QRUcyIFZCUiBoZWFkZXJzIG5vdyB3b3JraW5nLjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TWFyayBUYXlsb3I6Jm5ic3A7CitXaGVuIHF1YW50aXplZCBjb2VmZmljaWVudHMgYXJlIGFsbCAwIGluIGEgYmFuZCwgc2V0IHNjYWxlZmFjdG9ycyB0byAwCithbHNvIHRvIHNhdmUgYSBmZXcgYml0cy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5JbmdvIFNhaXR6OiZuYnNwOworUHJvYmxlbXMgd2l0aCBmcmFtZXNpemUgY2FsY3VsYXRpb24gd2hlbiB1c2luZyAtZiBmYXN0LW1hdGggb3B0aW9uCitmaXhlZC48L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNjZiZXRhIE1hcmNoIDIxIDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiBCdWcgZml4ZXMgaW4gQmxhZGVFbmMgRExMLCBwb3NzaWJsZSBjbGljayBpbiBsYXN0IG1wMworZnJhbWUsIFZCUiBoaXN0b3JncmFtIGRpc3BsYXksIGJ5dGVzd2FwcGluZyBvcHRpb24sIEFTTSBxdWFudGl6ZQorcm91dGluZXMgd29yayBmb3IgYm90aCBmbG9hdCBhbmQgZG91YmxlLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjY1YmV0YSZuYnNwOyZuYnNwOyBNYXJjaCAxNyAyMDAwPC9oMz4KKworPHVsPgorCisgIDxsaT4gRW5hYmxlZCBBU00gdmVyc2lvbiBvZiBxdWFudGl6ZV94cnBvdygpIC0gYWNjaWRlbnRseQorZGlzYWJsZWQgaW4gbGFtZTMuNjQuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNjRiZXRhJm5ic3A7IE1hcmNoIDE2IDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiBEb24gTWVsdG9uOiZuYnNwOyBpZDN2MS4xIHRhZ3MgJmFtcDsgaWQzIGJ1Z2ZpeGVzPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5HYWJyaWVsCitCb3V2aWduZTombmJzcDsgTC9SIG1hdGNoaW5nIGJsb2NrIHR5cGUgZml4PC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+QnVnIGZpeGVkIHdoaWNoIHdhcworYWxsb3dpbmcgcXVhbnRpemVkIHZhbHVlcyB0byBleGNlZWQgdGhlIG1heGltdW0gd2hlbiBub3QgdXNpbmcgLWg8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5NYXJrIFRheWxvcjogRml0bGVycworYmFzZWQgb24gcG9seXBoYXNlIGZpbHRlcmJhbmsuJm5ic3A7IHNob3VsZCBiZSBzbGlnaHRseSBiZXR0ZXIKK3NpbmNlIHRoZSByZXNwb25jZSBpcyBpbmRlcGVuZGVudCBvZiB0aGUgYmxvY2t0eXBlLCBhbmQgdGhleSBhcmUKK3NsaWdodGx5IGZhc3Rlci48L2ZvbnQ+PC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiBBUEk6Jm5ic3A7IHRoZSBBUEkgY2hhbmdlZCBzbGlnaHRseSAtIGFuZAordGhpcyBzaG91bGQgYmUgdGhlIGZpbmFsIHZlcnNpb24uIFRoZXJlIGlzIGEgbmV3IHJvdXRpbmU6CitsYW1lX2VuY29kZV9idWZmZXIoKSB3aGljaCB0YWtlcyBhbiBhcmJyaXRyYXkgc2l6ZWQgaW5wdXQgYnVmZmVyLAorcmVzYW1wbGVzICZhbXA7IGZpbHRlcnMgaWYgbmVjZXNzYXJ5LCBlbmNvZGVzLCBhbmQgcmV0dXJucyB0aGUKK21wM2J1ZmZlci4mbmJzcDsgVGhlcmUgYXJlIGFsc28gc2V2ZXJhbCBuZXcgI2RlZmluZXMsIHNvIGl0IGlzCitwb3NzaWJsZSB0byBjb21waWxlIGEgc2ltcGxlIGVuY29kaW5nIGxpYnJhcnkgd2l0aCBubyBkZWNvZGluZyBvciBmaWxlCitJL08gb3IgY29tbWFuZCBsaW5lIHBhcnNpbmcuJm5ic3A7IHNlZSB0aGUgZmlsZSBBUEkgZm9yIGRldGFpbHMuPC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiBNU1ZDIHN0dWZmOiZuYnNwOyBsYW1lLmV4ZSAod2l0aCBhbmQKKyAgICB3aXRob3V0IHRoZSBmcmFtZSBhbmFseXplcikgYW5kIHRoZSBDRGV4IGxhbWVfZW5jLmRsbAorICAgIHNob3VsZCBjb21waWxlIHVuZGVyIE1TVkMuJm5ic3A7IFRoZSBNU1ZDNSBwcm9qZWN0IGZpbGVzIG1heSBuZWVkCisgICAgc29tZSB0d2Vha2luZy4mbmJzcDsgSW4gcGFydGljdWxhciwKKyAgICB5b3UgbmVlZCB0byBtYWtlIHN1cmUgTEFNRVBBUlNFLCBMQU1FU05ERklMRSBhbmQgSEFWRU1QR0xJQgorICAgIGFyZSBkZWZpbmVkLiZuYnNwOyAoYW5kIEhBVkVHVEsgZm9yIHRoZSBHVEsgc3R1ZmYpLjwvbGk+Cis8L3VsPgorCis8aDM+IExBTUUgMy42M2JldGEmbmJzcDsgRmVicnVhcnkgMjAmbmJzcDsgMjAwMDwvaDM+CisKKzx1bD4KKworICA8bGk+IFJvYmVydCBIZWdlbWFubjombmJzcDsgRlBFIHdpdGggLWggZml4ZWQ/PC9saT4KKworICA8bGk+IE1hdGhleSBIZW5kcnk6Jm5ic3A7IEZQRSBlcnJvciBjYXRjaGluZyBmb3IgQ3lnd2luLAorRlBFIGZpeCBmb3IgdmJyIG1vZGUgYW5kIG91dHB1dCB0byAvZGV2L251bGw8L2xpPgorCisgIDxsaT4gSmVyZW15IEhhbGw6Jm5ic3A7IEZpeGVkIHByb2JsZW1zIHdpdGggaW5wdXQgZmlsZXMKK3doZXJlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3Qga25vd24uPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5NYXRoZXcKK0hlbmRyeTombmJzcDsgQVNNIHF1YW50aXplX3hycG93KCkgZm9yIEdOVSBpMzg2PC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+V2lsZnJpZWQKK0JlaG5lJm5ic3A7IHF1YW50aXplX3hycG93ICgpZm9yIFBvd2VyUEMgYW5kIG5vbi1BU008L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IEdPR08gRkZUcyZuYnNwOyAobm90IHlldCB1c2VkPyk8L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNjJiZXRhJm5ic3A7Jm5ic3A7IEZlYnJ1YXJ5IDkgMjAwMDwvaDM+CisKKzx1bD4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMDAwMDAwIj5Jd2FzYSBLYXptaTombmJzcDsKK2ZyYW1lIGFuYWx5emVyIHNob3J0IGJsb2NrIGRpc3BsYXkgb2Ygc2luZ2xlIHN1YmJsb2NrcyAocHJlc3MKKzEsMiZuYnNwOyBvciAzKTwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMwMDAwMDAiPkluZ28gU2FpdHo6Jm5ic3A7CistLWhlbHAgb3B0aW9uIGFkZGVkLCB3aXRoIG91dHB1dCB0byBzdGRvdXQ8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5BbGZyZWQgV2V5ZXJzOiBzaG9ydAorYmxvY2sgQUFDIHNwcmVhZGluZyBmdW5jdGlvbiBidWcgZml4ZWQ8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IG5ldyBzY2FsZWZhYyBkYXRhIHN0cnVjdHVyZSAtIGltcHJvdmVzIHBlcmZvcm1hbmNlITwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkxpb25lbAorQm9ubmV0OiZuYnNwOyBCdWcgZml4ZWQgaW4gTVBFRzIgc2NhbGVmYWN0b3Igcm91dGluZTogc2NhbGVmYWN0b3JzCit3ZXJlIGJlaW5nIHNldmVybHkgbGltaXRlZC48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IGZhc3RlciBGRlQgcm91dGluZXMgZnJvbS4mbmJzcDsgVGhlc2Ugcm91dGluZXMKK2FyZSBhbHNvIGNvbXBhdGlibGUgd2l0aCB0aGUgR09HTyByb3V0aW5lcywgaW4gY2FzZSBzb21lb25lIGlzCitpbnRlcmVzdGVkIGluIHBvcnRpbmcgdGhlbSBiYWNrIHRvIExBTUUuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+U2lnYmomb3NsYXNoO3JuCitTa2omYWVsaWc7cmV0LCBUYWtlaGlybyBUb21pbmFnYTombmJzcDsgZmFzdGVyIHBvdygpIGNvZGUuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Sm9hY2hpbQorS3VlYmFydDombmJzcDsgRm91bmQgc29tZSB1bml0aWFsaXplZCB2YXJpYWJsZXMgdGhhdCB3ZXJlIGVmZmVjdGluZworcXVhbGl0eSBmb3IgZW5jb2RpbmdzIHdoaWNoIGRpZCBub3QgdXNlIHRoZSAtaCBvcHRpb24gKG5vdyBmaXhlZCkuPC9mb250PjwvbGk+CisKKyAgPGxpPiBNYXJrIFRheWxvcjogTW9yZSBtb2R1bGFyaXphdGlvbiB3b3JrLiZuYnNwOyZuYnNwOworSXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSBMQU1FIGFzIGEgbGlicmFyeSB3aGVyZSB5b3UgY2FuIHNldCB0aGUKK2VuY29kaW5nIHBhcmFtZXRlcnMgZGlyZWN0bHkgYW5kIGRvIHlvdXIgb3duIGZpbGUKK2kvby4mbmJzcDsmbmJzcDsgVGhlIGNhbGxpbmcgcHJvZ3JhbSBpcyBub3cgaXQncyBvd24gbXAzCitvdXRwdXQuJm5ic3A7IEZvciBhbiBleGFtcGxlIG9mIHRoZSBMQU1FIEFQSSwgc2VlIG1haW4uYywgb3IKK21wM3J0cC5jIG9yIG1wM3guYy4mbmJzcDsgVGhlc2UgY2FuIGFsbCBiZSBjb21waWxlZCBhcyBzdGFuZCBhbG9uZQorcHJvZ3JhbXMgd2hpY2ggbGluayB3aXRoIGxpYm1wM2xhbWUuYS48L2xpPgorCisgIDxsaT4gRmVsaXggdm9zIExlaXRuZXI6Jm5ic3A7IG1wM3J0cCBmaXhlcy4mbmJzcDsKK21wM3J0cCBpcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbSB3aGljaCB3aWxsIGVuY29kZSBhbmQgc3RyZWFtIHdpdGggUlRQLjwvbGk+CisKKyAgPGxpPiBSb2JlcnQgSGVnZW1hbm46Jm5ic3A7IEluZm9ybWF0aW9uIHdyaXR0ZW4gdG8gc3RkZXJyCitkaXNwbGF5aW5nIGV4YWN0bHkgd2hpY2ggdHlwZSBvZiBsb3dwYXNzIGZpbHRlciAoaWYgYW55KSBpcyBiZWluZyB1c2VkLjwvbGk+CisKKyAgPGxpPiBJd2FzYSBLYXptaTombmJzcDsgbXBnbGliICh0aGUgbXBnMTIzIGRlY29kZXIpIHNjc2ZpCitkZWNvZGluZyBmaXhlcy48L2xpPgorCisgIDxsaT4gVGFrZWhpcm8gVG9taW5hZ2E6Jm5ic3A7IE1vcmUgbXBnbGliIHNjc2ZpIGRlY29kaW5nCitmaXhlcy48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy42MWJldGEmbmJzcDsgSmFudWFyeSAxNCAyMDAwPC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk1hcmsgVGF5bG9yOiBGaXhlZCBidWcKK3dpdGggbG93cGFzcyBmaWx0ZXJzIHdoZW4gdXNpbmcgVkJSIHdpdGggYSA2NGticyBvciBsb3dlciBtaW4gYml0cmF0ZQorc2V0dGluZy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IG1vcmUgZWZmaWNpZW50IGh1ZmZtYW4gZW5jb2Rpbmcgc3BsaXR0aW5nLjwvZm9udD48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy42MGJldGEmbmJzcDsmbmJzcDsgSmFudWFyeSA5IDIwMDA8L2gzPgorCis8dWw+CisKKyAgPGxpPiBNYXJrIFRheWxvcjogRGlzdHJpYnV0aW9uIG5vdyBjb21lcyB3aXRoIHNlbGYKK3Rlc3QuJm5ic3A7IE5lZWRzIHdvcmsgdG8gYmUgYXV0b21hdGVkLCBzZWUgJ21ha2UgdGVzdCcgaW4gTWFrZWZpbGUuPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5NYXJrIFRheWxvcjogQUFDCitzcHJlYWRpbmcgZnVuY3Rpb24gbm93IHRoZSBkZWZhdWx0PC9mb250PjwvbGk+CisKKyAgPGxpPiBHYWJyaWVsIEJvdXZpZ25lOiB1cGRhdGVkIEhUTUwgZG9jczwvbGk+CisKKyAgPGxpPiBGZWxpeCB2b24gTGVpdG5lcjogY29tcHV0ZSBjb3JyZWN0IGZpbGUgbGVuZ3RoIGZyb20gWGluZworaGVhZGVyIChpZiBwcmVzZW50KSB3aGVuIGlucHV0IGZpbGUgaXMgYSBtcDMgZmlsZTwvbGk+CisKKyAgPGxpPiBGZWxpeCB2b24gTGVpdG5lcjogbXAzcnRwIChzdGFuZGFsb25lKSBwcm9ncmFtIG5vdworaW5jbHVkZWQuJm5ic3A7IE5vdCB5ZXQgdGVzdGVkLiZuYnNwOyBtcDNydHAKK2lwOnBvcnQ6dHRsJm5ic3A7ICZsdDtpbmZpbGUmZ3Q7Jm5ic3A7Jm5ic3A7CisvZGV2L251bGwgd2lsbCBzdHJlYW0gZGlyZWN0bHkgdG8gaXA6cG9ydCB1c2luZyZuYnNwOyBSVFAuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNTliZXRhJm5ic3A7IEphbnVhcnkgNCAyMDAwPC9oMz4KKworPHVsPgorCisgIDxsaT4gVGFrZWhpcm8gVG9taW5hZ2E6Jm5ic3A7IC0tbm9hdGggb3B0aW9uLiZuYnNwOworRGlzYWJsZXMgQVRIIG1hc2tpbmdzLjwvbGk+CisKKyAgPGxpPiBHYWJyaWVsIEJvdXZpZ25lOiZuYnNwOyB1cGRhdGVkIEhUTUwgZG9jcy48L2xpPgorCisgIDxsaT4gSXdhc2EgS2F6bWk6Jm5ic3A7IG1ha2VmaWxlIGZpeGVzPC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiZuYnNwOyBGaXhlZCBidWcgd2hlcmUgZmlyc3QgZnJhbWUgb2YgZGF0YQord2FzIGFsd2F5cyBvdmVyd3JpdHRlbiB3aXRoIDAncy4mbmJzcDsgVGhhbmtzIHRvICdnb2wnPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5NYXJrIFRheWxvcjombmJzcDsKK2J1ZyBmaXhlcyBpbiBtaWQvc2lkZSBtYXNraW5nIHJhdGlvcyAodGhhbmtzIHRvIE1lbm5vIEJha2tlcik8L2ZvbnQ+PC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiZuYnNwOyByZXBsYWNlZCBub3JtX2wsIG5vcm1fcyB0YWJsZSBkYXRhCit3aXRoIGZvcm11bGFzLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjU4YmV0YSZuYnNwOyBEZWNlbWJlciAxMyAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlNlZ2hlcgorQm9lc3Nlbmtvb2w6Jm5ic3A7IE1vcmUgYWNjdXJhdGUgcXVhbnRpemF0aW9uIHByb2NlZHVyZSEmbmJzcDsKK0VuYWJsZWQgd2l0aCAtaC48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5NYXRoZXcgSGVuZHJ5LCBBY3kKK1N0YXBwIGFuZCBUYWtlaGlybyBUb21pbmFnYTogQVNNIG9wdGltaXphdGlvbnMgZm9yIHF1YW50aXplX3hycG93IGFuZAorcXVhbnRpemVfeHJwb3dfSVNPLjwvZm9udD48L2xpPgorCisgIDxsaT4gQ2h1Y2sgWmVua3VzOiZuYnNwOyAiZW5jb2RlciBpbnNpZGUiIGxvZ28gb24gd2ViIHBhZ2U8L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6Jm5ic3A7Jm5ic3A7IGEgY291cGxlIHBlb3BsZSBoYXZlCithc2tlZCBmb3IgdGhpcy4mbmJzcDsmbmJzcDsgQWxsb3cgTEFNRSB0byBvdmVyaWRlCitWQlJfbWluX2JpdHJhdGUgaWYgYW5hbG9nX3NpbGVuY2UgZGV0ZWN0ZWQuJm5ic3A7Jm5ic3A7CitBbmFsb2dfc2lsZW5jZSBkZWZpbmVkIGEgbGEgUm9iZXJ0OiZuYnNwOyZuYnNwOworZW5lcmd5Jm5ic3A7ICZsdDsgQVRILjwvbGk+CisKKyAgPGxpPiBBbiBWYW4gTGFtOiBWYWxpZCBiaXRyYXRlcyB3ZXJlIGJlaW5nIHByaW50ZWQgZm9yIGxheWVyIDIsCitub3QgbGF5ZXIgMyE8L2xpPgorCisgIDxsaT4gRXRoYW4gWWVvOiZuYnNwOyBNYWtlZmlsZS5NU1ZDIHVwZGF0ZWQ8L2xpPgorCisgIDxsaT4gTWFyayBTdGVwaGVuczombmJzcDsgdXBkYXRlZCBhbGwgTVNWQyBwcm9qZWN0IGZpbGVzPC9saT4KKworICA8bGk+IFJvYmVydCBIZWdlbWFubjombmJzcDsgbG93cGFzcyBhbmQgaGlnaHBhc3MgZmlsdGVycworY2FuIGJlIGVuYWJsZWQgd2l0aCAtLWxvd3Bhc3MsIC0taGlnaHBhc3M8L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk1hcmsgVGF5bG9yOiZuYnNwOworTVMgc3dpdGNoaW5nIGlzIG5vdyBzbW9vdGhlcjogbXNfcmF0aW8gYXZlcmFnZSBvdmVyIDQgZ3JhbnVsZXM8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IFNjYWxlZmFjdG9yIHByZS1lbXBoYXNpcyBmaXhlZCAoYW5kIG5vdyB0dXJuZWQgYmFjaworb24pPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+VGFrZWhpcm8KK1RvbWluYWdhOiZuYnNwOyBCdWcgaW4gTS9TIG1hc2tpbmdzOiZuYnNwOyBzd2l0Y2ggdG8gdHVybiBvbgorc3RlcmVvIGRlbWFza2luZyBjb2RlIHdhcyBidWdneS48L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNTdiZXRhJm5ic3A7IE5vdmVtYmVyIDIyIDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiBTaWdiaiZvc2xhc2g7cm4gU2tqJmFlbGlnO3JldCwgcGF0Y2ggdG8gYWxsb3cKK2VuY29kaW5nIGZyb20gOGJpdCBpbnB1dCBmaWxlcyB3aGVuIHVzaW5nIExJQlNOREZJTEU8L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6IEF1dG9tYXRpYyBkb3duc2FtcGxpbmcgdG8gbmVhcmVzdCB2YWxpZAorc2FtcGxlcmF0ZS48L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6IFNjYWxlZmFjdG9yIGJhbmRzIGRlbWFya2VkIG9uIE1EQ1QgcGxvdCBpbgorZnJhbWVhbmFseXplcjwvbGk+CisKKyAgPGxpPiBNYXJrIFRheWxvcjogU2NhbGVmYWN0b3IgcHJlZW1waGFzaXMgZGlzYWJsZWQgZm9yCitub3cuJm5ic3A7Jm5ic3A7IFRoZSBhbGdvcml0aG0gd2FzIG9mdGVuIGRvaW5nIG1vcmUgaGFybSB0aGFuCitnb29kLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjU2YmV0YSZuYnNwOyBOb3ZlbWJlciAxOSAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gS2ltbW8gTXVzdG9uZW46IHBvcnRhYmlsdHkgY29kZSBjbGVhbnVwLjwvbGk+CisKKyAgPGxpPiBWbGFkaW1pciBNYXJlazogaWQzIGdlbnJlIHBhdGNoLjwvbGk+CisKKyAgPGxpPiBDb25yYWQgU2FuZGVyc29uOiBuZXcgYXBwbHlwYXRjaCBzY3JpcHQuPC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiBJbml0aWFsIHdpbmRvdyB0eXBlIG5vdyAiU1RPUF9UWVBFIiB0byByZWR1Y2UKK2luaXRpYWwgYXR0ZW51YXRpb24uJm5ic3A7IFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIG5ldyBlbmNvZGVyCitkZWxheSBpcyBzbyBzaG9ydC4mbmJzcDsgV2l0aCBhIE5PUk1fVFlQRSwgdGhlIGZpcnN0IDI0MCBzYW1wbGVzCit3b3VsZCBiZSBhdHRlbnVhdGVkLjwvbGk+CisKKyAgPGxpPiBNYXJrIFRheWxvcjogUGFkZGluZyBhdCBlbmQgb2YgZmlsZSBub3cgYWRqdXN0ZWQKKyhob3BlZnVsbHkhKSB0byBwcm9kdWNlIGFzIGxpdHRsZSBwYWRkaW5nIGFzIHBvc3NpYmxlIHdoaWxlIHN0aWxsCitndWFyYW50ZWUgYWxsIGlucHV0IHNhbXBsZXMgYXJlIGVuY29kZWQuPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IFJlZHVjZWQgc2hvcnRibG9jayBleHRyYSBiaXQgYWxsb2NhdGlvbiBmb3JtdWxhcyBieQorMTAlIHNpbmNlIG5ldyBodWZmbWFuIGNvZGluZyBpcyBhdCBsZWFzdCAxMCUgbW9yZSBlZmZpY2llbnQuPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjU1YmV0YSZuYnNwOyBOb3ZlbWJlciAxMSAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gQWxiZXJ0IEZhYmVyOiZuYnNwOyB1cGRhdGVkIEJsYWRlRW5jLmRsbDwvbGk+CisKKyAgPGxpPiBNYXJrIFRheWxvcjogU2ltcGxlIGxvd3Bhc3MgZmlsdGVyIGFkZGVkIHRvIGxpbmVhcgorZG93bnNhbXBsaW5nIHJvdXRpbmUuPC9saT4KKworICA8bGk+IE5pbHMgRmFlcmJlcjogdXBkYXRlZCBtYW4gcGFnZS48L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6IEFsbCBmbG9hdGluZyBwb2ludCB2YXJpYWJsZXMgYXJlIGRlbGNhcmVkCitGTE9BVCBvciZuYnNwOyBGTE9BVDguJm5ic3A7IENoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBGTE9BVDggaW4KK21hY2hpbmUuaCB0byBydW4gYXQgMzJiaXQgcHJlY2Vpc2lvbi48L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6IEJ1ZyAoaW50cm9kdWNlZCBpbiAzLjU0YmV0YSkgaW4KK3N0ZXJlby0mZ3Q7bW9ubyBkb3duc2FtcGxpbmcgZml4ZWQuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNTRiZXRhJm5ic3A7IE5vdmVtYmVyIDggMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IE1hcmsgVGF5bG9yOiBFbmNvZGVyIGRlbGF5IGlzIG5vdyA0OCBzYW1wbGVzLiZuYnNwOworQ2FuIGJlIGFkanVzdGVkIHRvIDExNjAgdG8gc3luYyB3aXRoIEZoRyAoc2VlIEVOQ0RFTEFZIGluCitlbmNvZGVyLmgpJm5ic3A7IFRoaXMgaXMga2luZCBvZiBhbWF6aW5nLCBzaW5jZSBpZiBUYWtlaGlybyBwdXQgaGlzCitNRENUL2ZpbHRlcmJhbmsgcm91dGluZSBpbiBhIGRlY29kZXIsIHdlIGNvdWxkIGhhdmUgYSB0b3RhbCZuYnNwOworZGVsYXkgb2Ygb25seSA5NiBzYW1wbGVzLjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TWFyayBUYXlsb3I6IE1vcmUKK2luY29uc3RhbmNpZXMgZm91bmQgYW5kIGZpeGVkIGluIE1QRUcyIHRhYmxlcy48L2ZvbnQ+PC9saT4KKworICA8bGk+IE1hcmsgVGF5bG9yOiBSZXNhbXBsaW5nIGZyb20gYW4gTVAzIGlucHV0IGZpbGUgbm93Cit3b3Jrcy4mbmJzcDsgQnV0IHdlIHN0aWxsIGRvbnQgaGF2ZSBhIGxvd3Bhc3MgZmlsdGVyIHNvIGRvbnQgZXhwZWN0Citnb29kIHJlc3VsdHMuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNTNiZXRhJm5ic3A7IE5vdmVtYmVyIDggMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IEZpeGVkIE1QRUcyIHByb2JsZW0gaW4gbmV3IE1EQ1Qgcm91dGluZXMuJm5ic3A7CitUYWtlaGlybydzIGNvbWJpbmVkIGZpbHRlcmJhbmsvTURDVCByb3V0aW5lIGlzIG5vdyB0aGUKK2RlZmF1bHQuJm5ic3A7IFJlbW92ZXMgYWxsIGJ1ZmZlcmluZyBmcm9tIHBzeW1vZGVsLmMgYW5kIHRoZQorZmlsdGVyYmFua3MvTURDVCByb3V0aW5lcy48L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNTJiZXRhJm5ic3A7IE5vdmVtYmVyIDggMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IEJ5IHBlcm1pc3Npb24gb2YgY29weXJpZ2h0IGhvbGRlcnMgb2YgYWxsIEdQTCBjb2RlIGluCitMQU1FLCZuYnNwOyBhbGwgR1BMIGNvZGUgaXMgbm93IHJlbGVhc2VkIHVuZGVyIGEgbW9kaWZpZWQgdmVyc2lvbgorb2YgdGhlIExHUEwgKHNlZSB0aGUgUkVBRE1FIGZpbGUpPC9saT4KKworICA8bGk+IEJ5IHBvcHVsYXIgZGVtYW5kLCBhbGwgQysrIGNvbW1lbnRzIGNoYW5nZWQgdG8gQyBzdHlsZQorY29tbWVudHM8L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6IExpbmVhciByZXNhbXBsaW5nIG5vdyB3b3Jrcy4mbmJzcDsgVXNlCistLXJlc2FtcGxlIHRvIHNldCBhbiBvdXRwdXQgc2FtcGxlcmF0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgaW5wdXQKK3NhbXBsZXJhdGUuJm5ic3A7IChkb2Vzbid0IHNlZW0gdG8gd29yayB3aXRoIG1wMyBpbnB1dCBmaWxlcywgYW5kCit0aGVyZSBpcyBubyBsb3dwYXNzIGZpbHRlciwgc28gZG9udCBleHBlY3QgZ29vZCByZXN1bHRzIGp1c3QgeWV0KTwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+VGFrZWhpcm8KK1RvbWluYWdhOiZuYnNwOyBGYXN0ZXIgSHVmZm1hbiBlbmNvZGluZyByb3V0aW5lczwvZm9udD48L2xpPgorCis8L3VsPgorCis8Zm9udCBjb2xvcj0iIzMzNjZmZiI+VGhlIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBkaXNhYmxlZAorYmVjYXVzZSBvZiBNUEVHMiBwcm9ibGVtcy4mbmJzcDsgQnV0IHRvIHRyeSB0aGVtLCBzZXQgTURDVERFTEFZPTQ4CitpbiBlbmNvZGVyLmgsIGluc3RlYWQgb2YgTURDVERFTEFZPTUyOC46PC9mb250PgorPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPlRha2VoaXJvCitUb21pbmFnYTombmJzcDsgTmV3IE1EQ1Qgcm91dGluZXMgd2l0aCBzaG9ydGVyIGRlbGF5ICg0OCBzYW1wbGVzCitpbnN0ZWFkIG9mIDUyOCkgYW5kIGV2ZW4gZmFzdGVyIHRoYW4gdGhlIG9sZCByb3V0aW5lcy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IFJlbW92ZWQgZXh0cmEgYnVmZmVyaW5nIGluIHBzeW1vZGVsLmM8L2ZvbnQ+PC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuNTEmbmJzcDsgTm92ZW1iZXIgNyAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gVGFrZWhpcm8gVG9taW5hZ2E6IEJ1ZyBpbiBxdWFudGl6ZS5jIGFic29sdXRlIHRocmVzaG9sZCBvZgoraGVhcmluZyBjYWxjdWxhdGlvbiBmb3Igbm9uLTQ0LjEga0h6IGlucHV0IGZpbGVzLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjUwJm5ic3A7IE5vdmVtYmVyIDEgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IExBTUUgMy4zN2JldGEgYmVjb21lcyBvZmZpY2lhbCBMQU1FIDMuNTAgcmVsZWFzZTwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjM3YmV0YSZuYnNwOyBOb3ZlbWJlciAxIDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TGlvbmVsCitCb25uZXQ6Jm5ic3A7IEZvdW5kIHNldmVyZSBidWcgaW4gTVBFRzIgU2hvcnQgYmxvY2sgU05SLjwvZm9udD48L2xpPgorCisgIDxsaT4gU2VyZ2V5IFNhcGVsaW46Jm5ic3A7IFZCUiBUb2MgaW1wcm92ZW1lbnQuPC9saT4KKworICA8bGk+IFNlcmdleSBEdWJvdjogZnNraXAoKSByb3V0aW5lPC9saT4KKworICA8bGk+IENvbnJhZCBTYW5kZXJzb246IHJlcGxhY2VtZW50IGZvcgorZmlsdGVyYmFuay5jLiZuYnNwOyZuYnNwOyBOb3QgbXVjaCBmYXN0ZXIgYnV0IGFtYXppbmdseSBzaW1wbGVyLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjM2YmV0YSZuYnNwOyBPY3RvYmVyIDI1IDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiBBbGJlcnQgRmFiZXI6Jm5ic3A7IG1vcmUgTVNWQyBhbmQgQmxhZGVETEwgdXBkYXRlczwvbGk+CisKKyAgPGxpPiBLaW1tbyBNdXN0b25lbjombmJzcDsgTXVjaCBjb2RlIGNsZWFudXAgYW5kIEFtaWdhCit1cGRhdGVzPC9saT4KKworICA8bGk+IEFudG9uIE9sZXluaWtvdjogQm9ybGFuZCBDIHVwZGF0ZXM8L2xpPgorCisgIDxsaT4gTWFyayBUYXlsb3I6IE1vcmUgc3RkaW4gZml4ZXM6Jm5ic3A7IEZvciBzb21lIHJlYXNvbiwKK2ZvcndhcmQgZnNlZWsoKSdzIHdvdWxkIGZhaWwgd2hlbiB1c2VkIG9uIHBpcGVzIGV2ZW4gdGhvdWdoIGl0IGlzIG9rYXkKK3dpdGggcmVkaXJlY3Rpb24gZnJvbSAiJmx0OyIuIFNvIEkgY2hhbmdlZCBhbGwgdGhlIGZvcndhcmQKK2ZzZWVrKCkncyB0byB1c2UgZnJlYWQoKS4mbmJzcDsgVGhpcyBzaG91bGQgaW1wcm92ZSBzdGRpbiBzdXBwb3J0Citmb3Igd2F2L2FpZmYgZmlsZXMuJm5ic3A7IElmIHlvdSBrbm93IHRoZSBpbnB1dCBmaWxlIGlzIHJhdyBwY20sCit5b3UgY2FuIHN0aWxsIHVzZSB0aGUgJy1yJyBvcHRpb24gdG8gYXZvaWQgKmFsbCogc2Vla2luZyBvZiBhbnkga2luZC48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4zNWJldGEmbmJzcDsgT2N0b2JlciAyMSAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkxlb25pZAorS3VsYWtvdjombmJzcDsgU2VyaW91cyBidWcgaW4gTVBFRzIgc2NhbGVmYWN0b3IgYmFuZCB0YWJsZXMgZml4ZWQuPC9mb250PjwvbGk+CisKKyAgPGxpPiBQb3J0YWJpbGl0eSBwYXRjaGVzIGZyb206Jm5ic3A7IEFudG9uIE9sZXluaWtvdiwKK1NpZ2JqJm9zbGFzaDtybiBTa2omYWVsaWc7cmV0LCBNYXRoZXcgSGVuZHJ5LCBSaWNoYXJkIEdvcnRvbjwvbGk+CisKKyAgPGxpPiBBbGZyZWQgV2V5ZXJzOiBjb21waWxlciBvcHRpb25zLCB1cGRhdGVkIHRpbWVzdGF0dXMuPC9saT4KKworICA8bGk+IEFsYmVydCBGYWJlcjombmJzcDsgQmxhZGVEbGwgYW5kIG90aGVyIHVwZGF0ZXMgKG5ldworbWFjaGluZS5oKS48L2xpPgorCisgIDxsaT4gTW9udHk6Jm5ic3A7IHVwZGF0ZWQgTWFrZWZpbGUgdG8gZml4IGdjYyBpbmxpbmUgbWF0aAorYnVnLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjM0YmV0YSZuYnNwOyBPY3RvYmVyIDEyIDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TWFyayBUYXlsb3I6IEJ1ZworZml4ZWQ6Jm5ic3A7IG1pbmltdW0gYml0cmF0ZSBpbiBWQlIgbW9kZSBjb3VsZCBiZSBpZ25vcmVkIGZvciBhIGZldworZnJhbWVzLjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk1hcmsgVGF5bG9yOiBOZXcKKyhtaW5vcikgVkJSIHR1bmluZ3MuPC9mb250PjwvbGk+CisKKyAgPGxpPiBUaW0gUnVkZGljazogTmV3IHdhdi9haWZmIGhlYWRlciBwYXJzaW5nCityb3V0aW5lcy4mbmJzcDsgQmV0dGVyIHBhcnNpbmcgYW5kIGZld2VyIGZzZWVrKCkncy48L2xpPgorCisgIDxsaT4gQW50b24gT2xleW5pa292OiZuYnNwOyBwYXRjaGVzIHRvIHdvcmsgd2l0aCBCb3JsYW5kIEM8L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkdhYnJpZWwKK0JvdXZpZ25lOiZuYnNwOyBFeHBlcmltZW50YWwgdm9pY2Ugb3B0aW9uIGVuYWJsZWQgd2l0aCAtLXZvaWNlPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjMzYmV0YSZuYnNwOyBPY3RvYmVyIDExIDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+Um9iZXJ0IEhlZ2VtYW5uOiBSSAorVkJSIG1vZGUgbm93IHRoZSBkZWZhdWx0IGFuZCBvbmx5IFZCUiBtb2RlLiZuYnNwOyBUaGUgbmV3IGNvZGUgd2lsbAorYWx3YXlzIHF1YW50aXplIHRvIDAgZGlzdG9ydGlvbiBhbmQgdGhlIHF1YWxpdHkgaXMgaW5jcmVhc2VkIGJ5CityZWR1Y2luZyB0aGUgbWFza2luZyBmcm9tIHRoZSBwc3ktbW9kZWwuJm5ic3A7IC1YMCBpcyBzdGlsbCB0aGUKK2RlZmF1bHQgZm9yIG5vdy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5Sb2JlcnQgSGVnZW1hbm46IG5ldworLVg1IG1vZGU8L2ZvbnQ+PC9saT4KKworICA8bGk+IE1hdGhldyBIZW5kcnk6IE5ldyB0aW1pbmcgY29kZSwgcmVtb3ZlcyB0aGUgbmVlZCBmb3IKK0hBVkVUSU1FUzwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+TWF0aGV3CitIZW5kcnk6Jm5ic3A7IGFzc2VtYmxlciBxdWFudGl6ZV94cnBvdyBmb3IgV2luZG93czwvZm9udD48L2xpPgorCisgIDxsaT4gSXdhc2EgS2F6bWk6Jm5ic3A7IHN0ZGluL3N0ZG91dCBwYXRjaCBmb3IgV2luZG93czwvbGk+CisKKyAgPGxpPiBNYXJrIFRheWxvcjogTmV3IG9wdGlvbjogIi0tYXRob25seSIgd2lsbCBpZ25vcmUgdGhlCitwc3ktbW9kZWwgb3V0cHV0IGFuZCB1c2Ugb25seSB0aGUgYWJzb2x1dGUgdGhyZXNob2xkIG9mIGhlYXJpbmcgZm9yIHRoZQorbWFza2luZy48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4zMmJldGEmbmJzcDsgT2N0b2JlciA4IDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+VGFrZWhpcm8KK1RvbWluYWdhOiZuYnNwOyBmYXN0ZXIgbG9uZyBibG9jayBzcHJlYWRpbmcgZnVuY3Rpb24gY29udm9sdXRpb24KK2ZvciBub24gNDQuMSBrSHogc2FtcGxpbmcgZnJlcXVlbmNpZXMsIGFuZCBmYXN0ZXIgc2hvcnQgYmxvY2sgc3ByZWFkaW5nCitmdW5jdGlvbiBjb252b2x1dGlvbiBmb3IgYWxsIHNhbXBsaW5nIGZyZXF1ZW5jaWVzLjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlRha2VoaXJvCitUb21pbmFnYTombmJzcDsgQ29tcGxldGx5IHJld3JpdHRlbiBodWZmbWFuIHRhYmxlIHNlbGVjdGlvbiBhbmQKK2NvdW50X2JpdHMoKS4mbmJzcDsgTW9yZSBlZmZpY2llbnQgdGFibGUgc2VsZWN0aW9uIHJlc3VsdHMgaW4gbWFueQorbW9yZSBiaXRzIHBlciBmcmFtZS48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5UYWtlaGlybworVG9taW5hZ2E6Jm5ic3A7IE1vcmUgZWZmaWNpZW50IHNjYWxlZmFjIGNvbXByZXNzIHNldHRpbmcuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+TWlrZSBDaGVuZzogbmV3CitjYWxjX25vaXNlMigpPC9mb250PjwvbGk+CisKKyAgPGxpPiBBbGZyZWQgV2V5ZXJzOiBwYXRjaCBmb3IgdGltZXN0YXR1cygpIHNlY29uZHMgcm9sbG92ZXI8L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4zMWJldGEmbmJzcDsgU2VwdGVtYmVyIDI4IDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiBBbGJlcnQgRmFiZXI6Jm5ic3A7IHVwZGF0ZWQgaGlzIEJsYWRlRExMCitjb2RlLiZuYnNwOyBUaGlzIGFsbG93cyBMQU1FIHRvIGJlIGNvbXBpbGVkIGludG8gYSBCbGFkZUVuYworY29tcGF0aWFibGUgLmRsbC48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPk1pa2UgQ2hlbmc6IGZhc3RlcgorbDNwc3ljaG9fZW5lcigpIHJvdXRpbmUuPC9mb250PjwvbGk+CisKKyAgPGxpPiBTaWdiaiZvc2xhc2g7cm4gU2tqJmFlbGlnO3JldDogbW9yZSBjb2RlIGNsZWFudXAuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FJm5ic3A7IDMuMzBiZXRhJm5ic3A7IFNlcHRlbWJlciAyNyAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gQ29ucmFkIFNhbmRlcnNvbjombmJzcDsgSUQzIHRhZyBjb2RlIGFkZGVkICh0eXBlCisnbGFtZScgZm9yIGluc3RydWN0aW9ucyk8L2xpPgorCisgIDxsaT4gbmV3IG1kY3QuYyBmcm9tIE1pa2UgQ2hlbmcgKG5vIGZhc3RlciwgYnV0IG11Y2ggY2xlYW5lcgorY29kZSk8L2xpPgorCisgIDxsaT4gTWF0aGV3IEhlbmRyeTogTWljcm9zb2Z0IG5tYWtlIG1ha2VmaWxlIGFuZCBhIGNvdXBsZSBvdGhlcgorY2hhbmdlcyBmb3IgTVNWQzwvbGk+CisKKyAgPGxpPiBNb3JlIG1vZHVsaXphdGlvbiB3b3JrOiZuYnNwOyBPbmUgaW5wdXQgc291bmQgZmlsZQoraW50ZXJmYWNlIGhhbmRsZXMgbXAzJ3MsIHVuY29tcHJlc3NlZCBhdWRpbywgd2l0aCBvciB3aXRob3V0CitMSUJTTkRGSUxFLiZuYnNwOyBGaXhlcyAoaG9wZWZ1bGx5KSBhIGJ1bmNoIG9mIGZpbGUgSS9PIGJ1Z3MKK2ludHJvZHVjZWQgaW4gMy4yOSAoTWFyayBUYXlsb3IpPC9saT4KKworICA8bGk+IExBTUUgd2lsbCBub3cgcHJpbnQgdmFsaWQgc2FtcGxlcmF0ZS9iaXRyYXRlIGNvbWJpbmF0aW9ucworKE1hcmsgVGF5bG9yKTwvbGk+CisKKyAgPGxpPiBzdGRpbi9zdGRvdXQgZml4IGZvciBPUy8yIChQYXVsIEhhcnRtYW4pPC9saT4KKworICA8bGk+IEZvciBtcDMgaW5wdXQgZmlsZXMsIHRvdGFsZnJhbWVzIGVzdGltYXRlZCBiYXNlZCBvbgorZmlsZXNpemUgYW5kIGZpcnN0IGZyYW1lIGJpdHJhdGUuIChNYXJrIFRheWxvcik8L2xpPgorCisgIDxsaT4gVXBkYXRlZCBhbGwgZnVuY3Rpb25zIHdpdGggbmV3IHN0eWxlIHByb3RvdHlwZXMuJm5ic3A7CisoU2lnYmomb3NsYXNoO3JuIFNraiZhZWxpZztyZXQpPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuMjliZXRhJm5ic3A7IFNlcHRlbWJlciAyMSAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkJ1ZyBpbiBiaWd2X2JpdGNvdW50CitmaXhlZC4mbmJzcDsgTG9vcC5jIHdhcyBvdmVyZXN0aW1hdGluZyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkLAorcmVzdWx0aW5nIGluIHdhc3RlZCBiaXRzIGV2ZXJ5IGZyYW1lLiZuYnNwOyAoTGVvbmlkIEEuIEt1bGFrb3YpPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+QnVnIGluCisqX2Nob29zZV90YWJsZSgpIGZpeGVkJm5ic3A7Jm5ic3A7IFRoZXNlIHJvdXRpbmVzIHdvdWxkIG5vdAorc2VsbGVjdCB0aGUgb3B0aW1hbCBIdWZmbWFuIHRhYmxlIGluIHNvbWUgY2FzZXMuJm5ic3A7Jm5ic3A7CisoTGVvbmlkIEEuIEt1bGFrb3YpPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+VHVuaW5nIG9mIEFUSAorbm9ybWFsaXphdGlvbiAobWFjaWspPC9mb250PjwvbGk+CisKKyAgPGxpPiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMgYW5kIGZpeGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyhTaWdiaiZvc2xhc2g7cm4gU2tqJmFlbGlnO3JldCk8L2xpPgorCisgIDxsaT4gU2FtaSBGYXJpbiBzZW50IGEmbmJzcDsgLndhdiZuYnNwOyBmaWxlCit0aGF0Jm5ic3A7IExBTUUgYnVpbHQgaW4gc3VwcG9ydCBjaG9rZWQgb24uJm5ic3A7Jm5ic3A7IEkKK2FkZGVkIGEgc2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkIHdhdiBoZWFkZXIgcGFyc2luZyB0byBoYW5kbGUgdGhpcywKK2J1dCBpZiB5b3UgaGF2ZSB0cm91YmxlLCB1c2UgbGlic25kZmlsZS48L2xpPgorCisgIDxsaT4gUmVzYW1wbGluZyBob29rcyBhbmQgb3B0aW9ucyBhZGRlZC4mbmJzcDsgQnVmZmVyaW5nCithbmQgcmVzYW1wbGluZyByb3V0aW5lcyBuZWVkIHRvIGJlIHdyaXR0ZW4uPC9saT4KKworICA8bGk+IExBTUUgd2lsbCBub3cgdGFrZSBhbiBtcDMgZmlsZSBhcyBpbnB1dC4mbmJzcDsgV2hlbgorcmVzYW1wbGluZyBjb2RlIGlzIHdvcmtpbmcsIExBTUUgd2lsbCBiZSBhYmxlIHRvIChmb3IgZXhhbXBsZSkgY29udmVydAorYSBoaWdoIGJpdHJhdGUgc3RlcmVvIG1wMyB0byBhIGxvdyBiaXRyYXRlIG1vbm8gbXAzIGZvciBzdHJlYW1pbmcuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuMjhiZXRhJm5ic3A7IFNlcHRlbWJlciAxNSAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlNlcmlvdXMgYnVnIGZpeGVkIGluCitoaWdoIGZyZXF1ZW5jeSBNRENUIGNvZWZmaWNpZW50cy4mbmJzcDsgSHVmZm1hbiBjb2Rpbmcgd2FzCityZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSBjb3VudDEgYmxvY2sgcXVhZHJ1cGxlcy4mbmJzcDsmbmJzcDsKKyhMZW9uaWQgQS4gS3VsYWtvdik8L2ZvbnQ+PC9saT4KKworICA8bGk+IG5pbnQoKSBwcm9ibGVtcyB1bmRlciBUcnU2NCB1bml4IGZpeGVkIGFuZCBwcmVwcm9jZXNzb3IKK3ZhcmlhYmxlIEhBVkVfTklOVCByZW1vdmVkLiZuYnNwOyAoQm9iIEJlbGwpPC9saT4KKworICA8bGk+IENvbXBpbGVyIHdhcm5pbmcgZml4ZXMgYW5kIGNvZGUKK2NsZWFudXAmbmJzcDsmbmJzcDsgKFNpZ2JqJm9zbGFzaDtybiBTa2omYWVsaWc7cmV0LAorTGlvbmVsIEJvbm5ldCk8L2xpPgorCisgIDxsaT4gVVNBR0UgZmlsZSBub3cgaW5jbHVkZXMgc3VnZ2VzdGlvbnMgZm9yCitkb3duc2FtcGxpbmcuJm5ic3A7IEZvciBsb3cgYml0cmF0ZSBlbmNvZGluZ3MsIHByb3BlciBkb3duc2FtcGxpbmcKK2NhbiBnaXZlIGRyYW1hdGljYWxseSBiZXR0ZXIgcmVzdWx0cy4mbmJzcDsgKEpvaG4gSGF5d2FyZC1XYXJidXJ0b24pPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuMjdiZXRhJm5ic3A7IFNlcHRlbWJlciAxMiAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gU2V2ZXJhbCBidWdzIGluIGVuY29kZS5jIGFuZCBsM2JpdHN0cmVhbS5jIGZpeGVkIGJ5IExpb25lbAorQm9ubmV0LjwvbGk+CisKKyAgPGxpPiBCdWdzIGluIG5ldyBWQlIgKCNkZWZpbmUgUkgpIGZvcm11bGEgZm9yIG1vbm8gaW5wdXQgZmlsZQorYW5kIG1pZC9zaWRlIGVuY29kaW5nIGZpeGVkLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjI2YmV0YSZuYnNwOyBTZXB0ZW1iZXIgMTAgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IFRoZSAiLW0gbSIgb3B0aW9uIChtb25vIC5tcDMgZmlsZSkgd2lsbCBhdXRvbWF0aWNhbGx5IG1peAorbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgaWYgdGhlIGlucHV0IGZpbGUgaXMgc3RlcmVvLiZuYnNwOyAoQWxmcmVkCitXZXllcnMpPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5OZXcgcXVhbnRfY29tcGFyZQorYWxnb3JpdGhtIChtZXRob2QgZm9yIGRlY2lkaW5nIHdoaWNoIG9mIHR3byBxdWFudGl6YXRpb25zIGlzIGJldHRlcikKK2VuYWJsZWQgd2l0aCAtWDQgKEdyZWcgTWF4d2VsbCk8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5OZXcgbWlkL3NpZGUgVkJSIGJpdAorYWxsb2NhdGlvbiBmb3JtdWxhLiZuYnNwOyBNaWQgY2hhbm5lbCBiaXRzIGFyZSBzZXQgYnkgdGhlIHF1YWxpdHkKK3JlcXVpcmVtZW50cywgYW5kIHRoZW4gdGhlIHNpZGUgY2hhbm5lbCB1c2VzIGEgcmVkdWNlZCBudW1iZXIgb2YgYml0cworKGluIGEgcHJvcG9ydGlvbiBjb21pbmcgZnJvbSB0aGUgZml4ZWQgYml0cmF0ZSBjb2RlKS4mbmJzcDsgVGhpcworbWlnaHQgbm90IGJlIG9wdGltYWwsIGJ1dCBpdCBzaG91bGQgYmUgcHJldHR5IGdvb2QgYW5kIG5vIG9uZSBrbm93cword2hhdCB0aGUgb3B0aW1hbCBzb2x1dGlvbiBzaG91bGQgYmUuJm5ic3A7IChHcmVnIE1heHdlbGwpPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TmV3IFZCUiAoI2RlZmluZSBSSCkKK3R1bmluZ3MgYmFzZWQgb24gZGV0YWlsZWQgbGlzdGVuaW5nIHRlc3RzIGJ5IE1hY2lrIGFuZCBHcmVnIE1heHdlbGwuPC9mb250PjwvbGk+CisKKyAgPGxpPiBTaWdiaiZvc2xhc2g7cm4gU2tqJmFlbGlnO3JldCBmaXhlZCBzZXZlcmFsCitjb21waWxlciB3YXJuaW5ncyAod2hpY2ggdHVybmVkIG91dCB0byBiZSBwb3RlbnRpYWwgYnVncyk8L2xpPgorCisgIDxsaT4gVGFrZWhpcm8gVG9taW5hZ2EgZml4ZWQgYSBsb3cgYml0cmF0ZSBidWcgaW4gcmVkdWNlX3NpZGUoKTwvbGk+CisKKyAgPGxpPiBBbGZyZWQgV2V5ZXJzIGZpeGVkIHNvbWUgYnVmZmVyIG92ZXJmbG93cy48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk5ldyBBVEggKGFic29sdXRlCit0aHJlc2hvbGQgb2YgaGVhcmluZykgZm9ybXVsYSByZXBsYWNlcyBidWdneSBJU08gY29kZSwgYW5kCithZGRzJm5ic3A7IGFuYWxvZyBzaWxlbmNlIHRyZWF0bWVudCZuYnNwOyAocmVtb3ZhbCBvZgorY29lZmZpY2llbnRzIGJlbG93IGJlbG93IEFUSCkuJm5ic3A7Jm5ic3A7IFRoZXNlIGFyZSB0dXJuZWQgb24KK2J5IGRlZmF1bHQgYnV0IGhhdmUgbm90IGJlZW4gZnVsbHkgdGVzdGVkLiZuYnNwOyAoUm9iZXJ0IEhlZ2VtYW5uKTwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkJ1ZyBpbiBzaG9ydCBibG9jaworc3ByZWFkaW5nIGZ1bmN0aW9uIGZpeGVkLiZuYnNwOyAoUm9iZXJ0IEhlZ2VtYW5uKTwvZm9udD48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4yNWJldGEmbmJzcDsgQXVndXN0IDIyIDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiBTaWdiaiZvc2xhc2g7cm4gU2tqJmFlbGlnO3JldCBmaXhlZCBhIHplcm8gYnl0ZQorbWFsbG9jIGNhbGwuJm5ic3A7IFRoaXMgYnVnJm5ic3A7IHdhcyBpbnRyb2R1Y2VkIGluIDMuMjQgYW5kCitjYXVzZXMgcHJvYmxlbXMgb24gbm9uIExpbnV4IHN5c3RlbXMuPC9saT4KKworICA8bGk+IEJpdCBhbGxvY2F0aW9uIHJvdXRpbmVzIHdvdWxkIHNvbWV0aW1lcyBhbGxvY2F0ZSBtb3JlIHRoYW4KKzQwOTUgYml0cyB0byBvbmUgY2hhbm5lbCBvZiBvbmUgZ3JhbnVsZS4mbmJzcDsgQSBjb3VwbGUgb2YgcGVvcGxlCityZXBvcnRlZCBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlIGNhdXNlZCBieSB0aGlzLCBlc3BlY2lhbGx5IGF0IGhpZ2hlcgorYml0cmF0ZXMuPC9saT4KKworICA8bGk+IE5pbHMgRmFlcmJlciB1cGRhdGVkIHRoZSBtYW4gcGFnZSBhbmQgZml4ZWQgbWFueSBvZiB0aGUKK2NvbXBpbGVyIHdhcm5pbmdzLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjI0YmV0YSZuYnNwOyZuYnNwOyBBdWd1c3QgMTUgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IFRoaXMgcmVsZWFzZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG5ldyBjb2RlIChmb3IKK2RldmVsb3BlcnMpIHdoaWNoIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQ6PC9saT4KKworICA8bGk+IFJvYmVydCBIZWdlbWFubjombmJzcDsgQ29tcGxldGVseSBvdmVyaGF1bGVkIFZCUgorY29kZS4mbmJzcDsgTm93IGNvbXB1dGVzIGV4YWN0IG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIGZvciB0aGUKK2dpdmVuIHF1YWx0eSBhbmQgdGhlbiBxdWFudGl6ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYml0cmF0ZS48L2xpPgorCisgIDxsaT4gU2V2ZXJhbCBuZXcgcXVhbnRpemF0aW9uIHF1YWxpdHkgbWVhc3VyZXMuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuMjNiZXRhJm5ic3A7IEF1Z3VzdCA4IDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiBWZXJ5IG5pY2UgY29udGludW91c2x5IHVwZGF0ZWQgVkJSIGhpc3RvZ3JhbSBkaXNwbGF5IGZyb20KK0l3YXNhIEthem1pLiZuYnNwOyAoZGlzYWJsZWQgd2l0aCAtLW5vaGlzdCkuPC9saT4KKworICA8bGk+IE1vcmUgbW9kdWxlcml6YXRpb24gd29yay4mbmJzcDsgVGhlIGVuY29kaW5nIGVuZ2luZQorY2FuIG5vdyBiZSBjb21waWxlZCBpbnRvIGxpYm1wM2xhbWUsIGJ1dCB0aGUgaW50ZXJmYWNlIGlzIGF3a3dhcmQuPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5CdWcgZml4ZWQgaW4gRkZUIEhhbm4KK3dpbmRvdyBmb3JtdWxhIChMZW9uaWQgQS4gS3VsYWtvdikuPC9mb250PjwvbGk+CisKKyAgPGxpPiBOZXcgTEFNRSBsb2dvIG9uIHRoZSBkb3dubG9hZCBwYWdlLiZuYnNwOyBDcmVhdGVkIGJ5CitDaHJpcyBNaWNoYWxpc2xlcy48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlNldmVyYWwgVkJSIGFsZ29yaXRobQoraW1wcm92ZW1lbnRzIGZyb20gUm9iZXJ0IEhlZ2VtYW5uLiZuYnNwOyBOZXcgcXVhbnRpemF0aW9uIG5vaXNlCittZXRyaWNzIGFuZCBWQlIgcXVhbGl0eSBtZWFzdXJlIHRha2VzIGludG8gYWNjb3VudCBtaWQvc2lkZQorZW5jb2RpbmcuJm5ic3A7IFNob3VsZCBwcm9kdWNlIHNtYWxsZXIgZmlsZXMgd2l0aCB0aGUgc2FtZSBxdWFsaXR5LAorZXNwZWNpYWxseSB3aGVuIHVzaW5nIGpzdGVyZW8uPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjIyYmV0YSZuYnNwOyBKdWx5IDI3IDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiBEb3duc2FtcGxpbmcgKHN0ZXJlbyB0byBtb25vKSBidWcgd2l0aCBNUEVHMgorZml4ZWQuJm5ic3A7IChNaWtlIE9saXBoYW50KTwvbGk+CisKKyAgPGxpPiBEb3duc2FtcGxpbmcgbm93IG1lcmdlcyBMICZhbXA7IFIgY2hhbm5lbHMgLSBiZWZvcmUgaXQKK29ubHkgdG9vayB0aGUgTCBjaGFubmVsLjwvbGk+CisKKyAgPGxpPiBNb3JlIG1vZHVsYXJpemF0aW9uIGFuZCBjb2RlIGNsZWFudXAgZnJvbSBBbGJlcnQgRmFiZXIgYW5kCitteXNlbGYuPC9saT4KKworICA8bGk+IElucHV0IGZpbGVzaXplIGxpbWl0IHJlbW92ZWQgZm9yIHJhdyBwY20gaW5wdXQKK2ZpbGVzLiZuYnNwOyBGb3Igb3RoZXIgZmlsZSB0eXBlcywgTEFNRSB3aWxsIHN0aWxsIG9ubHkgcmVhZCB0aGUKK2ZpcnN0IDJeMzIgc2FtcGxlcywgKDI3IGhvdXJzIG9mIHBsYXlpbmcgdGltZSBhdCA0NC4xIGtIeikuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuMjFiZXRhJm5ic3A7IEp1bHkgMjYgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5Db3JyZWN0IE1pZC9TaWRlCittYXNraW5nIHRocmVzaG9sZHMgZm9yIEpTVEVSRU8gbW9kZSEmbmJzcDsgVGhpcyBpcyBlbmFibGVkIHdpdGgKKy1oLiZuYnNwOyBJdCZuYnNwOyBtYWtlcyBMQU1FIGFib3V0IDIwJSBzbG93ZXIgc2luY2UgaXQKK2NvbXB1dGVzIHBzeWNoby1hY291c3RpY3MgZm9yIEwsUiBNaWQgYW5kIFNpZGUgY2hhbm5lbHMuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+IkFuYWxvZyBzaWxlbmNlIgordGhyZXNob2xkIGFkZGVkLiZuYnNwOyBLZWVwcyBWQlIgZnJvbSB1cHBpbmcgdGhlIGJpdHJhdGUgZHVyaW5nCit2ZXJ5IHF1aXRlIHBhc3NhZ2VzLiZuYnNwOyAoUm9iZXJ0LkhlZ2VtYW5uKTwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk5ldyBWQlIgcXVhbGl0eQorc2V0dGluZyBmcm9tIFJvYmVydCBIZWdlbWFubi4mbmJzcDsgSXQgaXMgYmFzZWQgb24gdGhlIGlkZWEgdGhhdAorZGlzdG9ydGlvbiBhdCBsb3dlciBiaXQgcmF0ZXMgc291bmRzIHdvcnNlIHRoYW4gYXQgaGlnaGVyIGJpdHJhdGVzLCBhbmQKK3NvIHRoZSBhbGxvd2VkIGRpc3RvcnRpb24gKFZCUiBxdWFsaXR5IHNldHRpbmcpIGlzIHByb3BvcnRpb25hbCB0byB0aGUKK2JpdHJhdGUuJm5ic3A7IEJlY2F1c2Ugb2YgdGhpcywgZGVmYXVsdCBtaW5pbXVtIGJpdHJhdGUgaXMgbm93CiszMmticy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5FeHBlcm1lbnRhbCBzdWJibG9jaworZ2FpbiBjb2RlIGVuYWJsZWQgd2l0aCAtWi48L2ZvbnQ+PC9saT4KKworICA8bGk+IE5ldyAiLXIiIG9wdGlvbiBmb3IgcmF3IHBjbSBpbnB1dCBmaWxlcy4mbmJzcDsgV2l0aAorLXIsIExBTUUgd2lsbCBub3QgZG8gYW55IGZzZWVrKCkncyBvciBsb29rIGZvciB3YXYgYW5kIGFpZmYgaGVhZGVycyBvbgordGhlIGlucHV0IGZpbGUuPC9saT4KKworICA8bGk+IEJ1ZyBmaXhlcyBpbiBtcDN4IChmcmFtZSBhbmFseXplcikgZm9yIHZpZXdpbmcgZnJhbWVzIG5lYXIKK2VuZCBvZiB0aGUgZmlsZS48L2xpPgorCisgIDxsaT4gQnVnIGZpeGVkIHRvIGFsbG93IHNldHRpbmcgdGhlIHNhbXBsaW5nIHJhdGUgb2YgcmF3IHBjbQoraW5wdXQgZmlsZXMuPC9saT4KKworPC91bD4KKworPGgzPiBMQU1FIDMuMjBiZXRhJm5ic3A7IEp1bHkgMTkgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IEJ1ZyBpbiBnZXRfYXVkaW8uYyBmaXhlZC4mbmJzcDsgTGlic25kZmlsZSB3cmFwcGVycword291bGQgbm90IGNvbXBpbGUgKE1pZ3VlbCBSZXZpbGxhJm5ic3A7IFJvZHJpZ3Vleik8L2xpPgorCisgIDxsaT4gTmlscyBGYWVyYmVyIGZvdW5kIHNvbWUgdW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFuZCBzb21lCit3aWVyZCBleHRyYW5vdXMgY29tcHV0YXRpb25zIGluIGZpbHRlcl9zdWJiYW5kLCBub3cgZml4ZWQuJm5ic3A7CitUaGlzIHdhcyBjYXVzaW5nIHNlZyBmYXVsdHMgb24gc29tZSBtYWNoaW5lcy48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4xOWJldGEmbmJzcDsgSnVseSAxOCAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk9vcHMhJm5ic3A7IFJvYmVydAorSGVnZW1hbm4gaW1tZWRpYXRseSBmb3VuZCBhIGJ1ZyBpbiB0aGUgbmV3Jm5ic3A7IChvbGQgLVogb3B0aW9uKQorcXVhbnRpemF0aW9uIGNvZGUuJm5ic3A7IGNhbGNfbm9pc2UxIHdhcyBub3QgcmV0dXJuaW5nIHRvdF9ub2lzZSwKK3NvIG5vbiBtcy1zdGVyZW8gZnJhbWVzIHdlcmUgYnVnZ3kuPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjE4YmV0YSZuYnNwOyBKdWx5IDE3IDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TWFueSBwc3ljaG8tYWNvdXN0aWMKK2J1ZyBmaXhlcy4mbmJzcDsgRGFuIE5lbHNvbiBkaXNjb3ZlcmVkIGEgYnVnIGluIE1QRUcyOiBGb3Igc2hvcnQKK2Jsb2NrcywgdGhlIGNvZGUgYXNzdW1lcyA0MiBwYXJ0aXRpb24gYmFuZHMuJm5ic3A7IE1QRUcxIHNvbWV0aW1lcworaGFzIGxlc3MsIE1QRUcyIGNhbiBoYXZlIG1vcmUuJm5ic3A7IEluIE1QRUcxLCB0aGlzIGJ1ZyB3b3VsZCBub3QKK2hhdmUgZWZmZWN0ZWQgdGhlIG91dHB1dCBpZiB5b3VyIGNvbXBpbGVyIGluaXRpYWxpemVzIHN0YXRpYyB2YXJpYWJsZXMKK3RvIDAgb24gY3JlYXRpb24uJm5ic3A7IEluIE1QRUcyIGl0IGxlYWRzIHRvIGFycmF5IG91dC1vZi1ib3VuZHMKK2FjY2VzcyBlcnJvcnMuIEZpbmFsbHksIHRoZXJlIHdhcyBhIHJlbGF0ZWQgYnVnIGluIE1QRUcxL01QRUcyLCBzaG9ydAorJmFtcDsgbG9uZyBibG9ja3Mgd2hlcmUgdGhlIGVuZXJneSBhYm92ZSAxNiBrSHogd2FzIGFsbCBhZGRlZCB0bworcGFydGl0aW9uIGJhbmQgMC4gKHRoZSBsb3dlc3QgZnJlcXVlbnkgcGFydGl0aW9uIGJhbmQhKTwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlRoZSAtWiBvcHRpb24gKEdhYnJpZWwKK0JvdXZpZ25lJ3MgaWRlYSBvZiB1c2luZyB0b3RhbCBxdWFudGl6YXRpb24gbm9pc2UgdG8gY2hvb3NlIGJldHdlZW4gdHdvCitxdWFudGl6YXRpb25zIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgIm92ZXIiKSBpcyBub3cgdGhlCitkZWZhdWx0LiZuYnNwOyBJIGJlbGlldmUgdGhpcyBoZWxwcyByZW1vdmUgdGhlIHRyaWxsaW5nIHNvdW5kIGluCitKYW4ncyB0ZXN0c2lnbmFsNC53YXYuJm5ic3A7IFRoZSBxdWFsaXR5IG9mIHRlc3RzaWduYWwyLndhdiBhbmQKK3Rlc3RzaWduYWw0LndhdiBhcmUgbm93IGJldHRlciB0aGFuIFhpbmcgYW5kIGdldHRpbmcgY2xvc2VyIHRvIEZoRy48L2ZvbnQ+PC9saT4KKworICA8bGk+IEJ1ZyBmaXhlcyBpbiBmcmFtZSAmYW1wOyBzYW1wbGUgY291bnQgZm9yIGRvd25zYW1wbGluZworbW9kZS4gKGJlbiAiamFjb2JzIik8L2xpPgorCisgIDxsaT4gUGF0Y2hlcyB0byBpbXByb3ZlIG1vZHVsaXphdGlvbi4mbmJzcDsgKGJlbiAiamFjb2JzIik8L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4xN2JldGEmbmJzcDsgSnVseSAxMSAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gc3Vic3RhbnRpYWwgY29kZSBjbGVhbnVwIHRvd2FyZHMgZ29hbCBvZiBtYWtpbmcgTEFNRSBtb3JlCittb2R1bGFyLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjE2YmV0YSZuYnNwOyBKdWx5IDExIDE5OTk8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TmV3IHR1bmluZ3Mgb2Ygd2luZG93Citzd2l0Y2hpbmcsIGFuZCBiZXR0ZXIgYml0IGFsbG9jYXRpb24gYmFzZWQgb24gcGUuJm5ic3A7IChKYW4KK1JhZmFqLiZuYnNwOyBpbXByb3ZlcyBib3RoIHRlc3RzaWduYWwyLndhdiBhbmQgdGVzdHNpZ25hbDQud2F2KS48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5CdWcgaW4gbWlkL3NpZGUKK3F1YW50aXphdGlvbiB3aGVuIHNpZGUgY2hhbm5lbCB3YXMgemVybyBmaXhlZC4mbmJzcDsgKEFsYmVydCBGYWJlcik8L2ZvbnQ+PC9saT4KKworICA8bGk+IFJlbW92ZWQgc29tZSBleHRyYW5vdXMgY29tcHV0YXRpb25zIGluIGwzcHN5LmMgKFJvYmVydAorSGVnZW1hbm4pPC9saT4KKworICA8bGk+IE1vcmUgZGV0YWlsZWQgdGltaW5nIHN0YXR1cyBpbmZvLCBpbmNsdWRpbmcgaG91cnMgZGlzcGxheS4KKyhTYWthcmkgQWlsdXMpIGFuZCBwZXJjZW50YWdlIGluZGljYXRvciAoQ29ucmFkIFNhbmRlcnNvbikuPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5XaW5kb3dfc3ViYmFuZCBhbmQKK2NhbGNfbm9pc2UxLGNhbGNfbm9pc2UyIHNwZWVkdXBzLiZuYnNwOyBRdWFudGl6ZV94cnBvdyBzcGVlZHVwCitzaG91bGQgYmUgc2lnbmlmaWNhbnQgb24gbm9uIEdOVS9pbnRlbCBzeXN0ZW1zLiAoTWlrZSBDaGVuZyk8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5CZXR0ZXIgaW5pdGlhbCBndWVzcworZm9yIFZCUiBiaXRyYXRlLiZuYnNwOyBTaG91bGQgc3BlZWQgdXAgVkJSIGVuY29kaW5nLiZuYnNwOworKEdhYnJpZWwgQm91dmlnbmUpPC9mb250PjwvbGk+CisKKyAgPGxpPiBNb3JlIGFkdmFuY2VkIC53YXYgaGVhZGVyIHBhcnNpbmcuJm5ic3A7IGZpeGVzIGJ1Z3MKK2ludm9sdmluZyBjbGljayBpbiBmaXJzdCBmcmFtZS4gKFJvYmVydC5IZWdlbWFubik8L2xpPgorCisgIDxsaT4gQ29ycmVjdCBmaWxlc2l6ZSBhbmQgdG90YWwgZnJhbWUgY29tcHV0YXRpb24gd2hlbiB1c2luZworTElCU05ERklMRSAoYmVuICJqYWNvYnMiKTwvbGk+CisKKyAgPGxpPiBDbGljayBpbiBsYXN0IGZyYW1lIChidWZmZXJpbmcgcHJvYmxlbSkgd2hlbiB1c2luZworbGlic25kZmlsZSBmaXhlZC48L2xpPgorCisgIDxsaT4gQXVkaW8gSS9PIGNvZGUgb3ZlcmhhdWxlZC4mbmJzcDsgVGhlcmUgaXMgbm93IGEKK3VuaWZvcm0gYXVkaW8gaS9vIGludGVyZmFjZSB0byBsaWJzbmRmaWxlIG9yIHRoZSBMQU1FIGJ1aWx0IGluIHdhdi9haWZmCityb3V0aW5lcy4mbmJzcDsgQWxsIGF1ZGlvIGkvbyBjb2RlIGxvY2FsaXplZCB0byBnZXRfYXVkaW8uYy48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4xNWJldGE8L2gzPgorCis8dWw+CisKKyAgPGxpPiB0aW1lcygpL2Nsb2NrKCkgcHJvYmxlbSBmaXhlZCBmb3Igbm9uLXVuaXggT1MuJm5ic3A7CisoQmVuICJKYWNvYnMiKTwvbGk+CisKKyAgPGxpPiBGaXhlZCB1bmluaXRpYWxpemVkIHBlW10gd2hlbiB1c2luZyBmYXN0IG1vZGUuJm5ic3A7CisoQmVuICJKYWNvYnMiKTwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjEzJm5ic3A7IEp1bmUgMjQgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IFBhdGNoZXMgZm9yIEJlT1MgZnJvbSBHZXJ0amFuIHZhbiBSYXRpbmdlbi48L2xpPgorCisgIDxsaT4gTWFrZWZpbGUgaW5mbyBmb3IgT1MvMiBXYXJwIDQuMCZuYnNwOyAoZnJvbSBkaW5rLm9yZykuPC9saT4KKworICA8bGk+IFN0YXR1cyBkaXNwbGF5IG5vdyBiYXNlZCBvbiB3YWxsIGNsb2NrIHRpbWUsIG5vdCBjcHUgdGltZS48L2xpPgorCisgIDxsaT4gbWVtX2FsbG9jIG5vIGxvbmdlciBhbGxvY2F0ZXMgdHdpY2UgYXMgbXVjaCBtZW1vcnkgYXMKK25lZWRlZCAoSmFuIFBlbWFuKS48L2xpPgorCis8L3VsPgorCis8aDM+IDMuMTJwcmU5PC9oMz4KKworPHVsPgorCisgIDxsaT4gVXBkYXRlZCBCTEFERURMTCBjb2RlIHRvIGhhbmRsZSByZWNlbnQgY2hhbmdlcyAoQWxiZXJ0CitGYWJlcikuPC9saT4KKworICA8bGk+IEJ1ZyBmaXhlZCBpbiBwYXJzaW5nIG9wdGlvbnMgd2hlbiBub3QgdXNpbmcgR1RLIChBbGJlcnQKK0ZhYmVyKS48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk1QRUcyIExheWVyIElJSSBwc3ljaG8KK2Fjb3VzdGljcyBub3cgd29ya2luZy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5JbXByb3ZlZCBodWZmbWFuCitlbmNvZGluZyBDaHJpcyBNYXRyYWtpZGlzLiAoMTAlIGZhc3RlcikuJm5ic3A7IEkgZG9udCBrbm93IGhvdyBoZQorZmluZHMgdGhlc2UgaW1wcm92ZW1lbnRzISZuYnNwOyBMQU1FIHdpdGggZnVsbCBxdWFsaXR5IG5vdyBlbmNvZGVzCitmYXN0ZXIgdGhhbiByZWFsIHRpbWUgb24gbXkgUElJIDI2Ni48L2ZvbnQ+PC9saT4KKworICA8bGk+IEZpeGVkIHRpbWUgZGlzcGxheSB3aGVuIGVuY29kaW5nIHRha2VzIG1vcmUgdGhhbiA2MAorbWludXRlcy48L2xpPgorCis8L3VsPgorCis8aDM+IDMuMTJwcmU4PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPk5ldyA8YSBocmVmPSJncHN5Y2hvL21zX3N0ZXJlby5odG1sIj5taWQvc2lkZSBzdGVyZW88L2E+Citjcml0ZXJpb24uJm5ic3A7IExBTUUgd2lsbCB1c2UgbWlkL3NpZGUgc3RlcmVvIG9ubHkgd2hlbiB0aGUKK2RpZmZlcmVuY2UgYmV0d2VlbiBMICZhbXA7IFIgbWFza2luZyB0aHJlc2hvbGRzIChhdmVyYWdlZCBvdmVyIGFsbAorc2NhbGVmYWN0b3JzKSBpcyBsZXNzIHRoZW4gNWRiLiZuYnNwOyBJbiBzZXZlcmFsIHRlc3Qgc2FtcGxlcyBpdAorZG9lcyBhIHZlcnkgZ29vZCBqb2IgbWltaWNraW5nIHRoZSBGaEcgZW5jb2Rlci48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5CdWcgaW4gbWlkL3NpZGUgc3RlcmVvCitmaXhlZDombmJzcDsgaW5kZXBlbmRlbnQgdmFyaWF0aW9uIG9mIG1pZCAmYW1wOyBzaWRlIGNoYW5uZWwKK3NjYWxlZmFjdG9ycyBkaXNhYmxlZC4mbmJzcDsgQmVjYXVzZSBvZiB0aGUgd2F5IG91dGVyX2xvb3AgaXMKK2N1cnJlbnRseSBjb2RlZCwgd2hlbiBlbmNvZGluZyBtaWQvc2lkZSBjb2VmZmljaWV0bnMgdXNpbmcgbGVmdC9yaWdodAordGhyZXNob2xkcywgeW91IGhhdmUgdG8gdmFyeSB0aGUgc2NhbGVmYWN0b3JzIHNpbXVsdGFuZW91c2x5LjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkJ1ZyBpbiBzaWRlL21pZCBlbmVyZ3kKK3JhdGlvIGNhbGN1bGF0aW9uIGZpeGVkLiAoVGhhbmtzIHRvIFJvYmVydCBIZWdlbWFubik8L2ZvbnQ+PC9saT4KKworICA8bGk+IERlZmF1bHQgbW9kZSBpcyBzdGVyZW8gKG5vdCBqc3RlcmVvKSBpZiBiaXRyYXRlIGlzIGNob3NlbgorYXMgMTkya2JzIG9yIGhpZ2hlci4mbmJzcDsgVGVybyBBdXZpbmVuIGZpcnN0IHBvaW50ZWQgb3V0IHRoYXQgRmhHCitzZWVtcyB0byB0aGluayBhdCAxNjBrYnMsIHRoZWlyIGVuY29kZXIgaXMgc28gZ29vZCBpdCBkb2Vzbid0IG5lZWQKK2pzdGVyZW8gdHJpY2tzLiBTaW5jZSBMQU1FIGlzIG5vdCBhcyBnb29kIGFzIEZoRywgSSBhbSBnb2luZyB0byBjbGFpbQordGhhdCAxOTJrYnMgTEFNRSBpcyBzbyBnb29kIGl0IGRvZW5zJ3QgbmVlZCBqc3RlcmVvIHRyaWNrcywgYW5kIHRodXMgaXQKK2lzIGRpc2FibGVkIGJ5IGRlZmF1bHQuPC9saT4KKworICA8bGk+IFdBViBoZWFkZXIgcGFyc2luZyBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcywgYW5kIGF1dG9tYXRpYworZGV0ZWN0aW9uIG9mIGJpZy1lbmRpYW4gbWFjaGluZXMuJm5ic3A7IChUaGFua3MgdG8mbmJzcDsKK1NpZ2JqJm9zbGFzaDtybiBTa2omYWVsaWc7cmV0KS48L2xpPgorCisgIDxsaT4gYWRkZWQgNTYgc2FtcGxlIGRlbGF5IHRvIHN5bmMgTEFNRSB3aXRoIEZoRy48L2xpPgorCisgIDxsaT4gTVAzeCAoZnJhbWUgYW5hbHl6ZXIpIGNhbiBub3cgaGFuZGxlIE1QRUcyIHN0cmVhbXMuPC9saT4KKworPC91bD4KKworPGgzPiAzLjEycHJlNzwvaDM+CisKKzx1bD4KKworICA8bGk+IE1QRUcyIGxheWVyIElJSSBub3cgd29ya2luZyEmbmJzcDsgbG93ZXIgYml0IHJhdGVzCisoZG93biB0byA4a2JzKSBhbmQgMyBtb3JlIHNhbXBsaW5nIGZyZXF1ZW5jaWVzOiZuYnNwOyAxNjAwMCwgMjIwNTAsCisyNDAwMEh6LiBRdWFsaXR5IGlzIHBvb3IgLSB0aGUgcHN5LW1vZGVsIGRvZXMgbm90IHlldCB3b3JrIHdpdGggdGhlc2UKK3NhbXBsaW5nIGZyZXF1ZW5jaWVzLjwvbGk+CisKKyAgPGxpPiBGaXhlZCAiRVJST1I6IG91dGVyX2xvb3AoKTogaHVmZl9iaXRzICZsdDsgMC4iIGJ1Zword2hlbiB1c2luZyBWQlIuPC9saT4KKworICA8bGk+IGJhc2ggYW5kIHNoIHNjcmlwdHMgdG8gcnVuIExBTUUgb24gbXVsdGlwbGUgZmlsZXMgbm93CitpbmNsdWRlZC4mbmJzcDsgKGZyb20gUm9iZXJ0IEhlZ2VtYW5uIGFuZCBHZXJoYXJkIFdlc3AgcmVzcGVjdGl2ZWx5KTwvbGk+CisKKyAgPGxpPiBidWcgZml4IGluIGVuY29kaW5nIHRpbWVzIGZvciBsb25nZXIgZmlsZXMgZnJvbSZuYnNwOworKEFsdmFybyBNYXJ0aW5leiBFY2hldmFycmlhKTwvbGk+CisKKyAgPGxpPiB5ZXQgYW5vdGhlciBzZWdmYXVsdCBpbiB0aGUgZnJhbWUgYW5hbHl6ZXIgZml4ZWQuPC9saT4KKworICA8bGk+IElTTyBwc3ktbW9kZWwvYml0IGFsbG9jYXRpb24gcm91dGluZXMgcmVtb3ZlZC4mbmJzcDsKK1RoaXMgYWxsb3dlZCBtYWtlZnJhbWUoKSB0byBiZSBtYWRlIG11Y2ggc2ltcGxlciwgYW5kIG1vc3Qgb2YgdGhlCitjb21wbGljYXRlZCBidWZmZXJpbmcgaXMgbm93IGdvbmUuIEV2ZW50dWFsbHkgSSB3b3VsZCBsaWtlIHRoZSBlbmNvZGluZworZW5naW5lIHRvIGJlIGEgc3RhbmQgYWxvbmUgbGlicmFyeS48L2xpPgorCis8L3VsPgorCis8aDM+IDMuMTJwcmU2PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkJldHRlciBWQlIKK3R1bmluZy4mbmJzcDsgRmluZCBtaW5pbXVtIGJpdHJhdGUgd2l0aCBkaXN0b3J0aW9uIGxlc3MgdGhhbiB0aGUKK2FsbG93cyBtYXhpbXVtLiZuYnNwOyBBIG1pbmltdW0gYml0IHJhdGUgaXMgaW1wb3NlZCBvbiBmcmFtZXMgd2l0aAorc2hvcnQgYmxvY2tzICh3aGVyZSB0aGUgbWVhc3VyZWQgZGlzdG9ydGlvbiBjYW4gbm90IGJlCit0cnVzdGVkKS4mbmJzcDsmbmJzcDsgQSBtaW5pbXVtIGZyYW1lIGJpdHJhdGUgY2FuIGJlIHNwZWNpZmllZAord2l0aCAtYiwgZGVmYXVsdD02NGticy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cuemlwLmNvbS5hdS8lN0VlcmlrZC9saWJzbmRmaWxlIj5MSUJTTkRGSUxFPC9hPgorc3VwcG9ydC4mbmJzcDsgV2l0aCBsaWJzbmRmaWxlLCBMQU1FIGNhbiBlbmNvZGUgYWxtb3N0IGFsbCBzb3VuZAorZm9ybWF0cy4mbmJzcDsgQWxiZXJ0IEZhYmVyIGRpZCB0aGUgd29yayBmb3IgdGhpcywgaW5jbHVkaW5nCitnZXR0aW5nIGxpYnNuZGZpbGUgcnVubmluZyB1bmRlciB3aW4zMi48L2xpPgorCisgIDxsaT4gQ1JDIGNoZWNrc3VtIG5vdyB3b3JraW5nISZuYnNwOyZuYnNwOyAoVGhhbmtzIHRvCitKb2hhbm5lcyBPdmVybWFubiApPC9saT4KKworICA8bGk+IGZyYW1lIGFuYWx5emVyIHdpbGwgbm93IHdvcmsgd2l0aCBtb25vIC5tcDMgZmlsZXM8L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPm1vcmUgY29kZSB0d2Vla3MgZnJvbQorSmFuIFBlbWFuLjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPkNvbXBhcS1BbHBoYShMaW51eCkKK2ZpeGVzIGFuZCBzcGVlZHVwcyBmcm9tIE5pbHMgRmFlcmJlci48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5GYXN0ZXIKK2Jpbl9zZWFyY2hfU3RlcFNpemUgZnJvbSBKdWhhIExhdWthbGEuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+RmFzdGVyIHF1YW50aXplKCkgZnJvbQorTWlrZSBDaGVuZzwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPkZhc3RlcgorcXVhbnRpemVfeHJwb3coKSBmcm9tIENocmlzIE1hdHJha2lkaXMuJm5ic3A7IHhycG93X2ZsYWcgcmVtb3ZlZAorc2luY2UgdGhpcyBvcHRpb24gaXMgbm93IG9uIGJ5IGRlZmF1bHQuPC9mb250PjwvbGk+CisKKyAgPGxpPiBGaXhlZCAud2F2IGhlYWRlciBwYXJzaW5nIGZyb20gTmlscyBGYWVyYmVyLjwvbGk+CisKKyAgPGxpPiBYaW5nIFZCUiBmcmFtZSBpbmZvIGhlYWRlciBjb2RlIGZyb20gQWxiZXJ0CitGYWJlci4mbmJzcDsmbmJzcDsgIlhpbmciIGFuZCAiTEFNRSAzLjEyIiBlbWJlZGRlZCBpbiBmaXJzdAorZnJhbWUuPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5CdWcgaW4gVkJSIGJpdAorYWxsb2NhdGlvbiBiYXNlZCBvbiAib3ZlciIgdmFsdWUgZml4ZWQuPC9mb250PjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjExJm5ic3A7IEp1bmUgMyAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gQWxtb3N0IGFsbCB3YXJuaW5ncyAoLVdhbGwpIG5vdyBmaXhlZCEmbmJzcDsgKFRoYW5rcwordG8gSmFuIFBlbWFuKTwvbGk+CisKKyAgPGxpPiBNb3JlIGNvZGluZyBpbXByb3ZlbWVudHMgZnJvbSBHYWJyaWVsIEJvdXZpZ25lIGFuZCBXYXJyZW4KK1Rvb21leS48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPlZCUiZuYnNwOworKHZhcmlhYmxlIGJpdCByYXRlKS4mbmJzcDsmbmJzcDsgSW5jcmVhc2VzIGJpdCByYXRlIGZvciBzaG9ydAorYmxvY2tzIGFuZCBmb3IgZnJhbWVzIHdoZXJlIHRoZSBudW1iZXIgb2YgYmFuZHMgY29udGFpbmluZyBhdWRpYmxlCitkaXN0b3J0aW9uIGlzIGdyZWF0ZXIgdGhhbiBhIGdpdmVuIHZhbHVlLiZuYnNwOyBNdWNoIHR1bmluZyBuZWVkcwordG8gYmUgZG9uZS48L2ZvbnQ+PC9saT4KKworICA8bGk+IFBhdGNoIHRvIHJlbW92ZSBhbGwgYXRhbigpIGNhbGxzIGZyb20gSmFtZXMgRHJvcHBvLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjEwIE1heSAzMCAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPkZhc3QgbW9kZQorKC1mKSZuYnNwOyBkaXNhYmxlcyBwc3ljaG8tYWNvdXN0aWMgbW9kZWwgZm9yIHJlYWwgdGltZSBlbmNvZGluZyBvbgorb2xkZXIgbWFjaGluZXMuJm5ic3A7IFRoYW5rcyB0byBMYXVyaSBBaG9uZW4gd2hvIGZpcnN0IHNlbnQgYSBwYXRjaAorZm9yIHRoaXMuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TmV3IGJpdCByZXNlcnZvaXIKK3VzYWdlIHNjaGVtZSB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3IHByZS1lY2hvIGRldGVjdGlvbiBmb3JtdWxhcy48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5UdW5pbmcgb2YgQVdTIGFuZAorRU5FUl9BV1MgcHJlLWVjaG8gZm9ybXVsYXMgYnkgR2FicmllbCBCb3V2aWduZSBhbmQgbXlzZWxmLiZuYnNwOworVGhleSB3b3JrIGdyZWF0ISZuYnNwOyBub3cgb24gYnkgZGVmYXVsdC48L2ZvbnQ+PC9saT4KKworICA8bGk+IEluIGpzdGVyZW8sIGZvcmNlIGJsb2NrdHlwZXMgZm9yIGxlZnQgJmFtcDsgcmlnaHQKK2NoYW5uZWxzIHRvIGJlIGlkZW50aWNhbC4mbmJzcDsgRmhHIHNlZW1zIHRvIGRvIHRoaXMuJm5ic3A7IEl0CitjYW4gYmUgZGlzYWJsZWQgd2l0aCAiLWQiLjwvbGk+CisKKyAgPGxpPiBQYXRjaGVzIHRvIGNvbXBpbGUgTVAzeCB1bmRlciB3aW4zMiAoVGhhbmtzIHRvIEFsYmVydAorRmFiZXIpLjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+YmluX3NlcmFjaF9zdGVwc2l6ZQorbGltaXRlZCB0byBhIHF1YW50aXphdGlvblN0ZXBTaXplIG9mJm5ic3A7IC0yMTAgdGhyb3VnaCA0NS48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5vdXRlcl9sb29wKCkmbmJzcDsKK3dpbGwgbm93IHZhcnkgTWlkICZhbXA7IFNpZGUgc2NhbGVmYWN0b3JzIGluZGVwZW5kZW50bHkuJm5ic3A7CitDYW4gbGVhZCB0byBiZXR0ZXIgcXVhbnRpemF0aW9ucywgYnV0IGl0IGlzIHNsb3dlciAodHdpY2UgYXMgbWFueQorcXVhbnRpemF0aW9ucyB0byBsb29rIGF0KS4mbmJzcDsgUnVubmluZyB3aXRoICItbSBmIiBkb2VzIG5vdCBuZWVkCit0aGlzIGFuZCB3aWxsIHJ1biBhdCB0aGUgb2xkIHNwZWVkPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+QnVnIGluIGlubmVyX2xvb3AKK3dvdWxkIGFsbG93IHF1YW50aXphdGlvbnMgbGFyZ2VyIHRoYW4gYWxsb3dlZC4mbmJzcDsgKGludHJvZHVjZWQgaW4KK2xhbWUzLjA0LCBub3cgZml4ZWQuKTwvZm9udD48L2xpPgorCisgIDxsaT4gVXBkYXRlZCBIVE1MIGRvY3VtZW50YXRpb24gZnJvbSBHYWJyaWVsIEJvdXZpZ25lLjwvbGk+CisKKyAgPGxpPiBVbml4Jm5ic3A7IG1hbiBwYWdlIGZyb20gV2lsbGlhbSBTY2hlbHRlci48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPm51bWxpbmVzW10gYnVnCitmaXhlZC4mbmJzcDsgKFRoYW5rcyB0byBSYWZhZWwgTHVlYmJlcnQsIE1QZWNrZXIgYXV0aG9yKS48L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjMzM2NmZmIj5RdWFudGl6YXRpb24gc3BlZWQKK2ltcHJvdmVtZW50cyBmcm9tIENoaXJzIE1hdHJha2lkaXMuPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+V2hlbiBjb21wYXJpbmcKK3F1YW50aXphdGlvbnMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYmFuZHMgd2l0aCBhdWRpYmxlIGRpc3RvcnRpb24sCit1c2UgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IHNjYWxlZmFjdG9ycywgbm90IHRoZSBmaXJzdCBvbmUgb3V0ZXJfbG9vcAoraGFwcGVuZWQgdG8gZmluZC48L2ZvbnQ+PC9saT4KKworICA8bGk+IEltcHJvdmVkIGRlZmluYXRpb24gb2YgYmVzdCBxdWFudGl6YXRpb24gd2hlbiB1c2luZyAtZgorKGZhc3QgbW9kZSkuPC9saT4KKworICA8bGk+IHN1YmJsb2NrIGNvZGUgbm93IHdvcmtpbmcuJm5ic3A7IEJ1dCBubyBhbGdvcml0aG0gdG8KK2Nob29zZSBzdWJibG9jayBnYWlucyB5ZXQuPC9saT4KKworICA8bGk+IExpbnV4IG5vdyBzZWdmYXVsdHMgb24gZmxvYXRpbmcgcG9pbnQKK2V4Y2VwdGlvbnMuJm5ic3A7IFNob3VsZCBwcmV2ZW50IG1lIGZyb20gcmVsZWFzaW5nIGJpbmFyaWVzIHRoYXQKK2NyYXNoIG9uIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLjwvbGk+CisKKzwvdWw+CisKKzxoMz4gTEFNRSAzLjA0IE1heSAyMiAxOTk5PC9oMz4KKworPHVsPgorCisgIDxsaT5QcmVsaW1pbmFyeSBkb2N1bWVudGF0aW9uIGZyb20gR2FicmllbCBCb3V2aWduZS48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiMzMzY2ZmYiPkkgd291bGRuJ3QgaGF2ZQordGhvdWdodCBpdCB3YXMgcG9zc2libGUsIGJ1dCBub3cgdGhlcmUgYXJlIGV2ZW4gbW9yZSBzcGVlZCBpbXByb3ZlbWVudHMKK2Zyb20gQ2hyaXMgTWF0cmFraWRpcyEmbmJzcDsgUmVtb3ZlZCBvbmUgRkZUIHdoZW4gdXNpbmcgam9pbnQKK3N0ZXJlbywgYW5kIG1hbnkgaW1wcm92ZW1lbnRzIGluIGxvb3AuYy48L2ZvbnQ+PC9saT4KKworICA8bGk+ICJGYWtlIiBtc19zdGVyZW8gbW9kZSByZW5hbWVkICJGb3JjZSIgbXNfc3RlcmVvIHNpbmNlIGl0Citmb3JjZXMgbWlkL3NpZGUgc3RlcmVvIG9uIGFsbCBmcmFtZXMuJm5ic3A7IEZvciBzb21lIG11c2ljIHRoaXMgaXMKK3NhaWQgdG8gYmUgYSBwcm9ibGVtLCBidXQgZm9yIG1vc3QgbXVzaWMgbW9kZSBpcyBwcm9iYWJseSBiZXR0ZXIgdGhhbgordGhlIGRlZmF1bHQganN0ZXJlbyBiZWNhdXNlIGl0IHVzZXMgc3BlY2lhbGl6ZWQgbWlkL3NpZGUgY2hhbm5lbAorbWFza2luZyB0aHJlc2hvbGRzLjwvbGk+CisKKyAgPGxpPiBTbWFsbCBidWdzIGluIEZvcmNlIG1zX3N0ZXJlbyBtb2RlIGZpeGVkLjwvbGk+CisKKyAgPGxpPiBDb21wYXEgQWxwaGEgZml4ZXMgZnJvbSBOYXRoYW4gU2xpbmdlcmxhbmQuPC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5Tb21lIG5ldyBleHBlcmltZW50YWwKK3ByZS1lY2hvIGRldGVjdGlvbiBmb3JtdWxhcyBpbiBsM3BzeS5jICgjaWZkZWYgQVdTIGFuZCAjaWZkZWYgRU5FUl9BV1MsCitib3RoIG9mZiBieSBkZWZhdWx0LiZuYnNwOyBUaGFua3MgdG8gR2FicmllbCBCb3V2aWduZSBhbmQgQW5kcmUKK09zdGVyaHVlcyk8L2ZvbnQ+PC9saT4KKworICA8bGk+IFNldmVyYWwgYnVncyBpbiB0aGUgc3luY2luZyBvZiBkYXRhIGRpc3BsYXllZCBieSBtcDN4ICh0aGUKK2ZyYW1lIGFuYWx5emVyKSB3ZXJlIGZpeGVkLjwvbGk+CisKKyAgPGxpPiBoaWdocSAoLWgpIG9wdGlvbiBhZGRlZC4mbmJzcDsgVGhpcyB0dXJucyBvbiB0aGluZ3MKKyhqdXN0IG9uZSBzbyBmYXIpIHRoYXQgc2hvdWxkIHNvdW5kIGJldHRlciBidXQgc2xvdyBkb3duIExBTUUuPC9saT4KKworPC91bD4KKworPGgzPkxBTUUgMy4wMyBNYXkgMTggMTk5OSA8L2gzPgorCis8dWw+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzMzNjZmZiI+RmFzdGVyICgyMCUpICZhbXA7CitjbGVhbmVyIEZGVCAoVGhhbmtzIHRvIENocmlzIE1hdHJha2lkaXMmbmJzcDsKK2h0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS9SZXNlYXJjaFRyaWFuZ2xlLzg4NjkvZmZ0X3N1bW1hcnkuaHRtbCk8L2ZvbnQ+PC9saT4KKworICA8bGk+IG1vZHMgc28gaXQgd29ya3Mgd2l0aCBWQysrIChUaGFua3MgdG8gR2FicmllbCBCb3V2aWduZSwKK3d3dy5tcDN0ZWNoLm9yZyk8L2xpPgorCisgIDxsaT4gTVAzcyBtYXJrZWQgIm9yaWdpbmFsIiBieSBkZWZhdWx0Jm5ic3A7IChUaGFua3MgdG8KK0dhYnJpZWwgQm91dmlnbmUsIHd3dy5tcDN0ZWNoLm9yZyk8L2xpPgorCisgIDxsaT4gQ2FuIG5vdyBiZSBjb21waWxlZCBpbnRvIGEgQmxhZGVFbmMgY29tcGF0aWJsZQorLkRMTCZuYnNwOyZuYnNwOyAoVGhhbmtzIHRvJm5ic3A7IEFsYmVydCBGYWJlciwgQ0RleCBhdXRob3IpPC9saT4KKworICA8bGk+IFBhdGNoZXMgZm9yICJzaWxlbnQgbW9kZSIgYW5kIHN0ZGluL3N0ZG91dCZuYnNwOworKFRoYW5rcyB0byBMYXJzIE1hZ25lIEluZ2VicmlndHNlbik8L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkZpeGVkIHJhcmUgYnVnOiBpZiBhCitsb25nX2Jsb2NrIGlzIHNhbmR3aWNoZWQgYmV0d2VlbiB0d28gc2hvcnRfYmxvY2tzLCBpdCBtdXN0IGJlIGNoYW5nZWQKK3RvIGEgc2hvcnRfYmxvY2ssIGJ1dCB0aGUgc2hvcnRfYmxvY2sgcmF0aW9zIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgaW4KK2wzcHN5LmMuJm5ic3A7IE5vdyBhbHdheXMgY29tcHV0ZSBzaG9ydF9ibG9jayByYXRpb3MganVzdCBpbiBjYXNlLjwvZm9udD48L2xpPgorCisgIDxsaT4gPGZvbnQgY29sb3I9IiNmZjAwMDAiPkZpeGVkIGJ1ZyB3aXRoIGluaXRpYWwKK3F1YW50aXplIHN0ZXAgc2l6ZSB3aGVuIG1hbnkgY29lZmZpY2llbnRzIGFyZSB6ZXJvLiZuYnNwOyAoVGhhbmtzCit0byBNYXJ0aW4gV2VnaG9mZXIpLjwvZm9udD48L2xpPgorCisgIDxsaT4gQnVnIGZpeGVkIGluIE1QM3ggZGlzcGxheSBvZiBhdWRpYmxlIGRpc3RvcnRpb24uPC9saT4KKworICA8bGk+IGltcHJvdmVkIHN0YXR1cyBkaXNwbGF5IChUaGFua3MgdG8gTGF1cmkgQWhvbmVuKS48L2xpPgorCis8L3VsPgorCis8aDM+IExBTUUgMy4wMiBNYXkgMTIgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5lbmNvZGVyIGNvdWxkIHVzZQorbXNfc3RlcmVvIGV2ZW4gaWYgY2hhbm5lbCAwIGFuZCAxIGJsb2NrIHR5cGVzIHdlcmUgZGlmZmVyZW50LiZuYnNwOworKFRoYW5rcyB0byBKYW4gUmFmYWopPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iI2ZmMDAwMCI+YWRkZWQgLWsgb3B0aW9uIHRvCitkaXNhYmxlIHRoZSAxNiBrSHogY3V0b2ZmIGF0IDEyOGticy4mbmJzcDsgVGhpcyBjdXRvZmYgaXMgbmV2ZXIKK3VzZWQgYXQgaGlnaGVyIGJpdHJhdGVzLiAoVGhhbmtzIHRvIEphbiBSYWZhaik8L2ZvbnQ+PC9saT4KKworICA8bGk+IDxmb250IGNvbG9yPSIjZmYwMDAwIj5tb2RpZmllZCBwZSBiaXQKK2FsbG9jYXRpb24gZm9ybXVsYSB0byBtYWtlIHNlbnNlIGF0IGJpdCByYXRlcyBvdGhlciB0aGFuIDEyOGticy48L2ZvbnQ+PC9saT4KKworICA8bGk+IGZpeGVkIGwzX3htaW4gaW5pdGlhbGl6YXRpb24gcHJvYmxlbSB3aGljaCBzaG93ZWQgdXAgdW5kZXIKK0ZyZWVCU0QuJm5ic3A7IChUaGFua3MgdG8gV2FycmVuIFRvb21leSk8L2xpPgorCis8L3VsPgorCis8aDM+PGI+TEFNRSAzLjAxIE1heSAxMSAxOTk5PC9iPiA8L2gzPgorCis8dWw+CisKKyAgPGxpPiBtYXhfbmFtZV9zaXplIGluY3JlYXNlZCB0byAzMDAmbmJzcDsgKFRoYW5rcyB0byBNaWtlCitPbGlwaGFudCk8L2xpPgorCisgIDxsaT4gcGF0Y2ggdG8gYWxsb3cgc2Vla3Mgb24gaW5wdXQgZmlsZSAoVGhhbmtzIHRvIFNjb3R0IE1hbmxleSk8L2xpPgorCisgIDxsaT4gZml4ZXMgZm9yIG1vbm8gbW9kZXMgKFRoYW5rcyB0byBldmVyeW9uZSB3aG8gcG9pbnRlZCB0aGlzCitvdXQpPC9saT4KKworICA8bGk+IG92ZXJmbG93IGluIGNhbGNfbm9pc2UyIGZpeGVkPC9saT4KKworICA8bGk+IGJpdCByZXNlcnZvaXIgb3ZlcmZsb3cgd2hlbiBlbmNvZGluZyBsb3RzIG9mIGZyYW1lcyB3aXRoCithbGwgemVyb3MmbmJzcDsgKFRoYW5rcyB0byBKYW5pIEZyaWxhbmRlcik8L2xpPgorCis8L3VsPgorCis8aHI+CisKKzxoMz5MQU1FIDMuMCBNYXkgMTAgMTk5OTwvaDM+CisKKzx1bD4KKworICA8bGk+PGZvbnQgY29sb3I9IiNmZjAwMDAiPmFkZGVkIEdQU1lDSE8gKGRldmVsb3BlZAorYnkgTWFyayBUYXlsb3IpPC9mb250PjwvbGk+CisKKyAgPGxpPiA8Zm9udCBjb2xvcj0iIzAwMDAwMCI+YWRkZWQgTVAzeCAoZGV2ZWxvcGVkCitieSBNYXJrIFRheWxvcik8L2ZvbnQ+PC9saT4KKworICA8bGk+IExBTUUgbm93IG1haW50YWluZWQgYnkgTWFyayBUYXlsb3I8L2xpPgorCis8L3VsPgorCis8aDM+Tm92ZW1iZXIgOCAxOTk4PC9oMz4KKzx1bD4KKworICA8bGk+IFZlcnNpb24gMi4xZiByZWxlYXNlZDwvbGk+CisKKyAgPGxpPiA1MCUgZmFzdGVyIGZpbHRlcl9zdWJiYW5kKCkgcm91dGluZSBpbiBlbmNvZGUuYworY29udHJpYnV0ZWQgYnkgSmFtZXMgRHJvcHBvPC9saT4KKworPC91bD4KKworPGgzPk5vdmVtYmVyIDIgMTk5ODwvaDM+Cis8dWw+CisKKyAgPGxpPiBWZXJzaW9uIDIuMWUgcmVsZWFzZWQuPC9saT4KKworICA8bGk+IE5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIDxiPi1hPC9iPgorYXV0by1yZXNhbXBsZXMgYSBzdGVyZW8gaW5wdXQgZmlsZSB0byBtb25vLjwvbGk+CisKKyAgPGxpPiBOZXcgY29tbWFuZCBsaW5lIHN3aXRjaCA8Yj4tcjwvYj4gcmVzYW1wbGVzCitmcm9tIDQ0LjEga0h6IHRvIDMyIGtIeiBbdGhpcyBzd2l0Y2ggZG9lc24ndCB3b3JrIHJlYWxseSB3ZWxsLiBWZXJ5Cit0aW5ueSBzb3VuZGluZyBvdXRwdXQgZmlsZXMuIEhhcyB0byBkbyB3aXRoIHRoZSB3YXkgSSBkbyB0aGUgcmVzYW1wbGluZworcHJvYmFibHldPC9saT4KKworICA8bGk+IEJvdGggb2YgdGhlc2Ugd2VyZSBwdXQgaW50byB0aGUgSVNPIGNvZGUgaW4gdGhlIGVuY29kZS5jCitmaWxlLCBhbmQgYXJlIHNpbXBseSBkaWZmZXJlbnQgd2F5cyBvZiBmaWxsaW5nIHRoZSBpbnB1dCBidWZmZXJzIGZyb20gYQorZmlsZS48L2xpPgorCis8L3VsPgorCis8aDM+T2N0b2JlciAzMSAxOTk4PC9oMz4KKzx1bD4KKworICA8bGk+IFZlcnNpb24gMi4xZCByZWxlYXNlZDwvbGk+CisKKyAgPGxpPiBGaXhlZCBtZW1vcnkgYWxsb2MgaW4gbXVzaWNpbi5jIChmb3IgbDNfc2Jfc2FtcGxlKTwvbGk+CisKKyAgPGxpPiBBZGRlZCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCAoLXgpIHRvIGZvcmNlIHN3YXBwaW5nIG9mCitieXRlIG9yZGVyPC9saT4KKworICA8bGk+IENsZWFuZWQgdXAgbWVtb3J5IHJvdXRpbmVzIGluIGwzcHN5LmMuIEFsbCB0aGUgbWVtX2FsbG9jKCkKK2FuZCBmcmVlKCkgcm91dGluZXMgd2hlcmUgY2hhbmdlZCBzbyB0aGF0IGl0IHdhcyBvbmx5IGRvbmUgPGk+b25jZTwvaT4KK2FuZCBub3QgZXZlcnkgc2luZ2xlIHRpbWUgdGhlIHJvdXRpbmUgd2FzIGNhbGxlZC48L2xpPgorCisgIDxsaT4gQWRkZWQgYSBjb21waWxlIHRpbWUgc3dpdGNoIC1EVElNRVIgdGhhdCBpbmNsdWRlcyBhbGwKK3RpbWluZyBpbmZvLiBJdCdzIGEgc3dpdGNoIGZvciB0aGUgdGltZSBiZWluZyB1bnRpbCBzb21lIG90aGVyIHBlb3BsZQoraGF2ZSB0ZXN0ZWQgb24gdGhlaXIgc3lzdGVtLiBUaW1pbmcgY29kZSBoYXMgYSB0ZW5kZW5jeSB0byBkbyBkaWZmZXJlbnQKK3RoaW5ncyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLjwvbGk+CisKKzwvdWw+CisKKzxoMz5PY3RvYmVyIDE4IDE5OTg8L2gzPgorPHVsPgorCisgIDxsaT4gVmVyc2lvbiAyLjFiIHJlbGVhc2VkLjwvbGk+CisKKyAgPGxpPiBGaXhlZCB1cCBidWc6IGFsbCBQQ00gZmlsZXMgd2VyZSBiZWluZyByZWFkIGFzIFdBVi48L2xpPgorCisgIDxsaT4gUGxheWVkIHdpdGggdGhlIG1lbV9hbGxvYyByb3V0aW5lIHRvIGZpeCBjcmFzaCB1bmRlcgorYW1pZ2FvcyAoanVzdCBhbGxvY2F0aW5nIHR3aWNlIGFzIG11Y2ggbWVtb3J5IGFzIG5lZWRlZCkuIE1pZ2h0IHNlZSBpZgord2UgY2FuIHRvdGFsbHkgZG8gd2l0aG91dCB0aGlzIHJvdXRpbmUuIEluZGl2aWR1YWwgbWFsbG9jKClzIHdoZXJlIHRoZXkKK2FyZSBuZWVkZWQgaW5zdGVhZDwvbGk+CisKKyAgPGxpPiBQdXQgSmFuIFBlbWFuJ3MgcXVhbGl0eSBzd2l0Y2ggYmFjayBpbi4gVGhpcyByZWR1Y2VzCitxdWFsaXR5IHZpYSB0aGUgJy1xJm5ic3A7Jmx0O2ludCZndDsnIHN3aXRjaC4gRnVuIHNwZWVkdXAgd2hpY2ggaXMKK21vc3RseSBoYXJtbGVzcyBpZiB5b3UncmUgbm90IGNvbmNlcm5lZCB3aXRoIHF1YWxpdHkuPC9saT4KKworICA8bGk+IENvbXBpbGluZyB3aXRoIGFtaWdhLWdjYyB3b3JrcyBmaW5lPC9saT4KKworPC91bD4KKworPGgzPk9jdG9iZXIgMTYgMTk5ODwvaDM+Cis8dWw+CisKKyAgPGxpPiBWZXJzaW9uIDIuMWEgcmVsZWFzZWQuIFVzZXIgaW5wdXQvb3V0cHV0IGhhcyBiZWVuIGNsZWFuZWQKK3VwIGEgYml0LiBXQVYgZmlsZSByZWFkaW5nIGlzIHRoZXJlIGluIGEgdmVyeSBydWRpbWVudGFyeSBzZW5zZSBpZSB0aGUKK3Byb2dyYW0gd2lsbCByZWNvZ25pemUgdGhlIGhlYWRlciBhbmQgc2tpcCBpdCwgYnV0IG5vdCByZWFkIGl0LiBUaGUgV0FWCitmaWxlIGlzIGFzc3VtZWQgdG8gYmUgMTZiaXQgc3RlcmVvIDQ0LjEga0h6LjwvbGk+CisKKzwvdWw+CisKKzxoMz5PY3RvYmVyIDYgMTk5ODwvaDM+Cis8dWw+CisKKyAgPGxpPiBWZXJzaW9uIDIuMSByZWxlYXNlZCB3aXRoIGFsbCB0YWJsZXMgbm93IGluY29ycG9yYXRlZCBpbnRvCit0aGUgZXhlLiBUaGFua3MgdG8gPGI+TGFycyBNYWduZSBJbmdlYnJpZ3RzZW5pPC9iPjwvbGk+CisKKzwvdWw+CisKKzxoMz5PY3RvYmVyIDQgMTk5ODwvaDM+CisKKzx1bD4KKyAgPGxpPgorICAgIEluIHJlc3BvbnNlIHRvIHNvbWUgY29uY2VybnMgYWJvdXQgdGhlIHF1YWxpdHkgb2YgdGhlIGVuY29kZXIsIEkKKyAgICBoYXZlIHJlYnVpbHQgdGhlIGVuY29kZXIgZnJvbSBzY3JhdGNoIGFuZCBjYXJlZnVsbHkgY29tcGFyZWQgb3V0cHV0CisgICAgYXQgYWxsIHN0YWdlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIHVubW9kaWZpZWQgSVNPIGVuY29kZXIuCisgIDwvbGk+CisgIDxsaT4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LnVxLm5ldC5hdS8lN0V6em1jaGVuZy9sYW1lL2Rvd25sb2FkLmh0bWwiPgorICAgIFZlcnNpb24gMi4wPC9hPiBvZiBMQU1FIGlzIGJ1aWx0IGZyb20gdGhlIElTTyBzb3VyY2UgY29kZSAoZGlzdDEwKSwKKyAgICBhbmQgaW5jb3Jwb3JhdGVzIG1vZGlmaWNhdGlvbnMgZnJvbSBteXNlbGYgYW5kIHRoZSA4aHogZWZmb3J0LiBUaGUKKyAgICBvdXRwdXQgZmlsZSBmcm9tIExBTUUgdjIuMCBpcyA8ZW0+aWRlbnRpY2FsPC9lbT4gdG8gdGhlIG91dHB1dCBvZgorICAgIHRoZSBJU08gZW5jb2RlciBmb3IgbXkgdGVzdCBmaWxlLiBTaW5jZSBJIGRvIG5vdCBoYXZlIGhlYXBzIG9mIHRpbWUsCisgICAgSSBsZWZ0IHRoZSBJU08gQUlGRiBmaWxlIHJlYWRlciBpbiB0aGUgY29kZSwgYW5kIGRpZCBub3QgaW5jb3Jwb3JhdGUKKyAgICBhIFdBViBmaWxlIHJlYWRlci4KKyAgPC9saT4KKyAgPGxpPgorICAgIEFkZGVkIHNlY3Rpb24KKyAgICBvbiA8YSBocmVmPSJodHRwOi8vd3d3LnVxLm5ldC5hdS8lN0V6em1jaGVuZy9sYW1lL3F1YWxpdHkuaHRtbCI+CisgICAgcXVhbGl0eTwvYT4uCisgIDwvbGk+Cis8L3VsPgorCis8aDM+IE9jdG9iZXIgMSAxOTk4PC9oMz4KKzx1bD4KKyAgPGxpPlVwZGF0ZWQgd2ViIHBhZ2UgYW5kIHJlbGVhc2VkIExBTUUgdjEuMDwvbGk+Cis8L3VsPgorCis8aHI+CisKKzxoMz5VcCB0byBTZXB0ZW1iZXIgMTk5ODwvaDM+Cis8cD5Xb3JraW5nIG9uIHRoZSA4aHogc291cmNlIGNvZGUuLi48L3A+Cis8dWw+CisgIDxsaT4KKyAgICBQYXRjaGVkIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Ljhoei5jb20vIj44aHo8L2E+IHNvdXJjZQorICAgIGNvZGUKKyAgPC9saT4KKyAgPGxpPgorICAgIDQ1JSBmYXN0ZXIgdGhhbiBvcmlnaW5hbCBzb3VyY2UgKG9uIG15IGZyZWVic2QgcDE2NikuCisgICAgPHVsPgorICAgICAgPGxpPgorCW0xIC0gc3BlZCB1cCB0aGUgbWRjdC5jIGFuZCBxdWFudGl6ZSgpIGZ1bmN0aW9ucyBbTURDVEQsCisJTURDVEQyLCBMT09QRF0KKyAgICAgIDwvbGk+CisgICAgICA8bGk+bTIgLSBzcGVkIHVwIHRoZSBmaWx0ZXJfc3ViYmFuZCByb3V0aW5lIHVzaW5nIDxiPlN0ZXBoYW5lCisJICBUYXZlbmFyZDwvYj4ncyB3b3JrIGZyb20gbXVzaWNpbiBbRklMVFNUXQorICAgICAgPC9saT4KKyAgICAgIDxsaT5tMiAtIG1pbm9yIGNsZWFudXAgb2Ygd2luZG93X3N1YmJhbmQgW1dJTkRTVDJdPC9saT4KKyAgICAgIDxsaT5tMiAtIENsZWFuZWQgdXAgYSBmZXcgYml0cyBpbiBsM3BzeS5jLiBSZXBsYWNlZCBhIHNwYXJzZQorCW1hdHJpeCBtdWx0aXBseSB3aXRoIGEgaGFuZCBjb25maWd1cmVkIHVucm9sbGluZyBbUFNZRF08L2xpPgorICAgICAgPGxpPm0zIC0gKGFtaWdhIG9ubHkpIEFkZGVkIGluIHRoZSBhc20gRkZUIGZvciBtNjhrIChiYXNlZCBvbgorCXNvdXJjZXMgZnJvbSA8Yj5IZW5yeWsgUmljaHRlcjwvYj4gYW5kIDxiPlN0ZXBoYW5lIFRhdmVuYXJkPC9iPik8L2xpPgorICAgICAgPGxpPm00IC0gcmF3IHBjbSBzdXBwb3J0IGJhY2sgaW48L2xpPgorICAgICAgPGxpPm01IC0gcHV0IGluIGEgYnl0ZS1vcmRlcmluZyBzd2l0Y2ggZm9yIHJhdyBQQ00gcmVhZGluZyAoanVzdAorCWluIGNhc2UpPC9saT4KKyAgICAgIDxsaT5tNiAtIHJld29ya2VkIHRoZSB3aG9sZSBmZnQuYyBmaWxlLiBmZnQgbm93IDEwLTE1JQorCWZhc3Rlci48L2xpPgorICAgICAgPGxpPm03IC0gdG90YWxseSBuZXcgZmZ0IHJvdXRpbmUuIGV4cGxvaXRzIGZhY3QgdGhhdCB0aGlzIGlzIGEKKwlyZWFsLSZndDtjb21wbGV4IGZmdC4gQWJvdXQgdHdpY2UgYXMgZmFzdCBhcyBwcmV2aW91cyBmYXN0ZXN0IGZmdCAoaW4KKwltNikuIChDIGZmdCByb3V0aW5lIGlzIGZhc3RlciB0aGFuIHRoZSBhc20gb25lIG9uIGFuIG02OGshKTwvbGk+CisgICAgICA8bGk+bTgKKwk8dWw+CisJICA8bGk+CisJICAgIE5vdyBlbmNvZGVzIGZyb20gc3RkaW4uIFVzZSAnLScgYXMgdGhlIGlucHV0IGZpbGVuYW1lLiAgVGhhbmtzCisJICAgIHRvIDxiPkJyYWQgVGhyZWF0dDwvYj4KKwkgIDwvbGk+CisJICA8bGk+CisJICAgIFdvcmtlZCBvdXQgdGhhdCB0aGUgMTAyNHBvaW50IEZGVCBvbmx5IGV2ZXIgdXNlcyB0aGUgZmlyc3QgNgorCSAgICBwaGkgdmFsdWVzLCBhbmQgdGhlIGZpcnN0IDQ2NSBlbmVyZ3kgdmFsdWVzLiBTYXZlcyBhIGJ1bmNoIG9mCisJICAgIGNhbGN1bGF0aW9ucy4KKwkgIDwvbGk+CisJICA8bGk+CisJICAgIEFkZGVkIGEgc3BlZWQtdXAvcXVhbGl0eSBzd2l0Y2guIFNwZWVkIGlzIGluY3JlYXNlZCBidXQKKwkgICAgcXVhbGl0eSBpcyBkZWNyZWFzZWQgPGk+c2xpZ2h0bHk8L2k+LiBNeSBlYXJzIGFyZSBiYWQgZW5vdWdoCisJICAgIG5vdCB0byBiZSBhYmxlIHRvIG5vdGljZSB0aGUgZGlmZmVyZW5jZSBpbiBxdWFsaXR5IGF0IGxvdworCSAgICBzZXR0aW5ncyA6KS4gU2V0dGluZyAnLXEgMScgaW1wcm92ZXMgc3BlZWQgYnkgYWJvdXQgMTAlLiAnLXEKKwkgICAgMTAwJyBpbXByb3ZlcyBzcGVlZCBieSBhYm91dCAyNiUuIEVub2Rpbmcgb2YgbXkgdGVzdCB0cmFjaworCSAgICBnb2VzIGZyb20gMTExcyAoYXQgZGVmYXVsdCAnLXEgMCcpIHRvIDgycyAoYXQgLXEgMTAwKS4gVGhhbmtzCisJICAgIHRvIDxiPkphbiBQZW1hbjwvYj4gZm9yIHRoaXMgdGlwLgorCSAgPC9saT4KKwk8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKwltOSAtIGZpeGVkIGFuIGVycm9yIGluIGwzcHN5LmMuIG51bWxpbmVzW10gaXMgb3ZlcndyaXR0ZW4gd2l0aAorCWluY29ycmVjdCBkYXRhLiBBZGRlZCBhIG5ldyB2YXJpYWJsZSBudW1saW5lc19zW10gdG8gZml4CisJdGhpcy4gVGhhbmtzIGFnYWluIHRvIDxiPkphbiBQZW1hbjwvYj4uCisgICAgICA8L2xpPgorICAgICAgPGxpPgorCW0xMCAtIERvd24gdG8gMTA2IHNlY29uZHMgYnkgc2VsZWN0aW5nIGEgZmV3IG1vcmUgY29tcGlsZXIKKwlvcHRpb25zLiBBbHNvIGFkZGVkIGEgcG93MjAoKSBmdW5jdGlvbiBpbiBsM2xvb3AuYyB0byBzcGVlZCB1cAorCShldmVyIHNvIHNsaWdodGx5KSBjYWxscyB0byBwb3coMi4wLCB4KQorICAgICAgPC9saT4KKyAgICAgIAorICAgICAgPGxpPm0xMQorCTx1bD4KKyAgICAgICAgICA8bGk+CisJICAgIE5vIHNwZWVkdXBzLiBKdXN0IGNsZWFuZWQgdXAgc29tZSBiaXRzIG9mIHRoZSBjb2RlLgorCSAgPC9saT4KKyAgICAgICAgICA8bGk+CisJICAgIENoYW5nZWQgSyZhbXA7UiBwcm90b3R5cGluZyB0byAnbm9ybWFsJyBmb3JtYXQuICBUaGFua3MKKwkgICAgdG8gPGI+U3RlZmZhbiBIYWV1c2VyPC9iPiBmb3IgaGlzIGhlbHAgaGVyZS4KKwkgIDwvbGk+CisgICAgICAgICAgPGxpPgorCSAgICBDaGFuZ2VkIHNvbWUgQysrIHN0eWxlIGNvbW1lbnRzIHRvIG5vcm1hbCBDIGNvbW1lbnRzIGluCisJICAgIGh1ZmZtYW4uYworCSAgPC9saT4KKyAgICAgICAgICA8bGk+CisJICAgIFJlbW92ZWQgdGhlICN3YXJuaW5nIGZyb20gcHN5X2RhdGEuaCAoaXQgd2FzIGdldHRpbmcKKwkgICAgYW5ub3lpbmchKQorCSAgPC9saT4KKyAgICAgICAgICA8bGk+CisJICAgIFJlbW92ZWQgcmVmZXJlbmNlIGluIGJpdHN0cmVhbS5jIHRvIG1hbGxvYy5oLiBJcyB0aGVyZSBhCisJICAgIHN5c3RlbSBsZWZ0IHdoZXJlIG1hbGxvYy5oIGhhc24ndCBiZWVuIHN1cGVyY2VkZWQgYnkKKwkgICAgc3RkbGliLmg/CisJICA8L2xpPgorCTwvdWw+CisgICAgICA8L2xpPgorICA8L3VsPgorCisgIDxsaT5JbiBQcm9nZXNzOgorICAgIDx1bD4KKyAgICAgIDxsaT4KKwlteSBQU1lEIGhhY2sgZm9yIHRoZSBzcHJlYWRpbmcgZnVuY3Rpb25zIGlzIG9ubHkgdmFsaWQgZm9yCisJNDQuMSBrSHogLSBTaG91bGQgcmVhbGx5IHB1dCBpbiBhICJpZiBmcmVxID0gNDQuMSBrSHoiCisJc3dpdGNoIGZvciBpdC4gU29tZW9uZSBtaWdodCB3YW50IHRvIGV4dGVuZCB0aGUgc3BlZWR1cCBmb3IKKwk0OCBhbmQgMzIga0h6LgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKwlQdXR0aW5nIGluIEphbiBQZW1hbidzIHF1YW50YW5mX2luaXQgc3BlZWR1cC4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKzwvdWw+CisKKzxocj4KKzxjZW50ZXI+Cis8cD4KKyAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2s/dXJpPXJlZmVyZXIiPgorICAgIDxpbWcgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC1odG1sNDAxIgorCSBhbHQ9IlZhbGlkIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCI+CisgIDwvYT4KKzwvcD4KKzwvY2VudGVyPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9pZDMuaHRtbCBiL2RvYy9odG1sL2lkMy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjU5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9pZDMuaHRtbApAQCAtMCwwICsxLDI2OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5JRDMgdGFnczwvVElUTEU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iQ29tbWFuZCBsaW5lIHN3aXRjaCByZWZlcmVuY2UiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9ImxhbWUiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvXzg4NTlfMSI+Cis8TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9ImxhbWUuY3NzIj4KKzwvSEVBRD4KKzxCT0RZIFRFWFQ9IzAwMDAwMAorICAgICAgICBCR0NPTE9SPSNGOUZCRkIgTElOSz0jMDA2NjY2IFZMSU5LPSM0QzRDNEMKKyAgICAgICAgQUxJTks9Izk5NTUwMD4KKzxIMT5JRDMgdGFnczwvSDE+Cis8cD4mbmJzcDs8L3A+Cis8cD5MQU1FIGlzIGFibGUgdG8gZW1iZWQgSUQzIHYxLCB2MS4xIG9yIHYyIHRhZ3MgaW5zaWRlIHRoZSBlbmNvZGVkIE1QMyBmaWxlLiAKKyAgVGhpcyBhbGxvd3MgdG8gaGF2ZSBzb21lIHVzZWZ1bGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG11c2ljIHRyYWNrIGluY2x1ZGVkIAorICBpbnNpZGUgdGhlIGZpbGUuIFRob3NlIGRhdGEgY2FuIGJlIHJlYWQgYnkgbW9zdCBNUDMgcGxheWVycy48YnI+CisgIDxicj4KKyAgTEFNRSB3aWxsIHNtYXJ0bHkgY2hvb3NlIHdpY2ggdGFncyB0byB1c2UuIEl0IHdpbGwgYWRkIElEMyB2MiB0YWdzIG9ubHkgaWYgdGhlIAorICBpbnB1dCBjb21tZW50cyB3b24ndCBmaW50IGluIHYxIG9yIHYxLjEgdGFncywgaWUgaWYgdGhleSBhcmUgbW9yZSB0aGFuIDMwIGNoYXJhY3RlcnMuIAorICBJbiB0aGlzIGNhc2UsIGJvdGggdjEgYW5kIHYyIHRhZ3Mgd2lsbCBiZSBhZGRlZCwgdG8gZW5zdXJlIHJlYWRpbmcgb2YgdGFncyBieSAKKyAgTVAzIHBsYXllcnMgd2ljaCBhcmUgdW5hYmxlIHRvIHJlYWQgSUQzIHYyIHRhZ3MuPC9wPgorPFA+IAorPFRBQkxFIENFTExQQURESU5HPTMgQk9SREVSPSIxIj4KKyAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgPFREIEFMSUdOPSJMRUZUIiBub3dyYXA+PGI+SUQzIGNvbW1lbnRzIHN3aXRjaGVzPC9iPjwvVEQ+CisgICAgPFREIEFMSUdOPSJMRUZUIiBub3dyYXA+PGI+cGFyYW1ldGVyczwvYj48L1REPgorICA8L1RSPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0tdHQgInRpdGxlIjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+dGl0bGUgb2Ygc29uZzwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+LS10YSAiYXJ0aXN0Ijwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+YXJ0aXN0IHdobyBkaWQgdGhlIHNvbmc8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0tdGwgImFsYnVtIjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+YWxidW0gd2hlcmUgaXQgY2FtZSBmcm9tPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD4tLXR5ICJ5ZWFyIjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+eWVhciBpbiB3aGljaCB0aGUgc29uZy9hbGJ1bSB3YXMgbWFkZTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+LS10YyAiY29tbWVudCI8L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmFkZGl0aW9uYWwgaW5mbzwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+LS10biAidHJhY2tbL3RvdGFsXSI8L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmF1ZGlvL3NvbmcgdHJhY2sgbnVtYmVyIGFuZCAob3B0aW9uYWxseSkgdGhlIHRvdGFsCisgICAgIG51bWJlciBvZiB0cmFja3Mgb24gdGhlIG9yaWdpbmFsIHJlY29yZGluZy48L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0tdGcgImdlbnJlIjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGdlbnJlIG9mIHNvbmcgKG5hbWUgb3IgbnVtYmVyKTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+LS10aSAiZmlsZSI8L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPiBhdWRpby9zb25nIGFsYnVtQXJ0IChqcGVnL3BuZy9naWYgZmlsZSwgMTI4S0IgbWF4LCB2Mi4zIHRhZyk8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0tdHYgImlkPXZhbHVlIjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IHVzZXItZGVmaW5lZCBmcmFtZSBzcGVjaWZpZWQgYnkgaWQgYW5kIHZhbHVlICh2Mi4zIHRhZyk8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxicj4KKzxicj4KKzxUQUJMRSBDRUxMUEFERElORz0zIEJPUkRFUj0iMSI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxiPklEMyBiZWhhdmlvdXIgc3dpdGNoZXM8L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD4mbmJzcDsgPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD4tLWFkZC1pZDN2Mjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGZvcmNlIGFkZGl0aW9uIG9mIHZlcnNpb24gMiB0YWc8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0taWQzdjEtb25seTwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGFkZCBvbmx5IGEgdmVyc2lvbiAxIHRhZzwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+LS1pZDN2Mi1vbmx5PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD4gYWRkIG9ubHkgYSB2ZXJzaW9uIDIgdGFnPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD4tLXNwYWNlLWlkM3YxPC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD4gcGFkIHZlcnNpb24gMSB0YWdzIHdpdGggc3BhY2VzIGluc3RlYWQgb2YgbnVsbHM8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0tcGFkLWlkM3YyPC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD4gc2FtZSBhcyAnLS1wYWQtaWQzdjItc2l6ZSAxMjgnPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD0iIj48a2JkPi0tcGFkLWlkM3YyLXNpemUgIm51bSI8L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPSIiPiBhZGRzIHZlcnNpb24gMiB0YWcsIHBhZCB3aXRoIGV4dHJhICJudW0iIGJ5dGVzPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0taWdub3JlLXRhZy1lcnJvcnM8L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPiBpZ25vcmUgZXJyb3JzIGluIHZhbHVlcyBwYXNzZWQgZm9yIHRhZ3MsIHVzZSBkZWZhdWx0cyBpbiBjYXNlIGFuIGVycm9yIG9jY291cnM8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPi0tZ2VucmUtbGlzdDwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IHByaW50IGFscGhhYmV0aWNhbGx5IHNvcnRlZCBJRDMgZ2VucmUgbGlzdCBhbmQgZXhpdDwvdGQ+CisgIDwvdHI+Cis8L1RBQkxFPgorPHA+PGJyPgorICBUaGUgZm9sbG93aW5nIGdlbnJlcyBhcmUgc3VwcG9ydGVkOjxicj4KKyAgPGJyPgorPC9wPgorPHRhYmxlIHdpZHRoPSI4MCUiIGJvcmRlcj0iMCI+CisgIDx0ciB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPiAKKyAgICA8dGQ+MDAgLSBCbHVlczxicj4KKyAgICAgIDAxIC0gQ2xhc3NpYyBSb2NrPGJyPgorICAgICAgMDIgLSBDb3VudHJ5PGJyPgorICAgICAgMDMgLSBEYW5jZTxicj4KKyAgICAgIDA0IC0gRGlzY288YnI+CisgICAgICAwNSAtIEZ1bms8YnI+CisgICAgICAwNiAtIEdydW5nZTxicj4KKyAgICAgIDA3IC0gSGlwLUhvcDxicj4KKyAgICAgIDA4IC0gSmF6ejxicj4KKyAgICAgIDA5IC0gTWV0YWw8YnI+CisgICAgICAxMCAtIE5ldyBBZ2U8YnI+CisgICAgICAxMSAtIE9sZGllczxicj4KKyAgICAgIDEyIC0gT3RoZXI8YnI+CisgICAgICAxMyAtIFBvcDxicj4KKyAgICAgIDE0IC0gUiZCPGJyPgorICAgICAgMTUgLSBSYXA8YnI+CisgICAgICAxNiAtIFJlZ2dhZTxicj4KKyAgICAgIDE3IC0gUm9jazxicj4KKyAgICAgIDE4IC0gVGVjaG5vPGJyPgorICAgICAgMTkgLSBJbmR1c3RyaWFsPGJyPgorICAgICAgMjAgLSBBbHRlcm5hdGl2ZTxicj4KKyAgICAgIDIxIC0gU2thPGJyPgorICAgICAgMjIgLSBEZWF0aCBNZXRhbDxicj4KKyAgICAgIDIzIC0gUHJhbmtzPGJyPgorICAgICAgMjQgLSBTb3VuZHRyYWNrPGJyPgorICAgICAgMjUgLSBFdXJvLVRlY2hubzxicj4KKyAgICAgIDI2IC0gQW1iaWVudDxicj4KKyAgICAgIDI3IC0gVHJpcC1Ib3A8YnI+CisgICAgICAyOCAtIFZvY2FsPGJyPgorICAgICAgMjkgLSBKYXp6K0Z1bms8YnI+CisgICAgICAzMCAtIEZ1c2lvbjxicj4KKyAgICAgIDMxIC0gVHJhbmNlPGJyPgorICAgICAgMzIgLSBDbGFzc2ljYWw8YnI+CisgICAgICAzMyAtIEluc3RydW1lbnRhbDxicj4KKyAgICAgIDM0IC0gQWNpZDxicj4KKyAgICAgIDM1IC0gSG91c2U8YnI+CisgICAgICAzNiAtIEdhbWU8YnI+CisgICAgICAzNyAtIFNvdW5kIENsaXA8YnI+CisgICAgICAzOCAtIEdvc3BlbDxicj4KKyAgICAgIDM5IC0gTm9pc2U8YnI+CisgICAgICA0MCAtIEFsdGVybmF0aXZlIFJvY2s8YnI+CisgICAgICA0MSAtIEJhc3M8YnI+CisgICAgICA0MyAtIFB1bms8YnI+CisgICAgICA0NCAtIFNwYWNlPGJyPgorICAgICAgNDUgLSBNZWRpdGF0aXZlPGJyPgorICAgICAgNDYgLSBJbnN0cnVtZW50YWwgUG9wPGJyPgorICAgICAgNDcgLSBJbnN0cnVtZW50YWwgUm9jazxicj4KKyAgICAgIDQ4IC0gRXRobmljPGJyPgorICAgICAgNDkgLSBHb3RoaWM8YnI+CisgICAgICA1MCAtIERhcmt3YXZlPGJyPgorICAgICAgNTEgLSBUZWNobm8tSW5kdXN0cmlhbDxicj4KKyAgICAgIDUyIC0gRWxlY3Ryb25pYzxicj4KKyAgICAgIDUzIC0gUG9wLUZvbGs8YnI+CisgICAgICA1NCAtIEV1cm9kYW5jZTxicj4KKyAgICAgIDU1IC0gRHJlYW08YnI+CisgICAgICA1NiAtIFNvdXRoZXJuIFJvY2s8YnI+CisgICAgICA1NyAtIENvbWVkeTxicj4KKyAgICAgIDU4IC0gQ3VsdDxicj4KKyAgICAgIDU5IC0gR2FuZ3N0YTxicj4KKyAgICAgIDYwIC0gVG9wIDQwPGJyPgorICAgICAgNjEgLSBDaHJpc3RpYW4gUmFwPGJyPgorICAgICAgNjIgLSBQb3AvRnVuazxicj4KKyAgICAgIDYzIC0gSnVuZ2xlPGJyPgorICAgICAgNjQgLSBOYXRpdmUgVVM8YnI+CisgICAgICA2NSAtIENhYmFyZXQ8YnI+CisgICAgICA2NiAtIE5ldyBXYXZlPGJyPgorICAgICAgNjcgLSBQc3ljaGVkZWxpYzxicj4KKyAgICAgIDY4IC0gUmF2ZTxicj4KKyAgICAgIDY5IC0gU2hvd3R1bmVzPGJyPgorICAgICAgNzAgLSBUcmFpbGVyPGJyPgorICAgICAgNzEgLSBMby1GaTxicj4KKyAgICAgIDcyIC0gVHJpYmFsPGJyPgorICAgICAgNzMgLSBBY2lkIFB1bms8YnI+CisgICAgICA3NCAtIEFjaWQgSmF6ejxicj4KKyAgICAgIDc1IC0gUG9sa2E8YnI+CisgICAgICA3NiAtIFJldHJvPGJyPgorICAgICAgNzcgLSBNdXNpY2FsPGJyPgorICAgICAgNzggLSBSb2NrICYgUm9sbDxicj4KKyAgICAgIDc5IC0gSGFyZCBSb2NrPGJyPgorICAgICAgODAgLSBGb2xrPGJyPgorICAgICAgODEgLSBGb2xrLVJvY2s8YnI+CisgICAgICA4MiAtIE5hdGlvbmFsIEZvbGs8YnI+CisgICAgICA4MyAtIFN3aW5nPGJyPgorICAgICAgODQgLSBGYXN0IEZ1c2lvbjxicj4KKyAgICAgIDg1IC0gQmVib2I8YnI+CisgICAgICA4NiAtIExhdGluPGJyPgorICAgICAgODcgLSBSZXZpdmFsPGJyPgorICAgICAgODggLSBDZWx0aWM8YnI+CisgICAgICA4OSAtIEJsdWVncmFzczxicj4KKyAgICAgIDkwIC0gQXZhbnRnYXJkZTxicj4KKyAgICAgIDkxIC0gR290aGljIFJvY2s8YnI+CisgICAgICA5MiAtIFByb2dyZXNzaXZlIFJvY2s8YnI+CisgICAgICA5MyAtIFBzeWNoZWRlbGljIFJvY2s8YnI+CisgICAgICA5NCAtIFN5bXBob25pYyBSb2NrPGJyPgorICAgICAgOTUgLSBTbG93IFJvY2s8YnI+CisgICAgICA5NiAtIEJpZyBCYW5kPGJyPgorICAgICAgOTcgLSBDaG9ydXM8YnI+CisgICAgICA5OCAtIEVhc3kgTGlzdGVuaW5nPGJyPgorICAgICAgOTkgLSBBY291c3RpYyA8L3RkPgorICAgIDx0ZD4xMDAgLSBIdW1vdXI8YnI+CisgICAgICAxMDEgLSBTcGVlY2g8YnI+CisgICAgICAxMDIgLSBDaGFuc29uPGJyPgorICAgICAgMTAzIC0gT3BlcmE8YnI+CisgICAgICAxMDQgLSBDaGFtYmVyIE11c2ljPGJyPgorICAgICAgMTA1IC0gU29uYXRhPGJyPgorICAgICAgMTA2IC0gU3ltcGhvbnk8YnI+CisgICAgICAxMDcgLSBCb290eSBCYXNzPGJyPgorICAgICAgMTA4IC0gUHJpbXVzPGJyPgorICAgICAgMTA5IC0gUG9ybiBHcm9vdmU8YnI+CisgICAgICAxMTAgLSBTYXRpcmU8YnI+CisgICAgICAxMTEgLSBTbG93IEphbTxicj4KKyAgICAgIDExMiAtIENsdWI8YnI+CisgICAgICAxMTMgLSBUYW5nbzxicj4KKyAgICAgIDExNCAtIFNhbWJhPGJyPgorICAgICAgMTE1IC0gRm9sa2xvcmU8YnI+CisgICAgICAxMTYgLSBCYWxsYWQ8YnI+CisgICAgICAxMTcgLSBQb3dlciBCYWxsYWQ8YnI+CisgICAgICAxMTggLSBSaHl0aG1pYyBTb3VsPGJyPgorICAgICAgMTE5IC0gRnJlZXN0eWxlPGJyPgorICAgICAgMTIwIC0gRHVldDxicj4KKyAgICAgIDEyMSAtIFB1bmsgUm9jazxicj4KKyAgICAgIDEyMiAtIERydW0gU29sbzxicj4KKyAgICAgIDEyMyAtIEEgQ2FwcGVsbGE8YnI+CisgICAgICAxMjQgLSBFdXJvLUhvdXNlPGJyPgorICAgICAgMTI1IC0gRGFuY2UgSGFsbDxicj4KKyAgICAgIDEyNiAtIEdvYTxicj4KKyAgICAgIDEyNyAtIERydW0gJiBCYXNzPGJyPgorICAgICAgMTI4IC0gQ2x1Yi1Ib3VzZTxicj4KKyAgICAgIDEyOSAtIEhhcmRjb3JlPGJyPgorICAgICAgMTMwIC0gVGVycm9yPGJyPgorICAgICAgMTMxIC0gSW5kaWU8YnI+CisgICAgICAxMzIgLSBCcml0UG9wPGJyPgorICAgICAgMTMzIC0gTmVnZXJwdW5rPGJyPgorICAgICAgMTM0IC0gUG9sc2sgUHVuazxicj4KKyAgICAgIDEzNSAtIEJlYXQ8YnI+CisgICAgICAxMzYgLSBDaHJpc3RpYW4gR2FuZ3N0YTxicj4KKyAgICAgIDEzNyAtIEhlYXZ5IE1ldGFsPGJyPgorICAgICAgMTM4IC0gQmxhY2sgTWV0YWw8YnI+CisgICAgICAxMzkgLSBDcm9zc292ZXI8YnI+CisgICAgICAxNDAgLSBDb250ZW1wb3JhcnkgQ2hyaXN0aWFuPGJyPgorICAgICAgMTQxIC0gQ2hyaXN0aWFuIFJvY2s8YnI+CisgICAgICAxNDIgLSBNZXJlbmd1ZTxicj4KKyAgICAgIDE0MyAtIFNhbHNhPGJyPgorICAgICAgMTQ0IC0gVGhyYXNoIE1ldGFsPGJyPgorICAgICAgMTQ1IC0gQW5pbWU8YnI+CisgICAgICAxNDYgLSBKUG9wPGJyPgorICAgICAgMTQ3IC0gU3ludGhQb3A8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPjxicj4KKyAgPGJyPgorICA8YnI+Cis8L3A+Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9pbmRleC5odG1sIGIvZG9jL2h0bWwvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNjMjQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvaW5kZXguaHRtbApAQCAtMCwwICsxLDU0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkxBTUUgVjMgTmV4dCBHZW5lcmF0aW9uIEhpZ2gtRW5kIE1QRUcgTGF5ZXIgSUlJIEVuY29kaW5nPC9USVRMRT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSJMQU1FIFYzIE5leHQgR2VuZXJhdGlvbiBIaWdoLUVuZCBNUEVHIExheWVyIElJSSBFbmNvZGluZyI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ibGFtZSI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc29fODg1OV8xIj4KKzxMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0ibGFtZS5jc3MiPgorPC9IRUFEPgorPEJPRFkgVEVYVD0jMDAwMDAwCisgICAgICAgIEJHQ09MT1I9I0Y5RkJGQiBMSU5LPSMwMDY2NjYgVkxJTks9IzRDNEM0QworICAgICAgICBBTElOSz0jOTk1NTAwPgorPEZPTlQgRkFDRSA9IEhlbHZldGljYSA+IAorPFA+IAorPEgxIEFMSUdOPSJDRU5URVIiPjxGT05UIFNJWkU9Iis0Ij48aT48Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj5MQU1FPC9mb250PjwvaT48Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj4gCisgIFYzLjk4PEJSPgorICA8L2ZvbnQ+PC9GT05UPiAKKyAgPFA+PGZvbnQgc2l6ZT0iKzQiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPiA8QlI+CisgICAgPC9mb250PiA8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj48QklHPkw8Zm9udCBjb2xvcj0iIzMzNjZGRiI+YW1lPC9mb250PiAKKyAgICBBPGZvbnQgY29sb3I9IiMzMzY2RkYiPmluJ3QgYW48L2ZvbnQ+IE08Zm9udCBjb2xvcj0iIzMzNjZGRiI+UDM8L2ZvbnQ+IEU8Zm9udCBjb2xvcj0iIzMzNjZGRiI+bmNvZGVyPC9mb250PjwvQklHPjwvZm9udD4gCisgIDxQPjxCSUc+IDxCUj4KKyAgICA8L0JJRz4gCis8L0gxPgorPFAgQUxJR049IkNFTlRFUiI+PFNUUk9ORz5PcGVuIFNvdXJjZSBQcm9qZWN0IDxCUj4KKyAgPEEgSFJFRj0iaHR0cDovL3d3dy5tcDNkZXYub3JnIj5odHRwOi8vd3d3Lm1wM2Rldi5vcmc8L0E+IDwvU1RST05HPjwvUD4KKzxQIEFMSUdOPSJMRUZUIj48L1A+Cis8UD4gCis8RElWIEFMSUdOPSJMRUZUIj4gCisgIDxQPiAKKzwvRElWPgorPEJSPgorPEhSPgorPGJyPgorPExJPjxBIEhSRUY9Im5vZGU2Lmh0bWwjU0VDVElPTjAwMzEwMDAwMDAwMDAwMDAwMDAwIj4gSW50cm9kdWN0aW9uPC9BPiAKKyAgPFVMPgorICAgIDxMST48QSBIUkVGPSJub2RlNi5odG1sI1NFQ1RJT04wMDMxMTAwMDAwMDAwMDAwMDAwMCI+IFRoZSBwdXJwb3NlIG9mIGF1ZGlvIAorICAgICAgY29tcHJlc3Npb248L0E+IAorICAgIDxMST48QSBIUkVGPSJub2RlNi5odG1sI1NFQ1RJT04wMDMxMjAwMDAwMDAwMDAwMDAwMCI+IFRoZSB0d28gcGFydHMgb2YgYXVkaW8gCisgICAgICBjb21wcmVzc2lvbjwvQT4gCisgICAgPExJPjxBIEhSRUY9Im5vZGU2Lmh0bWwjU0VDVElPTjAwMzEzMDAwMDAwMDAwMDAwMDAwIj4gQ29tcHJlc3Npb24gcmF0aW9zLCAKKyAgICAgIGJpdHJhdGUgYW5kIHF1YWxpdHk8L0E+IAorICA8L1VMPgorPExJPjxBIEhSRUY9ImV4YW1wbGVzLmh0bWwiPiBTb21lIGNvbW1hbmQgbGluZSBleGFtcGxlczwvQT4gCis8TEk+PEEgSFJFRj0ibW9kZXMuaHRtbCI+IENCUiwgQUJSIGFuZCBWQlI6IHRoZSAzIGVuY29kaW5nIG1vZGVzPC9BPiAKKzxMST48YSBocmVmPSJiYXNpYy5odG1sIj5CYXNpYyBjb21tYW5kIGxpbmUgc3dpdGNoIHJlZmVyZW5jZTwvYT4gCis8TEk+PGEgaHJlZj0ic3dpdGNocy5odG1sIj5GdWxsIGNvbW1hbmQgbGluZSBzd2l0Y2ggcmVmZXJlbmNlPC9hPiAKKzxMST48YSBocmVmPSJpZDMuaHRtbCI+SUQzIHRhZ3M8L2E+IAorPExJPjxhIGhyZWY9Imhpc3RvcnkuaHRtbCI+SGlzdG9yeTwvYT4gCis8TEk+PGEgaHJlZj0iY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT48QlI+Cis8L2ZvbnQ+IAorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvbGFtZS5jc3MgYi9kb2MvaHRtbC9sYW1lLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWMzZWJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvbGFtZS5jc3MKQEAgLTAsMCArMSwyNCBAQAorQk9EWSB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHBhZGRpbmctbGVmdDogMWNtOworICAgICAgICBtYXJnaW4tbGVmdDogMWNtOworICAgICB9CisKK2gxLCBoMiwgaDMgeworICAgICAgICBtYXJnaW4tbGVmdDogLTFjbTsgdGV4dC1hbGlnbjogbGVmdAorICAgICAgICB9CisKK1RBQkxFIHsgdGV4dC1hbGlnbjogbGVmdDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQorVEgge2JhY2tncm91bmQtY29sb3I6ICNDMEMwQzB9CitURCB7Zm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQorCitTTUFMTC5USU5ZCQl7IGZvbnQtc2l6ZSA6IHh4LXNtYWxsIH0KK1NNQUxMLlNDUklQVFNJWkUJeyBmb250LXNpemUgOiB4eC1zbWFsbCB9CitTTUFMTC5GT09UTk9URVNJWkUJeyBmb250LXNpemUgOiB4LXNtYWxsICB9CitTTUFMTC5TTUFMTAkJeyBmb250LXNpemUgOiBzbWFsbCAgICB9CitCSUcuTEFSR0UJCXsgZm9udC1zaXplIDogbGFyZ2UgICAgfQorQklHLlhMQVJHRQkJeyBmb250LXNpemUgOiB4LWxhcmdlICB9CitCSUcuWFhMQVJHRQkJeyBmb250LXNpemUgOiB4eC1sYXJnZSB9CitCSUcuSFVHRQkJeyBmb250LXNpemUgOiB4eC1sYXJnZSB9CitCSUcuWEhVR0UJCXsgZm9udC1zaXplIDogeHgtbGFyZ2UgfQpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvbW9kZXMuaHRtbCBiL2RvYy9odG1sL21vZGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3NzA3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL21vZGVzLmh0bWwKQEAgLTAsMCArMSw0OCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5FbmNvZGluZyBtb2RlczwvVElUTEU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iQ29tbWFuZCBsaW5lIHN3aXRjaCByZWZlcmVuY2UiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9ImxhbWUiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvXzg4NTlfMSI+Cis8TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9ImxhbWUuY3NzIj4KKzwvSEVBRD4KKzxCT0RZIFRFWFQ9IzAwMDAwMAorICAgICAgICBCR0NPTE9SPSNGOUZCRkIgTElOSz0jMDA2NjY2IFZMSU5LPSM0QzRDNEMKKyAgICAgICAgQUxJTks9Izk5NTUwMD4KKzxIMT5DQlIvQUJSL1ZCUjogdGhlIDMgZW5jb2RpbmcgbW9kZXM8L0gxPgorPHA+Jm5ic3A7PC9wPgorPHA+TEFNRSBpcyBhYmxlIHRvIGVuY29kZSB5b3VyIG11c2ljIHVzaW5nIG9uZSBvZiBpdHMgMyBlbmNvZGluZyBtb2RlczogY29uc3RhbnQgCisgIGJpdHJhdGUgKENCUiksIGF2ZXJhZ2UgYml0cmF0ZSAoQUJSKSBhbmQgdmFyaWFibGUgYml0cmF0ZSAoVkJSKS48YnI+CisgIDxicj4KKyAgPGJyPgorPC9wPgorPGgyPkNvbnN0YW50IEJpdHJhdGUgKENCUik8L2gyPgorPHA+VGhpcyBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBtb2RlLCBhbmQgYWxzbyB0aGUgbW9zdCBiYXNpYy4gSW4gdGhpcyBtb2RlLCB0aGUgCisgIGJpdHJhdGUgd2lsbCBiZSB0aGUgc2FtZSBmb3IgdGhlIHdob2xlIGZpbGUuIEl0IG1lYW5zIHRoYXQgZWFjaCBwYXJ0IG9mIHlvdXIgCisgIG1wMyBmaWxlIHdpbGwgYmUgdXNpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMuIFRoZSBtdXNpY2FsIHBhc3NhZ2UgYmVlaW5nIGEgCisgIGRpZmZpY3VsdCBvbmUgdG8gZW5jb2RlIG9yIGFuIGVhc3kgb25lLCB0aGUgZW5jb2RlciB3aWxsIHVzZSB0aGUgc2FtZSBiaXRyYXRlLCAKKyAgc28gdGhlIHF1YWxpdHkgb2YgeW91ciBtcDMgaXMgdmFyaWFibGUuIENvbXBsZXggcGFydHMgd2lsbCBiZSBvZiBhIGxvd2VyIHF1YWxpdHkgCisgIHRoYW4gdGhlIGVhc2llc3Qgb25lcy4gVGhlIG1haW4gYWR2YW50YWdlIGlzIHRoYXQgdGhlIGZpbmFsIGZpbGVzIHNpemUgd29uJ3QgCisgIGNoYW5nZSBhbmQgY2FuIGJlIGFjY3VyYXRlbHkgcHJlZGljdGVkLjxicj4KKyAgPGJyPgorPC9wPgorPGgyPkF2ZXJhZ2UgQml0cmF0ZSAoQUJSKTwvaDI+Cis8cD5JbiB0aGlzIG1vZGUsIHlvdSBjaG9vc2UgYSB0YXJnZXQgYml0cmF0ZSBhbmQgdGhlIGVuY29kZXIgd2lsbCB0cnkgdG8gY29uc3RhbnRseSAKKyAgbWFpbnRhaW4gYW4gYXZlcmFnZSBiaXRyYXRlIHdoaWxlIHVzaW5nIGhpZ2hlciBiaXRyYXRlcyBmb3IgdGhlIHBhcnRzIG9mIHlvdXIgCisgIG11c2ljIHRoYXQgbmVlZCBtb3JlIGJpdHMuIFRoZSByZXN1bHQgd2lsbCBiZSBvZiBoaWdoZXIgcXVhbGl0eSB0aGFuIENCUiBlbmNvZGluZyAKKyAgd2hpbGUgdGhlIGF2ZXJhZ2UgZmlsZSBzaXplIHdpbGwgcmVtYWluIHByZWRpY3RpYmxlLCBzbyB0aGlzIG1vZGUgaXMgaGlnaGx5IAorICByZWNvbW1lbmRlZCBvdmVyIENCUi48YnI+CisgIDxicj4KKzwvcD4KKzxoMj5WYXJpYWJsZSBiaXRyYXRlIChWQlIpPC9oMj4KKzxwPkluIHRoaXMgbW9kZSwgeW91IGNob29zZSB0aGUgZGVzaXJlZCBxdWFsaXR5IG9uIGEgc2NhbGUgZ29pbmcgZnJvbSA5IChsb3dlc3QgCisgIHF1YWxpdHkvaGlnaGVzdCBkaXN0b3J0aW9uKSB0byAwIChoaWdoZXN0IHF1YWxpdHkvbG93ZXN0IGRpc3RvcnRpb24pLiBUaGVuIGVuY29kZXIgCisgIHRyaWVzIHRvIG1haW50YWluIHRoZSBnaXZlbiBxdWFsaXR5IGluIHRoZSB3aG9sZSBmaWxlIGJ5IGNob29zaW5nIHRoZSBvcHRpbWFsIAorICBudW1iZXIgb2YgYml0cyB0byBzcGVuZCBmb3IgZWFjaCBwYXJ0IG9mIHlvdXIgbXVzaWMuIFRoZSBtYWluIGFkdmFudGFnZSBpcyB0aGF0IAorICB5b3UgYXJlIGFibGUgdG8gc3BlY2lmeSB0aGUgcXVhbGl0eSBsZXZlbCB0aGF0IHlvdSB3YW50IHRvIHJlYWNoLCBidXQgdGhlIGluY29udmVuaWVudCAKKyAgaXMgdGhhdCB0aGUgZmluYWwgZmlsZSBzaXplIGlzIHRvdGFsbHkgdW5wcmVkaWN0aWJsZS48L3A+Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9ub2RlNi5odG1sIGIvZG9jL2h0bWwvbm9kZTYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU5NzkwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvbm9kZTYuaHRtbApAQCAtMCwwICsxLDEzMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5JbnRyb2R1Y3Rpb248L1RJVExFPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IkludHJvZHVjdGlvbiI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ibGFtZSI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc29fODg1OV8xIj4KKzxMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0ibGFtZS5jc3MiPgorPC9IRUFEPgorPEJPRFkgVEVYVD0jMDAwMDAwCisgICAgICAgIEJHQ09MT1I9I0Y5RkJGQiBMSU5LPSMwMDY2NjYgVkxJTks9IzRDNEM0QworICAgICAgICBBTElOSz0jOTk1NTAwPgorPEZPTlQgRkFDRSA9IEhlbHZldGljYSA+PHN0cm9uZz5TdWJzZWN0aW9uczwvc3Ryb25nPgorPFVMPgorICA8TEk+PEEgCisgSFJFRj0ibm9kZTYuaHRtbCNTRUNUSU9OMDAzMTEwMDAwMDAwMDAwMDAwMDAiPiBUaGUgcHVycG9zZSBvZiBhdWRpbyBjb21wcmVzc2lvbjwvQT4gCisgIDxMST48QSAKKyBIUkVGPSJub2RlNi5odG1sI1NFQ1RJT04wMDMxMjAwMDAwMDAwMDAwMDAwMCI+IFRoZSB0d28gcGFydHMgb2YgYXVkaW8gY29tcHJlc3Npb248L0E+IAorICA8TEk+PEEgCisgSFJFRj0ibm9kZTYuaHRtbCNTRUNUSU9OMDAzMTMwMDAwMDAwMDAwMDAwMDAiPiBDb21wcmVzc2lvbiByYXRpb3MsIGJpdHJhdGUgYW5kIAorICAgIHF1YWxpdHk8L0E+IAorPC9VTD4KKworPEhSPgorPEgxPjxBIE5BTUU9IlNFQ1RJT04wMDMxMDAwMDAwMDAwMDAwMDAwMCI+IEludHJvZHVjdGlvbjwvQT4gPC9IMT4KK1RoZXJlIGlzIGEgbG90IG9mIGNvbmZ1c2lvbiBzdXJyb3VuZGluZyB0aGUgdGVybXMgPEk+YXVkaW8gY29tcHJlc3Npb248L0k+LCA8ST5hdWRpbyAKK2VuY29kaW5nPC9JPiwgYW5kIDxJPmF1ZGlvIGRlY29kaW5nPC9JPi4gVGhpcyBzZWN0aW9uIHdpbGwgZ2l2ZSB5b3UgYW4gb3ZlcnZpZXcgCit3aGF0IGF1ZGlvIGNvZGluZyAoYW5vdGhlciBvbmUgb2YgdGhlc2UgdGVybXMuLi4pIGlzIGFsbCBhYm91dC4gCis8UD4gCis8SDI+PEEgTkFNRT0iU0VDVElPTjAwMzExMDAwMDAwMDAwMDAwMDAwIj4gVGhlIHB1cnBvc2Ugb2YgYXVkaW8gY29tcHJlc3Npb248L0E+IAorPC9IMj4KKzxQPiBVcCB0byB0aGUgYWR2ZW50IG9mIGF1ZGlvIGNvbXByZXNzaW9uLCBoaWdoLXF1YWxpdHkgZGlnaXRhbCBhdWRpbyBkYXRhIHRvb2sgCisgIGEgbG90IG9mIGhhcmQgZGlzayBzcGFjZSB0byBzdG9yZS4gTGV0IHVzIGdvIHRocm91Z2ggYSBzaG9ydCBleGFtcGxlLiAKKzxQPiBZb3Ugd2FudCB0bywgc2F5LCBzYW1wbGUgeW91ciBmYXZvcml0ZSAxLW1pbnV0ZSBzb25nIGFuZCBzdG9yZSBpdCBvbiB5b3VyIAorICBoYXJkZGlzay4gQmVjYXVzZSB5b3Ugd2FudCBDRCBxdWFsaXR5LCB5b3Ugc2FtcGxlIGF0IDQ0LjEga0h6LCBzdGVyZW8sIAorICB3aXRoIDE2IGJpdHMgcGVyIHNhbXBsZS4gCis8UD4gNDQxMDAgSHogbWVhbnMgdGhhdCB5b3UgaGF2ZSA0NDEwMCB2YWx1ZXMgcGVyIHNlY29uZCBjb21pbmcgaW4gZnJvbSB5b3VyIHNvdW5kIAorICBjYXJkIChvciBpbnB1dCBmaWxlKS4gTXVsdGlwbHkgdGhhdCBieSB0d28gYmVjYXVzZSB5b3UgaGF2ZSB0d28gY2hhbm5lbHMuIE11bHRpcGx5IAorICBieSBhbm90aGVyIGZhY3RvciBvZiB0d28gYmVjYXVzZSB5b3UgaGF2ZSB0d28gYnl0ZXMgcGVyIHZhbHVlICh0aGF0J3Mgd2hhdCAxNiAKKyAgYml0IG1lYW5zKS4gVGhlIHNvbmcgd2lsbCB0YWtlIHVwIDxOT0JSPjQ0MTAwIHNhbXBsZXMvcyAmbWlkZG90OyAyIGNoYW5uZWxzIAorICAmbWlkZG90OyAyIGJ5dGVzL3NhbXBsZSAmbWlkZG90OyA2MCBzL21pbiB+IDEwIE1CeXRlczwvTk9CUj4gb2Ygc3RvcmFnZSBzcGFjZSAKKyAgb24geW91ciBoYXJkZGlzay4gCis8UD4gSWYgeW91IHdhbnRlZCB0byBkb3dubG9hZCB0aGF0IG92ZXIgdGhlIGludGVybmV0LCBnaXZlbiBhbiBhdmVyYWdlIDU2ayZuYnNwO21vZGVtIAorICBjb25uZWN0ZWQgYXQgNDRrICh3aGljaCBpcyBhIHR5cGljYWwgY2FzZSksIGl0IHdvdWxkIHRha2UgeW91IChhdCBsZWFzdCkgPE5PQlI+MTAwMDAwMDAgCisgIGJ5dGVzICZtaWRkb3Q7IDggYml0cy9ieXRlIC8gKDQ0MDAwIGJpdHMvcykgJm1pZGRvdDsgLyAoNjAgcy9taW4pIH4gMzAgbWludXRlczwvTk9CUj4gCis8RElWIEFMSUdOPSJDRU5URVIiPiA8Qj5KdXN0IHRvIGRvd25sb2FkIG9uZSBtaW51dGUgb2YgbXVzaWMhPC9CPiA8L0RJVj4KKzxQPiBEaWdpdGFsIGF1ZGlvIGNvZGluZywgd2hpY2ggLSBpbiB0aGlzIGNvbnRleHQgLSBpcyBzeW5vbnltb3VzbHkgY2FsbGVkIGRpZ2l0YWwgCisgIGF1ZGlvIGNvbXByZXNzaW9uIGFzIHdlbGwsIGlzIHRoZSBhcnQgb2YgbWluaW1pemluZyBzdG9yYWdlIHNwYWNlIChvciBjaGFubmVsIAorICBiYW5kd2lkdGgpIHJlcXVpcmVtZW50cyBmb3IgYXVkaW8gZGF0YS4gTW9kZXJuIHBlcmNlcHR1YWwgYXVkaW8gY29kaW5nIHRlY2huaXF1ZXMgCisgIChsaWtlIE1QRUcgTGF5ZXIgSUlJKSBleHBsb2l0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBodW1hbiBlYXIgKHRoZSBwZXJjZXB0aW9uIAorICBvZiBzb3VuZCkgdG8gYWNoaWV2ZSBhIHNpemUgcmVkdWN0aW9uIGJ5IGEgZmFjdG9yIG9mIDExIHdpdGggbGl0dGxlIG9yIG5vIHBlcmNlcHRpYmxlIAorICBsb3NzIG9mIHF1YWxpdHkuIAorPFA+IFRoZXJlZm9yZSwgc3VjaCBzY2hlbWVzIGFyZSB0aGUga2V5IHRlY2hub2xvZ3kgZm9yIGhpZ2ggcXVhbGl0eSBsb3cgYml0LXJhdGUgCisgIGFwcGxpY2F0aW9ucywgbGlrZSBzb3VuZHRyYWNrcyBmb3IgQ0QtUk9NIGdhbWVzLCBzb2xpZC1zdGF0ZSBzb3VuZCBtZW1vcmllcywgCisgIEludGVybmV0IGF1ZGlvLCBkaWdpdGFsIGF1ZGlvIGJyb2FkY2FzdGluZyBzeXN0ZW1zLCBhbmQgdGhlIGxpa2UuIAorPFA+IAorPEgyPjxBIE5BTUU9IlNFQ1RJT04wMDMxMjAwMDAwMDAwMDAwMDAwMCI+IFRoZSB0d28gcGFydHMgb2YgYXVkaW8gY29tcHJlc3Npb248L0E+IAorPC9IMj4KKzxQPiBBdWRpbyBjb21wcmVzc2lvbiByZWFsbHkgY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBUaGUgZmlyc3QgcGFydCwgY2FsbGVkIDxJPmVuY29kaW5nPC9JPiwgCisgIHRyYW5zZm9ybXMgdGhlIGRpZ2l0YWwgYXVkaW8gZGF0YSB0aGF0IHJlc2lkZXMsIHNheSwgaW4gYSBXQVZFIGZpbGUsIGludG8gYSAKKyAgaGlnaGx5IGNvbXByZXNzZWQgZm9ybSBjYWxsZWQgPEk+Yml0c3RyZWFtPC9JPi4gVG8gcGxheSB0aGUgYml0c3RyZWFtIG9uIHlvdXIgCisgIHNvdW5kY2FyZCwgeW91IG5lZWQgdGhlIHNlY29uZCBwYXJ0LCBjYWxsZWQgPEk+ZGVjb2Rpbmc8L0k+LiBEZWNvZGluZyB0YWtlcyAKKyAgdGhlIGJpdHN0cmVhbSBhbmQgcmUtZXhwYW5kcyBpdCB0byBhIFdBVkUgZmlsZS4gCis8UD4gVGhlIHByb2dyYW0gdGhhdCBlZmZlY3RzIHRoZSBmaXJzdCBwYXJ0IGlzIGNhbGxlZCBhbiBhdWRpbyA8ST5lbmNvZGVyPC9JPi4gCisgIDxpPkxBTUU8L2k+IGlzIHN1Y2ggYW4gZW5jb2RlciAuIFRoZSBwcm9ncmFtIHRoYXQgZG9lcyB0aGUgc2Vjb25kIHBhcnQgaXMgY2FsbGVkIAorICBhbiBhdWRpbyA8ST5kZWNvZGVyPC9JPi4gT25lIHdlbGwta25vd24gTVBFRyZuYnNwO0xheWVyIElJSSBkZWNvZGVyIGlzIDx0dD5YbW1zPC90dD4sIAorICBhbm90aGVyIDxUVD5tcGcxMjM8L1RUPi4gQm90aCBjYW4gYmUgZm91bmQgb24gPEEgTkFNRT0idGV4Mmh0bWwxIgorIEhSRUY9Imh0dHA6Ly93d3cubXAzLXRlY2gub3JnIj53dy5tcDMtdGVjaC5vcmc8L0E+IC4gCis8SDI+PEEgTkFNRT0iU0VDVElPTjAwMzEzMDAwMDAwMDAwMDAwMDAwIj4gQ29tcHJlc3Npb24gcmF0aW9zLCBiaXRyYXRlIGFuZCBxdWFsaXR5PC9BPiAKKzwvSDI+Cis8UD4gSXQgaGFzIG5vdCBiZWVuIGV4cGxpY2l0bHkgbWVudGlvbmVkIHVwIHRvIG5vdzogV2hhdCB5b3UgZW5kIHVwIHdpdGggYWZ0ZXIgCisgIGVuY29kaW5nIGFuZCBkZWNvZGluZyBpcyBub3QgdGhlIHNhbWUgc291bmQgZmlsZSBhbnltb3JlOiBBbGwgc3VwZXJmbG91cyBpbmZvcm1hdGlvbiAKKyAgaGFzIGJlZW4gc3F1ZWV6ZWQgb3V0LCBzbyB0byBzYXkuIEl0IGlzIG5vdCB0aGUgc2FtZSA8ST5maWxlPC9JPiwgYnV0IGl0IHdpbGwgCisgIDxJPnNvdW5kPC9JPiB0aGUgc2FtZSAtIG1vcmUgb3IgbGVzcywgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIGNvbXByZXNzaW9uIGhhZCAKKyAgYmVlbiBwZXJmb3JtZWQgb24gaXQuIAorPFA+IEdlbmVyYWxseSBzcGVha2luZywgdGhlIGxvd2VyIHRoZSBjb21wcmVzc2lvbiByYXRpbyBhY2hpZXZlZCwgdGhlIGJldHRlciB0aGUgCisgIHNvdW5kIHF1YWxpdHkgd2lsbCBiZSBpbiB0aGUgZW5kIC0gYW5kIDxJPnZpY2UgdmVyc2E8L0k+LiBUYWJsZSA8QSBIUkVGPSJub2RlNi5odG1sI3RhYmxlLXNvdW5kcSI+MS4xPC9BPiAKKyAgZ2l2ZXMgeW91IGFuIG92ZXJ2aWV3IGFib3V0IHF1YWxpdHkgYWNoaWV2YWJsZS4gCis8UD4gQmVjYXVzZSBjb21wcmVzc2lvbiByYXRpbyBpcyBhIHNvbWV3aGF0IHVud2llbGR5IG1lYXN1cmUsIGV4cGVydHMgdXNlIHRoZSAKKyAgdGVybSA8ST5iaXRyYXRlPC9JPiB3aGVuIHNwZWFraW5nIG9mIHRoZSBzdHJlbmd0aCBvZiBjb21wcmVzc2lvbi4gQml0cmF0ZSBkZW5vdGVzIAorICB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYml0cyB0aGF0IG9uZSBzZWNvbmQgb2YgYXVkaW8gZGF0YSB3aWxsIHRha2UgdXAgaW4geW91ciAKKyAgY29tcHJlc3NlZCBiaXRzdHJlYW0uIFVzdWFsbHkgdGhlIHVuaXRzIHVzZWQgd2lsbCBiZSBrYnBzLCB3aGljaCBpcyA8U1VQPmtiaXRzPC9TVVA+LzxTVUI+czwvU1VCPiwgCisgIG9yIDEwMDAmbmJzcDs8U1VQPmJpdHM8L1NVUD4vPFNVQj5zPC9TVUI+LiBUbyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyAKKyAgcGVyIHNlY29uZCBvZiBhdWRpbyBkYXRhLCBzaW1wbHkgZGl2aWRlIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgc2Vjb25kIGJ5IGVpZ2h0LiAKKzxQPiA8QlI+Cis8RElWIEFMSUdOPSJDRU5URVIiPjxBIE5BTUU9InRhYmxlLXNvdW5kcSI+JiMxNjA7PC9BPiA8QSBOQU1FPSI5NSI+JiMxNjA7PC9BPiAKKyAgPFRBQkxFIENFTExQQURESU5HPTMgQk9SREVSPSIxIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjIyNSI+CisgICAgPENBUFRJT04+PFNUUk9ORz5UYWJsZSAxLjE6PC9TVFJPTkc+IEJpdHJhdGUgdmVyc3VzIHNvdW5kIHF1YWxpdHk8L0NBUFRJT04+CisgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICA8VEQgQUxJR049IlJJR0hUIiBub3dyYXAgd2lkdGg9IjExNSI+Qml0cmF0ZTwvVEQ+CisgICAgICA8VEQgQUxJR049IlJJR0hUIiBub3dyYXAgd2lkdGg9IjY3Ij5CYW5kd2lkdGg8L1REPgorICAgICAgPFREIEFMSUdOPSJMRUZUIiBub3dyYXAgd2lkdGg9IjI0NiI+UXVhbGl0eSBjb21wYXJhYmxlIHRvIG9yIGJldHRlciB0aGFuPC9URD4KKyAgICA8L1RSPgorICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgPFREIEFMSUdOPSJSSUdIVCIgbm93cmFwIHdpZHRoPSIxMTUiPjE2IGticHM8L1REPgorICAgICAgPFREIEFMSUdOPSJSSUdIVCIgbm93cmFwIHdpZHRoPSI2NyI+NC41IGtIejwvVEQ+CisgICAgICA8VEQgQUxJR049IkxFRlQiIG5vd3JhcCB3aWR0aD0iMjQ2Ij5zaG9ydHdhdmUgcmFkaW88L1REPgorICAgIDwvVFI+CisgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICA8VEQgQUxJR049IlJJR0hUIiBub3dyYXAgd2lkdGg9IjExNSI+MzIga2JwczwvVEQ+CisgICAgICA8VEQgQUxJR049IlJJR0hUIiBub3dyYXAgd2lkdGg9IjY3Ij43LjUga0h6PC9URD4KKyAgICAgIDxURCBBTElHTj0iTEVGVCIgbm93cmFwIHdpZHRoPSIyNDYiPkFNIHJhZGlvPC9URD4KKyAgICA8L1RSPgorICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgPFREIEFMSUdOPSJSSUdIVCIgbm93cmFwIHdpZHRoPSIxMTUiPjk2IGticHM8L1REPgorICAgICAgPFREIEFMSUdOPSJSSUdIVCIgbm93cmFwIHdpZHRoPSI2NyI+MTEga0h6PC9URD4KKyAgICAgIDxURCBBTElHTj0iTEVGVCIgbm93cmFwIHdpZHRoPSIyNDYiPkZNIHJhZGlvPC9URD4KKyAgICA8L1RSPgorICAgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgICAgPHRkIGFsaWduPSJSSUdIVCIgbm93cmFwIHdpZHRoPSIxMTUiPjEyOCBrYnBzPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iUklHSFQiIG5vd3JhcCB3aWR0aD0iNjciPjE2IGtIejwvdGQ+CisgICAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcCB3aWR0aD0iMjQ2Ij5uZWFyIENEPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgICAgPHRkIGFsaWduPSJSSUdIVCIgbm93cmFwIHdpZHRoPSIxMTUiPjE2MC0xODAga2JwcyA8YnI+CisgICAgICAgICh2YXJpYWJsZSBiaXRyYXRlKTwvdGQ+CisgICAgICA8dGQgYWxpZ249IlJJR0hUIiBub3dyYXAgd2lkdGg9IjY3Ij4yMCBrSHo8L3RkPgorICAgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXAgd2lkdGg9IjI0NiI+cGVyY2VwdHVhbCB0cmFuc3BhcmVuY3k8L3RkPgorICAgIDwvdHI+CisgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICA8VEQgQUxJR049IlJJR0hUIiBub3dyYXAgd2lkdGg9IjExNSI+MjU2IGticHM8L1REPgorICAgICAgPFREIEFMSUdOPSJSSUdIVCIgbm93cmFwIHdpZHRoPSI2NyI+MjIga0h6PC9URD4KKyAgICAgIDxURCBBTElHTj0iTEVGVCIgbm93cmFwIHdpZHRoPSIyNDYiPnN0dWRpbzwvVEQ+CisgICAgPC9UUj4KKyAgPC9UQUJMRT4KKzwvRElWPgorPEJSPgorPC9mb250PiAKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvYy9odG1sL3N3aXRjaHMuaHRtbCBiL2RvYy9odG1sL3N3aXRjaHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI1MjFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvc3dpdGNocy5odG1sCkBAIC0wLDAgKzEsMTEzMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5GdWxsIGNvbW1hbmQgbGluZSBzd2l0Y2ggcmVmZXJlbmNlPC9USVRMRT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSJDb21tYW5kIGxpbmUgc3dpdGNoIHJlZmVyZW5jZSI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ibGFtZSI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc29fODg1OV8xIj4KKzxMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0ibGFtZS5jc3MiPgorPC9IRUFEPgorPEJPRFkgVEVYVD0jMDAwMDAwCisgICAgICAgIEJHQ09MT1I9I0Y5RkJGQiBMSU5LPSMwMDY2NjYgVkxJTks9IzRDNEM0QworICAgICAgICBBTElOSz0jOTk1NTAwPgorPEgxPkZ1bGwgY29tbWFuZCBsaW5lIHN3aXRjaCByZWZlcmVuY2U8L0gxPgorPFA+IDxmb250IHNpemU9Ii0xIj5ub3RlOiBPcHRpb25zIHdoaWNoIGNvdWxkIGV4aXN0IHdpdGhvdXQgYmVpbmcgZG9jdW1lbnRlZCAKKyAgaGVyZSBhcmUgY29uc2lkZXJlZCBhcyBleHBlcmltZW50YWwgb25lcy4gU3VjaCBleHBlcmltZW50YWwgb3B0aW9ucyBzaG91bGQgdXN1YWxseSAKKyAgbm90IGJlIHVzZWQuPC9mb250PiAKKzxQPiAKKzxUQUJMRSBDRUxMUEFERElORz0zIEJPUkRFUj0iMSI+CisgIDxUUiBWQUxJR049IlRPUCI+IAorICAgIDxURCBBTElHTj0iTEVGVCIgbm93cmFwPjxiPnN3aXRjaDwvYj48L1REPgorICAgIDxURCBBTElHTj0iTEVGVCIgbm93cmFwPjxiPnBhcmFtZXRlcjwvYj48L1REPgorICA8L1RSPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiNhIj4tYTwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmRvd25taXggc3RlcmVvIGZpbGUgdG8gbW9ubzwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1hYnIiPi0tYWJyPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+YXZlcmFnZSBiaXRyYXRlIGVuY29kaW5nPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjYiI+LWI8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5iaXRyYXRlICg4Li4uMzIwKTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI0JtYXgiPi1CPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+bWF4IFZCUi9BQlIgYml0cmF0ZSAoOC4uLjMyMCk8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtYml0d2lkdGgiPi0tYml0d2lkdGg8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5pbnB1dCBiaXQgd2lkdGg8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiNjIj4tYzwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmNvcHlyaWdodDwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1jYnIiPi0tY2JyPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+ZW5mb3JjZSB1c2Ugb2YgY29uc3RhbnQgYml0cmF0ZTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1jbGlwZGV0ZWN0Ij4tLWNsaXBkZXRlY3Q8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5jbGlwcGluZyBkZXRlY3Rpb248L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtY29tcCI+LS1jb21wPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+Y2hvb3NlIGNvbXByZXNzaW9uIHJhdGlvPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLWRlY29kZSI+LS1kZWNvZGU8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5kZWNvZGluZyBvbmx5PC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLWRpc3B0aW1lIj4tLWRpc3B0aW1lPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+dGltZSBiZXR3ZWVuIGRpc3BsYXkgdXBkYXRlczwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI2UiPi1lPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+ZGUtZW1waGFzaXMgKDxiPm48L2I+LCA1LCBjKTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI2YiPi1mPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGZhc3QgbW9kZTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI0ZGIj4tRjwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPiBzdHJpY3RseSBlbmZvcmNlIHRoZSAtYiBvcHRpb248L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtZnJlZWZvcm1hdCI+LS1mcmVlZm9ybWF0PC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGZyZWUgZm9ybWF0IGJpdHN0cmVhbTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI2giPi1oPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+aGlnaCBxdWFsaXR5PC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLWhlbHAiPi0taGVscDwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPiBoZWxwPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLWhpZ2hwYXNzIj4tLWhpZ2hwYXNzPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGhpZ2hwYXNzIGZpbHRlcmluZyBmcmVxdWVuY3kgaW4ga0h6PC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLWhpZ2hwYXNzIj4tLWhpZ2hwYXNzLXdpZHRoPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IHdpZHRoIG9mIGhpZ2hwYXNzIGZpbHRlcmluZyBpbiBrSHo8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtbG93cGFzcyI+LS1sb3dwYXNzPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IGxvd3Bhc3MgZmlsdGVyaW5nIGZyZXF1ZW5jeSBpbiBrSHo8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtbG93cGFzcy13aWR0aCI+LS1sb3dwYXNzLXdpZHRoPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+IHdpZHRoIG9mIGxvd3Bhc3MgZmlsdGVyaW5nIGluIGtIejwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI20iPi1tPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+c3RlcmVvIG1vZGUgKHMsIDxiPmo8L2I+LCBmLCBtKTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1tcDFpbnB1dCI+LS1tcDFpbnB1dDwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPk1QRUcgTGF5ZXIgSSBpbnB1dCBmaWxlPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLW1wMmlucHV0Ij4tLW1wMmlucHV0PC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+TVBFRyBMYXllciBJSSBpbnB1dCBmaWxlPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLW1wM2lucHV0Ij4tLW1wM2lucHV0PC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+TVBFRyBMYXllciBJSUkgaW5wdXQgZmlsZTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1ub2FzbSI+LS1ub2FzbTwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmRpc2FibGUgYXNzZW1ibHkgb3B0aW1pemF0aW9ucyAobW14LzNkbm93L3NzZSk8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtbm9oaXN0Ij4tLW5vaGlzdDwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmRpc2FibGUgaGlzdG9ncmFtIGRpc3BsYXk8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtbm9yZXBsYXlnYWluIj4tLW5vcmVwbGF5Z2FpbjwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmRpc2FibGUgUmVwbGF5R2FpbiBhbmFseXNpczwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1ub3JlcyI+LS1ub3JlczwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmRpc2FibGUgYml0IHJlc2Vydm9pcjwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1ub3RlbXAiPi0tbm90ZW1wPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+ZGlzYWJsZSB0ZW1wb3JhbCBtYXNraW5nPC90ZD4KKyAgPC90cj4KKyAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgPFREIEFMSUdOPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjbyI+LW88L2E+PC9rYmQ+PC9URD4KKyAgICA8VEQgQUxJR049IkxFRlQiIG5vd3JhcD5ub24tb3JpZ2luYWw8L1REPgorICA8L1RSPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiNwIj4tcDwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmVycm9yIHByb3RlY3Rpb248L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtcHJlc2V0Ij4tLXByZXNldDwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPnVzZSBidWlsdC1pbiBwcmVzZXQ8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtcHJpb3JpdHkiPi0tcHJpb3JpdHk8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5PUy8yIHByb2Nlc3MgcHJpb3JpdHkgY29udHJvbDwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI3EiPi1xPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+YWxnb3JpdGhtIHF1YWxpdHkgc2VsZWN0aW9uPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLXNpbGVudCI+LS1xdWlldDwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPnNpbGVudCBvcGVyYXRpb248L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiNyIj4tcjwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPmlucHV0IGZpbGUgaXMgcmF3IFBDTTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1yZXBsYXlnYWluLWFjY3VyYXRlIj4tLXJlcGxheWdhaW4tYWNjdXJhdGU8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5jb21wdXRlIFJlcGxheUdhaW4gbW9yZSBhY2N1cmF0ZWx5IGFuZCBmaW5kIHRoZSBwZWFrIHNhbXBsZTwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1yZXBsYXlnYWluLWZhc3QiPi0tcmVwbGF5Z2Fpbi1mYXN0PC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+Y29tcHV0ZSBSZXBsYXlHYWluIGZhc3QgYnV0IHNsaWdodGx5IGluYWNjdXJhdGVseSAoZGVmYXVsdCk8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtcmVzYW1wbGUiPi0tcmVzYW1wbGU8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5vdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIGtIeiAoZW5jb2Rpbmcgb25seSk8L3RkPgorICA8L3RyPgorICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICA8VEQgQUxJR049IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiNzIj4tczwvYT48L2tiZD48L1REPgorICAgIDxURCBBTElHTj0iTEVGVCIgbm93cmFwPnNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBrSHo8L1REPgorICA8L1RSPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtc2lsZW50Ij4tUzwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPnNpbGVudCBvcGVyYXRpb248L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtc2NhbGUiPi0tc2NhbGU8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5zY2FsZSBpbnB1dDwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy1zY2FsZS1sIj4tLXNjYWxlLWw8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5zY2FsZSBpbnB1dCBjaGFubmVsIDAgKGxlZnQpPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLXNjYWxlLXIiPi0tc2NhbGUtcjwvYT48L2tiZD48L3RkPgorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPnNjYWxlIGlucHV0IGNoYW5uZWwgMSAocmlnaHQpPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLXNpbGVudCI+LS1zaWxlbnQ8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5zaWxlbnQgb3BlcmF0aW9uPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjLXN0cmljdGx5LWVuZm9yY2UtSVNPIj4tLXN0cmljdGx5LWVuZm9yY2UtSVNPPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+c3RyaWN0IElTTyBjb21wbGlhbmNlPC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjdCI+LXQ8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5kaXNhYmxlIElORk8vV0FWIGhlYWRlcjwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iI1YiPi1WPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+VkJSIHF1YWxpdHkgc2V0dGluZywgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXIgWzAsLi4uLDEwWzwvdGQ+CisgIDwvdHI+CisgIDx0ciB2YWxpZ249IlRPUCI+IAorICAgIDx0ZCBhbGlnbj0iTEVGVCIgbm93cmFwPjxrYmQ+PGEgaHJlZj0iIy12YnItbmV3Ij4tLXZici1uZXc8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5uZXcgVkJSIG1vZGU8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtdmJyLW9sZCI+LS12YnItb2xkPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+b2xkZXIgVkJSIG1vZGU8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiMtdmVyYm9zZSI+LS12ZXJib3NlPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+dmVyYm9zaXR5PC90ZD4KKyAgPC90cj4KKyAgPHRyIHZhbGlnbj0iVE9QIj4gCisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+PGtiZD48YSBocmVmPSIjeCI+LXg8L2E+PC9rYmQ+PC90ZD4KKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD5zd2FwYnl0ZXM8L3RkPgorICA8L3RyPgorICA8dHIgdmFsaWduPSJUT1AiPiAKKyAgICA8dGQgYWxpZ249IkxFRlQiIG5vd3JhcD48a2JkPjxhIGhyZWY9IiNYcXVhbnQiPi1YPC9hPjwva2JkPjwvdGQ+CisgICAgPHRkIGFsaWduPSJMRUZUIiBub3dyYXA+Y2hhbmdlIHF1YWxpdHkgbWVhc3VyZTwvdGQ+CisgIDwvdHI+Cis8L1RBQkxFPgorPEJSPgorPGRsPiAKKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi1hPC9rYmQ+PGEgbmFtZT0iYSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZG93bm1peCYjMTYwOzwvYT48L3N0cm9uZz4gCisgIDxkZD5NaXggdGhlIHN0ZXJlbyBpbnB1dCBmaWxlIHRvIG1vbm8gYW5kIGVuY29kZSBhcyBtb25vLjxicj4KKyAgICBUaGUgZG93bm1peCBpcyBjYWxjdWxhdGVkIGFzIHRoZSBzdW0gb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwsIGF0dGVudWF0ZWQgCisgICAgYnkgNiBkQi4gPGJyPgorICAgIDxicj4KKyAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IG5lZWRlZCBpbiB0aGUgY2FzZSBvZiByYXcgUENNIHN0ZXJlbyBpbnB1dCAoYmVjYXVzZSBMQU1FIAorICAgIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgaW5wdXQgZmlsZSkuPGJyPgorICAgIFRvIGVuY29kZSBhIHN0ZXJlbyBQQ00gaW5wdXQgZmlsZSBhcyBtb25vLCB1c2UgImxhbWUgLW0gcyAtYSIuPGJyPgorICAgIDxicj4KKyAgICBGb3IgV0FWIGFuZCBBSUZGIGlucHV0IGZpbGVzLCB1c2luZyAiLW0gbSIgd2lsbCBhbHdheXMgcHJvZHVjZSBhIG1vbm8gLm1wMyAKKyAgICBmaWxlIGZyb20gYm90aCBtb25vIGFuZCBzdGVyZW8gaW5wdXQuIAorICA8ZHQ+PGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorPC9kbD4KKzxkbD4gCisgIDxkdD48c3Ryb25nPiogPGtiZD4tLWFiciBuPC9rYmQ+PGEgbmFtZT0iLWFiciI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7YXZlcmFnZSAKKyAgICBiaXRyYXRlIGVuY29kaW5nPC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD5UdXJucyBvbiBlbmNvZGluZyB3aXRoIGEgdGFyZ2V0ZWQgYXZlcmFnZSBiaXRyYXRlIG9mIG4ga2JpdHMsIGFsbG93aW5nIHRvIAorICAgIHVzZSBmcmFtZXMgb2YgZGlmZmVyZW50IHNpemVzLiBUaGUgYWxsb3dlZCByYW5nZSBvZiBuIGlzIDgtMzEwLCB5b3UgY2FuIHVzZSAKKyAgICBhbnkgaW50ZWdlciB2YWx1ZSB3aXRoaW4gdGhhdCByYW5nZS48YnI+CisgICAgPGJyPgorICAgIEl0IGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSAtYiBhbmQgLUIgc3dpdGNoZXMgbGlrZTo8YnI+CisgICAgbGFtZSAtLWFiciAxMjMgLWIgNjQgLUIgMTkyIGEud2F2IGEubXAzPGJyPgorICAgIHdoaWNoIHdvdWxkIGxpbWl0IHRoZSBhbGxvd2VkIGZyYW1lIHNpemVzIGJldHdlZW4gNjQgYW5kIDE5MiBrYml0cy4gPGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKzwvZGw+Cis8ZGw+IAorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LWIgbjwva2JkPjxhIG5hbWU9ImIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2JpdHJhdGU8L2E+PC9zdHJvbmc+IAorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD5Gb3IgTVBFRy0xIChzYW1wbGluZyBmcmVxdWVuY2llcyBvZiAzMiwgNDQuMSBhbmQgNDgga0h6KTxicj4KKyAgICBuID0gMzIsNDAsNDgsNTYsNjQsODAsOTYsMTEyLDEyOCwxNjAsMTkyLDIyNCwyNTYsMzIwPGJyPgorICAgIDxicj4KKyAgICBGb3IgTVBFRy0yIChzYW1wbGluZyBmcmVxdWVuY2llcyBvZiAxNiwgMjIuMDUgYW5kIDI0IGtIeik8YnI+CisgICAgbiA9IDgsMTYsMjQsMzIsNDAsNDgsNTYsNjQsODAsOTYsMTEyLDEyOCwxNDQsMTYwPGJyPgorICAgIDxicj4KKyAgICBGb3IgTVBFRy0yLjUgKHNhbXBsaW5nIGZyZXF1ZW5jaWVzIG9mIDgsIDExLjAyNSBhbmQgMTIga0h6KTxicj4KKyAgICBuID0gOCwxNiwyNCwzMiw0MCw0OCw1Niw2NDxicj4KKyAgICA8YnI+CisgICAgV2hlbiB1c2VkIHdpdGggdmFyaWFibGUgYml0cmF0ZSBlbmNvZGluZyAoVkJSKSwgLWIgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIGJpdHJhdGUgCisgICAgdG8gYmUgdXNlZC4gSG93ZXZlciwgaW4gb3JkZXIgdG8gYXZvaWQgd2FzdGVkIHNwYWNlLCB0aGUgc21hbGxlc3QgZnJhbWUgc2l6ZSAKKyAgICBhdmFpbGFibGUgd2lsbCBiZSB1c2VkIGR1cmluZyBzaWxlbmNlcy4gCisgIDxkdD48YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+Cis8L2RsPgorPGRsPiAKKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi1CIG48L2tiZD48YSBuYW1lPSJCbWF4Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDttYXhpbXVtIAorICAgIFZCUi9BQlIgYml0cmF0ZSZuYnNwOzwvYT48L3N0cm9uZz4gPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+Rm9yIE1QRUctMSAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgMzIsIDQ0LjEgYW5kIDQ4IGtIeik8YnI+CisgICAgbiA9IDMyLDQwLDQ4LDU2LDY0LDgwLDk2LDExMiwxMjgsMTYwLDE5MiwyMjQsMjU2LDMyMDxicj4KKyAgICA8YnI+CisgICAgRm9yIE1QRUctMiAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgMTYsIDIyLjA1IGFuZCAyNCBrSHopPGJyPgorICAgIG4gPSA4LDE2LDI0LDMyLDQwLDQ4LDU2LDY0LDgwLDk2LDExMiwxMjgsMTQ0LDE2MDxicj4KKyAgICA8YnI+CisgICAgRm9yIE1QRUctMi41IChzYW1wbGluZyBmcmVxdWVuY2llcyBvZiA4LCAxMS4wMjUgYW5kIDEyIGtIeik8YnI+CisgICAgbiA9IDgsMTYsMjQsMzIsNDAsNDgsNTYsNjQ8YnI+CisgICAgPGJyPgorICAgIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgd2hlbiB1c2luZyBWQlIvQUJSIDxicj4KKyAgICA8YnI+CisgICAgVGhlIHVzZSBvZiAtQiBpcyBOT1QgUkVDT01NRU5ERUQuIEEgMTI4a2JwcyBDQlIgYml0c3RyZWFtLCBiZWNhdXNlIG9mIHRoZSBiaXQgcmVzZXJ2b2lyLCAKKyAgICBjYW4gYWN0dWFsbHkgaGF2ZSBmcmFtZXMgd2hpY2ggdXNlIGFzIG1hbnkgYml0cyBhcyBhIDMyMGticHMgZnJhbWUuIFZCUiBtb2RlcyAKKyAgICBtaW5pbWl6ZSB0aGUgdXNlIG9mIHRoZSBiaXQgcmVzZXJ2b2lyLCBhbmQgdGh1cyBuZWVkIHRvIGFsbG93IDMyMGticHMgZnJhbWVzIAorICAgIHRvIGdldCB0aGUgc2FtZSBmbGV4aWJpbGl0eSBhcyBDQlIgc3RyZWFtcy48YnI+CisgICAgPGJyPgorICAgIDxpPm5vdGU6IElmIHlvdSBvd24gYW4gbXAzIGhhcmR3YXJlIHBsYXllciBidWlsZCB1cG9uIGEgTUFTIDM1MDMgY2hpcCwgeW91IAorICAgIG11c3Qgc2V0IG1heGltdW0gYml0cmF0ZSB0byBubyBtb3JlIHRoYW4gMjI0IGtwYnMuPC9pPiA8YnI+Cis8L2RsPgorPGRsPiAKKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi0tYml0d2lkdGggOC8xNi8yNC8zMjwva2JkPjxhIG5hbWU9Ii1iaXR3aWR0aCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aW5wdXQgCisgICAgYml0IHdpZHRoJm5ic3A7PC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gUmVxdWlyZWQgb25seSBmb3IgcmF3IFBDTSBpbnB1dCBmaWxlcy4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGV0ZXJtaW5lZCAKKyAgICBmcm9tIHRoZSBoZWFkZXIgb2YgdGhlIGlucHV0IGZpbGUuIDxicj4KKzwvZGw+Cis8ZGw+IAorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLWNsaXBkZXRlY3Q8L2tiZD48YSBuYW1lPSItY2xpcGRldGVjdCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2xpcHBpbmcgZGV0ZWN0aW9uPC9hPjwvc3Ryb25nPiAKKyAgPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+CisgICAgRW5hYmxlIC0tcmVwbGF5Z2Fpbi1hY2N1cmF0ZSBhbmQgcHJpbnQgYSBtZXNzYWdlIHdoZXRoZXIgY2xpcHBpbmcgCisgICAgb2NjdXJzIGFuZCBob3cgZmFyIGluIGRCIHRoZSB3YXZlZm9ybSBpcyBmcm9tIGZ1bGwgc2NhbGUuPGJyPgorICAgIDxicj4KKyAgICBUaGlzIG9wdGlvbiBpcyBub3QgdXNhYmxlIGlmIHRoZSBNUDMgZGVjb2RlciB3YXMgPGI+ZXhwbGljaXRseTwvYj4KKyAgICBkaXNhYmxlZCBpbiB0aGUgYnVpbGQgb2YgTEFNRS48YnI+CisgICAgPGJyPgorICAgIFNlZSBhbHNvOiA8YSBocmVmPSIjLXJlcGxheWdhaW4tYWNjdXJhdGUiPi0tcmVwbGF5Z2Fpbi1hY2N1cmF0ZTwvYT4KKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgICAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgICAgPGJyPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1jYnI8L2tiZD48YSBuYW1lPSItY2JyIj4KKyAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmZvcmNlIHVzZSBvZiBjb25zdGFudCBiaXRyYXRlPC9hPjwvc3Ryb25nPiAKKyAgPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+VGhpcyBzd2l0Y2ggZW5mb3JjZXMgdGhlIHVzZSBvZiBjb25zdGFudCBiaXRyYXRlIGVuY29kaW5nLiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgICAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgICAgPGJyPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1jb21wPC9rYmQ+PGEgbmFtZT0iLWNvbXAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2Nob29zZSAKKyAgICBjb21wcmVzc2lvbiByYXRpbzwvYT48L3N0cm9uZz4gPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+SW5zdGVhZCBvZiBjaG9vc2luZyBiaXRyYXRlLCB1c2luZyB0aGlzIG9wdGlvbiwgdXNlciBjYW4gY2hvb3NlIGNvbXByZXNzaW9uIAorICAgIHJhdGlvIHRvIGFjaGlldmUuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgICA8YnI+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLWRlY29kZTwva2JkPjxhIG5hbWU9Ii1kZWNvZGUiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2RlY29kaW5nIAorICAgIG9ubHk8L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPlVzZXMgTEFNRSBmb3IgZGVjb2RpbmcgdG8gYSBXQVYgZmlsZS4gVGhlIGlucHV0IGZpbGUgY2FuIGJlIGFueSBpbnB1dCB0eXBlIAorICAgIHN1cHBvcnRlZCBieSBlbmNvZGluZywgaW5jbHVkaW5nIGxheWVyIEksSUksSUlJIChNUDMpIGFuZCBPR0cgZmlsZXMuIEluIGNhc2UgCisgICAgb2YgTVBFRyBmaWxlcywgTEFNRSB1c2VzIGEgYnVnZml4ZWQgdmVyc2lvbiBvZiBtcGdsaWIgZm9yIGRlY29kaW5nLjxicj4KKyAgICA8YnI+CisgICAgSWYgLXQgaXMgdXNlZCAoZGlzYWJsZSBXQVYgaGVhZGVyKSwgTGFtZSB3aWxsIG91dHB1dCByYXcgUENNIGluIG5hdGl2ZSBlbmRpYW4gCisgICAgZm9ybWF0LiBZb3UgY2FuIHVzZSAteCB0byBzd2FwIGJ5dGVzIG9yZGVyLiA8YnI+CisgICAgPGJyPgorICAgIFRoaXMgb3B0aW9uIGlzIG5vdCB1c2FibGUgaWYgdGhlIE1QMyBkZWNvZGVyIHdhcyA8Yj5leHBsaWNpdGx5PC9iPgorICAgIGRpc2FibGVkIGluIHRoZSBidWlsZCBvZiBMQU1FLgorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1kaXNwdGltZSBuPC9rYmQ+PGEgbmFtZT0iLWRpc3B0aW1lIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt0aW1lIAorICAgIGJldHdlZW4gZGlzcGxheSB1cGRhdGVzPC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD5TZXQgdGhlIGRlbGF5IGluIHNlY29uZHMgYmV0d2VlbiB0d28gZGlzcGxheSB1cGRhdGVzLiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi1lIG4vNS9jPC9rYmQ+PGEgbmFtZT0iZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGUtZW1waGFzaXM8L2E+PC9zdHJvbmc+IAorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gPGJyPgorICAgIG4gPSAobm9uZSwgZGVmYXVsdCk8YnI+CisgICAgNSA9IDAvMTUgbWljcm9zZWNvbmRzPGJyPgorICAgIGMgPSBjaXR0IGouMTc8YnI+CisgICAgPGJyPgorICAgIEFsbCB0aGlzIGRvZXMgaXMgc2V0IGEgZmxhZyBpbiB0aGUgYml0c3RyZWFtLiBJZiB5b3UgaGF2ZSBhIFBDTSBpbnB1dCBmaWxlIAorICAgIHdoZXJlIG9uZSBvZiB0aGUgYWJvdmUgdHlwZXMgb2YgKG9ic29sZXRlKSBlbXBoYXNpcyBoYXMgYmVlbiBhcHBsaWVkLCB5b3UgCisgICAgY2FuIHNldCB0aGlzIGZsYWcgaW4gTEFNRS4gVGhlbiB0aGUgbXAzIGRlY29kZXIgc2hvdWxkIGRlLWVtcGhhc2l6ZSB0aGUgb3V0cHV0IAorICAgIGR1cmluZyBwbGF5YmFjaywgYWx0aG91Z2ggbW9zdCBkZWNvZGVycyBpZ25vcmUgdGhpcyBmbGFnLjxicj4KKyAgICA8YnI+CisgICAgQSBiZXR0ZXIgc29sdXRpb24gd291bGQgYmUgdG8gYXBwbHkgdGhlIGRlLWVtcGhhc2lzIHdpdGggYSBzdGFuZGFsb25lIHV0aWxpdHkgCisgICAgYmVmb3JlIGVuY29kaW5nLCBhbmQgdGhlbiBlbmNvZGUgd2l0aG91dCAtZS4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tZjwva2JkPjxhIG5hbWU9ImYiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2Zhc3QgbW9kZTwvYT48L3N0cm9uZz4gCisgIDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBUaGlzIHN3aXRjaCBmb3JjZXMgdGhlIGVuY29kZXIgdG8gdXNlIGEgZmFzdGVyIGVuY29kaW5nIG1vZGUsIGJ1dCB3aXRoIAorICAgIGEgbG93ZXIgcXVhbGl0eS4gVGhlIGJlaGF2aW91ciBpcyB0aGUgc2FtZSBhcyB0aGUgLXE3IHN3aXRjaC48YnI+CisgICAgPGJyPgorICAgIE5vaXNlIHNoYXBpbmcgd2lsbCBiZSBkaXNhYmxlZCwgYnV0IHBzeWNobyBhY291c3RpY3Mgd2lsbCBzdGlsbCBiZSBjb21wdXRlZCAKKyAgICBmb3IgYml0IGFsbG9jYXRpb24gYW5kIHByZS1lY2hvIGRldGVjdGlvbi4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tRjwva2JkPjxhIG5hbWU9IkZGIj4mbmJzcDsmbmJzcDsmbmJzcDtzdHJpY3RseSBlbmZvcmNlIHRoZSAKKyAgICAtYiBvcHRpb248L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBUaGlzIGlzIG1haW5seSBmb3IgdXNlIHdpdGggaGFyZHdhcmUgcGxheWVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGxvdyBiaXRyYXRlIAorICAgIG1wMy48YnI+CisgICAgPGJyPgorICAgIFdpdGhvdXQgdGhpcyBvcHRpb24sIHRoZSBtaW5pbXVtIGJpdHJhdGUgd2lsbCBiZSBpZ25vcmVkIGZvciBwYXNzYWdlcyBvZiBhbmFsb2cgCisgICAgc2lsZW5jZSwgaWUgd2hlbiB0aGUgbXVzaWMgbGV2ZWwgaXMgYmVsb3cgdGhlIGFic29sdXRlIHRocmVzaG9sZCBvZiBodW1hbiAKKyAgICBoZWFyaW5nIChBVEgpLiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi0tZnJlZWZvcm1hdDwva2JkPjxhIG5hbWU9Ii1mcmVlZm9ybWF0Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcmVlIAorICAgIGZvcm1hdCBiaXRzdHJlYW08L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBQcm9kdWNlcyBhIGZyZWUgZm9ybWF0IGJpdHN0cmVhbS4gV2l0aCB0aGlzIG9wdGlvbiwgeW91IGNhbiB1c2UgLWIgd2l0aCAKKyAgICBhbnkgYml0cmF0ZSBoaWdoZXIgdGhhbiA4IGticHMuPGJyPgorICAgIDxicj4KKyAgICBIb3dldmVyLCBldmVuIGlmIGFuIG1wMyBkZWNvZGVyIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgZnJlZSBiaXRyYXRlcyBhdCBsZWFzdCAKKyAgICB1cCB0byAzMjAga2JwcywgbWFueSBwbGF5ZXJzIGFyZSB1bmFibGUgdG8gZGVhbCB3aXRoIGl0Ljxicj4KKyAgICA8YnI+CisgICAgVGVzdHMgaGF2ZSBzaG93biB0aGF0IHRoZSBmb2xsb3dpbmcgZGVjb2RlcnMgc3VwcG9ydCBmcmVlIGZvcm1hdDo8YnI+CisgICAgPGJyPgorICAgIEZyZWVBbXAgdXAgdG8gNDQwIGticHM8YnI+CisgICAgaW5fbXBnMTIzIHVwIHRvIDU2MCBrYnBzPGJyPgorICAgIGwzZGVjIHVwIHRvIDMxMCBrYnBzPGJyPgorICAgIExBTUUgdXAgdG8gNTYwIGticHM8YnI+CisgICAgTUFEIHVwIHRvIDY0MCBrYnBzPGJyPgorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LWg8L2tiZD48YSBuYW1lPSJoIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtoaWdoIHF1YWxpdHk8L2E+PC9zdHJvbmc+IAorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gVXNlIHNvbWUgcXVhbGl0eSBpbXByb3ZlbWVudHMuIEVuY29kaW5nIHdpbGwgYmUgc2xvd2VyLCBidXQgdGhlIHJlc3VsdCAKKyAgICB3aWxsIGJlIG9mIGhpZ2hlciBxdWFsaXR5LiBUaGUgYmVoYXZpb3VyIGlzIHRoZSBzYW1lIGFzIHRoZSAtcTIgc3dpdGNoLjxicj4KKyAgICBUaGlzIHN3aXRjaCBpcyBhbHdheXMgZW5hYmxlZCB3aGVuIHVzaW5nIFZCUi4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLWhlbHA8L2tiZD48YSBuYW1lPSItaGVscCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aGVscDwvYT48L3N0cm9uZz4gCisgIDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBEaXNwbGF5IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIG9wdGlvbnMuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1oaWdocGFzczwva2JkPjxhIG5hbWU9Ii1oaWdocGFzcyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aGlnaHBhc3MgCisgICAgZmlsdGVyaW5nIGZyZXF1ZW5jeSBpbiBrSHo8L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBTZXQgYW4gaGlnaHBhc3MgZmlsdGVyaW5nIGZyZXF1ZW5jeS4gRnJlcXVlbmNpZXMgYmVsb3cgdGhlIHNwZWNpZmllZCBvbmUgCisgICAgd2lsbCBiZSBjdXRvZmYuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1oaWdocGFzcy13aWR0aDwva2JkPjxhIG5hbWU9Ii1oaWdocGFzcy13aWR0aCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7d2lkdGggCisgICAgb2YgaGlnaHBhc3MgZmlsdGVyaW5nIGluIGtIejwvYT48L3N0cm9uZz4gPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IFNldCB0aGUgd2lkdGggb2YgdGhlIGhpZ2hwYXNzIGZpbHRlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUlIG9mIHRoZSBoaWdocGFzcyAKKyAgICBmcmVxdWVuY3kuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1sb3dwYXNzPC9rYmQ+PGEgbmFtZT0iLWxvd3Bhc3MiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2xvd3Bhc3MgCisgICAgZmlsdGVyaW5nIGZyZXF1ZW5jeSBpbiBrSHo8L2E+PC9zdHJvbmc+PC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IFNldCBhIGxvd3Bhc3MgZmlsdGVyaW5nIGZyZXF1ZW5jeS4gRnJlcXVlbmNpZXMgYWJvdmUgdGhlIHNwZWNpZmllZCBvbmUgCisgICAgd2lsbCBiZSBjdXRvZmYuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1sb3dwYXNzLXdpZHRoPC9rYmQ+PGEgbmFtZT0iLWxvd3Bhc3Mtd2lkdGgiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3dpZHRoIAorICAgIG9mIGxvd3Bhc3MgZmlsdGVyaW5nIGluIGtIejwvYT48L3N0cm9uZz48L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gU2V0IHRoZSB3aWR0aCBvZiB0aGUgbG93cGFzcyBmaWx0ZXIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1JSBvZiB0aGUgbG93cGFzcyAKKyAgICBmcmVxdWVuY3kuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LW0gcy88Yj5qLzwvYj5mL2QvbTwva2JkPjxhIG5hbWU9Im0iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0ZXJlbyAKKyAgICBtb2RlPC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gSm9pbnQtc3RlcmVvIGlzIHRoZSBkZWZhdWx0IG1vZGUgZm9yIGlucHV0IGZpbGVzIGZlYXR1cmluZyB0d28gY2hhbm5lbHMuLiAKKyAgICA8Yj48aT48YnI+CisgICAgPGJyPgorICAgIHN0ZXJlbzwvaT48L2I+IDxicj4KKyAgICBJbiB0aGlzIG1vZGUsIHRoZSBlbmNvZGVyIG1ha2VzIG5vIHVzZSBvZiBwb3RlbnRpYWxseSBleGlzdGluZyBjb3JyZWxhdGlvbnMgCisgICAgYmV0d2VlbiB0aGUgdHdvIGlucHV0IGNoYW5uZWxzLiBJdCBjYW4sIGhvd2V2ZXIsIG5lZ290aWF0ZSB0aGUgYml0IGRlbWFuZCAKKyAgICBiZXR3ZWVuIGJvdGggY2hhbm5lbCwgaS5lLiBnaXZlIG9uZSBjaGFubmVsIG1vcmUgYml0cyBpZiB0aGUgb3RoZXIgY29udGFpbnMgCisgICAgc2lsZW5jZSBvciBuZWVkcyBsZXNzIGJpdHMgYmVjYXVzZSBvZiBhIGxvd2VyIGNvbXBsZXhpdHkuPGJyPgorICAgIDxicj4KKyAgICA8aT48Yj5qb2ludCBzdGVyZW88L2I+PC9pPjxicj4KKyAgICBJbiB0aGlzIG1vZGUsIHRoZSBlbmNvZGVyIHdpbGwgbWFrZSB1c2Ugb2YgY29ycmVsYXRpb24gYmV0d2VlbiBib3RoIGNoYW5uZWxzLiAKKyAgICBUaGUgc2lnbmFsIHdpbGwgYmUgbWF0cml4ZWQgaW50byBhIHN1bSAoIm1pZCIpLCBjb21wdXRlZCBieSBMK1IsIGFuZCBkaWZmZXJlbmNlIAorICAgICgic2lkZSIpIHNpZ25hbCwgY29tcHV0ZWQgYnkgTC1SLCBhbmQgbW9yZSBiaXRzIGFyZSBhbGxvY2F0ZWQgdG8gdGhlIG1pZCBjaGFubmVsLjxicj4KKyAgICBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgaW5jcmVhc2UgdGhlIGJhbmR3aWR0aCBpZiB0aGUgc2lnbmFsIGRvZXMgbm90IGhhdmUgdG9vIAorICAgIG11Y2ggc3RlcmVvIHNlcGFyYXRpb24sIHRodXMgZ2l2aW5nIGEgc2lnbmlmaWNhbnQgZ2FpbiBpbiBlbmNvZGluZyBxdWFsaXR5LiAKKyAgICBJbiBqb2ludCBzdGVyZW8sIHRoZSBlbmNvZGVyIGNhbiBzZWxlY3QgYmV0d2VlbiBMZWZ0L1JpZ2h0IGFuZCBNaWQvU2lkZSByZXByZXNlbnRhdGlvbiAKKyAgICBvbiBhIGZyYW1lIGJhc2lzLjxicj4KKyAgICA8YnI+CisgICAgVXNpbmcgbWlkL3NpZGUgc3RlcmVvIGluYXBwcm9wcmlhdGVseSBjYW4gcmVzdWx0IGluIGF1ZGlibGUgY29tcHJlc3Npb24gYXJ0aWZhY3RzLiAKKyAgICBUbyBtdWNoIHN3aXRjaGluZyBiZXR3ZWVuIG1pZC9zaWRlIGFuZCByZWd1bGFyIHN0ZXJlbyBjYW4gYWxzbyBzb3VuZCBiYWQuIAorICAgIFRvIGRldGVybWluZSB3aGVuIHRvIHN3aXRjaCB0byBtaWQvc2lkZSBzdGVyZW8sIExBTUUgdXNlcyBhIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkIAorICAgIGFsZ29yaXRobSB0aGFuIHRoYXQgZGVzY3JpYmVkIGluIHRoZSBJU08gZG9jdW1lbnRhdGlvbiwgYW5kIHRodXMgaXMgc2FmZSB0byAKKyAgICB1c2UgaW4gam9pbnQgc3RlcmVvIG1vZGUuPGJyPgorICAgIDxicj4KKyAgICA8Yj48aT5mb3JjZWQgam9pbnQgc3RlcmVvIDwvaT48L2I+PGJyPgorICAgIFRoaXMgbW9kZSB3aWxsIGZvcmNlIE1TIGpvaW50IHN0ZXJlbyBvbiBhbGwgZnJhbWVzLiBJdCdzIHNsaWdodGx5IGZhc3RlciB0aGFuIAorICAgIGpvaW50IHN0ZXJlbywgYnV0IGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IGFyZSBzdXJlIHRoYXQgZXZlcnkgZnJhbWUgCisgICAgb2YgdGhlIGlucHV0IGZpbGUgaGFzIHZlcnkgbGl0dGxlIHN0ZXJlbyBzZXBhcmF0aW9uLjxicj4KKyAgICA8YnI+CisgICAgPGI+PGk+ZHVhbCBjaGFubmVscyA8L2k+PC9iPjxicj4KKyAgICBJbiB0aGlzIG1vZGUsIHRoZSAyIGNoYW5uZWxzIHdpbGwgYmUgdG90YWxseSBpbmRlcGVuZGVudGx5IGVuY29kZWQuIEVhY2ggCisgICAgY2hhbm5lbCB3aWxsIGhhdmUgZXhhY3RseSBoYWxmIG9mIHRoZSBiaXRyYXRlLiBUaGlzIG1vZGUgaXMgZGVzaWduZWQgZm9yIGFwcGxpY2F0aW9ucyAKKyAgICBsaWtlIGR1YWwgbGFuZ3VhZ2VzIGVuY29kaW5nIChleDogRW5nbGlzaCBpbiBvbmUgY2hhbm5lbCBhbmQgRnJlbmNoIGluIHRoZSAKKyAgICBvdGhlcikuIFVzaW5nIHRoaXMgZW5jb2RpbmcgbW9kZSBmb3IgcmVndWxhciBzdGVyZW8gZmlsZXMgd2lsbCByZXN1bHQgaW4gYSAKKyAgICBsb3dlciBxdWFsaXR5IGVuY29kaW5nLjxicj4KKyAgICA8YnI+CisgICAgPGI+PGk+bW9ubzwvaT48L2I+PGJyPgorICAgIFRoZSBpbnB1dCB3aWxsIGJlIGVuY29kZWQgYXMgYSBtb25vIHNpZ25hbC4gSWYgaXQgd2FzIGEgc3RlcmVvIHNpZ25hbCwgaXQgCisgICAgd2lsbCBiZSBkb3duc2FtcGxlZCB0byBtb25vLiBUaGUgZG93bm1peCBpcyBjYWxjdWxhdGVkIGFzIHRoZSBzdW0gb2YgdGhlIGxlZnQgCisgICAgYW5kIHJpZ2h0IGNoYW5uZWwsIGF0dGVudWF0ZWQgYnkgNiBkQi4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLW1wMWlucHV0PC9rYmQ+PGEgbmFtZT0iLW1wMWlucHV0Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtNUEVHIAorICAgIExheWVyIEkgaW5wdXQgZmlsZTwvYT48L3N0cm9uZz4gPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IEFzc3VtZSB0aGUgaW5wdXQgZmlsZSBpcyBhIE1QRUcgTGF5ZXIgSSBmaWxlLjxicj4KKyAgICBJZiB0aGUgZmlsZW5hbWUgZW5kcyBpbiAiLm1wMSIgb3IgJnF1b3Q7Lm1wZyZxdW90OyBMQU1FIHdpbGwgYXNzdW1lIGl0IGlzIAorICAgIGEgTVBFRyBMYXllciBJIGZpbGUuIEZvciBzdGRpbiBvciBMYXllciBJIGZpbGVzIHdoaWNoIGRvIG5vdCBlbmQgaW4gLm1wMSBvciAubXBnIAorICAgIHlvdSBuZWVkIHRvIHVzZSB0aGlzIHN3aXRjaC4gCisgIDxkdD48YnI+CisgIDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1tcDJpbnB1dDwva2JkPjxhIG5hbWU9Ii1tcDJpbnB1dCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TVBFRyAKKyAgICBMYXllciBJSSBpbnB1dCBmaWxlPC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gQXNzdW1lIHRoZSBpbnB1dCBmaWxlIGlzIGEgTVBFRyBMYXllciBJSSAoaWUgTVAyKSBmaWxlLjxicj4KKyAgICBJZiB0aGUgZmlsZW5hbWUgZW5kcyBpbiAiLm1wMiIgTEFNRSB3aWxsIGFzc3VtZSBpdCBpcyBhIE1QRUcgTGF5ZXIgSUkgZmlsZS4gRm9yIAorICAgIHN0ZGluIG9yIExheWVyIElJIGZpbGVzIHdoaWNoIGRvIG5vdCBlbmQgaW4gLm1wMiB5b3UgbmVlZCB0byB1c2UgdGhpcyBzd2l0Y2guIAorICA8ZHQ+PGJyPgorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi0tbXAzaW5wdXQ8L2tiZD48YSBuYW1lPSItbXAzaW5wdXQiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO01QRUcgCisgICAgTGF5ZXIgSUlJIGlucHV0IGZpbGU8L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBBc3N1bWUgdGhlIGlucHV0IGZpbGUgaXMgYSBNUDMgZmlsZS4gVXNlZnVsIGZvciBkb3duc2FtcGxpbmcgZnJvbSBvbmUgCisgICAgbXAzIHRvIGFub3RoZXIuIEFzIGFuIGV4YW1wbGUsIGl0IGNhbiBiZSB1c2VmdWwgZm9yIHN0cmVhbWluZyB0aHJvdWdoIGFuIAorICAgIEljZUNhc3Qgc2VydmVyLjxicj4KKyAgICBJZiB0aGUgZmlsZW5hbWUgZW5kcyBpbiAiLm1wMyIgTEFNRSB3aWxsIGFzc3VtZSBpdCBpcyBhbiBNUDMgZmlsZS4gRm9yIHN0ZGluIG9yIAorICAgIE1QMyBmaWxlcyB3aGljaCBkbyBub3QgZW5kIGluIC5tcDMgeW91IG5lZWQgdG8gdXNlIHRoaXMgc3dpdGNoLiAKKyAgPGR0Pjxicj4KKyAgPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLW5vYXNtIG1teC8zZG5vdy9zc2U8L2tiZD48YSBuYW1lPSItbm9hc20iPgorICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGlzYWJsZSBhc3NlbWJseSBvcHRpbWl6YXRpb25zPC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD5EaXNhYmxlIHNwZWNpZmljIGFzc2VtYmx5IG9wdGltaXphdGlvbnMuIFF1YWxpdHkgd2lsbCBub3QgaW5jcmVhc2UsIG9ubHkKKyAgICAgIHNwZWVkIHdpbGwgYmUgcmVkdWNlZC4gSWYgeW91IGhhdmUgcHJvYmxlbXMgcnVubmluZyBMYW1lIG9uIGEgQ3lyaXgvVmlhCisgICAgICBwcm9jZXNzb3IsIGRpc2FibGluZyBtbXggb3B0aW1pemF0aW9ucyBtaWdodCBzb2x2ZSB5b3VyIHByb2JsZW0uCisgIDxkdD48YnI+CisgIDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1ub2hpc3Q8L2tiZD48YSBuYW1lPSItbm9oaXN0Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkaXNhYmxlIAorICAgIGhpc3RvZ3JhbSBkaXNwbGF5PC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gQnkgZGVmYXVsdCwgTEFNRSB3aWxsIGRpc3BsYXkgYSBiaXRyYXRlIGhpc3RvZ3JhbSB3aGlsZSBwcm9kdWNpbmcgVkJSIG1wMyAKKyAgICBmaWxlcy4gVGhpcyB3aWxsIGRpc2FibGUgdGhhdCBmZWF0dXJlLjxicj4KKyAgICBIaXN0b2dyYW0gZGlzcGxheSBtaWdodCBub3QgYmUgYXZhaWxhYmxlIG9uIHlvdXIgcmVsZWFzZS4gCisgIDxkdD48YnI+CisgIDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1ub3JlcGxheWdhaW48L2tiZD48YSBuYW1lPSItbm9yZXBsYXlnYWluIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkaXNhYmxlIAorICAgIFJlcGxheUdhaW4gYW5hbHlzaXM8L2E+PC9zdHJvbmc+PC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IEJ5IGRlZmF1bHQgUmVwbGF5R2FpbiBhbmFseXNpcyBpcyBlbmFibGVkLiBUaGlzIHN3aXRjaCBkaXNhYmxlcyBpdC48YnI+CisgIDxicj4KKyAgICBTZWUgYWxzbzogPGEgaHJlZj0iIy1yZXBsYXlnYWluLWFjY3VyYXRlIj4tLXJlcGxheWdhaW4tYWNjdXJhdGU8L2E+LAorICAgIDxhIGhyZWY9IiMtcmVwbGF5Z2Fpbi1mYXN0Ij4tLXJlcGxheWdhaW4tZmFzdDwvYT4KKyAgPGR0Pjxicj4KKyAgPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLW5vcmVzPC9rYmQ+PGEgbmFtZT0iLW5vcmVzIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkaXNhYmxlIAorICAgIGJpdCByZXNlcnZvaXI8L2E+PC9zdHJvbmc+PC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IERpc2FibGUgdGhlIGJpdCByZXNlcnZvaXIuIEVhY2ggZnJhbWUgd2lsbCB0aGVuIGJlY29tZSBpbmRlcGVuZGVudCBmcm9tIAorICAgIHByZXZpb3VzIG9uZXMsIGJ1dCB0aGUgcXVhbGl0eSB3aWxsIGJlIGxvd2VyLiAKKyAgPGR0Pjxicj4KKyAgPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLW5vdGVtcDwva2JkPjxhIG5hbWU9Ii1ub3RlbXAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2Rpc2FibGUgCisgICAgdGVtcG9yYWwgbWFza2luZzwvYT48L3N0cm9uZz48L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD5Eb24ndCBtYWtlIHVzZSBvZiB0aGUgdGVtcG9yYWwgbWFza2luZyBlZmZlY3QuIAorICA8ZHQ+PGJyPgorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi1vPC9rYmQ+PGEgbmFtZT0ibyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bm9uLW9yaWdpbmFsPC9hPjwvc3Ryb25nPiAKKyAgPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IE1hcmsgdGhlIGVuY29kZWQgZmlsZSBhcyBiZWluZyBhIGNvcHkuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LXA8L2tiZD48YSBuYW1lPSJwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlcnJvciBwcm90ZWN0aW9uPC9hPjwvc3Ryb25nPjwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBUdXJuIG9uIENSQyBlcnJvciBwcm90ZWN0aW9uLjxicj4KKyAgICBJdCB3aWxsIGFkZCBhIGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrIChDUkMpIGNvZGUgaW4gZWFjaCBmcmFtZSwgYWxsb3dpbmcgdG8gCisgICAgZGV0ZWN0IHRyYW5zbWlzc2lvbiBlcnJvcnMgdGhhdCBjb3VsZCBvY2N1ciBvbiB0aGUgTVAzIHN0cmVhbS4gSG93ZXZlciwgaXQgCisgICAgdGFrZXMgMTYgYml0cyBwZXIgZnJhbWUgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgdXNlZCBmb3IgZW5jb2RpbmcsIGFuZCB0aGVuIAorICAgIHdpbGwgc2xpZ2h0bHkgcmVkdWNlIHRoZSBzb3VuZCBxdWFsaXR5LiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi0tcHJlc2V0IHByZXNldE5hbWU8L2tiZD4gPGEgbmFtZT0iLXByZXNldCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dXNlIAorICAgIGJ1aWx0LWluIHByZXNldDwvYT48L3N0cm9uZz48L2R0PgorPC9kbD4KKzxkZD4gVXNlIG9uZSBvZiB0aGUgYnVpbHQtaW4gcHJlc2V0cyAoc3RhbmRhcmQsIGZhc3Qgc3RhbmRhcmQsIGV4dHJlbWUsIGZhc3QgZXh0cmVtZSwgaW5zYW5lLCBvciB0aGUgYWJyL2NiciBtb2RlcykuCis8YnI+Cis8ZGQ+ICAgIi0tcHJlc2V0IGhlbHAiIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIHBvc3NpYmlsaXRpZXMgZm9yIHRoZXNlIHByZXNldHMuIAorPGR0Pjxicj4KKyAgPGJyPgorPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+Cis8YnI+Cis8ZGw+IDwvZGw+Cis8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1wcmlvcml0eSAwLi4uNDwva2JkPjxhIG5hbWU9Ii1wcmlvcml0eSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7T1MvMiAKKyAgcHJvY2VzcyBwcmlvcml0eSBjb250cm9sPC9hPjwvc3Ryb25nPiA8L2R0PgorPGRsPiAKKyAgPGRkPiBXaXRoIHRoaXMgb3B0aW9uLCBMQU1FIHdpbGwgcnVuIHdpdGggYSBkaWZmZXJlbnQgcHJvY2VzcyBwcmlvcml0eSB1bmRlciAKKyAgICBJQk0gT1MvMi48YnI+CisgICAgVGhpcyB3aWxsIGdyZWF0bHkgaW1wcm92ZSBzeXN0ZW0gcmVzcG9uc2l2ZW5lc3MsIHNpbmNlIE9TLzIgd2lsbCBoYXZlIG1vcmUgCisgICAgZnJlZSB0aW1lIHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgc2NyZWVuIGFuZCBwb2xsIHRoZSBrZXlib2FyZC9tb3VzZS4gSXQgc2hvdWxkIAorICAgIG1ha2UgcXVpdGUgYSBkaWZmZXJlbmNlIG92ZXJhbGwsIGVzcGVjaWFsbHkgb24gc2xvd2VyIG1hY2hpbmVzLiBMQU1FJ3MgcGVyZm9ybWFuY2UgCisgICAgaW1wYWN0IHNob3VsZCBiZSBtaW5pbWFsLjxicj4KKyAgICA8YnI+CisgIDxkZD48Yj4wIChMb3cgcHJpb3JpdHkpPC9iPjxicj4KKyAgICBQcmlvcml0eSAwIGFzc3VtZXMgIklETEUiIGNsYXNzLCB3aXRoIGRlbHRhIDAuPGJyPgorICAgIExBTUUgd2lsbCBoYXZlIHRoZSBsb3dlc3QgcHJpb3JpdHkgcG9zc2libGUsIGFuZCB0aGUgZW5jb2RpbmcgbWF5IGJlIHN1c3BlbmRlZCAKKyAgICB2ZXJ5IGZyZXF1ZW50bHkgYnkgdXNlciBpbnRlcmFjdGlvbi48YnI+CisgICAgPGJyPgorICA8ZGQ+PGI+MSAoTWVkaXVtIHByaW9yaXR5KTwvYj48YnI+CisgICAgUHJpb3JpdHkgMSBhc3N1bWVzICJJRExFIiBjbGFzcywgd2l0aCBkZWx0YSArMzEuPGJyPgorICAgIExBTUUgd29uJ3QgaW50ZXJmZXJlIGF0IGFsbCB3aXRoIHdoYXQgeW91J3JlIGRvaW5nLjxicj4KKyAgICBSZWNvbW1lbmRlZCBpZiB5b3UgaGF2ZSBhIHNsb3dlciBtYWNoaW5lLiA8YnI+CisgICAgPGJyPgorICA8ZGQ+PGI+MiAoUmVndWxhciBwcmlvcml0eSk8L2I+PGJyPgorICAgIFByaW9yaXR5IDIgYXNzdW1lcyAiUkVHVUxBUiIgY2xhc3MsIHdpdGggZGVsdGEgLTMxLjxicj4KKyAgICBMQU1FIHdvbid0IGludGVyZmVyZSB3aXRoIHlvdXIgYWN0aXZpdHkuIEl0J2xsIHJ1biBqdXN0IGxpa2UgYSByZWd1bGFyIHByb2Nlc3MsIAorICAgIGJ1dCB3aWxsIHNwYXJlIGp1c3QgYSBiaXQgb2YgaWRsZSB0aW1lIGZvciB0aGUgc3lzdGVtLiBSZWNvbW1lbmRlZCBmb3IgbW9zdCAKKyAgICB1c2Vycy4gPGJyPgorICAgIDxicj4KKyAgPGRkPjxiPjMgKEhpZ2ggcHJpb3JpdHkpPC9iPjxicj4KKyAgICBQcmlvcml0eSAzIGFzc3VtZXMgIlJFR1VMQVIiIGNsYXNzLCB3aXRoIGRlbHRhIDAuPGJyPgorICAgIExBTUUgd2lsbCBydW4gd2l0aCBhIHByaW9yaXR5IGEgYml0IGhpZ2hlciB0aGFuIGEgbm9ybWFsIHByb2Nlc3MuIDxicj4KKyAgICBHb29kIGlmIHlvdSdyZSBqdXN0IHJ1bm5pbmcgTEFNRSBieSBpdHNlbGYgb3Igd2l0aCBtb2RlcmF0ZSB1c2VyIGludGVyYWN0aW9uLjxicj4KKyAgICA8YnI+CisgIDxkZD48Yj40IChNYXhpbXVtIHByaW9yaXR5KTwvYj48YnI+CisgICAgUHJpb3JpdHkgNCBhc3N1bWVzICJSRUdVTEFSIiBjbGFzcywgd2l0aCBkZWx0YSArMzEuPGJyPgorICAgIExBTUUgd2lsbCBydW4gd2l0aCBhIHZlcnkgaGlnaCBwcmlvcml0eSwgYW5kIG1heSBpbnRlcmZlcmUgd2l0aCB0aGUgbWFjaGluZSAKKyAgICByZXNwb25zZS48YnI+CisgICAgUmVjb21tZW5kZWQgaWYgeW91IG9ubHkgaW50ZW5kIHRvIHJ1biBMQU1FIGJ5IGl0c2VsZiwgb3IgaWYgeW91IGhhdmUgYSBmYXN0IAorICAgIHByb2Nlc3Nvci4gPGJyPgorICAgIDxicj4KKyAgICA8YnI+CisgICAgUHJpb3JpdHkgMSBvciAyIGlzIHJlY29tbWVuZGVkIGZvciBtb3N0IHVzZXJzLiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi1xIDAuLjk8L2tiZD48YSBuYW1lPSJxIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDthbGdvcml0aG0gCisgICAgcXVhbGl0eSBzZWxlY3Rpb248L2E+PC9zdHJvbmc+PC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IEJpdHJhdGUgaXMgb2YgY291cnNlIHRoZSBtYWluIGluZmx1ZW5jZSBvbiBxdWFsaXR5LiBUaGUgaGlnaGVyIHRoZSBiaXRyYXRlLCAKKyAgICB0aGUgaGlnaGVyIHRoZSBxdWFsaXR5LiBCdXQgZm9yIGEgZ2l2ZW4gYml0cmF0ZSwgd2UgaGF2ZSBhIGNob2ljZSBvZiBhbGdvcml0aG1zIAorICAgIHRvIGRldGVybWluZSB0aGUgYmVzdCBzY2FsZWZhY3RvcnMgYW5kIEh1ZmZtYW4gZW5jb2RpbmcgKG5vaXNlIHNoYXBpbmcpLjxicj4KKyAgICA8YnI+CisgICAgLXEgMDogdXNlIHNsb3dlc3QgJmFtcDsgYmVzdCBwb3NzaWJsZSB2ZXJzaW9uIG9mIGFsbCBhbGdvcml0aG1zLiAtcSAwIGFuZCAtcSAxIAorICAgIGFyZSBzbG93IGFuZCBtYXkgbm90IHByb2R1Y2Ugc2lnbmlmaWNhbnRseSBoaWdoZXIgcXVhbGl0eS48YnI+CisgICAgPGJyPgorICAgIC1xIDI6IHJlY29tbWVuZGVkLiBTYW1lIGFzIC1oLjxicj4KKyAgICA8YnI+CisgICAgLXEgNTogZGVmYXVsdCB2YWx1ZS4gR29vZCBzcGVlZCwgcmVhc29uYWJsZSBxdWFsaXR5Ljxicj4KKyAgICA8YnI+CisgICAgLXEgNzogc2FtZSBhcyAtZi4gVmVyeSBmYXN0LCBvayBxdWFsaXR5LiAocHN5Y2hvIGFjb3VzdGljcyBhcmUgdXNlZCBmb3IgcHJlLWVjaG8gCisgICAgJmFtcDsgTS9TLCBidXQgbm8gbm9pc2Ugc2hhcGluZyBpcyBkb25lLjxicj4KKyAgICA8YnI+CisgICAgLXEgOTogZGlzYWJsZXMgYWxtb3N0IGFsbCBhbGdvcml0aG1zIGluY2x1ZGluZyBwc3ktbW9kZWwuIHBvb3IgcXVhbGl0eS4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tcjwva2JkPjxhIG5hbWU9InIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2lucHV0IGZpbGUgaXMgCisgICAgcmF3IFBDTTwvYT48L3N0cm9uZz48L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gQXNzdW1lIHRoZSBpbnB1dCBmaWxlIGlzIHJhdyBQQ00uIFNhbXBsaW5nIHJhdGUgYW5kIG1vbm8vc3RlcmVvL2pzdGVyZW8gCisgICAgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gV2l0aG91dCAtciwgTEFNRSB3aWxsIHBlcmZvcm0gc2V2ZXJhbCAKKyAgICBmc2VlaygpJ3Mgb24gdGhlIGlucHV0IGZpbGUgbG9va2luZyBmb3IgV0FWIGFuZCBBSUZGIGhlYWRlcnMuPGJyPgorICAgIE1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgb24geW91ciByZWxlYXNlLiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi0tcmVwbGF5Z2Fpbi1hY2N1cmF0ZTwva2JkPjxhIG5hbWU9Ii1yZXBsYXlnYWluLWFjY3VyYXRlIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtjb21wdXRlCisgICBSZXBsYXlHYWluIG1vcmUgYWNjdXJhdGVseSBhbmQgZmluZCB0aGUgcGVhayBzYW1wbGU8L2E+PC9zdHJvbmc+PC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+CisgICAgRW5hYmxlIGRlY29kaW5nIG9uIHRoZSBmbHkuIENvbXB1dGUgIlJhZGlvIiBSZXBsYXlHYWluIG9uIHRoZSBkZWNvZGVkIAorICAgIGRhdGEgc3RyZWFtLiBGaW5kIHRoZSBwZWFrIHNhbXBsZSBvZiB0aGUgZGVjb2RlZCBkYXRhIHN0cmVhbSBhbmQgc3RvcmUgCisgICAgaXQgaW4gdGhlIGZpbGUuPGJyPgorICAgIDxicj4gICAgCisgICAgUmVwbGF5R2FpbiBhbmFseXNpcyBkb2VzIDxpPm5vdDwvaT4gYWZmZWN0IHRoZSBjb250ZW50IG9mIGEgCisgICAgY29tcHJlc3NlZCBkYXRhIHN0cmVhbSBpdHNlbGYsIGl0IGlzIGEgdmFsdWUgc3RvcmVkIGluIHRoZSBoZWFkZXIgCisgICAgb2YgYSBzb3VuZCBmaWxlLiBJbmZvcm1hdGlvbiBvbiB0aGUgcHVycG9zZSBvZiBSZXBsYXlHYWluIGFuZCB0aGUKKyAgICBhbGdvcml0aG1zIHVzZWQgaXMgYXZhaWxhYmxlIGZyb20gCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5yZXBsYXlnYWluLm9yZy8iPmh0dHA6Ly93d3cucmVwbGF5Z2Fpbi5vcmcvPC9hPjxicj4KKyAgICA8YnI+CisgICAgQnkgZGVmYXVsdCwgTEFNRSBwZXJmb3JtcyBSZXBsYXlHYWluIGFuYWx5c2lzIG9uIHRoZSBpbnB1dCBkYXRhIAorICAgIChhZnRlciB0aGUgdXNlci1zcGVjaWZpZWQgdm9sdW1lIHNjYWxpbmcpLiBUaGlzCisgICAgYmVoYXZpb3IgbWlnaHQgZ2l2ZSBzbGlnaHRseSBpbmFjY3VyYXRlIHJlc3VsdHMgYmVjYXVzZSB0aGUgZGF0YSBvbiAKKyAgICB0aGUgb3V0cHV0IG9mIGEgbG9zc3kgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBzZXF1ZW5jZSBkaWZmZXJzIGZyb20gCisgICAgdGhlIGluaXRpYWwgaW5wdXQgZGF0YS4gV2hlbiAtLXJlcGxheWdhaW4tYWNjdXJhdGUgaXMgc3BlY2lmaWVkIHRoZQorICAgIG1wMyBzdHJlYW0gZ2V0cyBkZWNvZGVkIG9uIHRoZSBmbHkgYW5kIHRoZSBhbmFseXNpcyBpcyBwZXJmb3JtZWQgb24gdGhlCisgICAgZGVjb2RlZCBkYXRhIHN0cmVhbS4gQWx0aG91Z2ggdGhlb3JldGljYWxseSB0aGlzIG1ldGhvZCBnaXZlcyBtb3JlIAorICAgIGFjY3VyYXRlIHJlc3VsdHMsIGl0IGhhcyBzZXZlcmFsIGRpc2FkdmFudGFnZXM6CisgICAgPHVsPgorICAgICAgPGxpPiB0ZXN0cyBoYXZlIHNob3duIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgUmVwbGF5R2FpbiB2YWx1ZXMgCisgICAgICAgIGNvbXB1dGVkIG9uIHRoZSBpbnB1dCBkYXRhIGFuZCBkZWNvZGVkIGRhdGEgaXMgdXN1YWxseSBubyBncmVhdGVyIAorICAgICAgICB0aGFuIDAuNWRCLCBhbHRob3VnaCB0aGUgbWluaW11bSB2b2x1bWUgZGlmZmVyZW5jZSB0aGUgaHVtYW4gZWFyIAorICAgICAgICBjYW4gcGVyY2VpdmUgaXMgYWJvdXQgMS4wZEIKKyAgICAgIDwvbGk+CisgICAgICA8bGk+IGRlY29kaW5nIG9uIHRoZSBmbHkgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSBlbmNvZGluZyBwcm9jZXNzCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgVGhlIGFwcGFyZW50IGFkdmFudGFnZSBpcyB0aGF0OgorICAgIDx1bD4KKyAgICAgIDxsaT4gd2l0aCAtLXJlcGxheWdhaW4tYWNjdXJhdGUgdGhlIHBlYWsgc2FtcGxlIGlzIGRldGVybWluZWQgYW5kIAorICAgICAgICBzdG9yZWQgaW4gdGhlIGZpbGUuIFRoZSBrbm93bGVkZ2Ugb2YgdGhlIHBlYWsgc2FtcGxlIGNhbiBiZSB1c2VmdWwKKyAgICAgICAgdG8gZGVjb2RlcnMgKHBsYXllcnMpIHRvIHByZXZlbnQgYSBuZWdhdGl2ZSBlZmZlY3QgY2FsbGVkICdjbGlwcGluZycKKyAgICAgICAgdGhhdCBpbnRyb2R1Y2VzIGRpc3RvcnRpb24gaW50byBzb3VuZC4KKyAgICAgIDwvbGk+CisgICAgPC91bD4gICAgCisgICAgPGJyPgorICAgIE9ubHkgdGhlICJSYWRpb0dhaW4iIFJlcGxheUdhaW4gdmFsdWUgaXMgY29tcHV0ZWQuIEl0IGlzIHN0b3JlZCBpbiB0aGUgCisgICAgTEFNRSB0YWcuIFRoZSBhbmFseXNpcyBpcyAgcGVyZm9ybWVkIHdpdGggdGhlIHJlZmVyZW5jZSB2b2x1bWUgZXF1YWwKKyAgICB0byA4OWRCLiBOb3RlOiB0aGUgcmVmZXJlbmNlIHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gODNkQiBvbiAKKyAgICB0cmFuc2l0aW9uIGZyb20gdmVyc2lvbiAzLjk1IHRvIDMuOTUuMS48YnI+CisgICAgPGJyPgorICAgIFRoaXMgb3B0aW9uIGlzIG5vdCB1c2FibGUgaWYgdGhlIE1QMyBkZWNvZGVyIHdhcyA8Yj5leHBsaWNpdGx5PC9iPgorICAgIGRpc2FibGVkIGluIHRoZSBidWlsZCBvZiBMQU1FLiAoTm90ZTogaWYgTEFNRSBpcyBjb21waWxlZCB3aXRob3V0IHRoZSAKKyAgICBNUDMgZGVjb2RlciwgUmVwbGF5R2FpbiBhbmFseXNpcyBpcyBwZXJmb3JtZWQgb24gdGhlIGlucHV0IGRhdGEgYWZ0ZXIKKyAgICB1c2VyLXNwZWNpZmllZCB2b2x1bWUgc2NhbGluZykuPGJyPgorICAgIDxicj4KKyAgICBTZWUgYWxzbzogPGEgaHJlZj0iIy1yZXBsYXlnYWluLWZhc3QiPi0tcmVwbGF5Z2Fpbi1mYXN0PC9hPiwgCisgICAgPGEgaHJlZj0iIy1ub3JlcGxheWdhaW4iPi0tbm9yZXBsYXlnYWluPC9hPiwgPGEgaHJlZj0iIy1jbGlwZGV0ZWN0Ij4tLWNsaXBkZXRlY3Q8L2E+CisgIDxkdD48YnI+CisgIDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1yZXBsYXlnYWluLWZhc3Q8L2tiZD48YSBuYW1lPSItcmVwbGF5Z2Fpbi1mYXN0Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtjb21wdXRlCisgICBSZXBsYXlHYWluIGZhc3QgYnV0IHNsaWdodGx5IGluYWNjdXJhdGVseSAoZGVmYXVsdCk8L2E+PC9zdHJvbmc+PC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+CisgICAgQ29tcHV0ZSAiUmFkaW8iIFJlcGxheUdhaW4gb24gdGhlIGlucHV0IGRhdGEgc3RyZWFtIGFmdGVyIHVzZXItc3BlY2lmaWVkIAorICAgIHZvbHVtZSBzY2FsaW5nIGFuZC9vciByZXNhbXBsaW5nLjxicj4KKyAgICA8YnI+ICAgIAorICAgIFJlcGxheUdhaW4gYW5hbHlzaXMgZG9lcyA8aT5ub3Q8L2k+IGFmZmVjdCB0aGUgY29udGVudCBvZiBhIAorICAgIGNvbXByZXNzZWQgZGF0YSBzdHJlYW0gaXRzZWxmLCBpdCBpcyBhIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGVhZGVyIAorICAgIG9mIGEgc291bmQgZmlsZS4gSW5mb3JtYXRpb24gb24gdGhlIHB1cnBvc2Ugb2YgUmVwbGF5R2FpbiBhbmQgdGhlCisgICAgYWxnb3JpdGhtcyB1c2VkIGlzIGF2YWlsYWJsZSBmcm9tIAorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cucmVwbGF5Z2Fpbi5vcmcvIj5odHRwOi8vd3d3LnJlcGxheWdhaW4ub3JnLzwvYT48YnI+CisgICAgPGJyPgorICAgIE9ubHkgdGhlICJSYWRpb0dhaW4iIFJlcGxheUdhaW4gdmFsdWUgaXMgY29tcHV0ZWQuIEl0IGlzIHN0b3JlZCBpbiB0aGUgCisgICAgTEFNRSB0YWcuIFRoZSBhbmFseXNpcyBpcyAgcGVyZm9ybWVkIHdpdGggdGhlIHJlZmVyZW5jZSB2b2x1bWUgZXF1YWwKKyAgICB0byA4OWRCLiBOb3RlOiB0aGUgcmVmZXJlbmNlIHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gODNkQiBvbiAKKyAgICB0cmFuc2l0aW9uIGZyb20gdmVyc2lvbiAzLjk1IHRvIDMuOTUuMS48YnI+CisgICAgPGJyPgorICAgIFRoaXMgc3dpdGNoIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC48YnI+CisgICAgPGJyPgorICAgIFNlZSBhbHNvOiA8YSBocmVmPSIjLXJlcGxheWdhaW4tYWNjdXJhdGUiPi0tcmVwbGF5Z2Fpbi1hY2N1cmF0ZTwvYT4sIAorICAgIDxhIGhyZWY9IiMtbm9yZXBsYXlnYWluIj4tLW5vcmVwbGF5Z2FpbjwvYT4KKyAgPGR0Pjxicj4KKyAgPC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLXJlc2FtcGxlIDgvMTEuMDI1LzEyLzE2LzIyLjA1LzI0LzMyLzQ0LjEvNDg8L2tiZD48YSBuYW1lPSItcmVzYW1wbGUiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO291dHB1dCAKKyAgICBzYW1wbGluZyBmcmVxdWVuY3kgaW4ga0h6PC9hPjwvc3Ryb25nPjwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBTZWxlY3Qgb3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAoZm9yIGVuY29kaW5nIG9ubHkpLiA8YnI+CisgICAgSWYgbm90IHNwZWNpZmllZCwgTEFNRSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzYW1wbGUgdGhlIGlucHV0IHdoZW4gdXNpbmcgaGlnaCAKKyAgICBjb21wcmVzc2lvbiByYXRpb3MuIAorICA8ZHQ+PGJyPgorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi1zIDgvMTEuMDI1LzEyLzE2LzIyLjA1LzI0LzMyLzQ0LjEvNDg8L2tiZD48YSBuYW1lPSJzIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzYW1wbGluZyAKKyAgICBmcmVxdWVuY3k8L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBSZXF1aXJlZCBvbmx5IGZvciByYXcgUENNIGlucHV0IGZpbGVzLiBPdGhlcndpc2UgaXQgd2lsbCBiZSBkZXRlcm1pbmVkIAorICAgIGZyb20gdGhlIGhlYWRlciBvZiB0aGUgaW5wdXQgZmlsZS48YnI+CisgICAgPGJyPgorICAgIExBTUUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2FtcGxlIHRoZSBpbnB1dCBmaWxlIHRvIG9uZSBvZiB0aGUgc3VwcG9ydGVkIE1QMyAKKyAgICBzYW1wbGVyYXRlcyBpZiBuZWNlc3NhcnkuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LVMgLyAtLXNpbGVudCAvIC0tcXVpZXQ8L2tiZD48YSBuYW1lPSItc2lsZW50Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzaWxlbnQgCisgICAgb3BlcmF0aW9uPC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gRG9uJ3QgcHJpbnQgcHJvZ3Jlc3MgcmVwb3J0LiAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi0tc2NhbGUgbjwva2JkPjxhIG5hbWU9Ii1zY2FsZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2NhbGVzIAorICAgIGlucHV0IGJ5IG48L2E+PC9zdHJvbmc+IDwvZHQ+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLXNjYWxlLWwgbjwva2JkPjxhIG5hbWU9Ii1zY2FsZS1sIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzY2FsZXMgCisgICAgaW5wdXQgY2hhbm5lbCAwIChsZWZ0KSBieSBuPC9hPjwvc3Ryb25nPiA8L2R0PgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1zY2FsZS1yIG48L2tiZD48YSBuYW1lPSItc2NhbGUtciI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c2NhbGVzIAorICAgIGlucHV0IGNoYW5uZWwgMSAocmlnaHQpIGJ5IG48L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPlNjYWxlcyBpbnB1dCBieSBuLiBUaGlzIGp1c3QgbXVsdGlwbGllcyB0aGUgUENNIGRhdGEgKGFmdGVyIGl0IGhhcyBiZWVuIAorICAgIGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludCkgYnkgbi4gPGJyPgorICAgIDxicj4KKyAgICBuID4gMTogaW5jcmVhc2Ugdm9sdW1lPGJyPgorICAgIG4gPSAxOiBubyBlZmZlY3Q8YnI+CisgICAgbiA8IDE6IHJlZHVjZSB2b2x1bWU8YnI+CisgICAgPGJyPgorICAgIFVzZSB3aXRoIGNhcmUsIHNpbmNlIG1vc3QgTVAzIGRlY29kZXJzIHdpbGwgdHJ1bmNhdGUgZGF0YSB3aGljaCBkZWNvZGVzIHRvIAorICAgIHZhbHVlcyBncmVhdGVyIHRoYW4gMzI3NjguIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS1zdHJpY3RseS1lbmZvcmNlLUlTTzwva2JkPjxhIG5hbWU9Ii1zdHJpY3RseS1lbmZvcmNlLUlTTyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c3RyaWN0IAorICAgIElTTyBjb21wbGlhbmNlPC9hPjwvc3Ryb25nPiA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gV2l0aCB0aGlzIG9wdGlvbiwgTEFNRSB3aWxsIGVuZm9yY2UgdGhlIDc2ODAgYml0IGxpbWl0YXRpb24gb24gdG90YWwgZnJhbWUgCisgICAgc2l6ZS48YnI+CisgICAgVGhpcyByZXN1bHRzIGluIG1hbnkgd2FzdGVkIGJpdHMgZm9yIGhpZ2ggYml0cmF0ZSBlbmNvZGluZ3MgYnV0IHdpbGwgZW5zdXJlIAorICAgIHN0cmljdCBJU08gY29tcGF0aWJpbGl0eS4gVGhpcyBjb21wYXRpYmlsaXR5IG1pZ2h0IGJlIGltcG9ydGFudCBmb3IgaGFyZHdhcmUgCisgICAgcGxheWVycy4gCis8L2RsPgorPGRsPiAKKyAgPGRkPiZuYnNwOyAKKyAgPGR0Pjxicj4KKyAgICA8YnI+CisgIDwvZHQ+CisgIDxociB3aWR0aD0iNTAlIiBub3NoYWRlIGFsaWduPSJjZW50ZXIiPgorICA8YnI+CisgIDxkbD4gPC9kbD4KKyAgPGR0PjxzdHJvbmc+KiA8a2JkPi10PC9rYmQ+PGEgbmFtZT0idCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGlzYWJsZSBJTkZPL1dBViAKKyAgICBoZWFkZXIgPC9hPjwvc3Ryb25nPjwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBEaXNhYmxlIHdyaXRpbmcgb2YgdGhlIElORk8gVGFnIG9uIGVuY29kaW5nLjxicj4KKyAgICBUaGlzIHRhZyBpbiBlbWJlZGRlZCBpbiBmcmFtZSAwIG9mIHRoZSBNUDMgZmlsZS4gSXQgaW5jbHVkZXMgc29tZSBpbmZvcm1hdGlvbiAKKyAgICBhYm91dCB0aGUgZW5jb2Rpbmcgb3B0aW9ucyBvZiB0aGUgZmlsZSwgYW5kIGluIFZCUiBpdCBsZXRzIFZCUiBhd2FyZSBwbGF5ZXJzIAorICAgIGNvcnJlY3RseSBzZWVrIGFuZCBjb21wdXRlIHBsYXlpbmcgdGltZXMgb2YgVkJSIGZpbGVzLjxicj4KKyAgICA8YnI+CisgICAgV2hlbiAnLS1kZWNvZGUnIGlzIHNwZWNpZmllZCAoZGVjb2RlIHRvIFdBViksIHRoaXMgZmxhZyB3aWxsIGRpc2FibGUgd3JpdGluZyAKKyAgICBvZiB0aGUgV0FWIGhlYWRlci4gVGhlIG91dHB1dCB3aWxsIGJlIHJhdyBQQ00sIG5hdGl2ZSBlbmRpYW4gZm9ybWF0LiBVc2UgLXggCisgICAgdG8gc3dhcCBieXRlcy4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tViBbMCwuLi4sMTBbPC9rYmQ+PGEgbmFtZT0iViI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VkJSIHF1YWxpdHkgCisgICAgc2V0dGluZywgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXI8L2E+PC9zdHJvbmc+PC9kdD4KKzwvZGw+Cis8ZGw+IAorICA8ZGQ+IEVuYWJsZSBWQlIgKFZhcmlhYmxlIEJpdFJhdGUpIGFuZCBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIFZCUiBxdWFsaXR5Ljxicj4KKyAgICBkZWZhdWx0PTQ8YnI+CisgICAgMD1oaWdoZXN0IHF1YWxpdHkuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS12YnItbmV3PC9rYmQ+PGEgbmFtZT0iLXZici1uZXciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25ldyAKKyAgICBWQlIgbW9kZTwvYT48L3N0cm9uZz48L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gSW52b2tlcyB0aGUgbmV3ZXN0IFZCUiBhbGdvcml0aG0uIER1cmluZyB0aGUgZGV2ZWxvcG1lbnQgb2YgdmVyc2lvbiAzLjkwLCAKKyAgICBjb25zaWRlcmFibGUgdHVuaW5nIHdhcyBkb25lIG9uIHRoaXMgYWxnb3JpdGhtLCBhbmQgaXQgaXMgbm93IGNvbnNpZGVyZWQgdG8gCisgICAgYmUgb24gcGFyIHdpdGggdGhlIG9yaWdpbmFsIC0tdmJyLW9sZC4gPGJyPgorICAgIEl0IGhhcyB0aGUgYWRkZWQgYWR2YW50YWdlIG9mIGJlaW5nIHZlcnkgZmFzdCAob3ZlciB0d2ljZSBhcyBmYXN0IGFzIC0tdmJyLW9sZCkuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LS12YnItb2xkPC9rYmQ+PGEgbmFtZT0iLXZici1vbGQiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO29sZGVyIAorICAgIFZCUiBtb2RlPC9hPjwvc3Ryb25nPjwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBJbnZva2VzIHRoZSBvbGRlc3QsIG1vc3QgdGVzdGVkIFZCUiBhbGdvcml0aG0uIEl0IHByb2R1Y2VzIHZlcnkgZ29vZCBxdWFsaXR5IAorICAgIGZpbGVzLCB0aG91Z2ggaXMgbm90IHZlcnkgZmFzdC4gVGhpcyBoYXMsIHVwIHRocm91Z2ggdjMuODksIGJlZW4gY29uc2lkZXJlZCAKKyAgICB0aGUgIndvcmtob3JzZSIgVkJSIGFsZ29yaXRobS4gCisgIDxkdD48YnI+CisgICAgPGJyPgorICA8L2R0PgorICA8aHIgd2lkdGg9IjUwJSIgbm9zaGFkZSBhbGlnbj0iY2VudGVyIj4KKyAgPGJyPgorICA8ZGw+IDwvZGw+CisgIDxkdD48c3Ryb25nPiogPGtiZD4tLXZlcmJvc2U8L2tiZD48YSBuYW1lPSItdmVyYm9zZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dmVyYm9zaXR5PC9hPjwvc3Ryb25nPjwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBQcmludCBhIGxvdCBvZiBpbmZvcm1hdGlvbiBvbiBzY3JlZW4uIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LXg8L2tiZD48YSBuYW1lPSJ4Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzd2FwYnl0ZXM8L2E+PC9zdHJvbmc+IAorICA8L2R0PgorPC9kbD4KKzxkbD4gCisgIDxkZD4gU3dhcCBieXRlcyBpbiB0aGUgaW5wdXQgZmlsZSBvciBvdXRwdXQgZmlsZSB3aGVuIHVzaW5nIC0tZGVjb2RlLjxicj4KKyAgICBGb3Igc29ydGluZyBvdXQgbGl0dGxlIGVuZGlhbi9iaWcgZW5kaWFuIHR5cGUgcHJvYmxlbXMuIElmIHlvdXIgZW5jb2RpbmdzIAorICAgIHNvdW5kcyBsaWtlIHN0YXRpYywgdHJ5IHRoaXMgZmlyc3QuIAorICA8ZHQ+PGJyPgorICAgIDxicj4KKyAgPC9kdD4KKyAgPGhyIHdpZHRoPSI1MCUiIG5vc2hhZGUgYWxpZ249ImNlbnRlciI+CisgIDxicj4KKyAgPGRsPiA8L2RsPgorICA8ZHQ+PHN0cm9uZz4qIDxrYmQ+LVggMC4uLjc8L2tiZD48YSBuYW1lPSJYcXVhbnQiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2NoYW5nZSAKKyAgICBxdWFsaXR5IG1lYXN1cmU8L2E+PC9zdHJvbmc+IDwvZHQ+Cis8L2RsPgorPGRsPiAKKyAgPGRkPiBXaGVuIExBTUUgc2VhcmNoZXMgZm9yIGEgImdvb2QiIHF1YW50aXphdGlvbiwgaXQgaGFzIHRvIGNvbXBhcmUgdGhlIGFjdHVhbCAKKyAgICBvbmUgd2l0aCB0aGUgYmVzdCBvbmUgZm91bmQgc28gZmFyLiBUaGUgY29tcGFyaXNvbiBzYXlzIHdoaWNoIG9uZSBpcyBiZXR0ZXIsIAorICAgIHRoZSBiZXN0IHNvIGZhciBvciB0aGUgYWN0dWFsLiBUaGUgLVggcGFyYW1ldGVyIHNlbGVjdHMgYmV0d2VlbiBkaWZmZXJlbnQgCisgICAgYXBwcm9hY2hlcyB0byBtYWtlIHRoaXMgZGVjaXNpb24sIC1YMCBiZWluZyB0aGUgZGVmYXVsdCBtb2RlOjxicj4KKyAgICA8YnI+CisgICAgPGI+LVgwIDwvYj48YnI+CisgICAgVGhlIGNyaXRlcmlvbnMgYXJlIChpbiBvcmRlciBvZiBpbXBvcnRhbmNlKTo8YnI+CisgICAgKiBsZXNzIGRpc3RvcnRlZCBzY2FsZWZhY3RvciBiYW5kczxicj4KKyAgICAqIHRoZSBzdW0gb2Ygbm9pc2Ugb3ZlciB0aGUgdGhyZXNob2xkcyBpcyBsb3dlcjxicj4KKyAgICAqIHRoZSB0b3RhbCBub2lzZSBpcyBsb3dlcjxicj4KKyAgICA8YnI+CisgICAgPGI+LVgxPC9iPjxicj4KKyAgICBUaGUgYWN0dWFsIGlzIGJldHRlciBpZiB0aGUgbWF4aW11bSBub2lzZSBvdmVyIGFsbCBzY2FsZWZhY3RvciBiYW5kcyBpcyBsZXNzIAorICAgIHRoYW4gdGhlIGJlc3Qgc28gZmFyIC48YnI+CisgICAgPGJyPgorICAgIDxiPi1YMjwvYj48YnI+CisgICAgVGhlIGFjdHVhbCBpcyBiZXR0ZXIgaWYgdGhlIHRvdGFsIHN1bSBvZiBub2lzZSBpcyBsb3dlciB0aGFuIHRoZSBiZXN0IHNvIGZhci48YnI+CisgICAgPGJyPgorICAgIDxiPi1YMzwvYj48YnI+CisgICAgVGhlIGFjdHVhbCBpcyBiZXR0ZXIgaWYgdGhlIHRvdGFsIHN1bSBvZiBub2lzZSBpcyBsb3dlciB0aGFuIHRoZSBiZXN0IHNvIGZhciAKKyAgICBhbmQgdGhlIG1heGltdW0gbm9pc2Ugb3ZlciBhbGwgc2NhbGVmYWN0b3IgYmFuZHMgaXMgbGVzcyB0aGFuIHRoZSBiZXN0IHNvIAorICAgIGZhciBwbHVzIDJkYi48YnI+CisgICAgPGJyPgorICAgIDxiPi1YNDwvYj4gPGJyPgorICAgIE5vdCB5ZXQgZG9jdW1lbnRlZC48YnI+CisgICAgPGJyPgorICAgIDxiPi1YNTwvYj48YnI+CisgICAgVGhlIGNyaXRlcmlvbnMgYXJlIChpbiBvcmRlciBvZiBpbXBvcnRhbmNlKTo8YnI+CisgICAgKiB0aGUgc3VtIG9mIG5vaXNlIG92ZXIgdGhlIHRocmVzaG9sZHMgaXMgbG93ZXIgPGJyPgorICAgICogdGhlIHRvdGFsIHN1bSBvZiBub2lzZSBpcyBsb3dlcjxicj4KKyAgICA8YnI+CisgICAgPGI+LVg2PC9iPiA8YnI+CisgICAgVGhlIGNyaXRlcmlvbnMgYXJlIChpbiBvcmRlciBvZiBpbXBvcnRhbmNlKTo8YnI+CisgICAgKiB0aGUgc3VtIG9mIG5vaXNlIG92ZXIgdGhlIHRocmVzaG9sZHMgaXMgbG93ZXI8YnI+CisgICAgKiB0aGUgbWF4aW11bSBub2lzZSBvdmVyIGFsbCBzY2FsZWZhY3RvciBiYW5kcyBpcyBsb3dlcjxicj4KKyAgICAqIHRoZSB0b3RhbCBzdW0gb2Ygbm9pc2UgaXMgbG93ZXI8YnI+CisgICAgPGJyPgorICAgIDxiPi1YNzwvYj4gPGJyPgorICAgIFRoZSBjcml0ZXJpb25zIGFyZTo8YnI+CisgICAgKiBsZXNzIGRpc3RvcnRlZCBzY2FsZWZhY3RvciBiYW5kczxicj4KKyAgICBvcjxicj4KKyAgICAqIHRoZSBzdW0gb2Ygbm9pc2Ugb3ZlciB0aGUgdGhyZXNob2xkcyBpcyBsb3dlciAKKzwvZGw+Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvbWFuL01ha2VmaWxlLmFtIGIvZG9jL21hbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2FiMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDcgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjEgMjAwMC8xMC8yMiAxMTozOTo0NCBhbGVpZGluZ2VyIEV4cCAkCisKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIGFuc2kya25yCisKK21hbl9NQU5TID0gbGFtZS4xCitFWFRSQV9ESVNUID0gJHttYW5fTUFOU30KKwpkaWZmIC0tZ2l0IGEvZG9jL21hbi9NYWtlZmlsZS5pbiBiL2RvYy9tYW4vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyYzNmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYW4vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0MDcgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IGRvYy9tYW4KK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK21hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQorYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKG1hbjFkaXIpIgorTlJPRkYgPSBucm9mZgorTUFOUyA9ICQobWFuX01BTlMpCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiBhbnNpMmtucgorbWFuX01BTlMgPSBsYW1lLjEKK0VYVFJBX0RJU1QgPSAke21hbl9NQU5TfQorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGRvYy9tYW4vTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGRvYy9tYW4vTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtbWFuMTogJChtYW4xX01BTlMpICQobWFuX01BTlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChtYW4xZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuMWRpcikiCisJQGxpc3Q9JyQobWFuMV9NQU5TKSAkKGRpc3RfbWFuMV9NQU5TKSAkKG5vZGlzdF9tYW4xX01BTlMpJzsgXAorCWwyPSckKG1hbl9NQU5TKSAkKGRpc3RfbWFuX01BTlMpICQobm9kaXN0X21hbl9NQU5TKSc7IFwKKwlmb3IgaSBpbiAkJGwyOyBkbyBcCisJICBjYXNlICIkJGkiIGluIFwKKwkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKKwkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCisJICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKKwkgIGNhc2UgIiQkZXh0IiBpbiBcCisJICAgIDEqKSA7OyBcCisJICAgICopIGV4dD0nMScgOzsgXAorCSAgZXNhYzsgXAorCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAtZSAncy9eLipcLy8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0JyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAiJCRmaWxlIiAiJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAorCWRvbmUKK3VuaW5zdGFsbC1tYW4xOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobWFuMV9NQU5TKSAkKGRpc3RfbWFuMV9NQU5TKSAkKG5vZGlzdF9tYW4xX01BTlMpJzsgXAorCWwyPSckKG1hbl9NQU5TKSAkKGRpc3RfbWFuX01BTlMpICQobm9kaXN0X21hbl9NQU5TKSc7IFwKKwlmb3IgaSBpbiAkJGwyOyBkbyBcCisJICBjYXNlICIkJGkiIGluIFwKKwkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAorCSAgY2FzZSAiJCRleHQiIGluIFwKKwkgICAgMSopIDs7IFwKKwkgICAgKikgZXh0PScxJyA7OyBcCisJICBlc2FjOyBcCisJICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkIC1lICdzL14uKlwvLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCisJICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCciOyBcCisJICBybSAtZiAiJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAorCWRvbmUKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKE1BTlMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChtYW4xZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjogaW5zdGFsbC1tYW4xCisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCisKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW4xCisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjEgXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuMQorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9kb2MvbWFuL2xhbWUuMSBiL2RvYy9tYW4vbGFtZS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Zjg2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbWFuL2xhbWUuMQpAQCAtMCwwICsxLDExNDUgQEAKKy5USCBsYW1lIDEgIkp1bHkgMDgsIDIwMDgiICJMQU1FIDMuOTgiICJMQU1FIGF1ZGlvIGNvbXByZXNzb3IiCisuU0ggTkFNRQorbGFtZSBcLSBjcmVhdGUgbXAzIGF1ZGlvIGZpbGVzCisuU0ggU1lOT1BTSVMKK2xhbWUgW29wdGlvbnNdIDxpbmZpbGU+IDxvdXRmaWxlPgorLlNIIERFU0NSSVBUSU9OCisuUFAKK0xBTUUgaXMgYSBwcm9ncmFtIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjb21wcmVzc2VkIGF1ZGlvIGZpbGVzLgorKExhbWUgYWluJ3QgYW4gTVAzIGVuY29kZXIpLgorVGhlc2UgYXVkaW8gZmlsZXMgY2FuIGJlIHBsYXllZCBiYWNrIGJ5IHBvcHVsYXIgTVAzIHBsYXllcnMgc3VjaCBhcworbXBnMTIzIG9yIG1hZHBsYXkuCitUbyByZWFkIGZyb20gc3RkaW4sIHVzZSAiXC0iIGZvciA8aW5maWxlPi4KK1RvIHdyaXRlIHRvIHN0ZG91dCwgdXNlIGEgIlwtIiBmb3IgPG91dGZpbGU+LgorLlNIIE9QVElPTlMKK0lucHV0IG9wdGlvbnM6CisuVFAKKy5CIFwtcgorQXNzdW1lIHRoZSBpbnB1dCBmaWxlIGlzIHJhdyBwY20uCitTYW1wbGluZyByYXRlIGFuZCBtb25vL3N0ZXJlby9qc3RlcmVvIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitGb3IgZWFjaCBzdGVyZW8gc2FtcGxlLCBMQU1FIGV4cGVjdHMgdGhlIGlucHV0IGRhdGEgdG8gYmUgb3JkZXJlZCBsZWZ0IGNoYW5uZWwKK2ZpcnN0LCB0aGVuIHJpZ2h0IGNoYW5uZWwuIEJ5IGRlZmF1bHQsIExBTUUgZXhwZWN0cyB0aGVtIHRvIGJlIHNpZ25lZCBpbnRlZ2Vycword2l0aCBhIGJpdHdpZHRoIG9mIDE2LgorV2l0aG91dAorLkIgXC1yLAorTEFNRSB3aWxsIHBlcmZvcm0gc2V2ZXJhbAorLkkgZnNlZWsoKSdzCitvbiB0aGUgaW5wdXQgZmlsZSBsb29raW5nIGZvciBXQVYgYW5kIEFJRkYgaGVhZGVycy4KKy5icgorTWlnaHQgbm90IGJlIGF2YWlsYWJsZSBvbiB5b3VyIHJlbGVhc2UuIAorLlRQCisuQiBcLXgKK1N3YXAgYnl0ZXMgaW4gdGhlIGlucHV0IGZpbGUgb3Igb3V0cHV0IGZpbGUgd2hlbiB1c2luZworLkIgXC1cLWRlY29kZS4KKy5icgorRm9yIHNvcnRpbmcgb3V0IGxpdHRsZSBlbmRpYW4vYmlnIGVuZGlhbiB0eXBlIHByb2JsZW1zLgorSWYgeW91ciBlbmNvZGluZ3Mgc291bmRzIGxpa2Ugc3RhdGljLAordHJ5IHRoaXMgZmlyc3QuCisuYnIKK1dpdGhvdXQgdXNpbmcKKy5CIFwteCwKK0xBTUUgd2lsbCB0cmVhdCBpbnB1dCBmaWxlIGFzIG5hdGl2ZSBlbmRpYW4uCisuVFAKKy5CSSBcLXMgIiBzZnJlcSIKKy5JIHNmcmVxCis9IDgvMTEuMDI1LzEyLzE2LzIyLjA1LzI0LzMyLzQ0LjEvNDgKKworUmVxdWlyZWQgb25seSBmb3IgcmF3IFBDTSBpbnB1dCBmaWxlcy4KK090aGVyd2lzZSBpdCB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgaGVhZGVyIG9mIHRoZSBpbnB1dCBmaWxlLgorCitMQU1FIHdpbGwgYXV0b21hdGljYWxseSByZXNhbXBsZSB0aGUgaW5wdXQgZmlsZSB0byBvbmUgb2YgdGhlIHN1cHBvcnRlZAorTVAzIHNhbXBsZXJhdGVzIGlmIG5lY2Vzc2FyeS4KKy5UUAorLkJJIFwtXC1iaXR3aWR0aCAiIG4iCitJbnB1dCBiaXQgd2lkdGggcGVyIHNhbXBsZS4KKy5icgorLkkgbgorPSA4LCAxNiwgMjQsIDMyIChkZWZhdWx0IDE2KQorCitSZXF1aXJlZCBvbmx5IGZvciByYXcgUENNIGlucHV0IGZpbGVzLgorT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBoZWFkZXIgb2YgdGhlIGlucHV0IGZpbGUuCisuVFAKKy5CSSBcLVwtc2lnbmVkCitJbnN0cnVjdHMgTEFNRSB0aGF0IHRoZSBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGFyZSBzaWduZWQgKHRoZSBkZWZhdWx0Citmb3IgMTYsIDI0IGFuZCAzMiBiaXRzIHJhdyBwY20gZGF0YSkuCisKK1JlcXVpcmVkIG9ubHkgZm9yIHJhdyBQQ00gaW5wdXQgZmlsZXMuCisuVFAKKy5CSSBcLVwtdW5zaWduZWQKK0luc3RydWN0cyBMQU1FIHRoYXQgdGhlIHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYXJlIHVuc2lnbmVkICh0aGUgZGVmYXVsdAorZm9yIDggYml0cyByYXcgcGNtIGRhdGEsIHdoZXJlIDB4ODAgaXMgemVybykuCisKK1JlcXVpcmVkIG9ubHkgZm9yIHJhdyBQQ00gaW5wdXQgZmlsZXMKK2FuZCBvbmx5IGF2YWlsYWJsZSBhdCBiaXR3aWR0aCA4LgorLlRQCisuQkkgXC1cLWxpdHRsZS1lbmRpYW4KK0luc3RydWN0cyBMQU1FIHRoYXQgdGhlIHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYXJlIGluIGxpdHRsZS1lbmRpYW4gZm9ybS4KKworUmVxdWlyZWQgb25seSBmb3IgcmF3IFBDTSBpbnB1dCBmaWxlcy4KKy5UUAorLkJJIFwtXC1iaWctZW5kaWFuCitJbnN0cnVjdHMgTEFNRSB0aGF0IHRoZSBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGFyZSBpbiBiaWctZW5kaWFuIGZvcm0uCisKK1JlcXVpcmVkIG9ubHkgZm9yIHJhdyBQQ00gaW5wdXQgZmlsZXMuCisuVFAKKy5CIFwtXC1tcDJpbnB1dAorQXNzdW1lIHRoZSBpbnB1dCBmaWxlIGlzIGEgTVBFRyBMYXllciBJSSAoaWUgTVAyKSBmaWxlLgorLmJyCitJZiB0aGUgZmlsZW5hbWUgZW5kcyBpbiAiLm1wMiIgTEFNRSB3aWxsIGFzc3VtZSBpdCBpcyBhIE1QRUcgTGF5ZXIgSUkgZmlsZS4KK0ZvciBzdGRpbiBvciBMYXllciBJSSBmaWxlcyB3aGljaCBkbyBub3QgZW5kIGluIC5tcDIgeW91IG5lZWQgdG8gdXNlCit0aGlzIHN3aXRjaC4gCisuVFAKKy5CIFwtXC1tcDNpbnB1dAorQXNzdW1lIHRoZSBpbnB1dCBmaWxlIGlzIGEgTVAzIGZpbGUuCisuYnIKK1VzZWZ1bCBmb3IgZG93bnNhbXBsaW5nIGZyb20gb25lIG1wMyB0byBhbm90aGVyLgorQXMgYW4gZXhhbXBsZSwKK2l0IGNhbiBiZSB1c2VmdWwgZm9yIHN0cmVhbWluZyB0aHJvdWdoIGFuIEljZUNhc3Qgc2VydmVyLgorLmJyCitJZiB0aGUgZmlsZW5hbWUgZW5kcyBpbiAiLm1wMyIgTEFNRSB3aWxsIGFzc3VtZSBpdCBpcyBhbiBNUDMuCitGb3Igc3RkaW4gb3IgTVAzIGZpbGVzIHdoaWNoIGRvIG5vdCBlbmQgaW4gLm1wMyB5b3UgbmVlZCB0byB1c2UgdGhpcyBzd2l0Y2guIAorLlRQCisuQkkgXC1cLW5vZ2FwICIgZmlsZTEgZmlsZTIgLi4uIgorZ2FwbGVzcyBlbmNvZGluZyBmb3IgYSBzZXQgb2YgY29udGlndW91cyBmaWxlcworLlRQCisuQkkgXC1cLW5vZ2Fwb3V0ICIgZGlyIgorb3V0cHV0IGRpciBmb3IgZ2FwbGVzcyBlbmNvZGluZyAobXVzdCBwcmVjZWRlIFwtXC1ub2dhcCkKKworLlBQCitPcGVyYXRpb25hbCBvcHRpb25zOgorLlRQCisuQkkgXC1tICAiIG1vZGUiCisuSSBtb2RlCis9IHMsIGosIGYsIGQsIG0KKworSm9pbnQtc3RlcmVvIGlzIHRoZSBkZWZhdWx0IG1vZGUgZm9yIHN0ZXJlbyBmaWxlcyB3aXRoIFZCUiB3aGVuCisuQiBcLVYKK2lzIG1vcmUgdGhhbiA0IG9yIGZpeGVkIGJpdHJhdGVzIG9mIDE2MGticyBvciBsZXNzLgorQXQgaGlnaGVyIGZpeGVkIGJpdHJhdGVzIG9yIGhpZ2hlciBWQlIgc2V0dGluZ3MsCit0aGUgZGVmYXVsdCBpcyBzdGVyZW8uIAorCisuQiAocylpbXBsZSBzdGVyZW8gCisuYnIKK0luIHRoaXMgbW9kZSwKK3RoZSBlbmNvZGVyIG1ha2VzIG5vIHVzZSBvZiBwb3RlbnRpYWxseSBleGlzdGluZyBjb3JyZWxhdGlvbnMgYmV0d2VlbgordGhlIHR3byBpbnB1dCBjaGFubmVscy4KK0l0IGNhbiwKK2hvd2V2ZXIsCituZWdvdGlhdGUgdGhlIGJpdCBkZW1hbmQgYmV0d2VlbiBib3RoIGNoYW5uZWwsCitpLmUuIGdpdmUgb25lIGNoYW5uZWwgbW9yZSBiaXRzIGlmIHRoZSBvdGhlciBjb250YWlucyBzaWxlbmNlIG9yIG5lZWRzCitsZXNzIGJpdHMgYmVjYXVzZSBvZiBhIGxvd2VyIGNvbXBsZXhpdHkuCisKKy5CIChqKW9pbnQgc3RlcmVvCisuYnIKK0luIHRoaXMgbW9kZSwKK3RoZSBlbmNvZGVyIHdpbGwgbWFrZSB1c2Ugb2YgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGJvdGggY2hhbm5lbHMuCitUaGUgc2lnbmFsIHdpbGwgYmUgbWF0cml4ZWQgaW50byBhIHN1bSAoIm1pZCIpLAorY29tcHV0ZWQgYnkgTCtSLAorYW5kIGRpZmZlcmVuY2UgKCJzaWRlIikgc2lnbmFsLAorY29tcHV0ZWQgYnkgTFwtUiwKK2FuZCBtb3JlIGJpdHMgYXJlIGFsbG9jYXRlZCB0byB0aGUgbWlkIGNoYW5uZWwuCitUaGlzIHdpbGwgZWZmZWN0aXZlbHkgaW5jcmVhc2UgdGhlIGJhbmR3aWR0aCBpZiB0aGUgc2lnbmFsIGRvZXMgbm90CitoYXZlIHRvbyBtdWNoIHN0ZXJlbyBzZXBhcmF0aW9uLAordGh1cyBnaXZpbmcgYSBzaWduaWZpY2FudCBnYWluIGluIGVuY29kaW5nIHF1YWxpdHkuCisKK1VzaW5nIG1pZC9zaWRlIHN0ZXJlbyBpbmFwcHJvcHJpYXRlbHkgY2FuIHJlc3VsdCBpbiBhdWRpYmxlCitjb21wcmVzc2lvbiBhcnRpZmFjdHMuCitUbyBtdWNoIHN3aXRjaGluZyBiZXR3ZWVuIG1pZC9zaWRlIGFuZCByZWd1bGFyIHN0ZXJlbyBjYW4gYWxzbworc291bmQgYmFkLgorVG8gZGV0ZXJtaW5lIHdoZW4gdG8gc3dpdGNoIHRvIG1pZC9zaWRlIHN0ZXJlbywKK0xBTUUgdXNlcyBhIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkIGFsZ29yaXRobSB0aGFuIHRoYXQgZGVzY3JpYmVkCitpbiB0aGUgSVNPIGRvY3VtZW50YXRpb24sIGFuZCB0aHVzIGlzIHNhZmUgdG8gdXNlIGluIGpvaW50CitzdGVyZW8gbW9kZS4KKworLkIgKGYpb3JjZWQgTVMgc3RlcmVvIAorLmJyCitUaGlzIG1vZGUgd2lsbCBmb3JjZSBNUyBzdGVyZW8gb24gYWxsIGZyYW1lcy4KK0l0IGlzIHNsaWdodGx5IGZhc3RlciB0aGFuIGpvaW50IHN0ZXJlbywKK2J1dCBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSBhcmUgc3VyZSB0aGF0IGV2ZXJ5IGZyYW1lIG9mIHRoZQoraW5wdXQgZmlsZSBoYXMgdmVyeSBsaXR0bGUgc3RlcmVvIHNlcGFyYXRpb24uCisKKy5CIChkKXVhbCBtb25vCisuYnIKK0luIHRoaXMgbW9kZSwKK3RoZSAyIGNoYW5uZWxzIHdpbGwgYmUgdG90YWxseSBpbmRlcGVuZGVudGx5IGVuY29kZWQuCitFYWNoIGNoYW5uZWwgd2lsbCBoYXZlIGV4YWN0bHkgaGFsZiBvZiB0aGUgYml0cmF0ZS4KK1RoaXMgbW9kZSBpcyBkZXNpZ25lZCBmb3IgYXBwbGljYXRpb25zIGxpa2UgZHVhbCBsYW5ndWFnZXMKK2VuY29kaW5nIChmb3IgZXhhbXBsZTogRW5nbGlzaCBpbiBvbmUgY2hhbm5lbCBhbmQgRnJlbmNoIGluIHRoZSBvdGhlcikuCitVc2luZyB0aGlzIGVuY29kaW5nIG1vZGUgZm9yIHJlZ3VsYXIgc3RlcmVvIGZpbGVzIHdpbGwgcmVzdWx0IGluIGEKK2xvd2VyIHF1YWxpdHkgZW5jb2RpbmcuCisKKy5CIChtKW9ubworLmJyCitUaGUgaW5wdXQgd2lsbCBiZSBlbmNvZGVkIGFzIGEgbW9ubyBzaWduYWwuCitJZiBpdCB3YXMgYSBzdGVyZW8gc2lnbmFsLAoraXQgd2lsbCBiZSBkb3duc2FtcGxlZCB0byBtb25vLgorVGhlIGRvd25taXggaXMgY2FsY3VsYXRlZCBhcyB0aGUgc3VtIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsLAorYXR0ZW51YXRlZCBieSA2IGRCLgorLlRQCisuQiBcLWEKK01peCB0aGUgc3RlcmVvIGlucHV0IGZpbGUgdG8gbW9ubyBhbmQgZW5jb2RlIGFzIG1vbm8uCisuYnIKK1RoZSBkb3dubWl4IGlzIGNhbGN1bGF0ZWQgYXMgdGhlIHN1bSBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCwKK2F0dGVudWF0ZWQgYnkgNiBkQi4gCisKK1RoaXMgb3B0aW9uIGlzIG9ubHkgbmVlZGVkIGluIHRoZSBjYXNlIG9mIHJhdyBQQ00gc3RlcmVvIGlucHV0CisoYmVjYXVzZSBMQU1FIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgaW5wdXQgZmlsZSkuCitUbyBlbmNvZGUgYSBzdGVyZW8gUENNIGlucHV0IGZpbGUgYXMgbW9ubywKK3VzZQorLkIgbGFtZSBcLW0KKy5JIHMKKy5CIFwtYS4KKworRm9yIFdBViBhbmQgQUlGRiBpbnB1dCBmaWxlcywKK3VzaW5nCisuQiBcLW0KK3dpbGwgYWx3YXlzIHByb2R1Y2UgYSBtb25vIC5tcDMgZmlsZSBmcm9tIGJvdGggbW9ubyBhbmQgc3RlcmVvIGlucHV0LiAKKy5UUAorLkIgXC1kCitBbGxvd3MgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIHRvIHVzZSBkaWZmZXJlbnQgYmxvY2sgc2l6ZSB0eXBlcy4gCisuVFAKKy5CIFwtXC1mcmVlZm9ybWF0CitQcm9kdWNlcyBhIGZyZWUgZm9ybWF0IGJpdHN0cmVhbS4KK1dpdGggdGhpcyBvcHRpb24sCit5b3UgY2FuIHVzZQorLkIgXC1iCit3aXRoIGFueSBiaXRyYXRlIGhpZ2hlciB0aGFuIDgga2Jwcy4KKworSG93ZXZlciwKK2V2ZW4gaWYgYW4gbXAzIGRlY29kZXIgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBmcmVlIGJpdHJhdGVzIGF0CitsZWFzdCB1cCB0byAzMjAga2JwcywKK21hbnkgcGxheWVycyBhcmUgdW5hYmxlIHRvIGRlYWwgd2l0aCBpdC4KKworVGVzdHMgaGF2ZSBzaG93biB0aGF0IHRoZSBmb2xsb3dpbmcgZGVjb2RlcnMgc3VwcG9ydCBmcmVlIGZvcm1hdDoKKy5icgorLkIgRnJlZUFtcAordXAgdG8gNDQwIGticHMKKy5icgorLkIgaW5fbXBnMTIzCit1cCB0byA1NjAga2JwcworLmJyCisuQiBsM2RlYwordXAgdG8gMzEwIGticHMKKy5icgorLkIgTEFNRQordXAgdG8gNTYwIGticHMKKy5icgorLkIgTUFECit1cCB0byA2NDAga2JwcworLlRQCisuQiBcLVwtZGVjb2RlCitVc2VzIExBTUUgZm9yIGRlY29kaW5nIHRvIGEgd2F2IGZpbGUuCitUaGUgaW5wdXQgZmlsZSBjYW4gYmUgYW55IGlucHV0IHR5cGUgc3VwcG9ydGVkIGJ5IGVuY29kaW5nLAoraW5jbHVkaW5nIGxheWVyIElJIGZpbGVzLgorTEFNRSB1c2VzIGEgYnVnZml4ZWQgdmVyc2lvbiBvZiBtcGdsaWIgZm9yIGRlY29kaW5nLgorCitJZgorLkIgXC10CitpcyB1c2VkIChkaXNhYmxlIHdhdiBoZWFkZXIpLAorTEFNRSB3aWxsIG91dHB1dCByYXcgcGNtIGluIG5hdGl2ZSBlbmRpYW4gZm9ybWF0LgorWW91IGNhbiB1c2UKKy5CIFwteAordG8gc3dhcCBieXRlcyBvcmRlci4KKworVGhpcyBvcHRpb24gaXMgbm90IHVzYWJsZSBpZiB0aGUgTVAzIGRlY29kZXIgd2FzCisuQiBleHBsaWNpdGx5CitkaXNhYmxlZCBpbiB0aGUgYnVpbGQgb2YgTEFNRS4KKy5UUAorLkJJIFwtdAorRGlzYWJsZSB3cml0aW5nIG9mIHRoZSBJTkZPIFRhZyBvbiBlbmNvZGluZy4KKy5icgorVGhpcyB0YWcgaW4gZW1iZWRkZWQgaW4gZnJhbWUgMCBvZiB0aGUgTVAzIGZpbGUuCitJdCBpbmNsdWRlcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmNvZGluZyBvcHRpb25zIG9mIHRoZSBmaWxlLAorYW5kIGluIFZCUiBpdCBsZXRzIFZCUiBhd2FyZSBwbGF5ZXJzIGNvcnJlY3RseSBzZWVrIGFuZCBjb21wdXRlCitwbGF5aW5nIHRpbWVzIG9mIFZCUiBmaWxlcy4KKworV2hlbgorLkIgXC1cLWRlY29kZQoraXMgc3BlY2lmaWVkIChkZWNvZGUgdG8gV0FWKSwKK3RoaXMgZmxhZyB3aWxsIGRpc2FibGUgd3JpdGluZyBvZiB0aGUgV0FWIGhlYWRlci4KK1RoZSBvdXRwdXQgd2lsbCBiZSByYXcgcGNtLAorbmF0aXZlIGVuZGlhbiBmb3JtYXQuCitVc2UKKy5CIFwteAordG8gc3dhcCBieXRlcy4KKy5UUAorLkJJIFwtXC1jb21wICIgYXJnIgorSW5zdGVhZCBvZiBjaG9vc2luZyBiaXRyYXRlLAordXNpbmcgdGhpcyBvcHRpb24sCit1c2VyIGNhbiBjaG9vc2UgY29tcHJlc3Npb24gcmF0aW8gdG8gYWNoaWV2ZS4KKy5UUAorLkJJIFwtXC1zY2FsZSAiIG4iCisuUEQgMAorLlRQCisuQkkgXC1cLXNjYWxlXC1sICIgbiIKKy5UUAorLkJJIFwtXC1zY2FsZVwtciAiIG4iCitTY2FsZXMgaW5wdXQgKGV2ZXJ5IGNoYW5uZWwsIG9ubHkgbGVmdCBjaGFubmVsIG9yIG9ubHkgcmlnaHQgY2hhbm5lbCkgYnkKKy5JIG4uCitUaGlzIGp1c3QgbXVsdGlwbGllcyB0aGUgUENNIGRhdGEgKGFmdGVyIGl0IGhhcyBiZWVuIGNvbnZlcnRlZCB0byBmbG9hdGluZworcG9pbnQpIGJ5CisuSSBuLiAKKworLkkgbgorPiAxOiBpbmNyZWFzZSB2b2x1bWUKKy5icgorLkkgbgorPSAxOiBubyBlZmZlY3QKKy5icgorLkkgbgorPCAxOiByZWR1Y2Ugdm9sdW1lCisKK1VzZSB3aXRoIGNhcmUsCitzaW5jZSBtb3N0IE1QMyBkZWNvZGVycyB3aWxsIHRydW5jYXRlIGRhdGEgd2hpY2ggZGVjb2RlcyB0byB2YWx1ZXMKK2dyZWF0ZXIgdGhhbiAzMjc2OC4KKy5QRAorLlRQCisuQiBcLVwtcmVwbGF5Z2FpblwtZmFzdAorQ29tcHV0ZSBSZXBsYXlHYWluIGZhc3QgYnV0IHNsaWdodGx5IGluYWNjdXJhdGVseS4KKworVGhpcyBjb21wdXRlcyAiUmFkaW8iIFJlcGxheUdhaW4gb24gdGhlIGlucHV0IGRhdGEgc3RyZWFtIGFmdGVyCit1c2VyXChoeXNwZWNpZmllZCB2b2x1bWVcKGh5c2NhbGluZyBhbmQvb3IgcmVzYW1wbGluZy4KKworVGhlIFJlcGxheUdhaW4gYW5hbHlzaXMgZG9lcworLkkgbm90CithZmZlY3QgdGhlIGNvbnRlbnQgb2YgYSBjb21wcmVzc2VkIGRhdGEgc3RyZWFtIGl0c2VsZiwKK2l0IGlzIGEgdmFsdWUgc3RvcmVkIGluIHRoZSBoZWFkZXIgb2YgYSBzb3VuZCBmaWxlLgorSW5mb3JtYXRpb24gb24gdGhlIHB1cnBvc2Ugb2YgUmVwbGF5R2FpbiBhbmQgdGhlIGFsZ29yaXRobXMgdXNlZCBpcworYXZhaWxhYmxlIGZyb20KKy5CIGh0dHA6Ly93d3cucmVwbGF5Z2Fpbi5vcmcvLgorCitPbmx5IHRoZSAiUmFkaW9HYWluIiBSZXBsYXlnYWluIHZhbHVlIGlzIGNvbXB1dGVkLAoraXQgaXMgc3RvcmVkIGluIHRoZSBMQU1FIHRhZy4KK1RoZSBhbmFseXNpcyBpcyBwZXJmb3JtZWQgd2l0aCB0aGUgcmVmZXJlbmNlCit2b2x1bWUgZXF1YWwgdG8gODlkQi4KK05vdGU6IHRoZSByZWZlcmVuY2Ugdm9sdW1lIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSA4M2RCIG9uIHRyYW5zaXRpb24gZnJvbQordmVyc2lvbiAzLjk1IHRvIDMuOTUuMS4KKworVGhpcyBzd2l0Y2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCitTZWUgYWxzbzoKKy5CIFwtXC1yZXBsYXlnYWluXC1hY2N1cmF0ZSwgXC1cLW5vcmVwbGF5Z2FpbgorLlRQCisuQiBcLVwtcmVwbGF5Z2FpblwtYWNjdXJhdGUKK0NvbXB1dGUgUmVwbGF5R2FpbiBtb3JlIGFjY3VyYXRlbHkgYW5kIGZpbmQgdGhlIHBlYWsgc2FtcGxlLgorCitUaGlzIGVuYWJsZXMgZGVjb2Rpbmcgb24gdGhlIGZseSwgY29tcHV0ZXMgIlJhZGlvIiBSZXBsYXlHYWluIG9uIHRoZQorZGVjb2RlZCBkYXRhIHN0cmVhbSwKK2ZpbmRzIHRoZSBwZWFrIHNhbXBsZSBvZiB0aGUgZGVjb2RlZCBkYXRhIHN0cmVhbSBhbmQgc3RvcmVzIGl0IGluIHRoZSBmaWxlLgorIAorVGhlIFJlcGxheUdhaW4gYW5hbHlzaXMgZG9lcworLkkgbm90CithZmZlY3QgdGhlIGNvbnRlbnQgb2YgYSBjb21wcmVzc2VkIGRhdGEgc3RyZWFtIGl0c2VsZiwKK2l0IGlzIGEgdmFsdWUgc3RvcmVkIGluIHRoZSBoZWFkZXIgb2YgYSBzb3VuZCBmaWxlLgorSW5mb3JtYXRpb24gb24gdGhlIHB1cnBvc2Ugb2YgUmVwbGF5R2FpbiBhbmQgdGhlIGFsZ29yaXRobXMgdXNlZCBpcworYXZhaWxhYmxlIGZyb20KKy5CIGh0dHA6Ly93d3cucmVwbGF5Z2Fpbi5vcmcvLgorCisgCitCeSBkZWZhdWx0LCBMQU1FIHBlcmZvcm1zIFJlcGxheUdhaW4gYW5hbHlzaXMgb24gdGhlIGlucHV0IGRhdGEKKyhhZnRlciB0aGUgdXNlclwoaHlzcGVjaWZpZWQgdm9sdW1lIHNjYWxpbmcpLgorVGhpcyBiZWhhdmlvciBtaWdodCBnaXZlIHNsaWdodGx5IGluYWNjdXJhdGUgcmVzdWx0cworYmVjYXVzZSB0aGUgZGF0YSBvbiB0aGUgb3V0cHV0IG9mIGEgbG9zc3kgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBzZXF1ZW5jZQorZGlmZmVycyBmcm9tIHRoZSBpbml0aWFsIGlucHV0IGRhdGEuCitXaGVuCisuQiBcLVwtcmVwbGF5Z2Fpbi1hY2N1cmF0ZQoraXMgc3BlY2lmaWVkIHRoZSBtcDMgc3RyZWFtIGdldHMgZGVjb2RlZCBvbiB0aGUgZmx5IGFuZCB0aGUgYW5hbHlzaXMgaXMKK3BlcmZvcm1lZCBvbiB0aGUgZGVjb2RlZCBkYXRhIHN0cmVhbS4KK0FsdGhvdWdoIHRoZW9yZXRpY2FsbHkgdGhpcyBtZXRob2QgZ2l2ZXMgbW9yZSBhY2N1cmF0ZSByZXN1bHRzLAoraXQgaGFzIHNldmVyYWwgZGlzYWR2YW50YWdlczoKKy5SUyA4CisuSVAgIioiIDQKK3Rlc3RzIGhhdmUgc2hvd24gdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBSZXBsYXlHYWluIHZhbHVlcyBjb21wdXRlZAorb24gdGhlIGlucHV0IGRhdGEgYW5kIGRlY29kZWQgZGF0YSBpcyB1c3VhbGx5IG5vdCBncmVhdGVyIHRoYW4gMC41ZEIsCithbHRob3VnaCB0aGUgbWluaW11bSB2b2x1bWUgZGlmZmVyZW5jZSB0aGUgaHVtYW4gZWFyIGNhbiBwZXJjZWl2ZSBpcworYWJvdXQgMS4wZEIKKy5JUCAiKiIgNAorZGVjb2Rpbmcgb24gdGhlIGZseSBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIGVuY29kaW5nIHByb2Nlc3MKKy5SRQorLlJTIDcKKworVGhlIGFwcGFyZW50IGFkdmFudGFnZSBpcyB0aGF0OgorLlJFCisuUlMgOAorLklQICIqIiA0Cit3aXRoCisuQiBcLVwtcmVwbGF5Z2Fpbi1hY2N1cmF0ZQordGhlIHJlYWwgcGVhayBzYW1wbGUgaXMgZGV0ZXJtaW5lZCBhbmQgc3RvcmVkIGluIHRoZSBmaWxlLgorVGhlIGtub3dsZWRnZSBvZiB0aGUgcGVhayBzYW1wbGUgY2FuIGJlIHVzZWZ1bCB0byBkZWNvZGVycyAocGxheWVycykKK3RvIHByZXZlbnQgYSBuZWdhdGl2ZSBlZmZlY3QgY2FsbGVkICdjbGlwcGluZycgdGhhdCBpbnRyb2R1Y2VzIGRpc3RvcnRpb24KK2ludG8gdGhlIHNvdW5kLgorLlJFCisuUlMgNworIAorT25seSB0aGUgIlJhZGlvR2FpbiIgUmVwbGF5R2FpbiB2YWx1ZSBpcyBjb21wdXRlZCwKK2l0IGlzIHN0b3JlZCBpbiB0aGUgTEFNRSB0YWcuCitUaGUgYW5hbHlzaXMgaXMgcGVyZm9ybWVkIHdpdGggdGhlIHJlZmVyZW5jZQordm9sdW1lIGVxdWFsIHRvIDg5ZEIuCitOb3RlOiB0aGUgcmVmZXJlbmNlIHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gODNkQiBvbiB0cmFuc2l0aW9uIGZyb20KK3ZlcnNpb24gMy45NSB0byAzLjk1LjEuCisgCitUaGlzIG9wdGlvbiBpcyBub3QgdXNhYmxlIGlmIHRoZSBNUDMgZGVjb2RlciB3YXMKKy5CIGV4cGxpY2l0bHkKK2Rpc2FibGVkIGluIHRoZSBidWlsZCBvZiBMQU1FLgorKE5vdGU6IGlmIExBTUUgaXMgY29tcGlsZWQgd2l0aG91dCB0aGUgTVAzIGRlY29kZXIsCitSZXBsYXlHYWluIGFuYWx5c2lzIGlzIHBlcmZvcm1lZCBvbiB0aGUgaW5wdXQgZGF0YSBhZnRlciB1c2VyLXNwZWNpZmllZAordm9sdW1lIHNjYWxpbmcpLgorIAorU2VlIGFsc286CisuQiBcLVwtcmVwbGF5Z2Fpbi1mYXN0LCBcLVwtbm9yZXBsYXlnYWluIFwtXC1jbGlwZGV0ZWN0CisuUkUKKy5UUAorLkIgXC1cLW5vcmVwbGF5Z2FpbgorRGlzYWJsZSBSZXBsYXlHYWluIGFuYWx5c2lzLgorCitCeSBkZWZhdWx0IFJlcGxheUdhaW4gYW5hbHlzaXMgaXMgZW5hYmxlZC4gVGhpcyBzd2l0Y2ggZGlzYWJsZXMgaXQuCisKK1NlZSBhbHNvOgorLkIgXC1cLXJlcGxheWdhaW4tZmFzdCwgXC1cLXJlcGxheWdhaW4tYWNjdXJhdGUKKy5UUAorLkIgXC1cLWNsaXBkZXRlY3QKK0NsaXBwaW5nIGRldGVjdGlvbi4KKworRW5hYmxlCisuQiBcLVwtcmVwbGF5Z2Fpbi1hY2N1cmF0ZQorYW5kIHByaW50IGEgbWVzc2FnZSB3aGV0aGVyIGNsaXBwaW5nIG9jY3VycyBhbmQgaG93IGZhciBpbiBkQiB0aGUgd2F2ZWZvcm0KK2lzIGZyb20gZnVsbCBzY2FsZS4KKyAgCitUaGlzIG9wdGlvbiBpcyBub3QgdXNhYmxlIGlmIHRoZSBNUDMgZGVjb2RlciB3YXMKKy5CIGV4cGxpY2l0bHkKK2Rpc2FibGVkIGluIHRoZSBidWlsZCBvZiBMQU1FLgorCitTZWUgYWxzbzoKKy5CIFwtXC1yZXBsYXlnYWluLWFjY3VyYXRlCisuVFAKKy5CIFwtXC1wcmVzZXQgIiBbZmFzdF0gdHlwZSB8IFtjYnJdIGticHMiCitVc2Ugb25lIG9mIHRoZSBidWlsdC1pbiBwcmVzZXRzLgorCitIYXZlIGEgbG9vayBhdCB0aGUgUFJFU0VUUyBzZWN0aW9uIGJlbG93LgorCisuQiBcLVwtcHJlc2V0IGhlbHAKK2dpdmVzIG1vcmUgaW5mb3MgYWJvdXQgdGhlIHRoZSB1c2VkIG9wdGlvbnMgaW4gdGhlc2UgcHJlc2V0cy4KKy5UUAorLkIgXC1cLXByZXNldCAiIFtmYXN0XSB0eXBlIHwgW2Nicl0ga2JwcyIKK1VzZSBvbmUgb2YgdGhlIGJ1aWx0LWluICBwcmVzZXRzLgorLlRQCisuQiBcLVwtbm9hc20gIiB0eXBlIgorRGlzYWJsZSBzcGVjaWZpYyBhc3NlbWJseSBvcHRpbWl6YXRpb25zICgKKy5CIG1teAorLworLkIgM2Rub3cKKy8KKy5CIHNzZQorKS4KK1F1YWxpdHkgd2lsbCBub3QgaW5jcmVhc2UsIG9ubHkgc3BlZWQgd2lsbCBiZSByZWR1Y2VkLgorSWYgeW91IGhhdmUgcHJvYmxlbXMgcnVubmluZyBMYW1lIG9uIGEgQ3lyaXgvVmlhIHByb2Nlc3NvciwKK2Rpc2FibGluZyBtbXggb3B0aW1pemF0aW9ucyBtaWdodCBzb2x2ZSB5b3VyIHByb2JsZW0uCisKKy5QUAorVmVyYm9zaXR5OgorLlRQCisuQkkgXC1cLWRpc3B0aW1lICIgbiIKK1NldCB0aGUgZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHR3byBkaXNwbGF5IHVwZGF0ZXMuIAorLlRQCisuQiBcLVwtbm9oaXN0CitCeSBkZWZhdWx0LAorTEFNRSB3aWxsIGRpc3BsYXkgYSBiaXRyYXRlIGhpc3RvZ3JhbSB3aGlsZSBwcm9kdWNpbmcgVkJSIG1wMyBmaWxlcy4KK1RoaXMgd2lsbCBkaXNhYmxlIHRoYXQgZmVhdHVyZS4KKy5icgorSGlzdG9ncmFtIGRpc3BsYXkgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBvbiB5b3VyIHJlbGVhc2UuIAorLlRQCisuQiAtUworLlBEIDAKKy5UUAorLkIgXC1cLXNpbGVudAorLlRQCisuQiBcLVwtcXVpZXQKK0RvIG5vdCBwcmludCBhbnl0aGluZyBvbiB0aGUgc2NyZWVuLgorLlBECisuVFAKKy5CIFwtXC12ZXJib3NlCitQcmludCBhIGxvdCBvZiBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyZWVuLgorLlRQCisuQiBcLVwtaGVscAorRGlzcGxheSBhIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMuCisKKy5QUAorTm9pc2Ugc2hhcGluZyAmIHBzeWNobyBhY291c3RpYyBhbGdvcml0aG1zOgorLlRQCisuQkkgLXEgIiBxdWFsIgorMCA8PQorLkkgcXVhbAorPD0gOQorCitCaXRyYXRlIGlzIG9mIGNvdXJzZSB0aGUgbWFpbiBpbmZsdWVuY2Ugb24gcXVhbGl0eS4KK1RoZSBoaWdoZXIgdGhlIGJpdHJhdGUsCit0aGUgaGlnaGVyIHRoZSBxdWFsaXR5LgorQnV0IGZvciBhIGdpdmVuIGJpdHJhdGUsCit3ZSBoYXZlIGEgY2hvaWNlIG9mIGFsZ29yaXRobXMgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IHNjYWxlZmFjdG9ycworYW5kIEh1ZmZtYW4gZW5jb2RpbmcgKG5vaXNlIHNoYXBpbmcpLgorCisuQiAtcSAwOgorLmJyCit1c2Ugc2xvd2VzdCAmIGJlc3QgcG9zc2libGUgdmVyc2lvbiBvZiBhbGwgYWxnb3JpdGhtcy4KKy5CIC1xIDAKK2FuZAorLkIgLXEgMQorYXJlIHNsb3cgYW5kIG1heSBub3QgcHJvZHVjZSBzaWduaWZpY2FudGx5IGhpZ2hlciBxdWFsaXR5LgorCisuQiAtcSAyOgorLmJyCityZWNvbW1lbmRlZC4KK1NhbWUgYXMKKy5CIC1oLgorCisuQiAtcSA1OgorLmJyCitkZWZhdWx0IHZhbHVlLgorR29vZCBzcGVlZCwKK3JlYXNvbmFibGUgcXVhbGl0eS4KKworLkIgLXEgNzoKKy5icgorc2FtZSBhcworLkIgLWYuCitWZXJ5IGZhc3QsCitvayBxdWFsaXR5LgorUHN5Y2hvIGFjb3VzdGljcyBhcmUgdXNlZCBmb3IgcHJlLWVjaG8gJiBNL1MsCitidXQgbm8gbm9pc2Ugc2hhcGluZyBpcyBkb25lLgorCisuQiAtcSA5OgorLmJyCitkaXNhYmxlcyBhbG1vc3QgYWxsIGFsZ29yaXRobXMgaW5jbHVkaW5nIHBzeS1tb2RlbC4KK1Bvb3IgcXVhbGl0eS4KKy5UUAorLkIgLWgKK1VzZSBzb21lIHF1YWxpdHkgaW1wcm92ZW1lbnRzLgorRW5jb2Rpbmcgd2lsbCBiZSBzbG93ZXIsCitidXQgdGhlIHJlc3VsdCB3aWxsIGJlIG9mIGhpZ2hlciBxdWFsaXR5LgorVGhlIGJlaGF2aW9yIGlzIHRoZSBzYW1lIGFzIHRoZQorLkIgLXEgMgorc3dpdGNoLgorLmJyCitUaGlzIHN3aXRjaCBpcyBhbHdheXMgZW5hYmxlZCB3aGVuIHVzaW5nIFZCUi4gCisuVFAKKy5CIC1mCitUaGlzIHN3aXRjaCBmb3JjZXMgdGhlIGVuY29kZXIgdG8gdXNlIGEgZmFzdGVyIGVuY29kaW5nIG1vZGUsCitidXQgd2l0aCBhIGxvd2VyIHF1YWxpdHkuCitUaGUgYmVoYXZpb3IgaXMgdGhlIHNhbWUgYXMgdGhlCisuQiAtcSA3Citzd2l0Y2guCisKK05vaXNlIHNoYXBpbmcgd2lsbCBiZSBkaXNhYmxlZCwKK2J1dCBwc3ljaG8gYWNvdXN0aWNzIHdpbGwgc3RpbGwgYmUgY29tcHV0ZWQgZm9yIGJpdCBhbGxvY2F0aW9uCithbmQgcHJlLWVjaG8gZGV0ZWN0aW9uLiAKKworLlBQCitDQlIgKGNvbnN0YW50IGJpdHJhdGUsIHRoZSBkZWZhdWx0KSBvcHRpb25zOgorLlRQCisuQkkgLWIgICIgbiIKK0ZvciBNUEVHLTEgKHNhbXBsaW5nIGZyZXF1ZW5jaWVzIG9mIDMyLCA0NC4xIGFuZCA0OCBrSHopCisuYnIKKy5JIG4KKz0gMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAorCitGb3IgTVBFRy0yIChzYW1wbGluZyBmcmVxdWVuY2llcyBvZiAxNiwgMjIuMDUgYW5kIDI0IGtIeikKKy5icgorLkkgbgorPSA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAKKworRm9yIE1QRUctMi41IChzYW1wbGluZyBmcmVxdWVuY2llcyBvZiA4LCAxMS4wMjUgYW5kIDEyIGtIeikKKy5icgorLkkgbgorPSA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NAorCitEZWZhdWx0IGlzIDEyOCBmb3IgTVBFRzEgYW5kIDY0IGZvciBNUEVHMi4gCisuVFAKKy5CSSBcLVwtY2JyCitlbmZvcmNlIHVzZSBvZiBjb25zdGFudCBiaXRyYXRlCisKKy5QUAorQUJSIChhdmVyYWdlIGJpdHJhdGUpIG9wdGlvbnM6CisuVFAKKy5CSSBcLVwtYWJyICIgbiIKK1R1cm5zIG9uIGVuY29kaW5nIHdpdGggYSB0YXJnZXRlZCBhdmVyYWdlIGJpdHJhdGUgb2YgbiBrYml0cywKK2FsbG93aW5nIHRvIHVzZSBmcmFtZXMgb2YgZGlmZmVyZW50IHNpemVzLgorVGhlIGFsbG93ZWQgcmFuZ2Ugb2YKKy5JIG4KK2lzIDggLSAzMTAsCit5b3UgY2FuIHVzZSBhbnkgaW50ZWdlciB2YWx1ZSB3aXRoaW4gdGhhdCByYW5nZS4KKworSXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlCisuQiAtYgorYW5kCisuQiAtQgorc3dpdGNoZXMgbGlrZToKKy5CIGxhbWUgXC1cLWFicgorLkkgMTIzCisuQiAtYgorLkkgNjQKKy5CIC1CCisuSSAxOTIgYS53YXYgYS5tcDMKK3doaWNoIHdvdWxkIGxpbWl0IHRoZSBhbGxvd2VkIGZyYW1lIHNpemVzIGJldHdlZW4gNjQgYW5kIDE5MiBrYml0cy4KKworVGhlIHVzZSBvZgorLkIgLUIKK2lzIE5PVCBSRUNPTU1FTkRFRC4KK0EgMTI4IGticHMgQ0JSIGJpdHN0cmVhbSwKK2JlY2F1c2Ugb2YgdGhlIGJpdCByZXNlcnZvaXIsCitjYW4gYWN0dWFsbHkgaGF2ZSBmcmFtZXMgd2hpY2ggdXNlIGFzIG1hbnkgYml0cyBhcyBhIDMyMCBrYnBzIGZyYW1lLgorVkJSIG1vZGVzIG1pbmltaXplIHRoZSB1c2Ugb2YgdGhlIGJpdCByZXNlcnZvaXIsCithbmQgdGh1cyBuZWVkIHRvIGFsbG93IDMyMCBrYnBzIGZyYW1lcyB0byBnZXQgdGhlIHNhbWUgZmxleGliaWxpdHkKK2FzIENCUiBzdHJlYW1zLiAKKworLlBQCitWQlIgKHZhcmlhYmxlIGJpdHJhdGUpIG9wdGlvbnM6CisuVFAKKy5CIC12Cit1c2UgdmFyaWFibGUgYml0cmF0ZQorLkIgKFwtXC12YnItbmV3KQorLlRQCisuQiBcLVwtdmJyLW9sZAorSW52b2tlcyB0aGUgb2xkZXN0LAorbW9zdCB0ZXN0ZWQgVkJSIGFsZ29yaXRobS4KK0l0IHByb2R1Y2VzIHZlcnkgZ29vZCBxdWFsaXR5IGZpbGVzLAordGhvdWdoIGlzIG5vdCB2ZXJ5IGZhc3QuCitUaGlzIGhhcywKK3VwIHRocm91Z2ggdjMuODksCitiZWVuIGNvbnNpZGVyZWQgdGhlICJ3b3JraG9yc2UiIFZCUiBhbGdvcml0aG0uCisuVFAKKy5CIFwtXC12YnItbmV3CitJbnZva2VzIHRoZSBuZXdlc3QgVkJSIGFsZ29yaXRobS4KK0R1cmluZyB0aGUgZGV2ZWxvcG1lbnQgb2YgdmVyc2lvbiAzLjkwLAorY29uc2lkZXJhYmxlIHR1bmluZyB3YXMgZG9uZSBvbiB0aGlzIGFsZ29yaXRobSwKK2FuZCBpdCBpcyBub3cgY29uc2lkZXJlZCB0byBiZSBvbiBwYXIgd2l0aCB0aGUgb3JpZ2luYWwKKy5CIFwtXC12YnItb2xkLiAKK0l0IGhhcyB0aGUgYWRkZWQgYWR2YW50YWdlIG9mIGJlaW5nIHZlcnkgZmFzdCAob3ZlciB0d2ljZSBhcyBmYXN0IGFzCisuQiBcLVwtdmJyLW9sZCkuCisuVFAKKy5CSSAtViAiIG4iCiswIDw9CisuSSBuCis8PSA5CisuYnIKK0VuYWJsZSBWQlIgKFZhcmlhYmxlIEJpdFJhdGUpIGFuZCBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIFZCUiBxdWFsaXR5CisoZGVmYXVsdCA9IDQpLgorMCA9IGhpZ2hlc3QgcXVhbGl0eS4KKworLlBQCitBQlIgYW5kIFZCUiBvcHRpb25zOgorLlRQCisuQkkgLWIgIiBiaXRyYXRlIgorRm9yIE1QRUctMSAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgMzIsIDQ0LjEgYW5kIDQ4IGtIeikKKy5icgorLkkgbgorPSAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwCisKK0ZvciBNUEVHLTIgKHNhbXBsaW5nIGZyZXF1ZW5jaWVzIG9mIDE2LCAyMi4wNSBhbmQgMjQga0h6KQorLmJyCisuSSBuCis9IDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MAorCitGb3IgTVBFRy0yLjUgKHNhbXBsaW5nIGZyZXF1ZW5jaWVzIG9mIDgsIDExLjAyNSBhbmQgMTIga0h6KQorLmJyCisuSSBuCis9IDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0CisKK1NwZWNpZmllcyB0aGUgbWluaW11bSBiaXRyYXRlIHRvIGJlIHVzZWQuCitIb3dldmVyLAoraW4gb3JkZXIgdG8gYXZvaWQgd2FzdGVkIHNwYWNlLAordGhlIHNtYWxsZXN0IGZyYW1lIHNpemUgYXZhaWxhYmxlIHdpbGwgYmUgdXNlZCBkdXJpbmcgc2lsZW5jZXMuIAorLlRQCisuQkkgLUIgIiBiaXRyYXRlIgorRm9yIE1QRUctMSAoc2FtcGxpbmcgZnJlcXVlbmNpZXMgb2YgMzIsIDQ0LjEgYW5kIDQ4IGtIeikKKy5icgorLkkgbgorPSAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwCisKK0ZvciBNUEVHLTIgKHNhbXBsaW5nIGZyZXF1ZW5jaWVzIG9mIDE2LCAyMi4wNSBhbmQgMjQga0h6KQorLmJyCisuSSBuCis9IDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MAorCitGb3IgTVBFRy0yLjUgKHNhbXBsaW5nIGZyZXF1ZW5jaWVzIG9mIDgsIDExLjAyNSBhbmQgMTIga0h6KQorLmJyCisuSSBuCis9IDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0CisKK1NwZWNpZmllcyB0aGUgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUuCisKK05vdGU6IElmIHlvdSBvd24gYW4gbXAzIGhhcmR3YXJlIHBsYXllciBidWlsZCB1cG9uIGEgTUFTIDM1MDMgY2hpcCwKK3lvdSBtdXN0IHNldCBtYXhpbXVtIGJpdHJhdGUgdG8gbm8gbW9yZSB0aGFuIDIyNCBrcGJzLiAKKy5UUAorLkIgLUYKK1N0cmljdGx5IGVuZm9yY2UgdGhlCisuQiAtYgorb3B0aW9uLgorLmJyCitUaGlzIGlzIG1haW5seSBmb3IgdXNlIHdpdGggaGFyZHdhcmUgcGxheWVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGxvdworYml0cmF0ZSBtcDMuCisKK1dpdGhvdXQgdGhpcyBvcHRpb24sCit0aGUgbWluaW11bSBiaXRyYXRlIHdpbGwgYmUgaWdub3JlZCBmb3IgcGFzc2FnZXMgb2YgYW5hbG9nIHNpbGVuY2UsCitpLmUuIHdoZW4gdGhlIG11c2ljIGxldmVsIGlzIGJlbG93IHRoZSBhYnNvbHV0ZSB0aHJlc2hvbGQgb2YKK2h1bWFuIGhlYXJpbmcgKEFUSCkuIAorCisuUFAKK1BTWSByZWxhdGVkOgorLlRQCisuQiBcLVwtbnNzYWZlam9pbnQKK00vUyBzd2l0Y2hpbmcgY3JpdGVyaW9uCisuVFAKKy5CSSBcLVwtbnNtc2ZpeCAiIGFyZyIKK00vUyBzd2l0Y2hpbmcgdHVuaW5nIFtlZmZlY3RpdmUgMC0zLjVdCisuVFAKKy5CSSBcLVwtbnMtYmFzcyAiIHgiCitBZGp1c3QgbWFza2luZyBmb3Igc2ZicyAgMCAtICA2IChsb25nKSAgMCAtICA1IChzaG9ydCkKKy5UUAorLkJJIFwtXC1ucy1hbHRvICIgeCIKK0FkanVzdCBtYXNraW5nIGZvciBzZmJzICA3IC0gMTMgKGxvbmcpICA2IC0gMTAgKHNob3J0KQorLlRQCisuQkkgXC1cLW5zLXRyZWJsZSAiIHgiCitBZGp1c3QgbWFza2luZyBmb3Igc2ZicyAxNCAtIDIxIChsb25nKSAxMSAtIDEyIChzaG9ydCkKKy5UUAorLkJJIFwtXC1ucy1zZmIyMSAiIHgiCitDaGFuZ2UgbnMtdHJlYmxlIGJ5IHggZEIgZm9yIHNmYjIxCisKKy5QUAorRXhwZXJpbWVudGFsIG9wdGlvbnM6CisuVFAKKy5CSSAtWCAiIG4iCiswIDw9CisuSSBuCis8PSA3CisKK1doZW4gTEFNRSBzZWFyY2hlcyBmb3IgYSAiZ29vZCIgcXVhbnRpemF0aW9uLAoraXQgaGFzIHRvIGNvbXBhcmUgdGhlIGFjdHVhbCBvbmUgd2l0aCB0aGUgYmVzdCBvbmUgZm91bmQgc28gZmFyLiAKK1RoZSBjb21wYXJpc29uIHNheXMgd2hpY2ggb25lIGlzIGJldHRlciwKK3RoZSBiZXN0IHNvIGZhciBvciB0aGUgYWN0dWFsLgorVGhlCisuQiAtWAorcGFyYW1ldGVyIHNlbGVjdHMgYmV0d2VlbiBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBtYWtlIHRoaXMgZGVjaXNpb24sCisuQiAtWDAKK2JlaW5nIHRoZSBkZWZhdWx0IG1vZGU6CisKKy5CIC1YMCAKKy5icgorVGhlIGNyaXRlcmlvbnMgYXJlIChpbiBvcmRlciBvZiBpbXBvcnRhbmNlKToKKy5icgorKiBsZXNzIGRpc3RvcnRlZCBzY2FsZWZhY3RvciBiYW5kcworLmJyCisqIHRoZSBzdW0gb2Ygbm9pc2Ugb3ZlciB0aGUgdGhyZXNob2xkcyBpcyBsb3dlcgorLmJyCisqIHRoZSB0b3RhbCBub2lzZSBpcyBsb3dlcgorCisuQiAtWDEKKy5icgorVGhlIGFjdHVhbCBpcyBiZXR0ZXIgaWYgdGhlIG1heGltdW0gbm9pc2Ugb3ZlciBhbGwgc2NhbGVmYWN0b3IgYmFuZHMgaXMKK2xlc3MgdGhhbiB0aGUgYmVzdCBzbyBmYXIuCisKKy5CIC1YMgorLmJyCitUaGUgYWN0dWFsIGlzIGJldHRlciBpZiB0aGUgdG90YWwgc3VtIG9mIG5vaXNlIGlzIGxvd2VyIHRoYW4gdGhlIGJlc3Qgc28KK2Zhci4KKworLkIgLVgzCisuYnIKK1RoZSBhY3R1YWwgaXMgYmV0dGVyIGlmIHRoZSB0b3RhbCBzdW0gb2Ygbm9pc2UgaXMgbG93ZXIgdGhhbiB0aGUgYmVzdCBzbworZmFyIGFuZCB0aGUgbWF4aW11bSBub2lzZSBvdmVyIGFsbCBzY2FsZWZhY3RvciBiYW5kcyBpcyBsZXNzIHRoYW4gdGhlCitiZXN0IHNvIGZhciBwbHVzIDJkQi4KKworLkIgLVg0CisuYnIKK05vdCB5ZXQgZG9jdW1lbnRlZC4KKworLkIgLVg1CisuYnIKK1RoZSBjcml0ZXJpb25zIGFyZSAoaW4gb3JkZXIgb2YgaW1wb3J0YW5jZSk6CisuYnIKKyogdGhlIHN1bSBvZiBub2lzZSBvdmVyIHRoZSB0aHJlc2hvbGRzIGlzIGxvd2VyIAorLmJyCisqIHRoZSB0b3RhbCBzdW0gb2Ygbm9pc2UgaXMgbG93ZXIKKworLkIgLVg2IAorLmJyCitUaGUgY3JpdGVyaW9ucyBhcmUgKGluIG9yZGVyIG9mIGltcG9ydGFuY2UpOgorLmJyCisqIHRoZSBzdW0gb2Ygbm9pc2Ugb3ZlciB0aGUgdGhyZXNob2xkcyBpcyBsb3dlcgorLmJyCisqIHRoZSBtYXhpbXVtIG5vaXNlIG92ZXIgYWxsIHNjYWxlZmFjdG9yIGJhbmRzIGlzIGxvd2VyCisuYnIKKyogdGhlIHRvdGFsIHN1bSBvZiBub2lzZSBpcyBsb3dlcgorCisuQiAtWDcgCisuYnIKK1RoZSBjcml0ZXJpb25zIGFyZToKKy5icgorKiBsZXNzIGRpc3RvcnRlZCBzY2FsZWZhY3RvciBiYW5kcworLmJyCitvcgorLmJyCisqIHRoZSBzdW0gb2Ygbm9pc2Ugb3ZlciB0aGUgdGhyZXNob2xkcyBpcyBsb3dlciAKKy5UUAorLkIgLVkKK2xldHMgTEFNRSBpZ25vcmUgbm9pc2UgaW4gc2ZiMjEsIGxpa2UgaW4gQ0JSCisKKy5QUAorTVAzIGhlYWRlci9zdHJlYW0gb3B0aW9uczoKKy5UUAorLkJJIC1lICIgZW1wIgorLkkgZW1wCis9IG4sIDUsIGMKKworbiA9IChub25lLCBkZWZhdWx0KQorLmJyCis1ID0gMC8xNSBtaWNyb3NlY29uZHMKKy5icgorYyA9IGNpdHQgai4xNworCitBbGwgdGhpcyBkb2VzIGlzIHNldCBhIGZsYWcgaW4gdGhlIGJpdHN0cmVhbS4KK0lmIHlvdSBoYXZlIGEgUENNIGlucHV0IGZpbGUgd2hlcmUgb25lIG9mIHRoZSBhYm92ZSB0eXBlcyBvZgorKG9ic29sZXRlKSBlbXBoYXNpcyBoYXMgYmVlbiBhcHBsaWVkLAoreW91IGNhbiBzZXQgdGhpcyBmbGFnIGluIExBTUUuCitUaGVuIHRoZSBtcDMgZGVjb2RlciBzaG91bGQgZGUtZW1waGFzaXplIHRoZSBvdXRwdXQgZHVyaW5nIHBsYXliYWNrLAorYWx0aG91Z2ggbW9zdCBkZWNvZGVycyBpZ25vcmUgdGhpcyBmbGFnLgorCitBIGJldHRlciBzb2x1dGlvbiB3b3VsZCBiZSB0byBhcHBseSB0aGUgZGUtZW1waGFzaXMgd2l0aCBhIHN0YW5kYWxvbmUKK3V0aWxpdHkgYmVmb3JlIGVuY29kaW5nLAorYW5kIHRoZW4gZW5jb2RlIHdpdGhvdXQKKy5CIC1lLiAKKy5UUAorLkIgLWMKK01hcmsgdGhlIGVuY29kZWQgZmlsZSBhcyBiZWluZyBjb3B5cmlnaHRlZC4KKy5UUAorLkIgLW8KK01hcmsgdGhlIGVuY29kZWQgZmlsZSBhcyBiZWluZyBhIGNvcHkuIAorLlRQCisuQiAtcAorVHVybiBvbiBDUkMgZXJyb3IgcHJvdGVjdGlvbi4KKy5icgorSXQgd2lsbCBhZGQgYSBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjayAoQ1JDKSBjb2RlIGluIGVhY2ggZnJhbWUsCithbGxvd2luZyB0byBkZXRlY3QgdHJhbnNtaXNzaW9uIGVycm9ycyB0aGF0IGNvdWxkIG9jY3VyIG9uIHRoZQorTVAzIHN0cmVhbS4KK0hvd2V2ZXIsCitpdCB0YWtlcyAxNiBiaXRzIHBlciBmcmFtZSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1c2VkIGZvciBlbmNvZGluZywKK2FuZCB0aGVuIHdpbGwgc2xpZ2h0bHkgcmVkdWNlIHRoZSBzb3VuZCBxdWFsaXR5LiAKKy5UUAorLkIgXC1cLW5vcmVzCitEaXNhYmxlIHRoZSBiaXQgcmVzZXJ2b2lyLgorRWFjaCBmcmFtZSB3aWxsIHRoZW4gYmVjb21lIGluZGVwZW5kZW50IGZyb20gcHJldmlvdXMgb25lcywKK2J1dCB0aGUgcXVhbGl0eSB3aWxsIGJlIGxvd2VyLiAKKy5UUAorLkIgXC1cLXN0cmljdGx5LWVuZm9yY2UtSVNPCitXaXRoIHRoaXMgb3B0aW9uLAorTEFNRSB3aWxsIGVuZm9yY2UgdGhlIDc2ODAgYml0IGxpbWl0YXRpb24gb24gdG90YWwgZnJhbWUgc2l6ZS4KKy5icgorVGhpcyByZXN1bHRzIGluIG1hbnkgd2FzdGVkIGJpdHMgZm9yIGhpZ2ggYml0cmF0ZSBlbmNvZGluZ3MgYnV0IHdpbGwKK2Vuc3VyZSBzdHJpY3QgSVNPIGNvbXBhdGliaWxpdHkuCitUaGlzIGNvbXBhdGliaWxpdHkgbWlnaHQgYmUgaW1wb3J0YW50IGZvciBoYXJkd2FyZSBwbGF5ZXJzLgorCisuUFAKK0ZpbHRlciBvcHRpb25zOgorLlRQCisuQkkgXC1cLWxvd3Bhc3MgIiBmcmVxIgorU2V0IGEgbG93cGFzcyBmaWx0ZXJpbmcgZnJlcXVlbmN5IGluIGtIei4KK0ZyZXF1ZW5jaWVzIGFib3ZlIHRoZSBzcGVjaWZpZWQgb25lIHdpbGwgYmUgY3V0b2ZmLiAKKy5UUAorLkJJIFwtXC1sb3dwYXNzLXdpZHRoICIgZnJlcSIKK1NldCB0aGUgd2lkdGggb2YgdGhlIGxvd3Bhc3MgZmlsdGVyLgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUlIG9mIHRoZSBsb3dwYXNzIGZyZXF1ZW5jeS4gCisuVFAKKy5CSSBcLVwtaGlnaHBhc3MgIiBmcmVxIgorU2V0IGFuIGhpZ2hwYXNzIGZpbHRlcmluZyBmcmVxdWVuY3kgaW4ga0h6LgorRnJlcXVlbmNpZXMgYmVsb3cgdGhlIHNwZWNpZmllZCBvbmUgd2lsbCBiZSBjdXRvZmYuIAorLlRQCisuQkkgXC1cLWhpZ2hwYXNzLXdpZHRoICIgZnJlcSIKK1NldCB0aGUgd2lkdGggb2YgdGhlIGhpZ2hwYXNzIGZpbHRlciBpbiBrSHouCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSUgb2YgdGhlIGhpZ2hwYXNzIGZyZXF1ZW5jeS4KKy5UUAorLkJJIFwtXC1yZXNhbXBsZSAiIHNmcmVxIgorLkkgc2ZyZXEKKz0gOCwgMTEuMDI1LCAxMiwgMTYsIDIyLjA1LCAyNCwgMzIsIDQ0LjEsIDQ4CisuYnIKK1NlbGVjdCBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5IChvbmx5IHN1cHBvcnRlZCBmb3IgZW5jb2RpbmcpLgorLmJyCitJZiBub3Qgc3BlY2lmaWVkLAorTEFNRSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzYW1wbGUgdGhlIGlucHV0IHdoZW4gdXNpbmcgaGlnaCBjb21wcmVzc2lvbiByYXRpb3MuCisKKy5QUAorSUQzIHRhZyBvcHRpb25zOgorLlRQCisuQkkgXC1cLXR0ICIgdGl0bGUiCithdWRpby9zb25nIHRpdGxlIChtYXggMzAgY2hhcnMgZm9yIHZlcnNpb24gMSB0YWcpCisuVFAKKy5CSSBcLVwtdGEgIiBhcnRpc3QiCithdWRpby9zb25nIGFydGlzdCAobWF4IDMwIGNoYXJzIGZvciB2ZXJzaW9uIDEgdGFnKQorLlRQCisuQkkgXC1cLXRsICIgYWxidW0iCithdWRpby9zb25nIGFsYnVtIChtYXggMzAgY2hhcnMgZm9yIHZlcnNpb24gMSB0YWcpCisuVFAKKy5CSSBcLVwtdHkgIiB5ZWFyIgorYXVkaW8vc29uZyB5ZWFyIG9mIGlzc3VlICgxIHRvIDk5OTkpCisuVFAKKy5CSSBcLVwtdGMgIiBjb21tZW50IgordXNlci1kZWZpbmVkIHRleHQgKG1heCAzMCBjaGFycyBmb3IgdjEgdGFnLCAyOCBmb3IgdjEuMSkKKy5UUAorLkJJIFwtXC10biAiIHRyYWNrWy90b3RhbF0iCithdWRpby9zb25nIHRyYWNrIG51bWJlciBhbmQgKG9wdGlvbmFsbHkpIHRoZSB0b3RhbCBudW1iZXIgb2YgdHJhY2tzIG9uCit0aGUgb3JpZ2luYWwgcmVjb3JkaW5nLiAodHJhY2sgYW5kIHRvdGFsIGVhY2ggMSB0byAyNTUuIFByb3ZpZGluZworanVzdCB0aGUgdHJhY2sgbnVtYmVyIGNyZWF0ZXMgdjEuMSB0YWcsIHByb3ZpZGluZyBhIHRvdGFsIGZvcmNlcyB2Mi4wKS4KKy5UUAorLkJJIFwtXC10ZyAiIGdlbnJlIgorYXVkaW8vc29uZyBnZW5yZSAobmFtZSBvciBudW1iZXIgaW4gbGlzdCkKKy5UUAorLkIgXC1cLWFkZC1pZDN2MgorZm9yY2UgYWRkaXRpb24gb2YgdmVyc2lvbiAyIHRhZworLlRQCisuQiBcLVwtaWQzdjEtb25seQorYWRkIG9ubHkgYSB2ZXJzaW9uIDEgdGFnCisuVFAKKy5CIFwtXC1pZDN2Mi1vbmx5CithZGQgb25seSBhIHZlcnNpb24gMiB0YWcKKy5UUAorLkIgXC1cLXNwYWNlLWlkM3YxCitwYWQgdmVyc2lvbiAxIHRhZyB3aXRoIHNwYWNlcyBpbnN0ZWFkIG9mIG51bGxzCisuVFAKKy5CIFwtXC1wYWQtaWQzdjIKK3NhbWUgYXMgXC1cLXBhZC1pZDN2Mi1zaXplIDEyOAorLlRQCisuQiBcLVwtcGFkLWlkM3YyLXNpemUgIm51bSIKK2FkZHMgdmVyc2lvbiAyIHRhZywgcGFkIHdpdGggZXh0cmEgIm51bSIgYnl0ZXMKKy5UUAorLkIgXC1cLWdlbnJlLWxpc3QKK3ByaW50IGFscGhhYmV0aWNhbGx5IHNvcnRlZCBJRDMgZ2VucmUgbGlzdCBhbmQgZXhpdAorLlRQCisuQiBcLVwtaWdub3JlLXRhZy1lcnJvcnMKK2lnbm9yZSBlcnJvcnMgaW4gdmFsdWVzIHBhc3NlZCBmb3IgdGFncywgdXNlIGRlZmF1bHRzIGluIGNhc2UgYW4gZXJyb3Igb2NjdXJzCisKKy5QUAorQW5hbHlzaXMgb3B0aW9uczoKKy5UUAorLkIgXC1nCitydW4gZ3JhcGhpY2FsIGFuYWx5c2lzIG9uIDxpbmZpbGU+LgorPGluZmlsZT4gY2FuIGFsc28gYmUgYSAubXAzIGZpbGUuCisoVGhpcyBmZWF0dXJlIGlzIGEgY29tcGlsZSB0aW1lIG9wdGlvbi4KK1lvdXIgYmluYXJ5IG1heSBmb3Igc3BlZWQgcmVhc29ucyBiZSBjb21waWxlZCB3aXRob3V0IHRoaXMuKQorCisuU0ggSUQzIFRBR1MKK0xBTUUgaXMgYWJsZSB0byBlbWJlZCBJRDMgdjEsCit2MS4xIG9yIHYyIHRhZ3MgaW5zaWRlIHRoZSBlbmNvZGVkIE1QMyBmaWxlLgorVGhpcyBhbGxvd3MgdG8gaGF2ZSBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbXVzaWMgdHJhY2sKK2luY2x1ZGVkIGluc2lkZSB0aGUgZmlsZS4KK1Rob3NlIGRhdGEgY2FuIGJlIHJlYWQgYnkgbW9zdCBNUDMgcGxheWVycy4KKworTGFtZSB3aWxsIHNtYXJ0bHkgY2hvb3NlIHdoaWNoIHRhZ3MgdG8gdXNlLgorSXQgd2lsbCBhZGQgSUQzIHYyIHRhZ3Mgb25seSBpZiB0aGUgaW5wdXQgY29tbWVudHMgd29uJ3QgZml0IGluIHYxCitvciB2MS4xIHRhZ3MsCitpLmUuIGlmIHRoZXkgYXJlIG1vcmUgdGhhbiAzMCBjaGFyYWN0ZXJzLgorSW4gdGhpcyBjYXNlLAorYm90aCB2MSBhbmQgdjIgdGFncyB3aWxsIGJlIGFkZGVkLAordG8gZW5zdXJlIHJlYWRpbmcgb2YgdGFncyBieSBNUDMgcGxheWVycyB3aGljaCBhcmUgdW5hYmxlIHRvIHJlYWQgSUQzIHYyIHRhZ3MuCisKKy5TSCBFTkNPRElORyBNT0RFUworTEFNRSBpcyBhYmxlIHRvIGVuY29kZSB5b3VyIG11c2ljIHVzaW5nIG9uZSBvZiBpdHMgMyBlbmNvZGluZyBtb2RlczoKK2NvbnN0YW50IGJpdHJhdGUgKENCUiksIGF2ZXJhZ2UgYml0cmF0ZSAoQUJSKSBhbmQgdmFyaWFibGUgYml0cmF0ZSAoVkJSKS4KKy5UUAorLkIgQ29uc3RhbnQgQml0cmF0ZSAoQ0JSKQorVGhpcyBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBtb2RlLAorYW5kIGFsc28gdGhlIG1vc3QgYmFzaWMuCitJbiB0aGlzIG1vZGUsCit0aGUgYml0cmF0ZSB3aWxsIGJlIHRoZSBzYW1lIGZvciB0aGUgd2hvbGUgZmlsZS4KK0l0IG1lYW5zIHRoYXQgZWFjaCBwYXJ0IG9mIHlvdXIgbXAzIGZpbGUgd2lsbCBiZSB1c2luZyB0aGUgc2FtZQorbnVtYmVyIG9mIGJpdHMuCitUaGUgbXVzaWNhbCBwYXNzYWdlIGJlaW5nIGEgZGlmZmljdWx0IG9uZSB0byBlbmNvZGUgb3IgYW4gZWFzeSBvbmUsCit0aGUgZW5jb2RlciB3aWxsIHVzZSB0aGUgc2FtZSBiaXRyYXRlLAorc28gdGhlIHF1YWxpdHkgb2YgeW91ciBtcDMgaXMgdmFyaWFibGUuCitDb21wbGV4IHBhcnRzIHdpbGwgYmUgb2YgYSBsb3dlciBxdWFsaXR5IHRoYW4gdGhlIGVhc2llc3Qgb25lcy4KK1RoZSBtYWluIGFkdmFudGFnZSBpcyB0aGF0IHRoZSBmaW5hbCBmaWxlcyBzaXplIHdvbid0IGNoYW5nZSBhbmQKK2NhbiBiZSBhY2N1cmF0ZWx5IHByZWRpY3RlZC4KKy5UUAorLkIgQXZlcmFnZSBCaXRyYXRlIChBQlIpCitJbiB0aGlzIG1vZGUsCit5b3UgY2hvb3NlIHRoZSBlbmNvZGVyIHdpbGwgbWFpbnRhaW4gYW4gYXZlcmFnZSBiaXRyYXRlIHdoaWxlIHVzaW5nCitoaWdoZXIgYml0cmF0ZXMgZm9yIHRoZSBwYXJ0cyBvZiB5b3VyIG11c2ljIHRoYXQgbmVlZCBtb3JlIGJpdHMuCitUaGUgcmVzdWx0IHdpbGwgYmUgb2YgaGlnaGVyIHF1YWxpdHkgdGhhbiBDQlIgZW5jb2RpbmcgYnV0IHRoZQorYXZlcmFnZSBmaWxlIHNpemUgd2lsbCByZW1haW4gcHJlZGljdGFibGUsCitzbyB0aGlzIG1vZGUgaXMgaGlnaGx5IHJlY29tbWVuZGVkIG92ZXIgQ0JSLgorVGhpcyBlbmNvZGluZyBtb2RlIGlzIHNpbWlsYXIgdG8gd2hhdCBpcyByZWZlcnJlZCBhcyB2YnIgaW4gQUFDIG9yCitMaXF1aWQgQXVkaW8gKDIgb3RoZXIgY29tcHJlc3Npb24gdGVjaG5vbG9naWVzKS4KKy5UUAorLkIgVmFyaWFibGUgYml0cmF0ZSAoVkJSKQorSW4gdGhpcyBtb2RlLAoreW91IGNob29zZSB0aGUgZGVzaXJlZCBxdWFsaXR5IG9uIGEgc2NhbGUgZnJvbSA5IChsb3dlc3QKK3F1YWxpdHkvYmlnZ2VzdCBkaXN0b3J0aW9uKSB0byAwIChoaWdoZXN0IHF1YWxpdHkvbG93ZXN0IGRpc3RvcnRpb24pLgorVGhlbiBlbmNvZGVyIHRyaWVzIHRvIG1haW50YWluIHRoZSBnaXZlbiBxdWFsaXR5IGluIHRoZSB3aG9sZSBmaWxlIGJ5CitjaG9vc2luZyB0aGUgb3B0aW1hbCBudW1iZXIgb2YgYml0cyB0byBzcGVuZCBmb3IgZWFjaCBwYXJ0IG9mIHlvdXIgbXVzaWMuCitUaGUgbWFpbiBhZHZhbnRhZ2UgaXMgdGhhdCB5b3UgYXJlIGFibGUgdG8gc3BlY2lmeSB0aGUgcXVhbGl0eSBsZXZlbCB0aGF0Cit5b3Ugd2FudCB0byByZWFjaCwKK2J1dCB0aGUgaW5jb252ZW5pZW50IGlzIHRoYXQgdGhlIGZpbmFsIGZpbGUgc2l6ZSBpcyB0b3RhbGx5IHVucHJlZGljdGFibGUuCisKKy5TSCBQUkVTRVRTCitUaGUKKy5CIFwtXC1wcmVzZXQKK3N3aXRjaGVzIGFyZSBhbGlhc2VzIG92ZXIgTEFNRSBzZXR0aW5ncy4KKworVG8gYWN0aXZhdGUgdGhlc2UgcHJlc2V0czoKKy5QUAorRm9yIFZCUiBtb2RlcyAoZ2VuZXJhbGx5IGhpZ2hlc3QgcXVhbGl0eSk6CisuVFAKKy5CIFwtXC1wcmVzZXQgbWVkaXVtCitUaGlzIHByZXNldCBzaG91bGQgcHJvdmlkZSBuZWFyIHRyYW5zcGFyZW5jeSB0byBtb3N0IHBlb3BsZSBvbiBtb3N0IG11c2ljLgorLlRQCisuQiBcLVwtcHJlc2V0IHN0YW5kYXJkCitUaGlzIHByZXNldCBzaG91bGQgZ2VuZXJhbGx5IGJlIHRyYW5zcGFyZW50IHRvIG1vc3QgcGVvcGxlIG9uIG1vc3QgbXVzaWMgYW5kCitpcyBhbHJlYWR5IHF1aXRlIGhpZ2ggaW4gcXVhbGl0eS4KKy5UUAorLkIgXC1cLXByZXNldCBleHRyZW1lCitJZiB5b3UgaGF2ZSBleHRyZW1lbHkgZ29vZCBoZWFyaW5nIGFuZCBzaW1pbGFyIGVxdWlwbWVudCwKK3RoaXMgcHJlc2V0IHdpbGwgZ2VuZXJhbGx5IHByb3ZpZGUgc2xpZ2h0bHkgaGlnaGVyIHF1YWxpdHkgdGhhbiB0aGUKKy5CIHN0YW5kYXJkCittb2RlLgorLlBQCitGb3IgQ0JSIDMyMGticHMgKGhpZ2hlc3QgcXVhbGl0eSBwb3NzaWJsZSBmcm9tIHRoZQorLkIgXC1cLXByZXNldAorc3dpdGNoZXMpOgorLlRQCisuQiBcLVwtcHJlc2V0IGluc2FuZQorVGhpcyBwcmVzZXQgd2lsbCB1c3VhbGx5IGJlIG92ZXJraWxsIGZvciBtb3N0IHBlb3BsZSBhbmQgbW9zdCBzaXR1YXRpb25zLAorYnV0IGlmIHlvdSBtdXN0IGhhdmUgdGhlIGFic29sdXRlIGhpZ2hlc3QgcXVhbGl0eSB3aXRoIG5vIHJlZ2FyZCB0byBmaWxlc2l6ZSwKK3RoaXMgaXMgdGhlIHdheSB0byBnby4KKy5QUAorRm9yIEFCUiBtb2RlcyAoaGlnaCBxdWFsaXR5IHBlciBnaXZlbiBiaXRyYXRlIGJ1dCBub3QgYXMgaGlnaCBhcyBWQlIpOgorLlRQCisuQiBcLVwtcHJlc2V0ICIga2JwcyIKK1VzaW5nIHRoaXMgcHJlc2V0IHdpbGwgdXN1YWxseSBnaXZlIHlvdSBnb29kIHF1YWxpdHkgYXQgYSBzcGVjaWZpZWQgYml0cmF0ZS4KK0RlcGVuZGluZyBvbiB0aGUgYml0cmF0ZSBlbnRlcmVkLAordGhpcyBwcmVzZXQgd2lsbCBkZXRlcm1pbmUgdGhlIG9wdGltYWwgc2V0dGluZ3MgZm9yIHRoYXQgcGFydGljdWxhciBzaXR1YXRpb24uCitXaGlsZSB0aGlzIGFwcHJvYWNoIHdvcmtzLAoraXQgaXMgbm90IG5lYXJseSBhcyBmbGV4aWJsZSBhcyBWQlIsCithbmQgdXN1YWxseSB3aWxsIG5vdCBhdHRhaW4gdGhlIHNhbWUgbGV2ZWwgb2YgcXVhbGl0eSBhcyBWQlIgYXQgaGlnaGVyIGJpdHJhdGVzLgorLlBQCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGFsc28gYXZhaWxhYmxlIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcm9maWxlczoKKy5QUAorLkIgZmFzdCBzdGFuZGFyZHxleHRyZW1lCisuYnIKKy5CIGNiciAiIGticHMiCisuUFAKKy5UUAorLkIgZmFzdAorRW5hYmxlcyB0aGUgbmV3IGZhc3QgVkJSIGZvciBhIHBhcnRpY3VsYXIgcHJvZmlsZS4KKy5UUAorLkIgY2JyCitJZiB5b3UgdXNlIHRoZSBBQlIgbW9kZSAocmVhZCBhYm92ZSkgd2l0aCBhIHNpZ25pZmljYW50IGJpdHJhdGUgc3VjaCBhcyA4MCwKKzk2LAorMTEyLAorMTI4LAorMTYwLAorMTkyLAorMjI0LAorMjU2LAorMzIwLAoreW91IGNhbiB1c2UgdGhlCisuQiBjYnIKK29wdGlvbiB0byBmb3JjZSBDQlIgbW9kZSBlbmNvZGluZyBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBBQlIgbW9kZS4KK0FCUiBkb2VzIHByb3ZpZGUgaGlnaGVyIHF1YWxpdHkgYnV0IENCUiBtYXkgYmUgdXNlZnVsIGluIHNpdHVhdGlvbnMgc3VjaCBhcyB3aGVuCitzdHJlYW1pbmcgYW4gTVAzIG92ZXIgdGhlIEludGVybmV0IG1heSBiZSBpbXBvcnRhbnQuCisKKworLlNIIEVYQU1QTEVTCisuTFAKK0ZpeGVkIGJpdCByYXRlIGpzdGVyZW8gMTI4a2JzIGVuY29kaW5nOgorLklQCisuQiBsYW1lCisuSSBzYW1wbGUud2F2IHNhbXBsZS5tcDMKKworLkxQCitGaXhlZCBiaXQgcmF0ZSBqc3RlcmVvIDEyOCBrYnBzIGVuY29kaW5nLCBoaWdoZXN0IHF1YWxpdHkgKHJlY29tbWVuZGVkKToKKy5JUAorLkIgbGFtZSBcLWgKKy5JIHNhbXBsZS53YXYgc2FtcGxlLm1wMworCisuTFAKK0ZpeGVkIGJpdCByYXRlIGpzdGVyZW8gMTEyIGticHMgZW5jb2Rpbmc6CisuSVAKKy5CIGxhbWUgXC1iCisuSSAxMTIgc2FtcGxlLndhdiBzYW1wbGUubXAzCisKKy5MUAorVG8gZGlzYWJsZSBqb2ludCBzdGVyZW8gZW5jb2RpbmcgKHNsaWdodGx5IGZhc3RlciwKK2J1dCBsZXNzIHF1YWxpdHkgYXQgYml0cmF0ZXMgPD0gMTI4IGticHMpOgorLklQCisuQiBsYW1lIFwtbQorLkkgcyBzYW1wbGUud2F2IHNhbXBsZS5tcDMKKworLkxQCitGYXN0IGVuY29kZSwKK2xvdyBxdWFsaXR5IChubyBwc3ljaG8tYWNvdXN0aWNzKToKKy5JUAorLkIgbGFtZSBcLWYKKy5JIHNhbXBsZS53YXYgc2FtcGxlLm1wMworCisuTFAKK1ZhcmlhYmxlIGJpdHJhdGUgKHVzZSBcLVYgbiB0byBhZGp1c3QgcXVhbGl0eS9maWxlc2l6ZSk6CisuSVAKKy5CIGxhbWUgXC1oIFwtVgorLkkgNiBzYW1wbGUud2F2IHNhbXBsZS5tcDMKKworLkxQCitTdHJlYW1pbmcgbW9ubyAyMi4wNSBrSHogcmF3IHBjbSwgMjQga2JwcyBvdXRwdXQ6CisuSVAKKy5CIGNhdAorLkkgaW5wdXRmaWxlCisuQiB8IGxhbWUgXC1yIFwtbQorLkkgbQorLkIgXC1iCisuSSAyNAorLkIgXC1zCisuSSAyMi4wNSBcLSBcLQorLkIgPgorLkkgb3V0cHV0CisKKy5MUAorU3RyZWFtaW5nIG1vbm8gNDQuMSBrSHogcmF3IHBjbSwKK3dpdGggZG93bnNhbXBsaW5nIHRvIDIyLjA1IGtIejoKKy5JUAorLkIgY2F0CisuSSBpbnB1dGZpbGUKKy5CIHwgbGFtZSBcLXIgXC1tCisuSSBtCisuQiBcLWIKKy5JIDI0CisuQiBcLVwtcmVzYW1wbGUKKy5JIDIyLjA1IFwtIFwtCisuQiA+CisuSSBvdXRwdXQKKworLkxQCitFbmNvZGUgd2l0aCB0aGUKKy5CIGZhc3Qgc3RhbmRhcmQKK3ByZXNldDoKKy5JUAorLkIgbGFtZSBcLVwtcHJlc2V0IGZhc3Qgc3RhbmRhcmQKKy5JIHNhbXBsZS53YXYgc2FtcGxlLm1wMworCisuU0ggQlVHUworLlBQCitQcm9iYWJseSB0aGVyZSBhcmUgc29tZS4KKy5TSCBTRUUgQUxTTworLkJSIG1wZzEyMyAoMSkgLAorLkJSIG1hZHBsYXkgKDEpICwKKy5CUiBzb3ggKDEpCisuU0ggQVVUSE9SUworLm5mCitMQU1FIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IE1pa2UgQ2hlbmcgYW5kIG5vdyBtYWludGFpbmVkIGJ5CitNYXJrIFRheWxvciwgYW5kIHRoZSBMQU1FIHRlYW0uCisKK0dQU1lDSE8gcHN5Y2hvLWFjb3VzdGljIG1vZGVsIGJ5IE1hcmsgVGF5bG9yLgorKFNlZSBodHRwOi8vd3d3Lm1wM2Rldi5vcmcvKS4KKworbXBnbGliIGJ5IE1pY2hhZWwgSGlwcAorCitNYW51YWwgcGFnZSBieSBXaWxsaWFtIFNjaGVsdGVyLCBOaWxzIEZhZXJiZXIsIEFsZXhhbmRlciBMZWlkaW5nZXIsCithbmQgUm9nXFsnZV1yaW8gQnJpdG8uCisuXCIgTG9jYWwgVmFyaWFibGVzOgorLlwiIG1vZGU6IG5yb2ZmCisuXCIgRW5kOgpkaWZmIC0tZ2l0IGEvZHNob3cvRW5jb2Rlci5jcHAgYi9kc2hvdy9FbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTE2MzlkCi0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvRW5jb2Rlci5jcHAKQEAgLTAsMCArMSw1NzcgQEAKKy8qCisgKiAgTEFNRSBNUDMgZW5jb2RlciBmb3IgRGlyZWN0U2hvdworICogIExBTUUgZW5jb2RlciB3cmFwcGVyCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1hcmllIE9ybG92YSwgUGV0ZXIgR3ViYW5vdiwgVml0YWx5IEl2YW5vdiwgRWxlY2FyZCBMdGQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyZWFtcy5oPgorI2luY2x1ZGUgIkVuY29kZXIuaCIKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0NFbmNvZGVyOjpDRW5jb2RlcigpIDoKKyAgICBtX2JJbnB1VHlwZVNldChGQUxTRSksCisgICAgbV9iT3V0cHVUeXBlU2V0KEZBTFNFKSwKKyAgICBtX2JGaW5pc2hlZChGQUxTRSksCisgICAgbV9vdXRPZmZzZXQoMCksCisgICAgbV9vdXRSZWFkT2Zmc2V0KDApLAorICAgIG1fZnJhbWVDb3VudCgwKSwKKyAgICBwZ2YoTlVMTCkKK3sKKyAgICBtX291dEZyYW1lQnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbT1VUX0JVRkZFUl9TSVpFXTsKK30KKworQ0VuY29kZXI6On5DRW5jb2RlcigpCit7CisgICAgQ2xvc2UoTlVMTCk7CisKKyAgICBpZiAobV9vdXRGcmFtZUJ1ZikKKyAgICAgICAgZGVsZXRlIFtdIG1fb3V0RnJhbWVCdWY7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldElucHV0VHlwZSAtIGNoZWNrIGlmIGdpdmVuIGlucHV0IHR5cGUgaXMgc3VwcG9ydGVkCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENFbmNvZGVyOjpTZXRJbnB1dFR5cGUoTFBXQVZFRk9STUFURVggbHB3ZmV4LCBib29sIGJKdXN0Q2hlY2spCit7CisgICAgQ0F1dG9Mb2NrIGwoJm1fbG9jayk7CisKKyAgICBpZiAobHB3ZmV4LT53Rm9ybWF0VGFnID09IFdBVkVfRk9STUFUX1BDTSkKKyAgICB7CisgICAgICAgIGlmIChscHdmZXgtPm5DaGFubmVscyA9PSAxIHx8IGxwd2ZleC0+bkNoYW5uZWxzID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChscHdmZXgtPm5TYW1wbGVzUGVyU2VjICA9PSA0ODAwMCB8fAorICAgICAgICAgICAgICAgIGxwd2ZleC0+blNhbXBsZXNQZXJTZWMgID09IDQ0MTAwIHx8CisgICAgICAgICAgICAgICAgbHB3ZmV4LT5uU2FtcGxlc1BlclNlYyAgPT0gMzIwMDAgfHwKKyAgICAgICAgICAgICAgICBscHdmZXgtPm5TYW1wbGVzUGVyU2VjICA9PSAyNDAwMCB8fAorICAgICAgICAgICAgICAgIGxwd2ZleC0+blNhbXBsZXNQZXJTZWMgID09IDIyMDUwIHx8CisgICAgICAgICAgICAgICAgbHB3ZmV4LT5uU2FtcGxlc1BlclNlYyAgPT0gMTYwMDAgfHwKKyAgICAgICAgICAgICAgICBscHdmZXgtPm5TYW1wbGVzUGVyU2VjICA9PSAxMjAwMCB8fAorICAgICAgICAgICAgICAgIGxwd2ZleC0+blNhbXBsZXNQZXJTZWMgID09IDExMDI1IHx8CisgICAgICAgICAgICAgICAgbHB3ZmV4LT5uU2FtcGxlc1BlclNlYyAgPT0gIDgwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxwd2ZleC0+d0JpdHNQZXJTYW1wbGUgPT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJKdXN0Q2hlY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbV93ZmV4LCBscHdmZXgsIHNpemVvZihXQVZFRk9STUFURVgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYklucHVUeXBlU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYkp1c3RDaGVjaykKKyAgICAgICAgbV9iSW5wdVR5cGVTZXQgPSBmYWxzZTsKKworICAgIHJldHVybiBFX0lOVkFMSURBUkc7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldE91dHB1dFR5cGUgLSB0cnkgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIHdpdGggZ2l2ZW4gb3V0cHV0IHR5cGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0hSRVNVTFQgQ0VuY29kZXI6OlNldE91dHB1dFR5cGUoTVBFR19FTkNPREVSX0NPTkZJRyAmbWFic2kpCit7CisgICAgQ0F1dG9Mb2NrIGwoJm1fbG9jayk7CisKKyAgICBtX21hYnNpID0gbWFic2k7CisgICAgbV9iT3V0cHVUeXBlU2V0ID0gdHJ1ZTsKKworICAgIHJldHVybiBTX09LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXREZWZhdWx0T3V0cHV0VHlwZSAtIHNldHMgZGVmYXVsdCBNUEVHIGF1ZGlvIHByb3BlcnRpZXMgYWNjb3JkaW5nCisvLyB0byBpbnB1dCB0eXBlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENFbmNvZGVyOjpTZXREZWZhdWx0T3V0cHV0VHlwZShMUFdBVkVGT1JNQVRFWCBscHdmZXgpCit7CisgICAgQ0F1dG9Mb2NrIGwoJm1fbG9jayk7CisKKyAgICBpZihscHdmZXgtPm5DaGFubmVscyA9PSAxIHx8IG1fbWFic2kuYkZvcmNlTW9ubykKKyAgICAgICAgbV9tYWJzaS5DaE1vZGUgPSBNT05POworCisgICAgaWYoKGxwd2ZleC0+blNhbXBsZXNQZXJTZWMgPCBtX21hYnNpLmR3U2FtcGxlUmF0ZSkgfHwgKGxwd2ZleC0+blNhbXBsZXNQZXJTZWMgJSBtX21hYnNpLmR3U2FtcGxlUmF0ZSAhPSAwKSkKKyAgICAgICAgbV9tYWJzaS5kd1NhbXBsZVJhdGUgPSBscHdmZXgtPm5TYW1wbGVzUGVyU2VjOworCisgICAgcmV0dXJuIFNfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluaXQgLSBpbml0aWFsaXplZCBvciByZWluaXlpYWxpemVkIGVuY29kZXIgU0RLIHdpdGggZ2l2ZW4gaW5wdXQgCisvLyBhbmQgb3V0cHV0IHNldHRpbmdzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENFbmNvZGVyOjpJbml0KCkKK3sKKyAgICBDQXV0b0xvY2sgbCgmbV9sb2NrKTsKKworICAgIG1fb3V0T2Zmc2V0ICAgICA9IDA7CisgICAgbV9vdXRSZWFkT2Zmc2V0ID0gMDsKKworICAgIG1fYkZpbmlzaGVkICAgICA9IEZBTFNFOworCisgICAgbV9mcmFtZUNvdW50ICAgID0gMDsKKworICAgIGlmICghcGdmKQorICAgIHsKKyAgICAgICAgaWYgKCFtX2JJbnB1VHlwZVNldCB8fCAhbV9iT3V0cHVUeXBlU2V0KQorICAgICAgICAgICAgcmV0dXJuIEVfVU5FWFBFQ1RFRDsKKworICAgICAgICAvLyBJbml0IExhbWUgbGlicmFyeQorICAgICAgICAvLyBub3RlOiBuZXdlciwgc2FmZXIgaW50ZXJmYWNlIHdoaWNoIGRvZXNuJ3QgCisgICAgICAgIC8vIGFsbG93IG9yIHJlcXVpcmUgZGlyZWN0IGFjY2VzcyB0byAnZ2YnIHN0cnVjdCBpcyBiZWluZyB3cml0dGVuCisgICAgICAgIC8vIHNlZSB0aGUgZmlsZSAnQVBJJyBpbmNsdWRlZCB3aXRoIExBTUUuCisgICAgICAgIGlmIChwZ2YgPSBsYW1lX2luaXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGFtZV9zZXRfbnVtX2NoYW5uZWxzKHBnZiwgbV93ZmV4Lm5DaGFubmVscyk7CisgICAgICAgICAgICBsYW1lX3NldF9pbl9zYW1wbGVyYXRlKHBnZiwgbV93ZmV4Lm5TYW1wbGVzUGVyU2VjKTsKKyAgICAgICAgICAgIGxhbWVfc2V0X291dF9zYW1wbGVyYXRlKHBnZiwgbV9tYWJzaS5kd1NhbXBsZVJhdGUpOworICAgICAgICAgICAgaWYgKChsYW1lX2dldF9vdXRfc2FtcGxlcmF0ZShwZ2YpID49IDMyMDAwKSAmJiAobV9tYWJzaS5kd0JpdHJhdGUgPCAzMikpCisgICAgICAgICAgICAgICAgbGFtZV9zZXRfYnJhdGUocGdmLCAzMik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGFtZV9zZXRfYnJhdGUocGdmLCBtX21hYnNpLmR3Qml0cmF0ZSk7CisgICAgICAgICAgICBsYW1lX3NldF9WQlIocGdmLCBtX21hYnNpLnZtVmFyaWFibGUpOworICAgICAgICAgICAgbGFtZV9zZXRfVkJSX21pbl9iaXRyYXRlX2ticHMocGdmLCBtX21hYnNpLmR3VmFyaWFibGVNaW4pOworICAgICAgICAgICAgbGFtZV9zZXRfVkJSX21heF9iaXRyYXRlX2ticHMocGdmLCBtX21hYnNpLmR3VmFyaWFibGVNYXgpOworCisgICAgICAgICAgICBsYW1lX3NldF9jb3B5cmlnaHQocGdmLCBtX21hYnNpLmJDb3B5cmlnaHQpOworICAgICAgICAgICAgbGFtZV9zZXRfb3JpZ2luYWwocGdmLCBtX21hYnNpLmJPcmlnaW5hbCk7CisgICAgICAgICAgICBsYW1lX3NldF9lcnJvcl9wcm90ZWN0aW9uKHBnZiwgbV9tYWJzaS5iQ1JDUHJvdGVjdCk7CisKKyAgICAgICAgICAgIGxhbWVfc2V0X2JXcml0ZVZiclRhZyhwZ2YsIG1fbWFic2kuZHdYaW5nVGFnKTsKKyAgICAgICAgICAgIGxhbWVfc2V0X3N0cmljdF9JU08ocGdmLCBtX21hYnNpLmR3U3RyaWN0SVNPKTsKKyAgICAgICAgICAgIGxhbWVfc2V0X1ZCUl9oYXJkX21pbihwZ2YsIG1fbWFic2kuZHdFbmZvcmNlVkJSbWluKTsKKworICAgICAgICAgICAgaWYgKGxhbWVfZ2V0X251bV9jaGFubmVscyhwZ2YpID09IDIgJiYgIW1fbWFic2kuYkZvcmNlTW9ubykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2ludCBhY3RfYnIgPSBwZ2YtPlZCUiA/IHBnZi0+VkJSX21pbl9iaXRyYXRlX2ticHMgKyBwZ2YtPlZCUl9tYXhfYml0cmF0ZV9rYnBzIC8gMiA6IHBnZi0+YnJhdGU7CisKKyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlZC4gSXQncyBmb3IgdXNlcidzIGNvbnNpZGVyYXRpb24gbm93CisgICAgICAgICAgICAgICAgLy9pbnQgcmVsID0gcGdmLT5vdXRfc2FtcGxlcmF0ZSAvIChhY3RfYnIgKyAxKTsKKyAgICAgICAgICAgICAgICAvL3BnZi0+bW9kZSA9IHJlbCA8IDIwMCA/IG1fbWFic2kuQ2hNb2RlIDogSk9JTlRfU1RFUkVPOworCisgICAgICAgICAgICAgICAgbGFtZV9zZXRfbW9kZShwZ2YsIG1fbWFic2kuQ2hNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9tb2RlKHBnZiwgTU9OTyk7CisKKyAgICAgICAgICAgIGlmIChsYW1lX2dldF9tb2RlKHBnZikgPT0gSk9JTlRfU1RFUkVPKQorICAgICAgICAgICAgICAgIGxhbWVfc2V0X2ZvcmNlX21zKHBnZiwgbV9tYWJzaS5kd0ZvcmNlTVMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxhbWVfc2V0X2ZvcmNlX21zKHBnZiwgMCk7CisKKy8vICAgICAgICAgICAgcGdmLT5tb2RlX2ZpeGVkID0gbV9tYWJzaS5kd01vZGVGaXhlZDsKKworICAgICAgICAgICAgaWYgKG1fbWFic2kuZHdWb2ljZU1vZGUgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9sb3dwYXNzZnJlcShwZ2YsMTIwMDApOworICAgICAgICAgICAgICAgIC8vL3BnZi0+VkJSX21heF9iaXRyYXRlX2ticHMgPSAxNjA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtX21hYnNpLmR3S2VlcEFsbEZyZXEgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLy9wZ2YtPmxvd3Bhc3NmcmVxID0gLTE7CisgICAgICAgICAgICAgICAgLy8vcGdmLT5oaWdocGFzc2ZyZXEgPSAtMTsKKyAgICAgICAgICAgICAgICAvLy8gbm90IGF2YWlsYWJsZSBhbnltb3JlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhbWVfc2V0X3F1YWxpdHkocGdmLCBtX21hYnNpLmR3UXVhbGl0eSk7CisgICAgICAgICAgICBsYW1lX3NldF9WQlJfcShwZ2YsIG1fbWFic2kuZHdWQlJxKTsKKworICAgICAgICAgICAgbGFtZV9pbml0X3BhcmFtcyhwZ2YpOworCisgICAgICAgICAgICAvLyBlbmNvZGVyIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb25zdCBuY2ggPSBsYW1lX2dldF9udW1fY2hhbm5lbHMocGdmKTsKKyAgICAgICAgICAgICAgICBzaG9ydCAqIHN0YXJ0X3BhZGQgPSAoc2hvcnQgKiljYWxsb2MoNDgsIG5jaCAqIHNpemVvZihzaG9ydCkpOworCisJCQkJaW50IG91dF9ieXRlcyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAobmNoID09IDIpCisgICAgICAgICAgICAgICAgICAgIG91dF9ieXRlcyA9IGxhbWVfZW5jb2RlX2J1ZmZlcl9pbnRlcmxlYXZlZChwZ2YsIHN0YXJ0X3BhZGQsIDQ4LCBtX291dEZyYW1lQnVmLCBPVVRfQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3V0X2J5dGVzID0gbGFtZV9lbmNvZGVfYnVmZmVyKHBnZiwgc3RhcnRfcGFkZCwgc3RhcnRfcGFkZCwgNDgsIG1fb3V0RnJhbWVCdWYsIE9VVF9CVUZGRVJfU0laRSk7CisKKwkJCQlpZiAob3V0X2J5dGVzID4gMCkKKwkJCQkJbV9vdXRPZmZzZXQgKz0gb3V0X2J5dGVzOworCisgICAgICAgICAgICAgICAgZnJlZShzdGFydF9wYWRkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KKworICAgIHJldHVybiBTX09LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbG9zZSAtIGNsb3NlcyBlbmNvZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENFbmNvZGVyOjpDbG9zZShJU3RyZWFtKiBwU3RyZWFtKQoreworCUNBdXRvTG9jayBsKCZtX2xvY2spOworICAgIGlmIChwZ2YpCisgICAgeworCQlpZihsYW1lX2dldF9iV3JpdGVWYnJUYWcocGdmKSAmJiBwU3RyZWFtKQorCQl7CisJCQl1cGRhdGVMYW1lVGFnRnJhbWUocFN0cmVhbSk7CisJCX0KKworICAgICAgICBsYW1lX2Nsb3NlKHBnZik7CisgICAgICAgIHBnZiA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIFNfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVuY29kZSAtIGVuY29kZXMgZGF0YSBwbGFjZWQgb24gcGRhdGEgYW5kIHJldHVybnMKKy8vIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgQ0VuY29kZXI6OkVuY29kZShjb25zdCBzaG9ydCAqIHBkYXRhLCBpbnQgZGF0YV9zaXplKQoreworICAgIENBdXRvTG9jayBsKCZtX2xvY2spOworCisgICAgaWYgKCFwZ2YgfHwgIW1fb3V0RnJhbWVCdWYgfHwgIXBkYXRhIHx8IGRhdGFfc2l6ZSA8IDAgfHwgKGRhdGFfc2l6ZSAmIChzaXplb2Yoc2hvcnQpIC0gMSkpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBzb21lIGRhdGEgbGVmdCBpbiB0aGUgYnVmZmVyLCBzaGlmdCB0byBzdGFydAorICAgIGlmIChtX291dFJlYWRPZmZzZXQgPiAwKQorICAgIHsKKyAgICAgICAgaWYgKG1fb3V0T2Zmc2V0ID4gbV9vdXRSZWFkT2Zmc2V0KQorICAgICAgICAgICAgbWVtbW92ZShtX291dEZyYW1lQnVmLCBtX291dEZyYW1lQnVmICsgbV9vdXRSZWFkT2Zmc2V0LCBtX291dE9mZnNldCAtIG1fb3V0UmVhZE9mZnNldCk7CisKKyAgICAgICAgbV9vdXRPZmZzZXQgLT0gbV9vdXRSZWFkT2Zmc2V0OworICAgIH0KKworICAgIG1fb3V0UmVhZE9mZnNldCA9IDA7CisKKworCisgICAgbV9iRmluaXNoZWQgPSBGQUxTRTsKKworICAgIGludCBieXRlc19wcm9jZXNzZWQgPSAwOworICAgIGludCBjb25zdCBuY2ggPSBsYW1lX2dldF9udW1fY2hhbm5lbHMocGdmKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgaW50IG5zYW1wbGVzID0gKGRhdGFfc2l6ZSAtIGJ5dGVzX3Byb2Nlc3NlZCkgLyAoc2l6ZW9mKHNob3J0KSAqIG5jaCk7CisKKyAgICAgICAgaWYgKG5zYW1wbGVzIDw9IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobnNhbXBsZXMgPiAxMTUyKQorICAgICAgICAgICAgbnNhbXBsZXMgPSAxMTUyOworCisgICAgICAgIGlmIChtX291dE9mZnNldCA+PSBPVVRfQlVGRkVSX01BWCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGludCBvdXRfYnl0ZXMgPSAwOworCisgICAgICAgIGlmIChuY2ggPT0gMikKKyAgICAgICAgICAgIG91dF9ieXRlcyA9IGxhbWVfZW5jb2RlX2J1ZmZlcl9pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKikocGRhdGEgKyAoYnl0ZXNfcHJvY2Vzc2VkIC8gc2l6ZW9mKHNob3J0KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXRGcmFtZUJ1ZiArIG1fb3V0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRfQlVGRkVSX1NJWkUgLSBtX291dE9mZnNldCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dF9ieXRlcyA9IGxhbWVfZW5jb2RlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGF0YSArIChieXRlc19wcm9jZXNzZWQgLyBzaXplb2Yoc2hvcnQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRhdGEgKyAoYnl0ZXNfcHJvY2Vzc2VkIC8gc2l6ZW9mKHNob3J0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dEZyYW1lQnVmICsgbV9vdXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9CVUZGRVJfU0laRSAtIG1fb3V0T2Zmc2V0KTsKKworICAgICAgICBpZiAob3V0X2J5dGVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBtX291dE9mZnNldCAgICAgKz0gb3V0X2J5dGVzOworICAgICAgICBieXRlc19wcm9jZXNzZWQgKz0gbnNhbXBsZXMgKiBuY2ggKiBzaXplb2Yoc2hvcnQpOworICAgIH0KKworICAgIHJldHVybiBieXRlc19wcm9jZXNzZWQ7Cit9CisKKy8vCisvLyBGaW5zaCAtIGZsdXNoIHRoZSBidWZmZXJlZCBzYW1wbGVzCisvLworSFJFU1VMVCBDRW5jb2Rlcjo6RmluaXNoKCkKK3sKKyAgICBDQXV0b0xvY2sgbCgmbV9sb2NrKTsKKworICAgIGlmICghcGdmIHx8ICFtX291dEZyYW1lQnVmIHx8IChtX291dE9mZnNldCA+PSBPVVRfQlVGRkVSX01BWCkpCisgICAgICAgIHJldHVybiBFX0ZBSUw7CisKKyAgICBtX291dE9mZnNldCArPSBsYW1lX2VuY29kZV9mbHVzaChwZ2YsIG1fb3V0RnJhbWVCdWYgKyBtX291dE9mZnNldCwgT1VUX0JVRkZFUl9TSVpFIC0gbV9vdXRPZmZzZXQpOworCisgICAgbV9iRmluaXNoZWQgPSBUUlVFOworCisgICAgcmV0dXJuIFNfT0s7Cit9CisKKworaW50IGdldEZyYW1lTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBwZGF0YSkKK3sKKyAgICBpZiAoIXBkYXRhIHx8IHBkYXRhWzBdICE9IDB4ZmYgfHwgKHBkYXRhWzFdICYgMHhlMCkgIT0gMHhlMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgY29uc3QgaW50IHNhbXBsZV9yYXRlX3RhYls0XVs0XSA9CisgICAgeworICAgICAgICB7MTEwMjUsMTIwMDAsODAwMCwxfSwKKyAgICAgICAgezEsMSwxLDF9LAorICAgICAgICB7MjIwNTAsMjQwMDAsMTYwMDAsMX0sCisgICAgICAgIHs0NDEwMCw0ODAwMCwzMjAwMCwxfQorICAgIH07CisKKyNkZWZpbmUgTVBFR19WRVJTSU9OX1JFU0VSVkVEICAgMQorI2RlZmluZSBNUEVHX1ZFUlNJT05fMSAgICAgICAgICAzCisKKyNkZWZpbmUgTEFZRVJfSUlJICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEJJVFJBVEVfRlJFRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQklUUkFURV9SRVNFUlZFRCAgICAgICAgMTUKKworI2RlZmluZSBTUkFURV9SRVNFUlZFRCAgICAgICAgICAzCisKKyNkZWZpbmUgRU1QSEFTSVNfUkVTRVJWRUQgICAgICAgMgorCisgICAgaW50IHZlcnNpb25faWQgICAgICA9IChwZGF0YVsxXSAmIDB4MTgpID4+IDM7CisgICAgaW50IGxheWVyICAgICAgICAgICA9IChwZGF0YVsxXSAmIDB4MDYpID4+IDE7CisgICAgaW50IGJpdHJhdGVfaWQgICAgICA9IChwZGF0YVsyXSAmIDB4RjApID4+IDQ7CisgICAgaW50IHNhbXBsZV9yYXRlX2lkICA9IChwZGF0YVsyXSAmIDB4MEMpID4+IDI7CisgICAgaW50IHBhZGRpbmcgICAgICAgICA9IChwZGF0YVsyXSAmIDB4MDIpID4+IDE7CisgICAgaW50IGVtcGhhc2lzICAgICAgICA9ICBwZGF0YVszXSAmIDB4MDM7CisKKyAgICBpZiAodmVyc2lvbl9pZCAgICAgICE9IE1QRUdfVkVSU0lPTl9SRVNFUlZFRCAmJgorICAgICAgICBsYXllciAgICAgICAgICAgPT0gTEFZRVJfSUlJICYmCisgICAgICAgIGJpdHJhdGVfaWQgICAgICAhPSBCSVRSQVRFX0ZSRUUgJiYKKyAgICAgICAgYml0cmF0ZV9pZCAgICAgICE9IEJJVFJBVEVfUkVTRVJWRUQgJiYKKyAgICAgICAgc2FtcGxlX3JhdGVfaWQgICE9IFNSQVRFX1JFU0VSVkVEICYmCisgICAgICAgIGVtcGhhc2lzICAgICAgICAhPSBFTVBIQVNJU19SRVNFUlZFRCkKKyAgICB7CisgICAgICAgIGludCBzcGYgICAgICAgICA9ICh2ZXJzaW9uX2lkID09IE1QRUdfVkVSU0lPTl8xKSA/IDExNTIgOiA1NzY7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlX3RhYlt2ZXJzaW9uX2lkXVtzYW1wbGVfcmF0ZV9pZF07CisgICAgICAgIGludCBiaXRyYXRlICAgICA9IGR3Qml0UmF0ZVZhbHVlW3ZlcnNpb25faWQgIT0gTVBFR19WRVJTSU9OXzFdW2JpdHJhdGVfaWQgLSAxXSAqIDEwMDA7CisKKyAgICAgICAgcmV0dXJuIChiaXRyYXRlICogc3BmKSAvICg4ICogc2FtcGxlX3JhdGUpICsgcGFkZGluZzsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKworaW50IENFbmNvZGVyOjpHZXRGcmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICoqIHBmcmFtZSkKK3sKKyAgICBpZiAoIXBnZiB8fCAhbV9vdXRGcmFtZUJ1ZiB8fCAhcGZyYW1lKQorICAgICAgICByZXR1cm4gLTE7CisKKwl3aGlsZSAoKG1fb3V0T2Zmc2V0IC0gbV9vdXRSZWFkT2Zmc2V0KSA+IDQpCisgICAgeworICAgICAgICBpbnQgZnJhbWVfbGVuZ3RoID0gZ2V0RnJhbWVMZW5ndGgobV9vdXRGcmFtZUJ1ZiArIG1fb3V0UmVhZE9mZnNldCk7CisKKyAgICAgICAgaWYgKGZyYW1lX2xlbmd0aCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fb3V0UmVhZE9mZnNldCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZyYW1lX2xlbmd0aCA8PSAobV9vdXRPZmZzZXQgLSBtX291dFJlYWRPZmZzZXQpKQorICAgICAgICB7CisgICAgICAgICAgICAqcGZyYW1lID0gbV9vdXRGcmFtZUJ1ZiArIG1fb3V0UmVhZE9mZnNldDsKKyAgICAgICAgICAgIG1fb3V0UmVhZE9mZnNldCArPSBmcmFtZV9sZW5ndGg7CisKKyAgICAgICAgICAgIG1fZnJhbWVDb3VudCsrOworCisgICAgICAgICAgICAvLyBkb24ndCBkZWxpdmVyIHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgZnJhbWVzCisgICAgICAgICAgICBpZiAobV9mcmFtZUNvdW50ICE9IDEgJiYgIShtX2JGaW5pc2hlZCAmJiAobV9vdXRPZmZzZXQgLSBtX291dFJlYWRPZmZzZXQpIDwgNSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lX2xlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybnMgYmxvY2sgb2YgYSBtcDMgZmlsZSwgd2l0Y2ggc2l6ZSBpbnRlZ2VyIG11bHRpcGxlcyBvZiBjYkFsaWduCisvLyBvciBub3QgYWxpZ25lZCBpZiBmaW5pc2hlZAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2ludCBDRW5jb2Rlcjo6R2V0QmxvY2tBbGlnbmVkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiogcGJsb2NrLCBpbnQqIHBpQnVmZmVyU2l6ZSwgY29uc3QgbG9uZyYgY2JBbGlnbikKK3sKKwlBU1NFUlQocGlCdWZmZXJTaXplKTsKKyAgICBpZiAoIXBnZiB8fCAhbV9vdXRGcmFtZUJ1ZiB8fCAhcGJsb2NrKQorICAgICAgICByZXR1cm4gLTE7CisKKwlpbnQgaUJsb2NrTGVuID0gbV9vdXRPZmZzZXQgLSBtX291dFJlYWRPZmZzZXQ7CisJQVNTRVJUKGlCbG9ja0xlbiA+PSAwKTsKKwkKKwlpZighbV9iRmluaXNoZWQpCisJeworCQlpZihjYkFsaWduID4gMCkKKwkJCWlCbG9ja0xlbi09aUJsb2NrTGVuJWNiQWxpZ247CisJCSpwaUJ1ZmZlclNpemUgPSBpQmxvY2tMZW47CisJfQorCWVsc2UKKwl7CisJCWlmKGNiQWxpZ24gJiYgaUJsb2NrTGVuJWNiQWxpZ24pCisJCXsKKwkJCSpwaUJ1ZmZlclNpemUgPSBpQmxvY2tMZW4gKyBjYkFsaWduIC0gaUJsb2NrTGVuJWNiQWxpZ247CisJCX0KKwkJZWxzZQorCQl7CisJCQkqcGlCdWZmZXJTaXplID0gaUJsb2NrTGVuOworCQl9CisJfQorCisJaWYoaUJsb2NrTGVuKSB7CisJCSpwYmxvY2sgPSBtX291dEZyYW1lQnVmICsgbV9vdXRSZWFkT2Zmc2V0OworCQltX291dFJlYWRPZmZzZXQrPWlCbG9ja0xlbjsKKwl9CisKKwlyZXR1cm4gaUJsb2NrTGVuOworfQorCitIUkVTVUxUIENFbmNvZGVyOjptYXliZVN5bmNXb3JkKElTdHJlYW0gKnBTdHJlYW0pCit7CisJSFJFU1VMVCBociA9IFNfT0s7CisgICAgdW5zaWduZWQgY2hhciBtcDNfZnJhbWVfaGVhZGVyWzRdOworCVVMT05HIG5ieXRlczsKKwlpZihGQUlMRUQoaHIgPSBwU3RyZWFtLT5SZWFkKG1wM19mcmFtZV9oZWFkZXIsIHNpemVvZihtcDNfZnJhbWVfaGVhZGVyKSwgJm5ieXRlcykpKQorCQlyZXR1cm4gaHI7CisJCisgICAgaWYgKCBuYnl0ZXMgIT0gc2l6ZW9mKG1wM19mcmFtZV9oZWFkZXIpICkgeworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KKyAgICBpZiAoIG1wM19mcmFtZV9oZWFkZXJbMF0gIT0gMHhmZnUgKSB7CisgICAgICAgIHJldHVybiBTX0ZBTFNFOyAvKiBkb2Vzbid0IGxvb2sgbGlrZSBhIHN5bmMgd29yZCAqLworICAgIH0KKyAgICBpZiAoIChtcDNfZnJhbWVfaGVhZGVyWzFdICYgMHhFMHUpICE9IDB4RTB1ICkgeworCQlyZXR1cm4gU19GQUxTRTsgLyogZG9lc24ndCBsb29rIGxpa2UgYSBzeW5jIHdvcmQgKi8KKyAgICB9CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgQ0VuY29kZXI6OnNraXBJZDN2MihJU3RyZWFtICpwU3RyZWFtLCBzaXplX3QgbGFtZXRhZ19mcmFtZV9zaXplKQoreworCUhSRVNVTFQgaHIgPSBTX09LOworICAgIFVMT05HICBuYnl0ZXM7CisgICAgc2l6ZV90ICBpZDN2MlRhZ1NpemUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgaWQzdjJIZWFkZXJbMTBdOworCUxBUkdFX0lOVEVHRVIgc2Vla1RvOworCisgICAgLyogc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0gKi8KKwlzZWVrVG8uUXVhZFBhcnQgPSAwOworCWlmIChGQUlMRUQoaHIgPSBwU3RyZWFtLT5TZWVrKHNlZWtUbywgIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpKSB7CisgICAgICAgIHJldHVybiBocjsgIC8qIG5vdCBzZWVrYWJsZSwgYWJvcnQgKi8KKyAgICB9CisgICAgLyogcmVhZCAxMCBieXRlcyBpbiBjYXNlIHRoZXJlJ3MgYW4gSUQzIHZlcnNpb24gMiBoZWFkZXIgaGVyZSAqLworCWhyID0gcFN0cmVhbS0+UmVhZChpZDN2MkhlYWRlciwgc2l6ZW9mKGlkM3YySGVhZGVyKSwgJm5ieXRlcyk7CisgICAgaWYgKEZBSUxFRChocikpCisJCXJldHVybiBocjsKKwlpZihuYnl0ZXMgIT0gc2l6ZW9mKGlkM3YySGVhZGVyKSkgeworICAgICAgICByZXR1cm4gRV9GQUlMOyAgLyogbm90IHJlYWRhYmxlLCBtYXliZSBvcGVuZWQgV3JpdGUtT25seSAqLworICAgIH0KKyAgICAvKiBkb2VzIHRoZSBzdHJlYW0gYmVnaW4gd2l0aCB0aGUgSUQzIHZlcnNpb24gMiBmaWxlIGlkZW50aWZpZXI/ICovCisgICAgaWYgKCFzdHJuY21wKChjaGFyICopIGlkM3YySGVhZGVyLCAiSUQzIiwgMykpIHsKKyAgICAgICAgLyogdGhlIHRhZyBzaXplIChtaW51cyB0aGUgMTAtYnl0ZSBoZWFkZXIpIGlzIGVuY29kZWQgaW50byBmb3VyCisgICAgICAgICogYnl0ZXMgd2hlcmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIGNsZWFyIGluIGVhY2ggYnl0ZQorICAgICAgICAqLworICAgICAgICBpZDN2MlRhZ1NpemUgPSAoKChpZDN2MkhlYWRlcls2XSAmIDB4N2YpIDw8IDIxKQorICAgICAgICAgICAgfCAoKGlkM3YySGVhZGVyWzddICYgMHg3ZikgPDwgMTQpCisgICAgICAgICAgICB8ICgoaWQzdjJIZWFkZXJbOF0gJiAweDdmKSA8PCA3KQorICAgICAgICAgICAgfCAoaWQzdjJIZWFkZXJbOV0gJiAweDdmKSkKKyAgICAgICAgICAgICsgc2l6ZW9mIGlkM3YySGVhZGVyOworICAgIH0KKyAgICAvKiBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHN0cmVhbSAqLworCXNlZWtUby5RdWFkUGFydCA9IGlkM3YyVGFnU2l6ZTsKKwlpZiAoRkFJTEVEKGhyID0gcFN0cmVhbS0+U2VlayhzZWVrVG8sIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpKSB7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisgICAgaWYgKFNfT0sgIT0gKGhyID0gbWF5YmVTeW5jV29yZChwU3RyZWFtKSkpIHsKKwkJcmV0dXJuIFNVQ0NFRURFRChocik/RV9GQUlMOmhyOworICAgIH0KKwlzZWVrVG8uUXVhZFBhcnQgPSBpZDN2MlRhZ1NpemUrbGFtZXRhZ19mcmFtZV9zaXplOworCWlmIChGQUlMRUQoaHIgPSBwU3RyZWFtLT5TZWVrKHNlZWtUbywgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSkpIHsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKyAgICBpZiAoU19PSyAhPSAoaHIgPSBtYXliZVN5bmNXb3JkKHBTdHJlYW0pKSkgeworICAgICAgICByZXR1cm4gU1VDQ0VFREVEKGhyKT9FX0ZBSUw6aHI7CisgICAgfQorICAgIC8qIE9LLCBpdCBzZWVtcyB3ZSBmb3VuZCBvdXIgTEFNRS1UYWcvWGluZyBmcmFtZSBhZ2FpbiAqLworICAgIC8qIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gc3RyZWFtICovCisJc2Vla1RvLlF1YWRQYXJ0ID0gaWQzdjJUYWdTaXplOworCWlmIChGQUlMRUQoaHIgPSBwU3RyZWFtLT5TZWVrKHNlZWtUbywgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSkpIHsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKyAgICByZXR1cm4gU19PSzsKK30KKworLy8gVXBkYXRlcyBWQlIgdGFnCitIUkVTVUxUIENFbmNvZGVyOjp1cGRhdGVMYW1lVGFnRnJhbWUoSVN0cmVhbSogcFN0cmVhbSkKK3sKKwlIUkVTVUxUIGhyID0gU19PSzsKKwlzaXplX3QgbiA9IGxhbWVfZ2V0X2xhbWV0YWdfZnJhbWUoIHBnZiwgMCwgMCApOyAvKiBhc2sgZm9yIGJ1ZmVyIHNpemUgKi8KKworICAgIGlmICggbiA+IDAgKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyID0gMDsKKyAgICAgICAgVUxPTkcgbSA9IG47CisKKyAgICAgICAgaWYgKCBGQUlMRUQoaHIgPSBza2lwSWQzdjIocFN0cmVhbSwgbikgKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qRGlzcEVyciggIkVycm9yIHVwZGF0aW5nIExBTUUtdGFnIGZyYW1lOlxuXG4iCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9jYXRlIG9sZCBmcmFtZVxuIiApOyovCisgICAgICAgICAgICByZXR1cm4gaHI7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIgPSAodW5zaWduZWQgY2hhciopbWFsbG9jKCBuICk7CisKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gMCApIAorICAgICAgICB7CisgICAgICAgICAgICAvKkRpc3BFcnIoICJFcnJvciB1cGRhdGluZyBMQU1FLXRhZyBmcmFtZTpcblxuIgorICAgICAgICAgICAgICAgICAgICAgImNhbid0IGFsbG9jYXRlIGZyYW1lIGJ1ZmZlclxuIiApOyovCisgICAgICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFB1dCBpdCBhbGwgdG8gZGlzayBhZ2FpbiAqLworICAgICAgICBuID0gbGFtZV9nZXRfbGFtZXRhZ19mcmFtZSggcGdmLCBidWZmZXIsIG4gKTsKKyAgICAgICAgaWYgKCBuID4gMCApIAorICAgICAgICB7CisJCQlociA9IHBTdHJlYW0tPldyaXRlKGJ1ZmZlciwgbiwgJm0pOyAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZnJlZSggYnVmZmVyICk7CisKKyAgICAgICAgaWYgKCBtICE9IG4gKSAKKyAgICAgICAgeworICAgICAgICAgICAgLypEaXNwRXJyKCAiRXJyb3IgdXBkYXRpbmcgTEFNRS10YWcgZnJhbWU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCB3cml0ZSBmcmFtZSBpbnRvIGZpbGVcbiIgKTsqLworCQkJcmV0dXJuIEVfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaHI7Cit9CmRpZmYgLS1naXQgYS9kc2hvdy9FbmNvZGVyLmggYi9kc2hvdy9FbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3OTRkYwotLS0gL2Rldi9udWxsCisrKyBiL2RzaG93L0VuY29kZXIuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqICBMQU1FIE1QMyBlbmNvZGVyIGZvciBEaXJlY3RTaG93CisgKiAgTEFNRSBlbmNvZGVyIHdyYXBwZXIKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWFyaWUgT3Jsb3ZhLCBQZXRlciBHdWJhbm92LCBWaXRhbHkgSXZhbm92LCBFbGVjYXJkIEx0ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZiAhZGVmaW5lZChBRlhfVklURUNFTkNPREVSX0hfXzQwREM4QTQ0X0I5MzdfMTFEMl9BMzgxX0EyRkQ3QzM3RkExNV9fSU5DTFVERURfKQorI2RlZmluZSBBRlhfVklURUNFTkNPREVSX0hfXzQwREM4QTQ0X0I5MzdfMTFEMl9BMzgxX0EyRkQ3QzM3RkExNV9fSU5DTFVERURfCisKKyNpZiBfTVNDX1ZFUiA+PSAxMDAwCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUiA+PSAxMDAwCisKKyNpbmNsdWRlIDxsYW1lLmg+CisKKworY29uc3QgdW5zaWduZWQgaW50IGR3Qml0UmF0ZVZhbHVlWzJdWzE0XSA9Cit7CisgICAgezMyLDQwLDQ4LDU2LDY0LDgwLDk2LDExMiwxMjgsMTYwLDE5MiwyMjQsMjU2LDMyMH0sICAgICAvLyBNUEVHLTEKKyAgICB7OCwxNiwyNCwzMiw0MCw0OCw1Niw2NCw4MCw5NiwxMTIsMTI4LDE0NCwxNjB9ICAgICAgICAgIC8vIE1QRUctMi8yLjUKK307CisvKgorI2RlZmluZSBTVEVSRU8gICAgICAgICAgIDAKKyNkZWZpbmUgSk9JTlRfU1RFUkVPICAgICAxCisjZGVmaW5lIERVQUxfQ0hBTk5FTCAgICAgMgorI2RlZmluZSBNT05PICAgICAgICAgICAgIDMKKyovCisKKyNkZWZpbmUgT1VUX0JVRkZFUl9TSVpFICAgICAgICAgICAgIDE2Mzg0CisjZGVmaW5lIE9VVF9CVUZGRVJfR1VBUkQgICAgICAgICAgICA4MTkyCisKKyNkZWZpbmUgT1VUX0JVRkZFUl9NQVggICAgICAgICAgICAgIChPVVRfQlVGRkVSX1NJWkUgLSBPVVRfQlVGRkVSX0dVQVJEKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRFdPUkQgICBkd1NhbXBsZVJhdGU7ICAgICAgICAgICAgICAgICAgIC8vU0YgaW4gSHoKKyAgICBEV09SRCAgIGR3Qml0cmF0ZTsgICAgICAgICAgICAgICAgICAgICAgLy9CUiBpbiBiaXQgcGVyIHNlY29uZAorICAgIHZicl9tb2RlICAgIHZtVmFyaWFibGU7CisgICAgRFdPUkQgICBkd1ZhcmlhYmxlTWluOyAgICAgICAgICAgICAgICAgIC8vc3BlY2lmeSBhIG1pbmltdW0gYWxsb3dlZCBiaXRyYXRlCisgICAgRFdPUkQgICBkd1ZhcmlhYmxlTWF4OyAgICAgICAgICAgICAgICAgIC8vc3BlY2lmeSBhIG1heGltdW0gYWxsb3dlZCBiaXRyYXRlCisgICAgRFdPUkQgICBkd1F1YWxpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8vRW5jb2RpbmcgcXVhbGl0eQorICAgIERXT1JEICAgZHdWQlJxOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWQlIgcXVhbGl0eSBzZXR0aW5nICgwPWhpZ2hlc3QgcXVhbGl0eSwgOT1sb3dlc3QpICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGxvbmcgICAgbExheWVyOyAgICAgICAgICAgICAgICAgICAgICAgICAvL0xheWVyOiAxIG9yIDIKKworICAgIE1QRUdfbW9kZSBDaE1vZGU7ICAgICAgICAgICAgICAgICAgICAgICAvL0NoYW5uZWwgY29kaW5nIG1vZGU6IHNlZSBkb2MKKyAgICBEV09SRCAgIGR3Rm9yY2VNUzsKKworICAgIERXT1JEICAgYkNSQ1Byb3RlY3Q7ICAgICAgICAgICAgICAgICAgICAvL0lzIENSQyBwcm90ZWN0aW9uIGFjdGl2YXRlZD8KKyAgICBEV09SRCAgIGJGb3JjZU1vbm87CisgICAgRFdPUkQgICBiU2V0RHVyYXRpb247CisgICAgRFdPUkQgICBiQ29weXJpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8vSXMgdGhlIHN0cmVhbSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0PworICAgIERXT1JEICAgYk9yaWdpbmFsOyAgICAgICAgICAgICAgICAgICAgICAvL0lzIHRoZSBzdHJlYW0gYW4gb3JpZ2luYWw/CisKKyAgICBEV09SRCAgIGR3UEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUEVTIGhlYWRlci4gT2Jzb2xldGUKKworICAgIERXT1JEICAgZHdFbmZvcmNlVkJSbWluOworICAgIERXT1JEICAgZHdWb2ljZU1vZGU7CisgICAgRFdPUkQgICBkd0tlZXBBbGxGcmVxOworICAgIERXT1JEICAgZHdTdHJpY3RJU087CisgICAgRFdPUkQgICBkd05vU2hvcnRCbG9jazsKKyAgICBEV09SRCAgIGR3WGluZ1RhZzsKKyAgICBEV09SRCAgIGR3TW9kZUZpeGVkOworICAgIERXT1JEICAgYlNhbXBsZU92ZXJsYXA7Cit9IE1QRUdfRU5DT0RFUl9DT05GSUc7CisKKworY2xhc3MgQ0VuY29kZXIKK3sKK3B1YmxpYzoKKworICAgIENFbmNvZGVyKCk7CisgICAgdmlydHVhbCB+Q0VuY29kZXIoKTsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciB3aXRoIFBDTSBzdHJlYW0gcHJvcGVydGllcworICAgIEhSRVNVTFQgU2V0SW5wdXRUeXBlKExQV0FWRUZPUk1BVEVYIGxwd2ZleCwgYm9vbCBiSnVzdENoZWNrID0gRkFMU0UpOyAgIC8vIHJldHVybnMgRV9JTlZBTElEQVJHIGlmIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyBHZXRJbnB1dFR5cGUgLSByZXR1cm5zIGN1cnJlbnQgaW5wdXQgdHlwZQorICAgIEhSRVNVTFQgR2V0SW5wdXRUeXBlKFdBVkVGT1JNQVRFWCAqcHdmZXgpCisgICAgeworICAgICAgICBpZihtX2JJbnB1VHlwZVNldCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KHB3ZmV4LCAmbV93ZmV4LCBzaXplb2YoV0FWRUZPUk1BVEVYKSk7CisgICAgICAgICAgICByZXR1cm4gU19PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRV9VTkVYUEVDVEVEOworICAgIH0KKworICAgIC8vIFNldCBNUEVHIGF1ZGlvIHBhcmFtZXRlcnMKKyAgICBIUkVTVUxUIFNldE91dHB1dFR5cGUoTVBFR19FTkNPREVSX0NPTkZJRyAmbWFic2kpOyAgICAgIC8vIHJldHVybnMgRV9JTlZBTElEQVJHIGlmIG5vdCBzdXBwb3J0ZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBjb21wYXRpYmxlIHdpdGggaW5wdXQgdHlwZQorICAgIC8vIFJldHVybiBjdXJyZW50IE1QRUcgYXVkaW8gc2V0dGluZ3MKKyAgICBIUkVTVUxUIEdldE91dHB1dFR5cGUoTVBFR19FTkNPREVSX0NPTkZJRyogcG1hYnNpKQorICAgIHsKKyAgICAgICAgaWYgKG1fYk91dHB1VHlwZVNldCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KHBtYWJzaSwgJm1fbWFic2ksIHNpemVvZihNUEVHX0VOQ09ERVJfQ09ORklHKSk7CisgICAgICAgICAgICByZXR1cm4gU19PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRV9VTkVYUEVDVEVEOworICAgIH0KKworICAgIC8vIFNldCBpZiBvdXRwdXQgc3RyZWFtIGlzIGEgUEVTLiBPYnNvbGV0ZQorICAgIHZvaWQgU2V0UEVTKGJvb2wgYlBFUykKKyAgICB7CisgICAgICAgIG1fbWFic2kuZHdQRVMgPSBmYWxzZTsvL2JQRVM7CisgICAgfQorICAgIC8vIElzIG91dHB1dCBzdHJlYW0gYSBQRVMuIE9ic29sZXRlCisgICAgQk9PTCBJc1BFUygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKEJPT0wpbV9tYWJzaS5kd1BFUzsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgU0RLCisgICAgSFJFU1VMVCBJbml0KCk7CisgICAgLy8gQ2xvc2UgZW5jb2RlciBTREsKKyAgICBIUkVTVUxUIENsb3NlKElTdHJlYW0qIHBTdHJlYW0pOworCisgICAgLy8gRW5jb2RlIG1lZGlhIHNhbXBsZSBkYXRhCisgICAgaW50IEVuY29kZShjb25zdCBzaG9ydCAqIHBkYXRhLCBpbnQgZGF0YV9zaXplKTsKKyAgICBpbnQgR2V0RnJhbWUoY29uc3QgdW5zaWduZWQgY2hhciAqKiBwZnJhbWUpOworCQorCS8vIFJldHVybnMgYmxvY2sgb2YgYSBtcDMgZmlsZSwgd2l0Y2ggc2l6ZSBpbnRlZ2VyIG11bHRpcGxlcyBvZiBjYkFsaWduCisJaW50IEdldEJsb2NrQWxpZ25lZChjb25zdCB1bnNpZ25lZCBjaGFyICoqIHBibG9jaywgaW50KiBwaUJ1ZmZlclNpemUsIGNvbnN0IGxvbmcmIGNiQWxpZ24pOworCisgICAgSFJFU1VMVCBGaW5pc2goKTsKKworcHJvdGVjdGVkOgorCUhSRVNVTFQgdXBkYXRlTGFtZVRhZ0ZyYW1lKElTdHJlYW0qIHBTdHJlYW0pOworCUhSRVNVTFQgc2tpcElkM3YyKElTdHJlYW0gKnBTdHJlYW0sIHNpemVfdCBsYW1ldGFnX2ZyYW1lX3NpemUpOworCUhSRVNVTFQgbWF5YmVTeW5jV29yZChJU3RyZWFtICpwU3RyZWFtKTsKKyAgICBIUkVTVUxUIFNldERlZmF1bHRPdXRwdXRUeXBlKExQV0FWRUZPUk1BVEVYIGxwd2ZleCk7CisKKyAgICAvLyBJbnB1dCBtZWRpYSB0eXBlCisgICAgV0FWRUZPUk1BVEVYICAgICAgICBtX3dmZXg7CisKKyAgICAvLyBPdXRwdXQgbWVkaWEgdHlwZQorICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbV9tYWJzaTsKKworICAgIC8vIENvbXByZXNzb3IgcHJpdmF0ZSBkYXRhCisgICAgbGFtZV9nbG9iYWxfZmxhZ3MgKiBwZ2Y7CisKKyAgICAvLyBDb21wcmVzc29yIG1pc2NlbGFuZW91cyBzdGF0ZQorICAgIEJPT0wgICAgICAgICAgICAgICAgbV9iSW5wdVR5cGVTZXQ7CisgICAgQk9PTCAgICAgICAgICAgICAgICBtX2JPdXRwdVR5cGVTZXQ7CisKKyAgICBCT09MICAgICAgICAgICAgICAgIG1fYkZpbmlzaGVkOworICAgIGludCAgICAgICAgICAgICAgICAgbV9mcmFtZUNvdW50OworCisgICAgdW5zaWduZWQgY2hhciAqICAgICBtX291dEZyYW1lQnVmOworICAgIGludCAgICAgICAgICAgICAgICAgbV9vdXRPZmZzZXQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBtX291dFJlYWRPZmZzZXQ7CisKKyAgICBDQ3JpdFNlYyAgICAgICAgICAgIG1fbG9jazsKK307CisKKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfVklURUNFTkNPREVSX0hfXzQwREM4QTQ0X0I5MzdfMTFEMl9BMzgxX0EyRkQ3QzM3RkExNV9fSU5DTFVERURfKQpkaWZmIC0tZ2l0IGEvZHNob3cvTWFrZWZpbGUuYW0gYi9kc2hvdy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUwYTllCi0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNyBAQAorIyMgJElkOiBNYWtlZmlsZS5hbSx2IDEuNSAyMDAxLzAyLzE4IDEyOjExOjEwIGFsZWlkaW5nZXIgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCitFWFRSQV9ESVNUID0gXAorCUVuY29kZXIuY3BwIFwKKwlFbmNvZGVyLmggXAorCU1wZWdhYy5jcHAgXAorCU1wZWdhYy5kZWYgXAorCU1wZWdhYy5oIFwKKwlQcm9wUGFnZS5jcHAgXAorCVByb3BQYWdlLmggXAorCVByb3BQYWdlX2Fkdi5jcHAgXAorCVByb3BQYWdlX2Fkdi5oIFwKKwlQcm9wZXJ0eS5yYyBcCisJUkVBRE1FIFwKKwlSRUcuQ1BQIFwKKwlSRUcuSCBcCisJVUlEUy5IIFwKKwlhYm91dHBycC5jcHAgXAorCWFib3V0cHJwLmggXAorCWRzaG93LmRzcCBcCisJZHNob3cuZHN3IFwKKwllbG9nby5pY28gXAorCWlhdWRpb3Byb3BzLmggXAorCXJlc291cmNlLmgKKwpkaWZmIC0tZ2l0IGEvZHNob3cvTWFrZWZpbGUuaW4gYi9kc2hvdy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc2MDRkCi0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNzggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gUkVBRE1FICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAorCSQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCitzdWJkaXIgPSBkc2hvdworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NPTkZJR19ERUZTID0gQENPTkZJR19ERUZTQAorQ09ORklHX01BVEhfTElCID0gQENPTkZJR19NQVRIX0xJQkAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQVUNDT0RFID0gQENQVUNDT0RFQAorQ1BVVFlQRSA9IEBDUFVUWVBFQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRUNITyA9IEBFQ0hPQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRjc3ID0gQEY3N0AKK0ZGTEFHUyA9IEBGRkxBR1NACitGUk9OVEVORF9DRkxBR1MgPSBARlJPTlRFTkRfQ0ZMQUdTQAorRlJPTlRFTkRfTERBREQgPSBARlJPTlRFTkRfTERBRERACitGUk9OVEVORF9MREZMQUdTID0gQEZST05URU5EX0xERkxBR1NACitHUkVQID0gQEdSRVBACitHVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACitHVEtfQ09ORklHID0gQEdUS19DT05GSUdACitHVEtfTElCUyA9IEBHVEtfTElCU0AKK0lOQ0xVREVTID0gQElOQ0xVREVTQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREFERCA9IEBMREFEREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMSUJfTUFKT1JfVkVSU0lPTiA9IEBMSUJfTUFKT1JfVkVSU0lPTkAKK0xJQl9NSU5PUl9WRVJTSU9OID0gQExJQl9NSU5PUl9WRVJTSU9OQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRURFUCA9IEBNQUtFREVQQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOQVNNID0gQE5BU01ACitOQVNNX0ZPUk1BVCA9IEBOQVNNX0ZPUk1BVEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUk1fRiA9IEBSTV9GQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTTkRGSUxFX0NGTEFHUyA9IEBTTkRGSUxFX0NGTEFHU0AKK1NOREZJTEVfTElCUyA9IEBTTkRGSUxFX0xJQlNACitTVFJJUCA9IEBTVFJJUEAKK1UgPSBAVUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJVEhfRlJPTlRFTkQgPSBAV0lUSF9GUk9OVEVOREAKK1dJVEhfTVAzUlRQID0gQFdJVEhfTVAzUlRQQAorV0lUSF9NUDNYID0gQFdJVEhfTVAzWEAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FVVE9NQUtFX09QVElPTlMgPSAxLjkgZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCitFWFRSQV9ESVNUID0gXAorCUVuY29kZXIuY3BwIFwKKwlFbmNvZGVyLmggXAorCU1wZWdhYy5jcHAgXAorCU1wZWdhYy5kZWYgXAorCU1wZWdhYy5oIFwKKwlQcm9wUGFnZS5jcHAgXAorCVByb3BQYWdlLmggXAorCVByb3BQYWdlX2Fkdi5jcHAgXAorCVByb3BQYWdlX2Fkdi5oIFwKKwlQcm9wZXJ0eS5yYyBcCisJUkVBRE1FIFwKKwlSRUcuQ1BQIFwKKwlSRUcuSCBcCisJVUlEUy5IIFwKKwlhYm91dHBycC5jcHAgXAorCWFib3V0cHJwLmggXAorCWRzaG93LmRzcCBcCisJZHNob3cuZHN3IFwKKwllbG9nby5pY28gXAorCWlhdWRpb3Byb3BzLmggXAorCXJlc291cmNlLmgKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgZHNob3cvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGRzaG93L01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9kc2hvdy9NcGVnYWMuY3BwIGIvZHNob3cvTXBlZ2FjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg2MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvTXBlZ2FjLmNwcApAQCAtMCwwICsxLDIwMjUgQEAKKy8qCisgKiAgTEFNRSBNUDMgZW5jb2RlciBmb3IgRGlyZWN0U2hvdworICogIERpcmVjdFNob3cgZmlsdGVyIGltcGxlbWVudGF0aW9uCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1hcmllIE9ybG92YSwgUGV0ZXIgR3ViYW5vdiwgVml0YWx5IEl2YW5vdiwgRWxlY2FyZCBMdGQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyZWFtcy5oPgorI2luY2x1ZGUgPG9sZWN0bC5oPgorI2luY2x1ZGUgPGluaXRndWlkLmg+CisvLyNpbmNsdWRlIDxvbGVjdGxpZC5oPgorI2luY2x1ZGUgInVpZHMuaCIKKyNpbmNsdWRlICJpYXVkaW9wcm9wcy5oIgorI2luY2x1ZGUgIm1wZWdhYy5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCisKKyNpbmNsdWRlICJQcm9wUGFnZS5oIgorI2luY2x1ZGUgIlByb3BQYWdlX2Fkdi5oIgorI2luY2x1ZGUgImFib3V0cHJwLmgiCisKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiUmVnLmgiCisKKyNpZm5kZWYgX0lOQ19NTVJFRworI2luY2x1ZGUgPG1tcmVnLmg+CisjZW5kaWYKKworLy8gZGVmYXVsdCBwYXJhbWV0ZXJzCisjZGVmaW5lICAgICAgICAgREVGQVVMVF9MQVlFUiAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX1NURVJFT19NT0RFICAgICAgICAgSk9JTlRfU1RFUkVPCisjZGVmaW5lICAgICAgICAgREVGQVVMVF9GT1JDRV9NUyAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX01PREVfRklYRUQgICAgICAgICAgMAorI2RlZmluZSAgICAgICAgIERFRkFVTFRfRU5GT1JDRV9NSU4gICAgICAgICAwCisjZGVmaW5lICAgICAgICAgREVGQVVMVF9WT0lDRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX0tFRVBfQUxMX0ZSRVEgICAgICAgMAorI2RlZmluZSAgICAgICAgIERFRkFVTFRfU1RSSUNUX0lTTyAgICAgICAgICAwCisjZGVmaW5lICAgICAgICAgREVGQVVMVF9ESVNBQkxFX1NIT1JUX0JMT0NLIDAKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX1hJTkdfVEFHICAgICAgICAgICAgMAorI2RlZmluZSAgICAgICAgIERFRkFVTFRfU0FNUExFX1JBVEUgICAgICAgICA0NDEwMAorI2RlZmluZSAgICAgICAgIERFRkFVTFRfQklUUkFURSAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX1ZBUklBQkxFICAgICAgICAgICAgMAorI2RlZmluZSAgICAgICAgIERFRkFVTFRfQ1JDICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICAgICAgREVGQVVMVF9GT1JDRV9NT05PICAgICAgICAgIDAKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX1NFVF9EVVJBVElPTiAgICAgICAgMQorI2RlZmluZSAgICAgICAgIERFRkFVTFRfU0FNUExFX09WRVJMQVAgICAgICAxCisjZGVmaW5lICAgICAgICAgREVGQVVMVF9DT1BZUklHSFQgICAgICAgICAgIDAKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX09SSUdJTkFMICAgICAgICAgICAgMAorI2RlZmluZSAgICAgICAgIERFRkFVTFRfVkFSSUFCTEVNSU4gICAgICAgICA4MAorI2RlZmluZSAgICAgICAgIERFRkFVTFRfVkFSSUFCTEVNQVggICAgICAgICAxNjAKKyNkZWZpbmUgICAgICAgICBERUZBVUxUX0VOQ09ESU5HX1FVQUxJVFkgICAgNQorI2RlZmluZSAgICAgICAgIERFRkFVTFRfVkJSX1FVQUxJVFkgICAgICAgICA0CisjZGVmaW5lICAgICAgICAgREVGQVVMVF9QRVMgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSAgICAgICAgIERFRkFVTFRfRklMVEVSX01FUklUICAgICAgICBNRVJJVF9ET19OT1RfVVNFICAgICAgICAgICAgICAgIC8vIFN0YW5kYXJkIGNvbXByZXNzb3IgbWVyaXQgdmFsdWUKKworI2RlZmluZSBHRVRfREFUQVJBVEUoa2JwcykgKGticHMgKiAxMDAwIC8gOCkKKyNkZWZpbmUgR0VUX0ZSQU1FTEVOR1RIKGJpdHJhdGUsIHNhbXBsZV9yYXRlKSAoKFdPUkQpKCgoc2FtcGxlX3JhdGUgPCAzMjAwMCA/IDcyMDAwIDogMTQ0MDAwKSAqIChiaXRyYXRlKSkvKHNhbXBsZV9yYXRlKSkpCisjZGVmaW5lIERFQ0xBUkVfUFRSKHR5cGUsIHB0ciwgZXhwcikgdHlwZSogcHRyID0gKHR5cGUqKShleHByKTsKKworLy8gQ3JlYXRlIGEgbGlzdCBvZiBhbGwgKG9yIG1vc3RseSBhbGwpIG9mIHRoZSBlbmNvZGVyIENCUiBvdXRwdXQgY2FwYWJpbGl0aWVzIHdoaWNoCisvLyB3aWxsIGJlIHBhcnNlZCBpbnRvIGEgbGlzdCBvZiBjYXBhYmlsaXRpZXMgdXNlZCBieSB0aGUgSUFNU3RyZWFtQ29uZmlnIEludGVyZmFjZQorb3V0cHV0X2NhcHNfdCBPdXRwdXRDYXBhYmlsaXRpZXNbXSA9IAoreyAvLyB7U2FtcGxlUmF0ZSwgQml0UmF0ZX0KKyAgICB7IDQ4MDAwLCAzMjAgfSx7IDQ4MDAwLCAyNTYgfSx7IDQ4MDAwLCAyMjQgfSx7IDQ4MDAwLCAxOTIgfSwgICAgICAgICAgICAvLyBNUEVHIDEuMCBTcGVjIEAgNDhLSHoKKyAgICB7IDQ4MDAwLCAxNjAgfSx7IDQ4MDAwLCAxMjggfSx7IDQ4MDAwLCAxMTIgfSx7IDQ4MDAwLCA5NiB9LAorICAgIHsgNDgwMDAsIDgwIH0seyA0ODAwMCwgNjQgfSx7IDQ4MDAwLCA1NiB9LHsgNDgwMDAsIDQ4IH0sCisgICAgeyA0ODAwMCwgNDAgfSx7IDQ4MDAwLCAzMiB9LAorCisgICAgeyAyNDAwMCwgMTYwIH0seyAyNDAwMCwgMTQ0IH0seyAyNDAwMCwgMTI4IH0seyAyNDAwMCwgMTEyIH0sICAgICAgICAgICAgLy8gTVBFRyAyLjAgU3BlYyBAIDI0S0h6CisgICAgeyAyNDAwMCwgOTYgfSx7IDI0MDAwLCA4MCB9LHsgMjQwMDAsIDY0IH0seyAyNDAwMCwgNTYgfSwKKyAgICB7IDI0MDAwLCA0OCB9LHsgMjQwMDAsIDQwIH0seyAyNDAwMCwgMzIgfSx7IDI0MDAwLCAyNCB9LAorICAgIHsgMjQwMDAsIDE2IH0seyAyNDAwMCwgOCB9LAorCisgICAgeyAxMjAwMCwgNjQgfSx7IDEyMDAwLCA1NiB9LHsgMTIwMDAsIDQ4IH0seyAxMjAwMCwgNDAgfSwgICAgICAgICAgICAgICAgLy8gTVBFRyAyLjUgU3BlYyBAIDEyS0h6CisgICAgeyAxMjAwMCwgMzIgfSx7IDEyMDAwLCAyNCB9LHsgMTIwMDAsIDE2IH0seyAxMjAwMCwgOCB9LAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgeyA0NDEwMCwgMzIwIH0seyA0NDEwMCwgMjU2IH0seyA0NDEwMCwgMjI0IH0seyA0NDEwMCwgMTkyIH0sICAgICAgICAgICAgLy8gTVBFRyAxLjAgU3BlYyBAIDQ0LjFLSHoKKyAgICB7IDQ0MTAwLCAxNjAgfSx7IDQ0MTAwLCAxMjggfSx7IDQ0MTAwLCAxMTIgfSx7IDQ0MTAwLCA5NiB9LAorICAgIHsgNDQxMDAsIDgwIH0seyA0NDEwMCwgNjQgfSx7IDQ0MTAwLCA1NiB9LHsgNDQxMDAsIDQ4IH0sCisgICAgeyA0NDEwMCwgNDAgfSx7IDQ0MTAwLCAzMiB9LAorCisgICAgeyAyMjA1MCwgMTYwIH0seyAyMjA1MCwgMTQ0IH0seyAyMjA1MCwgMTI4IH0seyAyMjA1MCwgMTEyIH0sICAgICAgICAgICAgLy8gTVBFRyAyLjAgU3BlYyBAIDIyLjA1S0h6CisgICAgeyAyMjA1MCwgOTYgfSx7IDIyMDUwLCA4MCB9LHsgMjIwNTAsIDY0IH0seyAyMjA1MCwgNTYgfSwKKyAgICB7IDIyMDUwLCA0OCB9LHsgMjIwNTAsIDQwIH0seyAyMjA1MCwgMzIgfSx7IDIyMDUwLCAyNCB9LAorICAgIHsgMjIwNTAsIDE2IH0seyAyMjA1MCwgOCB9LAorCisgICAgeyAxMTAyNSwgNjQgfSx7IDExMDI1LCA1NiB9LHsgMTEwMjUsIDQ4IH0seyAxMTAyNSwgNDAgfSwgICAgICAgICAgICAgICAgLy8gTVBFRyAyLjUgU3BlYyBAIDExLjAyNUtIegorICAgIHsgMTEwMjUsIDMyIH0seyAxMTAyNSwgMjQgfSx7IDExMDI1LCAxNiB9LHsgMTEwMjUsIDggfSwKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHsgMzIwMDAsIDMyMCB9LHsgMzIwMDAsIDI1NiB9LHsgMzIwMDAsIDIyNCB9LHsgMzIwMDAsIDE5MiB9LCAgICAgICAgICAgIC8vIE1QRUcgMS4wIFNwZWMgQCAzMktIegorICAgIHsgMzIwMDAsIDE2MCB9LHsgMzIwMDAsIDEyOCB9LHsgMzIwMDAsIDExMiB9LHsgMzIwMDAsIDk2IH0sCisgICAgeyAzMjAwMCwgODAgfSx7IDMyMDAwLCA2NCB9LHsgMzIwMDAsIDU2IH0seyAzMjAwMCwgNDggfSwKKyAgICB7IDMyMDAwLCA0MCB9LHsgMzIwMDAsIDMyIH0sCisKKyAgICB7IDE2MDAwLCAxNjAgfSx7IDE2MDAwLCAxNDQgfSx7IDE2MDAwLCAxMjggfSx7IDE2MDAwLCAxMTIgfSwgICAgICAgICAgICAvLyBNUEVHIDIuMCBTcGVjIEAgMTZLSHoKKyAgICB7IDE2MDAwLCA5NiB9LHsgMTYwMDAsIDgwIH0seyAxNjAwMCwgNjQgfSx7IDE2MDAwLCA1NiB9LAorICAgIHsgMTYwMDAsIDQ4IH0seyAxNjAwMCwgNDAgfSx7IDE2MDAwLCAzMiB9LHsgMTYwMDAsIDI0IH0sCisgICAgeyAxNjAwMCwgMTYgfSx7IDE2MDAwLCA4IH0sCisKKyAgICB7IDgwMDAsIDY0IH0seyA4MDAwLCA1NiB9LHsgODAwMCwgNDggfSx7IDgwMDAsIDQwIH0sICAgICAgICAgICAgICAgICAgICAvLyBNUEVHIDIuNSBTcGVjIEAgOEtIegorICAgIHsgODAwMCwgMzIgfSx7IDgwMDAsIDI0IH0seyA4MDAwLCAxNiB9LHsgODAwMCwgOCB9Cit9OworCisKKy8qICBSZWdpc3RyYXRpb24gc2V0dXAgc3R1ZmYgKi8KKy8vICBTZXR1cCBkYXRhCisKKworQU1PVklFU0VUVVBfTUVESUFUWVBFIHN1ZE1wZ0lucHV0VHlwZVtdID0KK3sKKyAgICB7ICZNRURJQVRZUEVfQXVkaW8sICZNRURJQVNVQlRZUEVfUENNIH0KK307CitBTU9WSUVTRVRVUF9NRURJQVRZUEUgc3VkTXBnT3V0cHV0VHlwZVtdID0KK3sKKyAgICB7ICZNRURJQVRZUEVfQXVkaW8sICZNRURJQVNVQlRZUEVfTVBFRzFBdWRpb1BheWxvYWQgfSwKKyAgICB7ICZNRURJQVRZUEVfQXVkaW8sICZNRURJQVNVQlRZUEVfTVBFRzJfQVVESU8gfSwKKyAgICB7ICZNRURJQVRZUEVfQXVkaW8sICZNRURJQVNVQlRZUEVfTVAzIH0sCisgICAgeyAmTUVESUFUWVBFX1N0cmVhbSwgJk1FRElBU1VCVFlQRV9NUEVHMUF1ZGlvIH0KK307CisKK0FNT1ZJRVNFVFVQX1BJTiBzdWRNcGdQaW5zW10gPQoreworICAgIHsgTCJQQ00gSW5wdXQiLAorICAgICAgRkFMU0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJSZW5kZXJlZAorICAgICAgRkFMU0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJPdXRwdXQKKyAgICAgIEZBTFNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiWmVybworICAgICAgRkFMU0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJNYW55CisgICAgICAmQ0xTSURfTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xzQ29ubmVjdHNUb0ZpbHRlcgorICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3RzVG9QaW4KKyAgICAgIE5VTUVMTVMoc3VkTXBnSW5wdXRUeXBlKSwgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVkaWEgdHlwZXMKKyAgICAgIHN1ZE1wZ0lucHV0VHlwZQorICAgIH0sCisgICAgeyBMIk1QRUcgT3V0cHV0IiwKKyAgICAgIEZBTFNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiUmVuZGVyZWQKKyAgICAgIFRSVUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiT3V0cHV0CisgICAgICBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYlplcm8KKyAgICAgIEZBTFNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiTWFueQorICAgICAgJkNMU0lEX05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsc0Nvbm5lY3RzVG9GaWx0ZXIKKyAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0c1RvUGluCisgICAgICBOVU1FTE1TKHN1ZE1wZ091dHB1dFR5cGUpLCAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lZGlhIHR5cGVzCisgICAgICBzdWRNcGdPdXRwdXRUeXBlCisgICAgfQorfTsKKworQU1PVklFU0VUVVBfRklMVEVSIHN1ZE1wZ0FFbmMgPQoreworCSZDTFNJRF9MQU1FRFNob3dGaWx0ZXIsCisgICAgTCJMQU1FIEF1ZGlvIEVuY29kZXIiLAorICAgIERFRkFVTFRfRklMVEVSX01FUklULCAgICAgICAgICAgICAgICAgIC8vIFN0YW5kYXJkIGNvbXByZXNzb3IgbWVyaXQgdmFsdWUKKyAgICBOVU1FTE1TKHN1ZE1wZ1BpbnMpLCAgICAgICAgICAgICAgICAgICAvLyAyIHBpbnMKKyAgICBzdWRNcGdQaW5zCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBDT00gR2xvYmFsIHRhYmxlIG9mIG9iamVjdHMgaW4gdGhpcyBkbGwKK3N0YXRpYyBXQ0hBUiBnX3dzek5hbWVbXSA9IEwiTEFNRSBBdWRpbyBFbmNvZGVyIjsKK0NGYWN0b3J5VGVtcGxhdGUgZ19UZW1wbGF0ZXNbXSA9IAoreworICB7IGdfd3N6TmFtZSwgJkNMU0lEX0xBTUVEU2hvd0ZpbHRlciwgQ01wZWdBdWRFbmM6OkNyZWF0ZUluc3RhbmNlLCBOVUxMLCAmc3VkTXBnQUVuYyB9LAorICB7IEwiTEFNRSBBdWRpbyBFbmNvZGVyIFByb3BlcnR5IFBhZ2UiLCAmQ0xTSURfTEFNRURTaG93X1Byb3BlcnR5UGFnZSwgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2U6OkNyZWF0ZUluc3RhbmNlfSwKKyAgeyBMIkxBTUUgQXVkaW8gRW5jb2RlciBQcm9wZXJ0eSBQYWdlIiwgJkNMU0lEX0xBTUVEU2hvd19Qcm9wZXJ0eVBhZ2VBZHYsIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlQWR2OjpDcmVhdGVJbnN0YW5jZX0sCisgIHsgTCJMQU1FIEF1ZGlvIEVuY29kZXIgQWJvdXQiLCAmQ0xTSURfTEFNRURTaG93X0Fib3V0LCBDTUFFQWJvdXQ6OkNyZWF0ZUluc3RhbmNlfQorfTsKKy8vIENvdW50IG9mIG9iamVjdHMgbGlzdGVkIGluIGdfY1RlbXBsYXRlcworaW50IGdfY1RlbXBsYXRlcyA9IHNpemVvZihnX1RlbXBsYXRlcykgLyBzaXplb2YoZ19UZW1wbGF0ZXNbMF0pOworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlY2xhcmUgdGhlIERpcmVjdFNob3cgZmlsdGVyIGluZm9ybWF0aW9uLgorCisvLyBVc2VkIGJ5IElGaWx0ZXJNYXBwZXIyKCkgaW4gdGhlIGNhbGwgdG8gRGxsUmVnaXN0ZXJTZXJ2ZXIoKQorLy8gdG8gcmVnaXN0ZXIgdGhlIGZpbHRlciBpbiB0aGUgQ0xTSURfQXVkaW9Db21wcmVzc29yQ2F0ZWdvcnkuCitSRUdGSUxURVIyIHJmMkZpbHRlclJlZyA9IHsKKyAgICAxLCAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24gbnVtYmVyLgorICAgIERFRkFVTFRfRklMVEVSX01FUklULCAgLy8gTWVyaXQuIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBtZXJpdCBzcGVjaWZpZWQgaW4gdGhlIEFNT1ZJRVNFVFVQX0ZJTFRFUiBkZWZpbml0aW9uCisgICAgTlVNRUxNUyhzdWRNcGdQaW5zKSwgICAvLyBOdW1iZXIgb2YgcGlucy4KKyAgICBzdWRNcGdQaW5zICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gcGluIGluZm9ybWF0aW9uLgorfTsKKworU1REQVBJIERsbFJlZ2lzdGVyU2VydmVyKHZvaWQpCit7CisgICAgSFJFU1VMVCBociA9IEFNb3ZpZURsbFJlZ2lzdGVyU2VydmVyMihUUlVFKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorCisgICAgSUZpbHRlck1hcHBlcjIgKnBGTTIgPSBOVUxMOworICAgIGhyID0gQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9GaWx0ZXJNYXBwZXIyLCBOVUxMLCBDTFNDVFhfSU5QUk9DX1NFUlZFUiwgSUlEX0lGaWx0ZXJNYXBwZXIyLCAodm9pZCAqKikmcEZNMik7CisgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgICAgaHIgPSBwRk0yLT5SZWdpc3RlckZpbHRlcigKKyAgICAgICAgICAgIENMU0lEX0xBTUVEU2hvd0ZpbHRlciwgICAgICAgICAgIC8vIEZpbHRlciBDTFNJRC4gCisgICAgICAgICAgICBnX3dzek5hbWUsICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgbmFtZS4KKyAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldmljZSBtb25pa2VyLiAKKyAgICAgICAgICAgICZDTFNJRF9BdWRpb0NvbXByZXNzb3JDYXRlZ29yeSwgIC8vIEF1ZGlvIGNvbXByZXNzb3IgY2F0ZWdvcnkuCisgICAgICAgICAgICBnX3dzek5hbWUsICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnN0YW5jZSBkYXRhLgorICAgICAgICAgICAgJnJmMkZpbHRlclJlZyAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgKTsKKyAgICAgICAgcEZNMi0+UmVsZWFzZSgpOworICAgIH0KKyAgICByZXR1cm4gaHI7Cit9CisKK1NUREFQSSBEbGxVbnJlZ2lzdGVyU2VydmVyKCkKK3sKKyAgICBIUkVTVUxUIGhyID0gQU1vdmllRGxsUmVnaXN0ZXJTZXJ2ZXIyKEZBTFNFKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorCisgICAgSUZpbHRlck1hcHBlcjIgKnBGTTIgPSBOVUxMOworICAgIGhyID0gQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9GaWx0ZXJNYXBwZXIyLCBOVUxMLCBDTFNDVFhfSU5QUk9DX1NFUlZFUiwgSUlEX0lGaWx0ZXJNYXBwZXIyLCAodm9pZCAqKikmcEZNMik7CisgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgICAgaHIgPSBwRk0yLT5VbnJlZ2lzdGVyRmlsdGVyKCZDTFNJRF9BdWRpb0NvbXByZXNzb3JDYXRlZ29yeSwgZ193c3pOYW1lLCBDTFNJRF9MQU1FRFNob3dGaWx0ZXIpOworICAgICAgICBwRk0yLT5SZWxlYXNlKCk7CisgICAgfQorICAgIHJldHVybiBocjsKK30KKworCisKK0NVbmtub3duICpDTXBlZ0F1ZEVuYzo6Q3JlYXRlSW5zdGFuY2UoTFBVTktOT1dOIGxwdW5rLCBIUkVTVUxUICpwaHIpIAoreworICAgIENNcGVnQXVkRW5jICpwdW5rID0gbmV3IENNcGVnQXVkRW5jKGxwdW5rLCBwaHIpOworICAgIGlmIChwdW5rID09IE5VTEwpIAorICAgICAgICAqcGhyID0gRV9PVVRPRk1FTU9SWTsKKyAgICByZXR1cm4gcHVuazsKK30KKworQ01wZWdBdWRFbmM6OkNNcGVnQXVkRW5jKExQVU5LTk9XTiBscHVuaywgSFJFU1VMVCAqcGhyKQorIDogIENUcmFuc2Zvcm1GaWx0ZXIoTkFNRSgiTEFNRSBBdWRpbyBFbmNvZGVyIiksIGxwdW5rLCBDTFNJRF9MQU1FRFNob3dGaWx0ZXIpLAorICAgIENQZXJzaXN0U3RyZWFtKGxwdW5rLCBwaHIpCit7CisgICAgLy8gRU5DT0RFUiBPVVRQVVQgUElOCisgICAgLy8gT3ZlcnJpZGUgdGhlIG91dHB1dCBwaW4gd2l0aCBvdXIgb3duIHdoaWNoIHdpbGwgaW1wbGVtZW50IHRoZSBJQU1TdHJlYW1Db25maWcgSW50ZXJmYWNlCisgICAgQ1RyYW5zZm9ybU91dHB1dFBpbiAqcE91dCA9IG5ldyBDTXBlZ0F1ZEVuY091dFBpbiggdGhpcywgcGhyICk7CisgICAgaWYgKHBPdXQgPT0gTlVMTCkgeworICAgICAgICAqcGhyID0gRV9PVVRPRk1FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmIChGQUlMRUQoKnBocikpIHsgICAgICAgICAgICAgLy8gQSBmYWlsZWQgcmV0dXJuIGNvZGUgc2hvdWxkIGRlbGV0ZSB0aGUgb2JqZWN0CisgICAgICAgIGRlbGV0ZSBwT3V0OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fcE91dHB1dCA9IHBPdXQ7CisKKyAgICAvLyBFTkNPREVSIElOUFVUIFBJTgorICAgIC8vIFNpbmNlIHdlJ3ZlIGNyZWF0ZWQgb3VyIG93biBvdXRwdXQgcGluIHdlIG11c3QgYWxzbyBjcmVhdGUKKyAgICAvLyB0aGUgaW5wdXQgcGluIG91cnNlbHZlcyBiZWNhdXNlIHRoZSBDVHJhbnNmb3JtRmlsdGVyIGJhc2UgY2xhc3MgCisgICAgLy8gd2lsbCBjcmVhdGUgYW4gZXh0cmEgb3V0cHV0IHBpbiBpZiB0aGUgaW5wdXQgcGluIHdhc24ndCBjcmVhdGVkLiAgICAgICAgCisgICAgQ1RyYW5zZm9ybUlucHV0UGluICpwSW4gPSBuZXcgQ1RyYW5zZm9ybUlucHV0UGluKE5BTUUoIkxhbWVFbmNvZGVySW5wdXRQaW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgICAgICAgICAgICAgIC8vIE93bmVyIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHIsICAgICAgICAgICAgICAgLy8gUmVzdWx0IGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJJbnB1dCIpOyAgICAgICAgIC8vIFBpbiBuYW1lCisKKyAgICBpZiAocEluID09IE5VTEwpIHsKKyAgICAgICAgKnBociA9IEVfT1VUT0ZNRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoRkFJTEVEKCpwaHIpKSB7ICAgICAgICAgICAgIC8vIEEgZmFpbGVkIHJldHVybiBjb2RlIHNob3VsZCBkZWxldGUgdGhlIG9iamVjdAorICAgICAgICBkZWxldGUgcEluOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fcElucHV0ID0gcEluOworCisKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBSZWFkUHJlc2V0U2V0dGluZ3MoJm1lYyk7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKworICAgIG1fQ2Fwc051bSA9IDA7CisgICAgbV9oYXNGaW5pc2hlZCA9IFRSVUU7CisgICAgbV9iU3RyZWFtT3V0cHV0ID0gRkFMU0U7CisgICAgbV9jdXJyZW50TWVkaWFUeXBlSW5kZXggPSAwOworfQorCitDTXBlZ0F1ZEVuYzo6fkNNcGVnQXVkRW5jKHZvaWQpCit7Cit9CisKK0xQQU1PVklFU0VUVVBfRklMVEVSIENNcGVnQXVkRW5jOjpHZXRTZXR1cERhdGEoKQoreworICAgIHJldHVybiAmc3VkTXBnQUVuYzsKK30KKworCitIUkVTVUxUIENNcGVnQXVkRW5jOjpSZWNlaXZlKElNZWRpYVNhbXBsZSAqIHBTYW1wbGUpCit7CisgICAgQ0F1dG9Mb2NrIGxvY2soJm1fY3MpOworCisgICAgaWYgKCFwU2FtcGxlKQorICAgICAgICByZXR1cm4gU19PSzsKKworICAgIEJZVEUgKiBwU291cmNlQnVmZmVyID0gTlVMTDsKKworICAgIGlmIChwU2FtcGxlLT5HZXRQb2ludGVyKCZwU291cmNlQnVmZmVyKSAhPSBTX09LIHx8ICFwU291cmNlQnVmZmVyKQorICAgICAgICByZXR1cm4gU19PSzsKKworICAgIGxvbmcgc2FtcGxlX3NpemUgPSBwU2FtcGxlLT5HZXRBY3R1YWxEYXRhTGVuZ3RoKCk7CisKKyAgICBSRUZFUkVOQ0VfVElNRSBydFN0YXJ0LCBydFN0b3A7CisgICAgQk9PTCBnb3RWYWxpZFRpbWUgPSAocFNhbXBsZS0+R2V0VGltZSgmcnRTdGFydCwgJnJ0U3RvcCkgIT0gVkZXX0VfU0FNUExFX1RJTUVfTk9UX1NFVCk7CisKKyAgICBpZiAoc2FtcGxlX3NpemUgPD0gMCB8fCBwU291cmNlQnVmZmVyID09IE5VTEwgfHwgbV9oYXNGaW5pc2hlZCB8fCAoZ290VmFsaWRUaW1lICYmIHJ0U3RhcnQgPCAwKSkKKyAgICAgICAgcmV0dXJuIFNfT0s7CisKKyAgICBpZiAoZ290VmFsaWRUaW1lKQorICAgIHsKKyAgICAgICAgaWYgKG1fcnRTdHJlYW1UaW1lIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9ydFN0cmVhbVRpbWUgPSBydFN0YXJ0OworICAgICAgICAgICAgbV9ydEVzdGltYXRlZCA9IHJ0U3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN5bmNfcG9pbnRfdCAqIHN5bmMgPSBtX3N5bmMgKyBtX3N5bmNfaW5faWR4OworCisgICAgICAgICAgICBpZiAoc3luYy0+YXBwbGllZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSRUZFUkVOQ0VfVElNRSBydEdhcCA9IHJ0U3RhcnQgLSBtX3J0RXN0aW1hdGVkOworCisgICAgICAgICAgICAgICAgLy8gaWYgb2xkIHN5bmMgZGF0YSBpcyBhcHBsaWVkIGFuZCBnYXAgaXMgZ3JlYXRlciB0aGFuIDEgbXMKKyAgICAgICAgICAgICAgICAvLyB0aGVuIG1ha2UgYSBuZXcgc3luY2hyb25pemF0aW9uIHBvaW50CisgICAgICAgICAgICAgICAgaWYgKHJ0R2FwID4gMTAwMDAgfHwgKG1fYWxsb3dPdmVybGFwICYmIHJ0R2FwIDwgLTEwMDAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmMtPnNhbXBsZSAgICA9IG1fc2FtcGxlc0luOworICAgICAgICAgICAgICAgICAgICBzeW5jLT5kZWx0YSAgICAgPSBydEdhcDsKKyAgICAgICAgICAgICAgICAgICAgc3luYy0+YXBwbGllZCAgID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgbV9ydEVzdGltYXRlZCAgKz0gc3luYy0+ZGVsdGE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3luY19pbl9pZHggPCAoUkVTWU5DX0NPVU5UIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBtX3N5bmNfaW5faWR4Kys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3luY19pbl9pZHggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fcnRFc3RpbWF0ZWQgICArPSAoTE9OR0xPTkcpKG1fYnl0ZXNUb0R1cmF0aW9uICogc2FtcGxlX3NpemUpOworICAgIG1fc2FtcGxlc0luICAgICArPSBzYW1wbGVfc2l6ZSAvIG1fYnl0ZXNQZXJTYW1wbGU7CisKKyAgICB3aGlsZSAoc2FtcGxlX3NpemUgPiAwKQorICAgIHsKKyAgICAgICAgaW50IGJ5dGVzX3Byb2Nlc3NlZCA9IG1fRW5jb2Rlci5FbmNvZGUoKHNob3J0ICopcFNvdXJjZUJ1ZmZlciwgc2FtcGxlX3NpemUpOworCisgICAgICAgIGlmIChieXRlc19wcm9jZXNzZWQgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBTX09LOworCisgICAgICAgIEZsdXNoRW5jb2RlZFNhbXBsZXMoKTsKKworICAgICAgICBzYW1wbGVfc2l6ZSAgICAgLT0gYnl0ZXNfcHJvY2Vzc2VkOworICAgICAgICBwU291cmNlQnVmZmVyICAgKz0gYnl0ZXNfcHJvY2Vzc2VkOworICAgIH0KKworICAgIHJldHVybiBTX09LOworfQorCisKKworCitIUkVTVUxUIENNcGVnQXVkRW5jOjpGbHVzaEVuY29kZWRTYW1wbGVzKCkKK3sKKyAgICBJTWVkaWFTYW1wbGUgKiBwT3V0U2FtcGxlID0gTlVMTDsKKyAgICBCWVRFICogcERzdCA9IE5VTEw7CisKKwlpZihtX2JTdHJlYW1PdXRwdXQpCisJeworCQlIUkVTVUxUIGhyID0gU19PSzsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqICAgcGJsb2NrICAgICAgPSBOVUxMOworCQlpbnQgaUJ1ZmZlclNpemU7CisJCWludCBpQmxvY2tMZW5ndGggPSBtX0VuY29kZXIuR2V0QmxvY2tBbGlnbmVkKCZwYmxvY2ssICZpQnVmZmVyU2l6ZSwgbV9jYlN0cmVhbUFsaWdubWVudCk7CisJCQorCQlpZighaUJsb2NrTGVuZ3RoKQorCQkJcmV0dXJuIFNfT0s7CisKKwkJaHIgPSBtX3BPdXRwdXQtPkdldERlbGl2ZXJ5QnVmZmVyKCZwT3V0U2FtcGxlLCBOVUxMLCBOVUxMLCAwKTsKKwkJaWYgKGhyID09IFNfT0sgJiYgcE91dFNhbXBsZSkKKwkJeworCQkJaHIgPSBwT3V0U2FtcGxlLT5HZXRQb2ludGVyKCZwRHN0KTsKKwkJCWlmIChociA9PSBTX09LICYmIHBEc3QpCisJCQl7CisJCQkJQ29weU1lbW9yeShwRHN0LCBwYmxvY2ssIGlCbG9ja0xlbmd0aCk7CisJCQkJUkVGRVJFTkNFX1RJTUUgcnRFbmRQb3MgPSBtX3J0Qnl0ZVBvcyArIGlCdWZmZXJTaXplOworCQkJCUVYRUNVVEVfQVNTRVJUKFNfT0sgPT0gcE91dFNhbXBsZS0+U2V0VGltZSgmbV9ydEJ5dGVQb3MsICZydEVuZFBvcykpOworCQkJCXBPdXRTYW1wbGUtPlNldEFjdHVhbERhdGFMZW5ndGgoaUJ1ZmZlclNpemUpOworCQkJCW1fcnRCeXRlUG9zICs9IGlCbG9ja0xlbmd0aDsKKwkJCQltX3BPdXRwdXQtPkRlbGl2ZXIocE91dFNhbXBsZSk7CisJCQl9CisKKwkJCXBPdXRTYW1wbGUtPlJlbGVhc2UoKTsKKwkJfQorCQlyZXR1cm4gU19PSzsKKwl9CisKKyAgICBpZiAobV9ydFN0cmVhbVRpbWUgPCAwKQorICAgICAgICBtX3J0U3RyZWFtVGltZSA9IDA7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiAgIHBmcmFtZSAgICAgID0gTlVMTDsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSAgPSBtX0VuY29kZXIuR2V0RnJhbWUoJnBmcmFtZSk7CisKKyAgICAgICAgaWYgKGZyYW1lX3NpemUgPD0gMCB8fCAhcGZyYW1lKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCFtX3N5bmNbbV9zeW5jX291dF9pZHhdLmFwcGxpZWQgJiYgbV9zeW5jW21fc3luY19vdXRfaWR4XS5zYW1wbGUgPD0gbV9zYW1wbGVzT3V0KQorICAgICAgICB7CisgICAgICAgICAgICBtX3J0U3RyZWFtVGltZSArPSBtX3N5bmNbbV9zeW5jX291dF9pZHhdLmRlbHRhOworICAgICAgICAgICAgbV9zeW5jW21fc3luY19vdXRfaWR4XS5hcHBsaWVkID0gVFJVRTsKKworICAgICAgICAgICAgaWYgKG1fc3luY19vdXRfaWR4IDwgKFJFU1lOQ19DT1VOVCAtIDEpKQorICAgICAgICAgICAgICAgIG1fc3luY19vdXRfaWR4Kys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9zeW5jX291dF9pZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgUkVGRVJFTkNFX1RJTUUgcnRTdGFydCA9IG1fcnRTdHJlYW1UaW1lOworICAgICAgICBSRUZFUkVOQ0VfVElNRSBydFN0b3AgPSBydFN0YXJ0ICsgbV9ydEZyYW1lVGltZTsKKworCQlIUkVTVUxUIGhyID0gU19PSzsKKwkJCisJCWhyID0gbV9wT3V0cHV0LT5HZXREZWxpdmVyeUJ1ZmZlcigmcE91dFNhbXBsZSwgTlVMTCwgTlVMTCwgMCk7CisJCWlmIChociA9PSBTX09LICYmIHBPdXRTYW1wbGUpCisJCXsKKwkJCWhyID0gcE91dFNhbXBsZS0+R2V0UG9pbnRlcigmcERzdCk7CisJCQlpZiAoaHIgPT0gU19PSyAmJiBwRHN0KQorCQkJeworCQkJCUNvcHlNZW1vcnkocERzdCwgcGZyYW1lLCBmcmFtZV9zaXplKTsKKwkJCQlwT3V0U2FtcGxlLT5TZXRBY3R1YWxEYXRhTGVuZ3RoKGZyYW1lX3NpemUpOworCQkJCisJCQkJcE91dFNhbXBsZS0+U2V0U3luY1BvaW50KFRSVUUpOworCQkJCXBPdXRTYW1wbGUtPlNldFRpbWUoJnJ0U3RhcnQsIG1fc2V0RHVyYXRpb24gPyAmcnRTdG9wIDogTlVMTCk7CisJCQkKKworCQkJCW1fcE91dHB1dC0+RGVsaXZlcihwT3V0U2FtcGxlKTsKKwkJCX0KKworCQkJcE91dFNhbXBsZS0+UmVsZWFzZSgpOworCQl9CisJCisKKyAgICAgICAgbV9zYW1wbGVzT3V0ICs9IG1fc2FtcGxlc1BlckZyYW1lOworICAgICAgICBtX3J0U3RyZWFtVGltZSA9IHJ0U3RvcDsKKyAgICB9CisKKyAgICByZXR1cm4gU19PSzsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgU3RhcnRTdHJlYW1pbmcgLSBwcmVwYXJlIHRvIHJlY2VpdmUgbmV3IGRhdGEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0hSRVNVTFQgQ01wZWdBdWRFbmM6OlN0YXJ0U3RyZWFtaW5nKCkKK3sKKyAgICBXQVZFRk9STUFURVggKiBwd2Z4SW4gID0gKFdBVkVGT1JNQVRFWCAqKSBtX3BJbnB1dC0+Q3VycmVudE1lZGlhVHlwZSgpLkZvcm1hdCgpOworCisgICAgbV9ieXRlc1BlclNhbXBsZSAgICA9IHB3ZnhJbi0+bkNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKwlEV09SRCBkd091dFNhbXBsZVJhdGU7CisJaWYoTUVESUFUWVBFX1N0cmVhbSA9PSBtX3BPdXRwdXQtPkN1cnJlbnRNZWRpYVR5cGUoKS5tYWpvcnR5cGUpCisJeworCQlNUEVHX0VOQ09ERVJfQ09ORklHIG1jZmc7CisJCWlmKEZBSUxFRChtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWNmZykpKQorCQkJcmV0dXJuIEVfRkFJTDsKKwkJCisJCWR3T3V0U2FtcGxlUmF0ZSA9IG1jZmcuZHdTYW1wbGVSYXRlOworCX0KKwllbHNlCisJeworCQlkd091dFNhbXBsZVJhdGUgPSAoKFdBVkVGT1JNQVRFWCAqKSBtX3BPdXRwdXQtPkN1cnJlbnRNZWRpYVR5cGUoKS5Gb3JtYXQoKSktPm5TYW1wbGVzUGVyU2VjOworCX0KKwltX3NhbXBsZXNQZXJGcmFtZSAgID0gKGR3T3V0U2FtcGxlUmF0ZSA+PSAzMjAwMCkgPyAxMTUyIDogNTc2OworCisgICAgbV9ydEZyYW1lVGltZSA9IE11bERpdigxMDAwMDAwMCwgbV9zYW1wbGVzUGVyRnJhbWUsIGR3T3V0U2FtcGxlUmF0ZSk7CisKKyAgICBtX3NhbXBsZXNJbiA9IG1fc2FtcGxlc091dCA9IDA7CisgICAgbV9ydFN0cmVhbVRpbWUgPSAtMTsKKwltX3J0Qnl0ZVBvcyA9IDA7CisKKyAgICAvLyBpbml0aWFsaXplIGVuY29kZXIKKyAgICBtX0VuY29kZXIuSW5pdCgpOworCisgICAgbV9oYXNGaW5pc2hlZCAgID0gRkFMU0U7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFJFU1lOQ19DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgICAgbV9zeW5jW2ldLnNhbXBsZSAgID0gMDsKKyAgICAgICAgbV9zeW5jW2ldLmRlbHRhICAgID0gMDsKKyAgICAgICAgbV9zeW5jW2ldLmFwcGxpZWQgID0gVFJVRTsKKyAgICB9CisKKyAgICBtX3N5bmNfaW5faWR4ID0gMDsKKyAgICBtX3N5bmNfb3V0X2lkeCA9IDA7CisKKyAgICBnZXRfU2V0RHVyYXRpb24oJm1fc2V0RHVyYXRpb24pOworICAgIGdldF9TYW1wbGVPdmVybGFwKCZtX2FsbG93T3ZlcmxhcCk7CisKKwlyZXR1cm4gU19PSzsKK30KKworCitIUkVTVUxUIENNcGVnQXVkRW5jOjpTdG9wU3RyZWFtaW5nKCkKK3sKKwlJU3RyZWFtICpwU3RyZWFtID0gTlVMTDsKKwlpZihtX2JTdHJlYW1PdXRwdXQgJiYgbV9wT3V0cHV0LT5Jc0Nvbm5lY3RlZCgpICE9IEZBTFNFKQorCXsKKwkJSVBpbiAqIHBEd25zdHJtSW5wdXRQaW4gPSBtX3BPdXRwdXQtPkdldENvbm5lY3RlZCgpOworCQlpZihwRHduc3RybUlucHV0UGluICYmIEZBSUxFRChwRHduc3RybUlucHV0UGluLT5RdWVyeUludGVyZmFjZShJSURfSVN0cmVhbSwgKExQVk9JRCopKCZwU3RyZWFtKSkpKQorCQl7CisJCQlwU3RyZWFtID0gTlVMTDsKKwkJfQorCX0KKwkKKworCW1fRW5jb2Rlci5DbG9zZShwU3RyZWFtKTsKKworCWlmKHBTdHJlYW0pCisJCXBTdHJlYW0tPlJlbGVhc2UoKTsKKworICAgIHJldHVybiBTX09LOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICBFbmRPZlN0cmVhbSAtIHN0b3AgZGF0YSBwcm9jZXNzaW5nIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworSFJFU1VMVCBDTXBlZ0F1ZEVuYzo6RW5kT2ZTdHJlYW0oKQoreworICAgIENBdXRvTG9jayBsb2NrKCZtX2NzKTsKKworICAgIC8vIEZsdXNoIGRhdGEKKyAgICBtX0VuY29kZXIuRmluaXNoKCk7CisgICAgRmx1c2hFbmNvZGVkU2FtcGxlcygpOworCisJSVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgaWYobV9iU3RyZWFtT3V0cHV0ICYmIG1fcE91dHB1dC0+SXNDb25uZWN0ZWQoKSAhPSBGQUxTRSkKKwl7CisJCUlQaW4gKiBwRHduc3RybUlucHV0UGluID0gbV9wT3V0cHV0LT5HZXRDb25uZWN0ZWQoKTsKKwkJaWYocER3bnN0cm1JbnB1dFBpbikKKwkJeworCQkJaWYoRkFJTEVEKHBEd25zdHJtSW5wdXRQaW4tPlF1ZXJ5SW50ZXJmYWNlKElJRF9JU3RyZWFtLCAoTFBWT0lEKikoJnBTdHJlYW0pKSkpCisJCQl7CisJCQkJcFN0cmVhbSA9IE5VTEw7CQorCQkJfQorCQl9CisJfQorCisJaWYocFN0cmVhbSkKKwl7CisJCVVMQVJHRV9JTlRFR0VSIHNpemU7CisJCXNpemUuUXVhZFBhcnQgPSBtX3J0Qnl0ZVBvczsKKwkJcFN0cmVhbS0+U2V0U2l6ZShzaXplKTsJCisJfQorCisJbV9FbmNvZGVyLkNsb3NlKHBTdHJlYW0pOworCisJaWYocFN0cmVhbSkKKwkJcFN0cmVhbS0+UmVsZWFzZSgpOworCisgICAgbV9oYXNGaW5pc2hlZCA9IFRSVUU7CisKKyAgICByZXR1cm4gQ1RyYW5zZm9ybUZpbHRlcjo6RW5kT2ZTdHJlYW0oKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgQmVnaW5GbHVzaCAgLSBzdG9wIGRhdGEgcHJvY2Vzc2luZyAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0hSRVNVTFQgQ01wZWdBdWRFbmM6OkJlZ2luRmx1c2goKQoreworICAgIEhSRVNVTFQgaHIgPSBDVHJhbnNmb3JtRmlsdGVyOjpCZWdpbkZsdXNoKCk7CisKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkKKyAgICB7CisgICAgICAgIENBdXRvTG9jayBsb2NrKCZtX2NzKTsKKworICAgICAgICBEV09SRCBkd0RzdFNpemUgPSAwOworCisgICAgICAgIC8vIEZsdXNoIGRhdGEKKyAgICAgICAgbV9FbmNvZGVyLkZpbmlzaCgpOworICAgICAgICBGbHVzaEVuY29kZWRTYW1wbGVzKCk7CisKKwkJSVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisJCWlmKG1fYlN0cmVhbU91dHB1dCAmJiBtX3BPdXRwdXQtPklzQ29ubmVjdGVkKCkgIT0gRkFMU0UpCisJCXsKKwkJCUlQaW4gKiBwRHduc3RybUlucHV0UGluID0gbV9wT3V0cHV0LT5HZXRDb25uZWN0ZWQoKTsKKwkJCWlmKHBEd25zdHJtSW5wdXRQaW4gJiYgU1VDQ0VFREVEKHBEd25zdHJtSW5wdXRQaW4tPlF1ZXJ5SW50ZXJmYWNlKElJRF9JU3RyZWFtLCAoTFBWT0lEKikoJnBTdHJlYW0pKSkpCisJCQl7CisJCQkJVUxBUkdFX0lOVEVHRVIgc2l6ZTsKKwkJCQlzaXplLlF1YWRQYXJ0ID0gbV9ydEJ5dGVQb3M7CisJCQkJcFN0cmVhbS0+U2V0U2l6ZShzaXplKTsJCisJCQkJcFN0cmVhbS0+UmVsZWFzZSgpOworCQkJfQorCQl9CisJICAgIG1fcnRTdHJlYW1UaW1lID0gLTE7CisJCW1fcnRCeXRlUG9zID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gaHI7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLwlTZXRNZWRpYVR5cGUgLSBjYWxsZWQgd2hlbiBmaWx0ZXJzIGFyZSBjb25uZWN0aW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENNcGVnQXVkRW5jOjpTZXRNZWRpYVR5cGUoUElOX0RJUkVDVElPTiBkaXJlY3Rpb24sIGNvbnN0IENNZWRpYVR5cGUgKiBwbXQpCit7CisgICAgSFJFU1VMVCBociA9IFNfT0s7CisKKyAgICBpZiAoZGlyZWN0aW9uID09IFBJTkRJUl9JTlBVVCkKKyAgICB7CisJCWlmICgqcG10LT5Gb3JtYXRUeXBlKCkgIT0gRk9STUFUX1dhdmVGb3JtYXRFeCkKKyAgICAgICAgcmV0dXJuIFZGV19FX0lOVkFMSURNRURJQVRZUEU7CisKKwkJaWYgKHBtdC0+Rm9ybWF0TGVuZ3RoKCkgPCBzaXplb2YoV0FWRUZPUk1BVEVYKSkKKwkJCXJldHVybiBWRldfRV9JTlZBTElETUVESUFUWVBFOworCisgICAgICAgIERiZ0xvZygoTE9HX1RSQUNFLDEsVEVYVCgiQ01wZWdBdWRFbmM6OlNldE1lZGlhVHlwZSgpLCBkaXJlY3Rpb24gPSBQSU5ESVJfSU5QVVQiKSkpOworCisgICAgICAgIC8vIFBhc3MgaW5wdXQgbWVkaWEgdHlwZSB0byBlbmNvZGVyCisgICAgICAgIG1fRW5jb2Rlci5TZXRJbnB1dFR5cGUoKExQV0FWRUZPUk1BVEVYKXBtdC0+Rm9ybWF0KCkpOworCisgICAgICAgIFdBVkVGT1JNQVRFWCAqIHB3ZnggPSAoV0FWRUZPUk1BVEVYICopcG10LT5Gb3JtYXQoKTsKKworICAgICAgICBpZiAocHdmeCkKKyAgICAgICAgICAgIG1fYnl0ZXNUb0R1cmF0aW9uID0gKGZsb2F0KTEuZTcgLyAoZmxvYXQpKHB3ZngtPm5DaGFubmVscyAqIHNpemVvZihzaG9ydCkgKiBwd2Z4LT5uU2FtcGxlc1BlclNlYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fYnl0ZXNUb0R1cmF0aW9uID0gMC4wOworCisgICAgICAgIC8vIFBhcnNlIHRoZSBlbmNvZGVyIG91dHB1dCBjYXBhYmlsaXRpZXMgaW50byB0aGUgc3Vic2V0IG9mIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBzdXBwb3J0ZWQgCisgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBpbnB1dCBmb3JtYXQuIFRoaXMgbGlzdGluZyB3aWxsIGJlIHV0aWxpemVkIGJ5IHRoZSBJQU1TdHJlYW1Db25maWcgSW50ZXJmYWNlLgorICAgICAgICBMb2FkT3V0cHV0Q2FwYWJpbGl0aWVzKHB3ZngtPm5TYW1wbGVzUGVyU2VjKTsKKworICAgICAgICBSZWNvbm5lY3QoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBJTkRJUl9PVVRQVVQpCisgICAgeworICAgICAgICAvLyBCZWZvcmUgd2Ugc2V0IHRoZSBvdXRwdXQgdHlwZSwgd2UgbWlnaHQgbmVlZCB0byByZWNvbm5lY3QgCisgICAgICAgIC8vIHRoZSBpbnB1dCBwaW4gd2l0aCBhIG5ldyB0eXBlLgorICAgICAgICBpZiAobV9wSW5wdXQgJiYgbV9wSW5wdXQtPklzQ29ubmVjdGVkKCkpIAorICAgICAgICB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBpbnB1dCB0eXBlIGlzIGNvbXBhdGlibGUuCisgICAgICAgICAgICBociA9IENoZWNrVHJhbnNmb3JtKCZtX3BJbnB1dC0+Q3VycmVudE1lZGlhVHlwZSgpLCAmbV9wT3V0cHV0LT5DdXJyZW50TWVkaWFUeXBlKCkpOworICAgICAgICAgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlY29ubmVjdCB0aGUgaW5wdXQgcGluLiAKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgQ2hlY2tNZWRpYVR5cGUgbWV0aG9kIGhhcyBhbHJlYWR5IGNhbGxlZCBRdWVyeUFjY2VwdCBvbiB0aGUgdXBzdHJlYW0gZmlsdGVyLiAKKyAgICAgICAgICAgICAgICBociA9IG1fcEdyYXBoLT5SZWNvbm5lY3QobV9wSW5wdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBocjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisvLyAgICAgICAgV0FWRUZPUk1BVEVYIHdmSW47CisvLyAgICAgICAgbV9FbmNvZGVyLkdldElucHV0VHlwZSgmd2ZJbik7CisKKy8vICAgICAgICBpZiAod2ZJbi5uU2FtcGxlc1BlclNlYyAlCisvLyAgICAgICAgICAgICgoTFBXQVZFRk9STUFURVgpcG10LT5Gb3JtYXQoKSktPm5TYW1wbGVzUGVyU2VjICE9IDApCisvLyAgICAgICAgICAgIHJldHVybiBWRldfRV9UWVBFX05PVF9BQ0NFUFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gaHI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENoZWNrSW5wdXRUeXBlIC0gY2hlY2sgaWYgeW91IGNhbiBzdXBwb3J0IG10SW4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0hSRVNVTFQgQ01wZWdBdWRFbmM6OkNoZWNrSW5wdXRUeXBlKGNvbnN0IENNZWRpYVR5cGUqIG10SW4pCit7CisgICAgaWYgKCptdEluLT5UeXBlKCkgPT0gTUVESUFUWVBFX0F1ZGlvICYmICptdEluLT5Gb3JtYXRUeXBlKCkgPT0gRk9STUFUX1dhdmVGb3JtYXRFeCkKKyAgICAgICAgaWYgKG10SW4tPkZvcm1hdExlbmd0aCgpID49IHNpemVvZihXQVZFRk9STUFURVgpKQorICAgICAgICAgICAgaWYgKG10SW4tPklzVGVtcG9yYWxDb21wcmVzc2VkKCkgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fRW5jb2Rlci5TZXRJbnB1dFR5cGUoKExQV0FWRUZPUk1BVEVYKW10SW4tPkZvcm1hdCgpLCB0cnVlKTsKKworICAgIHJldHVybiBFX0lOVkFMSURBUkc7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENoZWNrVHJhbnNmb3JtIC0gY2hlY2tzIGlmIHdlIGNhbiBzdXBwb3J0IHRoZSB0cmFuc2Zvcm0gZnJvbSB0aGlzIGlucHV0IHRvIHRoaXMgb3V0cHV0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENNcGVnQXVkRW5jOjpDaGVja1RyYW5zZm9ybShjb25zdCBDTWVkaWFUeXBlKiBtdEluLCBjb25zdCBDTWVkaWFUeXBlKiBtdE91dCkKK3sKKwlpZihNRURJQVRZUEVfU3RyZWFtICE9IG10T3V0LT5tYWpvcnR5cGUpCisJeworCQlpZiAoKm10T3V0LT5Gb3JtYXRUeXBlKCkgIT0gRk9STUFUX1dhdmVGb3JtYXRFeCkKKwkJCXJldHVybiBWRldfRV9JTlZBTElETUVESUFUWVBFOworCisJCWlmIChtdE91dC0+Rm9ybWF0TGVuZ3RoKCkgPCBzaXplb2YoV0FWRUZPUk1BVEVYKSkKKwkJCXJldHVybiBWRldfRV9JTlZBTElETUVESUFUWVBFOworCisJCU1QRUdfRU5DT0RFUl9DT05GSUcJbWVjOworCQlpZihGQUlMRUQobV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYykpKQorCQkJcmV0dXJuIFNfT0s7CisKKwkJaWYgKCgoTFBXQVZFRk9STUFURVgpbXRJbi0+Rm9ybWF0KCkpLT5uU2FtcGxlc1BlclNlYyAlIG1lYy5kd1NhbXBsZVJhdGUgIT0gMCkKKwkJCXJldHVybiBTX09LOworCisJCWlmIChtZWMuZHdTYW1wbGVSYXRlICE9ICgoTFBXQVZFRk9STUFURVgpbXRPdXQtPkZvcm1hdCgpKS0+blNhbXBsZXNQZXJTZWMpCisJCQlyZXR1cm4gVkZXX0VfVFlQRV9OT1RfQUNDRVBURUQ7CisKKwkJcmV0dXJuIFNfT0s7CisJfQorCWVsc2UgaWYobXRPdXQtPnN1YnR5cGUgPT0gTUVESUFTVUJUWVBFX01QRUcxQXVkaW8pCisJCXJldHVybiBTX09LOworCisJcmV0dXJuIFZGV19FX1RZUEVfTk9UX0FDQ0VQVEVEOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWNpZGVCdWZmZXJTaXplIC0gc2V0cyBvdXRwdXQgYnVmZmVycyBudW1iZXIgYW5kIHNpemUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0hSRVNVTFQgQ01wZWdBdWRFbmM6OkRlY2lkZUJ1ZmZlclNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICBJTWVtQWxsb2NhdG9yKgkJICBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQUxMT0NBVE9SX1BST1BFUlRJRVMqIHBQcm9wZXJ0aWVzKQoreworICAgIEhSRVNVTFQgaHIgPSBTX09LOworCisJaWYobV9iU3RyZWFtT3V0cHV0KQorCQltX2NiU3RyZWFtQWxpZ25tZW50ID0gcFByb3BlcnRpZXMtPmNiQWxpZ247CisKKyAgICAvLy8KKyAgICBpZiAocFByb3BlcnRpZXMtPmNCdWZmZXJzID09IDApIHBQcm9wZXJ0aWVzLT5jQnVmZmVycyA9IDE7ICAvLyBJZiBkb3duc3RyZWFtIGZpbHRlciBkaWRuJ3Qgc3VnZ2VzdCBhIGJ1ZmZlciBjb3VudCB0aGVuIGRlZmF1bHQgdG8gMQorICAgIHBQcm9wZXJ0aWVzLT5jYkJ1ZmZlciA9IE9VVF9CVUZGRVJfU0laRTsKKwkvLworCQorCUFTU0VSVChwUHJvcGVydGllcy0+Y2JCdWZmZXIpOworCQorICAgIEFMTE9DQVRPUl9QUk9QRVJUSUVTIEFjdHVhbDsKKyAgICBociA9IHBBbGxvY2F0b3ItPlNldFByb3BlcnRpZXMocFByb3BlcnRpZXMsJkFjdHVhbCk7CisgICAgaWYoRkFJTEVEKGhyKSkKKyAgICAgICAgcmV0dXJuIGhyOworCisgICAgaWYgKEFjdHVhbC5jYkJ1ZmZlciA8IHBQcm9wZXJ0aWVzLT5jYkJ1ZmZlciB8fAorICAgICAgICBBY3R1YWwuY0J1ZmZlcnMgPCBwUHJvcGVydGllcy0+Y0J1ZmZlcnMpIAorICAgIHsvLyBjYW4ndCB1c2UgdGhpcyBhbGxvY2F0b3IKKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsKKyAgICB9CisgICAgcmV0dXJuIFNfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdldE1lZGlhVHlwZSAtIG92ZXJyaWRlYWJsZSBmb3Igc3VnZ2VzdGluZyBvdXRwdXQgcGluIG1lZGlhIHR5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENNcGVnQXVkRW5jOjpHZXRNZWRpYVR5cGUoaW50IGlQb3NpdGlvbiwgQ01lZGlhVHlwZSAqcE1lZGlhVHlwZSkKK3sKKyAgICBEYmdMb2coKExPR19UUkFDRSwxLFRFWFQoIkNNcGVnQXVkRW5jOjpHZXRNZWRpYVR5cGUoKSIpKSk7CisKKyAgICByZXR1cm4gbV9wT3V0cHV0LT5HZXRNZWRpYVR5cGUoaVBvc2l0aW9uLCBwTWVkaWFUeXBlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gIFJlY29ubmVjdCAtIGNhbGxlZCBhZnRlciBhIG1hbnVhbCBjaGFuZ2UgaGFzIGJlZW4gbWFkZSB0byB0aGUgCisvLyAgZW5jb2RlciBwYXJhbWV0ZXJzIHRvIHJlc2V0IHRoZSBmaWx0ZXIgb3V0cHV0IG1lZGlhIHR5cGUgc3RydWN0dXJlCisvLyAgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgZW5jb2RlciBvdXQgTVBFRyBhdWRpbyBwcm9wZXJ0aWVzIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworSFJFU1VMVCBDTXBlZ0F1ZEVuYzo6UmVjb25uZWN0KCkKK3sKKyAgICBIUkVTVUxUIGhyID0gU19GQUxTRTsKKworICAgIGlmIChtX3BPdXRwdXQgJiYgbV9wT3V0cHV0LT5Jc0Nvbm5lY3RlZCgpICYmIG1fU3RhdGUgPT0gU3RhdGVfU3RvcHBlZCkKKyAgICB7CisgICAgICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgICAgICBociA9IG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworCisgICAgICAgIGlmICgoaHIgPSBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpKSA9PSBTX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gdXBkYXRlZCBvdXRwdXQgTWVkaWFUeXBlIHVzaW5nIHRoZSBjdXJyZW50IGVuY29kZXIgc2V0dGluZ3MKKyAgICAgICAgICAgIENNZWRpYVR5cGUgY210OworCQkJY210LkluaXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgIG1fcE91dHB1dC0+R2V0TWVkaWFUeXBlKG1fY3VycmVudE1lZGlhVHlwZUluZGV4LCAmY210KTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIHVwZGF0ZWQgTWVkaWFUeXBlIG1hdGNoZXMgdGhlIGN1cnJlbnQgb3V0cHV0IE1lZGlhVHlwZSBubyByZWNvbm5lY3QgaXMgbmVlZGVkCisgICAgICAgICAgICBpZiAobV9wT3V0cHV0LT5DdXJyZW50TWVkaWFUeXBlKCkgPT0gY210KSByZXR1cm4gU19PSzsKKworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWNvbm5lY3QgdGhlIG91dHB1dCBwaW4gdXNpbmcgdGhlIHVwZGF0ZWQgTWVkaWFUeXBlCisgICAgICAgICAgICBpZiAoU19PSyA9PSAoaHIgPSBtX3BPdXRwdXQtPkdldENvbm5lY3RlZCgpLT5RdWVyeUFjY2VwdCgmY210KSkpIHsKKyAgICAgICAgICAgICAgICBociA9IG1fcE91dHB1dC0+U2V0TWVkaWFUeXBlKCZjbXQpOworICAgICAgICAgICAgICAgIGlmICggRkFJTEVEKGhyKSApIHsgcmV0dXJuKGhyKTsgfQorCisgICAgICAgICAgICAgICAgaHIgPSBtX3BHcmFwaC0+UmVjb25uZWN0KG1fcE91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaHIgPSBtX3BPdXRwdXQtPlNldE1lZGlhVHlwZSgmY210KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBocjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gIExvYWRPdXRwdXRDYXBhYmlsaXRpZXMgLSBjcmVhdGUgYSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIG91dHB1dCAKKy8vICBmb3JtYXQgY2FwYWJpbGl0aWVzIHdoaWNoIHdpbGwgYmUgdXNlZCBieSB0aGUgSUFNU3RyZWFtQ29uZmlnIEludGVyZmFjZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordm9pZCBDTXBlZ0F1ZEVuYzo6TG9hZE91dHB1dENhcGFiaWxpdGllcyhEV09SRCBzYW1wbGVfcmF0ZSkKK3sKKyAgICBtX0NhcHNOdW0gPSAwOworCisgICAgLy8gQ2xlYXIgb3V0IGFueSBleGlzdGluZyBvdXRwdXQgY2FwYWJpbGl0aWVzCisgICAgWmVyb01lbW9yeShPdXRwdXRDYXBzLCBzaXplb2YoT3V0cHV0Q2FwcykpOworCisgICAgLy8gQ3JlYXRlIHRoZSBzZXQgb2YgQ29uc3RhbnQgQml0IFJhdGUgb3V0cHV0IGNhcGFiaWxpdGllcyB0aGF0IGFyZQorICAgIC8vIHN1cHBvcnRlZCBmb3IgdGhlIGN1cnJlbnQgaW5wdXQgcGluIHNhbXBsaW5nIHJhdGUuCisgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgTlVNRUxNUyhPdXRwdXRDYXBhYmlsaXRpZXMpOyBpKyspIHsKKyAgICAgICAgaWYgKDAgPT0gc2FtcGxlX3JhdGUgJSBPdXRwdXRDYXBhYmlsaXRpZXNbaV0ublNhbXBsZVJhdGUpIHsKKworICAgICAgICAgICAgLy8gQWRkIHRoaXMgb3V0cHV0IGNhcGFiaWxpdHkgdG8gdGhlIE91dHB1dENhcHMgbGlzdAorICAgICAgICAgICAgT3V0cHV0Q2Fwc1ttX0NhcHNOdW1dID0gT3V0cHV0Q2FwYWJpbGl0aWVzW2ldOworICAgICAgICAgICAgbV9DYXBzTnVtKys7CisKKyAgICAgICAgICAgIC8vIERvbid0IG92ZXJydW4gdGhlIGhhcmQtY29kZWQgY2FwYWJpbGl0aWVzIGFycmF5IGxpbWl0CisgICAgICAgICAgICBpZiAobV9DYXBzTnVtID4gKGludClNQVhfSUFNU1RSRUFNQ09ORklHX0NBUFMpIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vCisvLyBSZWFkIHBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBmcm9tIFJlZ2lzdHJ5CisvLwordm9pZCBDTXBlZ0F1ZEVuYzo6UmVhZFByZXNldFNldHRpbmdzKE1QRUdfRU5DT0RFUl9DT05GSUcgKiBwbWVjKQoreworICAgIERiZ0xvZygoTE9HX1RSQUNFLDEsVEVYVCgiQ01wZWdBdWRFbmM6OlJlYWRQcmVzZXRTZXR0aW5ncygpIikpKTsKKworICAgIExhbWU6OkNSZWdLZXkgcmsoSEtFWV9DVVJSRU5UX1VTRVIsIEtFWV9MQU1FX0VOQ09ERVIpOworCisgICAgcG1lYy0+ZHdCaXRyYXRlICAgICAgICAgPSByay5nZXREV09SRChWQUxVRV9CSVRSQVRFLERFRkFVTFRfQklUUkFURSk7CisgICAgcG1lYy0+ZHdWYXJpYWJsZU1pbiAgICAgPSByay5nZXREV09SRChWQUxVRV9WQVJJQUJMRU1JTixERUZBVUxUX1ZBUklBQkxFTUlOKTsKKyAgICBwbWVjLT5kd1ZhcmlhYmxlTWF4ICAgICA9IHJrLmdldERXT1JEKFZBTFVFX1ZBUklBQkxFTUFYLERFRkFVTFRfVkFSSUFCTEVNQVgpOworICAgIHBtZWMtPnZtVmFyaWFibGUgICAgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfVkFSSUFCTEUsIERFRkFVTFRfVkFSSUFCTEUpID8gdmJyX3JoIDogdmJyX29mZjsKKyAgICBwbWVjLT5kd1F1YWxpdHkgICAgICAgICA9IHJrLmdldERXT1JEKFZBTFVFX1FVQUxJVFksREVGQVVMVF9FTkNPRElOR19RVUFMSVRZKTsKKyAgICBwbWVjLT5kd1ZCUnEgICAgICAgICAgICA9IHJrLmdldERXT1JEKFZBTFVFX1ZCUl9RVUFMSVRZLERFRkFVTFRfVkJSX1FVQUxJVFkpOworICAgIHBtZWMtPmxMYXllciAgICAgICAgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfTEFZRVIsIERFRkFVTFRfTEFZRVIpOworICAgIHBtZWMtPmJDUkNQcm90ZWN0ICAgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfQ1JDLCBERUZBVUxUX0NSQyk7CisgICAgcG1lYy0+YkZvcmNlTW9ubyAgICAgICAgPSByay5nZXREV09SRChWQUxVRV9GT1JDRV9NT05PLCBERUZBVUxUX0ZPUkNFX01PTk8pOworICAgIHBtZWMtPmJTZXREdXJhdGlvbiAgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfU0VUX0RVUkFUSU9OLCBERUZBVUxUX1NFVF9EVVJBVElPTik7CisgICAgcG1lYy0+YlNhbXBsZU92ZXJsYXAgICAgPSByay5nZXREV09SRChWQUxVRV9TQU1QTEVfT1ZFUkxBUCwgREVGQVVMVF9TQU1QTEVfT1ZFUkxBUCk7CisgICAgcG1lYy0+YkNvcHlyaWdodCAgICAgICAgPSByay5nZXREV09SRChWQUxVRV9DT1BZUklHSFQsIERFRkFVTFRfQ09QWVJJR0hUKTsKKyAgICBwbWVjLT5iT3JpZ2luYWwgICAgICAgICA9IHJrLmdldERXT1JEKFZBTFVFX09SSUdJTkFMLCBERUZBVUxUX09SSUdJTkFMKTsKKyAgICBwbWVjLT5kd1NhbXBsZVJhdGUgICAgICA9IHJrLmdldERXT1JEKFZBTFVFX1NBTVBMRV9SQVRFLCBERUZBVUxUX1NBTVBMRV9SQVRFKTsKKyAgICBwbWVjLT5kd1BFUyAgICAgICAgICAgICA9IHJrLmdldERXT1JEKFZBTFVFX1BFUywgREVGQVVMVF9QRVMpOworCisgICAgcG1lYy0+Q2hNb2RlICAgICAgICAgICAgPSAoTVBFR19tb2RlKXJrLmdldERXT1JEKFZBTFVFX1NURVJFT19NT0RFLCBERUZBVUxUX1NURVJFT19NT0RFKTsKKyAgICBwbWVjLT5kd0ZvcmNlTVMgICAgICAgICA9IHJrLmdldERXT1JEKFZBTFVFX0ZPUkNFX01TLCBERUZBVUxUX0ZPUkNFX01TKTsKKworICAgIHBtZWMtPmR3RW5mb3JjZVZCUm1pbiAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfRU5GT1JDRV9NSU4sIERFRkFVTFRfRU5GT1JDRV9NSU4pOworICAgIHBtZWMtPmR3Vm9pY2VNb2RlICAgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfVk9JQ0UsIERFRkFVTFRfVk9JQ0UpOworICAgIHBtZWMtPmR3S2VlcEFsbEZyZXEgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfS0VFUF9BTExfRlJFUSwgREVGQVVMVF9LRUVQX0FMTF9GUkVRKTsKKyAgICBwbWVjLT5kd1N0cmljdElTTyAgICAgICA9IHJrLmdldERXT1JEKFZBTFVFX1NUUklDVF9JU08sIERFRkFVTFRfU1RSSUNUX0lTTyk7CisgICAgcG1lYy0+ZHdOb1Nob3J0QmxvY2sgICAgPSByay5nZXREV09SRChWQUxVRV9ESVNBQkxFX1NIT1JUX0JMT0NLLCBERUZBVUxUX0RJU0FCTEVfU0hPUlRfQkxPQ0spOworICAgIHBtZWMtPmR3WGluZ1RhZyAgICAgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfWElOR19UQUcsIERFRkFVTFRfWElOR19UQUcpOworICAgIHBtZWMtPmR3TW9kZUZpeGVkICAgICAgID0gcmsuZ2V0RFdPUkQoVkFMVUVfTU9ERV9GSVhFRCwgREVGQVVMVF9NT0RFX0ZJWEVEKTsKKworICAgIHJrLkNsb3NlKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICBQcm9wZXJ0eSBwYWdlIGhhbmRsaW5nIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworSFJFU1VMVCBDTXBlZ0F1ZEVuYzo6R2V0UGFnZXMoQ0FVVUlEICpwY2F1dWlkKSAKK3sKKyAgICBHVUlEICpwZ3VpZDsKKworICAgIHBjYXV1aWQtPmNFbGVtcyA9IDM7CisgICAgcGNhdXVpZC0+cEVsZW1zID0gcGd1aWQgPSAoR1VJRCAqKSBDb1Rhc2tNZW1BbGxvYyhzaXplb2YoR1VJRCkgKiBwY2F1dWlkLT5jRWxlbXMpOworCisgICAgaWYgKHBjYXV1aWQtPnBFbGVtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIHBndWlkWzBdID0gQ0xTSURfTEFNRURTaG93X1Byb3BlcnR5UGFnZTsKKyAgICBwZ3VpZFsxXSA9IENMU0lEX0xBTUVEU2hvd19Qcm9wZXJ0eVBhZ2VBZHY7CisgICAgcGd1aWRbMl0gPSBDTFNJRF9MQU1FRFNob3dfQWJvdXQ7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpOb25EZWxlZ2F0aW5nUXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQgKiogcHB2KSAKK3sKKworICAgIGlmIChyaWlkID09IElJRF9JU3BlY2lmeVByb3BlcnR5UGFnZXMpCisgICAgICAgIHJldHVybiBHZXRJbnRlcmZhY2UoKElTcGVjaWZ5UHJvcGVydHlQYWdlcyAqKSB0aGlzLCBwcHYpOworCWVsc2UgaWYocmlpZCA9PSBJSURfSVBlcnNpc3RTdHJlYW0pCisgICAgICAgIHJldHVybiBHZXRJbnRlcmZhY2UoKElQZXJzaXN0U3RyZWFtICopdGhpcywgcHB2KTsKKy8vICAgIGVsc2UgaWYgKHJpaWQgPT0gSUlEX0lWQXVkaW9FbmNTZXR0aW5ncykKKy8vICAgICAgICByZXR1cm4gR2V0SW50ZXJmYWNlKChJVkF1ZGlvRW5jU2V0dGluZ3MqKSB0aGlzLCBwcHYpOworICAgIGVsc2UgaWYgKHJpaWQgPT0gSUlEX0lBdWRpb0VuY29kZXJQcm9wZXJ0aWVzKQorICAgICAgICByZXR1cm4gR2V0SW50ZXJmYWNlKChJQXVkaW9FbmNvZGVyUHJvcGVydGllcyopIHRoaXMsIHBwdik7CisKKyAgICByZXR1cm4gQ1RyYW5zZm9ybUZpbHRlcjo6Tm9uRGVsZWdhdGluZ1F1ZXJ5SW50ZXJmYWNlKHJpaWQsIHBwdik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vSVZBdWRpb0VuY1NldHRpbmdzIGludGVyZmFjZSBtZXRob2RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vCisvLyBJQXVkaW9FbmNvZGVyUHJvcGVydGllcworLy8KK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X1BFU091dHB1dEVuYWJsZWQoRFdPUkQgKmR3RW5hYmxlZCkKK3sKKyAgICAqZHdFbmFibGVkID0gKERXT1JEKW1fRW5jb2Rlci5Jc1BFUygpOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJnZXRfUEVTT3V0cHV0RW5hYmxlZCAtPiAlZCIpLCAqZHdFbmFibGVkKSk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfUEVTT3V0cHV0RW5hYmxlZChEV09SRCBkd0VuYWJsZWQpCit7CisgICAgbV9FbmNvZGVyLlNldFBFUygoQk9PTCkhIWR3RW5hYmxlZCk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9QRVNPdXRwdXRFbmFibGVkKCVkKSIpLCAhIWR3RW5hYmxlZCkpOworCisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X01QRUdMYXllcihEV09SRCAqZHdMYXllcikKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdMYXllciA9IChEV09SRCltZWMubExheWVyOworCisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9NUEVHTGF5ZXIgLT4gJWQiKSwgKmR3TGF5ZXIpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfTVBFR0xheWVyKERXT1JEIGR3TGF5ZXIpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgaWYgKGR3TGF5ZXIgPT0gMikKKyAgICAgICAgbWVjLmxMYXllciA9IDI7CisgICAgZWxzZSBpZiAoZHdMYXllciA9PSAxKQorICAgICAgICBtZWMubExheWVyID0gMTsKKyAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpOworCisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9NUEVHTGF5ZXIoJWQpIiksIGR3TGF5ZXIpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfQml0cmF0ZShEV09SRCAqZHdCaXRyYXRlKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgICpkd0JpdHJhdGUgPSAoRFdPUkQpbWVjLmR3Qml0cmF0ZTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X0JpdHJhdGUgLT4gJWQiKSwgKmR3Qml0cmF0ZSkpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9CaXRyYXRlKERXT1JEIGR3Qml0cmF0ZSkKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuZHdCaXRyYXRlID0gZHdCaXRyYXRlOworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9CaXRyYXRlKCVkKSIpLCBkd0JpdHJhdGUpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfVmFyaWFibGUoRFdPUkQgKmR3VmFyaWFibGUpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgKmR3VmFyaWFibGUgPSAoRFdPUkQpKG1lYy52bVZhcmlhYmxlID09IHZicl9vZmYgPyAwIDogMSk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9WYXJpYWJsZSAtPiAlZCIpLCAqZHdWYXJpYWJsZSkpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9WYXJpYWJsZShEV09SRCBkd1ZhcmlhYmxlKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworCisgICAgbWVjLnZtVmFyaWFibGUgPSBkd1ZhcmlhYmxlID8gdmJyX3JoIDogdmJyX29mZjsKKyAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJzZXRfVmFyaWFibGUoJWQpIiksIGR3VmFyaWFibGUpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfVmFyaWFibGVNaW4oRFdPUkQgKmR3TWluKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgICpkd01pbiA9IChEV09SRCltZWMuZHdWYXJpYWJsZU1pbjsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X1ZhcmlhYmxlbWluIC0+ICVkIiksICpkd01pbikpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9WYXJpYWJsZU1pbihEV09SRCBkd01pbikKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuZHdWYXJpYWJsZU1pbiA9IGR3TWluOworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9WYXJpYWJsZW1pbiglZCkiKSwgZHdNaW4pKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfVmFyaWFibGVNYXgoRFdPUkQgKmR3TWF4KQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgICpkd01heCA9IChEV09SRCltZWMuZHdWYXJpYWJsZU1heDsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X1ZhcmlhYmxlbWF4IC0+ICVkIiksICpkd01heCkpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9WYXJpYWJsZU1heChEV09SRCBkd01heCkKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuZHdWYXJpYWJsZU1heCA9IGR3TWF4OworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9WYXJpYWJsZW1heCglZCkiKSwgZHdNYXgpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfUXVhbGl0eShEV09SRCAqZHdRdWFsaXR5KSAgICAgICAgICAgICAKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdRdWFsaXR5PShEV09SRCltZWMuZHdRdWFsaXR5OworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJnZXRfUXVhbGl0eSAtPiAlZCIpLCAqZHdRdWFsaXR5KSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6c2V0X1F1YWxpdHkoRFdPUkQgZHdRdWFsaXR5KSAgICAgICAgICAgICAKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuZHdRdWFsaXR5ID0gZHdRdWFsaXR5OworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9RdWFsaXR5KCVkKSIpLCBkd1F1YWxpdHkpKTsKKyAgICByZXR1cm4gU19PSzsKK30KK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X1ZhcmlhYmxlUShEV09SRCAqZHdWQlJxKSAgICAgICAgICAgICAKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdWQlJxPShEV09SRCltZWMuZHdWQlJxOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJnZXRfVmFyaWFibGVRIC0+ICVkIiksICpkd1ZCUnEpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfVmFyaWFibGVRKERXT1JEIGR3VkJScSkgICAgICAgICAgICAgCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgbWVjLmR3VkJScSA9IGR3VkJScTsKKyAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJzZXRfVmFyaWFibGVRKCVkKSIpLCBkd1ZCUnEpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9Tb3VyY2VTYW1wbGVSYXRlKERXT1JEICpkd1NhbXBsZVJhdGUpCit7CisgICAgKmR3U2FtcGxlUmF0ZSA9IDA7CisKKyAgICBXQVZFRk9STUFURVggd2Y7CisgICAgaWYoRkFJTEVEKG1fRW5jb2Rlci5HZXRJbnB1dFR5cGUoJndmKSkpCisgICAgICAgIHJldHVybiBFX0ZBSUw7CisKKyAgICAqZHdTYW1wbGVSYXRlID0gd2YublNhbXBsZXNQZXJTZWM7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9Tb3VyY2VTYW1wbGVSYXRlIC0+ICVkIiksICpkd1NhbXBsZVJhdGUpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfU291cmNlQ2hhbm5lbHMoRFdPUkQgKmR3Q2hhbm5lbHMpCit7CisgICAgV0FWRUZPUk1BVEVYIHdmOworICAgIGlmKEZBSUxFRChtX0VuY29kZXIuR2V0SW5wdXRUeXBlKCZ3ZikpKQorICAgICAgICByZXR1cm4gRV9GQUlMOworCisgICAgKmR3Q2hhbm5lbHMgPSB3Zi5uQ2hhbm5lbHM7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9Tb3VyY2VDaGFubmVscyAtPiAlZCIpLCAqZHdDaGFubmVscykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9TYW1wbGVSYXRlKERXT1JEICpkd1NhbXBsZVJhdGUpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgKmR3U2FtcGxlUmF0ZSA9IG1lYy5kd1NhbXBsZVJhdGU7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9TYW1wbGVSYXRlIC0+ICVkIiksICpkd1NhbXBsZVJhdGUpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfU2FtcGxlUmF0ZShEV09SRCBkd1NhbXBsZVJhdGUpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgRFdPUkQgZHdPbGRTYW1wbGVSYXRlID0gbWVjLmR3U2FtcGxlUmF0ZTsKKyAgICBtZWMuZHdTYW1wbGVSYXRlID0gZHdTYW1wbGVSYXRlOworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9TYW1wbGVSYXRlKCVkKSIpLCBkd1NhbXBsZVJhdGUpKTsKKworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9DaGFubmVsTW9kZShEV09SRCAqZHdDaGFubmVsTW9kZSkKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdDaGFubmVsTW9kZSA9IG1lYy5DaE1vZGU7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9DaGFubmVsTW9kZSAtPiAlZCIpLCAqZHdDaGFubmVsTW9kZSkpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9DaGFubmVsTW9kZShEV09SRCBkd0NoYW5uZWxNb2RlKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgIG1lYy5DaE1vZGUgPSAoTVBFR19tb2RlKWR3Q2hhbm5lbE1vZGU7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X0NoYW5uZWxNb2RlKCVkKSIpLCBkd0NoYW5uZWxNb2RlKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X0ZvcmNlTVMoRFdPUkQgKmR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdGbGFnID0gbWVjLmR3Rm9yY2VNUzsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X0ZvcmNlTVMgLT4gJWQiKSwgKmR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9Gb3JjZU1TKERXT1JEIGR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuZHdGb3JjZU1TID0gZHdGbGFnOworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9Gb3JjZU1TKCVkKSIpLCBkd0ZsYWcpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9DUkNGbGFnKERXT1JEICpkd0ZsYWcpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgKmR3RmxhZyA9IG1lYy5iQ1JDUHJvdGVjdDsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X0NSQ0ZsYWcgLT4gJWQiKSwgKmR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9Gb3JjZU1vbm8oRFdPUkQgKmR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdGbGFnID0gbWVjLmJGb3JjZU1vbm87CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9Gb3JjZU1vbm8gLT4gJWQiKSwgKmR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9TZXREdXJhdGlvbihEV09SRCAqZHdGbGFnKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgICpkd0ZsYWcgPSBtZWMuYlNldER1cmF0aW9uOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJnZXRfU2V0RHVyYXRpb24gLT4gJWQiKSwgKmR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9TYW1wbGVPdmVybGFwKERXT1JEICpkd0ZsYWcpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgKmR3RmxhZyA9IG1lYy5iU2FtcGxlT3ZlcmxhcDsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X1NhbXBsZU92ZXJsYXAgLT4gJWQiKSwgKmR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9DUkNGbGFnKERXT1JEIGR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuYkNSQ1Byb3RlY3QgPSBkd0ZsYWc7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X0NSQ0ZsYWcoJWQpIiksIGR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9Gb3JjZU1vbm8oRFdPUkQgZHdGbGFnKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgIG1lYy5iRm9yY2VNb25vID0gZHdGbGFnOworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9Gb3JjZU1vbm8oJWQpIiksIGR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9TZXREdXJhdGlvbihEV09SRCBkd0ZsYWcpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgbWVjLmJTZXREdXJhdGlvbiA9IGR3RmxhZzsKKyAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJzZXRfU2V0RHVyYXRpb24oJWQpIiksIGR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9TYW1wbGVPdmVybGFwKERXT1JEIGR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuYlNhbXBsZU92ZXJsYXAgPSBkd0ZsYWc7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X1NhbXBsZU92ZXJsYXAoJWQpIiksIGR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9FbmZvcmNlVkJSbWluKERXT1JEICpkd0ZsYWcpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgKmR3RmxhZyA9IG1lYy5kd0VuZm9yY2VWQlJtaW47CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9FbmZvcmNlVkJSbWluIC0+ICVkIiksICpkd0ZsYWcpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfRW5mb3JjZVZCUm1pbihEV09SRCBkd0ZsYWcpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgbWVjLmR3RW5mb3JjZVZCUm1pbiA9IGR3RmxhZzsKKyAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJzZXRfRW5mb3JjZVZCUm1pbiglZCkiKSwgZHdGbGFnKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X1ZvaWNlTW9kZShEV09SRCAqZHdGbGFnKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgICpkd0ZsYWcgPSBtZWMuZHdWb2ljZU1vZGU7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9Wb2ljZU1vZGUgLT4gJWQiKSwgKmR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9Wb2ljZU1vZGUoRFdPUkQgZHdGbGFnKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgIG1lYy5kd1ZvaWNlTW9kZSA9IGR3RmxhZzsKKyAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJzZXRfVm9pY2VNb2RlKCVkKSIpLCBkd0ZsYWcpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfS2VlcEFsbEZyZXEoRFdPUkQgKmR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdGbGFnID0gbWVjLmR3S2VlcEFsbEZyZXE7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9LZWVwQWxsRnJlcSAtPiAlZCIpLCAqZHdGbGFnKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6c2V0X0tlZXBBbGxGcmVxKERXT1JEIGR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuZHdLZWVwQWxsRnJlcSA9IGR3RmxhZzsKKyAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZShtZWMpOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJzZXRfS2VlcEFsbEZyZXEoJWQpIiksIGR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9TdHJpY3RJU08oRFdPUkQgKmR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdGbGFnID0gbWVjLmR3U3RyaWN0SVNPOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJnZXRfU3RyaWN0SVNPIC0+ICVkIiksICpkd0ZsYWcpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfU3RyaWN0SVNPKERXT1JEIGR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICBtZWMuZHdTdHJpY3RJU08gPSBkd0ZsYWc7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X1N0cmljdElTTyglZCkiKSwgZHdGbGFnKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X05vU2hvcnRCbG9jayhEV09SRCAqZHdOb1Nob3J0QmxvY2spCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgKmR3Tm9TaG9ydEJsb2NrID0gbWVjLmR3Tm9TaG9ydEJsb2NrOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJnZXRfTm9TaG9ydEJsb2NrIC0+ICVkIiksICpkd05vU2hvcnRCbG9jaykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9Ob1Nob3J0QmxvY2soRFdPUkQgZHdOb1Nob3J0QmxvY2spCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgbWVjLmR3Tm9TaG9ydEJsb2NrID0gZHdOb1Nob3J0QmxvY2s7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X05vU2hvcnRCbG9jayglZCkiKSwgZHdOb1Nob3J0QmxvY2spKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfWGluZ1RhZyhEV09SRCAqZHdYaW5nVGFnKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgICpkd1hpbmdUYWcgPSBtZWMuZHdYaW5nVGFnOworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJnZXRfWGluZ1RhZyAtPiAlZCIpLCAqZHdYaW5nVGFnKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6c2V0X1hpbmdUYWcoRFdPUkQgZHdYaW5nVGFnKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgIG1lYy5kd1hpbmdUYWcgPSBkd1hpbmdUYWc7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X1hpbmdUYWcoJWQpIiksIGR3WGluZ1RhZykpOworICAgIHJldHVybiBTX09LOworfQorCisKKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpnZXRfT3JpZ2luYWxGbGFnKERXT1JEICpkd0ZsYWcpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgKmR3RmxhZyA9IG1lYy5iT3JpZ2luYWw7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9PcmlnaW5hbEZsYWcgLT4gJWQiKSwgKmR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OnNldF9PcmlnaW5hbEZsYWcoRFdPUkQgZHdGbGFnKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgIG1lYy5iT3JpZ2luYWwgPSBkd0ZsYWc7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X09yaWdpbmFsRmxhZyglZCkiKSwgZHdGbGFnKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X0NvcHlyaWdodEZsYWcoRFdPUkQgKmR3RmxhZykKK3sKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKyAgICAqZHdGbGFnID0gbWVjLmJDb3B5cmlnaHQ7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9Db3B5cmlnaHRGbGFnIC0+ICVkIiksICpkd0ZsYWcpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfQ29weXJpZ2h0RmxhZyhEV09SRCBkd0ZsYWcpCit7CisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgbWVjLmJDb3B5cmlnaHQgPSBkd0ZsYWc7CisgICAgbV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKTsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgic2V0X0NvcHlyaWdodEZsYWcoJWQpIiksIGR3RmxhZykpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OmdldF9Nb2RlRml4ZWQoRFdPUkQgKmR3TW9kZUZpeGVkKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgICpkd01vZGVGaXhlZCA9IG1lYy5kd01vZGVGaXhlZDsKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X01vZGVGaXhlZCAtPiAlZCIpLCAqZHdNb2RlRml4ZWQpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpzZXRfTW9kZUZpeGVkKERXT1JEIGR3TW9kZUZpeGVkKQoreworICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpOworICAgIG1lYy5kd01vZGVGaXhlZCA9IGR3TW9kZUZpeGVkOworICAgIG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoInNldF9Nb2RlRml4ZWQoJWQpIiksIGR3TW9kZUZpeGVkKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6Z2V0X1BhcmFtZXRlckJsb2NrU2l6ZShCWVRFICpwY0Jsb2NrLCBEV09SRCAqcGR3U2l6ZSkKK3sKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiZ2V0X1BhcmFtZXRlckJsb2NrU2l6ZSAtPiAlZCVkIiksICpwY0Jsb2NrLCAqcGR3U2l6ZSkpOworCisgICAgaWYgKHBjQmxvY2sgIT0gTlVMTCkgeworICAgICAgICBpZiAoKnBkd1NpemUgPj0gc2l6ZW9mKE1QRUdfRU5DT0RFUl9DT05GSUcpKSB7CisgICAgICAgICAgICBtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgoTVBFR19FTkNPREVSX0NPTkZJRyopcGNCbG9jayk7CisgICAgICAgICAgICByZXR1cm4gU19PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICpwZHdTaXplID0gc2l6ZW9mKE1QRUdfRU5DT0RFUl9DT05GSUcpOworICAgICAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwZHdTaXplICE9IE5VTEwpIHsKKyAgICAgICAgKnBkd1NpemUgPSBzaXplb2YoTVBFR19FTkNPREVSX0NPTkZJRyk7CisgICAgICAgIHJldHVybiBTX09LOworICAgIH0KKworICAgIHJldHVybiBFX0ZBSUw7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6c2V0X1BhcmFtZXRlckJsb2NrU2l6ZShCWVRFICpwY0Jsb2NrLCBEV09SRCBkd1NpemUpCit7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoImdldF9QYXJhbWV0ZXJCbG9ja1NpemUoJWQsICVkKSIpLCAqcGNCbG9jaywgZHdTaXplKSk7CisgICAgaWYgKHNpemVvZihNUEVHX0VOQ09ERVJfQ09ORklHKSA9PSBkd1NpemUpeworICAgICAgICBtX0VuY29kZXIuU2V0T3V0cHV0VHlwZSgqKE1QRUdfRU5DT0RFUl9DT05GSUcqKXBjQmxvY2spOworICAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisgICAgZWxzZSByZXR1cm4gRV9GQUlMOyAKK30KKworCitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OkRlZmF1bHRBdWRpb0VuY29kZXJQcm9wZXJ0aWVzKCkKK3sKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiRGVmYXVsdEF1ZGlvRW5jb2RlclByb3BlcnRpZXMoKSIpKSk7CisKKyAgICBIUkVTVUxUIGhyID0gSW5wdXRUeXBlRGVmaW5lZCgpOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICByZXR1cm4gaHI7CisKKyAgICBEV09SRCBkd1NvdXJjZVNhbXBsZVJhdGU7CisgICAgZ2V0X1NvdXJjZVNhbXBsZVJhdGUoJmR3U291cmNlU2FtcGxlUmF0ZSk7CisKKyAgICBzZXRfUEVTT3V0cHV0RW5hYmxlZChERUZBVUxUX1BFUyk7CisgICAgc2V0X01QRUdMYXllcihERUZBVUxUX0xBWUVSKTsKKworICAgIHNldF9CaXRyYXRlKERFRkFVTFRfQklUUkFURSk7CisgICAgc2V0X1ZhcmlhYmxlKEZBTFNFKTsKKyAgICBzZXRfVmFyaWFibGVNaW4oREVGQVVMVF9WQVJJQUJMRU1JTik7CisgICAgc2V0X1ZhcmlhYmxlTWF4KERFRkFVTFRfVkFSSUFCTEVNQVgpOworICAgIHNldF9RdWFsaXR5KERFRkFVTFRfRU5DT0RJTkdfUVVBTElUWSk7CisgICAgc2V0X1ZhcmlhYmxlUShERUZBVUxUX1ZCUl9RVUFMSVRZKTsKKworICAgIHNldF9TYW1wbGVSYXRlKGR3U291cmNlU2FtcGxlUmF0ZSk7CisgICAgc2V0X0NSQ0ZsYWcoREVGQVVMVF9DUkMpOworICAgIHNldF9Gb3JjZU1vbm8oREVGQVVMVF9GT1JDRV9NT05PKTsKKyAgICBzZXRfU2V0RHVyYXRpb24oREVGQVVMVF9TRVRfRFVSQVRJT04pOworICAgIHNldF9TYW1wbGVPdmVybGFwKERFRkFVTFRfU0FNUExFX09WRVJMQVApOworICAgIHNldF9PcmlnaW5hbEZsYWcoREVGQVVMVF9PUklHSU5BTCk7CisgICAgc2V0X0NvcHlyaWdodEZsYWcoREVGQVVMVF9DT1BZUklHSFQpOworCisgICAgc2V0X0VuZm9yY2VWQlJtaW4oREVGQVVMVF9FTkZPUkNFX01JTik7CisgICAgc2V0X1ZvaWNlTW9kZShERUZBVUxUX1ZPSUNFKTsKKyAgICBzZXRfS2VlcEFsbEZyZXEoREVGQVVMVF9LRUVQX0FMTF9GUkVRKTsKKyAgICBzZXRfU3RyaWN0SVNPKERFRkFVTFRfU1RSSUNUX0lTTyk7CisgICAgc2V0X05vU2hvcnRCbG9jayhERUZBVUxUX0RJU0FCTEVfU0hPUlRfQkxPQ0spOworICAgIHNldF9YaW5nVGFnKERFRkFVTFRfWElOR19UQUcpOworICAgIHNldF9Gb3JjZU1TKERFRkFVTFRfRk9SQ0VfTVMpOworICAgIHNldF9DaGFubmVsTW9kZShERUZBVUxUX1NURVJFT19NT0RFKTsKKyAgICBzZXRfTW9kZUZpeGVkKERFRkFVTFRfTU9ERV9GSVhFRCk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jOjpMb2FkQXVkaW9FbmNvZGVyUHJvcGVydGllc0Zyb21SZWdpc3RyeSgpCit7CisgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoIkxvYWRBdWRpb0VuY29kZXJQcm9wZXJ0aWVzRnJvbVJlZ2lzdHJ5KCkiKSkpOworCisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgUmVhZFByZXNldFNldHRpbmdzKCZtZWMpOworICAgIGlmKG1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYykgPT0gU19GQUxTRSkKKyAgICAgICAgcmV0dXJuIFNfRkFMU0U7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6U2F2ZUF1ZGlvRW5jb2RlclByb3BlcnRpZXNUb1JlZ2lzdHJ5KCkKK3sKKyAgICBEYmdMb2coKExPR19UUkFDRSwgMSwgVEVYVCgiU2F2ZUF1ZGlvRW5jb2RlclByb3BlcnRpZXNUb1JlZ2lzdHJ5KCkiKSkpOworICAgIExhbWU6OkNSZWdLZXkgcms7CisKKyAgICBNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKyAgICBpZihtX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKSA9PSBTX0ZBTFNFKQorICAgICAgICByZXR1cm4gRV9GQUlMOworCisgICAgaWYocmsuQ3JlYXRlKEhLRVlfQ1VSUkVOVF9VU0VSLCBLRVlfTEFNRV9FTkNPREVSKSkKKyAgICB7CisgICAgICAgIHJrLnNldERXT1JEKFZBTFVFX0JJVFJBVEUsIG1lYy5kd0JpdHJhdGUpOworICAgICAgICByay5zZXREV09SRChWQUxVRV9WQVJJQUJMRSwgbWVjLnZtVmFyaWFibGUpOworICAgICAgICByay5zZXREV09SRChWQUxVRV9WQVJJQUJMRU1JTiwgbWVjLmR3VmFyaWFibGVNaW4pOworICAgICAgICByay5zZXREV09SRChWQUxVRV9WQVJJQUJMRU1BWCwgbWVjLmR3VmFyaWFibGVNYXgpOworICAgICAgICByay5zZXREV09SRChWQUxVRV9RVUFMSVRZLCBtZWMuZHdRdWFsaXR5KTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfVkJSX1FVQUxJVFksIG1lYy5kd1ZCUnEpOworCisgICAgICAgIHJrLnNldERXT1JEKFZBTFVFX0NSQywgbWVjLmJDUkNQcm90ZWN0KTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfRk9SQ0VfTU9OTywgbWVjLmJGb3JjZU1vbm8pOworICAgICAgICByay5zZXREV09SRChWQUxVRV9TRVRfRFVSQVRJT04sIG1lYy5iU2V0RHVyYXRpb24pOworICAgICAgICByay5zZXREV09SRChWQUxVRV9TQU1QTEVfT1ZFUkxBUCwgbWVjLmJTYW1wbGVPdmVybGFwKTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfUEVTLCBtZWMuZHdQRVMpOworICAgICAgICByay5zZXREV09SRChWQUxVRV9DT1BZUklHSFQsIG1lYy5iQ29weXJpZ2h0KTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfT1JJR0lOQUwsIG1lYy5iT3JpZ2luYWwpOworICAgICAgICByay5zZXREV09SRChWQUxVRV9TQU1QTEVfUkFURSwgbWVjLmR3U2FtcGxlUmF0ZSk7CisKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfU1RFUkVPX01PREUsIG1lYy5DaE1vZGUpOworICAgICAgICByay5zZXREV09SRChWQUxVRV9GT1JDRV9NUywgbWVjLmR3Rm9yY2VNUyk7CisgICAgICAgIHJrLnNldERXT1JEKFZBTFVFX1hJTkdfVEFHLCBtZWMuZHdYaW5nVGFnKTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfRElTQUJMRV9TSE9SVF9CTE9DSywgbWVjLmR3Tm9TaG9ydEJsb2NrKTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfU1RSSUNUX0lTTywgbWVjLmR3U3RyaWN0SVNPKTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfS0VFUF9BTExfRlJFUSwgbWVjLmR3S2VlcEFsbEZyZXEpOworICAgICAgICByay5zZXREV09SRChWQUxVRV9WT0lDRSwgbWVjLmR3Vm9pY2VNb2RlKTsKKyAgICAgICAgcmsuc2V0RFdPUkQoVkFMVUVfRU5GT1JDRV9NSU4sIG1lYy5kd0VuZm9yY2VWQlJtaW4pOworICAgICAgICByay5zZXREV09SRChWQUxVRV9NT0RFX0ZJWEVELCBtZWMuZHdNb2RlRml4ZWQpOworCisgICAgICAgIHJrLkNsb3NlKCk7CisgICAgfQorCisgICAgLy8gUmVjb25uZWN0IGZpbHRlciBncmFwaAorICAgIFJlY29ubmVjdCgpOworCisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6SW5wdXRUeXBlRGVmaW5lZCgpCit7CisgICAgV0FWRUZPUk1BVEVYIHdmOworICAgIGlmKEZBSUxFRChtX0VuY29kZXIuR2V0SW5wdXRUeXBlKCZ3ZikpKQorICAgIHsKKyAgICAgICAgRGJnTG9nKChMT0dfVFJBQ0UsIDEsIFRFWFQoIiFJbnB1dFR5cGVEZWZpbmVkKCkiKSkpOworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KKworICAgIERiZ0xvZygoTE9HX1RSQUNFLCAxLCBURVhUKCJJbnB1dFR5cGVEZWZpbmVkKCkiKSkpOworICAgIHJldHVybiBTX09LOworfQorCisKK1NURE1FVEhPRElNUCBDTXBlZ0F1ZEVuYzo6QXBwbHlDaGFuZ2VzKCkKK3sKKyAgICByZXR1cm4gUmVjb25uZWN0KCk7Cit9CisKKy8vCisvLyBDUGVyc2lzdFN0cmVhbSBzdHVmZgorLy8KKworLy8gd2hhdCBpcyBvdXIgY2xhc3MgSUQ/CitTVERNRVRIT0RJTVAgQ01wZWdBdWRFbmM6OkdldENsYXNzSUQoQ0xTSUQgKnBDbHNpZCkKK3sKKyAgICBDaGVja1BvaW50ZXIocENsc2lkLCBFX1BPSU5URVIpOworICAgICpwQ2xzaWQgPSBDTFNJRF9MQU1FRFNob3dGaWx0ZXI7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgQ01wZWdBdWRFbmM6OldyaXRlVG9TdHJlYW0oSVN0cmVhbSAqcFN0cmVhbSkKK3sKKyAgICBEYmdMb2coKExPR19UUkFDRSwxLFRFWFQoIldyaXRlVG9TdHJlYW0oKSIpKSk7CisKKwlNUEVHX0VOQ09ERVJfQ09ORklHIG1lYzsKKworCWlmKG1fRW5jb2Rlci5HZXRPdXRwdXRUeXBlKCZtZWMpID09IFNfRkFMU0UpCisJCXJldHVybiBFX0ZBSUw7CisKKyAgICByZXR1cm4gcFN0cmVhbS0+V3JpdGUoJm1lYywgc2l6ZW9mKG1lYyksIDApOworfQorCisKKy8vIHdoYXQgZGV2aWNlIHNob3VsZCB3ZSB1c2U/ICBVc2VkIHRvIHJlLWNyZWF0ZSBhIC5HUkYgZmlsZSB0aGF0IHdlCisvLyBhcmUgaW4KK0hSRVNVTFQgQ01wZWdBdWRFbmM6OlJlYWRGcm9tU3RyZWFtKElTdHJlYW0gKnBTdHJlYW0pCit7CisJTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisKKyAgICBIUkVTVUxUIGhyID0gcFN0cmVhbS0+UmVhZCgmbWVjLCBzaXplb2YobWVjKSwgMCk7CisgICAgaWYoRkFJTEVEKGhyKSkKKyAgICAgICAgcmV0dXJuIGhyOworCisJaWYobV9FbmNvZGVyLlNldE91dHB1dFR5cGUobWVjKSA9PSBTX0ZBTFNFKQorCQlyZXR1cm4gU19GQUxTRTsKKworICAgIERiZ0xvZygoTE9HX1RSQUNFLDEsVEVYVCgiUmVhZEZyb21TdHJlYW0oKSBzdWNjZWVkZWQiKSkpOworCisgICAgaHIgPSBTX09LOworICAgIHJldHVybiBocjsKK30KKworCisvLyBIb3cgbG9uZyBpcyBvdXIgZGF0YT8KK2ludCBDTXBlZ0F1ZEVuYzo6U2l6ZU1heCgpCit7CisgICAgcmV0dXJuIHNpemVvZihNUEVHX0VOQ09ERVJfQ09ORklHKTsKK30KKworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ01wZWdBdWRFbmNPdXRQaW4gaXMgdGhlIG9uZSBhbmQgb25seSBvdXRwdXQgcGluIG9mIENNcGVnQXVkRW5jICAKKy8vIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0NNcGVnQXVkRW5jT3V0UGluOjpDTXBlZ0F1ZEVuY091dFBpbiggQ01wZWdBdWRFbmMgKiBwRmlsdGVyLCBIUkVTVUxUICogcEhyICkgOgorICAgICAgICBDVHJhbnNmb3JtT3V0cHV0UGluKCBOQU1FKCJMYW1lRW5jb2Rlck91dHB1dFBpbiIpLCBwRmlsdGVyLCBwSHIsIEwiT3V0cHV0XDAiICksCisgICAgICAgIG1fcEZpbHRlcihwRmlsdGVyKQoreworICAgIG1fU2V0Rm9ybWF0ID0gRkFMU0U7Cit9CisKK0NNcGVnQXVkRW5jT3V0UGluOjp+Q01wZWdBdWRFbmNPdXRQaW4oKQoreworfSAKKworU1RETUVUSE9ESU1QIENNcGVnQXVkRW5jT3V0UGluOjpOb25EZWxlZ2F0aW5nUXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQgKipwcHYpCit7CisgICAgaWYocmlpZCA9PSBJSURfSUFNU3RyZWFtQ29uZmlnKSB7CisgICAgICAgIENoZWNrUG9pbnRlcihwcHYsIEVfUE9JTlRFUik7CisgICAgICAgIHJldHVybiBHZXRJbnRlcmZhY2UoKElBTVN0cmVhbUNvbmZpZyopKHRoaXMpLCBwcHYpOworICAgIH0KKyAgICByZXR1cm4gQ0Jhc2VPdXRwdXRQaW46Ok5vbkRlbGVnYXRpbmdRdWVyeUludGVyZmFjZShyaWlkLCBwcHYpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgb3V0cHV0IGZvcm1hdCBoYXMgYmVlbiBuZWdvdGlhdGVkIGFuZAorLy8gd2lsbCB1cGRhdGUgdGhlIExBTUUgZW5jb2RlciBzZXR0aW5ncyBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlCisvLyBzZXR0aW5ncyBzcGVjaWZpZWQgaW4gdGhlIE1lZGlhVHlwZSBzdHJ1Y3R1cmUuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworSFJFU1VMVCBDTXBlZ0F1ZEVuY091dFBpbjo6U2V0TWVkaWFUeXBlKGNvbnN0IENNZWRpYVR5cGUgKnBtdCkKK3sKKyAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBMQU1FIGVuY29kZXIgY29uZmlndXJhdGlvbgorICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fcEZpbHRlci0+bV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisKKyAgICAvLyBBbm5vdGF0ZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIE1FRElBVFlQRV9TdHJlYW0gb3V0cHV0IHR5cGUKKyAgICBtX3BGaWx0ZXItPm1fYlN0cmVhbU91dHB1dCA9IChwbXQtPm1ham9ydHlwZSA9PSBNRURJQVRZUEVfU3RyZWFtKTsKKworICAgIGlmIChwbXQtPm1ham9ydHlwZSA9PSBNRURJQVRZUEVfU3RyZWFtKSB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBzZXR0aW5ncyB0aGF0IHdlcmUKKyAgICAgICAgLy8gY2FjaGVkIGluIHRoZSBDTXBlZ0F1ZEVuY091dFBpbjo6R2V0TWVkaWFUeXBlKCkgY2FsbAorICAgICAgICBtZWMuZHdTYW1wbGVSYXRlID0gbV9DdXJyZW50T3V0cHV0Rm9ybWF0Lm5TYW1wbGVSYXRlOworICAgICAgICBtZWMuZHdCaXRyYXRlID0gbV9DdXJyZW50T3V0cHV0Rm9ybWF0Lm5CaXRSYXRlOworICAgICAgICBtZWMuQ2hNb2RlID0gbV9DdXJyZW50T3V0cHV0Rm9ybWF0LkNoTW9kZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIGRpcmVjdGx5IHVzaW5nIHRoZSB2YWx1ZXMKKyAgICAgICAgLy8gcGFzc2VkIHZpYSB0aGUgQ01lZGlhVHlwZSBzdHJ1Y3R1cmUuICAKKyAgICAgICAgTVBFR0xBWUVSM1dBVkVGT1JNQVQgKnBmbXQgPSAoTVBFR0xBWUVSM1dBVkVGT1JNQVQqKSBwbXQtPkZvcm1hdCgpOworICAgICAgICBtZWMuZHdTYW1wbGVSYXRlID0gcGZtdC0+d2Z4Lm5TYW1wbGVzUGVyU2VjOworICAgICAgICBtZWMuZHdCaXRyYXRlID0gcGZtdC0+d2Z4Lm5BdmdCeXRlc1BlclNlYyAqIDggLyAxMDAwOworCisgICAgICAgIGlmIChwZm10LT53ZngubkNoYW5uZWxzID09IDEpIHsgbWVjLkNoTW9kZSA9IE1PTk87IH0KKyAgICAgICAgZWxzZSBpZiAocGZtdC0+d2Z4Lm5DaGFubmVscyA9PSAyICYmIG1lYy5DaE1vZGUgPT0gTU9OTyAmJiAhbWVjLmJGb3JjZU1vbm8pIHsgbWVjLkNoTW9kZSA9IFNURVJFTzsgfQorICAgIH0KKyAgICBtX3BGaWx0ZXItPm1fRW5jb2Rlci5TZXRPdXRwdXRUeXBlKG1lYyk7CisKKyAgICAvLyBOb3cgY29uZmlndXJlIHRoaXMgTWVkaWFUeXBlIG9uIHRoZSBvdXRwdXQgcGluCisgICAgSFJFU1VMVCBociA9IENUcmFuc2Zvcm1PdXRwdXRQaW46OlNldE1lZGlhVHlwZShwbXQpOworICAgIHJldHVybiBocjsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0cmlldmUgdGhlIHZhcmlvdXMgTWVkaWFUeXBlcyB0aGF0IG1hdGNoIHRoZSBhZHZlcnRpc2VkIGZvcm1hdHMKKy8vIHN1cHBvcnRlZCBvbiB0aGUgb3V0cHV0IHBpbiBhbmQgY29uZmlndXJlIGFuIEFNX01FRElBX1RZUEUgb3V0cHV0IAorLy8gc3RydWN0dXJlIHRoYXQgaXMgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGZvcm1hdC4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitIUkVTVUxUIENNcGVnQXVkRW5jT3V0UGluOjpHZXRNZWRpYVR5cGUoaW50IGlQb3NpdGlvbiwgQ01lZGlhVHlwZSAqcG10KQoreworICAgIGlmIChpUG9zaXRpb24gPCAwKSByZXR1cm4gRV9JTlZBTElEQVJHOworCisgICAgLy8gSWYgaVBvc2l0aW9uIGVxdWFscyB6ZXJvIHRoZW4gd2UgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgTWVkaWFUeXBlIAorICAgIGlmIChpUG9zaXRpb24gPT0gMCkgeworICAgICAgICAqcG10ID0gbV9tdDsKKyAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgfQorCisgICAgc3dpdGNoIChpUG9zaXRpb24pCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBtdC0+U2V0VHlwZSgmTUVESUFUWVBFX0F1ZGlvKTsKKyAgICAgICAgICAgIHBtdC0+U2V0U3VidHlwZSgmTUVESUFTVUJUWVBFX01QMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBtdC0+U2V0VHlwZSgmTUVESUFUWVBFX1N0cmVhbSk7CisgICAgICAgICAgICBwbXQtPlNldFN1YnR5cGUoJk1FRElBU1VCVFlQRV9NUEVHMUF1ZGlvKTsKKyAgICAgICAgICAgIHBtdC0+U2V0Rm9ybWF0VHlwZSgmR1VJRF9OVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgeyAgIC8vIFRoZSBsYXN0IGNhc2UgdGhhdCB3ZSBldmFsdWF0ZSBpcyB0aGUgTVBFRzJfUEVTIGZvcm1hdCwgYnV0IGlmIHRoZSAKKyAgICAgICAgICAgIC8vIGVuY29kZXIgaXNuJ3QgY29uZmlndXJlZCBmb3IgaXQgdGhlbiBqdXN0IHJldHVybiBWRldfU19OT19NT1JFX0lURU1TCisgICAgICAgICAgICBpZiAoICFtX3BGaWx0ZXItPm1fRW5jb2Rlci5Jc1BFUygpICkgeyByZXR1cm4gVkZXX1NfTk9fTU9SRV9JVEVNUzsgfQorCisgICAgICAgICAgICBwbXQtPlNldFR5cGUoJk1FRElBVFlQRV9NUEVHMl9QRVMpOworICAgICAgICAgICAgcG10LT5TZXRTdWJ0eXBlKCZNRURJQVNVQlRZUEVfTVBFRzJfQVVESU8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBWRldfU19OT19NT1JFX0lURU1TOworICAgIH0KKworCisgICAgLy8gT3V0cHV0IGNhcGFiaWxpdGllcyBhcmUgZGVwZW5kZW50IG9uIHRoZSBpbnB1dCBzbyBpbnN1cmUgaXQgaXMgY29ubmVjdGVkCisgICAgaWYgKCAhbV9wRmlsdGVyLT5tX3BJbnB1dC0+SXNDb25uZWN0ZWQoKSApIHsKKyAgICAgICAgcG10LT5TZXRGb3JtYXRUeXBlKCZGT1JNQVRfTm9uZSk7CisgICAgICAgIHJldHVybiBOT0VSUk9SOworICAgIH0KKworCisgICAgLy8gQW5ub3RhdGUgdGhlIGN1cnJlbnQgTWVkaWFUeXBlIGluZGV4IGZvciByZWNhbGwgaW4gQ01wZWdBdWRFbmM6OlJlY29ubmVjdCgpCisgICAgbV9wRmlsdGVyLT5tX2N1cnJlbnRNZWRpYVR5cGVJbmRleCA9IGlQb3NpdGlvbjsKKworICAgIC8vIENvbmZpZ3VyZSB0aGUgcmVtYWluaW5nIEFNX01FRElBX1RZUEUgcGFyYW1ldGVycyB1c2luZyB0aGUgY2FjaGVkIGVuY29kZXIgc2V0dGluZ3MuCisgICAgLy8gU2luY2UgTUVESUFUWVBFX1N0cmVhbSBkb2Vzbid0IGhhdmUgYSBmb3JtYXQgYmxvY2sgdGhlIGN1cnJlbnQgc2V0dGluZ3MgCisgICAgLy8gZm9yIENIQU5ORUwgTU9ERSwgQklUUkFURSBhbmQgU0FNUExFUkFURSBhcmUgY2FjaGVkIGluIG1fQ3VycmVudE91dHB1dEZvcm1hdCBmb3IgdXNlCisgICAgLy8gd2hlbiB3ZSBzZXR1cCB0aGUgTEFNRSBlbmNvZGVyIGluIHRoZSBjYWxsIHRvIENNcGVnQXVkRW5jT3V0UGluOjpTZXRNZWRpYVR5cGUoKQorICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fcEZpbHRlci0+bV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7ICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZworCisgICAgV0FWRUZPUk1BVEVYIHdmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uCisgICAgbV9wRmlsdGVyLT5tX0VuY29kZXIuR2V0SW5wdXRUeXBlKCZ3Zik7CisKKyAgICAvLyBVc2UgdGhlIGN1cnJlbnQgZW5jb2RlciBzYW1wbGUgcmF0ZSB1bmxlc3MgaXQgaXNuJ3QgYSBtb2R1bHVzIG9mIHRoZSBpbnB1dCByYXRlCisgICAgaWYgKCh3Zi5uU2FtcGxlc1BlclNlYyAlIG1lYy5kd1NhbXBsZVJhdGUpID09IDApIHsgCisgICAgICAgIG1fQ3VycmVudE91dHB1dEZvcm1hdC5uU2FtcGxlUmF0ZSA9IG1lYy5kd1NhbXBsZVJhdGU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtX0N1cnJlbnRPdXRwdXRGb3JtYXQublNhbXBsZVJhdGUgPSB3Zi5uU2FtcGxlc1BlclNlYzsKKyAgICB9CisKKyAgICAvLyBTZWxlY3QgdGhlIG91dHB1dCBjaGFubmVsIGNvbmZpZyBiYXNlZCBvbiB0aGUgZW5jb2RlciBjb25maWcgYW5kIGlucHV0IGNoYW5uZWwgY291bnQKKyAgICBtX0N1cnJlbnRPdXRwdXRGb3JtYXQuQ2hNb2RlID0gbWVjLkNoTW9kZTsKKyAgICBzd2l0Y2ggKHdmLm5DaGFubmVscykgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIGFsdGVyIENoTW9kZSBiYXNlZCB1cG9uIHRoZSBjaGFubmVsIGNvdW50IGFuZCBGb3JjZU1vbm8gZmxhZyAKKyAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgeworICAgICAgICAgICAgbV9DdXJyZW50T3V0cHV0Rm9ybWF0LkNoTW9kZSA9IE1PTk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtZWMuQ2hNb2RlID09IE1PTk8gJiYgIW1lYy5iRm9yY2VNb25vKSB7IG1fQ3VycmVudE91dHB1dEZvcm1hdC5DaE1vZGUgPSBTVEVSRU87IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBtZWMuYkZvcmNlTW9ubyApIHsgbV9DdXJyZW50T3V0cHV0Rm9ybWF0LkNoTW9kZSA9IE1PTk87IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2VsZWN0IHRoZSBlbmNvZGVyIGJpdCByYXRlLiBJbiBWQlIgbW9kZSB3ZSBzZXQgdGhlIGRhdGEgcmF0ZSBwYXJhbWV0ZXIKKyAgICAvLyBvZiB0aGUgV0FWRV9GT1JNQVRfTVBFR0xBWUVSMyBzdHJ1Y3R1cmUgdG8gdGhlIG1pbmltdW0gVkJSIHZhbHVlCisgICAgbV9DdXJyZW50T3V0cHV0Rm9ybWF0Lm5CaXRSYXRlID0gKG1lYy52bVZhcmlhYmxlID09IHZicl9vZmYpID8gbWVjLmR3Qml0cmF0ZSA6IG1lYy5kd1ZhcmlhYmxlTWluOworCisgICAgaWYgKHBtdC0+bWFqb3J0eXBlID09IE1FRElBVFlQRV9TdHJlYW0pIHJldHVybiBOT0VSUk9SOyAgICAgLy8gTm8gZnVydGhlciBjb25maWcgcmVxdWlyZWQgZm9yIE1FRElBVFlQRV9TdHJlYW0KKworCisgICAgLy8gTm93IGNvbmZpZ3VyZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBXQVZFX0ZPUk1BVF9NUEVHTEFZRVIzIGZvcm1hdCBibG9jaworICAgIC8vIGFuZCBpdHMgcGFyZW50IEFNX01FRElBX1RZUEUgc3RydWN0dXJlCisgICAgREVDTEFSRV9QVFIoTVBFR0xBWUVSM1dBVkVGT1JNQVQsIHBfbXAzd3ZmbXQsIHBtdC0+QWxsb2NGb3JtYXRCdWZmZXIoc2l6ZW9mKE1QRUdMQVlFUjNXQVZFRk9STUFUKSkpOworICAgIFplcm9NZW1vcnkocF9tcDN3dmZtdCwgc2l6ZW9mKE1QRUdMQVlFUjNXQVZFRk9STUFUKSk7CisKKyAgICBwX21wM3d2Zm10LT53Zngud0Zvcm1hdFRhZyA9IFdBVkVfRk9STUFUX01QRUdMQVlFUjM7CisgICAgcF9tcDN3dmZtdC0+d2Z4Lm5DaGFubmVscyA9IChtX0N1cnJlbnRPdXRwdXRGb3JtYXQuQ2hNb2RlID09IE1PTk8pID8gMSA6IDI7CisgICAgcF9tcDN3dmZtdC0+d2Z4Lm5TYW1wbGVzUGVyU2VjID0gbV9DdXJyZW50T3V0cHV0Rm9ybWF0Lm5TYW1wbGVSYXRlOworICAgIHBfbXAzd3ZmbXQtPndmeC5uQXZnQnl0ZXNQZXJTZWMgPSBHRVRfREFUQVJBVEUobV9DdXJyZW50T3V0cHV0Rm9ybWF0Lm5CaXRSYXRlKTsKKyAgICBwX21wM3d2Zm10LT53ZngubkJsb2NrQWxpZ24gPSAxOworICAgIHBfbXAzd3ZmbXQtPndmeC53Qml0c1BlclNhbXBsZSA9IDA7CisgICAgcF9tcDN3dmZtdC0+d2Z4LmNiU2l6ZSA9IHNpemVvZihNUEVHTEFZRVIzV0FWRUZPUk1BVCkgLSBzaXplb2YoV0FWRUZPUk1BVEVYKTsKKworICAgIHBfbXAzd3ZmbXQtPndJRCA9IE1QRUdMQVlFUjNfSURfTVBFRzsKKyAgICBwX21wM3d2Zm10LT5mZHdGbGFncyA9IE1QRUdMQVlFUjNfRkxBR19QQURESU5HX0lTTzsKKyAgICBwX21wM3d2Zm10LT5uQmxvY2tTaXplID0gR0VUX0ZSQU1FTEVOR1RIKG1fQ3VycmVudE91dHB1dEZvcm1hdC5uQml0UmF0ZSwgcF9tcDN3dmZtdC0+d2Z4Lm5TYW1wbGVzUGVyU2VjKTsKKyAgICBwX21wM3d2Zm10LT5uRnJhbWVzUGVyQmxvY2sgPSAxOworICAgIHBfbXAzd3ZmbXQtPm5Db2RlY0RlbGF5ID0gMDsKKworICAgIHBtdC0+U2V0VGVtcG9yYWxDb21wcmVzc2lvbihGQUxTRSk7CisgICAgcG10LT5TZXRTYW1wbGVTaXplKE9VVF9CVUZGRVJfU0laRSk7CisgICAgcG10LT5TZXRGb3JtYXQoKExQQllURSlwX21wM3d2Zm10LCBzaXplb2YoTVBFR0xBWUVSM1dBVkVGT1JNQVQpKTsKKyAgICBwbXQtPlNldEZvcm1hdFR5cGUoJkZPUk1BVF9XYXZlRm9ybWF0RXgpOworCisgICAgcmV0dXJuIE5PRVJST1I7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBzZWUgaWYgYSBnaXZlbiBvdXRwdXQgZm9ybWF0IGlzIHN1cHBvcnRlZAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0hSRVNVTFQgQ01wZWdBdWRFbmNPdXRQaW46OkNoZWNrTWVkaWFUeXBlKGNvbnN0IENNZWRpYVR5cGUgKnBtdE91dCkKK3sKKyAgICAvLyBGYWlsIGlmIHRoZSBpbnB1dCBwaW4gaXMgbm90IGNvbm5lY3RlZC4KKyAgICBpZiAoIW1fcEZpbHRlci0+bV9wSW5wdXQtPklzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIFZGV19FX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgLy8gUmVqZWN0IGFueSBtZWRpYSB0eXBlcyB0aGF0IHdlIGtub3cgaW4gYWR2YW5jZSBvdXIgCisgICAgLy8gZmlsdGVyIGNhbm5vdCB1c2UuCisgICAgaWYgKHBtdE91dC0+bWFqb3J0eXBlICE9IE1FRElBVFlQRV9BdWRpbyAmJiBwbXRPdXQtPm1ham9ydHlwZSAhPSBNRURJQVRZUEVfU3RyZWFtKSB7IHJldHVybiBTX0ZBTFNFOyB9CisKKyAgICAvLyBJZiBTZXRGb3JtYXQgd2FzIHByZXZpb3VzbHkgY2FsbGVkLCBjaGVjayB3aGV0aGVyIHBtdE91dCBleGFjdGx5IAorICAgIC8vIG1hdGNoZXMgdGhlIGZvcm1hdCB0aGF0IHdhcyBzcGVjaWZpZWQgaW4gU2V0Rm9ybWF0LgorICAgIC8vIFJldHVybiBTX09LIGlmIHRoZXkgbWF0Y2gsIG9yIFZGV19FX0lOVkFMSURNRURJQVRZUEUgb3RoZXJ3aXNlLikKKyAgICBpZiAoIG1fU2V0Rm9ybWF0ICkgeworICAgICAgICBpZiAoKnBtdE91dCAhPSBtX210KSB7IHJldHVybiBWRldfRV9JTlZBTElETUVESUFUWVBFOyB9CisgICAgICAgIGVsc2UgeyByZXR1cm4gU19PSzsgfQorICAgIH0KKworICAgIC8vIE5vdyBkbyB0aGUgbm9ybWFsIGNoZWNrIGZvciB0aGlzIG1lZGlhIHR5cGUuCisgICAgSFJFU1VMVCBocjsKKyAgICBociA9IG1fcEZpbHRlci0+Q2hlY2tUcmFuc2Zvcm0gKCZtX3BGaWx0ZXItPm1fcElucHV0LT5DdXJyZW50TWVkaWFUeXBlKCksICAvLyBUaGUgaW5wdXQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtdE91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJvcG9zZWQgb3V0cHV0IHR5cGUuCisKKyAgICBpZiAoaHIgPT0gU19PSykgeworICAgICAgICByZXR1cm4gU19PSzsgICAgICAgICAgIC8vIFRoaXMgZm9ybWF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBpbnB1dCB0eXBlLgorICAgIH0KKyAKKyAgICAvLyBUaGlzIGZvcm1hdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHR5cGUuIAorICAgIC8vIE1heWJlIHdlIGNhbiByZWNvbm5lY3QgdGhlIGlucHV0IHBpbiB3aXRoIGEgbmV3IGlucHV0IHR5cGUuCisgICAgCisgICAgLy8gRW51bWVyYXRlIHRoZSB1cHN0cmVhbSBmaWx0ZXIncyBwcmVmZXJyZWQgb3V0cHV0IHR5cGVzLCBhbmQgCisgICAgLy8gc2VlIGlmIG9uZSBvZiB0aGVtIHdpbGwgd29yay4KKyAgICBDTWVkaWFUeXBlICpwbXRFbnVtOworICAgIEJPT0wgZkZvdW5kID0gRkFMU0U7CisgICAgSUVudW1NZWRpYVR5cGVzICpwRW51bTsKKyAgICBociA9IG1fcEZpbHRlci0+bV9wSW5wdXQtPkdldENvbm5lY3RlZCgpLT5FbnVtTWVkaWFUeXBlcygmcEVudW0pOworICAgIGlmIChociAhPSBTX09LKSB7CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQorCisgICAgd2hpbGUgKGhyID0gcEVudW0tPk5leHQoMSwgKEFNX01FRElBX1RZUEUgKiopJnBtdEVudW0sIE5VTEwpLCBociA9PSBTX09LKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhpcyBpbnB1dCB0eXBlIGFnYWluc3QgdGhlIHByb3Bvc2VkIG91dHB1dCB0eXBlLgorICAgICAgICBociA9IG1fcEZpbHRlci0+Q2hlY2tUcmFuc2Zvcm0ocG10RW51bSwgcG10T3V0KTsKKyAgICAgICAgaWYgKGhyICE9IFNfT0spIHsKKyAgICAgICAgICAgIERlbGV0ZU1lZGlhVHlwZShwbXRFbnVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUcnkgdGhlIG5leHQgb25lLgorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBpbnB1dCB0eXBlIGlzIGEgcG9zc2libGUgY2FuZGlkYXRlLiBCdXQsIHdlIGhhdmUgdG8gbWFrZQorICAgICAgICAvLyBzdXJlIHRoYXQgdGhlIHVwc3RyZWFtIGZpbHRlciBjYW4gc3dpdGNoIHRvIHRoaXMgdHlwZS4gCisgICAgICAgIGhyID0gbV9wRmlsdGVyLT5tX3BJbnB1dC0+R2V0Q29ubmVjdGVkKCktPlF1ZXJ5QWNjZXB0KHBtdEVudW0pOworICAgICAgICBpZiAoaHIgIT0gU19PSykgeworICAgICAgICAgICAgLy8gVGhlIHVwc3RyZWFtIGZpbHRlciB3aWxsIG5vdCBzd2l0Y2ggdG8gdGhpcyB0eXBlLgorICAgICAgICAgICAgRGVsZXRlTWVkaWFUeXBlKHBtdEVudW0pOworICAgICAgICAgICAgY29udGludWU7IC8vIFRyeSB0aGUgbmV4dCBvbmUuCisgICAgICAgIH0KKyAgICAgICAgZkZvdW5kID0gVFJVRTsKKyAgICAgICAgRGVsZXRlTWVkaWFUeXBlKHBtdEVudW0pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcEVudW0tPlJlbGVhc2UoKTsKKworICAgIGlmIChmRm91bmQpIHsKKyAgICAgICAgLy8gVGhpcyBvdXRwdXQgdHlwZSBpcyBPSywgYnV0IGlmIHdlIGFyZSBhc2tlZCB0byB1c2UgaXQsIHdlIHdpbGwKKyAgICAgICAgLy8gbmVlZCB0byByZWNvbm5lY3Qgb3VyIGlucHV0IHBpbi4gKFNlZSBTZXRGb3JtYXQsIGJlbG93LikKKyAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gVkZXX0VfSU5WQUxJRE1FRElBVFlQRTsKKyAgICB9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gIElBTVN0cmVhbUNvbmZpZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDTXBlZ0F1ZEVuY091dFBpbjo6U2V0Rm9ybWF0KEFNX01FRElBX1RZUEUgKnBtdCkKK3sKKyAgICBDaGVja1BvaW50ZXIocG10LCBFX1BPSU5URVIpOworICAgIEhSRVNVTFQgaHI7CisKKyAgICAvLyBIb2xkIHRoZSBmaWx0ZXIgc3RhdGUgbG9jaywgdG8gbWFrZSBzdXJlIHRoYXQgc3RyZWFtaW5nIGlzbid0IAorICAgIC8vIGluIHRoZSBtaWRkbGUgb2Ygc3RhcnRpbmcgb3Igc3RvcHBpbmc6CisgICAgQ0F1dG9Mb2NrIGNPYmplY3RMb2NrKCZtX3BGaWx0ZXItPm1fY3NGaWx0ZXIpOworCisgICAgLy8gQ2Fubm90IHNldCB0aGUgZm9ybWF0IHVubGVzcyB0aGUgZmlsdGVyIGlzIHN0b3BwZWQuCisgICAgaWYgKG1fcEZpbHRlci0+bV9TdGF0ZSAhPSBTdGF0ZV9TdG9wcGVkKSB7CisgICAgICAgIHJldHVybiBWRldfRV9OT1RfU1RPUFBFRDsKKyAgICB9CisKKyAgICAvLyBUaGUgc2V0IG9mIHBvc3NpYmxlIG91dHB1dCBmb3JtYXRzIGRlcGVuZHMgb24gdGhlIGlucHV0IGZvcm1hdCwKKyAgICAvLyBzbyBpZiB0aGUgaW5wdXQgcGluIGlzIG5vdCBjb25uZWN0ZWQsIHJldHVybiBhIGZhaWx1cmUgY29kZS4KKyAgICBpZiAoIW1fcEZpbHRlci0+bV9wSW5wdXQtPklzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIFZGV19FX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHBpbiBpcyBhbHJlYWR5IHVzaW5nIHRoaXMgZm9ybWF0LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisgICAgaWYgKElzQ29ubmVjdGVkKCkgJiYgQ3VycmVudE1lZGlhVHlwZSgpID09ICpwbXQpIHsKKyAgICAgICAgaWYgKCBtX1NldEZvcm1hdCApIHJldHVybiBTX09LOworICAgIH0KKworICAgIC8vIFNlZSBpZiB0aGlzIG1lZGlhIHR5cGUgaXMgYWNjZXB0YWJsZS4KKyAgICBpZiAoKGhyID0gQ2hlY2tNZWRpYVR5cGUoKENNZWRpYVR5cGUgKilwbXQpKSAhPSBTX09LKSB7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSdyZSBjb25uZWN0ZWQgdG8gYSBkb3duc3RyZWFtIGZpbHRlciwgd2UgaGF2ZSB0byBtYWtlCisgICAgLy8gc3VyZSB0aGF0IHRoZSBkb3duc3RyZWFtIGZpbHRlciBhY2NlcHRzIHRoaXMgbWVkaWEgdHlwZS4KKyAgICBpZiAoSXNDb25uZWN0ZWQoKSkgeworICAgICAgICBociA9IEdldENvbm5lY3RlZCgpLT5RdWVyeUFjY2VwdChwbXQpOworICAgICAgICBpZiAoaHIgIT0gU19PSykgeworICAgICAgICAgICAgcmV0dXJuIFZGV19FX0lOVkFMSURNRURJQVRZUEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgbWFrZSBhIG5vdGUgdGhhdCBmcm9tIG5vdyBvbiwgdGhpcyBpcyB0aGUgb25seSBmb3JtYXQgYWxsb3dlZCwKKyAgICAvLyBhbmQgcmVmdXNlIGFueXRoaW5nIGJ1dCB0aGlzIGluIHRoZSBDaGVja01lZGlhVHlwZSgpIGNvZGUgYWJvdmUuCisgICAgbV9TZXRGb3JtYXQgPSBUUlVFOworICAgIG1fbXQgPSAqcG10OworCisgICAgLy8gQ2hhbmdpbmcgdGhlIGZvcm1hdCBtZWFucyByZWNvbm5lY3RpbmcgaWYgbmVjZXNzYXJ5LgorICAgIGlmIChJc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgIG1fcEZpbHRlci0+bV9wR3JhcGgtPlJlY29ubmVjdCh0aGlzKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9FUlJPUjsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDTXBlZ0F1ZEVuY091dFBpbjo6R2V0Rm9ybWF0KEFNX01FRElBX1RZUEUgKipwcG10KQoreworICAgICpwcG10ID0gQ3JlYXRlTWVkaWFUeXBlKCZtX210KTsKKyAgICByZXR1cm4gU19PSzsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDTXBlZ0F1ZEVuY091dFBpbjo6R2V0TnVtYmVyT2ZDYXBhYmlsaXRpZXMoaW50ICpwaUNvdW50LCBpbnQgKnBpU2l6ZSkKK3sKKyAgICAvLyBUaGUgc2V0IG9mIHBvc3NpYmxlIG91dHB1dCBmb3JtYXRzIGRlcGVuZHMgb24gdGhlIGlucHV0IGZvcm1hdCwKKyAgICAvLyBzbyBpZiB0aGUgaW5wdXQgcGluIGlzIG5vdCBjb25uZWN0ZWQsIHJldHVybiBhIGZhaWx1cmUgY29kZS4KKyAgICBpZiAoIW1fcEZpbHRlci0+bV9wSW5wdXQtPklzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIFZGV19FX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgZW5jb2RlciBjb25maWd1cmF0aW9uCisgICAgTVBFR19FTkNPREVSX0NPTkZJRyBtZWM7CisgICAgbV9wRmlsdGVyLT5tX0VuY29kZXIuR2V0T3V0cHV0VHlwZSgmbWVjKTsKKworICAgIC8vIElmIHRoZSBlbmNvZGVyIGlzIGluIFZCUiBtb2RlIEdldFN0cmVhbUNhcHMoKSBpc24ndCBpbXBsZW1lbnRlZAorICAgIGlmIChtZWMudm1WYXJpYWJsZSAhPSB2YnJfb2ZmKSB7ICpwaUNvdW50ID0gMDsgfQorICAgIGVsc2UgeyAqcGlDb3VudCA9IG1fcEZpbHRlci0+bV9DYXBzTnVtOyB9CisKKyAgICAqcGlTaXplID0gc2l6ZW9mKEFVRElPX1NUUkVBTV9DT05GSUdfQ0FQUyk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ01wZWdBdWRFbmNPdXRQaW46OkdldFN0cmVhbUNhcHMoaW50IGlJbmRleCwgQU1fTUVESUFfVFlQRSAqKnBtdCwgQllURSAqcFNDQykKK3sKKyAgICAvLyBUaGUgc2V0IG9mIHBvc3NpYmxlIG91dHB1dCBmb3JtYXRzIGRlcGVuZHMgb24gdGhlIGlucHV0IGZvcm1hdCwKKyAgICAvLyBzbyBpZiB0aGUgaW5wdXQgcGluIGlzIG5vdCBjb25uZWN0ZWQsIHJldHVybiBhIGZhaWx1cmUgY29kZS4KKyAgICBpZiAoIW1fcEZpbHRlci0+bV9wSW5wdXQtPklzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIFZGV19FX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhcGFiaWxpdGllcyBhcnJheSBHZXRTdHJlYW1DYXBzKCkgaXNuJ3QgaW1wbGVtZW50ZWQKKyAgICBpZiAobV9wRmlsdGVyLT5tX0NhcHNOdW0gPT0gMCkgcmV0dXJuIEVfTk9USU1QTDsKKworICAgIC8vIElmIHRoZSBlbmNvZGVyIGlzIGluIFZCUiBtb2RlIEdldFN0cmVhbUNhcHMoKSBpc24ndCBpbXBsZW1lbnRlZAorICAgIE1QRUdfRU5DT0RFUl9DT05GSUcgbWVjOworICAgIG1fcEZpbHRlci0+bV9FbmNvZGVyLkdldE91dHB1dFR5cGUoJm1lYyk7CisgICAgaWYgKG1lYy52bVZhcmlhYmxlICE9IHZicl9vZmYpIHJldHVybiBFX05PVElNUEw7CisKKyAgICBpZiAoaUluZGV4IDwgMCkgcmV0dXJuIEVfSU5WQUxJREFSRzsKKyAgICBpZiAoaUluZGV4ID4gbV9wRmlsdGVyLT5tX0NhcHNOdW0pIHJldHVybiBTX0ZBTFNFOworCisgICAgLy8gTG9hZCB0aGUgTVBFRyBMYXllcjMgV2F2ZUZvcm1hdEV4IHN0cnVjdHVyZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlbnRyaWVzIAorICAgIC8vIGZvciB0aGlzIElBTVN0cmVhbUNvbmZpZyBpbmRleCBlbGVtZW50LgorICAgICpwbXQgPSBDcmVhdGVNZWRpYVR5cGUoJm1fbXQpOworICAgIGlmICgqcG10ID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOworCisgICAgREVDTEFSRV9QVFIoTVBFR0xBWUVSM1dBVkVGT1JNQVQsIHBfbXAzd3ZmbXQsICgqcG10KS0+cGJGb3JtYXQpOworCisgICAgKCpwbXQpLT5tYWpvcnR5cGUgPSBNRURJQVRZUEVfQXVkaW87CisgICAgKCpwbXQpLT5zdWJ0eXBlID0gTUVESUFTVUJUWVBFX01QMzsKKyAgICAoKnBtdCktPmJGaXhlZFNpemVTYW1wbGVzID0gVFJVRTsKKyAgICAoKnBtdCktPmJUZW1wb3JhbENvbXByZXNzaW9uID0gRkFMU0U7CisgICAgKCpwbXQpLT5sU2FtcGxlU2l6ZSA9IE9VVF9CVUZGRVJfU0laRTsKKyAgICAoKnBtdCktPmZvcm1hdHR5cGUgPSBGT1JNQVRfV2F2ZUZvcm1hdEV4OworICAgICgqcG10KS0+Y2JGb3JtYXQgPSBzaXplb2YoTVBFR0xBWUVSM1dBVkVGT1JNQVQpOworCisgICAgcF9tcDN3dmZtdC0+d2Z4LndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9NUEVHTEFZRVIzOworICAgIHBfbXAzd3ZmbXQtPndmeC5uQ2hhbm5lbHMgPSAyOworICAgIHBfbXAzd3ZmbXQtPndmeC5uU2FtcGxlc1BlclNlYyA9IG1fcEZpbHRlci0+T3V0cHV0Q2Fwc1tpSW5kZXhdLm5TYW1wbGVSYXRlOworICAgIHBfbXAzd3ZmbXQtPndmeC5uQXZnQnl0ZXNQZXJTZWMgPSBHRVRfREFUQVJBVEUobV9wRmlsdGVyLT5PdXRwdXRDYXBzW2lJbmRleF0ubkJpdFJhdGUpOworICAgIHBfbXAzd3ZmbXQtPndmeC5uQmxvY2tBbGlnbiA9IDE7CisgICAgcF9tcDN3dmZtdC0+d2Z4LndCaXRzUGVyU2FtcGxlID0gMDsKKyAgICBwX21wM3d2Zm10LT53ZnguY2JTaXplID0gc2l6ZW9mKE1QRUdMQVlFUjNXQVZFRk9STUFUKSAtIHNpemVvZihXQVZFRk9STUFURVgpOworCisgICAgcF9tcDN3dmZtdC0+d0lEID0gTVBFR0xBWUVSM19JRF9NUEVHOworICAgIHBfbXAzd3ZmbXQtPmZkd0ZsYWdzID0gTVBFR0xBWUVSM19GTEFHX1BBRERJTkdfSVNPOworICAgIHBfbXAzd3ZmbXQtPm5CbG9ja1NpemUgPSBHRVRfRlJBTUVMRU5HVEgobV9wRmlsdGVyLT5PdXRwdXRDYXBzW2lJbmRleF0ubkJpdFJhdGUsIG1fcEZpbHRlci0+T3V0cHV0Q2Fwc1tpSW5kZXhdLm5TYW1wbGVSYXRlKTsKKyAgICBwX21wM3d2Zm10LT5uRnJhbWVzUGVyQmxvY2sgPSAxOworICAgIHBfbXAzd3ZmbXQtPm5Db2RlY0RlbGF5ID0gMDsKKworICAgIC8vIFNldCB1cCB0aGUgY29tcGFuaW9uIEFVRElPX1NUUkVBTV9DT05GSUdfQ0FQUyBzdHJ1Y3R1cmUKKyAgICAvLyBXZSBhcmUgb25seSB1c2luZyB0aGUgQ0hBTk5FTFMgZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlCisgICAgREVDTEFSRV9QVFIoQVVESU9fU1RSRUFNX0NPTkZJR19DQVBTLCBwYXNjYywgcFNDQyk7CisKKyAgICBaZXJvTWVtb3J5KHBhc2NjLCBzaXplb2YoQVVESU9fU1RSRUFNX0NPTkZJR19DQVBTKSk7CisgICAgcGFzY2MtPmd1aWQgPSBNRURJQVRZUEVfQXVkaW87CisKKyAgICBwYXNjYy0+TWluaW11bUNoYW5uZWxzID0gMTsKKyAgICBwYXNjYy0+TWF4aW11bUNoYW5uZWxzID0gMjsKKyAgICBwYXNjYy0+Q2hhbm5lbHNHcmFudWxhcml0eSA9IDE7CisKKyAgICBwYXNjYy0+TWluaW11bVNhbXBsZUZyZXF1ZW5jeSA9IHBfbXAzd3ZmbXQtPndmeC5uU2FtcGxlc1BlclNlYzsKKyAgICBwYXNjYy0+TWF4aW11bVNhbXBsZUZyZXF1ZW5jeSA9IHBfbXAzd3ZmbXQtPndmeC5uU2FtcGxlc1BlclNlYzsKKyAgICBwYXNjYy0+U2FtcGxlRnJlcXVlbmN5R3JhbnVsYXJpdHkgPSAwOworCisgICAgcGFzY2MtPk1pbmltdW1CaXRzUGVyU2FtcGxlID0gcF9tcDN3dmZtdC0+d2Z4LndCaXRzUGVyU2FtcGxlOworICAgIHBhc2NjLT5NYXhpbXVtQml0c1BlclNhbXBsZSA9IHBfbXAzd3ZmbXQtPndmeC53Qml0c1BlclNhbXBsZTsKKyAgICBwYXNjYy0+Qml0c1BlclNhbXBsZUdyYW51bGFyaXR5ID0gMDsKKworICAgIHJldHVybiBTX09LOworfQorCmRpZmYgLS1naXQgYS9kc2hvdy9NcGVnYWMuZGVmIGIvZHNob3cvTXBlZ2FjLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EyYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvTXBlZ2FjLmRlZgpAQCAtMCwwICsxLDI3IEBACis7Cis7IExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKzsKKzsgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWFyaWUgT3Jsb3ZhLCBQZXRlciBHdWJhbm92LCBWaXRhbHkgSXZhbm92LCBFbGVjYXJkIEx0ZC4KKzsKKzsgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworOyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOworOyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorOyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsKKzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKzsgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCis7IEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorOworCitMSUJSQVJZICAgICBsYW1lLmF4CitFWFBPUlRTCisgICAgRGxsR2V0Q2xhc3NPYmplY3QgICAgIFBSSVZBVEUKKyAgICBEbGxDYW5VbmxvYWROb3cgICAgICAgUFJJVkFURQorICAgIERsbFJlZ2lzdGVyU2VydmVyICAgICBQUklWQVRFCisgICAgRGxsVW5yZWdpc3RlclNlcnZlciAgIFBSSVZBVEUKZGlmZiAtLWdpdCBhL2RzaG93L01wZWdhYy5oIGIvZHNob3cvTXBlZ2FjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0MWYwYQotLS0gL2Rldi9udWxsCisrKyBiL2RzaG93L01wZWdhYy5oCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogIExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKyAqICBEaXJlY3RTaG93IGZpbHRlciBpbXBsZW1lbnRhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNYXJpZSBPcmxvdmEsIFBldGVyIEd1YmFub3YsIFZpdGFseSBJdmFub3YsIEVsZWNhcmQgTHRkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPG1tcmVnLmg+CisjaW5jbHVkZSAiRW5jb2Rlci5oIgorCisjZGVmaW5lIEtFWV9MQU1FX0VOQ09ERVIgICAgICAgICAgICAiU09GVFdBUkVcXEdOVVxcTEFNRSBNUEVHIExheWVyIElJSSBBdWRpbyBFbmNvZGVyIEZpbHRlciIKKworI2RlZmluZSBWQUxVRV9CSVRSQVRFICAgICAgICAgICAgICAgIkJpdHJhdGUiCisjZGVmaW5lIFZBTFVFX1ZBUklBQkxFICAgICAgICAgICAgICAiVmFyaWFibGUiCisjZGVmaW5lIFZBTFVFX1ZBUklBQkxFTUlOICAgICAgICAgICAiVmFyaWFibGVNaW4iCisjZGVmaW5lIFZBTFVFX1ZBUklBQkxFTUFYICAgICAgICAgICAiVmFyaWFibGVNYXgiCisjZGVmaW5lIFZBTFVFX1FVQUxJVFkgICAgICAgICAgICAgICAiUXVhbGl0eSIKKyNkZWZpbmUgVkFMVUVfVkJSX1FVQUxJVFkgICAgICAgICAgICJWQlIgUXVhbGl0eSIKKyNkZWZpbmUgVkFMVUVfU0FNUExFX1JBVEUgICAgICAgICAgICJTYW1wbGUgUmF0ZSIKKworI2RlZmluZSBWQUxVRV9TVEVSRU9fTU9ERSAgICAgICAgICAgIlN0ZXJlbyBNb2RlIgorI2RlZmluZSBWQUxVRV9GT1JDRV9NUyAgICAgICAgICAgICAgIkZvcmNlIE1TIgorCisjZGVmaW5lIFZBTFVFX0xBWUVSICAgICAgICAgICAgICAgICAiTGF5ZXIiCisjZGVmaW5lIFZBTFVFX09SSUdJTkFMICAgICAgICAgICAgICAiT3JpZ2luYWwiCisjZGVmaW5lIFZBTFVFX0NPUFlSSUdIVCAgICAgICAgICAgICAiQ29weXJpZ2h0IgorI2RlZmluZSBWQUxVRV9DUkMgICAgICAgICAgICAgICAgICAgIkNSQyIKKyNkZWZpbmUgVkFMVUVfRk9SQ0VfTU9OTyAgICAgICAgICAgICJGb3JjZSBNb25vIgorI2RlZmluZSBWQUxVRV9TRVRfRFVSQVRJT04gICAgICAgICAgIlNldCBEdXJhdGlvbiIKKyNkZWZpbmUgVkFMVUVfU0FNUExFX09WRVJMQVAgICAgICAgICJBbGxvdyBzYW1wbGUgb3ZlcmxhcCIKKyNkZWZpbmUgVkFMVUVfUEVTICAgICAgICAgICAgICAgICAgICJQRVMiCisKKyNkZWZpbmUgVkFMVUVfRU5GT1JDRV9NSU4gICAgICAgICAgICJFbmZvcmNlVkJSbWluIgorI2RlZmluZSBWQUxVRV9WT0lDRSAgICAgICAgICAgICAgICAgIlZvaWNlIE1vZGUiCisjZGVmaW5lIFZBTFVFX0tFRVBfQUxMX0ZSRVEgICAgICAgICAiS2VlcCBBbGwgRnJlcXVlbmNpZXMiCisjZGVmaW5lIFZBTFVFX1NUUklDVF9JU08gICAgICAgICAgICAiU3RyaWN0IElTTyIKKyNkZWZpbmUgVkFMVUVfRElTQUJMRV9TSE9SVF9CTE9DSyAgICJObyBTaG9ydCBCbG9jayIKKyNkZWZpbmUgVkFMVUVfWElOR19UQUcgICAgICAgICAgICAgICJYaW5nIFRhZyIKKyNkZWZpbmUgVkFMVUVfTU9ERV9GSVhFRCAgICAgICAgICAgICJNb2RlIEZpeGVkIgorCisKK3R5cGVkZWYgc3RydWN0IAoreworICAgIERXT1JEICAgICAgblNhbXBsZVJhdGU7CisgICAgRFdPUkQgICAgICBuQml0UmF0ZTsKKyAgICBNUEVHX21vZGUgIENoTW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hhbm5lbCBjb2RpbmcgbW9kZQorfSBjdXJyZW50X291dHB1dF9mb3JtYXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgRFdPUkQgICBuU2FtcGxlUmF0ZTsKKyAgICBEV09SRCAgIG5CaXRSYXRlOworfSBvdXRwdXRfY2Fwc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExPTkdMT05HICAgICAgICBzYW1wbGU7CisgICAgUkVGRVJFTkNFX1RJTUUgIGRlbHRhOworCisgICAgQk9PTCAgICAgICAgICAgIGFwcGxpZWQ7Cit9IHJlc3luY19wb2ludF90OworCisjZGVmaW5lIFJFU1lOQ19DT1VOVCAgICA0CisKKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXBhYmlsaXRpZXMgdGhhdCB3ZSBjYW4gZXhwb3NlIGluIG91ciBJQU1TdHJlYW1Db25maWcKKy8vIGltcGxlbWVudGF0aW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gMTAwLiBUaGlzIG51bWJlciBpcyBsYXJnZXIgdGhhbiB3ZQorLy8gc2hvdWxkIGV2ZXIgcmVhbGlzdGljYWxseSBuZWVkLiBIb3dldmVyLCBhIGNsZWFuZXIgaW1wbGVtZW50YXRpb24gbWlnaHQKKy8vIGJlIHRvIHVzZSBhIGR5bmFtaWNhbGx5IHNpemVkIGFycmF5IGxpa2Ugc3RkOjp2ZWN0b3Igb3IgQ0F0bEFycmF5IHRvIAorLy8gaG9sZCB0aGlzIGRhdGEuCisjZGVmaW5lIE1BWF9JQU1TVFJFQU1DT05GSUdfQ0FQUyAxMDAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ01wZWdBdWRFbmMgY2xhc3MgLSBpbXBsZW1lbnRhdGlvbiBmb3IgSVRyYW5zZm9ybUZpbHRlciBpbnRlcmZhY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2NsYXNzIENNcGVnQXVkRW5jT3V0UGluOworY2xhc3MgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2U7CitjbGFzcyBDTXBlZ0F1ZEVuYyA6IHB1YmxpYyBDVHJhbnNmb3JtRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVNwZWNpZnlQcm9wZXJ0eVBhZ2VzLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUF1ZGlvRW5jb2RlclByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDUGVyc2lzdFN0cmVhbQoreworcHVibGljOgorICAgIERFQ0xBUkVfSVVOS05PV04KKworICAgIHN0YXRpYyBDVW5rbm93biAqQ3JlYXRlSW5zdGFuY2UoTFBVTktOT1dOIGxwdW5rLCBIUkVTVUxUICpwaHIpOworCisgICAgTFBBTU9WSUVTRVRVUF9GSUxURVIgR2V0U2V0dXBEYXRhKCk7CisKKyAgICBIUkVTVUxUIFJlY29ubmVjdCgpOworCisgICAgSFJFU1VMVCBSZWNlaXZlKElNZWRpYVNhbXBsZSAqcFNhbXBsZSk7CisKKyAgICBIUkVTVUxUIENoZWNrSW5wdXRUeXBlKGNvbnN0IENNZWRpYVR5cGUqIG10SW4pOworICAgIEhSRVNVTFQgQ2hlY2tUcmFuc2Zvcm0oY29uc3QgQ01lZGlhVHlwZSogbXRJbiwgY29uc3QgQ01lZGlhVHlwZSogbXRPdXQpOworICAgIEhSRVNVTFQgRGVjaWRlQnVmZmVyU2l6ZShJTWVtQWxsb2NhdG9yICogcEFsbG9jYXRvciwgQUxMT0NBVE9SX1BST1BFUlRJRVMgKnBwcm9wKTsKKworICAgIEhSRVNVTFQgR2V0TWVkaWFUeXBlICAoaW50IGlQb3NpdGlvbiwgQ01lZGlhVHlwZSAqcE1lZGlhVHlwZSk7CisgICAgSFJFU1VMVCBTZXRNZWRpYVR5cGUgIChQSU5fRElSRUNUSU9OIGRpcmVjdGlvbixjb25zdCBDTWVkaWFUeXBlICpwbXQpOworCisKKyAgICAvLworICAgIEhSRVNVTFQgU3RhcnRTdHJlYW1pbmcoKTsKKyAgICBIUkVTVUxUIFN0b3BTdHJlYW1pbmcoKTsKKyAgICBIUkVTVUxUIEVuZE9mU3RyZWFtKCk7CisgICAgSFJFU1VMVCBCZWdpbkZsdXNoKCk7CisKKyAgICB+Q01wZWdBdWRFbmModm9pZCk7CisKKyAgICAvLyBJU3BlY2lmeVByb3BlcnR5UGFnZXMKKyAgICBTVERNRVRIT0RJTVAgTm9uRGVsZWdhdGluZ1F1ZXJ5SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkICoqIHBwdik7CisgICAgU1RETUVUSE9ESU1QIEdldFBhZ2VzKENBVVVJRCAqcFBhZ2VzKTsKKworICAgIC8vIElBdWRpb0VuY29kZXJQcm9wZXJ0aWVzCisgICAgU1RETUVUSE9ESU1QIGdldF9QRVNPdXRwdXRFbmFibGVkKERXT1JEICpkd0VuYWJsZWQpOyAgICAvLyBQRVMgaGVhZGVyLiBPYnNvbGV0ZQorICAgIFNURE1FVEhPRElNUCBzZXRfUEVTT3V0cHV0RW5hYmxlZChEV09SRCBkd0VuYWJsZWQpOyAgICAgLy8gUEVTIGhlYWRlci4gT2Jzb2xldGUKKworICAgIFNURE1FVEhPRElNUCBnZXRfTVBFR0xheWVyKERXT1JEICpkd0xheWVyKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X01QRUdMYXllcihEV09SRCBkd0xheWVyKTsKKworICAgIFNURE1FVEhPRElNUCBnZXRfQml0cmF0ZShEV09SRCAqZHdCaXRyYXRlKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X0JpdHJhdGUoRFdPUkQgZHdCaXRyYXRlKTsgICAKKyAgICBTVERNRVRIT0RJTVAgZ2V0X1ZhcmlhYmxlKERXT1JEICpkd1ZhcmlhYmxlKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X1ZhcmlhYmxlKERXT1JEIGR3VmFyaWFibGUpOworICAgIFNURE1FVEhPRElNUCBnZXRfVmFyaWFibGVNaW4oRFdPUkQgKmR3TWluKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X1ZhcmlhYmxlTWluKERXT1JEIGR3TWluKTsKKyAgICBTVERNRVRIT0RJTVAgZ2V0X1ZhcmlhYmxlTWF4KERXT1JEICpkd01heCk7CisgICAgU1RETUVUSE9ESU1QIHNldF9WYXJpYWJsZU1heChEV09SRCBkd01heCk7CisgICAgU1RETUVUSE9ESU1QIGdldF9RdWFsaXR5KERXT1JEICpkd1F1YWxpdHkpOworICAgIFNURE1FVEhPRElNUCBzZXRfUXVhbGl0eShEV09SRCBkd1F1YWxpdHkpOworICAgIFNURE1FVEhPRElNUCBnZXRfVmFyaWFibGVRKERXT1JEICpkd1ZCUnEpOworICAgIFNURE1FVEhPRElNUCBzZXRfVmFyaWFibGVRKERXT1JEIGR3VkJScSk7CisgICAgU1RETUVUSE9ESU1QIGdldF9Tb3VyY2VTYW1wbGVSYXRlKERXT1JEICpkd1NhbXBsZVJhdGUpOworICAgIFNURE1FVEhPRElNUCBnZXRfU291cmNlQ2hhbm5lbHMoRFdPUkQgKmR3Q2hhbm5lbHMpOworICAgIFNURE1FVEhPRElNUCBnZXRfU2FtcGxlUmF0ZShEV09SRCAqZHdTYW1wbGVSYXRlKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X1NhbXBsZVJhdGUoRFdPUkQgZHdTYW1wbGVSYXRlKTsKKworICAgIFNURE1FVEhPRElNUCBnZXRfQ2hhbm5lbE1vZGUoRFdPUkQgKmR3Q2hhbm5lbE1vZGUpOworICAgIFNURE1FVEhPRElNUCBzZXRfQ2hhbm5lbE1vZGUoRFdPUkQgZHdDaGFubmVsTW9kZSk7CisgICAgU1RETUVUSE9ESU1QIGdldF9Gb3JjZU1TKERXT1JEICpkd0ZsYWcpOworICAgIFNURE1FVEhPRElNUCBzZXRfRm9yY2VNUyhEV09SRCBkd0ZsYWcpOworICAgIFNURE1FVEhPRElNUCBnZXRfRW5mb3JjZVZCUm1pbihEV09SRCAqZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X0VuZm9yY2VWQlJtaW4oRFdPUkQgZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgZ2V0X1ZvaWNlTW9kZShEV09SRCAqZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X1ZvaWNlTW9kZShEV09SRCBkd0ZsYWcpOworICAgIFNURE1FVEhPRElNUCBnZXRfS2VlcEFsbEZyZXEoRFdPUkQgKmR3RmxhZyk7CisgICAgU1RETUVUSE9ESU1QIHNldF9LZWVwQWxsRnJlcShEV09SRCBkd0ZsYWcpOworICAgIFNURE1FVEhPRElNUCBnZXRfU3RyaWN0SVNPKERXT1JEICpkd0ZsYWcpOworICAgIFNURE1FVEhPRElNUCBzZXRfU3RyaWN0SVNPKERXT1JEIGR3RmxhZyk7CisgICAgU1RETUVUSE9ESU1QIGdldF9Ob1Nob3J0QmxvY2soRFdPUkQgKmR3Tm9TaG9ydEJsb2NrKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X05vU2hvcnRCbG9jayhEV09SRCBkd05vU2hvcnRCbG9jayk7CisgICAgU1RETUVUSE9ESU1QIGdldF9YaW5nVGFnKERXT1JEICpkd1hpbmdUYWcpOworICAgIFNURE1FVEhPRElNUCBzZXRfWGluZ1RhZyhEV09SRCBkd1hpbmdUYWcpOworICAgIFNURE1FVEhPRElNUCBnZXRfTW9kZUZpeGVkKERXT1JEICpkd01vZGVGaXhlZCk7CisgICAgU1RETUVUSE9ESU1QIHNldF9Nb2RlRml4ZWQoRFdPUkQgZHdNb2RlRml4ZWQpOworCisKKyAgICBTVERNRVRIT0RJTVAgZ2V0X0NSQ0ZsYWcoRFdPUkQgKmR3RmxhZyk7CisgICAgU1RETUVUSE9ESU1QIHNldF9DUkNGbGFnKERXT1JEIGR3RmxhZyk7CisgICAgU1RETUVUSE9ESU1QIGdldF9Gb3JjZU1vbm8oRFdPUkQgKmR3RmxhZyk7CisgICAgU1RETUVUSE9ESU1QIHNldF9Gb3JjZU1vbm8oRFdPUkQgZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgZ2V0X1NldER1cmF0aW9uKERXT1JEICpkd0ZsYWcpOworICAgIFNURE1FVEhPRElNUCBzZXRfU2V0RHVyYXRpb24oRFdPUkQgZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgZ2V0X09yaWdpbmFsRmxhZyhEV09SRCAqZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X09yaWdpbmFsRmxhZyhEV09SRCBkd0ZsYWcpOworICAgIFNURE1FVEhPRElNUCBnZXRfQ29weXJpZ2h0RmxhZyhEV09SRCAqZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgc2V0X0NvcHlyaWdodEZsYWcoRFdPUkQgZHdGbGFnKTsKKyAgICBTVERNRVRIT0RJTVAgZ2V0X1NhbXBsZU92ZXJsYXAoRFdPUkQgKmR3RmxhZyk7CisgICAgU1RETUVUSE9ESU1QIHNldF9TYW1wbGVPdmVybGFwKERXT1JEIGR3RmxhZyk7CisKKyAgICBTVERNRVRIT0RJTVAgZ2V0X1BhcmFtZXRlckJsb2NrU2l6ZShCWVRFICpwY0Jsb2NrLCBEV09SRCAqcGR3U2l6ZSk7CisgICAgU1RETUVUSE9ESU1QIHNldF9QYXJhbWV0ZXJCbG9ja1NpemUoQllURSAqcGNCbG9jaywgRFdPUkQgZHdTaXplKTsKKworICAgIFNURE1FVEhPRElNUCBEZWZhdWx0QXVkaW9FbmNvZGVyUHJvcGVydGllcygpOworICAgIFNURE1FVEhPRElNUCBMb2FkQXVkaW9FbmNvZGVyUHJvcGVydGllc0Zyb21SZWdpc3RyeSgpOworICAgIFNURE1FVEhPRElNUCBTYXZlQXVkaW9FbmNvZGVyUHJvcGVydGllc1RvUmVnaXN0cnkoKTsKKyAgICBTVERNRVRIT0RJTVAgSW5wdXRUeXBlRGVmaW5lZCgpOworCisgICAgU1RETUVUSE9ESU1QIEFwcGx5Q2hhbmdlcygpOworCisgICAgLy8gQ1BlcnNpc3RTdHJlYW0KKyAgICBIUkVTVUxUIFdyaXRlVG9TdHJlYW0oSVN0cmVhbSAqcFN0cmVhbSk7CisgICAgSFJFU1VMVCBSZWFkRnJvbVN0cmVhbShJU3RyZWFtICpwU3RyZWFtKTsKKworICAgIGludCBTaXplTWF4KCk7CisgICAgU1RETUVUSE9ESU1QIEdldENsYXNzSUQoQ0xTSUQgKnBDbHNpZCk7CisKK3ByaXZhdGU6CisgICAgQ01wZWdBdWRFbmMoTFBVTktOT1dOIGxwdW5rLCBIUkVTVUxUICpwaHIpOworCisgICAgSFJFU1VMVCBGbHVzaEVuY29kZWRTYW1wbGVzKCk7CisKKyAgICB2b2lkIFJlYWRQcmVzZXRTZXR0aW5ncyhNUEVHX0VOQ09ERVJfQ09ORklHICpwbWFic2kpOworCisgICAgdm9pZCBMb2FkT3V0cHV0Q2FwYWJpbGl0aWVzKERXT1JEIHNhbXBsZV9yYXRlKTsKKworICAgIC8vIEVuY29kZXIgb2JqZWN0CisgICAgQ0VuY29kZXIgICAgICAgICAgICAgICAgICAgIG1fRW5jb2RlcjsKKworICAgIFJFRkVSRU5DRV9USU1FICAgICAgICAgICAgICBtX3J0U3RyZWFtVGltZTsKKyAgICBSRUZFUkVOQ0VfVElNRSAgICAgICAgICAgICAgbV9ydEZyYW1lVGltZTsKKyAgICBSRUZFUkVOQ0VfVElNRSAgICAgICAgICAgICAgbV9ydEVzdGltYXRlZDsKKworICAgIC8vIFN5bmNocm9uaXphdGlvbiBkYXRhCisgICAgTE9OR0xPTkcgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxlc0luOworICAgIExPTkdMT05HICAgICAgICAgICAgICAgICAgICBtX3NhbXBsZXNPdXQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxlc1BlckZyYW1lOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtX2J5dGVzUGVyU2FtcGxlOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtX2J5dGVzVG9EdXJhdGlvbjsKKworICAgIHJlc3luY19wb2ludF90ICAgICAgICAgICAgICBtX3N5bmNbUkVTWU5DX0NPVU5UXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jX2luX2lkeDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jX291dF9pZHg7CisKKyAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICAgbV9oYXNGaW5pc2hlZDsKKworICAgIENDcml0U2VjICAgICAgICAgICAgICAgICAgICBtX2NzOworCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIG1fc2V0RHVyYXRpb247CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIG1fYWxsb3dPdmVybGFwOworCisJUkVGRVJFTkNFX1RJTUUgbV9ydEJ5dGVQb3M7CisKKwlCT09MCQkJCQkJbV9iU3RyZWFtT3V0cHV0OyAgICAgIC8vIEJpbmFyeSBzdHJlYW0gb3V0cHV0CisJbG9uZwkJCQkJCW1fY2JTdHJlYW1BbGlnbm1lbnQ7ICAvLyBTdHJlYW0gYmxvY2sgc2l6ZQorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtX0NhcHNOdW07CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudE1lZGlhVHlwZUluZGV4OworICAgIG91dHB1dF9jYXBzX3QgICAgICAgICAgICAgICBPdXRwdXRDYXBzW01BWF9JQU1TVFJFQU1DT05GSUdfQ0FQU107CisKK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgY2xhc3MgQ01wZWdBdWRFbmNPdXRQaW47CisgICAgZnJpZW5kIGNsYXNzIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOworfTsKKworCitjbGFzcyBDTXBlZ0F1ZEVuY091dFBpbiA6IHB1YmxpYyBDVHJhbnNmb3JtT3V0cHV0UGluLCBwdWJsaWMgSUFNU3RyZWFtQ29uZmlnCit7CitwdWJsaWM6CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vICBJVW5rbm93bgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgREVDTEFSRV9JVU5LTk9XTgorICAgIFNURE1FVEhPRElNUCBOb25EZWxlZ2F0aW5nUXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQgKiogcHB2KTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gIElBTVN0cmVhbUNvbmZpZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTZXRGb3JtYXQoQU1fTUVESUFfVFlQRSAqcG10KTsKKyAgICBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldEZvcm1hdChBTV9NRURJQV9UWVBFICoqcHBtdCk7CisgICAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBHZXROdW1iZXJPZkNhcGFiaWxpdGllcyhpbnQgKnBpQ291bnQsIGludCAqcGlTaXplKTsKKyAgICBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldFN0cmVhbUNhcHMoaW50IGlJbmRleCwgQU1fTUVESUFfVFlQRSAqKnBtdCwgQllURSAqcFNDQyk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vICBDVHJhbnNmb3JtT3V0cHV0UGluCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBDTXBlZ0F1ZEVuY091dFBpbiggQ01wZWdBdWRFbmMgKiBwRmlsdGVyLCBIUkVTVUxUICogcEhyICk7CisgICAgfkNNcGVnQXVkRW5jT3V0UGluKCk7CisKKyAgICBIUkVTVUxUIENoZWNrTWVkaWFUeXBlKGNvbnN0IENNZWRpYVR5cGUgKnBtdE91dCk7CisgICAgSFJFU1VMVCBHZXRNZWRpYVR5cGUoaW50IGlQb3NpdGlvbiwgQ01lZGlhVHlwZSAqcG10KTsKKyAgICBIUkVTVUxUIFNldE1lZGlhVHlwZShjb25zdCBDTWVkaWFUeXBlICpwbXQpOworICAgIAorcHJpdmF0ZToKKyAgICBCT09MICAgICAgICBtX1NldEZvcm1hdDsKKyAgICBDTXBlZ0F1ZEVuYyAqbV9wRmlsdGVyOworCisgICAgY3VycmVudF9vdXRwdXRfZm9ybWF0X3QgIG1fQ3VycmVudE91dHB1dEZvcm1hdDsKKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBDTXBlZ0F1ZEVuYzsKKworfTsKZGlmZiAtLWdpdCBhL2RzaG93L1Byb3BQYWdlLmNwcCBiL2RzaG93L1Byb3BQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTBiM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvUHJvcFBhZ2UuY3BwCkBAIC0wLDAgKzEsNjQ2IEBACisvKgorICogIExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKyAqICBCYXNpYyBwcm9wZXJ0eSBwYWdlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1hcmllIE9ybG92YSwgUGV0ZXIgR3ViYW5vdiwgVml0YWx5IEl2YW5vdiwgRWxlY2FyZCBMdGQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyZWFtcy5oPgorI2luY2x1ZGUgPG9sZWN0bC5oPgorI2luY2x1ZGUgPGNvbW1jdHJsLmg+CisjaW5jbHVkZSAiaWF1ZGlvcHJvcHMuaCIKKyNpbmNsdWRlICJtcGVnYWMuaCIKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorI2luY2x1ZGUgIlByb3BQYWdlLmgiCisjaW5jbHVkZSAiUmVnLmgiCisKKy8vIHN0cmluZ3MgdG8gYXBwZWFyIGluIGNvbWJvYm94ZXMKK2NvbnN0IGNoYXIgKiBzekJpdFJhdGVTdHJpbmdbMl1bMTRdID0geworICAgIHsKKyAgICAgICAgIjMyIGticHMiLCI0MCBrYnBzIiwiNDgga2JwcyIsIjU2IGticHMiLAorICAgICAgICAiNjQga2JwcyIsIjgwIGticHMiLCI5NiBrYnBzIiwiMTEyIGticHMiLAorICAgICAgICAiMTI4IGticHMiLCIxNjAga2JwcyIsIjE5MiBrYnBzIiwiMjI0IGticHMiLAorICAgICAgICAiMjU2IGticHMiLCIzMjAga2JwcyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIjgga2JwcyIsIjE2IGticHMiLCIyNCBrYnBzIiwiMzIga2JwcyIsCisgICAgICAgICI0MCBrYnBzIiwiNDgga2JwcyIsIjU2IGticHMiLCI2NCBrYnBzIiwKKyAgICAgICAgIjgwIGticHMiLCI5NiBrYnBzIiwiMTEyIGticHMiLCIxMjgga2JwcyIsCisgICAgICAgICIxNDQga2JwcyIsIjE2MCBrYnBzIgorICAgIH0KK307CisKK0xQQ1NUUiBzelF1YWxpdHlEZXNjWzEwXSA9IHsKKyAgICAiSGlnaCIsICJIaWdoIiwgIkhpZ2giLCAiSGlnaCIsICJIaWdoIiwKKyAgICAiTWVkaXVtIiwgIk1lZGl1bSIsCisgICAgIkxvdyIsICJMb3ciLAorICAgICJGYXN0IG1vZGUiCit9OworCitMUENTVFIgc3pWQlJxRGVzY1sxMF0gPSB7CisgICAgIjAgLSB+MTo0IiwKKyAgICAiMSAtIH4xOjUiLAorICAgICIyIC0gfjE6NiIsCisgICAgIjMgLSB+MTo3IiwKKyAgICAiNCAtIH4xOjkiLAorICAgICI1IC0gfjE6OSIsCisgICAgIjYgLSB+MToxMCIsCisgICAgIjcgLSB+MToxMSIsCisgICAgIjggLSB+MToxMiIsCisgICAgIjkgLSB+MToxNCIKK307CisKK3N0cnVjdCBTU2FtcGxlUmF0ZSB7CisgICAgRFdPUkQgZHdTYW1wbGVSYXRlOworICAgIExQQ1NUUiBscFNhbXBsZVJhdGU7Cit9OworCitTU2FtcGxlUmF0ZSBzclJhdGVzWzldID0geworICAgIC8vIE1QRUctMQorICAgIHs0ODAwMCwgIjQ4IGtIeiJ9LAorICAgIHs0NDEwMCwgIjQ0LjEga0h6In0sCisgICAgezMyMDAwLCAiMzIga0h6In0sCisKKyAgICAvLyBNUEVHLTIKKyAgICB7MjQwMDAsICIyNCBrSHoifSwKKyAgICB7MjIwNTAsICIyMi4wNSBrSHoifSwKKyAgICB7MTYwMDAsICIxNiBrSHoifSwKKworICAgIC8vIE1QRUctMi41CisgICAgezEyMDAwLCAiMTIga0h6In0sCisgICAgezExMDI1LCAiMTEuMDI1IGtIeiJ9LAorICAgIHsgODAwMCwgIjgga0h6In0KK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENyZWF0ZUluc3RhbmNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitDVW5rbm93biAqQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2U6OkNyZWF0ZUluc3RhbmNlKCBMUFVOS05PV04gcHVuaywgSFJFU1VMVCAqcGhyICkKK3sKKyAgICBDTXBlZ0F1ZEVuY1Byb3BlcnR5UGFnZSAqcE5ld09iamVjdAorICAgICAgICA9IG5ldyBDTXBlZ0F1ZEVuY1Byb3BlcnR5UGFnZSggcHVuaywgcGhyICk7CisKKyAgICBpZiggcE5ld09iamVjdCA9PSBOVUxMICkKKyAgICAgICAgKnBociA9IEVfT1VUT0ZNRU1PUlk7CisKKyAgICByZXR1cm4gcE5ld09iamVjdDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0NNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpDTXBlZ0F1ZEVuY1Byb3BlcnR5UGFnZShMUFVOS05PV04gcHVuaywgSFJFU1VMVCAqcGhyKQorIDogQ0Jhc2VQcm9wZXJ0eVBhZ2UoTkFNRSgiRW5jb2RlciBQcm9wZXJ0eSBQYWdlIiksIAorICAgICAgICAgICAgICAgICAgICAgIHB1bmssIElERF9BVURJT0VOQ1BST1BTLCBJRFNfQVVESU9fUFJPUFNfVElUTEUpICAgICAgICAgICAgICAgICAgICAgIAorICAgICwgbV9wQUVQcm9wcyhOVUxMKQoreworICAgIEFTU0VSVChwaHIpOworCisgICAgbV9zcklkeCA9IDA7CisKKyAgICBJbml0Q29tbW9uQ29udHJvbHMoKTsKK30KKworLy8KKy8vIE9uQ29ubmVjdAorLy8KKy8vIEdpdmUgdXMgdGhlIGZpbHRlciB0byBjb21tdW5pY2F0ZSB3aXRoCitIUkVTVUxUIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpPbkNvbm5lY3QoSVVua25vd24gKnBVbmtub3duKQoreworICAgIEFTU0VSVChtX3BBRVByb3BzID09IE5VTEwpOworCisgICAgLy8gQXNrIHRoZSBmaWx0ZXIgZm9yIGl0J3MgY29udHJvbCBpbnRlcmZhY2UKKworICAgIEhSRVNVTFQgaHIgPSBwVW5rbm93bi0+UXVlcnlJbnRlcmZhY2UoSUlEX0lBdWRpb0VuY29kZXJQcm9wZXJ0aWVzLCh2b2lkICoqKSZtX3BBRVByb3BzKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisKKyAgICBBU1NFUlQobV9wQUVQcm9wcyk7CisKKyAgICAvLyBHZXQgY3VycmVudCBmaWx0ZXIgc3RhdGUKKyAgICBtX3BBRVByb3BzLT5nZXRfQml0cmF0ZSgmbV9kd0JpdHJhdGUpOworICAgIG1fcEFFUHJvcHMtPmdldF9WYXJpYWJsZSgmbV9kd1ZhcmlhYmxlKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfVmFyaWFibGVNaW4oJm1fZHdNaW4pOworICAgIG1fcEFFUHJvcHMtPmdldF9WYXJpYWJsZU1heCgmbV9kd01heCk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1F1YWxpdHkoJm1fZHdRdWFsaXR5KTsKKyAgICBtX3BBRVByb3BzLT5nZXRfVmFyaWFibGVRKCZtX2R3VkJScSk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1NhbXBsZVJhdGUoJm1fZHdTYW1wbGVSYXRlKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfQ1JDRmxhZygmbV9kd0NSQyk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0ZvcmNlTW9ubygmbV9kd0ZvcmNlTW9ubyk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0NvcHlyaWdodEZsYWcoJm1fZHdDb3B5cmlnaHQpOworICAgIG1fcEFFUHJvcHMtPmdldF9PcmlnaW5hbEZsYWcoJm1fZHdPcmlnaW5hbCk7CisKKyAgICByZXR1cm4gTk9FUlJPUjsKK30KKworLy8KKy8vIE9uRGlzY29ubmVjdAorLy8KKy8vIFJlbGVhc2UgdGhlIGludGVyZmFjZQorCitIUkVTVUxUIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpPbkRpc2Nvbm5lY3QoKQoreworICAgIC8vIFJlbGVhc2UgdGhlIGludGVyZmFjZQorICAgIGlmIChtX3BBRVByb3BzID09IE5VTEwpCisgICAgICAgIHJldHVybiBFX1VORVhQRUNURUQ7CisKKyAgICBtX3BBRVByb3BzLT5zZXRfQml0cmF0ZShtX2R3Qml0cmF0ZSk7CisgICAgbV9wQUVQcm9wcy0+c2V0X1ZhcmlhYmxlKG1fZHdWYXJpYWJsZSk7CisgICAgbV9wQUVQcm9wcy0+c2V0X1ZhcmlhYmxlTWluKG1fZHdNaW4pOworICAgIG1fcEFFUHJvcHMtPnNldF9WYXJpYWJsZU1heChtX2R3TWF4KTsKKyAgICBtX3BBRVByb3BzLT5zZXRfUXVhbGl0eShtX2R3UXVhbGl0eSk7CisgICAgbV9wQUVQcm9wcy0+c2V0X1ZhcmlhYmxlUShtX2R3VkJScSk7CisgICAgbV9wQUVQcm9wcy0+c2V0X1NhbXBsZVJhdGUobV9kd1NhbXBsZVJhdGUpOworICAgIG1fcEFFUHJvcHMtPnNldF9DUkNGbGFnKG1fZHdDUkMpOworICAgIG1fcEFFUHJvcHMtPnNldF9Gb3JjZU1vbm8obV9kd0ZvcmNlTW9ubyk7CisgICAgbV9wQUVQcm9wcy0+c2V0X0NvcHlyaWdodEZsYWcobV9kd0NvcHlyaWdodCk7CisgICAgbV9wQUVQcm9wcy0+c2V0X09yaWdpbmFsRmxhZyhtX2R3T3JpZ2luYWwpOworICAgIG1fcEFFUHJvcHMtPlNhdmVBdWRpb0VuY29kZXJQcm9wZXJ0aWVzVG9SZWdpc3RyeSgpOworCisgICAgbV9wQUVQcm9wcy0+UmVsZWFzZSgpOworICAgIG1fcEFFUHJvcHMgPSBOVUxMOworCisgICAgcmV0dXJuIE5PRVJST1I7Cit9CisKKy8vCisvLyBPbkFjdGl2YXRlCisvLworLy8gQ2FsbGVkIG9uIGRpYWxvZyBjcmVhdGlvbgorCitIUkVTVUxUIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpPbkFjdGl2YXRlKHZvaWQpCit7CisgICAgSW5pdFByb3BlcnRpZXNEaWFsb2cobV9od25kKTsKKworICAgIHJldHVybiBOT0VSUk9SOworfQorCisvLworLy8gT25EZWFjdGl2YXRlCisvLworLy8gQ2FsbGVkIG9uIGRpYWxvZyBkZXN0cnVjdGlvbgorCitIUkVTVUxUIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpPbkRlYWN0aXZhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gTk9FUlJPUjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gT25SZWNlaXZlTWVzc2FnZSAtIG1lc3NhZ2UgaGFuZGxlciBmdW5jdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQk9PTCBDTXBlZ0F1ZEVuY1Byb3BlcnR5UGFnZTo6T25SZWNlaXZlTWVzc2FnZShIV05EIGh3bmQsVUlOVCB1TXNnLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBzd2l0Y2ggKHVNc2cpCisgICAgeworICAgIGNhc2UgV01fSFNDUk9MTDoKKyAgICAgICAgaWYgKChIV05EKWxQYXJhbSA9PSBtX2h3bmRRdWFsaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gU2VuZE1lc3NhZ2UobV9od25kUXVhbGl0eSwgVEJNX0dFVFBPUywgMCwgMCk7CisgICAgICAgICAgICBpZiAocG9zID49IDAgJiYgcG9zIDwgMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCxJRENfVEVYVF9RVUFMSVRZLHN6UXVhbGl0eURlc2NbcG9zXSk7CisgICAgICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X1F1YWxpdHkocG9zKTsKKyAgICAgICAgICAgICAgICBTZXREaXJ0eSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgICBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKQorICAgICAgICB7CisgICAgICAgIGNhc2UgSURDX0NPTUJPX0NCUjoKKyAgICAgICAgICAgIGlmIChISVdPUkQod1BhcmFtKSA9PSBDQk5fU0VMQ0hBTkdFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBuQml0cmF0ZSA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQ09NQk9fQ0JSLCBDQl9HRVRDVVJTRUwsIDAsIDBMKTsKKyAgICAgICAgICAgICAgICBEV09SRCBkd1NhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgbV9wQUVQcm9wcy0+Z2V0X1NhbXBsZVJhdGUoJmR3U2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgRFdPUkQgZHdCaXRyYXRlOworCisgICAgICAgICAgICAgICAgaWYgKGR3U2FtcGxlUmF0ZSA+PSAzMjAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIE1QRUctMQorICAgICAgICAgICAgICAgICAgICBkd0JpdHJhdGUgPSBkd0JpdFJhdGVWYWx1ZVswXVtuQml0cmF0ZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIE1QRUctMi8yLjUKKyAgICAgICAgICAgICAgICAgICAgZHdCaXRyYXRlID0gZHdCaXRSYXRlVmFsdWVbMV1bbkJpdHJhdGVdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1fcEFFUHJvcHMtPnNldF9CaXRyYXRlKGR3Qml0cmF0ZSk7CisKKyAgICAgICAgICAgICAgICBTZXREaXJ0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRENfQ09NQk9fVkJSTUlOOgorICAgICAgICAgICAgaWYgKEhJV09SRCh3UGFyYW0pID09IENCTl9TRUxDSEFOR0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5WYXJpYWJsZU1pbiA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQ09NQk9fVkJSTUlOLCBDQl9HRVRDVVJTRUwsIDAsIDBMKTsKKyAgICAgICAgICAgICAgICBEV09SRCBkd1NhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgbV9wQUVQcm9wcy0+Z2V0X1NhbXBsZVJhdGUoJmR3U2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgRFdPUkQgZHdNaW47CisKKyAgICAgICAgICAgICAgICBpZiAoZHdTYW1wbGVSYXRlID49IDMyMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgTVBFRy0xCisgICAgICAgICAgICAgICAgICAgIGR3TWluID0gZHdCaXRSYXRlVmFsdWVbMF1bblZhcmlhYmxlTWluXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgTVBFRy0yLzIuNQorICAgICAgICAgICAgICAgICAgICBkd01pbiA9IGR3Qml0UmF0ZVZhbHVlWzFdW25WYXJpYWJsZU1pbl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X1ZhcmlhYmxlTWluKGR3TWluKTsKKworICAgICAgICAgICAgICAgIFNldERpcnR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEQ19DT01CT19WQlJNQVg6CisgICAgICAgICAgICBpZiAoSElXT1JEKHdQYXJhbSkgPT0gQ0JOX1NFTENIQU5HRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgblZhcmlhYmxlTWF4ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19DT01CT19WQlJNQVgsIENCX0dFVENVUlNFTCwgMCwgMEwpOworICAgICAgICAgICAgICAgIERXT1JEIGR3U2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICBtX3BBRVByb3BzLT5nZXRfU2FtcGxlUmF0ZSgmZHdTYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBEV09SRCBkd01heDsKKworICAgICAgICAgICAgICAgIGlmIChkd1NhbXBsZVJhdGUgPj0gMzIwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBNUEVHLTEKKyAgICAgICAgICAgICAgICAgICAgZHdNYXggPSBkd0JpdFJhdGVWYWx1ZVswXVtuVmFyaWFibGVNYXhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBNUEVHLTIvMi41CisgICAgICAgICAgICAgICAgICAgIGR3TWF4ID0gZHdCaXRSYXRlVmFsdWVbMV1bblZhcmlhYmxlTWF4XTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtX3BBRVByb3BzLT5zZXRfVmFyaWFibGVNYXgoZHdNYXgpOworCisgICAgICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NPTUJPX1NBTVBMRV9SQVRFOgorICAgICAgICAgICAgaWYgKEhJV09SRCh3UGFyYW0pID09IENCTl9TRUxDSEFOR0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5TYW1wbGVSYXRlID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19DT01CT19TQU1QTEVfUkFURSwgQ0JfR0VUQ1VSU0VMLCAwLCAwTCk7CisKKyAgICAgICAgICAgICAgICBpZiAoblNhbXBsZVJhdGUgPCAwKQorICAgICAgICAgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoblNhbXBsZVJhdGUgPiAyKQorICAgICAgICAgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDI7CisKKyAgICAgICAgICAgICAgICBEV09SRCBkd1NhbXBsZVJhdGUgPSBzclJhdGVzW25TYW1wbGVSYXRlICogMyArIG1fc3JJZHhdLmR3U2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgICAgIG1fcEFFUHJvcHMtPnNldF9TYW1wbGVSYXRlKGR3U2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgSW5pdFByb3BlcnRpZXNEaWFsb2coaHduZCk7CisgICAgICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NPTUJPX1ZCUnE6CisgICAgICAgICAgICBpZiAoSElXT1JEKHdQYXJhbSkgPT0gQ0JOX1NFTENIQU5HRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgblZCUnEgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0NPTUJPX1ZCUnEsIENCX0dFVENVUlNFTCwgMCwgMEwpOworICAgICAgICAgICAgICAgIGlmIChuVkJScSA+PTAgJiYgblZCUnEgPD05KSAKKyAgICAgICAgICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X1ZhcmlhYmxlUShuVkJScSk7CisgICAgICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX1JBRElPX0NCUjoKKyAgICAgICAgY2FzZSBJRENfUkFESU9fVkJSOgorICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X1ZhcmlhYmxlKExPV09SRCh3UGFyYW0pLUlEQ19SQURJT19DQlIpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX1BFUzoKKyAgICAgICAgICAgIG1fcEFFUHJvcHMtPnNldF9QRVNPdXRwdXRFbmFibGVkKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfUEVTKSk7CisgICAgICAgICAgICBTZXREaXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRENfQ0hFQ0tfQ09QWVJJR0hUOgorICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X0NvcHlyaWdodEZsYWcoSXNEbGdCdXR0b25DaGVja2VkKGh3bmQsIElEQ19DSEVDS19DT1BZUklHSFQpKTsKKyAgICAgICAgICAgIFNldERpcnR5KCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEQ19DSEVDS19PUklHSU5BTDoKKyAgICAgICAgICAgIG1fcEFFUHJvcHMtPnNldF9PcmlnaW5hbEZsYWcoSXNEbGdCdXR0b25DaGVja2VkKGh3bmQsIElEQ19DSEVDS19PUklHSU5BTCkpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX0NSQzoKKyAgICAgICAgICAgIG1fcEFFUHJvcHMtPnNldF9DUkNGbGFnKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfQ1JDKSk7CisgICAgICAgICAgICBTZXREaXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRENfRk9SQ0VfTU9OTzoKKyAgICAgICAgICAgIG1fcEFFUHJvcHMtPnNldF9Gb3JjZU1vbm8oSXNEbGdCdXR0b25DaGVja2VkKGh3bmQsIElEQ19GT1JDRV9NT05PKSk7CisgICAgICAgICAgICBTZXREaXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIFdNX0RFU1RST1k6CisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvLworLy8gT25BcHBseUNoYW5nZXMKKy8vCitIUkVTVUxUIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpPbkFwcGx5Q2hhbmdlcygpCit7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0JpdHJhdGUoJm1fZHdCaXRyYXRlKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfVmFyaWFibGUoJm1fZHdWYXJpYWJsZSk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1ZhcmlhYmxlTWluKCZtX2R3TWluKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfVmFyaWFibGVNYXgoJm1fZHdNYXgpOworICAgIG1fcEFFUHJvcHMtPmdldF9RdWFsaXR5KCZtX2R3UXVhbGl0eSk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1ZhcmlhYmxlUSgmbV9kd1ZCUnEpOworICAgIG1fcEFFUHJvcHMtPmdldF9TYW1wbGVSYXRlKCZtX2R3U2FtcGxlUmF0ZSk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0NSQ0ZsYWcoJm1fZHdDUkMpOworICAgIG1fcEFFUHJvcHMtPmdldF9Gb3JjZU1vbm8oJm1fZHdGb3JjZU1vbm8pOworICAgIG1fcEFFUHJvcHMtPmdldF9Db3B5cmlnaHRGbGFnKCZtX2R3Q29weXJpZ2h0KTsKKyAgICBtX3BBRVByb3BzLT5nZXRfT3JpZ2luYWxGbGFnKCZtX2R3T3JpZ2luYWwpOworICAgIG1fcEFFUHJvcHMtPlNhdmVBdWRpb0VuY29kZXJQcm9wZXJ0aWVzVG9SZWdpc3RyeSgpOworCisgICAgbV9wQUVQcm9wcy0+QXBwbHlDaGFuZ2VzKCk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworLy8KKy8vIEluaXRpYWxpemUgZGlhbG9nYm94IGNvbnRyb2xzIHdpdGggcHJvcGVyIHZhbHVlcworLy8KK3ZvaWQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2U6OkluaXRQcm9wZXJ0aWVzRGlhbG9nKEhXTkQgaHduZFBhcmVudCkKK3sKKyAgICBFbmFibGVDb250cm9scyhod25kUGFyZW50LCBUUlVFKTsKKworICAgIG1faHduZFF1YWxpdHkgPSBHZXREbGdJdGVtKGh3bmRQYXJlbnQsSURDX1NMSURFUl9RVUFMSVRZKTsKKyAgICBEV09SRCBkd1F1YWxpdHk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1F1YWxpdHkoJmR3UXVhbGl0eSk7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmRQYXJlbnQsIElEQ19TTElERVJfUVVBTElUWSwgVEJNX1NFVFJBTkdFLCAxLCBNQUtFTE9ORyAoMiw5KSk7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmRQYXJlbnQsIElEQ19TTElERVJfUVVBTElUWSwgVEJNX1NFVFBPUywgMSwgZHdRdWFsaXR5KTsKKyAgICBpZiAoZHdRdWFsaXR5Pj0wICYmIGR3UXVhbGl0eTwxMCkKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZFBhcmVudCxJRENfVEVYVF9RVUFMSVRZLHN6UXVhbGl0eURlc2NbZHdRdWFsaXR5XSk7CisKKyAgICAvLworICAgIC8vIGluaXRpYWxpemUgc2FtcGxlIHJhdGUgc2VsZWN0aW9uCisgICAgLy8KKyAgICBEV09SRCBkd1NvdXJjZVNhbXBsZVJhdGU7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1NvdXJjZVNhbXBsZVJhdGUoJmR3U291cmNlU2FtcGxlUmF0ZSk7CisKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX1NBTVBMRV9SQVRFLCBDQl9SRVNFVENPTlRFTlQsIDAsIDBMKTsKKworICAgIHN3aXRjaCAoZHdTb3VyY2VTYW1wbGVSYXRlKQorICAgIHsKKyAgICBjYXNlIDQ4MDAwOgorICAgIGNhc2UgMjQwMDA6CisgICAgY2FzZSAxMjAwMDoKKyAgICAgICAgbV9zcklkeCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzMjAwMDoKKyAgICBjYXNlIDE2MDAwOgorICAgIGNhc2UgIDgwMDA6CisgICAgICAgIG1fc3JJZHggPSAyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNDQxMDA6CisgICAgY2FzZSAyMjA1MDoKKyAgICBjYXNlIDExMDI1OgorICAgIGRlZmF1bHQ6CisgICAgICAgIG1fc3JJZHggPSAxOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX1NBTVBMRV9SQVRFLCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pKExQQ1RTVFIpc3JSYXRlc1tpICogMyArIG1fc3JJZHhdLmxwU2FtcGxlUmF0ZSk7CisKKyAgICBEV09SRCBkd1NhbXBsZVJhdGU7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1NhbXBsZVJhdGUoJmR3U2FtcGxlUmF0ZSk7CisgICAgbV9wQUVQcm9wcy0+c2V0X1NhbXBsZVJhdGUoZHdTYW1wbGVSYXRlKTsKKworICAgIGludCBuU1IgPSAwOworICAgIHdoaWxlIChkd1NhbXBsZVJhdGUgIT0gc3JSYXRlc1tuU1IgKiAzICsgbV9zcklkeF0uZHdTYW1wbGVSYXRlICYmIG5TUiA8IDMpCisgICAgeworICAgICAgICBuU1IrKzsKKyAgICB9CisKKyAgICBpZiAoblNSID49IDMpCisgICAgICAgIG5TUiA9IDA7CisKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX1NBTVBMRV9SQVRFLCBDQl9TRVRDVVJTRUwsIG5TUiwgMCk7CisKKyAgICBEV09SRCBkd0NoYW5uZWxzOworICAgIG1fcEFFUHJvcHMtPmdldF9Tb3VyY2VDaGFubmVscygmZHdDaGFubmVscyk7CisKKyAgICAvLworICAgIC8vaW5pdGlhbGl6ZSBWQlJxIGNvbWJvIGJveAorICAgIC8vCisgICAgaW50IGs7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmRQYXJlbnQsIElEQ19DT01CT19WQlJxLCBDQl9SRVNFVENPTlRFTlQsIDAsIDApOworICAgIGZvciAoayA9IDA7IGsgPCAxMDsgaysrKQorICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX1ZCUnEsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkoTFBDVFNUUilzelZCUnFEZXNjW2tdKTsKKyAgICBEV09SRCBkd1ZCUnE7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1ZhcmlhYmxlUSgmZHdWQlJxKTsKKyAgICBpZiAoZHdWQlJxPDApCisgICAgICAgIGR3VkJScSA9IDA7CisgICAgaWYgKGR3VkJScT45KQorICAgICAgICBkd1ZCUnEgPSA5OworICAgIG1fcEFFUHJvcHMtPnNldF9WYXJpYWJsZVEoZHdWQlJxKTsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX1ZCUnEsIENCX1NFVENVUlNFTCwgZHdWQlJxLCAwKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGluaXRpYWxpemUgQ0JSIHNlbGVjdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnQgblN0OworCisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmRQYXJlbnQsIElEQ19DT01CT19DQlIsIENCX1JFU0VUQ09OVEVOVCwgMCwgMCk7CisgICAgaWYgKGR3U2FtcGxlUmF0ZSA+PSAzMjAwMCkKKyAgICB7CisgICAgICAgIC8vIElmIHRhcmdldCBzYW1wbGluZyByYXRlIGlzIGxlc3MgdGhhbiAzMjAwMCwgY29uc2lkZXIKKyAgICAgICAgLy8gTVBFRyAxIGF1ZGlvCisgICAgICAgIG5TdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQ7IGkrKykKKyAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kUGFyZW50LCBJRENfQ09NQk9fQ0JSLCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pKExQQ1RTVFIpc3pCaXRSYXRlU3RyaW5nWzBdW2ldKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gQ29uc2lkZXIgTVBFRyAyIC8gMi41IGF1ZGlvCisgICAgICAgIG5TdCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQgOyBpKyspCisgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX0NCUiwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKShMUENUU1RSKXN6Qml0UmF0ZVN0cmluZ1sxXVtpXSk7CisgICAgfQorCisgICAgRFdPUkQgZHdCaXRyYXRlOworICAgIG1fcEFFUHJvcHMtPmdldF9CaXRyYXRlKCZkd0JpdHJhdGUpOworCisgICAgaW50IG5CaXRyYXRlU2VsID0gMDsKKyAgICAvLyBCaXRSYXRlVmFsdWVbXVtpXSBpcyBpbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAvLyBXZSB1c2UgdGhpcyBmYWN0LiBXZSBhbHNvIGtub3cgdGhlcmUgYXJlIDE0IGJpdHJhdGUgdmFsdWVzIGF2YWlsYWJsZS4KKyAgICAvLyBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBjbG9zZXN0IHBvc3NpYmxlLCBzbyB3ZSBjYW4gbGltaXQgbG9vcCB3aXRoIDEzCisgICAgd2hpbGUgKG5CaXRyYXRlU2VsIDwgMTMgJiYgZHdCaXRSYXRlVmFsdWVbblN0XVtuQml0cmF0ZVNlbF0gPCBkd0JpdHJhdGUpCisgICAgICAgIG5CaXRyYXRlU2VsKys7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmRQYXJlbnQsIElEQ19DT01CT19DQlIsIENCX1NFVENVUlNFTCwgbkJpdHJhdGVTZWwsIDApOworCisgICAgLy8gY2hlY2sgaWYgdGhlIHNwZWNpZmllZCBiaXRyYXRlIGlzIGZvdW5kIGV4YWN0bHkgYW5kIGNvcnJlY3QgaWYgbm90CisgICAgaWYgKGR3Qml0UmF0ZVZhbHVlW25TdF1bbkJpdHJhdGVTZWxdICE9IGR3Qml0cmF0ZSkKKyAgICB7CisgICAgICAgIGR3Qml0cmF0ZSA9IGR3Qml0UmF0ZVZhbHVlW25TdF1bbkJpdHJhdGVTZWxdOworICAgICAgICAvLyB3ZSBjYW4gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IGlzIGluZGVwZW5kZW50IG9mIGFueSBvdGhlciBwYXJhbWV0ZXJzCisgICAgICAgIC8vIChidXQgZGVwZW5kcyBvbiBzb21lIG9mIHRoZW0hKQorICAgICAgICBtX3BBRVByb3BzLT5zZXRfQml0cmF0ZShkd0JpdHJhdGUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgVkJSL0NCUiByYWRpbyBidXR0b24KKyAgICAvLworICAgIERXT1JEIGR3VmFyaWFibGU7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1ZhcmlhYmxlKCZkd1ZhcmlhYmxlKTsKKyAgICBDaGVja1JhZGlvQnV0dG9uKGh3bmRQYXJlbnQsIElEQ19SQURJT19DQlIsIElEQ19SQURJT19WQlIsIElEQ19SQURJT19DQlIgKyBkd1ZhcmlhYmxlKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGluaXRpYWxpemUgVkJSIHNlbGVjdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvL1ZCUk1JTiwgVkJSTUFYCisgICAgaW50IGosIG5TVDsKKworICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kUGFyZW50LCBJRENfQ09NQk9fVkJSTUlOLCBDQl9SRVNFVENPTlRFTlQsIDAsIDApOworICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kUGFyZW50LCBJRENfQ09NQk9fVkJSTUFYLCBDQl9SRVNFVENPTlRFTlQsIDAsIDApOworCisgICAgaWYgKGR3U2FtcGxlUmF0ZSA+PSAzMjAwMCkKKyAgICB7CisgICAgICAgICAgICBuU1QgPSAwOworICAgICAgICAgICAgZm9yIChqPTA7IGo8MTQgO2orKykgeworICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kUGFyZW50LCBJRENfQ09NQk9fVkJSTUlOLCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pKExQQ1RTVFIpc3pCaXRSYXRlU3RyaW5nWzBdW2pdKTsKKyAgICAgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX1ZCUk1BWCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKShMUENUU1RSKXN6Qml0UmF0ZVN0cmluZ1swXVtqXSk7CisgICAgICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICAgICBuU1QgPSAxOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmRQYXJlbnQsIElEQ19DT01CT19WQlJNSU4sIENCX0FERFNUUklORywgMCwgKExQQVJBTSkoTFBDVFNUUilzekJpdFJhdGVTdHJpbmdbMV1bal0pOworICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kUGFyZW50LCBJRENfQ09NQk9fVkJSTUFYLCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pKExQQ1RTVFIpc3pCaXRSYXRlU3RyaW5nWzFdW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBEV09SRCBkd01pbixkd01heDsKKyAgICBtX3BBRVByb3BzLT5nZXRfVmFyaWFibGVNaW4oJmR3TWluKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfVmFyaWFibGVNYXgoJmR3TWF4KTsKKworICAgIGludCBuVmFyaWFibGVNaW5TZWwgPSAwOworICAgIGludCBuVmFyaWFibGVNYXhTZWwgPSAwOworICAgIAorICAgIC8vIEJpdFJhdGVWYWx1ZVtdW2ldIGlzIGluIGFzY2VuZGluZyBvcmRlcgorICAgIC8vIFdlIHVzZSB0aGlzIGZhY3QuIFdlIGFsc28ga25vdyB0aGVyZSBhcmUgMTQgYml0cmF0ZSB2YWx1ZXMgYXZhaWxhYmxlLgorICAgIC8vIFdlIGFyZSBnb2luZyB0byB1c2UgdGhlIGNsb3Nlc3QgcG9zc2libGUsIHNvIHdlIGNhbiBsaW1pdCBsb29wIHdpdGggMTMKKyAgICB3aGlsZSAoblZhcmlhYmxlTWluU2VsPDEzICYmIGR3Qml0UmF0ZVZhbHVlW25TVF1bblZhcmlhYmxlTWluU2VsXSA8IGR3TWluKQorICAgICAgICBuVmFyaWFibGVNaW5TZWwrKzsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZFBhcmVudCwgSURDX0NPTUJPX1ZCUk1JTiwgQ0JfU0VUQ1VSU0VMLCBuVmFyaWFibGVNaW5TZWwsIDApOworCisgICAgd2hpbGUgKG5WYXJpYWJsZU1heFNlbDwxMyAmJiBkd0JpdFJhdGVWYWx1ZVtuU1RdW25WYXJpYWJsZU1heFNlbF0gPCBkd01heCkKKyAgICAgICAgblZhcmlhYmxlTWF4U2VsKys7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmRQYXJlbnQsIElEQ19DT01CT19WQlJNQVgsIENCX1NFVENVUlNFTCwgblZhcmlhYmxlTWF4U2VsLCAwKTsKKworICAgIAorICAgIC8vIGNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgYml0cmF0ZSBpcyBmb3VuZCBleGFjdGx5IGFuZCBjb3JyZWN0IGlmIG5vdAorICAgIGlmIChkd0JpdFJhdGVWYWx1ZVtuU1RdW25WYXJpYWJsZU1pblNlbF0gIT0gZHdNaW4pCisgICAgeworICAgICAgICBkd01pbiA9IGR3Qml0UmF0ZVZhbHVlW25TVF1bblZhcmlhYmxlTWluU2VsXTsKKyAgICAgICAgLy8gd2UgY2FuIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBpcyBpbmRlcGVuZGVudCBvZiBhbnkgb3RoZXIgcGFyYW1ldGVycworICAgICAgICAvLyAoYnV0IGRlcGVuZHMgb24gc29tZSBvZiB0aGVtISkKKyAgICAgICAgbV9wQUVQcm9wcy0+c2V0X1ZhcmlhYmxlTWluKGR3TWluKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBpZiB0aGUgc3BlY2lmaWVkIGJpdHJhdGUgaXMgZm91bmQgZXhhY3RseSBhbmQgY29ycmVjdCBpZiBub3QKKyAgICBpZiAoZHdCaXRSYXRlVmFsdWVbblNUXVtuVmFyaWFibGVNYXhTZWxdICE9IGR3TWF4KQorICAgIHsKKyAgICAgICAgZHdNYXggPSBkd0JpdFJhdGVWYWx1ZVtuU1RdW25WYXJpYWJsZU1heFNlbF07CisgICAgICAgIC8vIHdlIGNhbiBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgaXMgaW5kZXBlbmRlbnQgb2YgYW55IG90aGVyIHBhcmFtZXRlcnMKKyAgICAgICAgLy8gKGJ1dCBkZXBlbmRzIG9uIHNvbWUgb2YgdGhlbSEpCisgICAgICAgIG1fcEFFUHJvcHMtPnNldF9WYXJpYWJsZU1heChkd01heCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBpbml0aWFsaXplIGNoZWNrYm94ZXMKKyAgICAvLworICAgIERXT1JEIGR3UEVTOworICAgIG1fcEFFUHJvcHMtPmdldF9QRVNPdXRwdXRFbmFibGVkKCZkd1BFUyk7CisKKyAgICBkd1BFUyA9IDA7CisgICAgQ2hlY2tEbGdCdXR0b24oaHduZFBhcmVudCwgSURDX0NIRUNLX1BFUywgZHdQRVMgPyBCU1RfQ0hFQ0tFRCA6IEJTVF9VTkNIRUNLRUQpOworCisgICAgRFdPUkQgZHdDUkM7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0NSQ0ZsYWcoJmR3Q1JDKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfQ1JDLCBkd0NSQyA/IEJTVF9DSEVDS0VEIDogQlNUX1VOQ0hFQ0tFRCk7CisKKyAgICBEV09SRCBkd0ZvcmNlTW9ubzsKKyAgICBtX3BBRVByb3BzLT5nZXRfRm9yY2VNb25vKCZkd0ZvcmNlTW9ubyk7CisgICAgQ2hlY2tEbGdCdXR0b24oaHduZFBhcmVudCwgSURDX0ZPUkNFX01PTk8sIGR3Rm9yY2VNb25vID8gQlNUX0NIRUNLRUQgOiBCU1RfVU5DSEVDS0VEKTsKKworICAgIERXT1JEIGR3Q29weXJpZ2h0OworICAgIG1fcEFFUHJvcHMtPmdldF9Db3B5cmlnaHRGbGFnKCZkd0NvcHlyaWdodCk7CisgICAgQ2hlY2tEbGdCdXR0b24oaHduZFBhcmVudCwgSURDX0NIRUNLX0NPUFlSSUdIVCwgZHdDb3B5cmlnaHQgPyBCU1RfQ0hFQ0tFRCA6IEJTVF9VTkNIRUNLRUQpOworCisgICAgRFdPUkQgZHdPcmlnaW5hbDsKKyAgICBtX3BBRVByb3BzLT5nZXRfT3JpZ2luYWxGbGFnKCZkd09yaWdpbmFsKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfT1JJR0lOQUwsIGR3T3JpZ2luYWwgPyBCU1RfQ0hFQ0tFRCA6IEJTVF9VTkNIRUNLRUQpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVuYWJsZUNvbnRyb2xzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpFbmFibGVDb250cm9scyhIV05EIGh3bmRQYXJlbnQsIGJvb2wgYkVuYWJsZSkKK3sKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfUEVTKSwgZmFsc2UpOy8vYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX1JBRElPX0NCUiksIGJFbmFibGUpOworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19DT01CT19DQlIpLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfUkFESU9fVkJSKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX0NPTUJPX1ZCUk1JTiksIGJFbmFibGUpOworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19DT01CT19WQlJNQVgpLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfQ09QWVJJR0hUKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX0NIRUNLX09SSUdJTkFMKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX0NIRUNLX0NSQyksIGJFbmFibGUpOworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19GT1JDRV9NT05PKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX1NMSURFUl9RVUFMSVRZKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX0NPTUJPX1NBTVBMRV9SQVRFKSwgYkVuYWJsZSk7Cit9CisKKy8vCisvLyBTZXREaXJ0eQorLy8KKy8vIG5vdGlmaWVzIHRoZSBwcm9wZXJ0eSBwYWdlIHNpdGUgb2YgY2hhbmdlcworCit2b2lkIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlOjpTZXREaXJ0eSgpCit7CisgICAgbV9iRGlydHkgPSBUUlVFOworICAgIGlmIChtX3BQYWdlU2l0ZSkKKyAgICAgICAgbV9wUGFnZVNpdGUtPk9uU3RhdHVzQ2hhbmdlKFBST1BQQUdFU1RBVFVTX0RJUlRZKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHNob3cvUHJvcFBhZ2UuaCBiL2RzaG93L1Byb3BQYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3ZmJlOQotLS0gL2Rldi9udWxsCisrKyBiL2RzaG93L1Byb3BQYWdlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqICBMQU1FIE1QMyBlbmNvZGVyIGZvciBEaXJlY3RTaG93CisgKiAgQmFzaWMgcHJvcGVydHkgcGFnZQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNYXJpZSBPcmxvdmEsIFBldGVyIEd1YmFub3YsIFZpdGFseSBJdmFub3YsIEVsZWNhcmQgTHRkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworY2xhc3MgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2UgOiBwdWJsaWMgQ0Jhc2VQcm9wZXJ0eVBhZ2UgCit7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ1Vua25vd24gKkNyZWF0ZUluc3RhbmNlKCBMUFVOS05PV04gcHVuaywgSFJFU1VMVCAqcGhyICk7CisgICAgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2UoIExQVU5LTk9XTiBwdW5rLCBIUkVTVUxUICpwaHIgKTsKKworICAgIEhSRVNVTFQgT25Db25uZWN0KElVbmtub3duICpwVW5rbm93bik7CisgICAgSFJFU1VMVCBPbkRpc2Nvbm5lY3QoKTsKKyAgICBIUkVTVUxUIE9uQWN0aXZhdGUoKTsKKyAgICBIUkVTVUxUIE9uRGVhY3RpdmF0ZSgpOworICAgIEhSRVNVTFQgT25BcHBseUNoYW5nZXMoKTsKKyAgICBCT09MIE9uUmVjZWl2ZU1lc3NhZ2UoSFdORCBod25kLFVJTlQgdU1zZyxXUEFSQU0gd1BhcmFtLExQQVJBTSBsUGFyYW0pOworCitwcml2YXRlOgorICAgIHZvaWQgICAgSW5pdFByb3BlcnRpZXNEaWFsb2coSFdORCBod25kUGFyZW50KTsKKyAgICB2b2lkICAgIEVuYWJsZUNvbnRyb2xzKEhXTkQgaHduZFBhcmVudCwgYm9vbCBiRW5hYmxlKTsKKyAgICB2b2lkICAgIFNldERpcnR5KHZvaWQpOworCisgICAgRFdPUkQgICBtX2R3Qml0cmF0ZTsgICAgICAgICAgICAgICAgLy9jb25zdGFudCBiaXQgcmF0ZQorICAgIERXT1JEICAgbV9kd1ZhcmlhYmxlOyAgICAgICAgICAgICAgIC8vZmxhZyAtIHdoZXRoZXIgdGhlIHZhcmlhYmxlIGJpdCByYXRlIHNldCAKKyAgICBEV09SRCAgIG1fZHdNaW47ICAgICAgICAgICAgICAgICAgICAvL3NwZWNpZnkgYSBtaW5pbXVtIGFsbG93ZWQgYml0cmF0ZQorICAgIERXT1JEICAgbV9kd01heDsgICAgICAgICAgICAgICAgICAgIC8vc3BlY2lmeSBhIG1heGltdW0gYWxsb3dlZCBiaXRyYXRlCisgICAgRFdPUkQgICBtX2R3UXVhbGl0eTsgICAgICAgICAgICAgICAgLy9lbmNvZGluZyBxdWFsaXR5CisgICAgRFdPUkQgICBtX2R3VkJScTsgICAgICAgICAgICAgICAgICAgLy9WQlIgcXVhbGl0eSBzZXR0aW5nICgwPWhpZ2hlc3QgcXVhbGl0eSwgOT1sb3dlc3QpIAorICAgIERXT1JEICAgbV9kd1NhbXBsZVJhdGU7CisgICAgRFdPUkQgICBtX2R3Q2hhbm5lbE1vZGU7CisgICAgRFdPUkQgICBtX2R3Q1JDOworICAgIERXT1JEICAgbV9kd0ZvcmNlTW9ubzsKKyAgICBEV09SRCAgIG1fZHdDb3B5cmlnaHQ7CisgICAgRFdPUkQgICBtX2R3T3JpZ2luYWw7CisKKyAgICBIV05EICAgIG1faHduZFF1YWxpdHk7ICAgICAgICAgICAgICAgLy9TbGlkZXIgd2luZG93IGhhbmRsZQorCisgICAgaW50ICAgICBtX3NySWR4OworCisgICAgSUF1ZGlvRW5jb2RlclByb3BlcnRpZXMgKm1fcEFFUHJvcHM7Cit9OwpkaWZmIC0tZ2l0IGEvZHNob3cvUHJvcFBhZ2VfYWR2LmNwcCBiL2RzaG93L1Byb3BQYWdlX2Fkdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlNGNiZQotLS0gL2Rldi9udWxsCisrKyBiL2RzaG93L1Byb3BQYWdlX2Fkdi5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiAgTEFNRSBNUDMgZW5jb2RlciBmb3IgRGlyZWN0U2hvdworICogIEFkdmFuY2VkIHByb3BlcnR5IHBhZ2UKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWFyaWUgT3Jsb3ZhLCBQZXRlciBHdWJhbm92LCBWaXRhbHkgSXZhbm92LCBFbGVjYXJkIEx0ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJlYW1zLmg+CisjaW5jbHVkZSA8b2xlY3RsLmg+CisjaW5jbHVkZSA8Y29tbWN0cmwuaD4KKyNpbmNsdWRlICJpYXVkaW9wcm9wcy5oIgorI2luY2x1ZGUgIm1wZWdhYy5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCisjaW5jbHVkZSAiUHJvcFBhZ2VfYWR2LmgiCisjaW5jbHVkZSAiUmVnLmgiCisKKyNkZWZpbmUgICAgICAgICBNUEdfTURfU1RFUkVPICAgICAgICAgICAwCisjZGVmaW5lICAgICAgICAgTVBHX01EX0pPSU5UX1NURVJFTyAgICAgMQorI2RlZmluZSAgICAgICAgIE1QR19NRF9EVUFMX0NIQU5ORUwgICAgIDIKKyNkZWZpbmUgICAgICAgICBNUEdfTURfTU9OTyAgICAgICAgICAgICAzCisKKy8vIFN0cmluZ3Mgd2hpY2ggYXBlYXIgaW4gY29tYm9ib3hlcworY29uc3QgY2hhciAqY2hDaE1vZGVbNF0gPSB7CisgICAgIk1vbm8iLAorICAgICJTdGFuZGFyZCBzdGVyZW8iLAorICAgICJKb2ludCBzdGVyZW8iLAorICAgICJEdWFsIGNoYW5uZWwifTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ3JlYXRlSW5zdGFuY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0NVbmtub3duICpDTXBlZ0F1ZEVuY1Byb3BlcnR5UGFnZUFkdjo6Q3JlYXRlSW5zdGFuY2UoIExQVU5LTk9XTiBwdW5rLCBIUkVTVUxUICpwaHIgKQoreworICAgIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlQWR2ICpwTmV3T2JqZWN0CisgICAgICAgID0gbmV3IENNcGVnQXVkRW5jUHJvcGVydHlQYWdlQWR2KCBwdW5rLCBwaHIgKTsKKworICAgIGlmKCBwTmV3T2JqZWN0ID09IE5VTEwgKQorICAgICAgICAqcGhyID0gRV9PVVRPRk1FTU9SWTsKKworICAgIHJldHVybiBwTmV3T2JqZWN0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6OkNNcGVnQXVkRW5jUHJvcGVydHlQYWdlQWR2KExQVU5LTk9XTiBwdW5rLCBIUkVTVUxUICpwaHIpIDoKKyAgICBDQmFzZVByb3BlcnR5UGFnZShOQU1FKCJFbmNvZGVyIEFkdmFuY2VkIFByb3BlcnR5IFBhZ2UiKSwgcHVuaywgSUREX0FEVlBST1BTLCBJRFNfQVVESU9fQURWQU5DRURfVElUTEUpLAorICAgIG1fcEFFUHJvcHMoTlVMTCkKK3sKKyAgICBBU1NFUlQocGhyKTsKKworICAgIEluaXRDb21tb25Db250cm9scygpOworfQorCisvLworLy8gT25Db25uZWN0CisvLworLy8gR2l2ZSB1cyB0aGUgZmlsdGVyIHRvIGNvbW11bmljYXRlIHdpdGgKK0hSRVNVTFQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6Ok9uQ29ubmVjdChJVW5rbm93biAqcFVua25vd24pCit7CisgICAgQVNTRVJUKG1fcEFFUHJvcHMgPT0gTlVMTCk7CisKKyAgICAvLyBBc2sgdGhlIGZpbHRlciBmb3IgaXQncyBjb250cm9sIGludGVyZmFjZQorCisgICAgSFJFU1VMVCBociA9IHBVbmtub3duLT5RdWVyeUludGVyZmFjZShJSURfSUF1ZGlvRW5jb2RlclByb3BlcnRpZXMsKHZvaWQgKiopJm1fcEFFUHJvcHMpOworICAgIGlmIChGQUlMRUQoaHIpIHx8ICFtX3BBRVByb3BzKQorICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKKworICAgIEFTU0VSVChtX3BBRVByb3BzKTsKKworICAgIC8vIEdldCBjdXJyZW50IGZpbHRlciBzdGF0ZQorLy8gICAgbV9wQUVQcm9wcy0+TG9hZEF1ZGlvRW5jb2RlclByb3BlcnRpZXNGcm9tUmVnaXN0cnkoKTsKKworICAgIG1fcEFFUHJvcHMtPmdldF9FbmZvcmNlVkJSbWluKCZtX2R3RW5mb3JjZVZCUm1pbik7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1ZvaWNlTW9kZSgmbV9kd1ZvaWNlTW9kZSk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0tlZXBBbGxGcmVxKCZtX2R3S2VlcEFsbEZyZXEpOworICAgIG1fcEFFUHJvcHMtPmdldF9TdHJpY3RJU08oJm1fZHdTdHJpY3RJU08pOworICAgIG1fcEFFUHJvcHMtPmdldF9Ob1Nob3J0QmxvY2soJm1fZHdOb1Nob3J0QmxvY2spOworICAgIG1fcEFFUHJvcHMtPmdldF9YaW5nVGFnKCZtX2R3WGluZ1RhZyk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0NoYW5uZWxNb2RlKCZtX2R3Q2hhbm5lbE1vZGUpOworICAgIG1fcEFFUHJvcHMtPmdldF9Gb3JjZU1TKCZtX2R3Rm9yY2VNUyk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X01vZGVGaXhlZCgmbV9kd01vZGVGaXhlZCk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1NhbXBsZU92ZXJsYXAoJm1fZHdPdmVybGFwKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfU2V0RHVyYXRpb24oJm1fZHdTZXRTdG9wKTsKKworICAgIHJldHVybiBOT0VSUk9SOworfQorCisvLworLy8gT25EaXNjb25uZWN0CisvLworLy8gUmVsZWFzZSB0aGUgaW50ZXJmYWNlCisKK0hSRVNVTFQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6Ok9uRGlzY29ubmVjdCgpCit7CisgICAgLy8gUmVsZWFzZSB0aGUgaW50ZXJmYWNlCisgICAgaWYgKG1fcEFFUHJvcHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVfVU5FWFBFQ1RFRDsKKworICAgIG1fcEFFUHJvcHMtPnNldF9FbmZvcmNlVkJSbWluKG1fZHdFbmZvcmNlVkJSbWluKTsKKyAgICBtX3BBRVByb3BzLT5zZXRfVm9pY2VNb2RlKG1fZHdWb2ljZU1vZGUpOworICAgIG1fcEFFUHJvcHMtPnNldF9LZWVwQWxsRnJlcShtX2R3S2VlcEFsbEZyZXEpOworICAgIG1fcEFFUHJvcHMtPnNldF9TdHJpY3RJU08obV9kd1N0cmljdElTTyk7CisgICAgbV9wQUVQcm9wcy0+c2V0X05vU2hvcnRCbG9jayhtX2R3Tm9TaG9ydEJsb2NrKTsKKyAgICBtX3BBRVByb3BzLT5zZXRfWGluZ1RhZyhtX2R3WGluZ1RhZyk7CisgICAgbV9wQUVQcm9wcy0+c2V0X0NoYW5uZWxNb2RlKG1fZHdDaGFubmVsTW9kZSk7CisgICAgbV9wQUVQcm9wcy0+c2V0X0ZvcmNlTVMobV9kd0ZvcmNlTVMpOworICAgIG1fcEFFUHJvcHMtPnNldF9Nb2RlRml4ZWQobV9kd01vZGVGaXhlZCk7CisgICAgbV9wQUVQcm9wcy0+c2V0X1NhbXBsZU92ZXJsYXAobV9kd092ZXJsYXApOworICAgIG1fcEFFUHJvcHMtPnNldF9TZXREdXJhdGlvbihtX2R3U2V0U3RvcCk7CisgICAgbV9wQUVQcm9wcy0+U2F2ZUF1ZGlvRW5jb2RlclByb3BlcnRpZXNUb1JlZ2lzdHJ5KCk7CisKKyAgICBtX3BBRVByb3BzLT5SZWxlYXNlKCk7CisgICAgbV9wQUVQcm9wcyA9IE5VTEw7CisKKyAgICByZXR1cm4gTk9FUlJPUjsKK30KKworLy8KKy8vIE9uQWN0aXZhdGUKKy8vCisvLyBDYWxsZWQgb24gZGlhbG9nIGNyZWF0aW9uCisKK0hSRVNVTFQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6Ok9uQWN0aXZhdGUodm9pZCkKK3sKKyAgICBJbml0UHJvcGVydGllc0RpYWxvZyhtX2h3bmQpOworCisgICAgcmV0dXJuIE5PRVJST1I7Cit9CisKKy8vCisvLyBPbkRlYWN0aXZhdGUKKy8vCisvLyBDYWxsZWQgb24gZGlhbG9nIGRlc3RydWN0aW9uCisKK0hSRVNVTFQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6Ok9uRGVhY3RpdmF0ZSh2b2lkKQoreworICAgIHJldHVybiBOT0VSUk9SOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBPblJlY2VpdmVNZXNzYWdlIC0gbWVzc2FnZSBoYW5kbGVyIGZ1bmN0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitCT09MIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlQWR2OjpPblJlY2VpdmVNZXNzYWdlKEhXTkQgaHduZCxVSU5UIHVNc2csV1BBUkFNIHdQYXJhbSxMUEFSQU0gbFBhcmFtKQoreworICAgIHN3aXRjaCAodU1zZykKKyAgICB7CisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgICBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKQorICAgICAgICB7CisgICAgICAgIGNhc2UgSURDX1JBRElPX1NURVJFTzoKKyAgICAgICAgY2FzZSBJRENfUkFESU9fSlNURVJFTzoKKyAgICAgICAgY2FzZSBJRENfUkFESU9fRFVBTDoKKyAgICAgICAgY2FzZSBJRENfUkFESU9fTU9OTzoKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIERXT1JEIGR3Q2hhbm5lbE1vZGUgPSBMT1dPUkQod1BhcmFtKSAtIElEQ19SQURJT19TVEVSRU87CisgICAgICAgICAgICAgICAgQ2hlY2tSYWRpb0J1dHRvbihod25kLCBJRENfUkFESU9fU1RFUkVPLCBJRENfUkFESU9fTU9OTywgTE9XT1JEKHdQYXJhbSkpOworCisgICAgICAgICAgICAgICAgaWYgKGR3Q2hhbm5lbE1vZGUgPT0gTVBHX01EX0pPSU5UX1NURVJFTykKKyAgICAgICAgICAgICAgICAgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZCxJRENfQ0hFQ0tfRk9SQ0VfTVMpLFRSVUUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZCxJRENfQ0hFQ0tfRk9SQ0VfTVMpLEZBTFNFKTsKKworICAgICAgICAgICAgICAgIG1fcEFFUHJvcHMtPnNldF9DaGFubmVsTW9kZShkd0NoYW5uZWxNb2RlKTsKKyAgICAgICAgICAgICAgICBTZXREaXJ0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRENfQ0hFQ0tfRU5GT1JDRV9NSU46CisgICAgICAgICAgICBtX3BBRVByb3BzLT5zZXRfRW5mb3JjZVZCUm1pbihJc0RsZ0J1dHRvbkNoZWNrZWQoaHduZCwgSURDX0NIRUNLX0VORk9SQ0VfTUlOKSk7CisgICAgICAgICAgICBTZXREaXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJRENfQ0hFQ0tfVk9JQ0U6CisgICAgICAgICAgICBtX3BBRVByb3BzLT5zZXRfVm9pY2VNb2RlKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfVk9JQ0UpKTsKKyAgICAgICAgICAgIFNldERpcnR5KCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEQ19DSEVDS19LRUVQX0FMTF9GUkVROgorICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X0tlZXBBbGxGcmVxKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfS0VFUF9BTExfRlJFUSkpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX1NUUklDVF9JU086CisgICAgICAgICAgICBtX3BBRVByb3BzLT5zZXRfU3RyaWN0SVNPKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfU1RSSUNUX0lTTykpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX0RJU0FCTEVfU0hPUlRfQkxPQ0s6CisgICAgICAgICAgICBtX3BBRVByb3BzLT5zZXRfTm9TaG9ydEJsb2NrKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfRElTQUJMRV9TSE9SVF9CTE9DSykpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX1hJTkdfVEFHOgorICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X1hpbmdUYWcoSXNEbGdCdXR0b25DaGVja2VkKGh3bmQsIElEQ19DSEVDS19YSU5HX1RBRykpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX0ZPUkNFX01TOgorICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X0ZvcmNlTVMoSXNEbGdCdXR0b25DaGVja2VkKGh3bmQsIElEQ19DSEVDS19GT1JDRV9NUykpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX01PREVfRklYRUQ6CisgICAgICAgICAgICBtX3BBRVByb3BzLT5zZXRfTW9kZUZpeGVkKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfTU9ERV9GSVhFRCkpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURDX0NIRUNLX09WRVJMQVA6CisgICAgICAgICAgICBtX3BBRVByb3BzLT5zZXRfU2FtcGxlT3ZlcmxhcChJc0RsZ0J1dHRvbkNoZWNrZWQoaHduZCwgSURDX0NIRUNLX09WRVJMQVApKTsKKyAgICAgICAgICAgIFNldERpcnR5KCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEQ19DSEVDS19TVE9QOgorICAgICAgICAgICAgbV9wQUVQcm9wcy0+c2V0X1NldER1cmF0aW9uKElzRGxnQnV0dG9uQ2hlY2tlZChod25kLCBJRENfQ0hFQ0tfU1RPUCkpOworICAgICAgICAgICAgU2V0RGlydHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIFdNX0RFU1RST1k6CisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvLworLy8gT25BcHBseUNoYW5nZXMKKy8vCitIUkVTVUxUIENNcGVnQXVkRW5jUHJvcGVydHlQYWdlQWR2OjpPbkFwcGx5Q2hhbmdlcygpCit7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0VuZm9yY2VWQlJtaW4oJm1fZHdFbmZvcmNlVkJSbWluKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfVm9pY2VNb2RlKCZtX2R3Vm9pY2VNb2RlKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfS2VlcEFsbEZyZXEoJm1fZHdLZWVwQWxsRnJlcSk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1N0cmljdElTTygmbV9kd1N0cmljdElTTyk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0NoYW5uZWxNb2RlKCZtX2R3Q2hhbm5lbE1vZGUpOworICAgIG1fcEFFUHJvcHMtPmdldF9Gb3JjZU1TKCZtX2R3Rm9yY2VNUyk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X05vU2hvcnRCbG9jaygmbV9kd05vU2hvcnRCbG9jayk7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1hpbmdUYWcoJm1fZHdYaW5nVGFnKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfTW9kZUZpeGVkKCZtX2R3TW9kZUZpeGVkKTsKKyAgICBtX3BBRVByb3BzLT5nZXRfU2FtcGxlT3ZlcmxhcCgmbV9kd092ZXJsYXApOworICAgIG1fcEFFUHJvcHMtPmdldF9TZXREdXJhdGlvbigmbV9kd1NldFN0b3ApOworICAgIG1fcEFFUHJvcHMtPlNhdmVBdWRpb0VuY29kZXJQcm9wZXJ0aWVzVG9SZWdpc3RyeSgpOworCisgICAgbV9wQUVQcm9wcy0+QXBwbHlDaGFuZ2VzKCk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworLy8KKy8vIEluaXRpYWxpemUgZGlhbG9nYm94IGNvbnRyb2xzIHdpdGggcHJvcGVyIHZhbHVlcworLy8KK3ZvaWQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6OkluaXRQcm9wZXJ0aWVzRGlhbG9nKEhXTkQgaHduZFBhcmVudCkKK3sKKyAgICBFbmFibGVDb250cm9scyhod25kUGFyZW50LCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gaW5pdGlhbGl6ZSByYWRpbyBib3R0b25zCisgICAgLy8KKyAgICBEV09SRCBkd0NoYW5uZWxNb2RlOworICAgIG1fcEFFUHJvcHMtPmdldF9DaGFubmVsTW9kZSgmZHdDaGFubmVsTW9kZSk7CisgICAgQ2hlY2tSYWRpb0J1dHRvbihod25kUGFyZW50LCBJRENfUkFESU9fU1RFUkVPLCBJRENfUkFESU9fTU9OTywgSURDX1JBRElPX1NURVJFTyArIGR3Q2hhbm5lbE1vZGUpOworCisgICAgaWYgKGR3Q2hhbm5lbE1vZGUgPT0gTVBHX01EX0pPSU5UX1NURVJFTykKKyAgICAgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX0NIRUNLX0ZPUkNFX01TKSwgVFJVRSk7CisgICAgZWxzZQorICAgICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfRk9SQ0VfTVMpLCBGQUxTRSk7CisKKyAgICAvLworICAgIC8vIGluaXRpYWxpemUgY2hlY2tib3hlcworICAgIC8vCisgICAgRFdPUkQgZHdFbmZvcmNlVkJSbWluOworICAgIG1fcEFFUHJvcHMtPmdldF9FbmZvcmNlVkJSbWluKCZkd0VuZm9yY2VWQlJtaW4pOworICAgIENoZWNrRGxnQnV0dG9uKGh3bmRQYXJlbnQsIElEQ19DSEVDS19FTkZPUkNFX01JTiwgZHdFbmZvcmNlVkJSbWluID8gQlNUX0NIRUNLRUQgOiBCU1RfVU5DSEVDS0VEKTsKKworICAgIERXT1JEIGR3Vm9pY2VNb2RlOworICAgIG1fcEFFUHJvcHMtPmdldF9Wb2ljZU1vZGUoJmR3Vm9pY2VNb2RlKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfVk9JQ0UsIGR3Vm9pY2VNb2RlID8gQlNUX0NIRUNLRUQgOiBCU1RfVU5DSEVDS0VEKTsKKworICAgIERXT1JEIGR3S2VlcEFsbEZyZXE7CisgICAgbV9wQUVQcm9wcy0+Z2V0X0tlZXBBbGxGcmVxKCZkd0tlZXBBbGxGcmVxKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfS0VFUF9BTExfRlJFUSwgZHdLZWVwQWxsRnJlcSA/IEJTVF9DSEVDS0VEIDogQlNUX1VOQ0hFQ0tFRCk7CisKKyAgICBEV09SRCBkd1N0cmljdElTTzsKKyAgICBtX3BBRVByb3BzLT5nZXRfU3RyaWN0SVNPKCZkd1N0cmljdElTTyk7CisgICAgQ2hlY2tEbGdCdXR0b24oaHduZFBhcmVudCwgSURDX0NIRUNLX1NUUklDVF9JU08sIGR3U3RyaWN0SVNPID8gQlNUX0NIRUNLRUQgOiBCU1RfVU5DSEVDS0VEKTsKKworICAgIERXT1JEIGR3Tm9TaG9ydEJsb2NrOworICAgIG1fcEFFUHJvcHMtPmdldF9Ob1Nob3J0QmxvY2soJmR3Tm9TaG9ydEJsb2NrKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfRElTQUJMRV9TSE9SVF9CTE9DSywgZHdOb1Nob3J0QmxvY2sgPyBCU1RfQ0hFQ0tFRCA6IEJTVF9VTkNIRUNLRUQpOworCisgICAgRFdPUkQgZHdYaW5nRW5hYmxlZDsKKyAgICBtX3BBRVByb3BzLT5nZXRfWGluZ1RhZygmZHdYaW5nRW5hYmxlZCk7CisgICAgQ2hlY2tEbGdCdXR0b24oaHduZFBhcmVudCwgSURDX0NIRUNLX1hJTkdfVEFHLCBkd1hpbmdFbmFibGVkID8gQlNUX0NIRUNLRUQgOiBCU1RfVU5DSEVDS0VEKTsKKworICAgIERXT1JEIGR3Rm9yY2VNUzsKKyAgICBtX3BBRVByb3BzLT5nZXRfRm9yY2VNUygmZHdGb3JjZU1TKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfRk9SQ0VfTVMsIGR3Rm9yY2VNUyA/IEJTVF9DSEVDS0VEIDogQlNUX1VOQ0hFQ0tFRCk7CisKKyAgICBEV09SRCBkd01vZGVGaXhlZDsKKyAgICBtX3BBRVByb3BzLT5nZXRfTW9kZUZpeGVkKCZkd01vZGVGaXhlZCk7CisgICAgQ2hlY2tEbGdCdXR0b24oaHduZFBhcmVudCwgSURDX0NIRUNLX01PREVfRklYRUQsIGR3TW9kZUZpeGVkID8gQlNUX0NIRUNLRUQgOiBCU1RfVU5DSEVDS0VEKTsKKworICAgIERXT1JEIGR3T3ZlcmxhcDsKKyAgICBtX3BBRVByb3BzLT5nZXRfU2FtcGxlT3ZlcmxhcCgmZHdPdmVybGFwKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfT1ZFUkxBUCwgZHdPdmVybGFwID8gQlNUX0NIRUNLRUQgOiBCU1RfVU5DSEVDS0VEKTsKKworICAgIERXT1JEIGR3U3RvcFRpbWU7CisgICAgbV9wQUVQcm9wcy0+Z2V0X1NldER1cmF0aW9uKCZkd1N0b3BUaW1lKTsKKyAgICBDaGVja0RsZ0J1dHRvbihod25kUGFyZW50LCBJRENfQ0hFQ0tfU1RPUCwgZHdTdG9wVGltZSA/IEJTVF9DSEVDS0VEIDogQlNUX1VOQ0hFQ0tFRCk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRW5hYmxlQ29udHJvbHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6OkVuYWJsZUNvbnRyb2xzKEhXTkQgaHduZFBhcmVudCwgYm9vbCBiRW5hYmxlKQoreworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19DSEVDS19FTkZPUkNFX01JTiksIGJFbmFibGUpOworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19SQURJT19TVEVSRU8pLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfUkFESU9fSlNURVJFTyksIGJFbmFibGUpOworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19SQURJT19EVUFMKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX1JBRElPX01PTk8pLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfRk9SQ0VfTVMpLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfVk9JQ0UpLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfS0VFUF9BTExfRlJFUSksIGJFbmFibGUpOworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19DSEVDS19TVFJJQ1RfSVNPKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX0NIRUNLX0RJU0FCTEVfU0hPUlRfQkxPQ0spLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfWElOR19UQUcpLCBiRW5hYmxlKTsKKyAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShod25kUGFyZW50LCBJRENfQ0hFQ0tfTU9ERV9GSVhFRCksIGJFbmFibGUpOworICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGh3bmRQYXJlbnQsIElEQ19DSEVDS19PVkVSTEFQKSwgYkVuYWJsZSk7CisgICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaHduZFBhcmVudCwgSURDX0NIRUNLX1NUT1ApLCBiRW5hYmxlKTsKK30KKworLy8KKy8vIFNldERpcnR5CisvLworLy8gbm90aWZpZXMgdGhlIHByb3BlcnR5IHBhZ2Ugc2l0ZSBvZiBjaGFuZ2VzCisKK3ZvaWQgQ01wZWdBdWRFbmNQcm9wZXJ0eVBhZ2VBZHY6OlNldERpcnR5KCkKK3sKKyAgICBtX2JEaXJ0eSA9IFRSVUU7CisgICAgaWYgKG1fcFBhZ2VTaXRlKQorICAgICAgICBtX3BQYWdlU2l0ZS0+T25TdGF0dXNDaGFuZ2UoUFJPUFBBR0VTVEFUVVNfRElSVFkpOworfQorCmRpZmYgLS1naXQgYS9kc2hvdy9Qcm9wUGFnZV9hZHYuaCBiL2RzaG93L1Byb3BQYWdlX2Fkdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZmFiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kc2hvdy9Qcm9wUGFnZV9hZHYuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogIExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKyAqICBBZHZhbmNlZCBwcm9wZXJ0eSBwYWdlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1hcmllIE9ybG92YSwgUGV0ZXIgR3ViYW5vdiwgVml0YWx5IEl2YW5vdiwgRWxlY2FyZCBMdGQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCitjbGFzcyBDTXBlZ0F1ZEVuY1Byb3BlcnR5UGFnZUFkdiA6IHB1YmxpYyBDQmFzZVByb3BlcnR5UGFnZSAKK3sKKworcHVibGljOgorICAgIHN0YXRpYyBDVW5rbm93biAqQ3JlYXRlSW5zdGFuY2UoIExQVU5LTk9XTiBwdW5rLCBIUkVTVUxUICpwaHIgKTsKKyAgICBDTXBlZ0F1ZEVuY1Byb3BlcnR5UGFnZUFkdiggTFBVTktOT1dOIHB1bmssIEhSRVNVTFQgKnBociApOworCisgICAgSFJFU1VMVCBPbkNvbm5lY3QoSVVua25vd24gKnBVbmtub3duKTsKKyAgICBIUkVTVUxUIE9uRGlzY29ubmVjdCgpOworICAgIEhSRVNVTFQgT25BY3RpdmF0ZSgpOworICAgIEhSRVNVTFQgT25EZWFjdGl2YXRlKCk7CisgICAgSFJFU1VMVCBPbkFwcGx5Q2hhbmdlcygpOworICAgIEJPT0wgT25SZWNlaXZlTWVzc2FnZShIV05EIGh3bmQsVUlOVCB1TXNnLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSk7CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICBJbml0UHJvcGVydGllc0RpYWxvZyhIV05EIGh3bmRQYXJlbnQpOworICAgIHZvaWQgICAgRW5hYmxlQ29udHJvbHMoSFdORCBod25kUGFyZW50LCBib29sIGJFbmFibGUpOworICAgIHZvaWQgICAgU2V0RGlydHkodm9pZCk7CisKKyAgICBEV09SRCAgIG1fZHdFbmZvcmNlVkJSbWluOworICAgIERXT1JEICAgbV9kd1ZvaWNlTW9kZTsKKyAgICBEV09SRCAgIG1fZHdLZWVwQWxsRnJlcTsKKyAgICBEV09SRCAgIG1fZHdTdHJpY3RJU087CisgICAgRFdPUkQgICBtX2R3Tm9TaG9ydEJsb2NrOworICAgIERXT1JEICAgbV9kd1hpbmdUYWc7CisgICAgRFdPUkQgICBtX2R3Q2hhbm5lbE1vZGU7CisgICAgRFdPUkQgICBtX2R3Rm9yY2VNUzsKKyAgICBEV09SRCAgIG1fZHdNb2RlRml4ZWQ7CisgICAgRFdPUkQgICBtX2R3T3ZlcmxhcDsKKyAgICBEV09SRCAgIG1fZHdTZXRTdG9wOworCisgICAgSUF1ZGlvRW5jb2RlclByb3BlcnRpZXMgKm1fcEFFUHJvcHM7Cit9OwpkaWZmIC0tZ2l0IGEvZHNob3cvUHJvcGVydHkucmMgYi9kc2hvdy9Qcm9wZXJ0eS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWRhNmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvUHJvcGVydHkucmMKQEAgLTAsMCArMSwyNzIgQEAKKy8vTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZ2VuZXJhdGVkIHJlc291cmNlIHNjcmlwdC4KKy8vCisjaW5jbHVkZSAicmVzb3VyY2UuaCIKKworI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLgorLy8KKyNkZWZpbmUgQVBTVFVESU9fSElEREVOX1NZTUJPTFMKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjdW5kZWYgQVBTVFVESU9fSElEREVOX1NZTUJPTFMKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJ1c3Npc2NoIHJlc291cmNlcworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19SVVMpCisjaWZkZWYgX1dJTjMyCitMQU5HVUFHRSBMQU5HX1JVU1NJQU4sIFNVQkxBTkdfREVGQVVMVAorI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MSkKKyNlbmRpZiAvL19XSU4zMgorCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBURVhUSU5DTFVERQorLy8KKworMSBURVhUSU5DTFVERSBESVNDQVJEQUJMRSAKK0JFR0lOCisgICAgInJlc291cmNlLmhcMCIKK0VORAorCisyIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICAiI2RlZmluZSBBUFNUVURJT19ISURERU5fU1lNQk9MU1xyXG4iCisgICAgIiNpbmNsdWRlICIid2luZG93cy5oIiJcclxuIgorICAgICIjdW5kZWYgQVBTVFVESU9fSElEREVOX1NZTUJPTFNcclxuIgorICAgICIjaW5jbHVkZSAiInJlc291cmNlLmgiIlxyXG4iCisgICAgIlwwIgorRU5ECisKKzMgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgCitCRUdJTgorICAgICJcclxuIgorICAgICJcMCIKK0VORAorCisjZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRAorCisjZW5kaWYgICAgLy8gUnVzc2lzY2ggcmVzb3VyY2VzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFbmdsaXNjaCAoVVNBKSByZXNvdXJjZXMKKworI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQorI2lmZGVmIF9XSU4zMgorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMKKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpCisjZW5kaWYgLy9fV0lOMzIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBEaWFsb2cKKy8vCisKK0lERF9BVURJT0VOQ1BST1BTIERJQUxPR0VYIDAsIDAsIDIyOCwgMTIxCitTVFlMRSBXU19DSElMRCB8IFdTX1ZJU0lCTEUKK0ZPTlQgOCwgIk1TIFNoZWxsIERsZyIsIDAsIDAsIDB4MQorQkVHSU4KKyAgICBDT05UUk9MICAgICAgICAgIkNvbnN0YW50IEJpdCBSYXRlIixJRENfUkFESU9fQ0JSLCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsNCwyLDcxLDEwCisgICAgQ09OVFJPTCAgICAgICAgICJWYXJpYWJsZSBCaXQgUmF0ZSIsSURDX1JBRElPX1ZCUiwiQnV0dG9uIiwKKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OLDQsMzEsNjksMTAKKyAgICBDT01CT0JPWCAgICAgICAgSURDX0NPTUJPX0NCUiw1MiwxNCw3Niw5MixDQlNfRFJPUERPV05MSVNUIHwgV1NfVlNDUk9MTCB8IAorICAgICAgICAgICAgICAgICAgICBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyAgICBDT01CT0JPWCAgICAgICAgSURDX0NPTUJPX1ZCUk1JTiw1Miw0NCw3Niw4NSxDQlNfRFJPUERPV05MSVNUIHwgCisgICAgICAgICAgICAgICAgICAgIFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgICAgQ09NQk9CT1ggICAgICAgIElEQ19DT01CT19WQlJNQVgsNTIsNjIsNzYsODYsQ0JTX0RST1BET1dOTElTVCB8IAorICAgICAgICAgICAgICAgICAgICBDQlNfQVVUT0hTQ1JPTEwgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCwKKyAgICAgICAgICAgICAgICAgICAgV1NfRVhfVFJBTlNQQVJFTlQKKyAgICBDT05UUk9MICAgICAgICAgIkNvcHlyaWdodCIsSURDX0NIRUNLX0NPUFlSSUdIVCwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKKyAgICAgICAgICAgICAgICAgICAgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDE1MSwzOSw0NSwxMAorICAgIENPTlRST0wgICAgICAgICAiT3JpZ2luYWwvQ29weSIsSURDX0NIRUNLX09SSUdJTkFMLCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QLDE1MSw1MSw1OSwxMAorICAgIENPTlRST0wgICAgICAgICAiQ1JDIFByb3RlY3RlZCIsSURDX0NIRUNLX0NSQywiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKKyAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUCwxNTEsNjMsNjMsMTAKKyAgICBDT05UUk9MICAgICAgICAgIlNsaWRlcjEiLElEQ19TTElERVJfUVVBTElUWSwibXNjdGxzX3RyYWNrYmFyMzIiLAorICAgICAgICAgICAgICAgICAgICBUQlNfQk9USCB8IFRCU19OT1RJQ0tTIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDY2LDEwMSw5NiwKKyAgICAgICAgICAgICAgICAgICAgMTUKKyAgICBMVEVYVCAgICAgICAgICAgImticHMiLElEQ19TVEFUSUMsNCwxNiwyMiw4CisgICAgQ09OVFJPTCAgICAgICAgICJNaW4iLElEQ19TVEFUSUMsIlN0YXRpYyIsU1NfTEVGVE5PV09SRFdSQVAgfCBXU19HUk9VUCw0LAorICAgICAgICAgICAgICAgICAgICA0NiwxMywxMQorICAgIExURVhUICAgICAgICAgICAiTWF4IixJRENfU1RBVElDLDQsNjQsMTYsMTEKKyAgICBMVEVYVCAgICAgICAgICAgIkVuY29kaW5nIFF1YWxpdHkiLElEQ19TVEFUSUMsNCwxMDUsNTQsOCxOT1QgV1NfR1JPVVAKKyAgICBMVEVYVCAgICAgICAgICAgIjAiLElEQ19URVhUX1FVQUxJVFksMTcwLDEwNCw0NywxMAorICAgIENPTUJPQk9YICAgICAgICBJRENfQ09NQk9fU0FNUExFX1JBVEUsMTUxLDE0LDU5LDEwNCxDQlNfRFJPUERPV05MSVNUIHwgCisgICAgICAgICAgICAgICAgICAgIFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgICAgQ09OVFJPTCAgICAgICAgICJUYXJnZXQgU2FtcGxlIFJhdGUiLElEQ19TVEFUSUMsIlN0YXRpYyIsCisgICAgICAgICAgICAgICAgICAgIFNTX0xFRlROT1dPUkRXUkFQIHwgTk9UIFdTX1ZJU0lCTEUgfCBXU19HUk9VUCwxNTIsMiw2Niw4CisgICAgQ09NQk9CT1ggICAgICAgIElEQ19DT01CT19WQlJxLDUyLDgwLDc2LDkwLENCU19EUk9QRE9XTkxJU1QgfCBXU19WU0NST0xMIHwgCisgICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AKKyAgICBMVEVYVCAgICAgICAgICAgIlZCUiBRdWFsaXR5IixJRENfU1RBVElDLDQsODIsNDAsOAorICAgIENPTlRST0wgICAgICAgICAiRm9yY2UgTW9ubyIsSURDX0ZPUkNFX01PTk8sIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YIHwgCisgICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AsMTUxLDc1LDU0LDEwCitFTkQKKworSUREX0FEVlBST1BTIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjI4LCAxMjkKK1NUWUxFIFdTX0NISUxEIHwgV1NfVklTSUJMRQorRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKK0JFR0lOCisgICAgQ09OVFJPTCAgICAgICAgICJNb25vIixJRENfUkFESU9fTU9OTywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfCAKKyAgICAgICAgICAgICAgICAgICAgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDEwOSw5MywzNCwxMAorICAgIENPTlRST0wgICAgICAgICAiU3RhbmRhcmQgc3RlcmVvIixJRENfUkFESU9fU1RFUkVPLCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsMTA5LDM2LDY3LDExCisgICAgQ09OVFJPTCAgICAgICAgICJKb2ludCBzdGVyZW8iLElEQ19SQURJT19KU1RFUkVPLCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsMTA5LDUxLDYwLDEwCisgICAgR1JPVVBCT1ggICAgICAgICJNb2RlIFNlbGVjdGlvbiIsSURDX1NUQVRJQywxMDMsMjYsMTE4LDgyLEJTX0NFTlRFUiB8IAorICAgICAgICAgICAgICAgICAgICBXU19HUk9VUAorICAgIENPTlRST0wgICAgICAgICAiU3RyaWN0bHkgZW5mb3JjZSBWQlIgbWluIGJpdHJhdGUiLElEQ19DSEVDS19FTkZPUkNFX01JTiwKKyAgICAgICAgICAgICAgICAgICAgIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDcsOCwxMTMsCisgICAgICAgICAgICAgICAgICAgIDEwCisgICAgQ09OVFJPTCAgICAgICAgICJWb2ljZSBlbmNvZGluZyBtb2RlIixJRENfQ0hFQ0tfVk9JQ0UsIkJ1dHRvbiIsCisgICAgICAgICAgICAgICAgICAgIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCw3LDIxLDg1LDEwCisgICAgQ09OVFJPTCAgICAgICAgICJLZWVwIGFsbCBmcmVxdWVuY2llcyIsSURDX0NIRUNLX0tFRVBfQUxMX0ZSRVEsIkJ1dHRvbiIsCisgICAgICAgICAgICAgICAgICAgIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0RJU0FCTEVEIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDcsCisgICAgICAgICAgICAgICAgICAgIDM0LDgwLDEwCisgICAgQ09OVFJPTCAgICAgICAgICJTdHJpY3QgSVNPIGNvbXBsaWFuY2UiLElEQ19DSEVDS19TVFJJQ1RfSVNPLCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsNyw0Nyw4NCwxMAorICAgIENPTlRST0wgICAgICAgICAiRGlzYWJsZSBzaG9ydCBibG9ja3MiLElEQ19DSEVDS19ESVNBQkxFX1NIT1JUX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCBXU19ESVNBQkxFRCB8IFdTX0dST1VQIHwgCisgICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AsNyw2MCw3OSwxMAorICAgIENPTlRST0wgICAgICAgICAiRW5hYmxlIFhpbmcgVkJSIHRhZyIsSURDX0NIRUNLX1hJTkdfVEFHLCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsNyw3Myw4MywxMAorICAgIENPTlRST0wgICAgICAgICAiRHVhbCBjaGFubmVsIixJRENfUkFESU9fRFVBTCwiQnV0dG9uIiwKKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDEwOSw3OSw1OCwxMAorICAgIENPTlRST0wgICAgICAgICAiRm9yY2VkIG1pZCAvIHNpZGUgc3RlcmVvIixJRENfQ0hFQ0tfRk9SQ0VfTVMsIkJ1dHRvbiIsCisgICAgICAgICAgICAgICAgICAgIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AsMTIyLDY1LDkyLDEwCisgICAgQ09OVFJPTCAgICAgICAgICJNb2RlIEZpeGVkIixJRENfQ0hFQ0tfTU9ERV9GSVhFRCwiQnV0dG9uIiwKKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT0NIRUNLQk9YIHwgV1NfRElTQUJMRUQgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsNywKKyAgICAgICAgICAgICAgICAgICAgODYsNTMsMTAKKyAgICBDT05UUk9MICAgICAgICAgIkFsbG93IHNhbXBsZSBvdmVybGFwIixJRENfQ0hFQ0tfT1ZFUkxBUCwiQnV0dG9uIiwKKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDcsOTksODIsMTAKKyAgICBDT05UUk9MICAgICAgICAgIlNldCBzYW1wbGUgc3RvcCB0aW1lIixJRENfQ0hFQ0tfU1RPUCwiQnV0dG9uIiwKKyAgICAgICAgICAgICAgICAgICAgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLDcsMTEyLDgxLDEwCitFTkQKKworSUREX0FCT1VUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjI4LCAxMjEKK1NUWUxFIFdTX0NISUxECitGT05UIDgsICJNUyBTYW5zIFNlcmlmIgorQkVHSU4KKyAgICBMVEVYVCAgICAgICAgICAgIkxBTUUgQWluJ3QgTVAzIEVuY29kZXIgKFguWFggZW5naW5lKSIsSURDX0xBTUVfVkVSLDcsOCwKKyAgICAgICAgICAgICAgICAgICAgMjA4LDgKKyAgICBMVEVYVCAgICAgICAgICAgIkxBTUUgUHJvamVjdCBIb21lcGFnZTogaHR0cDovL3d3dy5tcDNkZXYub3JnIiwKKyAgICAgICAgICAgICAgICAgICAgSURDX0xBTUVfVVJMLDcsMTksMTkyLDgKKyAgICBFRElUVEVYVCAgICAgICAgSURDX0xBTUVfTEEsNywzMSwyMTQsODMsRVNfTVVMVElMSU5FIHwgRVNfQVVUT1ZTQ1JPTEwgfCAKKyAgICAgICAgICAgICAgICAgICAgRVNfQVVUT0hTQ1JPTEwgfCBFU19SRUFET05MWSB8IFdTX1ZTQ1JPTEwKK0VORAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gREVTSUdOSU5GTworLy8KKworI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKK0dVSURFTElORVMgREVTSUdOSU5GTyBESVNDQVJEQUJMRSAKK0JFR0lOCisgICAgSUREX0FVRElPRU5DUFJPUFMsIERJQUxPRworICAgIEJFR0lOCisgICAgICAgIFJJR0hUTUFSR0lOLCAyMjMKKyAgICAgICAgQk9UVE9NTUFSR0lOLCAxMTgKKyAgICBFTkQKKworICAgIElERF9BRFZQUk9QUywgRElBTE9HCisgICAgQkVHSU4KKyAgICAgICAgTEVGVE1BUkdJTiwgNworICAgICAgICBSSUdIVE1BUkdJTiwgMjIxCisgICAgICAgIFRPUE1BUkdJTiwgNQorICAgICAgICBCT1RUT01NQVJHSU4sIDEyMQorICAgIEVORAorCisgICAgSUREX0FCT1VULCBESUFMT0cKKyAgICBCRUdJTgorICAgICAgICBMRUZUTUFSR0lOLCA3CisgICAgICAgIFJJR0hUTUFSR0lOLCAyMjEKKyAgICAgICAgVE9QTUFSR0lOLCA3CisgICAgICAgIEJPVFRPTU1BUkdJTiwgMTE0CisgICAgRU5ECitFTkQKKyNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECisKKworI2lmbmRlZiBfTUFDCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFZlcnNpb24KKy8vCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIDEsMCw2MSwyNDg3NQorIFBST0RVQ1RWRVJTSU9OIDEsMCw2MSwyNDg3NQorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgMHgxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsICJMQU1FIERpcmVjdFNob3cgRmlsdGVyXDAiCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIkxBTUUgQXVkaW8gRW5jb2RlclwwIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEsIDAsIDYxLCA5MDQxMVwwIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJMQU1FIEF1ZGlvIEVuY29kZXJcMCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgqSAyMDA1IEVsZWNhcmQgTHRkLlwwIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsICJcMCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImxhbWUuYXhcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcml2YXRlQnVpbGQiLCAiXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiTEFNRSBBdWRpbyBFbmNvZGVyXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMSwgMCwgNjEsIDkwNDExXDAiCisgICAgICAgICAgICBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgIlwwIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORAorCisjZW5kaWYgICAgLy8gIV9NQUMKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFN0cmluZyBUYWJsZQorLy8KKworU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgCitCRUdJTgorICAgIElEU19BVURJT19QUk9QU19USVRMRSAgICJNUEVHIExheWVyIElJSSBBdWRpbyBFbmNvZGVyIgorICAgIElEU19BVURJT19BRFZBTkNFRF9USVRMRSAiQWR2YW5jZWQiCisgICAgSURTX0FCT1VUICAgICAgICAgICAgICAgIkFib3V0IgorRU5ECisKKyNlbmRpZiAgICAvLyBFbmdsaXNjaCAoVVNBKSByZXNvdXJjZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisjaWZuZGVmIEFQU1RVRElPX0lOVk9LRUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDMgcmVzb3VyY2UuCisvLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYgICAgLy8gbm90IEFQU1RVRElPX0lOVk9LRUQKKwpkaWZmIC0tZ2l0IGEvZHNob3cvUkVBRE1FIGIvZHNob3cvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzM2QxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kc2hvdy9SRUFETUUKQEAgLTAsMCArMSw3MCBAQAorTEFNRSBEaXJlY3RTaG93IEZpbHRlcgorVmVyc2lvbiAxLjAKKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWFyaWUgT3Jsb3ZhLCBQZXRlciBHdWJhbm92LCBWaXRhbHkgSXZhbm92LCBFbGVjYXJkIEx0ZC4KKworVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgordmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitUaGlzIGxpYnJhcnkgaXMgYSBNaWNyb3NvZnQoUikgRGlyZWN0U2hvdyhSKSB3cmFwcGVyIGZpbHRlciBmb3IgCitMQU1FIGxpYnJhcnkuIEl0IGFkZHMgRGlyZWN0U2hvdyBpbnRlcmZhY2UgdG8gdGhlIGxpYnJhcnkgYW5kIHR3bworcHJvcGVydHkgcGFnZXMgc28geW91IGNhbiB0dW5lIHNvbWUgZW5jb2RpbmcgcGFyYW1ldGVycy4KKworV2UgYXJlIGludGVyZXN0ZWQgdG8gaGVhciBmcm9tIHlvdSwgd2hlbiB5b3UgdXNlIHRoaXMgcGFja2FnZQorYXMgcGFydCBvZiBhbm90aGVyIHByb2plY3QuCisKK0ZpbHRlciBIb21lcGFnZSBodHRwOi8vd3d3LmVsZWNhcmQuY29tL3Byb2R1Y3RzL2xheWVyM2VuY29kZXIuc2h0bWwKKworVml0YWx5IEl2YW5vdiAgIHZpdGFseS5pdmFub3ZAZWxlY2FyZC5uZXQucnUKKworCisKK05PVEU6Cisxc3Q6IGJ1aWxkIGR4OXNkay9TYW1wbGVzL0RTaG93L0Jhc2VDbGFzc2VzIFByb2plY3QKKzJuZDogY29weSByZXN1bHRpbmcgc3RybWJhc2UubGliIChvciBzdHJtYmFzZC5saWIgZm9yIGRlYnVnIHN1cHBvcnQpIAorICAgICBpbnRvIExBTUUncyBEU2hvdyBmb2xkZXIKKzNyZDogYWRkIHRoZSBCYXNlQ2xhc3NlcyBkaXJlY3RvcnkgcGF0aCB0byB0aGUgVmlzdWFsIFN0dWRpbworICAgICBJbmNsdWRlIGFuZCBMaWJyYXJ5IGRpcmVjdG9yeSBzZWFyY2ggcGF0aCBsaXN0cyAKKyAgICAgaS5lLiBmb3IgVmlzdWFsIFN0dWRpbyA2IGNob29zZToKKworICAgICBUb29scyAtPiBPcHRpb25zIC0+IERpcmVjdG9yaWVzCisKKzR0aDogYnVpbGQgTEFNRSAuRExMIGJ1aWxkcyAoaWYgeW91IGRpZG4ndCB5ZXQpCis1dGg6IGJ1aWxkIExBTUUgRFNob3cgRmlsdGVyCisKKworVFJPVUJMRVNIT09USU5HIEZBUToKK1EuIFdoZW4gdHJ5aW5nIHRvIG9wZW4gYSB3b3Jrc3BhY2UgZmlsZSAoLmRzdyksIEkgZ2V0IGFuICJlbXB0eSIgd29ya3NwYWNlCisoaS5lLiB0aGVyZSBhcmUgbm8gc291cmNlIGZpbGVzIGxpc3RlZCkgYW5kL29yIHdoZW4gdHJ5aW5nIHRvIG9wZW4gYSBwcm9qZWN0CitmaWxlICguZHNwKSwgSSBnZXQgYSAiVGhpcyBtYWtlZmlsZSB3YXMgbm90IGdlbmVyYXRlZCBieSBEZXZlbG9wZXIgU3R1ZGlvIiAKK2Vycm9yLgorCitBLiBPZnRlbiwgdGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGhhdmluZyBVTklYIGxpbmUgYnJlYWtzIChMRikgaW4gdGhlIAorLmRzdyBhbmQgLmRzcCBmaWxlcywgYXMgb3Bwb3NlZCB0byBXaW5kb3dzIGxpbmUgYnJlYWtzIChDUlxMRikuIEl0IAoraXMgaW50ZXJlc3RpbmcgdG8gbm90ZSB0aGF0IC5kc3cgYW5kIC5kc3AgZmlsZXMgYXJlIGp1c3QgdGV4dCBmaWxlczsgCit5b3UgY2FuIG9wZW4gdGhlbSB1cCBpbiBhbnkgdGV4dCBlZGl0b3IuIElmIHlvdSBvcGVuIHRoZSAuZHN3IGFuZCAKKy5kc3AgZmlsZXMgaW4gYSB0ZXh0IGVkaXRvciB0aGF0IGNhbid0IGhhbmRsZSBVTklYIGxpbmUgYnJlYWtzIAorKG5hbWVseSBOb3RlcGFkKSB5b3Ugd2lsbCBwcm9iYWJseSBzZWUgYmlnLCBibGFjayBzcXVhcmVzIGF0IAordGhlIGVuZCBvZiBsaW5lcy4gWW91IGNhbiAiZml4IiB0aGlzIGVycm9yIGJ5IGZvbGxvd2luZyB0aGlzIHByb2NlZHVyZS4KKworMSkgRG8gTk9UIGxldCBNaWNyb3NvZnQgVmlzdWFsIEMrKyBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbSEgUHJlc3MgIk5vIiB3aGVuIHByb21wdGVkLgorCisyKSBPcGVuIHRoZSAuZHN3IGFuZCAuZHNwIGZpbGVzIGluIGEgdGV4dCBlZGl0b3IgdGhhdCB1bmRlcnN0YW5kcyBVTklYIGxpbmUgYnJlYWtzLiAKK1dvcmRQYWQgaXMgb25lIGFuZCBpdCBpcyBhdmFpbGFibGUgd2l0aCBtb3N0IGNvcGllcyBvZiBXaW5kb3dzLgorCiszKSBPbmNlIG9wZW4sIHNpbXBseSByZS1zYXZlIHRoZSBmaWxlIChJbiBXb3JkUGFkLCBtYWtlIHN1cmUgeW91IHNldCB0aGUgU2F2ZSAKK0FzIHR5cGUgdG8gIlRleHQgRG9jdW1lbnQiKS4gQWxsIFVOSVggbGluZSBicmVha3Mgc2hvdWxkIHRoZW4gYmUgYXV0b21hdGljYWxseQorY29udmVydGVkIHRvIFdpbmRvd3MgbGluZSBicmVha3MuCisKZGlmZiAtLWdpdCBhL2RzaG93L1JFRy5DUFAgYi9kc2hvdy9SRUcuQ1BQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmYzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kc2hvdy9SRUcuQ1BQCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogIExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKyAqICBSZWdpc3RyeSBjYWxscyBoYW5kbGluZyBjbGFzcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNYXJpZSBPcmxvdmEsIFBldGVyIEd1YmFub3YsIFZpdGFseSBJdmFub3YsIEVsZWNhcmQgTHRkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPFdpbmRvd3MuaD4KKworI2luY2x1ZGUgInJlZy5oIgorCituYW1lc3BhY2UgTGFtZQoreworCitDUmVnS2V5OjpDUmVnS2V5KHZvaWQpCit7CisgICAgbV9oUm9vdEtleSA9IE5VTEw7CisgICAgbV9uYW1lWzBdID0gMDsKKyAgICBtX2hLZXkgPSBOVUxMOworfQorCisKK0NSZWdLZXk6OkNSZWdLZXkoSEtFWSBydCwgUFRTVFIgcE5hbWUpCit7CisgICAgbV9oUm9vdEtleSA9IHJ0OworICAgIG1faEtleSA9IE5VTEw7CisgICAgaWYocE5hbWUpCisgICAgeworICAgICAgICBsc3RyY3B5KG1fbmFtZSwgcE5hbWUpOworICAgICAgICBPcGVuKG1faFJvb3RLZXksIG1fbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbV9uYW1lWzBdID0gMDsKK30KKworCitDUmVnS2V5Ojp+Q1JlZ0tleSh2b2lkKQoreworICAgIENsb3NlKCk7Cit9CisKKworCitCT09MICAgIENSZWdLZXk6Ok9wZW4oSEtFWSByb290S2V5LCBQVFNUUiBwTmFtZSkKK3sKKyAgICBpZihtX2hLZXkpCisgICAgICAgIENsb3NlKCk7CisKKyAgICBtX2hSb290S2V5ID0gcm9vdEtleTsKKyAgICBpZihwTmFtZSkgCisgICAgeworICAgICAgICBsc3RyY3B5KG1fbmFtZSwgcE5hbWUpOworICAgICAgICBpZihSZWdPcGVuS2V5RXgobV9oUm9vdEtleSwgbV9uYW1lLCAwLCBLRVlfQUxMX0FDQ0VTUywgJm1faEtleSkgIT0gRVJST1JfU1VDQ0VTUykgCisgICAgICAgIHsKKyAgICAgICAgICAgIG1faEtleSA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIG1fbmFtZVswXSA9IDA7CisgICAgICAgIG1faEtleSA9IG1faFJvb3RLZXk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworQk9PTCAgICBDUmVnS2V5OjpDcmVhdGUoSEtFWSByb290S2V5LCBQVFNUUiBwTmFtZSkKK3sKKyAgICBpZihtX2hLZXkpCisgICAgICAgIENsb3NlKCk7CisKKyAgICBtX2hSb290S2V5ID0gcm9vdEtleTsKKyAgICBpZihwTmFtZSkgCisgICAgeworICAgICAgICBsc3RyY3B5KG1fbmFtZSwgcE5hbWUpOworICAgICAgICBpZihSZWdDcmVhdGVLZXlFeChtX2hSb290S2V5LCBwTmFtZSwgTlVMTCwKKyAgICAgICAgICAgICAgICBURVhUKCIiKSwgUkVHX09QVElPTl9OT05fVk9MQVRJTEUsIEtFWV9BTExfQUNDRVNTLCBOVUxMLAorICAgICAgICAgICAgICAgICZtX2hLZXksIE5VTEwpICE9IEVSUk9SX1NVQ0NFU1MpIAorICAgICAgICB7CisKKyAgICAgICAgICAgIG1faEtleSA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIG1fbmFtZVswXSA9IDA7CisgICAgfQorICAgIG1faFJvb3RLZXkgPSBtX2hLZXk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitCT09MICAgIENSZWdLZXk6Ok9wZW4oUFRTVFIgYW4pCit7CisgICAgVENIQVIgYWNoTmFtZVtNQVhfUEFUSF07CisKKyAgICBpZihtX2hLZXkpCisgICAgICAgIENsb3NlKCk7CisKKyAgICBsc3RyY3B5KGFjaE5hbWUsIG1fbmFtZSk7CisgICAgaWYoYW4pCisgICAgICAgIGxzdHJjYXQoYWNoTmFtZSwgYW4pOworCisgICAgaWYoUmVnT3BlbktleUV4KG1faFJvb3RLZXksIGFjaE5hbWUsIDAsIEtFWV9BTExfQUNDRVNTLCAmbV9oS2V5KSAhPSBFUlJPUl9TVUNDRVNTKSAKKyAgICB7CisgICAgICAgIG1faEtleSA9IE5VTEw7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitCT09MICAgIENSZWdLZXk6OkNyZWF0ZShQVFNUUiBhbikKK3sKKyAgICBUQ0hBUiBhY2hOYW1lW01BWF9QQVRIXTsKKworICAgIGlmKG1faEtleSkKKyAgICAgICAgQ2xvc2UoKTsKKworICAgIGxzdHJjcHkoYWNoTmFtZSwgbV9uYW1lKTsKKyAgICBpZihhbikKKyAgICAgICAgbHN0cmNhdChhY2hOYW1lLCBhbik7CisKKyAgICBpZihSZWdDcmVhdGVLZXlFeChtX2hSb290S2V5LCBhY2hOYW1lLCBOVUxMLAorICAgICAgICAgICAgVEVYVCgiIiksIFJFR19PUFRJT05fTk9OX1ZPTEFUSUxFLCBLRVlfQUxMX0FDQ0VTUywgTlVMTCwKKyAgICAgICAgICAgICZtX2hLZXksIE5VTEwpICE9IEVSUk9SX1NVQ0NFU1MpIAorICAgIHsKKworICAgICAgICBtX2hLZXkgPSBOVUxMOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworQk9PTCAgICBDUmVnS2V5OjpDbG9zZSh2b2lkKQoreworICAgIGlmKG1faEtleSAmJiBtX2hLZXkgIT0gbV9oUm9vdEtleSkKKyAgICAgICAgUmVnQ2xvc2VLZXkobV9oS2V5KTsKKworICAgIG1faEtleSA9IDA7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0wgICAgQ1JlZ0tleTo6Z2V0RmxhZyhQVFNUUiB2YWx1ZW5hbWUsIEJPT0wgYkRlZmF1bHQpCit7CisgICAgaWYoIW1faEtleSkKKyAgICAgICAgcmV0dXJuIGJEZWZhdWx0OworCisgICAgRFdPUkQgY2JEYXRhOworICAgIERXT1JEICAgZHdEYXRhOworICAgIERXT1JEICAgZHdUeXBlOworCisgICAgY2JEYXRhID0gc2l6ZW9mKGR3RGF0YSk7CisgICAgaWYoUmVnUXVlcnlWYWx1ZUV4KG1faEtleSwgdmFsdWVuYW1lLCBOVUxMLCAmZHdUeXBlLCAoUEJZVEUpJmR3RGF0YSwgJmNiRGF0YSkgPT0gRVJST1JfU1VDQ0VTUykgCisgICAgeworICAgICAgICBpZihkd1R5cGUgPT0gUkVHX0RXT1JEKQorICAgICAgICAgICAgcmV0dXJuIChkd0RhdGEpID8gVFJVRSA6IEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gYkRlZmF1bHQ7Cit9CisKKwordm9pZCAgICBDUmVnS2V5OjpzZXRGbGFnKFBUU1RSIHZhbHVlbmFtZSwgQk9PTCBiVmFsdWUsIEJPT0wgYkRlZmF1bHQpCit7CisgICAgaWYoZ2V0RmxhZyh2YWx1ZW5hbWUsIGJEZWZhdWx0KSA9PSBiVmFsdWUgKQorICAgICAgICByZXR1cm47CisKKyAgICBSZWdTZXRWYWx1ZUV4KG1faEtleSwgdmFsdWVuYW1lLCAwLCBSRUdfRFdPUkQsIChQQllURSkmYlZhbHVlLCBzaXplb2YoYlZhbHVlKSk7Cit9CisKKwordm9pZCAgICBDUmVnS2V5OjpzZXRGbGFnKFBUU1RSIHZhbHVlbmFtZSwgQk9PTCBiVmFsdWUpCit7CisgICAgUmVnU2V0VmFsdWVFeChtX2hLZXksIHZhbHVlbmFtZSwgMCwgUkVHX0RXT1JELCAoUEJZVEUpJmJWYWx1ZSwgc2l6ZW9mKGJWYWx1ZSkpOworfQorCisKK0RXT1JEICAgQ1JlZ0tleTo6Z2V0RFdPUkQoUFRTVFIgdmFsdWVuYW1lLCBEV09SRCBiRGVmYXVsdCkKK3sKKyAgICBEV09SRCBkd0RhdGE7CisgICAgRFdPUkQgY2JEYXRhOworICAgIERXT1JEICAgZHdUeXBlOworCisgICAgaWYoIW1faEtleSkKKyAgICAgICAgcmV0dXJuIGJEZWZhdWx0OworCisgICAgY2JEYXRhID0gc2l6ZW9mKGR3RGF0YSk7CisgICAgaWYoUmVnUXVlcnlWYWx1ZUV4KG1faEtleSwgdmFsdWVuYW1lLCBOVUxMLCAmZHdUeXBlLCAoUEJZVEUpJmR3RGF0YSwgJmNiRGF0YSkgPT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBpZihkd1R5cGUgPT0gUkVHX0RXT1JEKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChVSU5UKWR3RGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiRGVmYXVsdDsKK30KKworCit2b2lkICAgIENSZWdLZXk6OnNldERXT1JEKFBUU1RSIHZhbHVlbmFtZSwgRFdPUkQgZHdWYWx1ZSwgRFdPUkQgZHdEZWZhdWx0KQoreworICAgIERXT1JEIGR3RGF0YSA9IGR3VmFsdWU7CisKKyAgICBpZihnZXREV09SRCh2YWx1ZW5hbWUsIGR3RGVmYXVsdCkgPT0gZHdWYWx1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUmVnU2V0VmFsdWVFeChtX2hLZXksIHZhbHVlbmFtZSwgMCwgUkVHX0RXT1JELCAoUEJZVEUpJmR3RGF0YSwgc2l6ZW9mKGR3RGF0YSkpOworfQorCisKK3ZvaWQgICAgQ1JlZ0tleTo6c2V0RFdPUkQoUFRTVFIgdmFsdWVuYW1lLCBEV09SRCBkd1ZhbHVlKQoreworICAgIERXT1JEIGR3RGF0YSA9IGR3VmFsdWU7CisgICAgUmVnU2V0VmFsdWVFeChtX2hLZXksIHZhbHVlbmFtZSwgMCwgUkVHX0RXT1JELCAoUEJZVEUpJmR3RGF0YSwgc2l6ZW9mKGR3RGF0YSkpOworfQorCisKK0RXT1JEIENSZWdLZXk6OmdldFN0cmluZyhQVFNUUiB2YWx1ZW5hbWUsIFBUU1RSIHBEZWZhdWx0LCBQVFNUUiBwUmVzdWx0LCBpbnQgY2JTaXplKQoreworICAgIERXT1JEIGR3VHlwZTsKKworICAgIGNiU2l6ZSAqPSBzaXplb2YoVENIQVIpOyAgICAvLyBmb3IgdW5pY29kZSBzdHJpbmdzCisKKyAgICBpZihtX2hLZXkpIAorICAgIHsKKyAgICAgICAgaWYoUmVnUXVlcnlWYWx1ZUV4KG1faEtleSwgdmFsdWVuYW1lLCBOVUxMLCAmZHdUeXBlLCAoTFBCWVRFKXBSZXN1bHQsIChMUERXT1JEKSZjYlNpemUpID09IEVSUk9SX1NVQ0NFU1MpIAorICAgICAgICB7CisgICAgICAgICAgICBpZihkd1R5cGUgPT0gUkVHX1NaKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oY2JTaXplIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbHN0cmNweShwUmVzdWx0LCBwRGVmYXVsdCk7CisgICAgcmV0dXJuIGxzdHJsZW4ocERlZmF1bHQpOworfQorCisKK3ZvaWQgICAgQ1JlZ0tleTo6c2V0U3RyaW5nKFBUU1RSIHZhbHVlbmFtZSwgUFRTVFIgcERhdGEpCit7CisgICAgUmVnU2V0VmFsdWVFeChtX2hLZXksIHZhbHVlbmFtZSwgMCwgUkVHX1NaLCAoTFBCWVRFKXBEYXRhLCAobHN0cmxlbihwRGF0YSkgKyAxKSpzaXplb2YoVENIQVIpKTsKK30KKworCitEV09SRCBDUmVnS2V5OjpnZXRCaW5hcnkoUFRTVFIgdmFsdWVuYW1lLCBQVk9JRCBwRGVmYXVsdCwgUFZPSUQgcFJlc3VsdCwgaW50IGNiU2l6ZSkKK3sKKyAgICBEV09SRCBkd1R5cGU7CisKKyAgICBpZihSZWdRdWVyeVZhbHVlRXgobV9oS2V5LCB2YWx1ZW5hbWUsIE5VTEwsICZkd1R5cGUsIChMUEJZVEUpcFJlc3VsdCwgKExQRFdPUkQpJmNiU2l6ZSkgPT0gRVJST1JfU1VDQ0VTUykgCisgICAgeworICAgICAgICBpZihkd1R5cGUgPT0gUkVHX0JJTkFSWSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjYlNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1tb3ZlKHBSZXN1bHQsIHBEZWZhdWx0LCBjYlNpemUpOworICAgIHJldHVybiBjYlNpemU7Cit9CisKKworRFdPUkQgQ1JlZ0tleTo6c2V0QmluYXJ5KFBUU1RSIHZhbHVlbmFtZSwgUFZPSUQgcERhdGEsIGludCBjYlNpemUpCit7CisgICAgUmVnU2V0VmFsdWVFeChtX2hLZXksIHZhbHVlbmFtZSwgMCwgUkVHX0JJTkFSWSwgKExQQllURSlwRGF0YSwgY2JTaXplKTsKKyAgICByZXR1cm4gY2JTaXplOworfQorCit9IC8vIG5hbWVzcGFjZSBMYW1lCmRpZmYgLS1naXQgYS9kc2hvdy9SRUcuSCBiL2RzaG93L1JFRy5ICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTFlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kc2hvdy9SRUcuSApAQCAtMCwwICsxLDkyIEBACisvKgorICogIExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKyAqICBSZWdpc3RyeSBjYWxscyBoYW5kbGluZyBjbGFzcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNYXJpZSBPcmxvdmEsIFBldGVyIEd1YmFub3YsIFZpdGFseSBJdmFub3YsIEVsZWNhcmQgTHRkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZglfX1JFR19fCisjZGVmaW5lCV9fUkVHX18KKworbmFtZXNwYWNlIExhbWUKK3sKK2NsYXNzCUNSZWdLZXkgCit7Citwcm90ZWN0ZWQ6CisJVENIQVIJbV9uYW1lW01BWF9QQVRIXTsKKwlIS0VZCW1faEtleTsKKwlIS0VZCW1faFJvb3RLZXk7CitwdWJsaWM6CisJQ1JlZ0tleSh2b2lkKTsKKwlDUmVnS2V5KEhLRVkgcm9vdEtleSwgUFRTVFIgcE5hbWUpOworCX5DUmVnS2V5KHZvaWQpOworCisJQk9PTAlPcGVuKEhLRVkgcm9vdEtleSwgUFRTVFIgcE5hbWUpOworCUJPT0wJQ3JlYXRlKEhLRVkgcm9vdEtleSwgUFRTVFIgcE5hbWUpOworCUJPT0wJT3BlbihQVFNUUiBhbiA9IE5VTEwpOworCUJPT0wJQ3JlYXRlKFBUU1RSIGFuID0gTlVMTCk7CisJQk9PTAlDbG9zZSh2b2lkKTsKKworCW9wZXJhdG9yIEhLRVkgKCkgY29uc3QgeyByZXR1cm4gbV9oS2V5OyB9OworCisJQk9PTAlnZXRGbGFnKFBUU1RSIHZhbHVlbmFtZSwgQk9PTCBiRGVmYXVsdCk7CisJdm9pZAlzZXRGbGFnKFBUU1RSIHZhbHVlbmFtZSwgQk9PTCBiVmFsdWUsIEJPT0wgYkRlZmF1bHQpOworCXZvaWQJc2V0RmxhZyhQVFNUUiB2YWx1ZW5hbWUsIEJPT0wgYlZhbHVlKTsKKwlEV09SRAlnZXREV09SRChQVFNUUiB2YWx1ZW5hbWUsIERXT1JEIGJEZWZhdWx0KTsKKwl2b2lkCXNldERXT1JEKFBUU1RSIHZhbHVlbmFtZSwgRFdPUkQgZHdWYWx1ZSk7CisJdm9pZAlzZXREV09SRChQVFNUUiB2YWx1ZW5hbWUsIERXT1JEIGR3VmFsdWUsIERXT1JEIGR3RGVmYXVsdCk7CisJRFdPUkQJZ2V0U3RyaW5nKFBUU1RSIHZhbHVlbmFtZSwgUFRTVFIgcERlZmF1bHQsIFBUU1RSIHBSZXN1bHQsIGludCBjYlNpemUpOworCXZvaWQJc2V0U3RyaW5nKFBUU1RSIHZhbHVlbmFtZSwgUFRTVFIgcERhdGEpOworCURXT1JECWdldEJpbmFyeShQVFNUUiB2YWx1ZW5hbWUsIFBWT0lEIHBEZWZhdWx0LCBQVk9JRCBwUmVzdWx0LCBpbnQgY2JTaXplKTsKKwlEV09SRAlzZXRCaW5hcnkoUFRTVFIgdmFsdWVuYW1lLCBQVk9JRCBwRGF0YSwgaW50IGNiU2l6ZSk7Cit9OworCitjbGFzcyBDUmVnRW51bUtleSAKK3sKK3B1YmxpYzoKKwlDUmVnRW51bUtleShIS0VZIGhLZXkpCisJeworCQltX2hLZXkgPSBoS2V5OworCQltX2R3SW5kZXggPSAwOworCX0KKworCX5DUmVnRW51bUtleSgpCisJeworCX0KKworCUxPTkcgTmV4dChMUFRTVFIgcHN6U3RyLCBEV09SRCBjYk5hbWUpCisJeworCQlGSUxFVElNRQlmdExhc3RXcml0ZVRpbWU7CisJCUxPTkcgbFJldCA9ICBSZWdFbnVtS2V5RXgobV9oS2V5LCBtX2R3SW5kZXgsIHBzelN0ciwgCisJCQkJCQkmY2JOYW1lLCBOVUxMLCBOVUxMLCBOVUxMLCAmZnRMYXN0V3JpdGVUaW1lKTsgCisgCisJCW1fZHdJbmRleCsrOworCQlyZXR1cm4gbFJldDsKKwl9CisKKworCXZvaWQgUmVzZXQodm9pZCkKKwl7CisJCW1fZHdJbmRleCA9IDA7CisJfQorcHJvdGVjdGVkOiAKKwlIS0VZCW1faEtleTsKKwlEV09SRAltX2R3SW5kZXg7Cit9OworfQorI2VuZGlmIC8vIF9fUkVHX18KZGlmZiAtLWdpdCBhL2RzaG93L1VJRFMuSCBiL2RzaG93L1VJRFMuSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTkyNjMxCi0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvVUlEUy5ICkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiAgTEFNRSBNUDMgZW5jb2RlciBmb3IgRGlyZWN0U2hvdworICogIENMU0lEcyBvZiB0aGUgZmlsdGVyIGFuZCBwcm9wZXJ0eSBwYWdlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNYXJpZSBPcmxvdmEsIFBldGVyIEd1YmFub3YsIFZpdGFseSBJdmFub3YsIEVsZWNhcmQgTHRkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLy8ge2I4ZDI3MDg4LWRmNWYtNGI3Yy05OGRjLTBlOTFhMTY5NjI4Nn0KK0RFRklORV9HVUlEKENMU0lEX0xBTUVEU2hvd0ZpbHRlciwKKzB4YjhkMjcwODgsIDB4ZmY1ZiwgMHg0YjdjLCAweDk4LCAweGRjLCAweDBlLCAweDkxLCAweGExLCAweDY5LCAweDYyLCAweDg2KTsKKworCisvLyB7YjhkMjcwODktZGY1Zi00YjdjLTk4ZGMtMGU5MWExNjk2Mjg2fQorREVGSU5FX0dVSUQoQ0xTSURfTEFNRURTaG93X1Byb3BlcnR5UGFnZSwKKzB4YjhkMjcwODksIDB4ZmY1ZiwgMHg0YjdjLCAweDk4LCAweGRjLCAweDBlLCAweDkxLCAweGExLCAweDY5LCAweDYyLCAweDg2KTsKKworLy8ge2I4ZDI3MDhhLWRmNWYtNGI3Yy05OGRjLTBlOTFhMTY5NjI4Nn0KK0RFRklORV9HVUlEKENMU0lEX0xBTUVEU2hvd19Qcm9wZXJ0eVBhZ2VBZHYsCisweGI4ZDI3MDhhLCAweGZmNWYsIDB4NGI3YywgMHg5OCwgMHhkYywgMHgwZSwgMHg5MSwgMHhhMSwgMHg2OSwgMHg2MiwgMHg4Nik7CisKKy8vIHtGRTY5RUREMS0wNENCLTExZDUtOTk0QS0wMDAwMjFEMUZFMkZ9CitERUZJTkVfR1VJRChDTFNJRF9MQU1FRFNob3dfQWJvdXQsCisweGZlNjllZGQxLCAweGY0Y2IsIDB4MTFkNSwgMHg5OSwgMHg0YSwgMHgwLCAweDAsIDB4MjEsIDB4ZDEsIDB4ZmUsIDB4MmYpOworCitERUZJTkVfR1VJRChNRURJQVNVQlRZUEVfTVAzLAorMHgwMDAwMDA1NSwgMHgwMDAwLCAweDAwMTAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4QUEsIDB4MDAsIDB4MzgsIDB4OUIsIDB4NzEpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RzaG93L2Fib3V0cHJwLmNwcCBiL2RzaG93L2Fib3V0cHJwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODJjYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvYWJvdXRwcnAuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogIExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKyAqICBBYm91dCBwcm9wZXJ0eSBwYWdlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1hcmllIE9ybG92YSwgUGV0ZXIgR3ViYW5vdiwgVml0YWx5IEl2YW5vdiwgRWxlY2FyZCBMdGQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0cmVhbXMuaD4KKyNpbmNsdWRlIDxvbGVjdGwuaD4KKyNpbmNsdWRlIDxjb21tY3RybC5oPgorI2luY2x1ZGUgImlhdWRpb3Byb3BzLmgiCisjaW5jbHVkZSAiYWJvdXRwcnAuaCIKKyNpbmNsdWRlICJtcGVnYWMuaCIKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorI2luY2x1ZGUgIlJlZy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENNQUVBYm91dAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0NIQVIgbHBzelRleHRbXSA9ICAgIlRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBcclxuIgorICAgICAgICAgICAgICAgICAgICAiYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBcclxuIgorICAgICAgICAgICAgICAgICAgICAiTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgImFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO1xyXG4iCisgICAgICAgICAgICAgICAgICAgICJlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLFxyXG4iCisgICAgICAgICAgICAgICAgICAgICJvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4iCisgICAgICAgICAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgICAgICAgICAiVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXHJcbiIgCisgICAgICAgICAgICAgICAgICAgICJidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgIkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBcclxuIgorICAgICAgICAgICAgICAgICAgICAiTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgICJZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlVcclxuIgorICAgICAgICAgICAgICAgICAgICAiTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgImFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZVxyXG4iCisgICAgICAgICAgICAgICAgICAgICJGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgIkluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCxcclxuIgorICAgICAgICAgICAgICAgICAgICAiQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXHJcbiI7CisKKy8vCisvLyBDcmVhdGVJbnN0YW5jZQorLy8KK0NVbmtub3duICogV0lOQVBJIENNQUVBYm91dDo6Q3JlYXRlSW5zdGFuY2UoTFBVTktOT1dOIGxwdW5rLCBIUkVTVUxUICpwaHIpCit7CisgICAgQ1Vua25vd24gKnB1bmsgPSBuZXcgQ01BRUFib3V0KGxwdW5rLCBwaHIpOworICAgIGlmIChwdW5rID09IE5VTEwpIHsKKyAgICAgICAgKnBociA9IEVfT1VUT0ZNRU1PUlk7CisgICAgfQorCisgICAgcmV0dXJuIHB1bms7Cit9CisKKworLy8KKy8vIENvbnN0cnVjdG9yCisvLworLy8gQ3JlYWV0ZSBhIFByb3BlcnR5IHBhZ2Ugb2JqZWN0IGZvciB0aGUgTVBFRyBvcHRpb25zCitDTUFFQWJvdXQ6OkNNQUVBYm91dChMUFVOS05PV04gbHB1bmssIEhSRVNVTFQgKnBocikKKyAgICA6IENCYXNlUHJvcGVydHlQYWdlKE5BTUUoIkFib3V0IExBTUUgQWluJ3QgTVAzIEVuY29kZXIiKSwgbHB1bmssCisgICAgICAgIElERF9BQk9VVCxJRFNfQUJPVVQpCisgICAgLCBtX2ZXaW5kb3dJbmFjdGl2ZShUUlVFKQoreworICAgIEFTU0VSVChwaHIpOworCisvLyAgICBJbml0Q29tbW9uQ29udHJvbHMoKTsKK30KKworLy8KKy8vIE9uQ29ubmVjdAorLy8KKy8vIEdpdmUgdXMgdGhlIGZpbHRlciB0byBjb21tdW5pY2F0ZSB3aXRoCisKK0hSRVNVTFQgQ01BRUFib3V0OjpPbkNvbm5lY3QoSVVua25vd24gKnBVbmtub3duKQoreworICAgIHJldHVybiBOT0VSUk9SOworfQorCisKKy8vCisvLyBPbkRpc2Nvbm5lY3QKKy8vCisvLyBSZWxlYXNlIHRoZSBpbnRlcmZhY2UKKworSFJFU1VMVCBDTUFFQWJvdXQ6Ok9uRGlzY29ubmVjdCgpCit7CisgICAgLy8gUmVsZWFzZSB0aGUgaW50ZXJmYWNlCisKKyAgICByZXR1cm4gTk9FUlJPUjsKK30KKworCisvLworLy8gT25BY3RpdmF0ZQorLy8KKy8vIENhbGxlZCBvbiBkaWFsb2cgY3JlYXRpb24KKworSFJFU1VMVCBDTUFFQWJvdXQ6Ok9uQWN0aXZhdGUodm9pZCkKK3sKKyAgICAvLyBBZGQgdGV4dCB0byB0aGUgd2luZG93LgorICAgIG1fZldpbmRvd0luYWN0aXZlID0gRkFMU0U7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKG1faHduZCwgSURDX0xBTUVfTEEsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pbHBzelRleHQpOworCisKKyAgICBDSEFSIHN0cmJ1ZlsyNTBdOworI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDk5NSkKKyAgICBzcHJpbnRmKHN0cmJ1ZiwgIkxBTUUgRW5jb2RlciBWZXJzaW9uICVzIiwgZ2V0X2xhbWVfdmVyc2lvbigpKTsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UobV9od25kLCBJRENfTEFNRV9WRVIsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pc3RyYnVmKTsKKworICAgIHNwcmludGYoc3RyYnVmLCAiTEFNRSBQcm9qZWN0IEhvbWVwYWdlOiAlcyIsIGdldF9sYW1lX3VybCgpKTsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UobV9od25kLCBJRENfTEFNRV9VUkwsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pc3RyYnVmKTsKKyNwcmFnbWEgd2FybmluZyhwb3ApCisgICAgcmV0dXJuIE5PRVJST1I7Cit9CisKKy8vCisvLyBPbkRlYWN0aXZhdGUKKy8vCisvLyBDYWxsZWQgb24gZGlhbG9nIGRlc3RydWN0aW9uCisKK0hSRVNVTFQgQ01BRUFib3V0OjpPbkRlYWN0aXZhdGUodm9pZCkKK3sKKyAgICBtX2ZXaW5kb3dJbmFjdGl2ZSA9IFRSVUU7CisgICAgcmV0dXJuIE5PRVJST1I7Cit9CisKKworLy8KKy8vIE9uQXBwbHlDaGFuZ2VzCisvLworLy8gVXNlciBwcmVzc2VkIHRoZSBBcHBseSBidXR0b24sIHJlbWVtYmVyIHRoZSBjdXJyZW50IHNldHRpbmdzCisKK0hSRVNVTFQgQ01BRUFib3V0OjpPbkFwcGx5Q2hhbmdlcyh2b2lkKQoreworICAgIHJldHVybiBOT0VSUk9SOworfQorCisKKy8vCisvLyBPblJlY2VpdmVNZXNzYWdlcworLy8KKy8vIEhhbmRsZXMgdGhlIG1lc3NhZ2VzIGZvciBvdXIgcHJvcGVydHkgd2luZG93CisKK0JPT0wgQ01BRUFib3V0OjpPblJlY2VpdmVNZXNzYWdlKCBIV05EIGh3bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBVSU5UIHVNc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBXUEFSQU0gd1BhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBpZiAobV9mV2luZG93SW5hY3RpdmUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAodU1zZykKKyAgICB7CisgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8KKy8vIFNldERpcnR5CisvLworLy8gbm90aWZpZXMgdGhlIHByb3BlcnR5IHBhZ2Ugc2l0ZSBvZiBjaGFuZ2VzCisKK3ZvaWQgQ01BRUFib3V0OjpTZXREaXJ0eSgpCit7CisgICAgbV9iRGlydHkgPSBUUlVFOworCisgICAgaWYgKG1fcFBhZ2VTaXRlKQorICAgICAgICBtX3BQYWdlU2l0ZS0+T25TdGF0dXNDaGFuZ2UoUFJPUFBBR0VTVEFUVVNfRElSVFkpOworfQorCmRpZmYgLS1naXQgYS9kc2hvdy9hYm91dHBycC5oIGIvZHNob3cvYWJvdXRwcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRiNTBlCi0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvYWJvdXRwcnAuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogIExBTUUgTVAzIGVuY29kZXIgZm9yIERpcmVjdFNob3cKKyAqICBBYm91dCBwcm9wZXJ0eSBwYWdlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1hcmllIE9ybG92YSwgUGV0ZXIgR3ViYW5vdiwgVml0YWx5IEl2YW5vdiwgRWxlY2FyZCBMdGQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCitjbGFzcyBDTUFFQWJvdXQ6IHB1YmxpYyBDQmFzZVByb3BlcnR5UGFnZQoreworcHVibGljOgorCisgICAgQ01BRUFib3V0KExQVU5LTk9XTiBscFVuaywgSFJFU1VMVCAqcGhyKTsKKyAgICBzdGF0aWMgQ1Vua25vd24gKiBXSU5BUEkgQ3JlYXRlSW5zdGFuY2UoTFBVTktOT1dOIGxwdW5rLCBIUkVTVUxUICpwaHIpOworCisgICAgSFJFU1VMVCBPbkFjdGl2YXRlKCk7CisgICAgSFJFU1VMVCBPbkNvbm5lY3QoSVVua25vd24gKnBVbmtub3duKTsKKyAgICBIUkVTVUxUIE9uRGlzY29ubmVjdCgpOworICAgIEhSRVNVTFQgT25EZWFjdGl2YXRlKCk7CisgICAgSFJFU1VMVCBPbkFwcGx5Q2hhbmdlcygpOworICAgIEJPT0wgT25SZWNlaXZlTWVzc2FnZShIV05EIGh3bmQsVUlOVCB1TXNnLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSk7CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICBTZXREaXJ0eSh2b2lkKTsKKworICAgIEJPT0wgICAgbV9mV2luZG93SW5hY3RpdmU7Cit9OwpkaWZmIC0tZ2l0IGEvZHNob3cvZHNob3cuZHNwIGIvZHNob3cvZHNob3cuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGQxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kc2hvdy9kc2hvdy5kc3AKQEAgLTAsMCArMSwyMDkgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iTEFNRSBEU2hvdyIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIE5JQ0hUIEJFQVJCRUlURU4gKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyDQorDQorQ0ZHPUxBTUUgRFNob3cgLSBXaW4zMiBSZWxlYXNlDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJkc2hvdy5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImRzaG93Lm1hayIgQ0ZHPSJMQU1FIERTaG93IC0gV2luMzIgUmVsZWFzZSINCishTUVTU0FHRSANCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJMQU1FIERTaG93IC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgIkxBTUUgRFNob3cgLSBXaW4zMiBEZWJ1ZyIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorTVRMPW1pZGwuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkxBTUUgRFNob3cgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXG9ialxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZVxkc2hvdyINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMQ0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9HeiAvTUQgL1czIC9HWCAvTzIgL0kgIi4uL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJJTkNfT0xFMiIgL0QgIlNUUklDVCIgL0QgV0lOVkVSPTB4MDQwMCAvRCBfWDg2Xz0xIC9EICJfV0lORE9XUyIgL0QgIldJTjMyIiAvRCAiU1REQ19IRUFERVJTIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvRnIgL1lYDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzINCisjIEFERCBNVEwgL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgU1VCVFJBQ1QgTVRMIC9ub2xvZ28NCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBTVUJUUkFDVCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGxpYm1wM2xhbWUubGliIC5cc3RybWJhc2UubGliIG1zdmNydC5saWIgbGliY210LmxpYiB2ZnczMi5saWIgd2lubW0ubGliIGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdmVyc2lvbi5saWIgbGFyZ2VpbnQubGliIENvbWRsZzMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBjb21jdGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBxdWFydHoubGliIG1lYXN1cmUubGliIC9ub2xvZ28gL2Jhc2U6IjB4MWM0MDAwMDAiIC92ZXJzaW9uOjAuMyAvZW50cnk6IkRsbEVudHJ5UG9pbnRAMTIiIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2IC9ub2RlZmF1bHRsaWIgL291dDoiLi5cb3V0cHV0XFJlbGVhc2VcbGFtZS5heCIgL2xpYnBhdGg6Ii4uXG91dHB1dFxSZWxlYXNlIiAvb3B0Ok5PV0lOOTgNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiTEFNRSBEU2hvdyAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb2JqXERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcRGVidWdcZHNob3ciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDENCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MNCisjIEFERCBDUFAgL25vbG9nbyAvR3ogL01EZCAvVzMgL0dYIC9aSSAvT2QgL0kgIi4uXGluY2x1ZGUiIC9EICJERUJVRyIgL0QgIklOQ19PTEUyIiAvRCBXSU5WRVI9MHgwNDAwIC9EIF9YODZfPTEgL0QgIlNUUklDVCIgL0QgIl9XSU5ET1dTIiAvRCAiV0lOMzIiIC9EICJTVERDX0hFQURFUlMiIC9ZWCAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvRnINCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIgbGlibXAzbGFtZS5saWIgLlxzdHJtYmFzRC5saWIgbXN2Y3J0ZC5saWIgbGliY210LmxpYiB2ZnczMi5saWIgd2lubW0ubGliIGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdmVyc2lvbi5saWIgbGFyZ2VpbnQubGliIENvbWRsZzMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBjb21jdGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBxdWFydHoubGliIG1lYXN1cmUubGliIC9ub2xvZ28gL2Jhc2U6IjB4MWM0MDAwMDAiIC9lbnRyeToiRGxsRW50cnlQb2ludEAxMiIgL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYiAvb3V0OiIuLlxvdXRwdXRcRGVidWdcbGFtZS5heCIgL2xpYnBhdGg6Ii4uXG91dHB1dFxEZWJ1ZyIgL29wdDpOT1dJTjk4DQorIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lIC9pbmNyZW1lbnRhbDpubw0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiTEFNRSBEU2hvdyAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJMQU1FIERTaG93IC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGFib3V0cHJwLmNwcA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkxBTUUgRFNob3cgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZSINCisjIEFERCBDUFAgL0ZSDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkxBTUUgRFNob3cgLSBXaW4zMiBEZWJ1ZyINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRW5jb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxNcGVnYWMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cTXBlZ2FjLmRlZg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFByb3BlcnR5LnJjDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUHJvcFBhZ2UuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUHJvcFBhZ2VfYWR2LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFJFRy5DUFANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYWJvdXRwcnAuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEVuY29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGlhdWRpb3Byb3BzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxNcGVnYWMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFByb3BQYWdlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxQcm9wUGFnZV9hZHYuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzb3VyY2UuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHVpZHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGVsb2dvLmljbw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVcbGFtZS5oDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cUkVBRE1FDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU1RSTUJBU0UubGliDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPSIuLlxvdXRwdXRcbGlibXAzbGFtZS1keW5hbWljLmxpYiINCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9kc2hvdy9kc2hvdy5kc3cgYi9kc2hvdy9kc2hvdy5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyMDdmOQotLS0gL2Rldi9udWxsCisrKyBiL2RzaG93L2RzaG93LmRzdwpAQCAtMCwwICsxLDU5IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJMQU1FIERTaG93Ij0uXGRzaG93LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBsaWJtcDNsYW1lDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbXBnbGliDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImxpYm1wM2xhbWUiPS4uXGxpYm1wM2xhbWVcbGlibXAzbGFtZV92YzYuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJtcGdsaWIiPS4uXG1wZ2xpYlxtcGdsaWJfdmM2LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9kc2hvdy9lbG9nby5pY28gYi9kc2hvdy9lbG9nby5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhZTczZAotLS0gL2Rldi9udWxsCisrKyBiL2RzaG93L2Vsb2dvLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kc2hvdy9pYXVkaW9wcm9wcy5oIGIvZHNob3cvaWF1ZGlvcHJvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFmNWUwCi0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvaWF1ZGlvcHJvcHMuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqICBMQU1FIE1QMyBlbmNvZGVyIGZvciBEaXJlY3RTaG93CisgKiAgSW50ZXJmYWNlIGRlZmluaXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWFyaWUgT3Jsb3ZhLCBQZXRlciBHdWJhbm92LCBWaXRhbHkgSXZhbm92LCBFbGVjYXJkIEx0ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8vIEEgY3VzdG9tIGludGVyZmFjZSB0byBhbGxvdyB0aGUgdXNlciB0byBtb2RpZnkgYXVkaW8KKy8vIGVuY29kZXIgcHJvcGVydGllcworI2lmbmRlZiBfX0lBVURJT1BST1BFUlRJRVNfXworI2RlZmluZSBfX0lBVURJT1BST1BFUlRJRVNfXworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorICAgIC8vIHtjYTdlOWVmMC0xY2JlLTExZDMtOGQyOS0wMGEwYzk0YmJmZWV9CisgICAgREVGSU5FX0dVSUQoSUlEX0lBdWRpb0VuY29kZXJQcm9wZXJ0aWVzLCAKKyAgICAweGNhN2U5ZWYwLCAweDFjYmUsIDB4MTFkMywgMHg4ZCwgMHgyOSwgMHgwMCwgMHhhMCwgMHhjOSwgMHg0YiwgMHhiZiwgMHhlZSk7CisgICAgLy8KKyAgICAvLyBDb25maWd1cmluZyBNUEVHIGF1ZGlvIGVuY29kZXIgcGFyYW1ldGVycyB3aXRoIHVuc3BlY2lmaWVkCisgICAgLy8gaW5wdXQgc3RyZWFtIHR5cGUgbWF5IGxlYWQgdG8gbWlzYmVoYXZpb3VyIGFuZCBjb25mdXNpbmcKKyAgICAvLyByZXN1bHRzLiBJbiBtb3N0IGNhc2VzIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyB3aWxsIGJlCisgICAgLy8gb3ZlcnJpZGRlbiBieSBkZWZhdWx0cyBmb3IgdGhlIGlucHV0IG1lZGlhIHR5cGUuCisgICAgLy8gVG8gYXJjaGl2ZSBwcm9wZXIgcmVzdWx0cyB1c2UgdGhpcyBpbnRlcmZhY2Ugb24gdGhlCisgICAgLy8gYXVkaW8gZW5jb2RlciBmaWx0ZXIgd2l0aCBpbnB1dCBwaW4gY29ubmVjdGVkIHRvIHRoZSB2YWxpZAorICAgIC8vIHNvdXJjZS4KKyAgICAvLworICAgIERFQ0xBUkVfSU5URVJGQUNFXyhJQXVkaW9FbmNvZGVyUHJvcGVydGllcywgSVVua25vd24pCisgICAgeworICAgICAgICAvLyBJcyBQRVMgb3V0cHV0IGVuYWJsZWQ/IFJldHVybiBUUlVFIG9yIEZBTFNFCisgICAgICAgIFNURE1FVEhPRChnZXRfUEVTT3V0cHV0RW5hYmxlZCkgKFRISVNfCisgICAgICAgICAgICBEV09SRCAqZHdFbmFibGVkCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gRW5hYmxlL2Rpc2FibGUgUEVTIG91dHB1dAorICAgICAgICBTVERNRVRIT0Qoc2V0X1BFU091dHB1dEVuYWJsZWQpIChUSElTXworICAgICAgICAgICAgRFdPUkQgZHdFbmFibGVkCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gR2V0IHRhcmdldCBjb21wcmVzc2lvbiBiaXRyYXRlIGluIEtiaXRzL3MKKyAgICAgICAgU1RETUVUSE9EKGdldF9CaXRyYXRlKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd0JpdHJhdGUKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBTZXQgdGFyZ2V0IGNvbXByZXNzaW9uIGJpdHJhdGUgaW4gS2JpdHMvcworICAgICAgICAvLyBOb3QgYWxsIG51bWJlcnMgYXZhaWxhYmxlISBTZWUgc3BlYyBmb3IgZGV0YWlscyEKKyAgICAgICAgU1RETUVUSE9EKHNldF9CaXRyYXRlKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3Qml0cmF0ZQorICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIEdldCB2YXJpYWJsZSBiaXRyYXRlIGZsYWcKKyAgICAgICAgU1RETUVUSE9EKGdldF9WYXJpYWJsZSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCAqZHdWYXJpYWJsZQorICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIFNldCB2YXJpYWJsZSBiaXRyYXRlIGZsYWcKKyAgICAgICAgU1RETUVUSE9EKHNldF9WYXJpYWJsZSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd1ZhcmlhYmxlCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gR2V0IHZhcmlhYmxlIGJpdHJhdGUgaW4gS2JpdHMvcworICAgICAgICBTVERNRVRIT0QoZ2V0X1ZhcmlhYmxlTWluKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd21pbgorICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIFNldCB2YXJpYWJsZSBiaXRyYXRlIGluIEtiaXRzL3MKKyAgICAgICAgLy8gTm90IGFsbCBudW1iZXJzIGF2YWlsYWJsZSEgU2VlIHNwZWMgZm9yIGRldGFpbHMhCisgICAgICAgIFNURE1FVEhPRChzZXRfVmFyaWFibGVNaW4pIChUSElTXworICAgICAgICAgICAgRFdPUkQgZHdtaW4KKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBHZXQgdmFyaWFibGUgYml0cmF0ZSBpbiBLYml0cy9zCisgICAgICAgIFNURE1FVEhPRChnZXRfVmFyaWFibGVNYXgpIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3bWF4CisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gU2V0IHZhcmlhYmxlIGJpdHJhdGUgaW4gS2JpdHMvcworICAgICAgICAvLyBOb3QgYWxsIG51bWJlcnMgYXZhaWxhYmxlISBTZWUgc3BlYyBmb3IgZGV0YWlscyEKKyAgICAgICAgU1RETUVUSE9EKHNldF9WYXJpYWJsZU1heCkgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd21heAorICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIEdldCBjb21wcmVzc2lvbiBxdWFsaXR5CisgICAgICAgIFNURE1FVEhPRChnZXRfUXVhbGl0eSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCAqZHdRdWFsaXR5CisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gU2V0IGNvbXByZXNzaW9uIHF1YWxpdHkKKyAgICAgICAgLy8gTm90IGFsbCBudW1iZXJzIGF2YWlsYWJsZSEgU2VlIHNwZWMgZm9yIGRldGFpbHMhCisgICAgICAgIFNURE1FVEhPRChzZXRfUXVhbGl0eSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd1F1YWxpdHkKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBHZXQgVkJSIHF1YWxpdHkKKyAgICAgICAgU1RETUVUSE9EKGdldF9WYXJpYWJsZVEpIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3VkJScQorICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIFNldCBWQlIgcXVhbGl0eQorICAgICAgICAvLyBOb3QgYWxsIG51bWJlcnMgYXZhaWxhYmxlISBTZWUgc3BlYyBmb3IgZGV0YWlscyEKKyAgICAgICAgU1RETUVUSE9EKHNldF9WYXJpYWJsZVEpIChUSElTXworICAgICAgICAgICAgRFdPUkQgZHdWQlJxCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gR2V0IHNvdXJjZSBzYW1wbGUgcmF0ZS4gUmV0dXJuIEVfRkFJTCBpZiBpbnB1dCBwaW4KKyAgICAgICAgLy8gaW4gbm90IGNvbm5lY3RlZC4KKyAgICAgICAgU1RETUVUSE9EKGdldF9Tb3VyY2VTYW1wbGVSYXRlKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd1NhbXBsZVJhdGUKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBHZXQgc291cmNlIG51bWJlciBvZiBjaGFubmVscy4gUmV0dXJuIEVfRkFJTCBpZgorICAgICAgICAvLyBpbnB1dCBwaW4gaXMgbm90IGNvbm5lY3RlZC4KKyAgICAgICAgU1RETUVUSE9EKGdldF9Tb3VyY2VDaGFubmVscykgKFRISVNfCisgICAgICAgICAgICBEV09SRCAqZHdDaGFubmVscworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIEdldCBzYW1wbGUgcmF0ZSBmb3IgY29tcHJlc3NlZCBhdWRpbyBiaXRzdHJlYW0KKyAgICAgICAgU1RETUVUSE9EKGdldF9TYW1wbGVSYXRlKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd1NhbXBsZVJhdGUKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBTZXQgc2FtcGxlIHJhdGUuIFNlZSBnZW5hdWRpbyBzcGVjIGZvciBkZXRhaWxzCisgICAgICAgIFNURE1FVEhPRChzZXRfU2FtcGxlUmF0ZSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd1NhbXBsZVJhdGUKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBHZXQgY2hhbm5lbCBtb2RlLiBTZWUgZ2VuYXVkaW8uaCBmb3IgZGV0YWlscworICAgICAgICBTVERNRVRIT0QoZ2V0X0NoYW5uZWxNb2RlKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd0NoYW5uZWxNb2RlCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gU2V0IGNoYW5uZWwgbW9kZQorICAgICAgICBTVERNRVRIT0Qoc2V0X0NoYW5uZWxNb2RlKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3Q2hhbm5lbE1vZGUKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBJcyBDUkMgZW5hYmxlZD8KKyAgICAgICAgU1RETUVUSE9EKGdldF9DUkNGbGFnKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd0ZsYWcKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBFbmFibGUvZGlzYWJsZSBDUkMKKyAgICAgICAgU1RETUVUSE9EKHNldF9DUkNGbGFnKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIEZvcmNlIG1vbm8KKyAgICAgICAgU1RETUVUSE9EKGdldF9Gb3JjZU1vbm8pIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIEZvcmNlIG1vbm8KKyAgICAgICAgU1RETUVUSE9EKHNldF9Gb3JjZU1vbm8pIChUSElTXworICAgICAgICAgICAgRFdPUkQgZHdGbGFnCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gU2V0IGR1cmF0aW9uCisgICAgICAgIFNURE1FVEhPRChnZXRfU2V0RHVyYXRpb24pIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIFNldCBkdXJhdGlvbgorICAgICAgICBTVERNRVRIT0Qoc2V0X1NldER1cmF0aW9uKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIENvbnRyb2wgJ29yaWdpbmFsJyBmbGFnCisgICAgICAgIFNURE1FVEhPRChnZXRfT3JpZ2luYWxGbGFnKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd0ZsYWcKKyAgICAgICAgKSBQVVJFOworICAgICAgICBTVERNRVRIT0Qoc2V0X09yaWdpbmFsRmxhZykgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd0ZsYWcKKyAgICAgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gQ29udHJvbCAnY29weXJpZ2h0JyBmbGFnCisgICAgICAgIFNURE1FVEhPRChnZXRfQ29weXJpZ2h0RmxhZykgKFRISVNfCisgICAgICAgICAgICBEV09SRCAqZHdGbGFnCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgU1RETUVUSE9EKHNldF9Db3B5cmlnaHRGbGFnKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIENvbnRyb2wgJ0VuZm9yY2UgVkJSIE1pbmltdW0gYml0cmF0ZScgZmxhZworICAgICAgICBTVERNRVRIT0QoZ2V0X0VuZm9yY2VWQlJtaW4pIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIFNURE1FVEhPRChzZXRfRW5mb3JjZVZCUm1pbikgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd0ZsYWcKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBDb250cm9sICdWb2ljZScgZmxhZworICAgICAgICBTVERNRVRIT0QoZ2V0X1ZvaWNlTW9kZSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCAqZHdGbGFnCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgU1RETUVUSE9EKHNldF9Wb2ljZU1vZGUpIChUSElTXworICAgICAgICAgICAgRFdPUkQgZHdGbGFnCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgLy8gQ29udHJvbCAnS2VlcCBBbGwgRnJlcXVlbmNpZXMnIGZsYWcKKyAgICAgICAgU1RETUVUSE9EKGdldF9LZWVwQWxsRnJlcSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCAqZHdGbGFnCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgU1RETUVUSE9EKHNldF9LZWVwQWxsRnJlcSkgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd0ZsYWcKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBDb250cm9sICdTdHJpY3QgSVNPIGNvbXBsaWVuY2UnIGZsYWcKKyAgICAgICAgU1RETUVUSE9EKGdldF9TdHJpY3RJU08pIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIFNURE1FVEhPRChzZXRfU3RyaWN0SVNPKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIENvbnRyb2wgJ0Rpc2FibGUgc2hvcnQgYmxvY2snIGZsYWcKKyAgICAgICAgU1RETUVUSE9EKGdldF9Ob1Nob3J0QmxvY2spIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3RGlzYWJsZQorICAgICAgICApIFBVUkU7CisgICAgICAgIFNURE1FVEhPRChzZXRfTm9TaG9ydEJsb2NrKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3RGlzYWJsZQorICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIENvbnRyb2wgJ1hpbmcgVkJSIFRhZycgZmxhZworICAgICAgICBTVERNRVRIT0QoZ2V0X1hpbmdUYWcpIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3WGluZ1RhZworICAgICAgICApIFBVUkU7CisgICAgICAgIFNURE1FVEhPRChzZXRfWGluZ1RhZykgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd1hpbmdUYWcKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBDb250cm9sICdGb3JjZWQgbWlkLyBzaWRlIHN0ZXJlbycgZmxhZworICAgICAgICBTVERNRVRIT0QoZ2V0X0ZvcmNlTVMpIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIFNURE1FVEhPRChzZXRfRm9yY2VNUykgKFRISVNfCisgICAgICAgICAgICBEV09SRCBkd0ZsYWcKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBDb250cm9sICdNb2RlRml4ZWQnIGZsYWcKKyAgICAgICAgU1RETUVUSE9EKGdldF9Nb2RlRml4ZWQpIChUSElTXworICAgICAgICAgICAgRFdPUkQgKmR3RmxhZworICAgICAgICApIFBVUkU7CisgICAgICAgIFNURE1FVEhPRChzZXRfTW9kZUZpeGVkKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEIGR3RmxhZworICAgICAgICApIFBVUkU7CisKKyAgICAgICAgLy9SZWNlaXZlIHRoZSBibG9jayBvZiBlbmNvZGVyIAorICAgICAgICAvL2NvbmZpZ3VyYXRpb24gcGFyYW1ldHJlcworICAgICAgICBTVERNRVRIT0QoZ2V0X1BhcmFtZXRlckJsb2NrU2l6ZSkgKFRISVNfCisgICAgICAgICAgICBCWVRFICpwY0Jsb2NrLCBEV09SRCAqcGR3U2l6ZQorICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIFNldCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldHJlcworICAgICAgICBTVERNRVRIT0Qoc2V0X1BhcmFtZXRlckJsb2NrU2l6ZSkgKFRISVNfCisgICAgICAgICAgICBCWVRFICpwY0Jsb2NrLCBEV09SRCBkd1NpemUKKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBTZXQgZGVmYXVsdCBhdWRpbyBlbmNvZGVyIHBhcmFtZXRlcnMgZGVwZW5kaW5nCisgICAgICAgIC8vIG9uIGN1cnJlbnQgaW5wdXQgc3RyZWFtIHR5cGUKKyAgICAgICAgU1RETUVUSE9EKERlZmF1bHRBdWRpb0VuY29kZXJQcm9wZXJ0aWVzKSAoVEhJU18KKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBCeSBkZWZhdWx0IHRoZSBtb2RpZmllZCBwcm9wZXJ0aWVzIGFyZSBub3Qgc2F2ZWQgdG8KKyAgICAgICAgLy8gdGhlIHJlZ2lzdHJ5IGltbWVkaWF0ZWx5LCBzbyB0aGUgZmlsdGVyIG5lZWRzIHRvIGJlCisgICAgICAgIC8vIGZvcmNlZCB0byBkbyB0aGlzLiBPbWl0dGluZyB0aGlzIHN0ZXAgbWF5IGxlYWQgdG8KKyAgICAgICAgLy8gbWlzYmVoYXZpb3IgYW5kIGNvbmZ1c2luZyByZXN1bHRzLgorICAgICAgICBTVERNRVRIT0QoTG9hZEF1ZGlvRW5jb2RlclByb3BlcnRpZXNGcm9tUmVnaXN0cnkpIChUSElTXworICAgICAgICApIFBVUkU7CisgICAgICAgIFNURE1FVEhPRChTYXZlQXVkaW9FbmNvZGVyUHJvcGVydGllc1RvUmVnaXN0cnkpIChUSElTXworICAgICAgICApIFBVUkU7CisgICAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBmaWx0ZXIgY2FuIGJlIGNvbmZpZ3VyZWQuIElmIHRoaXMKKyAgICAgICAgLy8gZnVuY3Rpb24gcmV0dXJucyBFX0ZBSUwgdGhlbiBpbnB1dCBmb3JtYXQgaGFzbid0IGJlZW4KKyAgICAgICAgLy8gc3BlY2lmaWVkIGFuZCBmaWx0ZXIgYmVoYXZpb3IgaXMgdW5wcmVkaWN0YWJsZS4gSWYgU19PSywKKyAgICAgICAgLy8gdGhlIGZpbHRlciBjb3VsZCBiZSBjb25maWd1cmVkIHdpdGggY29ycmVjdCB2YWx1ZXMuCisgICAgICAgIFNURE1FVEhPRChJbnB1dFR5cGVEZWZpbmVkKSAoVEhJU18KKyAgICAgICAgKSBQVVJFOworICAgICAgICAvLyBSZWNvbm5lY3RzIG91dHB1dCBwaW4gKGNydWNpYWwgZm9yIEZyYXVuaG9mZXIgTVBFRyBMYXllci0zIERlY29kZXIpCisgICAgICAgIFNURE1FVEhPRChBcHBseUNoYW5nZXMpIChUSElTXworICAgICAgICApIFBVUkU7CisKKyAgICAgICAgLy8gQWxsb3cgb3V0cHV0IHNhbXBsZSBvdmVybGFwIGluIHRlcm1zIG9mIERpcmVjdFNob3cKKyAgICAgICAgLy8gdGltZXN0YW1wcyAoaS5lLiB3aGVuIHNhbXBsZSdzIHN0YXJ0IHRpbWUgaXMgbGVzcworICAgICAgICAvLyB0aGFuIHByZXZpb3VzIHNhbXBsZSdzIGVuZCB0aW1lKS4gQXZpIE11eCBkb2Vzbid0IGxpa2UgdGhpcworICAgICAgICBTVERNRVRIT0Qoc2V0X1NhbXBsZU92ZXJsYXApIChUSElTXworICAgICAgICAgICAgRFdPUkQgZHdGbGFnCisgICAgICAgICkgUFVSRTsKKyAgICAgICAgU1RETUVUSE9EKGdldF9TYW1wbGVPdmVybGFwKSAoVEhJU18KKyAgICAgICAgICAgIERXT1JEICpkd0ZsYWcKKyAgICAgICAgKSBQVVJFOworICAgIH07CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8vIF9fSUFVRElPUFJPUEVSVElFU19fCisKKworCmRpZmYgLS1naXQgYS9kc2hvdy9yZXNvdXJjZS5oIGIvZHNob3cvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM0MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHNob3cvcmVzb3VyY2UuaApAQCAtMCwwICsxLDU5IEBACisvL3t7Tk9fREVQRU5ERU5DSUVTfX0KKy8vIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGUuCisvLyBVc2VkIGJ5IFByb3BlcnR5LnJjCisvLworI2RlZmluZSBJRFNfQVVESU9fUFJPUFNfVElUTEUgICAgICAgICAgIDMKKyNkZWZpbmUgSURTX0FVRElPX0FEVkFOQ0VEX1RJVExFICAgICAgICA0CisjZGVmaW5lIElEU19BQk9VVCAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJRERfQVVESU9FTkNQUk9QUyAgICAgICAgICAgICAgIDEwMAorI2RlZmluZSBJRERfQURWUFJPUFMgICAgICAgICAgICAgICAgICAgIDEwMgorI2RlZmluZSBJRERfQUJPVVQgICAgICAgICAgICAgICAgICAgICAgIDEwNQorI2RlZmluZSBJRElfSUNPTjIgICAgICAgICAgICAgICAgICAgICAgIDEwNgorI2RlZmluZSBJRENfQ09NQk9fQ0JSICAgICAgICAgICAgICAgICAgIDEwMDQKKyNkZWZpbmUgSURDX0NIRUNLX0NPUFlSSUdIVCAgICAgICAgICAgICAxMDA3CisjZGVmaW5lIElEQ19DSEVDS19PUklHSU5BTCAgICAgICAgICAgICAgMTAwOAorI2RlZmluZSBJRENfQ0hFQ0tfQ1JDICAgICAgICAgICAgICAgICAgIDEwMDkKKyNkZWZpbmUgSURDX0NIRUNLX1BFUyAgICAgICAgICAgICAgICAgICAxMDEwCisjZGVmaW5lIElEQ19DT01CT19WQlJNSU4gICAgICAgICAgICAgICAgMTAxMworI2RlZmluZSBJRENfVElUTEVfVEVYVCAgICAgICAgICAgICAgICAgIDEwMTYKKyNkZWZpbmUgSURDX1JBRElPX0NCUiAgICAgICAgICAgICAgICAgICAxMDE5CisjZGVmaW5lIElEQ19SQURJT19WQlIgICAgICAgICAgICAgICAgICAgMTAyMAorI2RlZmluZSBJRENfU0xJREVSX1FVQUxJVFkgICAgICAgICAgICAgIDEwMjEKKyNkZWZpbmUgSURDX1RFWFRfUVVBTElUWSAgICAgICAgICAgICAgICAxMDIzCisjZGVmaW5lIElEQ19DT01CT19WQlJNQVggICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBJRENfQ09NQk9fU0FNUExFX1JBVEUgICAgICAgICAgIDEwMjUKKyNkZWZpbmUgSURDX0NPTUJPX1ZCUnEgICAgICAgICAgICAgICAgICAxMDI2CisjZGVmaW5lIElEQ19SQURJT19TVEVSRU8gICAgICAgICAgICAgICAgMTAyNworI2RlZmluZSBJRENfUkFESU9fSlNURVJFTyAgICAgICAgICAgICAgIDEwMjgKKyNkZWZpbmUgSURDX1JBRElPX0RVQUwgICAgICAgICAgICAgICAgICAxMDI5CisjZGVmaW5lIElEQ19SQURJT19NT05PICAgICAgICAgICAgICAgICAgMTAzMAorI2RlZmluZSBJRENfQ0hFQ0tfRU5GT1JDRV9NSU4gICAgICAgICAgIDEwMzEKKyNkZWZpbmUgSURDX0NIRUNLX1ZPSUNFICAgICAgICAgICAgICAgICAxMDMyCisjZGVmaW5lIElEQ19DSEVDS19LRUVQX0FMTF9GUkVRICAgICAgICAgMTAzMworI2RlZmluZSBJRENfQ0hFQ0tfU1RSSUNUX0lTTyAgICAgICAgICAgIDEwMzQKKyNkZWZpbmUgSURDX0NIRUNLX0RJU0FCTEVfU0hPUlRfQkxPQ0sgICAxMDM1CisjZGVmaW5lIElEQ19DSEVDS19YSU5HX1RBRyAgICAgICAgICAgICAgMTAzNgorI2RlZmluZSBJRENfQ0hFQ0tfRk9SQ0VfTVMgICAgICAgICAgICAgIDEwMzcKKyNkZWZpbmUgSURDX0NIRUNLX01PREVfRklYRUQgICAgICAgICAgICAxMDM4CisjZGVmaW5lIElEQ19SSUNIRURJVF9MQU1FICAgICAgICAgICAgICAgMTAzOQorI2RlZmluZSBJRENfQ0hFQ0tfT1ZFUkxBUCAgICAgICAgICAgICAgIDEwMzkKKyNkZWZpbmUgSURDX0NIRUNLX1NUT1AgICAgICAgICAgICAgICAgICAxMDQwCisjZGVmaW5lIElEQ19FRElUX1RFWFQgICAgICAgICAgICAgICAgICAgMTA0NAorI2RlZmluZSBJRENfTEFNRV9MQSAgICAgICAgICAgICAgICAgICAgIDEwNDQKKyNkZWZpbmUgSURDX0ZPUkNFX01PTk8gICAgICAgICAgICAgICAgICAxMDQ1CisjZGVmaW5lIElEQ19MQU1FX1ZFUiAgICAgICAgICAgICAgICAgICAgMTA0NgorI2RlZmluZSBJRENfTEFNRV9VUkwgICAgICAgICAgICAgICAgICAgIDEwNDcKKyNkZWZpbmUgSURDX1NFVF9EVVJBVElPTiAgICAgICAgICAgICAgICAxMDQ4CisjZGVmaW5lIElEQ19TVEFUSUMgICAgICAgICAgICAgICAgICAgICAgLTEKKworLy8gTmV4dCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG9iamVjdHMKKy8vIAorI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKKyNpZm5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2RlZmluZSBfQVBTX05PX01GQyAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxMDcKKyNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICA0MDAwMQorI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwNDkKKyNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMDEKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9mcm9udGVuZC8uaW5kZW50LnBybyBiL2Zyb250ZW5kLy5pbmRlbnQucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDRiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC8uaW5kZW50LnBybwpAQCAtMCwwICsxLDMyIEBACisvLyBJTkRFTlQgc2V0dXAgZmlsZToKKy8vCWJhc2ljYWxseSB0aGUgR05VLXN0eWxlIG9mIGNvZGluZworLy8gCistLW5vLWJsYW5rLWxpbmVzLWFmdGVyLWRlY2xhcmF0aW9ucworLS1ibGFuay1saW5lcy1hZnRlci1wcm9jZWR1cmVzCistLW5vLWJsYW5rLWxpbmVzLWFmdGVyLWNvbW1hcworLS1icmVhay1iZWZvcmUtYm9vbGVhbi1vcGVyYXRvcgorLS1icmFjZXMtb24taWYtbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcgorLS1icmFjZS1pbmRlbnQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIDwtCistLWJyYWNlcy1vbi1zdHJ1Y3QtZGVjbC1saW5lICAgICAgICAgICAgICAgICAgICAgIC8vCistLWNvbW1lbnQtaW5kZW50YXRpb24yNSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMyCistLWRlY2xhcmF0aW9uLWNvbW1lbnQtY29sdW1uMzAgICAgICAgICAgICAgICAgICAgIC8vIDE/CistLW5vLWNvbW1lbnQtZGVsaW1pdGVycy1vbi1ibGFuay1saW5lcworLS1kb250LWN1ZGRsZS1lbHNlCistLWVsc2UtZW5kaWYtY29sdW1uMQorLS1zcGFjZS1hZnRlci1jYXN0CistLWRlY2xhcmF0aW9uLWluZGVudGF0aW9uOCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKKy1uZGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hhdCBkb2VzIHRoaXMgbWVhbj8KKy0tZG9udC1mb3JtYXQtZmlyc3QtY29sdW1uLWNvbW1lbnRzCistLWRvbnQtZm9ybWF0LWNvbW1lbnRzCistLWhvbm91ci1uZXdsaW5lcworLS1pbmRlbnQtbGV2ZWw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyCistLXBhcmFtZXRlci1pbmRlbnRhdGlvbjYgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUKKy0tY29udGludWUtYXQtcGFyZW50aGVzZXMKKy0tc3BhY2UtYWZ0ZXItcHJvY2VkdXJlLWNhbGxzCistLXByb2NuYW1lcy1zdGFydC1saW5lcworLS1kb250LXN0YXItY29tbWVudHMKKy0tbGVhdmUtb3B0aW9uYWwtYmxhbmstbGluZXMgCistLW5vLXNwYWNlLWFmdGVyLWZ1bmN0aW9uLWNhbGwtbmFtZXMKKworLS10YWItc2l6ZTAKKy0tbGluZS1sZW5ndGgxMDAKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL01ha2VmaWxlLmFtIGIvZnJvbnRlbmQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhMmFjNwotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODEgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjI4IDIwMDYvMDkvMzAgMDk6MTc6MDUgYm91dmlnbmUgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCitiaW5fUFJPR1JBTVMgPSBAV0lUSF9GUk9OVEVOREAgQFdJVEhfTVAzUlRQQCBAV0lUSF9NUDNYQAorRVhUUkFfUFJPR1JBTVMgPSBsYW1lJChFWEVFWFQpIG1wM3J0cCQoRVhFRVhUKSBtcDN4JChFWEVFWFQpCisKK2JyaGlzdF9zb3VyY2VzID0gYnJoaXN0LmMgYnJoaXN0LmgKKworRVhUUkFfRElTVCA9IFwKKwkkKGJyaGlzdF9zb3VyY2VzKSBcCisJbGFtZV92YzYuZHNwIFwKKwlsYW1lX3ZjOC52Y3Byb2ogXAorCW1wM3hfdmM2LmRzcCBcCisJYW1pZ2FfbXBlZ2EuYworCitERUZTID0gQERFRlNAIEBDT05GSUdfREVGU0AKKworY29tbW9uX3NvdXJjZXMgPSBcCisJY29uc29sZS5jIFwKKwlnZXRfYXVkaW8uYyBcCisJbGFtZXRpbWUuYyBcCisJcGFyc2UuYyBcCisJcG9ydGFibGVpby5jIFwKKwl0aW1lc3RhdHVzLmMKKworbm9pbnN0X0hFQURFUlMgPSBcCisJY29uc29sZS5oIFwKKwlnZXRfYXVkaW8uaCBcCisJZ3RrYW5hbC5oIFwKKwlncGtwbG90dGluZy5oIFwKKwlsYW1ldGltZS5oIFwKKwltYWluLmggXAorCXBhcnNlLmggXAorCXBvcnRhYmxlaW8uaCBcCisJdGltZXN0YXR1cy5oCisKKyMjIEVYVFJBX2xhbWVfX0VYRUVYVF9fU09VUkNFUyA9ICQoYnJoaXN0X3NvdXJjZXMpCisjIyBFWFRSQV9tcDNydHBfX0VYRUVYVF9fU09VUkNFUyA9ICQoYnJoaXN0X3NvdXJjZXMpCisjIyBFWFRSQV9tcDN4X19FWEVFWFRfX1NPVVJDRVMgPSAkKGJyaGlzdF9zb3VyY2VzKQorCitpZiBXSVRIX0JSSElTVAorbGFtZV9TT1VSQ0VTID0gbWFpbi5jICQoY29tbW9uX3NvdXJjZXMpICQoYnJoaXN0X3NvdXJjZXMpCittcDNydHBfU09VUkNFUyA9IG1wM3J0cC5jIHJ0cC5jIHJ0cC5oICQoY29tbW9uX3NvdXJjZXMpIFwKKwkkKGJyaGlzdF9zb3VyY2VzKQorbXAzeF9TT1VSQ0VTID0gbXAzeC5jIGd0a2FuYWwuYyBncGtwbG90dGluZy5jIFwKKwkkKGNvbW1vbl9zb3VyY2VzKSAkKGJyaGlzdF9zb3VyY2VzKQorZWxzZQorbGFtZV9TT1VSQ0VTID0gbWFpbi5jICQoY29tbW9uX3NvdXJjZXMpCittcDNydHBfU09VUkNFUyA9IG1wM3J0cC5jIHJ0cC5jIHJ0cC5oICQoY29tbW9uX3NvdXJjZXMpCittcDN4X1NPVVJDRVMgPSBtcDN4LmMgZ3RrYW5hbC5jIGdwa3Bsb3R0aW5nLmMgJChjb21tb25fc291cmNlcykKK2VuZGlmCisKK0NGTEFHUyA9IEBDRkxBR1NAIEBHVEtfQ0ZMQUdTQCBARlJPTlRFTkRfQ0ZMQUdTQCBAU05ERklMRV9DRkxBR1NACitMREZMQUdTID0gQExERkxBR1NAIEBGUk9OVEVORF9MREZMQUdTQCBAU05ERklMRV9MSUJTQCAtc3RhdGljCisKK0lOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpL2xpYm1wM2xhbWUgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUkkKHRvcF9idWlsZGRpcikKKworTERBREQgPSBATERBRERAIFwKKwkkKHRvcF9idWlsZGRpcikvbGlibXAzbGFtZS9saWJtcDNsYW1lLmxhIFwKKwlARlJPTlRFTkRfTERBRERACisKK21wM3hfTERBREQgPSAkKExEQUREKSBAR1RLX0xJQlNACisKK0NMRUFORklMRVMgPSBsY2xpbnQudHh0ICQoRVhUUkFfUFJPR1JBTVMpCisKK0xDTElOVEZMQUdTPSBcCisJK3Bvc2l4bGliIFwKKwkrc2hvd3N1bW1hcnkgXAorCStzaG93YWxsdXNlcyBcCisJK3doaWNobGliIFwKKwkrZm9yY2VoaW50cyBcCisJLWZpeGVkZm9ybWFsYXJyYXkgXAorCSttYXRjaGFueWludGVncmFsIFwKKwktRGxpbnQKKworbGNsaW50LnR4dDogJHtsYW1lX1NPVVJDRVN9ICR7bm9pbnN0X0hFQURFUlN9CisJQGxjbGludCAke0xDTElOVEZMQUdTfSAke0lOQ0xVREVTfSAke0RFRlN9ICR7bGFtZV9TT1VSQ0VTfSAyPiYxID5sY2xpbnQudHh0IHx8IHRydWUKKworbGNsaW50OiBsY2xpbnQudHh0CisJbW9yZSBsY2xpbnQudHh0CmRpZmYgLS1naXQgYS9mcm9udGVuZC9NYWtlZmlsZS5pbiBiL2Zyb250ZW5kL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDY0MSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKyMgZ2xvYmFsIHNlY3Rpb24gZm9yIGV2ZXJ5IE1ha2VmaWxlLmFtCisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0FOU0kyS05SID0gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRElTVF9DT01NT04gPSAkKG5vaW5zdF9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCBkZXBjb21wCitzdWJkaXIgPSBmcm9udGVuZAorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIgorYmluUFJPR1JBTVNfSU5TVEFMTCA9ICQoSU5TVEFMTF9QUk9HUkFNKQorUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKK2FtX19sYW1lX1NPVVJDRVNfRElTVCA9IG1haW4uYyBjb25zb2xlLmMgZ2V0X2F1ZGlvLmMgbGFtZXRpbWUuYyBcCisJcGFyc2UuYyBwb3J0YWJsZWlvLmMgdGltZXN0YXR1cy5jIGJyaGlzdC5jIGJyaGlzdC5oCithbV9fb2JqZWN0c18xID0gY29uc29sZSRVLiQoT0JKRVhUKSBnZXRfYXVkaW8kVS4kKE9CSkVYVCkgXAorCWxhbWV0aW1lJFUuJChPQkpFWFQpIHBhcnNlJFUuJChPQkpFWFQpIHBvcnRhYmxlaW8kVS4kKE9CSkVYVCkgXAorCXRpbWVzdGF0dXMkVS4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzIgPSBicmhpc3QkVS4kKE9CSkVYVCkKK0BXSVRIX0JSSElTVF9GQUxTRUBhbV9sYW1lX09CSkVDVFMgPSBtYWluJFUuJChPQkpFWFQpICQoYW1fX29iamVjdHNfMSkKK0BXSVRIX0JSSElTVF9UUlVFQGFtX2xhbWVfT0JKRUNUUyA9IG1haW4kVS4kKE9CSkVYVCkgJChhbV9fb2JqZWN0c18xKSBcCitAV0lUSF9CUkhJU1RfVFJVRUAJJChhbV9fb2JqZWN0c18yKQorbGFtZV9PQkpFQ1RTID0gJChhbV9sYW1lX09CSkVDVFMpCitsYW1lX0xEQUREID0gJChMREFERCkKK2xhbWVfREVQRU5ERU5DSUVTID0gJCh0b3BfYnVpbGRkaXIpL2xpYm1wM2xhbWUvbGlibXAzbGFtZS5sYQorYW1fX21wM3J0cF9TT1VSQ0VTX0RJU1QgPSBtcDNydHAuYyBydHAuYyBydHAuaCBjb25zb2xlLmMgZ2V0X2F1ZGlvLmMgXAorCWxhbWV0aW1lLmMgcGFyc2UuYyBwb3J0YWJsZWlvLmMgdGltZXN0YXR1cy5jIGJyaGlzdC5jIGJyaGlzdC5oCitAV0lUSF9CUkhJU1RfRkFMU0VAYW1fbXAzcnRwX09CSkVDVFMgPSBtcDNydHAkVS4kKE9CSkVYVCkgXAorQFdJVEhfQlJISVNUX0ZBTFNFQAlydHAkVS4kKE9CSkVYVCkgJChhbV9fb2JqZWN0c18xKQorQFdJVEhfQlJISVNUX1RSVUVAYW1fbXAzcnRwX09CSkVDVFMgPSBtcDNydHAkVS4kKE9CSkVYVCkgXAorQFdJVEhfQlJISVNUX1RSVUVACXJ0cCRVLiQoT0JKRVhUKSAkKGFtX19vYmplY3RzXzEpIFwKK0BXSVRIX0JSSElTVF9UUlVFQAkkKGFtX19vYmplY3RzXzIpCittcDNydHBfT0JKRUNUUyA9ICQoYW1fbXAzcnRwX09CSkVDVFMpCittcDNydHBfTERBREQgPSAkKExEQUREKQorbXAzcnRwX0RFUEVOREVOQ0lFUyA9ICQodG9wX2J1aWxkZGlyKS9saWJtcDNsYW1lL2xpYm1wM2xhbWUubGEKK2FtX19tcDN4X1NPVVJDRVNfRElTVCA9IG1wM3guYyBndGthbmFsLmMgZ3BrcGxvdHRpbmcuYyBjb25zb2xlLmMgXAorCWdldF9hdWRpby5jIGxhbWV0aW1lLmMgcGFyc2UuYyBwb3J0YWJsZWlvLmMgdGltZXN0YXR1cy5jIFwKKwlicmhpc3QuYyBicmhpc3QuaAorQFdJVEhfQlJISVNUX0ZBTFNFQGFtX21wM3hfT0JKRUNUUyA9IG1wM3gkVS4kKE9CSkVYVCkgXAorQFdJVEhfQlJISVNUX0ZBTFNFQAlndGthbmFsJFUuJChPQkpFWFQpIGdwa3Bsb3R0aW5nJFUuJChPQkpFWFQpIFwKK0BXSVRIX0JSSElTVF9GQUxTRUAJJChhbV9fb2JqZWN0c18xKQorQFdJVEhfQlJISVNUX1RSVUVAYW1fbXAzeF9PQkpFQ1RTID0gbXAzeCRVLiQoT0JKRVhUKSBcCitAV0lUSF9CUkhJU1RfVFJVRUAJZ3RrYW5hbCRVLiQoT0JKRVhUKSBncGtwbG90dGluZyRVLiQoT0JKRVhUKSBcCitAV0lUSF9CUkhJU1RfVFJVRUAJJChhbV9fb2JqZWN0c18xKSAkKGFtX19vYmplY3RzXzIpCittcDN4X09CSkVDVFMgPSAkKGFtX21wM3hfT0JKRUNUUykKK2FtX19ERVBFTkRFTkNJRVNfMSA9ICQodG9wX2J1aWxkZGlyKS9saWJtcDNsYW1lL2xpYm1wM2xhbWUubGEKK21wM3hfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJCh0b3BfYnVpbGRkaXIpQGFtX19pc3JjQAorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChsYW1lX1NPVVJDRVMpICQobXAzcnRwX1NPVVJDRVMpICQobXAzeF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChhbV9fbGFtZV9TT1VSQ0VTX0RJU1QpICQoYW1fX21wM3J0cF9TT1VSQ0VTX0RJU1QpIFwKKwkkKGFtX19tcDN4X1NPVVJDRVNfRElTVCkKK0hFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQCBAR1RLX0NGTEFHU0AgQEZST05URU5EX0NGTEFHU0AgQFNOREZJTEVfQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AgQENPTkZJR19ERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKS9saWJtcDNsYW1lIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JJCh0b3BfYnVpbGRkaXIpCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQCBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYm1wM2xhbWUvbGlibXAzbGFtZS5sYSBcCisJQEZST05URU5EX0xEQUREQAorCitMREZMQUdTID0gQExERkxBR1NAIEBGUk9OVEVORF9MREZMQUdTQCBAU05ERklMRV9MSUJTQCAtc3RhdGljCitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gMS45IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorYmluX1BST0dSQU1TID0gQFdJVEhfRlJPTlRFTkRAIEBXSVRIX01QM1JUUEAgQFdJVEhfTVAzWEAKK0VYVFJBX1BST0dSQU1TID0gbGFtZSQoRVhFRVhUKSBtcDNydHAkKEVYRUVYVCkgbXAzeCQoRVhFRVhUKQorYnJoaXN0X3NvdXJjZXMgPSBicmhpc3QuYyBicmhpc3QuaAorRVhUUkFfRElTVCA9IFwKKwkkKGJyaGlzdF9zb3VyY2VzKSBcCisJbGFtZV92YzYuZHNwIFwKKwlsYW1lX3ZjOC52Y3Byb2ogXAorCW1wM3hfdmM2LmRzcCBcCisJYW1pZ2FfbXBlZ2EuYworCitjb21tb25fc291cmNlcyA9IFwKKwljb25zb2xlLmMgXAorCWdldF9hdWRpby5jIFwKKwlsYW1ldGltZS5jIFwKKwlwYXJzZS5jIFwKKwlwb3J0YWJsZWlvLmMgXAorCXRpbWVzdGF0dXMuYworCitub2luc3RfSEVBREVSUyA9IFwKKwljb25zb2xlLmggXAorCWdldF9hdWRpby5oIFwKKwlndGthbmFsLmggXAorCWdwa3Bsb3R0aW5nLmggXAorCWxhbWV0aW1lLmggXAorCW1haW4uaCBcCisJcGFyc2UuaCBcCisJcG9ydGFibGVpby5oIFwKKwl0aW1lc3RhdHVzLmgKKworQFdJVEhfQlJISVNUX0ZBTFNFQGxhbWVfU09VUkNFUyA9IG1haW4uYyAkKGNvbW1vbl9zb3VyY2VzKQorQFdJVEhfQlJISVNUX1RSVUVAbGFtZV9TT1VSQ0VTID0gbWFpbi5jICQoY29tbW9uX3NvdXJjZXMpICQoYnJoaXN0X3NvdXJjZXMpCitAV0lUSF9CUkhJU1RfRkFMU0VAbXAzcnRwX1NPVVJDRVMgPSBtcDNydHAuYyBydHAuYyBydHAuaCAkKGNvbW1vbl9zb3VyY2VzKQorQFdJVEhfQlJISVNUX1RSVUVAbXAzcnRwX1NPVVJDRVMgPSBtcDNydHAuYyBydHAuYyBydHAuaCAkKGNvbW1vbl9zb3VyY2VzKSBcCitAV0lUSF9CUkhJU1RfVFJVRUAJJChicmhpc3Rfc291cmNlcykKKworQFdJVEhfQlJISVNUX0ZBTFNFQG1wM3hfU09VUkNFUyA9IG1wM3guYyBndGthbmFsLmMgZ3BrcGxvdHRpbmcuYyAkKGNvbW1vbl9zb3VyY2VzKQorQFdJVEhfQlJISVNUX1RSVUVAbXAzeF9TT1VSQ0VTID0gbXAzeC5jIGd0a2FuYWwuYyBncGtwbG90dGluZy5jIFwKK0BXSVRIX0JSSElTVF9UUlVFQAkkKGNvbW1vbl9zb3VyY2VzKSAkKGJyaGlzdF9zb3VyY2VzKQorCittcDN4X0xEQUREID0gJChMREFERCkgQEdUS19MSUJTQAorQ0xFQU5GSUxFUyA9IGxjbGludC50eHQgJChFWFRSQV9QUk9HUkFNUykKK0xDTElOVEZMQUdTID0gXAorCStwb3NpeGxpYiBcCisJK3Nob3dzdW1tYXJ5IFwKKwkrc2hvd2FsbHVzZXMgXAorCSt3aGljaGxpYiBcCisJK2ZvcmNlaGludHMgXAorCS1maXhlZGZvcm1hbGFycmF5IFwKKwkrbWF0Y2hhbnlpbnRlZ3JhbCBcCisJLURsaW50CisKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGZyb250ZW5kL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduICBmcm9udGVuZC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAoraW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChiaW5kaXIpIgorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIHAxPWBlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJICBpZiB0ZXN0IC1mICQkcCBcCisJICAgICB8fCB0ZXN0IC1mICQkcDEgXAorCSAgOyB0aGVuIFwKKwkgICAgZj1gZWNobyAiJCRwMSIgfCBzZWQgJ3MsXi4qLywsOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChiaW5QUk9HUkFNU19JTlNUQUxMKSAnJCRwJyAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAorCSAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKGJpblBST0dSQU1TX0lOU1RBTEwpICIkJHAiICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiIgfHwgZXhpdCAxOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBmPWBlY2hvICIkJHAiIHwgc2VkICdzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiI7IFwKKwlkb25lCisKK2NsZWFuLWJpblBST0dSQU1TOgorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwkgIGVjaG8gIiBybSAtZiAkJHAgJCRmIjsgXAorCSAgcm0gLWYgJCRwICQkZiA7IFwKKwlkb25lCitsYW1lJChFWEVFWFQpOiAkKGxhbWVfT0JKRUNUUykgJChsYW1lX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGxhbWUkKEVYRUVYVCkKKwkkKExJTkspICQobGFtZV9PQkpFQ1RTKSAkKGxhbWVfTERBREQpICQoTElCUykKK21wM3J0cCQoRVhFRVhUKTogJChtcDNydHBfT0JKRUNUUykgJChtcDNydHBfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgbXAzcnRwJChFWEVFWFQpCisJJChMSU5LKSAkKG1wM3J0cF9PQkpFQ1RTKSAkKG1wM3J0cF9MREFERCkgJChMSUJTKQorbXAzeCQoRVhFRVhUKTogJChtcDN4X09CSkVDVFMpICQobXAzeF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBtcDN4JChFWEVFWFQpCisJJChMSU5LKSAkKG1wM3hfT0JKRUNUUykgJChtcDN4X0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCiskKHRvcF9zcmNkaXIpL2Fuc2kya25yOgorCWNkICQodG9wX3NyY2RpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgLi9hbnNpMmtucgorCittb3N0bHljbGVhbi1rcjoKKwktdGVzdCAiJFUiID0gIiIgfHwgcm0gLWYgKl8uYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnJoaXN0JFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NvbnNvbGUkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ2V0X2F1ZGlvJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dwa3Bsb3R0aW5nJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2d0a2FuYWwkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGFtZXRpbWUkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWFpbiRVLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tcDNydHAkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXAzeCRVLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wYXJzZSRVLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wb3J0YWJsZWlvJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3J0cCRVLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90aW1lc3RhdHVzJFUuUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKK2JyaGlzdF8uYzogYnJoaXN0LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9icmhpc3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9icmhpc3QuYzsgZWxzZSBlY2hvIGJyaGlzdC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitjb25zb2xlXy5jOiBjb25zb2xlLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9jb25zb2xlLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvY29uc29sZS5jOyBlbHNlIGVjaG8gY29uc29sZS5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitnZXRfYXVkaW9fLmM6IGdldF9hdWRpby5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvZ2V0X2F1ZGlvLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvZ2V0X2F1ZGlvLmM7IGVsc2UgZWNobyBnZXRfYXVkaW8uYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorZ3BrcGxvdHRpbmdfLmM6IGdwa3Bsb3R0aW5nLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9ncGtwbG90dGluZy5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2dwa3Bsb3R0aW5nLmM7IGVsc2UgZWNobyBncGtwbG90dGluZy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitndGthbmFsXy5jOiBndGthbmFsLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9ndGthbmFsLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvZ3RrYW5hbC5jOyBlbHNlIGVjaG8gZ3RrYW5hbC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitsYW1ldGltZV8uYzogbGFtZXRpbWUuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2xhbWV0aW1lLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvbGFtZXRpbWUuYzsgZWxzZSBlY2hvIGxhbWV0aW1lLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK21haW5fLmM6IG1haW4uYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL21haW4uYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9tYWluLmM7IGVsc2UgZWNobyBtYWluLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK21wM3J0cF8uYzogbXAzcnRwLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9tcDNydHAuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9tcDNydHAuYzsgZWxzZSBlY2hvIG1wM3J0cC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACittcDN4Xy5jOiBtcDN4LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9tcDN4LmM7IHRoZW4gZWNobyAkKHNyY2RpcikvbXAzeC5jOyBlbHNlIGVjaG8gbXAzeC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitwYXJzZV8uYzogcGFyc2UuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3BhcnNlLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvcGFyc2UuYzsgZWxzZSBlY2hvIHBhcnNlLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3BvcnRhYmxlaW9fLmM6IHBvcnRhYmxlaW8uYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3BvcnRhYmxlaW8uYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9wb3J0YWJsZWlvLmM7IGVsc2UgZWNobyBwb3J0YWJsZWlvLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3J0cF8uYzogcnRwLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9ydHAuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9ydHAuYzsgZWxzZSBlY2hvIHJ0cC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACit0aW1lc3RhdHVzXy5jOiB0aW1lc3RhdHVzLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS90aW1lc3RhdHVzLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvdGltZXN0YXR1cy5jOyBlbHNlIGVjaG8gdGltZXN0YXR1cy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACiticmhpc3RfLiQoT0JKRVhUKSBicmhpc3RfLmxvIGNvbnNvbGVfLiQoT0JKRVhUKSBjb25zb2xlXy5sbyBcCitnZXRfYXVkaW9fLiQoT0JKRVhUKSBnZXRfYXVkaW9fLmxvIGdwa3Bsb3R0aW5nXy4kKE9CSkVYVCkgXAorZ3BrcGxvdHRpbmdfLmxvIGd0a2FuYWxfLiQoT0JKRVhUKSBndGthbmFsXy5sbyBsYW1ldGltZV8uJChPQkpFWFQpIFwKK2xhbWV0aW1lXy5sbyBtYWluXy4kKE9CSkVYVCkgbWFpbl8ubG8gbXAzcnRwXy4kKE9CSkVYVCkgbXAzcnRwXy5sbyBcCittcDN4Xy4kKE9CSkVYVCkgbXAzeF8ubG8gcGFyc2VfLiQoT0JKRVhUKSBwYXJzZV8ubG8gXAorcG9ydGFibGVpb18uJChPQkpFWFQpIHBvcnRhYmxlaW9fLmxvIHJ0cF8uJChPQkpFWFQpIHJ0cF8ubG8gXAordGltZXN0YXR1c18uJChPQkpFWFQpIHRpbWVzdGF0dXNfLmxvIDogJChBTlNJMktOUikKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICQkdGFncyAkJHVuaXF1ZTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChIRUFERVJTKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQoYmluZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1rciBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYmluUFJPR1JBTVMgXAorCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1rciBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIFwKKwl1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWJpblBST0dSQU1TCisKKworIyBlbmQgZ2xvYmFsIHNlY3Rpb24KKworbGNsaW50LnR4dDogJHtsYW1lX1NPVVJDRVN9ICR7bm9pbnN0X0hFQURFUlN9CisJQGxjbGludCAke0xDTElOVEZMQUdTfSAke0lOQ0xVREVTfSAke0RFRlN9ICR7bGFtZV9TT1VSQ0VTfSAyPiYxID5sY2xpbnQudHh0IHx8IHRydWUKKworbGNsaW50OiBsY2xpbnQudHh0CisJbW9yZSBsY2xpbnQudHh0CisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9mcm9udGVuZC9hbWlnYV9tcGVnYS5jIGIvZnJvbnRlbmQvYW1pZ2FfbXBlZ2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmYxNDRmCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvYW1pZ2FfbXBlZ2EuYwpAQCAtMCwwICsxLDEzOSBAQAorLyogTVBHTElCIHJlcGxhY2VtZW50IHVzaW5nIG1wZWdhLmxpYnJhcnkgKEFtaWdhT1MpCisgKiBXcml0dGVuIGJ5IFRob21hcyBXZW56ZWwgYW5kIFNpZ2Jqcm4gKENJU0MpIFNrau+/vWV0LgorICoKKyAqIEJpZyB0aGFua3MgdG8gU3Tvv71oYW5lIFRhdmVybmFyZCBmb3IgbXBlZ2EubGlicmFyeS4KKyAqCisgKi8KKworLyogJElkOiBhbWlnYV9tcGVnYS5jLHYgMS4zIDIwMDUvMTEvMDEgMTM6MDE6NTYgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIEFNSUdBX01QRUdBCisKKyNkZWZpbmUgX19VU0VfU1lTQkFTRQorI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBXZSBuZWVkIGEgc21hbGwgd29ya2Fyb3VuZCBoZXJlIHNvIEdDQyBkb2Vzbid0IGZhaWwgdXBvbiByZWRlZmluaXRpb24uIDpQICovCisjZGVmaW5lIEZMT0FUIF9GTE9BVAorI2luY2x1ZGUgPHByb3RvL2V4ZWMuaD4KKyNpbmNsdWRlIDxwcm90by9tcGVnYS5oPgorI3VuZGVmIF9GTE9BVAorCisjaWZuZGVmIF9fR05VQ19fCisjaW5jbHVkZSA8ZG9zLmg+CisjZW5kaWYKKworc3RydWN0IExpYnJhcnkgKk1QRUdBQmFzZSA9IE5VTEw7CitNUEVHQV9TVFJFQU0gKm1zdHJlYW0gPSBOVUxMOworTVBFR0FfQ1RSTCBtY3RybDsKKworc3RhdGljIGNvbnN0IGludCBzbXBsc1syXVs0XSA9IHsKKy8qIExheWVyIHggIEkgICBJSSAgIElJSSAqLworICAgIHswLCAzODQsIDExNTIsIDExNTJ9LCAvKiBNUEVHLTEgICAgICovCisgICAgezAsIDM4NCwgMTE1MiwgNTc2fSAvKiBNUEVHLTIoLjUpICovCit9OworCisKKyNpZm5kZWYgX19HTlVDX18KK3N0YXRpYyBpbnQKK2JyZWFrX2NsZWFudXAodm9pZCkKK3sKKyAgICAvKiBEdW1teSBicmVhayBmdW5jdGlvbiB0byBtYWtlIGF0ZXhpdCgpIHdvcmsuIDpQICovCisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2V4aXRfY2xlYW51cCh2b2lkKQoreworICAgIGlmIChtc3RyZWFtKSB7CisgICAgICAgIE1QRUdBX2Nsb3NlKG1zdHJlYW0pOworICAgICAgICBtc3RyZWFtID0gTlVMTDsKKyAgICB9CisgICAgaWYgKE1QRUdBQmFzZSkgeworICAgICAgICBDbG9zZUxpYnJhcnkoTVBFR0FCYXNlKTsKKyAgICAgICAgTVBFR0FCYXNlID0gTlVMTDsKKyAgICB9Cit9CisKKworaW50CitsYW1lX2RlY29kZV9pbml0ZmlsZShjb25zdCBjaGFyICpmdWxsbmFtZSwgbXAzZGF0YV9zdHJ1Y3QgKiBtcDNkYXRhKQoreworICAgIG1jdHJsLmJzX2FjY2VzcyA9IE5VTEw7CisKKyAgICBtY3RybC5sYXllcl8xXzIubW9uby5xdWFsaXR5ID0gMjsKKyAgICBtY3RybC5sYXllcl8xXzIuc3RlcmVvLnF1YWxpdHkgPSAyOworICAgIG1jdHJsLmxheWVyXzFfMi5tb25vLmZyZXFfZGl2ID0gMTsKKyAgICBtY3RybC5sYXllcl8xXzIuc3RlcmVvLmZyZXFfZGl2ID0gMTsKKyAgICBtY3RybC5sYXllcl8xXzIubW9uby5mcmVxX21heCA9IDQ4MDAwOworICAgIG1jdHJsLmxheWVyXzFfMi5zdGVyZW8uZnJlcV9tYXggPSA0ODAwMDsKKyAgICBtY3RybC5sYXllcl8zLm1vbm8ucXVhbGl0eSA9IDI7CisgICAgbWN0cmwubGF5ZXJfMy5zdGVyZW8ucXVhbGl0eSA9IDI7CisgICAgbWN0cmwubGF5ZXJfMy5tb25vLmZyZXFfZGl2ID0gMTsKKyAgICBtY3RybC5sYXllcl8zLnN0ZXJlby5mcmVxX2RpdiA9IDE7CisgICAgbWN0cmwubGF5ZXJfMy5tb25vLmZyZXFfbWF4ID0gNDgwMDA7CisgICAgbWN0cmwubGF5ZXJfMy5zdGVyZW8uZnJlcV9tYXggPSA0ODAwMDsKKyAgICBtY3RybC5sYXllcl8xXzIuZm9yY2VfbW9ubyA9IDA7CisgICAgbWN0cmwubGF5ZXJfMy5mb3JjZV9tb25vID0gMDsKKworICAgIE1QRUdBQmFzZSA9IE9wZW5MaWJyYXJ5KCJtcGVnYS5saWJyYXJ5IiwgMik7CisgICAgaWYgKCFNUEVHQUJhc2UpIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJVbmFibGUgdG8gb3BlbiBtcGVnYS5saWJyYXJ5IHYyXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisjaWZuZGVmIF9fR05VQ19fCisgICAgb25icmVhayhicmVha19jbGVhbnVwKTsKKyNlbmRpZgorICAgIGF0ZXhpdChleGl0X2NsZWFudXApOworCisgICAgbXAzZGF0YS0+aGVhZGVyX3BhcnNlZCA9IDA7CisgICAgbXN0cmVhbSA9IE1QRUdBX29wZW4oKGNoYXIgKikgZnVsbG5hbWUsICZtY3RybCk7CisgICAgaWYgKCFtc3RyZWFtKQorICAgICAgICByZXR1cm4gKC0xKTsKKworICAgIG1wM2RhdGEtPmhlYWRlcl9wYXJzZWQgPSAxOworICAgIG1wM2RhdGEtPnN0ZXJlbyA9IG1zdHJlYW0tPmRlY19jaGFubmVsczsKKyAgICBtcDNkYXRhLT5zYW1wbGVyYXRlID0gbXN0cmVhbS0+ZGVjX2ZyZXF1ZW5jeTsKKyAgICBtcDNkYXRhLT5iaXRyYXRlID0gbXN0cmVhbS0+Yml0cmF0ZTsKKyAgICBtcDNkYXRhLT5uc2FtcCA9IChmbG9hdCkgbXN0cmVhbS0+bXNfZHVyYXRpb24gLyAxMDAwICogbXN0cmVhbS0+ZGVjX2ZyZXF1ZW5jeTsKKyAgICBtcDNkYXRhLT5tb2RlID0gbXN0cmVhbS0+bW9kZTsKKyAgICBtcDNkYXRhLT5tb2RlX2V4dCA9IDA7IC8qIG1wZWdhLmxpYnJhcnkgZG9lc24ndCBzdXBwbHkgdGhpcyBpbmZvISA6KCAqLworICAgIG1wM2RhdGEtPmZyYW1lc2l6ZSA9IHNtcGxzW21zdHJlYW0tPm5vcm0gLSAxXVttc3RyZWFtLT5sYXllcl07CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2RlY29kZV9mcm9tZmlsZShGSUxFICogZmQsIHNob3J0IHBjbV9sW10sIHNob3J0IHBjbV9yW10sIG1wM2RhdGFfc3RydWN0ICogbXAzZGF0YSkKK3sKKyAgICBpbnQgICAgIG91dHNpemUgPSAwOworICAgIFdPUkQgICAqYltNUEVHQV9NQVhfQ0hBTk5FTFNdOworCisgICAgYlswXSA9IHBjbV9sOworICAgIGJbMV0gPSBwY21fcjsKKworICAgIG1wM2RhdGEtPmhlYWRlcl9wYXJzZWQgPSAwOworICAgIHdoaWxlICgob3V0c2l6ZSA9PSAwKSB8fCAob3V0c2l6ZSA9PSBNUEVHQV9FUlJfQkFERlJBTUUpKSAvKiBTa2lwIGJhZCBmcmFtZXMgKi8KKyAgICAgICAgb3V0c2l6ZSA9IE1QRUdBX2RlY29kZV9mcmFtZShtc3RyZWFtLCBiKTsKKworICAgIGlmIChvdXRzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICBtcDNkYXRhLT5oZWFkZXJfcGFyc2VkID0gMTsKKyAgICBtcDNkYXRhLT5zdGVyZW8gPSBtc3RyZWFtLT5kZWNfY2hhbm5lbHM7CisgICAgbXAzZGF0YS0+c2FtcGxlcmF0ZSA9IG1zdHJlYW0tPmRlY19mcmVxdWVuY3k7CisgICAgbXAzZGF0YS0+Yml0cmF0ZSA9IG1zdHJlYW0tPmJpdHJhdGU7CisgICAgbXAzZGF0YS0+bW9kZSA9IG1zdHJlYW0tPm1vZGU7CisgICAgbXAzZGF0YS0+bW9kZV9leHQgPSAwOyAvKiBtcGVnYS5saWJyYXJ5IGRvZXNuJ3Qgc3VwcGx5IHRoaXMgaW5mbyEgOiggKi8KKyAgICBtcDNkYXRhLT5mcmFtZXNpemUgPSBzbXBsc1ttc3RyZWFtLT5ub3JtIC0gMV1bbXN0cmVhbS0+bGF5ZXJdOworCisgICAgcmV0dXJuIG91dHNpemU7Cit9CisKKyNlbmRpZiAvKiBBTUlHQV9NUEVHQSAqLwpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvYnJoaXN0LmMgYi9mcm9udGVuZC9icmhpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRmNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvYnJoaXN0LmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKglCaXRyYXRlIGhpc3RvZ3JhbSBzb3VyY2UgZmlsZQorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IGJyaGlzdC5jLHYgMS41MyAyMDA4LzA0LzA1IDE3OjM4OjUwIHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBCUkhJU1QKKworLyogYmFzaWMgI2RlZmluZSdzICovCisKKyNpZm5kZWYgQlJISVNUX1dJRFRICisjIGRlZmluZSBCUkhJU1RfV0lEVEggICAgMTQKKyNlbmRpZgorI2lmbmRlZiBCUkhJU1RfUkVTCisjIGRlZmluZSBCUkhJU1RfUkVTICAgICAgMTQKKyNlbmRpZgorCisKKy8qICNpbmNsdWRlcyAqLworCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYnJoaXN0LmgiCisjaW5jbHVkZSAiY29uc29sZS5oIgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKKworLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byB0aGUgQ29uc29sZSBJL08KKyAqIG1heSBiZSB0aGlzIHNob3VsZCBiZSBhIG1vcmUgZ2xvYmFsIGZyb250ZW5kIHN0cnVjdHVyZS4gU28gaXQKKyAqIG1ha2VzIHNlbnNlIHRvIHByaW50IGFsbCBmaWxlcyBpbnN0ZWFkIHdpdGgKKyAqIHByaW50ZiAoICJibGFoXG4iKSB3aXRoIHByaW50ZiAoICJibGFoJXNcbiIsIENvbnNvbGVfSU8uc3RyX2NscmVvbG4gKTsKKyAqLworCitleHRlcm4gQ29uc29sZV9JT190IENvbnNvbGVfSU87CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGludCAgICAgdmJyX2JpdHJhdGVfbWluX2luZGV4OworICAgIGludCAgICAgdmJyX2JpdHJhdGVfbWF4X2luZGV4OworICAgIGludCAgICAga2Jwc1tCUkhJU1RfV0lEVEhdOworICAgIGludCAgICAgaGlzdF9wcmludGVkX2xpbmVzOworICAgIGNoYXIgICAgYmFyX2FzdGVyaXNrWzUxMiArIDFdOyAvKiBidWZmZXIgZmlsbGVkIHVwIHdpdGggYSBsb3Qgb2YgJyonIHRvIHByaW50IGEgYmFyICAgICAqLworICAgIGNoYXIgICAgYmFyX3BlcmNlbnRbNTEyICsgMV07IC8qIGJ1ZmZlciBmaWxsZWQgdXAgd2l0aCBhIGxvdCBvZiAnJScgdG8gcHJpbnQgYSBiYXIgICAgICovCisgICAgY2hhciAgICBiYXJfY29kZWRbNTEyICsgMV07IC8qIGJ1ZmZlciBmaWxsZWQgdXAgd2l0aCBhIGxvdCBvZiAnICcgdG8gcHJpbnQgYSBiYXIgICAgICovCisgICAgY2hhciAgICBiYXJfc3BhY2VbNTEyICsgMV07IC8qIGJ1ZmZlciBmaWxsZWQgdXAgd2l0aCBhIGxvdCBvZiAnICcgdG8gcHJpbnQgYSBiYXIgICAgICovCit9IGJyaGlzdDsKKworc3RhdGljIGludAorY2FsY3VsYXRlX2luZGV4KGNvbnN0IGludCAqY29uc3QgYXJyYXksIGNvbnN0IGludCBsZW4sIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBpbnQgICAgIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIGlmIChhcnJheVtpXSA9PSB2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiAtMTsKK30KKworaW50Citicmhpc3RfaW5pdChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmLCBjb25zdCBpbnQgYml0cmF0ZV9rYnBzX21pbiwgY29uc3QgaW50IGJpdHJhdGVfa2Jwc19tYXgpCit7CisgICAgYnJoaXN0Lmhpc3RfcHJpbnRlZF9saW5lcyA9IDA7CisKKyAgICAvKiBpbml0aWFsaXplIGhpc3RvZ3JhbW1pbmcgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBsYW1lX2JpdHJhdGVfa2JwcyhnZiwgYnJoaXN0LmticHMpOworICAgIGJyaGlzdC52YnJfYml0cmF0ZV9taW5faW5kZXggPSBjYWxjdWxhdGVfaW5kZXgoYnJoaXN0LmticHMsIEJSSElTVF9XSURUSCwgYml0cmF0ZV9rYnBzX21pbik7CisgICAgYnJoaXN0LnZicl9iaXRyYXRlX21heF9pbmRleCA9IGNhbGN1bGF0ZV9pbmRleChicmhpc3Qua2JwcywgQlJISVNUX1dJRFRILCBiaXRyYXRlX2ticHNfbWF4KTsKKworICAgIGlmIChicmhpc3QudmJyX2JpdHJhdGVfbWluX2luZGV4ID49IEJSSElTVF9XSURUSCB8fAorICAgICAgICBicmhpc3QudmJyX2JpdHJhdGVfbWF4X2luZGV4ID49IEJSSElTVF9XSURUSCkgeworICAgICAgICBlcnJvcl9wcmludGYoImxhbWUgaW50ZXJuYWwgZXJyb3I6IFZCUiBtaW4gJWQga2JwcyBvciBWQlIgbWF4ICVkIGticHMgbm90IGFsbG93ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZV9rYnBzX21pbiwgYml0cmF0ZV9rYnBzX21heCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1zZXQoYnJoaXN0LmJhcl9hc3RlcmlzaywgJyonLCBzaXplb2YoYnJoaXN0LmJhcl9hc3RlcmlzaykgLSAxKTsKKyAgICBtZW1zZXQoYnJoaXN0LmJhcl9wZXJjZW50LCAnJScsIHNpemVvZihicmhpc3QuYmFyX3BlcmNlbnQpIC0gMSk7CisgICAgbWVtc2V0KGJyaGlzdC5iYXJfc3BhY2UsICctJywgc2l6ZW9mKGJyaGlzdC5iYXJfc3BhY2UpIC0gMSk7CisgICAgbWVtc2V0KGJyaGlzdC5iYXJfY29kZWQsICctJywgc2l6ZW9mKGJyaGlzdC5iYXJfc3BhY2UpIC0gMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZGlnaXRzKHVuc2lnbmVkIG51bWJlcikKK3sKKyAgICBpbnQgICAgIHJldCA9IDE7CisKKyAgICBpZiAobnVtYmVyID49IDEwMDAwMDAwMCkgeworICAgICAgICByZXQgKz0gODsKKyAgICAgICAgbnVtYmVyIC89IDEwMDAwMDAwMDsKKyAgICB9CisgICAgaWYgKG51bWJlciA+PSAxMDAwMCkgeworICAgICAgICByZXQgKz0gNDsKKyAgICAgICAgbnVtYmVyIC89IDEwMDAwOworICAgIH0KKyAgICBpZiAobnVtYmVyID49IDEwMCkgeworICAgICAgICByZXQgKz0gMjsKKyAgICAgICAgbnVtYmVyIC89IDEwMDsKKyAgICB9CisgICAgaWYgKG51bWJlciA+PSAxMCkgeworICAgICAgICByZXQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCiticmhpc3RfZGlzcF9saW5lKGludCBpLCBpbnQgYnJfaGlzdF9UT1QsIGludCBicl9oaXN0X0xSLCBpbnQgZnVsbCwgaW50IGZyYW1lcykKK3sKKyAgICBjaGFyICAgIGJycHB0WzE0XTsgICAgICAgLyogWyVdIGFuZCBtYXguIDEwIGNoYXJhY3RlcnMgZm9yIGticHMgKi8KKyAgICBpbnQgICAgIGJhcmxlbl9UT1Q7CisgICAgaW50ICAgICBiYXJsZW5fTFI7CisgICAgaW50ICAgICBwcHQgPSAwOworICAgIGludCAgICAgcmVzID0gZGlnaXRzKGZyYW1lcykgKyAzICsgNCArIDE7CisKKyAgICBpZiAoZnVsbCAhPSAwKSB7CisgICAgICAgIC8qIHNvbWUgcHJvYmxlbXMgd2hlbiBicl9oaXN0X1RPVCBcYXBwcm94IGJyX2hpc3RfTFI6IFlvdSBjYW4ndCBzZWUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgTVMgZnJhbWVzICovCisgICAgICAgIGJhcmxlbl9UT1QgPSAoYnJfaGlzdF9UT1QgKiAoQ29uc29sZV9JTy5kaXNwX3dpZHRoIC0gcmVzKSArIGZ1bGwgLSAxKSAvIGZ1bGw7IC8qIHJvdW5kIHVwICovCisgICAgICAgIGJhcmxlbl9MUiA9IChicl9oaXN0X0xSICogKENvbnNvbGVfSU8uZGlzcF93aWR0aCAtIHJlcykgKyBmdWxsIC0gMSkgLyBmdWxsOyAvKiByb3VuZCB1cCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYmFybGVuX1RPVCA9IGJhcmxlbl9MUiA9IDA7CisgICAgfQorCisgICAgaWYgKGZyYW1lcyA+IDApCisgICAgICAgIHBwdCA9ICgxMDAwICogYnJfaGlzdF9UT1QgKyBmcmFtZXMgLyAyKSAvIGZyYW1lczsgLyogcm91bmQgbmVhcmVzdCAqLworCisgICAgc3ByaW50ZihicnBwdCwgIiBbJSppXSIsIGRpZ2l0cyhmcmFtZXMpLCBicl9oaXN0X1RPVCk7CisKKyAgICBpZiAoQ29uc29sZV9JTy5zdHJfY2xyZW9sblswXSkgLyogQ2xlYXJFbmRPZkxpbmUgYXZhaWxhYmxlICovCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJcbiUzZCVzICUuKnMlLipzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBicmhpc3Qua2Jwc1tpXSwgYnJwcHQsCisgICAgICAgICAgICAgICAgICAgICAgIGJhcmxlbl9MUiwgYnJoaXN0LmJhcl9wZXJjZW50LAorICAgICAgICAgICAgICAgICAgICAgICBiYXJsZW5fVE9UIC0gYmFybGVuX0xSLCBicmhpc3QuYmFyX2FzdGVyaXNrLCBDb25zb2xlX0lPLnN0cl9jbHJlb2xuKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJcbiUzZCVzICUuKnMlLipzJSpzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnJoaXN0LmticHNbaV0sIGJycHB0LAorICAgICAgICAgICAgICAgICAgICAgICBiYXJsZW5fTFIsIGJyaGlzdC5iYXJfcGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgYmFybGVuX1RPVCAtIGJhcmxlbl9MUiwgYnJoaXN0LmJhcl9hc3RlcmlzaywKKyAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV9JTy5kaXNwX3dpZHRoIC0gcmVzIC0gYmFybGVuX1RPVCwgIiIpOworCisgICAgYnJoaXN0Lmhpc3RfcHJpbnRlZF9saW5lcysrOworfQorCisKKworc3RhdGljIHZvaWQKK3Byb2dyZXNzX2xpbmUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZiwgaW50IGZ1bGwsIGludCBmcmFtZXMpCit7CisgICAgY2hhciAgICByc3RbMjBdID0gIlwwIjsKKyAgICBpbnQgICAgIGJhcmxlbl9UT1QgPSAwLCBiYXJsZW5fQ09EID0gMCwgYmFybGVuX1JTVCA9IDA7CisgICAgaW50ICAgICByZXMgPSAxOworICAgIGZsb2F0ICAgdGltZV9pbl9zZWMgPSAwOworICAgIHVuc2lnbmVkIGludCBob3VyLCBtaW4sIHNlYzsKKyAgICBpbnQgICAgIGZzaXplID0gbGFtZV9nZXRfZnJhbWVzaXplKGdmKTsKKyAgICBpbnQgICAgIHNyYXRlID0gbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoZ2YpOworCisgICAgaWYgKGZ1bGwgPCBmcmFtZXMpIHsKKyAgICAgICAgZnVsbCA9IGZyYW1lczsKKyAgICB9CisgICAgaWYgKHNyYXRlID4gMCkgeworICAgICAgICB0aW1lX2luX3NlYyA9IChmbG9hdCkoZnVsbCAtIGZyYW1lcyk7CisgICAgICAgIHRpbWVfaW5fc2VjICo9IGZzaXplOworICAgICAgICB0aW1lX2luX3NlYyAvPSBzcmF0ZTsKKyAgICB9CisgICAgaG91ciA9ICh1bnNpZ25lZCBpbnQpKHRpbWVfaW5fc2VjIC8gMzYwMCk7CisgICAgdGltZV9pbl9zZWMgLT0gaG91ciAqIDM2MDA7CisgICAgbWluID0gKHVuc2lnbmVkIGludCkodGltZV9pbl9zZWMgLyA2MCk7CisgICAgdGltZV9pbl9zZWMgLT0gbWluICogNjA7CisgICAgc2VjID0gKHVuc2lnbmVkIGludCl0aW1lX2luX3NlYzsKKyAgICBpZiAoZnVsbCAhPSAwKSB7CisgICAgICAgIGlmIChob3VyID4gMCkgeworICAgICAgICAgICAgc3ByaW50Zihyc3QsICIlKmQ6JTAydTolMDJ1IiwgZGlnaXRzKGhvdXIpLCBob3VyLCBtaW4sIHNlYyk7CisgICAgICAgICAgICByZXMgKz0gZGlnaXRzKGhvdXIpICsgMSArIDU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzcHJpbnRmKHJzdCwgIiUwMnU6JTAydSIsIG1pbiwgc2VjKTsKKyAgICAgICAgICAgIHJlcyArPSA1OworICAgICAgICB9CisgICAgICAgIC8qIHNvbWUgcHJvYmxlbXMgd2hlbiBicl9oaXN0X1RPVCBcYXBwcm94IGJyX2hpc3RfTFI6IFlvdSBjYW4ndCBzZWUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgTVMgZnJhbWVzICovCisgICAgICAgIGJhcmxlbl9UT1QgPSAoZnVsbCAqIChDb25zb2xlX0lPLmRpc3Bfd2lkdGggLSByZXMpICsgZnVsbCAtIDEpIC8gZnVsbDsgLyogcm91bmQgdXAgKi8KKyAgICAgICAgYmFybGVuX0NPRCA9IChmcmFtZXMgKiAoQ29uc29sZV9JTy5kaXNwX3dpZHRoIC0gcmVzKSArIGZ1bGwgLSAxKSAvIGZ1bGw7IC8qIHJvdW5kIHVwICovCisgICAgICAgIGJhcmxlbl9SU1QgPSBiYXJsZW5fVE9UIC0gYmFybGVuX0NPRDsKKyAgICAgICAgaWYgKGJhcmxlbl9SU1QgPT0gMCkgeworICAgICAgICAgICAgc3ByaW50Zihyc3QsICIlLipzIiwgcmVzIC0gMSwgYnJoaXN0LmJhcl9jb2RlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJhcmxlbl9UT1QgPSBiYXJsZW5fQ09EID0gYmFybGVuX1JTVCA9IDA7CisgICAgfQorICAgIGlmIChDb25zb2xlX0lPLnN0cl9jbHJlb2xuWzBdKSB7IC8qIENsZWFyRW5kT2ZMaW5lIGF2YWlsYWJsZSAqLworICAgICAgICBjb25zb2xlX3ByaW50ZigiXG4lLipzJXMlLipzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBiYXJsZW5fQ09ELCBicmhpc3QuYmFyX2NvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICByc3QsIGJhcmxlbl9SU1QsIGJyaGlzdC5iYXJfc3BhY2UsIENvbnNvbGVfSU8uc3RyX2NscmVvbG4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29uc29sZV9wcmludGYoIlxuJS4qcyVzJS4qcyUqcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGJhcmxlbl9DT0QsIGJyaGlzdC5iYXJfY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHJzdCwgYmFybGVuX1JTVCwgYnJoaXN0LmJhcl9zcGFjZSwgQ29uc29sZV9JTy5kaXNwX3dpZHRoIC0gcmVzIC0gYmFybGVuX1RPVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIiIpOworICAgIH0KKyAgICBicmhpc3QuaGlzdF9wcmludGVkX2xpbmVzKys7Cit9CisKKworc3RhdGljIGludAorc3RhdHNfdmFsdWUoZG91YmxlIHgpCit7CisgICAgaWYgKHggPiAwLjApIHsKKyAgICAgICAgY29uc29sZV9wcmludGYoIiAlNS4xZiIsIHgpOworICAgICAgICByZXR1cm4gNjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3N0YXRzX2hlYWQoZG91YmxlIHgsIGNvbnN0IGNoYXIgKnR4dCkKK3sKKyAgICBpZiAoeCA+IDAuMCkgeworICAgICAgICBjb25zb2xlX3ByaW50Zih0eHQpOworICAgICAgICByZXR1cm4gNjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK3N0YXRzX2xpbmUoZG91YmxlICpzdGF0KQoreworICAgIGludCAgICAgbiA9IDE7CisgICAgY29uc29sZV9wcmludGYoIlxuICAga2JwcyAgICAgIik7CisgICAgbiArPSAxMjsKKyAgICBuICs9IHN0YXRzX2hlYWQoc3RhdFsxXSwgIiAgbW9ubyIpOworICAgIG4gKz0gc3RhdHNfaGVhZChzdGF0WzJdLCAiICAgSVMgIik7CisgICAgbiArPSBzdGF0c19oZWFkKHN0YXRbM10sICIgICBMUiAiKTsKKyAgICBuICs9IHN0YXRzX2hlYWQoc3RhdFs0XSwgIiAgIE1TICIpOworICAgIGNvbnNvbGVfcHJpbnRmKCIgJSUgICAgIik7CisgICAgbiArPSA2OworICAgIG4gKz0gc3RhdHNfaGVhZChzdGF0WzVdLCAiIGxvbmcgIik7CisgICAgbiArPSBzdGF0c19oZWFkKHN0YXRbNl0sICJzd2l0Y2giKTsKKyAgICBuICs9IHN0YXRzX2hlYWQoc3RhdFs3XSwgIiBzaG9ydCIpOworICAgIG4gKz0gc3RhdHNfaGVhZChzdGF0WzhdLCAiIG1peGVkIik7CisgICAgbiArPSBjb25zb2xlX3ByaW50ZigiICUlIik7CisgICAgaWYgKENvbnNvbGVfSU8uc3RyX2NscmVvbG5bMF0pIHsgLyogQ2xlYXJFbmRPZkxpbmUgYXZhaWxhYmxlICovCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlcyIsIENvbnNvbGVfSU8uc3RyX2NscmVvbG4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29uc29sZV9wcmludGYoIiUqcyIsIENvbnNvbGVfSU8uZGlzcF93aWR0aCAtIG4sICIiKTsKKyAgICB9CisgICAgYnJoaXN0Lmhpc3RfcHJpbnRlZF9saW5lcysrOworCisgICAgbiA9IDE7CisgICAgY29uc29sZV9wcmludGYoIlxuICAlNS4xZiAgICAgIiwgc3RhdFswXSk7CisgICAgbiArPSAxMjsKKyAgICBuICs9IHN0YXRzX3ZhbHVlKHN0YXRbMV0pOworICAgIG4gKz0gc3RhdHNfdmFsdWUoc3RhdFsyXSk7CisgICAgbiArPSBzdGF0c192YWx1ZShzdGF0WzNdKTsKKyAgICBuICs9IHN0YXRzX3ZhbHVlKHN0YXRbNF0pOworICAgIGNvbnNvbGVfcHJpbnRmKCIgICAgICAiKTsKKyAgICBuICs9IDY7CisgICAgbiArPSBzdGF0c192YWx1ZShzdGF0WzVdKTsKKyAgICBuICs9IHN0YXRzX3ZhbHVlKHN0YXRbNl0pOworICAgIG4gKz0gc3RhdHNfdmFsdWUoc3RhdFs3XSk7CisgICAgbiArPSBzdGF0c192YWx1ZShzdGF0WzhdKTsKKyAgICBpZiAoQ29uc29sZV9JTy5zdHJfY2xyZW9sblswXSkgeyAvKiBDbGVhckVuZE9mTGluZSBhdmFpbGFibGUgKi8KKyAgICAgICAgY29uc29sZV9wcmludGYoIiVzIiwgQ29uc29sZV9JTy5zdHJfY2xyZW9sbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjb25zb2xlX3ByaW50ZigiJSpzIiwgQ29uc29sZV9JTy5kaXNwX3dpZHRoIC0gbiwgIiIpOworICAgIH0KKyAgICBicmhpc3QuaGlzdF9wcmludGVkX2xpbmVzKys7Cit9CisKKworLyogWWVzLCBub3QgdmVyeSBnb29kICovCisjZGVmaW5lIExSICAwCisjZGVmaW5lIE1TICAyCisKK3ZvaWQKK2JyaGlzdF9kaXNwKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2YpCit7CisgICAgaW50ICAgICBpLCBsaW5lc191c2VkID0gMDsKKyAgICBpbnQgICAgIGJyX2hpc3RbQlJISVNUX1dJRFRIXTsgLyogaG93IG9mdGVuIGEgZnJhbWUgc2l6ZSB3YXMgdXNlZCAqLworICAgIGludCAgICAgYnJfc21faGlzdFtCUkhJU1RfV0lEVEhdWzRdOyAvKiBob3cgb2Z0ZW4gYSBzcGVjaWFsIGZyYW1lIHNpemUvc3RlcmVvIG1vZGUgY29tbWJpbmF0aW9uIHdhcyB1c2VkICovCisgICAgaW50ICAgICBzdF9tb2RlWzRdOworICAgIGludCAgICAgYmxfdHlwZVs2XTsKKyAgICBpbnQgICAgIGZyYW1lczsgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVuY29kZWQgZnJhbWVzICovCisgICAgaW50ICAgICBtb3N0X29mdGVuOyAgICAgIC8qIHVzYWdlIGNvdW50IG9mIHRoZSBtb3N0IG9mdGVuIHVzZWQgZnJhbWUgc2l6ZSwgYnV0IG5vdCBzbWFsbGVyIHRoYW4gQ29uc29sZV9JTy5kaXNwX3dpZHRoLUJSSElTVF9SRVMgKG1ha2VzIHRoaXMgc2Vuc2U/KSBhbmQgMSAqLworICAgIGRvdWJsZSAgc3VtID0gMC47CisKKyAgICBkb3VibGUgIHN0YXRbOV0gPSB7IDAgfTsKKyAgICBpbnQgICAgIHN0X2ZyYW1lcyA9IDA7CisKKworICAgIGJyaGlzdC5oaXN0X3ByaW50ZWRfbGluZXMgPSAwOyAvKiBwcmludGVkIG51bWJlciBvZiBsaW5lcyBmb3IgdGhlIGJyaGlzdCBmdW5jdGlvbmFsaXR5LCB1c2VkIHRvIHNraXAgYmFjayB0aGUgcmlnaHQgbnVtYmVyIG9mIGxpbmVzICovCisKKyAgICBsYW1lX2JpdHJhdGVfc3RlcmVvX21vZGVfaGlzdChnZiwgYnJfc21faGlzdCk7CisgICAgbGFtZV9iaXRyYXRlX2hpc3QoZ2YsIGJyX2hpc3QpOworICAgIGxhbWVfc3RlcmVvX21vZGVfaGlzdChnZiwgc3RfbW9kZSk7CisgICAgbGFtZV9ibG9ja190eXBlX2hpc3QoZ2YsIGJsX3R5cGUpOworCisgICAgZnJhbWVzID0gbW9zdF9vZnRlbiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEJSSElTVF9XSURUSDsgaSsrKSB7CisgICAgICAgIGZyYW1lcyArPSBicl9oaXN0W2ldOworICAgICAgICBzdW0gKz0gYnJfaGlzdFtpXSAqIGJyaGlzdC5rYnBzW2ldOworICAgICAgICBpZiAobW9zdF9vZnRlbiA8IGJyX2hpc3RbaV0pCisgICAgICAgICAgICBtb3N0X29mdGVuID0gYnJfaGlzdFtpXTsKKyAgICAgICAgaWYgKGJyX2hpc3RbaV0pCisgICAgICAgICAgICArK2xpbmVzX3VzZWQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEJSSElTVF9XSURUSDsgaSsrKSB7CisgICAgICAgIGludCAgICAgc2hvdyA9IGJyX2hpc3RbaV07CisgICAgICAgIHNob3cgPSBzaG93ICYmIChsaW5lc191c2VkID4gMSk7CisgICAgICAgIGlmIChzaG93IHx8IChpID49IGJyaGlzdC52YnJfYml0cmF0ZV9taW5faW5kZXggJiYgaSA8PSBicmhpc3QudmJyX2JpdHJhdGVfbWF4X2luZGV4KSkKKyAgICAgICAgICAgIGJyaGlzdF9kaXNwX2xpbmUoaSwgYnJfaGlzdFtpXSwgYnJfc21faGlzdFtpXVtMUl0sIG1vc3Rfb2Z0ZW4sIGZyYW1lcyk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgc3RfZnJhbWVzICs9IHN0X21vZGVbaV07CisgICAgfQorICAgIGlmIChmcmFtZXMgPiAwKSB7CisgICAgICAgIHN0YXRbMF0gPSBzdW0gLyBmcmFtZXM7CisgICAgICAgIHN0YXRbMV0gPSAxMDAuICogKGZyYW1lcyAtIHN0X2ZyYW1lcykgLyBmcmFtZXM7CisgICAgfQorICAgIGlmIChzdF9mcmFtZXMgPiAwKSB7CisgICAgICAgIHN0YXRbMl0gPSAwLjA7CisgICAgICAgIHN0YXRbM10gPSAxMDAuICogc3RfbW9kZVtMUl0gLyBzdF9mcmFtZXM7CisgICAgICAgIHN0YXRbNF0gPSAxMDAuICogc3RfbW9kZVtNU10gLyBzdF9mcmFtZXM7CisgICAgfQorICAgIGlmIChibF90eXBlWzVdID4gMCkgeworICAgICAgICBzdGF0WzVdID0gMTAwLiAqIGJsX3R5cGVbMF0gLyBibF90eXBlWzVdOworICAgICAgICBzdGF0WzZdID0gMTAwLiAqIChibF90eXBlWzFdICsgYmxfdHlwZVszXSkgLyBibF90eXBlWzVdOworICAgICAgICBzdGF0WzddID0gMTAwLiAqIGJsX3R5cGVbMl0gLyBibF90eXBlWzVdOworICAgICAgICBzdGF0WzhdID0gMTAwLiAqIGJsX3R5cGVbNF0gLyBibF90eXBlWzVdOworICAgIH0KKyAgICBwcm9ncmVzc19saW5lKGdmLCBsYW1lX2dldF90b3RhbGZyYW1lcyhnZiksIGZyYW1lcyk7CisgICAgc3RhdHNfbGluZShzdGF0KTsKK30KKwordm9pZAorYnJoaXN0X2p1bXBfYmFjayh2b2lkKQoreworICAgIGNvbnNvbGVfdXAoYnJoaXN0Lmhpc3RfcHJpbnRlZF9saW5lcyk7CisgICAgYnJoaXN0Lmhpc3RfcHJpbnRlZF9saW5lcyA9IDA7Cit9CisKKy8qCisgKiAxKQorICoKKyAqIFRha2VuIGZyb20gVGVybWNhcF9NYW51YWwuaHRtbDoKKyAqCisgKiBXaXRoIHRoZSBVbml4IHZlcnNpb24gb2YgdGVybWNhcCwgeW91IG11c3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXNjcmlwdGlvbiB5b3Vyc2VsZiBhbmQgcGFzcworICogdGhlIGFkZHJlc3Mgb2YgdGhlIHNwYWNlIGFzIHRoZSBhcmd1bWVudCBidWZmZXIuIFRoZXJlIGlzIG5vIHdheSB5b3UgY2FuIHRlbGwgaG93IG11Y2ggc3BhY2UgaXMKKyAqIG5lZWRlZCwgc28gdGhlIGNvbnZlbnRpb24gaXMgdG8gYWxsb2NhdGUgYSBidWZmZXIgMjA0OCBjaGFyYWN0ZXJzIGxvbmcgYW5kIGFzc3VtZSB0aGF0IGlzCisgKiBlbm91Z2guICAoRm9ybWVybHkgdGhlIGNvbnZlbnRpb24gd2FzIHRvIGFsbG9jYXRlIDEwMjQgY2hhcmFjdGVycyBhbmQgYXNzdW1lIHRoYXQgd2FzIGVub3VnaC4KKyAqIEJ1dCBvbmUgZGF5LCBmb3Igb25lIGtpbmQgb2YgdGVybWluYWwsIHRoYXQgd2FzIG5vdCBlbm91Z2guKQorICovCisKKyNlbmRpZiAvKiBpZmRlZiBCUkhJU1QgKi8KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL2JyaGlzdC5oIGIvZnJvbnRlbmQvYnJoaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwODUyMgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL2JyaGlzdC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKglCaXRyYXRlIGhpc3RvZ3JhbSBpbmNsdWRlIGZpbGUKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDAgTWFyayBUYXlsb3IKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBMQU1FX0JSSElTVF9ICisjZGVmaW5lIExBTUVfQlJISVNUX0gKKworI2luY2x1ZGUgImxhbWUuaCIKKworaW50ICAgICBicmhpc3RfaW5pdChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmLCBjb25zdCBpbnQgYml0cmF0ZV9rYnBzX21pbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpdHJhdGVfa2Jwc19tYXgpOwordm9pZCAgICBicmhpc3RfZGlzcChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmKTsKK3ZvaWQgICAgYnJoaXN0X2p1bXBfYmFjayh2b2lkKTsKKworI2VuZGlmIC8qIExBTUVfQlJISVNUX0ggKi8KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL2NvbnNvbGUuYyBiL2Zyb250ZW5kL2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzkzOGEzCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvY29uc29sZS5jCkBAIC0wLDAgKzEsMzIyIEBACisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGlmbmRlZiBIQVZFX1NUUkNIUgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyAgZGVmaW5lIHN0cnJjaHIgcmluZGV4CisjIGVuZGlmCitjaGFyICAgKnN0cmNocigpLCAqc3RycmNocigpOworIyBpZm5kZWYgSEFWRV9NRU1DUFkKKyMgIGRlZmluZSBtZW1jcHkoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjICBkZWZpbmUgbWVtbW92ZShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX05DVVJTRVNfVEVSTUNBUF9IKQorIyBpbmNsdWRlIDxuY3Vyc2VzL3Rlcm1jYXAuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9URVJNQ0FQX0gpCisjIGluY2x1ZGUgPHRlcm1jYXAuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9URVJNQ0FQKQorIyBpbmNsdWRlIDxjdXJzZXMuaD4KKyMgaWYgIWRlZmluZWQoX19ic2RpX18pCisjICBpbmNsdWRlIDx0ZXJtLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiY29uc29sZS5oIgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKKyNkZWZpbmUgQ0xBU1NfSUQgICAgICAgICAgIDB4NDM0RjRFNTMKKyNkZWZpbmUgUkVQT1JUX0JVRkZfU0laRSAgIDEwMjQKKworI2lmIGRlZmluZWQoX1dJTjMyKSAgJiYgICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisKKworc3RhdGljIGludAorbXlfY29uc29sZV9wcmludGluZyhGSUxFICogZnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHZmcHJpbnRmKGZwLCBmb3JtYXQsIGFwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbXlfZXJyb3JfcHJpbnRpbmcoRklMRSAqIGZwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgIHJldHVybiB2ZnByaW50ZihmcCwgZm9ybWF0LCBhcCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK215X3JlcG9ydF9wcmludGluZyhGSUxFICogZnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHZmcHJpbnRmKGZwLCBmb3JtYXQsIGFwKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogVGFrZW4gZnJvbSBUZXJtY2FwX01hbnVhbC5odG1sOgorICoKKyAqIFdpdGggdGhlIFVuaXggdmVyc2lvbiBvZiB0ZXJtY2FwLCB5b3UgbXVzdCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRlc2NyaXB0aW9uIHlvdXJzZWxmIGFuZCBwYXNzCisgKiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BhY2UgYXMgdGhlIGFyZ3VtZW50IGJ1ZmZlci4gVGhlcmUgaXMgbm8gd2F5IHlvdSBjYW4gdGVsbCBob3cgbXVjaCBzcGFjZSBpcworICogbmVlZGVkLCBzbyB0aGUgY29udmVudGlvbiBpcyB0byBhbGxvY2F0ZSBhIGJ1ZmZlciAyMDQ4IGNoYXJhY3RlcnMgbG9uZyBhbmQgYXNzdW1lIHRoYXQgaXMKKyAqIGVub3VnaC4gIChGb3JtZXJseSB0aGUgY29udmVudGlvbiB3YXMgdG8gYWxsb2NhdGUgMTAyNCBjaGFyYWN0ZXJzIGFuZCBhc3N1bWUgdGhhdCB3YXMgZW5vdWdoLgorICogQnV0IG9uZSBkYXksIGZvciBvbmUga2luZCBvZiB0ZXJtaW5hbCwgdGhhdCB3YXMgbm90IGVub3VnaC4pCisgKi8KKworI2lmZGVmIEhBVkVfVEVSTUNBUAorc3RhdGljIHZvaWQKK2FwcGx5X3Rlcm1jYXBfc2V0dGluZ3MoQ29uc29sZV9JT190ICogY29uc3QgbWZwKQoreworICAgIGNvbnN0IGNoYXIgKnRlcm1fbmFtZTsKKyAgICBjaGFyICAgIHRlcm1fYnVmZlsyMDQ4XTsKKyAgICBjaGFyICAgKnRwOworICAgIGNoYXIgICAgdGNbMTBdOworICAgIGludCAgICAgdmFsOworCisgICAgLyogdHJ5IHRvIGNhdGNoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgc3BlY2lhbCBjb25zb2xlIHNlcXVlbmNlcyAqLworCisgICAgaWYgKCh0ZXJtX25hbWUgPSBnZXRlbnYoIlRFUk0iKSkgPT0gTlVMTCkgeworICAgICAgICAvKiAgcmggMDYxMTA1OgorICAgICAgICAgICAgc2lsZW50bHkgaWdub3JlIGl0IGFuZCBmYWxsYmFjayB0byB0aGUgYmVoYXZpb3VyIGFzIGlmCisgICAgICAgICAgICBURVJNQ0FQIHdhc24ndCBkZWZpbmVkIGF0IGFsbAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuOworICAgICAgICAvKgorICAgICAgICBmcHJpbnRmKG1mcC0+RXJyb3JfZnAsICJMQU1FOiBDYW4ndCBnZXQgXCJURVJNXCIgZW52aXJvbm1lbnQgc3RyaW5nLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKi8KKyAgICB9CisgICAgaWYgKHRnZXRlbnQodGVybV9idWZmLCB0ZXJtX25hbWUpICE9IDEpIHsKKyAgICAgICAgLyogIHJoIDA2MTEwNToKKyAgICAgICAgICAgIHNpbGVudGx5IGlnbm9yZSBpdCBhbmQgZmFsbGJhY2sgdG8gdGhlIGJlaGF2aW91ciBhcyBpZgorICAgICAgICAgICAgVEVSTUNBUCB3YXNuJ3QgZGVmaW5lZCBhdCBhbGwKKyAgICAgICAgICovCisgICAgICAgIHJldHVybjsKKyAgICAgICAgLyoKKyAgICAgICAgZnByaW50ZihtZnAtPkVycm9yX2ZwLCAiTEFNRTogQ2FuJ3QgZmluZCB0ZXJtY2FwIGVudHJ5IGZvciB0ZXJtaW5hbCBcIiVzXCJcbiIsIHRlcm1fbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKi8KKyAgICB9CisKKyAgICB2YWwgPSB0Z2V0bnVtKCJjbyIpOworICAgIGlmICh2YWwgPj0gNDAgJiYgdmFsIDw9IDUxMikKKyAgICAgICAgbWZwLT5kaXNwX3dpZHRoID0gdmFsOworICAgIHZhbCA9IHRnZXRudW0oImxpIik7CisgICAgaWYgKHZhbCA+PSAxNiAmJiB2YWwgPD0gMjU2KQorICAgICAgICBtZnAtPmRpc3BfaGVpZ2h0ID0gdmFsOworCisgICAgKih0cCA9IHRjKSA9ICdcMCc7CisgICAgdHAgPSB0Z2V0c3RyKCJ1cCIsICZ0cCk7CisgICAgaWYgKHRwICE9IE5VTEwpCisgICAgICAgIHN0cmNweShtZnAtPnN0cl91cCwgdHApOworCisgICAgKih0cCA9IHRjKSA9ICdcMCc7CisgICAgdHAgPSB0Z2V0c3RyKCJjZSIsICZ0cCk7CisgICAgaWYgKHRwICE9IE5VTEwpCisgICAgICAgIHN0cmNweShtZnAtPnN0cl9jbHJlb2xuLCB0cCk7CisKKyAgICAqKHRwID0gdGMpID0gJ1wwJzsKKyAgICB0cCA9IHRnZXRzdHIoIm1kIiwgJnRwKTsKKyAgICBpZiAodHAgIT0gTlVMTCkKKyAgICAgICAgc3RyY3B5KG1mcC0+c3RyX2VtcGgsIHRwKTsKKworICAgICoodHAgPSB0YykgPSAnXDAnOworICAgIHRwID0gdGdldHN0cigibWUiLCAmdHApOworICAgIGlmICh0cCAhPSBOVUxMKQorICAgICAgICBzdHJjcHkobWZwLT5zdHJfbm9ybSwgdHApOworfQorI2VuZGlmIC8qIFRFUk1DQVBfQVZBSUxBQkxFICovCisKK3N0YXRpYyBpbnQKK2luaXRfY29uc29sZShDb25zb2xlX0lPX3QgKiBjb25zdCBtZnApCit7CisgICAgLyogc2V0dXAgYmFzaWNzIG9mIGJyaGlzdCBJL08gY2hhbm5lbHMgKi8KKyAgICBtZnAtPmRpc3Bfd2lkdGggPSA4MDsKKyAgICBtZnAtPmRpc3BfaGVpZ2h0ID0gMjU7CisgICAgbWZwLT5Db25zb2xlX2ZwID0gc3RkZXJyOworICAgIG1mcC0+RXJyb3JfZnAgPSBzdGRlcnI7CisgICAgbWZwLT5SZXBvcnRfZnAgPSBOVUxMOworCisgICAgLyptZnAgLT4gQ29uc29sZV9idWZmID0gY2FsbG9jICggMSwgUkVQT1JUX0JVRkZfU0laRSApOyAqLworICAgIHNldHZidWYobWZwLT5Db25zb2xlX2ZwLCBtZnAtPkNvbnNvbGVfYnVmZiwgX0lPRkJGLCBzaXplb2YobWZwLT5Db25zb2xlX2J1ZmYpKTsKKy8qICBzZXR2YnVmICggbWZwIC0+IEVycm9yX2ZwICAsIE5VTEwgICAgICAgICAgICAgICAgICAgLCBfSU9OQkYsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7ICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgICYmICAhZGVmaW5lZChfX0NZR1dJTl9fKQorICAgIG1mcC0+Q29uc29sZV9IYW5kbGUgPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisjZW5kaWYKKworICAgIHN0cmNweShtZnAtPnN0cl91cCwgIlwwMzNbQSIpOworCisjaWZkZWYgSEFWRV9URVJNQ0FQCisgICAgYXBwbHlfdGVybWNhcF9zZXR0aW5ncyhtZnApOworI2VuZGlmIC8qIFRFUk1DQVBfQVZBSUxBQkxFICovCisKKyAgICBtZnAtPkNsYXNzSUQgPSBDTEFTU19JRDsKKworI2lmIGRlZmluZWQoX1dJTjMyKSAgJiYgICFkZWZpbmVkKF9fQ1lHV0lOX18pCisgICAgbWZwLT5Db25zb2xlX2ZpbGVfdHlwZSA9IEdldEZpbGVUeXBlKENvbnNvbGVfSU8uQ29uc29sZV9IYW5kbGUpOworI2Vsc2UKKyAgICBtZnAtPkNvbnNvbGVfZmlsZV90eXBlID0gMDsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGVpbml0X2NvbnNvbGUoQ29uc29sZV9JT190ICogY29uc3QgbWZwKQoreworICAgIGlmIChtZnAtPlJlcG9ydF9mcCAhPSBOVUxMKSB7CisgICAgICAgIGZjbG9zZShtZnAtPlJlcG9ydF9mcCk7CisgICAgICAgIG1mcC0+UmVwb3J0X2ZwID0gTlVMTDsKKyAgICB9CisgICAgZmZsdXNoKG1mcC0+Q29uc29sZV9mcCk7CisgICAgc2V0dmJ1ZihtZnAtPkNvbnNvbGVfZnAsIE5VTEwsIF9JT05CRiwgKHNpemVfdCkgMCk7CisKKyAgICBtZW1zZXQobWZwLT5Db25zb2xlX2J1ZmYsIDB4NTUsIFJFUE9SVF9CVUZGX1NJWkUpOworfQorCisKKy8qICBMQU1FIGNvbnNvbGUKKyAqLworQ29uc29sZV9JT190IENvbnNvbGVfSU87CisKK2ludAorZnJvbnRlbmRfb3Blbl9jb25zb2xlKHZvaWQpCit7CisgICAgcmV0dXJuIGluaXRfY29uc29sZSgmQ29uc29sZV9JTyk7Cit9CisKK3ZvaWQKK2Zyb250ZW5kX2Nsb3NlX2NvbnNvbGUodm9pZCkKK3sKKyAgICBkZWluaXRfY29uc29sZSgmQ29uc29sZV9JTyk7Cit9CisKK3ZvaWQKK2Zyb250ZW5kX2RlYnVnZihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgKHZvaWQpIG15X3JlcG9ydF9wcmludGluZyhDb25zb2xlX0lPLlJlcG9ydF9mcCwgZm9ybWF0LCBhcCk7Cit9CisKK3ZvaWQKK2Zyb250ZW5kX21zZ2YoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgICh2b2lkKSBteV9jb25zb2xlX3ByaW50aW5nKENvbnNvbGVfSU8uQ29uc29sZV9mcCwgZm9ybWF0LCBhcCk7Cit9CisKK3ZvaWQKK2Zyb250ZW5kX2Vycm9yZihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgKHZvaWQpIG15X2Vycm9yX3ByaW50aW5nKENvbnNvbGVfSU8uRXJyb3JfZnAsIGZvcm1hdCwgYXApOworfQorCitpbnQKK2NvbnNvbGVfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgICAgIHJldDsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgcmV0ID0gbXlfY29uc29sZV9wcmludGluZyhDb25zb2xlX0lPLkNvbnNvbGVfZnAsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50CitlcnJvcl9wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCAgICAgcmV0OworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICByZXQgPSBteV9jb25zb2xlX3ByaW50aW5nKENvbnNvbGVfSU8uRXJyb3JfZnAsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50CityZXBvcnRfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgICAgIHJldDsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgcmV0ID0gbXlfY29uc29sZV9wcmludGluZyhDb25zb2xlX0lPLlJlcG9ydF9mcCwgZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkCitjb25zb2xlX2ZsdXNoKCkKK3sKKyAgICBmZmx1c2goQ29uc29sZV9JTy5Db25zb2xlX2ZwKTsKK30KKwordm9pZAorZXJyb3JfZmx1c2goKQoreworICAgIGZmbHVzaChDb25zb2xlX0lPLkVycm9yX2ZwKTsKK30KKwordm9pZAorcmVwb3J0X2ZsdXNoKCkKK3sKKyAgICBmZmx1c2goQ29uc29sZV9JTy5SZXBvcnRfZnApOworfQorCit2b2lkCitjb25zb2xlX3VwKGludCBuX2xpbmVzKQoreworI2lmIGRlZmluZWQoX1dJTjMyKSAgJiYgICFkZWZpbmVkKF9fQ1lHV0lOX18pCisgICAgaWYgKENvbnNvbGVfSU8uQ29uc29sZV9maWxlX3R5cGUgIT0gRklMRV9UWVBFX1BJUEUpIHsKKyAgICAgICAgQ09PUkQgICBQb3M7CisgICAgICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIENTQkk7CisKKyAgICAgICAgY29uc29sZV9mbHVzaCgpOworICAgICAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhDb25zb2xlX0lPLkNvbnNvbGVfSGFuZGxlLCAmQ1NCSSk7CisgICAgICAgIFBvcy5ZID0gQ1NCSS5kd0N1cnNvclBvc2l0aW9uLlkgLSBuX2xpbmVzOworICAgICAgICBQb3MuWCA9IDA7CisgICAgICAgIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihDb25zb2xlX0lPLkNvbnNvbGVfSGFuZGxlLCBQb3MpOworICAgIH0KKyNlbHNlCisgICAgd2hpbGUgKG5fbGluZXMtLSA+IDApCisgICAgICAgIGZwdXRzKENvbnNvbGVfSU8uc3RyX3VwLCBDb25zb2xlX0lPLkNvbnNvbGVfZnApOworICAgIGNvbnNvbGVfZmx1c2goKTsKKyNlbmRpZgorfQorCisKK3ZvaWQKK3NldF9kZWJ1Z19maWxlKGNvbnN0IGNoYXIgKmZuKQoreworICAgIGlmIChDb25zb2xlX0lPLlJlcG9ydF9mcCA9PSBOVUxMKSB7CisgICAgICAgIENvbnNvbGVfSU8uUmVwb3J0X2ZwID0gZm9wZW4oZm4sICJhIik7CisgICAgICAgIGlmIChDb25zb2xlX0lPLlJlcG9ydF9mcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIndyaXRpbmcgZGVidWcgaW5mbyBpbnRvOiAlc1xuIiwgZm4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvcjogY2FuJ3Qgb3BlbiBmb3IgZGVidWcgaW5mbzogJXNcbiIsIGZuKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogZW5kIG9mIGNvbnNvbGUuYyAqLwpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvY29uc29sZS5oIGIvZnJvbnRlbmQvY29uc29sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjhmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9jb25zb2xlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIGZyb250ZW5kL2NvbnNvbGUuaAorICoKKyAqIFRoaXMKKyAqCisgKgorICovCisKKyNpZm5kZWYgTEFNRV9DT05TT0xFX0gKKyNkZWZpbmUgTEFNRV9DT05TT0xFX0gKKworI2lmIGRlZmluZWQoX1dJTjMyKSAgJiYgICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyBDbGFzc0lEOworICAgIHVuc2lnbmVkIGxvbmcgQ2xhc3NQcm90OworICAgIEZJTEUgICAqQ29uc29sZV9mcDsgICAgICAvKiBmaWxlcG9pbnRlciB0byBzdHJlYW0gcmVwb3J0aW5nIGluZm9ybWF0aW9uICovCisgICAgRklMRSAgICpFcnJvcl9mcDsgICAgICAgIC8qIGZpbGVwb2ludGVyIHRvIHN0cmVhbSBmYXRhbCBlcnJvciByZXBvcnRpbmcgaW5mb3JtYXRpb24gKi8KKyAgICBGSUxFICAgKlJlcG9ydF9mcDsgICAgICAgLyogZmlsZXBvaW50ZXIgdG8gc3RyZWFtIHJlcG9ydHMgKG5vcm1hbGx5IGEgdGV4dCBmaWxlIG9yIC9kZXYvbnVsbCkgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgICYmICAhZGVmaW5lZChfX0NZR1dJTl9fKQorICAgIEhBTkRMRSAgQ29uc29sZV9IYW5kbGU7CisjZW5kaWYKKyAgICBpbnQgICAgIGRpc3Bfd2lkdGg7CisgICAgaW50ICAgICBkaXNwX2hlaWdodDsKKyAgICBjaGFyICAgIHN0cl91cFsxMF07CisgICAgY2hhciAgICBzdHJfY2xyZW9sblsxMF07CisgICAgY2hhciAgICBzdHJfZW1waFsxMF07CisgICAgY2hhciAgICBzdHJfbm9ybVsxMF07CisgICAgY2hhciAgICBDb25zb2xlX2J1ZmZbMjA0OF07CisgICAgaW50ICAgICBDb25zb2xlX2ZpbGVfdHlwZTsKK30gQ29uc29sZV9JT190OworCitleHRlcm4gQ29uc29sZV9JT190IENvbnNvbGVfSU87CitleHRlcm4gaW50IGZyb250ZW5kX29wZW5fY29uc29sZSh2b2lkKTsKK2V4dGVybiB2b2lkIGZyb250ZW5kX2Nsb3NlX2NvbnNvbGUodm9pZCk7CisKK2V4dGVybiB2b2lkIGZyb250ZW5kX21zZ2YoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKK2V4dGVybiB2b2lkIGZyb250ZW5kX2RlYnVnZihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworZXh0ZXJuIHZvaWQgZnJvbnRlbmRfZXJyb3JmKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisKK2ludCAgICAgY29uc29sZV9wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworaW50ICAgICBlcnJvcl9wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworaW50ICAgICByZXBvcnRfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKwordm9pZCAgICBjb25zb2xlX2ZsdXNoKHZvaWQpOwordm9pZCAgICBlcnJvcl9mbHVzaCh2b2lkKTsKK3ZvaWQgICAgcmVwb3J0X2ZsdXNoKHZvaWQpOworCit2b2lkICAgIGNvbnNvbGVfdXAoaW50IG5fbGluZXMpOworCit2b2lkICAgIHNldF9kZWJ1Z19maWxlKGNvbnN0IGNoYXIgKmZuKTsKKworI2VuZGlmIC8qIExBTUVfQ09OU09MRV9IICovCisKKy8qIGVuZCBvZiBjb25zb2xlLmggKi8KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL2RlcGNvbXAgYi9mcm9udGVuZC9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0NzAxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9kZXBjb21wCkBAIC0wLDAgKzEsNTMwIEBACisjISAvYmluL3NoCisjIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKKworc2NyaXB0dmVyc2lvbj0yMDA1LTA3LTA5LjExCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+LgorCitjYXNlICQxIGluCisgICcnKQorICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgICAgIGV4aXQgMTsKKyAgICAgOzsKKyAgLWggfCAtLWgqKQorICAgIGNhdCA8PFxFT0YKK1VzYWdlOiBkZXBjb21wIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCisKK1J1biBQUk9HUkFNUyBBUkdTIHRvIGNvbXBpbGUgYSBmaWxlLCBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcworYXMgc2lkZS1lZmZlY3RzLgorCitFbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIGRlcG1vZGUgICAgIERlcGVuZGVuY3kgdHJhY2tpbmcgbW9kZS4KKyAgc291cmNlICAgICAgU291cmNlIGZpbGUgcmVhZCBieSBgUFJPR1JBTVMgQVJHUycuCisgIG9iamVjdCAgICAgIE9iamVjdCBmaWxlIG91dHB1dCBieSBgUFJPR1JBTVMgQVJHUycuCisgIERFUERJUiAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSBkZXBlbmRlbmNpZXMuCisgIGRlcGZpbGUgICAgIERlcGVuZGVuY3kgZmlsZSB0byBvdXRwdXQuCisgIHRtcGRlcGZpbGUgIFRlbXBvcmFyeSBmaWxlIHRvIHVzZSB3aGVuIG91dHB1dGluZyBkZXBlbmRlbmNpZXMuCisgIGxpYnRvb2wgICAgIFdoZXRoZXIgbGlidG9vbCBpcyB1c2VkICh5ZXMvbm8pLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgorRU9GCisgICAgZXhpdCAkPworICAgIDs7CisgIC12IHwgLS12KikKKyAgICBlY2hvICJkZXBjb21wICRzY3JpcHR2ZXJzaW9uIgorICAgIGV4aXQgJD8KKyAgICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KKyAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCitkZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAorICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KK3RtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9CisKK3JtIC1mICIkdG1wZGVwZmlsZSIKKworIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCisjIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAorIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQorIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCisgICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgorICBnY2NmbGFnPS1NCisgIGRlcG1vZGU9Z2NjCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KKyAgIGRhc2htZmxhZz0teE0KKyAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKK2ZpCisKK2Nhc2UgIiRkZXBtb2RlIiBpbgorZ2NjMykKKyMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0CisjIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQorIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgorICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCisjIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKKyMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCisjIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCisjIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQorIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKKyMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgorIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQorIyMgICB0aGFuIHJlbmFtaW5nKS4KKyAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCisgICAgZ2NjZmxhZz0tTUQsCisgIGZpCisgICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisjIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCisgIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAorICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCisjIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQorIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCisjIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZworIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbworIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8CisjIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKKyMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcworIyMgd2VsbC4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcworICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKKyAgICB0ciAnCisnICcgJyA+PiAkZGVwZmlsZQorICAgIGVjaG8gPj4gJGRlcGZpbGUKKworICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAorICAgPj4gJGRlcGZpbGUKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2FpeCkKKyAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcworICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQorICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCisgICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgorICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKKyAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICIkQCIgLVdjLC1NCisgIGVsc2UKKyAgICAiJEAiIC1NCisgIGZpCisgIHN0YXQ9JD8KKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgorICBlbHNlCisgICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKKyAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKKyAgZmkKKworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCisgICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCisgICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2ljYykKKyAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCisgICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYworICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jCisgICMgICAgZm9vLm86IHN1Yi9mb28uaAorICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYworICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCisgICMgICAgc3ViL2Zvby5jOgorICAjICAgIHN1Yi9mb28uaDoKKyAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKKyAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAorICAjICAgICBzdWIvZm9vLmggLi4uIFwKKyAgIyAgICAgLi4uCisKKyAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCisgICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCisgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisgICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8CisgICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKwordHJ1NjQpCisgICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCisgICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCisgICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0CisgICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KKyAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KKyAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCisgICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKworICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGggVHJ1NjQgY2MsIHNoYXJlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFrZSBhCisgICAgICAjIHN0YXRpYyBsaWJyYXJ5LiAgVGhpcyBtZWNhbmlzbSBpcyB1c2VkIGluIGxpYnRvb2wgMS40IHNlcmllcyB0bworICAgICAgIyBoYW5kbGUgYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJpZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24uCisgICAgICAjIFdpdGggbGlidG9vbCAxLjQsIGRlcGVuZGVuY2llcyB3ZXJlIG91dHB1dCBpbiAkZGlyLmxpYnMvJGJhc2UubG8uZC4KKyAgICAgICMKKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNSB0aGlzIGV4Y2VwdGlvbiB3YXMgcmVtb3ZlZCwgYW5kIGxpYnRvb2wgbm93CisgICAgICAjIGdlbmVyYXRlcyAyIHNlcGFyYXRlIG9iamVjdHMgZm9yIHRoZSAyIGxpYnJhcmllcy4gIFRoZXNlIHR3bworICAgICAgIyBjb21waWxhdGlvbnMgb3V0cHV0IGRlcGVuZGVuY2llcyBpbiBpbiAkZGlyLmxpYnMvJGJhc2Uuby5kIGFuZAorICAgICAgIyBpbiAkZGlyJGJhc2Uuby5kLiAgV2UgaGF2ZSB0byBjaGVjayBmb3IgYm90aCBmaWxlcywgYmVjYXVzZQorICAgICAgIyBvbmUgb2YgdGhlIHR3byBjb21waWxhdGlvbnMgY2FuIGJlIGRpc2FibGVkLiAgV2Ugc2hvdWxkIHByZWZlcgorICAgICAgIyAkZGlyJGJhc2Uuby5kIG92ZXIgJGRpci5saWJzLyRiYXNlLm8uZCBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMKKyAgICAgICMgYXV0b21hdGljYWxseSBjbGVhbmVkIHdoZW4gLmxpYnMvIGlzIGRlbGV0ZWQsIHdoaWxlIGlnbm9yaW5nCisgICAgICAjIHRoZSBmb3JtZXIgd291bGQgY2F1c2UgYSBkaXN0Y2xlYW5jaGVjayBwYW5pYy4KKyAgICAgIHRtcGRlcGZpbGUxPSRkaXIubGlicy8kYmFzZS5sby5kICAgIyBsaWJ0b29sIDEuNAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLm8uZCAgICAgICAgICAjIGxpYnRvb2wgMS41CisgICAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2Uuby5kICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGU0PSRkaXIubGlicy8kYmFzZS5kICAgICAgIyBDb21wYXEgQ0NDIFY2LjItNTA0CisgICAgICAiJEAiIC1XYywtTUQKKyAgIGVsc2UKKyAgICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS5vLmQKKyAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UuZAorICAgICAgdG1wZGVwZmlsZTQ9JGRpciRiYXNlLmQKKyAgICAgICIkQCIgLU1ECisgICBmaQorCisgICBzdGF0PSQ/CisgICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgIGVsc2UKKyAgICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICAgICBleGl0ICRzdGF0CisgICBmaQorCisgICBmb3IgdG1wZGVwZmlsZSBpbiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgorICAgZG8KKyAgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgICBkb25lCisgICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICAgIHNlZCAtZSAicyxeLipcLlthLXpdKjosJG9iamVjdDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCisgICAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WwkgXSosLCcgLWUgJ3MsJCw6LCcgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgIGVsc2UKKyAgICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgICBmaQorICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgOzsKKworI25vc2lkZWVmZmVjdCkKKyAgIyBUaGlzIGNvbW1lbnQgYWJvdmUgaXMgdXNlZCBieSBhdXRvbWFrZSB0byB0ZWxsIHNpZGUtZWZmZWN0CisgICMgZGVwZW5kZW5jeSB0cmFja2luZyBtZWNoYW5pc21zIGZyb20gc2xvd2VyIG9uZXMuCisKK2Rhc2htc3Rkb3V0KQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dCwgcmVnYXJkbGVzcyBvZiAtby4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICB0ZXN0IC16ICIkZGFzaG1mbGFnIiAmJiBkYXNobWZsYWc9LU0KKyAgIyBSZXF1aXJlIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGA6JworICAjIGluIHRoZSB0YXJnZXQgbmFtZS4gIFRoaXMgaXMgdG8gY29wZSB3aXRoIERPUy1zdHlsZSBmaWxlbmFtZXM6CisgICMgYSBkZXBlbmRlbmN5IHN1Y2ggYXMgYGM6L2Zvby9iYXInIGNvdWxkIGJlIHNlZW4gYXMgdGFyZ2V0IGBjJyBvdGhlcndpc2UuCisgICIkQCIgJGRhc2htZmxhZyB8CisgICAgc2VkICdzOl5bICBdKlteOiBdW146XVteOl0qXDpbICAgIF0qOiciJG9iamVjdCInXDogOicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworZGFzaFhtc3Rkb3V0KQorICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5CisgICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgorICBleGl0IDEKKyAgOzsKKworbWFrZWRlcGVuZCkKKyAgIiRAIiB8fCBleGl0ICQ/CisgICMgUmVtb3ZlIGFueSBMaWJ0b29sIGNhbGwKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKyAgIyBYIG1ha2VkZXBlbmQKKyAgc2hpZnQKKyAgY2xlYXJlZD1ubworICBmb3IgYXJnIGluICIkQCI7IGRvCisgICAgY2FzZSAkY2xlYXJlZCBpbgorICAgIG5vKQorICAgICAgc2V0ICIiOyBzaGlmdAorICAgICAgY2xlYXJlZD15ZXMgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAtRCp8LUkqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgICMgU3RyaXAgYW55IG9wdGlvbiB0aGF0IG1ha2VkZXBlbmQgbWF5IG5vdCB1bmRlcnN0YW5kLiAgUmVtb3ZlCisgICAgIyB0aGUgb2JqZWN0IHRvbywgb3RoZXJ3aXNlIG1ha2VkZXBlbmQgd2lsbCBwYXJzZSBpdCBhcyBhIHNvdXJjZSBmaWxlLgorICAgIC0qfCRvYmplY3QpCisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgZXNhYworICBkb25lCisgIG9ial9zdWZmaXg9ImBlY2hvICRvYmplY3QgfCBzZWQgJ3MvXi4qXC4vLi8nYCIKKyAgdG91Y2ggIiR0bXBkZXBmaWxlIgorICAke01BS0VERVBFTkQtbWFrZWRlcGVuZH0gLW8iJG9ial9zdWZmaXgiIC1mIiR0bXBkZXBmaWxlIiAiJEAiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgc2VkICcxLDJkJyAiJHRtcGRlcGZpbGUiIHwgdHIgJyAnICcKKycgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIiAiJHRtcGRlcGZpbGUiLmJhaworICA7OworCitjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICIkQCIgLUUgfAorICAgIHNlZCAtbiAtZSAnL14jIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyBcCisgICAgICAgLWUgJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIHwKKyAgICBzZWQgJyQgczogXFwkOjonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICBzZWQgPCAiJHRtcGRlcGZpbGUiICcvXiQvZDtzL14gLy87cy8gXFwkLy87cy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK21zdmlzdWFsY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dCwgcmVnYXJkbGVzcyBvZiAtbywKKyAgIyBiZWNhdXNlIHdlIG11c3QgdXNlIC1vIHdoZW4gcnVubmluZyBsaWJ0b29sLgorICAiJEAiIHx8IGV4aXQgJD8KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAiLUdtInwiL0dtInwiLUdpInwiL0dpInwiLVpJInwiL1pJIikKKwlzZXQgZm5vcmQgIiRAIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgICopCisJc2V0IGZub3JkICIkQCIgIiRhcmciCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgZXNhYworICBkb25lCisgICIkQCIgLUUgfAorICBzZWQgLW4gJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIvIHM6OmVjaG8gImBjeWdwYXRoIC11IFxcIlwxXFwiYCI6cCcgfCBzb3J0IHwgdW5pcSA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICAuICIkdG1wZGVwZmlsZSIgfCBzZWQgJ3MlICVcXCAlZycgfCBzZWQgLW4gJy9eXCguKlwpJC8gczo6CVwxIFxcOnAnID4+ICIkZGVwZmlsZSIKKyAgZWNobyAiCSIgPj4gIiRkZXBmaWxlIgorICAuICIkdG1wZGVwZmlsZSIgfCBzZWQgJ3MlICVcXCAlZycgfCBzZWQgLW4gJy9eXCguKlwpJC8gczo6XDFcOjpwJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbm9uZSkKKyAgZXhlYyAiJEAiCisgIDs7CisKKyopCisgIGVjaG8gIlVua25vd24gZGVwbW9kZSAkZGVwbW9kZSIgMT4mMgorICBleGl0IDEKKyAgOzsKK2VzYWMKKworZXhpdCAwCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL2dldF9hdWRpby5jIGIvZnJvbnRlbmQvZ2V0X2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiZjNiZgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL2dldF9hdWRpby5jCkBAIC0wLDAgKzEsMTgwNiBAQAorLyoKKyAqCUdldCBBdWRpbyByb3V0aW5lcyBzb3VyY2UgZmlsZQorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OSBBbGJlcnQgTCBGYWJlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IGdldF9hdWRpby5jLHYgMS4xMjUuMi4yIDIwMDkvMDEvMTggMTU6NDQ6Mjggcm9iZXJ0IEV4cCAkICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZkZWYgSEFWRV9MSU1JVFNfSAorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpZm5kZWYgSEFWRV9TVFJDSFIKKyMgIGRlZmluZSBzdHJjaHIgaW5kZXgKKyMgIGRlZmluZSBzdHJyY2hyIHJpbmRleAorIyBlbmRpZgorY2hhciAgICpzdHJjaHIoKSwgKnN0cnJjaHIoKTsKKyMgaWZuZGVmIEhBVkVfTUVNQ1BZCisjICBkZWZpbmUgbWVtY3B5KGQsIHMsIG4pIGJjb3B5ICgocyksIChkKSwgKG4pKQorIyAgZGVmaW5lIG1lbW1vdmUoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjIGVuZGlmCisjZW5kaWYKKworCisjZGVmaW5lICAgICAgICAgTUFYX1VfMzJfTlVNICAgICAgICAgICAgMHhGRkZGRkZGRgorCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmZGVmIF9fc3VuX18KKy8qIHdvcmFyb3VuZCBmb3IgU3VuT1MgNC54LCBpdCBoYXMgU0VFS18qIGRlZmluZWQgaGVyZSAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImdldF9hdWRpby5oIgorI2luY2x1ZGUgInBvcnRhYmxlaW8uaCIKKyNpbmNsdWRlICJ0aW1lc3RhdHVzLmgiCisjaW5jbHVkZSAibGFtZXRpbWUuaCIKKyNpbmNsdWRlICJjb25zb2xlLmgiCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKworCisvKiBnbG9iYWwgZGF0YSBmb3IgZ2V0X2F1ZGlvLmMuICovCit0eXBlZGVmIHN0cnVjdCBnZXRfYXVkaW9fZ2xvYmFsX2RhdGEgeworICAgIGludCAgICAgY291bnRfc2FtcGxlc19jYXJlZnVsbHk7CisgICAgaW50ICAgICBwY21iaXR3aWR0aDsKKyAgICBpbnQgICAgIHBjbXN3YXBieXRlczsKKyAgICBpbnQgICAgIHBjbV9pc191bnNpZ25lZF84Yml0OworICAgIHVuc2lnbmVkIGludCBudW1fc2FtcGxlc19yZWFkOworICAgIEZJTEUgICAqbXVzaWNpbjsKKyAgICBoaXBfdCAgIGhpcDsKK30gZ2V0X2F1ZGlvX2dsb2JhbF9kYXRhOworCitzdGF0aWMgZ2V0X2F1ZGlvX2dsb2JhbF9kYXRhIGdsb2JhbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisKKworI2lmZGVmIEFNSUdBX01QRUdBCitpbnQgICAgIGxhbWVfZGVjb2RlX2luaXRmaWxlKGNvbnN0IGNoYXIgKmZ1bGxuYW1lLCBtcDNkYXRhX3N0cnVjdCAqIGNvbnN0IG1wM2RhdGEpOworI2Vsc2UKK2ludCAgICAgbGFtZV9kZWNvZGVfaW5pdGZpbGUoRklMRSAqIGZkLCBtcDNkYXRhX3N0cnVjdCAqIG1wM2RhdGEsIGludCAqZW5jX2RlbGF5LCBpbnQgKmVuY19wYWRkaW5nKTsKKyNlbmRpZgorCisvKiByZWFkIG1wMyBmaWxlIHVudGlsIG1wZ2xpYiByZXR1cm5zIG9uZSBmcmFtZSBvZiBQQ00gZGF0YSAqLworaW50ICAgICBsYW1lX2RlY29kZV9mcm9tZmlsZShGSUxFICogZmQsIHNob3J0IGludCBwY21fbFtdLCBzaG9ydCBpbnQgcGNtX3JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAzZGF0YV9zdHJ1Y3QgKiBtcDNkYXRhKTsKKworCitzdGF0aWMgaW50IHJlYWRfc2FtcGxlc19wY20oRklMRSAqIG11c2ljaW4sIGludCBzYW1wbGVfYnVmZmVyWzIzMDRdLCBpbnQgc2FtcGxlc190b19yZWFkKTsKK3N0YXRpYyBpbnQgcmVhZF9zYW1wbGVzX21wMyhsYW1lX2dsb2JhbF9mbGFncyAqIGNvbnN0IGdmcCwgRklMRSAqIGNvbnN0IG11c2ljaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgaW50IG1wZzEyM3BjbVsyXVsxMTUyXSk7Cit2b2lkICAgIENsb3NlU25kRmlsZShzb3VuZF9maWxlX2Zvcm1hdCBpbnB1dCwgRklMRSAqIG11c2ljaW4pOworRklMRSAgICpPcGVuU25kRmlsZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgY2hhciAqLCBpbnQgKmVuY19kZWxheSwgaW50ICplbmNfcGFkZGluZyk7CisKKworc3RhdGljICBzaXplX3QKK21pbl9zaXplX3Qoc2l6ZV90IGEsIHNpemVfdCBiKQoreworICAgIGlmIChhIDwgYikgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgcmV0dXJuIGI7Cit9CisKK2VudW0gQnl0ZU9yZGVyIG1hY2hpbmVfYnl0ZV9vcmRlcih2b2lkKTsKKworZW51bSBCeXRlT3JkZXIKK21hY2hpbmVfYnl0ZV9vcmRlcih2b2lkKQoreworICAgIGxvbmcgb25lPSAxOworICAgIHJldHVybiAhKCooKGNoYXIgKikoJm9uZSkpKSA/IEJ5dGVPcmRlckJpZ0VuZGlhbiA6IEJ5dGVPcmRlckxpdHRsZUVuZGlhbjsKK30KKworCisKKy8qIFJlcGxhY2VtZW50IGZvciBmb3J3YXJkIGZzZWVrKCwsU0VFS19DVVIpLCBiZWNhdXNlIGZzZWVrKCkgZmFpbHMgb24gcGlwZXMgKi8KKworCitzdGF0aWMgaW50Citmc2tpcChGSUxFICogZnAsIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworI2lmbmRlZiBQSVBFX0JVRgorICAgIGNoYXIgICAgYnVmZmVyWzQwOTZdOworI2Vsc2UKKyAgICBjaGFyICAgIGJ1ZmZlcltQSVBFX0JVRl07CisjZW5kaWYKKworLyogU19JU0ZJRk8gbWFjcm8gaXMgZGVmaW5lZCBvbiBuZXdlciBMaW51eGVzICovCisjaWZuZGVmIFNfSVNGSUZPCisjIGlmZGVmIF9TX0lGSUZPCisgICAgLyogX1NfSUZJRk8gaXMgZGVmaW5lZCBvbiBXaW4zMiBhbmQgQ3lnd2luICovCisjICBkZWZpbmUJU19JU0ZJRk8obSkJKCgobSkmX1NfSUZJRk8pID09IF9TX0lGSUZPKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBTX0lTRklGTworICAgIC8qIGZzZWVrIGlzIGtub3duIHRvIGZhaWwgb24gcGlwZXMgd2l0aCBzZXZlcmFsIEMtTGlicmFyeSBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICB3b3JrYXJvdW5kOiAxKSB0ZXN0IGZvciBwaXBlCisgICAgICAgMikgZm9yIHBpcGVzLCBvbmx5IHJlbGF0dmllIHNlZWtpbmcgaXMgcG9zc2libGUKKyAgICAgICAzKSAgICAgICAgICAgIGFuZCBvbmx5IGluIGZvcndhcmQgZGlyZWN0aW9uIQorICAgICAgIGVsc2UgZmFsbGJhY2sgdG8gb2xkIGNvZGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIGludCBjb25zdCBmZCA9IGZpbGVubyhmcCk7CisgICAgICAgIHN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKKworICAgICAgICBpZiAoZnN0YXQoZmQsICZmaWxlX3N0YXQpID09IDApIHsKKyAgICAgICAgICAgIGlmIChTX0lTRklGTyhmaWxlX3N0YXQuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hlbmNlICE9IFNFRUtfQ1VSIHx8IG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29uc3QgYnl0ZXNfdG9fc2tpcCA9IG1pbl9zaXplX3Qoc2l6ZW9mKGJ1ZmZlciksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb25zdCByZWFkID0gZnJlYWQoYnVmZmVyLCAxLCBieXRlc190b19za2lwLCBmcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSByZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIGlmICgwID09IGZzZWVrKGZwLCBvZmZzZXQsIHdoZW5jZSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHdoZW5jZSAhPSBTRUVLX0NVUiB8fCBvZmZzZXQgPCAwKSB7CisgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgZXJyb3JfcHJpbnRmCisgICAgICAgICAgICAgICAgKCJmc2tpcCBwcm9ibGVtOiBNb3N0bHkgdGhlIHJldHVybiBzdGF0dXMgb2YgZnVuY3Rpb25zIGlzIG5vdCBldmFsdWF0ZSBzbyBpdCBpcyBtb3JlIHNlY3VyZSB0byBwb2x1dGUgPHN0ZGVycj4uXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgd2hpbGUgKG9mZnNldCA+IDApIHsKKyAgICAgICAgc2l6ZV90IGNvbnN0IGJ5dGVzX3RvX3NraXAgPSBtaW5fc2l6ZV90KHNpemVvZihidWZmZXIpLCBvZmZzZXQpOworICAgICAgICBzaXplX3QgY29uc3QgcmVhZCA9IGZyZWFkKGJ1ZmZlciwgMSwgYnl0ZXNfdG9fc2tpcCwgZnApOworICAgICAgICBpZiAocmVhZCA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgLT0gcmVhZDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitGSUxFICAgKgoraW5pdF9vdXRmaWxlKGNoYXIgKm91dFBhdGgsIGludCBkZWNvZGUpCit7CisgICAgRklMRSAgICpvdXRmOworI2lmZGVmIF9fcmlzY29zX18KKyAgICBjaGFyICAgKnA7CisjZW5kaWYKKworICAgIC8qIG9wZW4gdGhlIG91dHB1dCBmaWxlICovCisgICAgaWYgKDAgPT0gc3RyY21wKG91dFBhdGgsICItIikpIHsKKyAgICAgICAgbGFtZV9zZXRfc3RyZWFtX2JpbmFyeV9tb2RlKG91dGYgPSBzdGRvdXQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKChvdXRmID0gZm9wZW4ob3V0UGF0aCwgIncrYiIpKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgX19yaXNjb3NfXworICAgICAgICAvKiBBc3NpZ24gY29ycmVjdCBmaWxlIHR5cGUgKi8KKyAgICAgICAgZm9yIChwID0gb3V0UGF0aDsgKnA7IHArKykgLyogdWdseSwgdWdseSB0byBtb2RpZnkgYSBzdHJpbmcgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoKnApIHsKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgICpwID0gJy8nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgKnAgPSAnLic7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIFNldEZpbGV0eXBlKG91dFBhdGgsIGRlY29kZSA/IDB4RkIxIC8qV0FWKi8gOiAweDFBRCAvKkFNUEVHKi8pOworI2Vsc2UKKyAgICAgICAgKHZvaWQpIGRlY29kZTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gb3V0ZjsKK30KKworCisKKworCisKK3ZvaWQKK2luaXRfaW5maWxlKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBjaGFyICppblBhdGgsIGludCAqZW5jX2RlbGF5LCBpbnQgKmVuY19wYWRkaW5nKQoreworICAgIC8qIG9wZW4gdGhlIGlucHV0IGZpbGUgKi8KKyAgICBnbG9iYWwuIGNvdW50X3NhbXBsZXNfY2FyZWZ1bGx5ID0gMDsKKyAgICBnbG9iYWwuIG51bV9zYW1wbGVzX3JlYWQgPSAwOworICAgIGdsb2JhbC4gcGNtYml0d2lkdGggPSBpbl9iaXR3aWR0aDsKKyAgICBnbG9iYWwuIHBjbXN3YXBieXRlcyA9IHN3YXBieXRlczsKKyAgICBnbG9iYWwuIHBjbV9pc191bnNpZ25lZF84Yml0ID0gaW5fc2lnbmVkID09IDEgPyAwIDogMTsKKyAgICBnbG9iYWwuIG11c2ljaW4gPSBPcGVuU25kRmlsZShnZnAsIGluUGF0aCwgZW5jX2RlbGF5LCBlbmNfcGFkZGluZyk7Cit9CisKK3ZvaWQKK2Nsb3NlX2luZmlsZSh2b2lkKQoreworICAgIENsb3NlU25kRmlsZShpbnB1dF9mb3JtYXQsIGdsb2JhbC5tdXNpY2luKTsKK30KKworCit2b2lkCitTd2FwQnl0ZXNJbldvcmRzKHNob3J0ICpwdHIsIGludCBzaG9ydF93b3JkcykKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvbWUgc3BlZWR5IGNvZGUgKi8KKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBsb25nICpwID0gKHVuc2lnbmVkIGxvbmcgKikgcHRyOworCisjaWZuZGVmIGxpbnQKKyMgaWYgZGVmaW5lZChDSEFSX0JJVCkKKyMgIGlmIENIQVJfQklUICE9IDgKKyMgICBlcnJvciBDSEFSX0JJVCAhPSA4CisjICBlbmRpZgorIyBlbHNlCisjICBlcnJvciBjYW4gbm90IGRldGVybWluZSBudW1iZXIgb2YgYml0cyBpbiBhIGNoYXIKKyMgZW5kaWYKKyNlbmRpZiAvKiBsaW50ICovCisKKyAgICBhc3NlcnQoc2l6ZW9mKHNob3J0KSA9PSAyKTsKKworCisjaWYgZGVmaW5lZChTSVpFT0ZfVU5TSUdORURfTE9ORykgJiYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gNAorICAgIGZvciAoOyBzaG9ydF93b3JkcyA+PSAyOyBzaG9ydF93b3JkcyAtPSAyLCBwKyspIHsKKyAgICAgICAgdmFsID0gKnA7CisgICAgICAgICpwID0gKCh2YWwgPDwgOCkgJiAweEZGMDBGRjAwKSB8ICgodmFsID4+IDgpICYgMHgwMEZGMDBGRik7CisgICAgfQorICAgIHB0ciA9IChzaG9ydCAqKSBwOworICAgIGZvciAoOyBzaG9ydF93b3JkcyA+PSAxOyBzaG9ydF93b3JkcyAtPSAxLCBwdHIrKykgeworICAgICAgICB2YWwgPSAqcHRyOworICAgICAgICAqcHRyID0gKHNob3J0KSAoKCh2YWwgPDwgOCkgJiAweEZGMDApIHwgKCh2YWwgPj4gOCkgJiAweDAwRkYpKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFNJWkVPRl9VTlNJR05FRF9MT05HKSAmJiBTSVpFT0ZfVU5TSUdORURfTE9ORyA9PSA4CisgICAgZm9yICg7IHNob3J0X3dvcmRzID49IDQ7IHNob3J0X3dvcmRzIC09IDQsIHArKykgeworICAgICAgICB2YWwgPSAqcDsKKyAgICAgICAgKnAgPSAoKHZhbCA8PCA4KSAmIDB4RkYwMEZGMDBGRjAwRkYwMCkgfCAoKHZhbCA+PiA4KSAmIDB4MDBGRjAwRkYwMEZGMDBGRik7CisgICAgfQorICAgIHB0ciA9IChzaG9ydCAqKSBwOworICAgIGZvciAoOyBzaG9ydF93b3JkcyA+PSAxOyBzaG9ydF93b3JkcyAtPSAxLCBwdHIrKykgeworICAgICAgICB2YWwgPSAqcHRyOworICAgICAgICAqcHRyID0gKCh2YWwgPDwgOCkgJiAweEZGMDApIHwgKCh2YWwgPj4gOCkgJiAweDAwRkYpOworICAgIH0KKyNlbHNlCisjIGlmZGVmIFNJWkVPRl9VTlNJR05FRF9MT05HCisjICB3YXJuaW5nIFVzaW5nIHVub3B0aW1pemVkIFN3YXBCeXRlc0luV29yZHMoKS4KKyMgZW5kaWYKKyAgICBmb3IgKDsgc2hvcnRfd29yZHMgPj0gMTsgc2hvcnRfd29yZHMgLT0gMSwgcHRyKyspIHsKKyAgICAgICAgdmFsID0gKnB0cjsKKyAgICAgICAgKnB0ciA9ICgodmFsIDw8IDgpICYgMHhGRjAwKSB8ICgodmFsID4+IDgpICYgMHgwMEZGKTsKKyAgICB9CisjZW5kaWYKKworICAgIGFzc2VydChzaG9ydF93b3JkcyA9PSAwKTsKK30KKworCisKK3N0YXRpYyBpbnQKK2dldF9hdWRpb19jb21tb24obGFtZV9nbG9iYWxfZmxhZ3MgKiBjb25zdCBnZnAsCisgICAgICAgICAgICAgICAgIGludCBidWZmZXJbMl1bMTE1Ml0sIHNob3J0IGJ1ZmZlcjE2WzJdWzExNTJdKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBnZXRfYXVkaW8oKQorKgorKiBQVVJQT1NFOiAgcmVhZHMgYSBmcmFtZSBvZiBhdWRpbyBkYXRhIGZyb20gYSBmaWxlIHRvIHRoZSBidWZmZXIsCisqICAgYWxpZ25zIHRoZSBkYXRhIGZvciBmdXR1cmUgcHJvY2Vzc2luZywgYW5kIHNlcGFyYXRlcyB0aGUKKyogICBsZWZ0IGFuZCByaWdodCBjaGFubmVscworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitnZXRfYXVkaW8obGFtZV9nbG9iYWxfZmxhZ3MgKiBjb25zdCBnZnAsIGludCBidWZmZXJbMl1bMTE1Ml0pCit7CisgICAgcmV0dXJuIChnZXRfYXVkaW9fY29tbW9uKGdmcCwgYnVmZmVyLCBOVUxMKSk7Cit9CisKKy8qCisgIGdldF9hdWRpbzE2IC0gYmVoYXZlIGFzIHRoZSBvcmlnaW5hbCBnZXRfYXVkaW8gZnVuY3Rpb24sIHdpdGggYSBsaW1pdGVkCisgICAgICAgICAgICAgICAgMTYgYml0IHBlciBzYW1wbGUgb3V0cHV0CisqLworaW50CitnZXRfYXVkaW8xNihsYW1lX2dsb2JhbF9mbGFncyAqIGNvbnN0IGdmcCwgc2hvcnQgYnVmZmVyWzJdWzExNTJdKQoreworICAgIHJldHVybiAoZ2V0X2F1ZGlvX2NvbW1vbihnZnAsIE5VTEwsIGJ1ZmZlcikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGdldF9hdWRpb19jb21tb24gLSBjZW50cmFsIGZ1bmN0aW9uYWxpdHkgb2YgZ2V0X2F1ZGlvKgorICAgIGluOiBnZnAKKyAgICAgICAgYnVmZmVyICAgIG91dHB1dCB0byB0aGUgaW50IGJ1ZmZlciBvciAxNi1iaXQgYnVmZmVyCisgICBvdXQ6IGJ1ZmZlciAgICBpbnQgb3V0cHV0ICAgIChpZiBidWZmZXIgIT0gTlVMTCkKKyAgICAgICAgYnVmZmVyMTYgIDE2LWJpdCBvdXRwdXQgKGlmIGJ1ZmZlciA9PSBOVUxMKSAKK3JldHVybnM6IHNhbXBsZXMgcmVhZAorbm90ZTogZWl0aGVyIGJ1ZmZlciBvciBidWZmZXIxNiBtdXN0IGJlIGFsbG9jYXRlZCB1cG9uIGNhbGwKKyovCitzdGF0aWMgaW50CitnZXRfYXVkaW9fY29tbW9uKGxhbWVfZ2xvYmFsX2ZsYWdzICogY29uc3QgZ2ZwLCBpbnQgYnVmZmVyWzJdWzExNTJdLCBzaG9ydCBidWZmZXIxNlsyXVsxMTUyXSkKK3sKKyAgICBpbnQgICAgIG51bV9jaGFubmVscyA9IGxhbWVfZ2V0X251bV9jaGFubmVscyhnZnApOworICAgIGludCAgICAgaW5zYW1wWzIgKiAxMTUyXTsKKyAgICBzaG9ydCAgIGJ1Zl90bXAxNlsyXVsxMTUyXTsKKyAgICBpbnQgICAgIHNhbXBsZXNfcmVhZDsKKyAgICBpbnQgICAgIGZyYW1lc2l6ZTsKKyAgICBpbnQgICAgIHNhbXBsZXNfdG9fcmVhZDsKKyAgICB1bnNpZ25lZCBpbnQgcmVtYWluaW5nLCB0bXBfbnVtX3NhbXBsZXM7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAqcDsKKworICAgIC8qIAorICAgICAqIE5PVEU6IExBTUUgY2FuIG5vdyBoYW5kbGUgYXJicml0cmF5IHNpemUgaW5wdXQgZGF0YSBwYWNrZXRzLAorICAgICAqIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byByZWFkIHRoZSBpbnB1dCBkYXRhIGluIGNodW5ja3Mgb2YKKyAgICAgKiBzaXplICJmcmFtZXNpemUiLiAgRVhDRVBUOiAgdGhlIExBTUUgZ3JhcGhpY2FsIGZyYW1lIGFuYWx5emVyIAorICAgICAqIHdpbGwgZ2V0IG91dCBvZiBzeW5jIGlmIHdlIHJlYWQgbW9yZSB0aGFuIGZyYW1lc2l6ZSB3b3J0aCBvZiBkYXRhLgorICAgICAqLworCisgICAgc2FtcGxlc190b19yZWFkID0gZnJhbWVzaXplID0gbGFtZV9nZXRfZnJhbWVzaXplKGdmcCk7CisgICAgYXNzZXJ0KGZyYW1lc2l6ZSA8PSAxMTUyKTsKKworICAgIC8qIGdldCBudW1fc2FtcGxlcyAqLworICAgIHRtcF9udW1fc2FtcGxlcyA9IGxhbWVfZ2V0X251bV9zYW1wbGVzKGdmcCk7CisKKyAgICAvKiBpZiB0aGlzIGZsYWcgaGFzIGJlZW4gc2V0LCB0aGVuIHdlIGFyZSBjYXJlZnVsbCB0byByZWFkCisgICAgICogZXhhY3RseSBudW1fc2FtcGxlcyBhbmQgbm8gbW9yZS4gIFRoaXMgaXMgdXNlZnVsIGZvciAud2F2IGFuZCAuYWlmZgorICAgICAqIGZpbGVzIHdoaWNoIGhhdmUgaWQzIG9yIG90aGVyIHRhZ3MgYXQgdGhlIGVuZC4gIE5vdGUgdGhhdCBpZiB5b3UKKyAgICAgKiBhcmUgdXNpbmcgTElCU05ERklMRSwgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IAorICAgICAqLworICAgIGlmIChnbG9iYWwuY291bnRfc2FtcGxlc19jYXJlZnVsbHkpIHsKKyAgICAgICAgcmVtYWluaW5nID0gdG1wX251bV9zYW1wbGVzIC0gTWluKHRtcF9udW1fc2FtcGxlcywgZ2xvYmFsLm51bV9zYW1wbGVzX3JlYWQpOworICAgICAgICBpZiAocmVtYWluaW5nIDwgKHVuc2lnbmVkIGludCkgZnJhbWVzaXplICYmIDAgIT0gdG1wX251bV9zYW1wbGVzKQorICAgICAgICAgICAgLyogaW4gY2FzZSB0aGUgaW5wdXQgaXMgYSBGSUZPIChhdCBsZWFzdCBpdCdzIHJlcHJvZHVjaWJsZSB3aXRoCisgICAgICAgICAgICAgICBhIEZJRk8pIHRtcF9udW1fc2FtcGxlcyBtYXkgYmUgMCBhbmQgdGhlcmVmb3JlIHJlbWFpbmluZworICAgICAgICAgICAgICAgd291bGQgYmUgMCwgYnV0IHdlIG5lZWQgdG8gcmVhZCBzb21lIHNhbXBsZXMsIHNvIGRvbid0CisgICAgICAgICAgICAgICBjaGFuZ2Ugc2FtcGxlc190b19yZWFkIHRvIHRoZSB3cm9uZyB2YWx1ZSBpbiB0aGlzIGNhc2UgKi8KKyAgICAgICAgICAgIHNhbXBsZXNfdG9fcmVhZCA9IHJlbWFpbmluZzsKKyAgICB9CisKKyAgICBpZiAoaXNfbXBlZ19maWxlX2Zvcm1hdChpbnB1dF9mb3JtYXQpKSB7CisgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICAgICAgICAgIHNhbXBsZXNfcmVhZCA9IHJlYWRfc2FtcGxlc19tcDMoZ2ZwLCBnbG9iYWwubXVzaWNpbiwgYnVmX3RtcDE2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2FtcGxlc19yZWFkID0gcmVhZF9zYW1wbGVzX21wMyhnZnAsIGdsb2JhbC5tdXNpY2luLCBidWZmZXIxNik7CisgICAgICAgIGlmIChzYW1wbGVzX3JlYWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2FtcGxlc19yZWFkOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzYW1wbGVzX3JlYWQgPSByZWFkX3NhbXBsZXNfcGNtKGdsb2JhbC5tdXNpY2luLCBpbnNhbXAsIG51bV9jaGFubmVscyAqIHNhbXBsZXNfdG9fcmVhZCk7CisgICAgICAgIGlmIChzYW1wbGVzX3JlYWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2FtcGxlc19yZWFkOworICAgICAgICB9CisgICAgICAgIHAgPSBpbnNhbXAgKyBzYW1wbGVzX3JlYWQ7CisgICAgICAgIHNhbXBsZXNfcmVhZCAvPSBudW1fY2hhbm5lbHM7CisgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeyAvKiBvdXRwdXQgdG8gaW50IGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKG51bV9jaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gc2FtcGxlc19yZWFkOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyWzFdW2ldID0gKi0tcDsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyWzBdW2ldID0gKi0tcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChudW1fY2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgICAgICAgIG1lbXNldChidWZmZXJbMV0sIDAsIHNhbXBsZXNfcmVhZCAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBzYW1wbGVzX3JlYWQ7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJbMF1baV0gPSAqLS1wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7ICAgICAgICAgIC8qIGNvbnZlcnQgZnJvbSBpbnQ7IG91dHB1dCB0byAxNi1iaXQgYnVmZmVyICovCisgICAgICAgICAgICBpZiAobnVtX2NoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBzYW1wbGVzX3JlYWQ7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIxNlsxXVtpXSA9ICotLXAgPj4gKDggKiBzaXplb2YoaW50KSAtIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyMTZbMF1baV0gPSAqLS1wID4+ICg4ICogc2l6ZW9mKGludCkgLSAxNik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobnVtX2NoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyMTZbMV0sIDAsIHNhbXBsZXNfcmVhZCAqIHNpemVvZihzaG9ydCkpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IHNhbXBsZXNfcmVhZDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjE2WzBdW2ldID0gKi0tcCA+PiAoOCAqIHNpemVvZihpbnQpIC0gMTYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBMQU1FIG1wMyBvdXRwdXQgMTZiaXQgLSAgY29udmVydCB0byBpbnQsIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChpc19tcGVnX2ZpbGVfZm9ybWF0KGlucHV0X2Zvcm1hdCkpIHsKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBzYW1wbGVzX3JlYWQ7IC0taSA+PSAwOykKKyAgICAgICAgICAgICAgICBidWZmZXJbMF1baV0gPSBidWZfdG1wMTZbMF1baV0gPDwgKDggKiBzaXplb2YoaW50KSAtIDE2KTsKKyAgICAgICAgICAgIGlmIChudW1fY2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IHNhbXBsZXNfcmVhZDsgLS1pID49IDA7KQorICAgICAgICAgICAgICAgICAgICBidWZmZXJbMV1baV0gPSBidWZfdG1wMTZbMV1baV0gPDwgKDggKiBzaXplb2YoaW50KSAtIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG51bV9jaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlclsxXSwgMCwgc2FtcGxlc19yZWFkICogc2l6ZW9mKGludCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogaWYgbnVtX3NhbXBsZXMgPSBNQVhfVV8zMl9OVU0sIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBpbmZpbml0ZWx5IGxvbmcuCisgICAgICAgRG9uJ3QgY291bnQgdGhlIHNhbXBsZXMgKi8KKyAgICBpZiAodG1wX251bV9zYW1wbGVzICE9IE1BWF9VXzMyX05VTSkKKyAgICAgICAgZ2xvYmFsLiBudW1fc2FtcGxlc19yZWFkICs9IHNhbXBsZXNfcmVhZDsKKworICAgIHJldHVybiBzYW1wbGVzX3JlYWQ7Cit9CisKKworCitzdGF0aWMgaW50CityZWFkX3NhbXBsZXNfbXAzKGxhbWVfZ2xvYmFsX2ZsYWdzICogY29uc3QgZ2ZwLCBGSUxFICogY29uc3QgbXVzaWNpbiwgc2hvcnQgaW50IG1wZzEyM3BjbVsyXVsxMTUyXSkKK3sKKyAgICBpbnQgICAgIG91dDsKKyNpZiBkZWZpbmVkKEFNSUdBX01QRUdBKSAgfHwgIGRlZmluZWQoSEFWRV9NUEdMSUIpCisgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZV9uYW1lW10gPSAiTVAzIGZpbGUiOworCisgICAgb3V0ID0gbGFtZV9kZWNvZGVfZnJvbWZpbGUobXVzaWNpbiwgbXBnMTIzcGNtWzBdLCBtcGcxMjNwY21bMV0sICZtcDNpbnB1dF9kYXRhKTsKKyAgICAvKgorICAgICAqIG91dCA8IDA6ICBlcnJvciwgcHJvYmFibHkgRU9GCisgICAgICogb3V0ID0gMDogIG5vdCBwb3NzaWJsZSB3aXRoIGxhbWVfZGVjb2RlX2Zyb21maWxlKCkgPz8/CisgICAgICogb3V0ID4gMDogIG51bWJlciBvZiBvdXRwdXQgc2FtcGxlcworICAgICAqLworICAgIGlmIChvdXQgPCAwKSB7CisgICAgICAgIG1lbXNldChtcGcxMjNwY20sIDAsIHNpemVvZigqKm1wZzEyM3BjbSkgKiAyICogMTE1Mik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChsYW1lX2dldF9udW1fY2hhbm5lbHMoZ2ZwKSAhPSBtcDNpbnB1dF9kYXRhLnN0ZXJlbykgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50ZigiRXJyb3I6IG51bWJlciBvZiBjaGFubmVscyBoYXMgY2hhbmdlZCBpbiAlcyAtIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPSAtMTsKKyAgICB9CisgICAgaWYgKGxhbWVfZ2V0X2luX3NhbXBsZXJhdGUoZ2ZwKSAhPSBtcDNpbnB1dF9kYXRhLnNhbXBsZXJhdGUpIHsKKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIkVycm9yOiBzYW1wbGUgZnJlcXVlbmN5IGhhcyBjaGFuZ2VkIGluICVzIC0gbm90IHN1cHBvcnRlZFxuIiwgdHlwZV9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPSAtMTsKKyAgICB9CisjZWxzZQorICAgIG91dCA9IC0xOworI2VuZGlmCisgICAgcmV0dXJuIG91dDsKK30KKworCitpbnQKK1dyaXRlV2F2ZUhlYWRlcihGSUxFICogY29uc3QgZnAsIGNvbnN0IGludCBwY21ieXRlcywKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJlcSwgY29uc3QgaW50IGNoYW5uZWxzLCBjb25zdCBpbnQgYml0cykKK3sKKyAgICBpbnQgICAgIGJ5dGVzID0gKGJpdHMgKyA3KSAvIDg7CisKKyAgICAvKiBxdWljayBhbmQgZGlydHksIGJ1dCBkb2N1bWVudGVkICovCisgICAgZndyaXRlKCJSSUZGIiwgMSwgNCwgZnApOyAvKiBsYWJlbCAqLworICAgIFdyaXRlMzJCaXRzTG93SGlnaChmcCwgcGNtYnl0ZXMgKyA0NCAtIDgpOyAvKiBsZW5ndGggaW4gYnl0ZXMgd2l0aG91dCBoZWFkZXIgKi8KKyAgICBmd3JpdGUoIldBVkVmbXQgIiwgMiwgNCwgZnApOyAvKiAyIGxhYmVscyAqLworICAgIFdyaXRlMzJCaXRzTG93SGlnaChmcCwgMiArIDIgKyA0ICsgNCArIDIgKyAyKTsgLyogbGVuZ3RoIG9mIFBDTSBmb3JtYXQgZGVjbGFyYXRpb24gYXJlYSAqLworICAgIFdyaXRlMTZCaXRzTG93SGlnaChmcCwgMSk7IC8qIGlzIFBDTT8gKi8KKyAgICBXcml0ZTE2Qml0c0xvd0hpZ2goZnAsIGNoYW5uZWxzKTsgLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgV3JpdGUzMkJpdHNMb3dIaWdoKGZwLCBmcmVxKTsgLyogc2FtcGxlIGZyZXF1ZW5jeSBpbiBbSHpdICovCisgICAgV3JpdGUzMkJpdHNMb3dIaWdoKGZwLCBmcmVxICogY2hhbm5lbHMgKiBieXRlcyk7IC8qIGJ5dGVzIHBlciBzZWNvbmQgKi8KKyAgICBXcml0ZTE2Qml0c0xvd0hpZ2goZnAsIGNoYW5uZWxzICogYnl0ZXMpOyAvKiBieXRlcyBwZXIgc2FtcGxlIHRpbWUgKi8KKyAgICBXcml0ZTE2Qml0c0xvd0hpZ2goZnAsIGJpdHMpOyAvKiBiaXRzIHBlciBzYW1wbGUgKi8KKyAgICBmd3JpdGUoImRhdGEiLCAxLCA0LCBmcCk7IC8qIGxhYmVsICovCisgICAgV3JpdGUzMkJpdHNMb3dIaWdoKGZwLCBwY21ieXRlcyk7IC8qIGxlbmd0aCBpbiBieXRlcyBvZiByYXcgUENNIGRhdGEgKi8KKworICAgIHJldHVybiBmZXJyb3IoZnApID8gLTEgOiAwOworfQorCisKKworCisjaWYgZGVmaW5lZChMSUJTTkRGSUxFKQorCisvKgorKiogQ29weXJpZ2h0IChDKSAxOTk5IEFsYmVydCBGYWJlcgorKioKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKworCisKKworCit2b2lkCitDbG9zZVNuZEZpbGUoc291bmRfZmlsZV9mb3JtYXQgaW5wdXQsIEZJTEUgKiBtdXNpY2luKQoreworICAgIFNOREZJTEUgKmdzX3BTbmRGaWxlSW4gPSAoU05ERklMRSAqKSBtdXNpY2luOworICAgIGlmIChpc19tcGVnX2ZpbGVfZm9ybWF0KGlucHV0KSkgeworI2lmbmRlZiBBTUlHQV9NUEVHQQorICAgICAgICBpZiAoZmNsb3NlKG11c2ljaW4pICE9IDApIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiQ291bGQgbm90IGNsb3NlIGF1ZGlvIGlucHV0IGZpbGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhpdCgyKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZ3NfcFNuZEZpbGVJbikgeworICAgICAgICAgICAgaWYgKHNmX2Nsb3NlKGdzX3BTbmRGaWxlSW4pICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJDb3VsZCBub3QgY2xvc2Ugc291bmQgZmlsZSBcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleGl0KDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworRklMRSAgICoKK09wZW5TbmRGaWxlKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBjaGFyICppblBhdGgsIGludCAqZW5jX2RlbGF5LCBpbnQgKmVuY19wYWRkaW5nKQoreworICAgIGNoYXIgICAqbHBzekZpbGVOYW1lID0gaW5QYXRoOworICAgIEZJTEUgICAqbXVzaWNpbjsKKyAgICBTTkRGSUxFICpnc19wU25kRmlsZUluID0gTlVMTDsKKyAgICBTRl9JTkZPIGdzX3dmSW5mbzsKKworICAgIGlmIChpc19tcGVnX2ZpbGVfZm9ybWF0KGlucHV0X2Zvcm1hdCkpIHsKKyNpZmRlZiBBTUlHQV9NUEVHQQorICAgICAgICBpZiAoLTEgPT0gbGFtZV9kZWNvZGVfaW5pdGZpbGUobHBzekZpbGVOYW1lLCAmbXAzaW5wdXRfZGF0YSkpIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiRXJyb3IgcmVhZGluZyBoZWFkZXJzIGluIG1wMyBpbnB1dCBmaWxlICVzLlxuIiwgbHBzekZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIEhBVkVfTVBHTElCCisgICAgICAgIGlmICgobXVzaWNpbiA9IGZvcGVuKGxwc3pGaWxlTmFtZSwgInJiIikpID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiQ291bGQgbm90IGZpbmQgXCIlc1wiLlxuIiwgbHBzekZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0xID09IGxhbWVfZGVjb2RlX2luaXRmaWxlKG11c2ljaW4sICZtcDNpbnB1dF9kYXRhLCBlbmNfZGVsYXksIGVuY19wYWRkaW5nKSkgeworICAgICAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvciByZWFkaW5nIGhlYWRlcnMgaW4gbXAzIGlucHV0IGZpbGUgJXMuXG4iLCBscHN6RmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKC0xID09IGxhbWVfc2V0X251bV9jaGFubmVscyhnZnAsIG1wM2lucHV0X2RhdGEuc3RlcmVvKSkgeworICAgICAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICV1ZFxuIiwgbXAzaW5wdXRfZGF0YS5zdGVyZW8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgbGFtZV9zZXRfaW5fc2FtcGxlcmF0ZShnZnAsIG1wM2lucHV0X2RhdGEuc2FtcGxlcmF0ZSk7CisgICAgICAgICh2b2lkKSBsYW1lX3NldF9udW1fc2FtcGxlcyhnZnAsIG1wM2lucHV0X2RhdGEubnNhbXApOworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dF9mb3JtYXQgPT0gc2Zfb2dnKSB7CisgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJzb3JyeSwgdm9yYmlzIHN1cHBvcnQgaW4gTEFNRSBpcyBkZXByZWNhdGVkLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFRyeSB0byBvcGVuIHRoZSBzb3VuZCBmaWxlICovCisgICAgICAgIG1lbXNldCgmZ3Nfd2ZJbmZvLCAwLCBzaXplb2YoZ3Nfd2ZJbmZvKSk7CisgICAgICAgIGdzX3BTbmRGaWxlSW4gPSBzZl9vcGVuKGxwc3pGaWxlTmFtZSwgU0ZNX1JFQUQsICZnc193ZkluZm8pOworCisgICAgICAgIGlmIChnc19wU25kRmlsZUluID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChpbl9zaWduZWQgPT0gMCAmJiBpbl9iaXR3aWR0aCAhPSA4KSB7CisgICAgICAgICAgICAgICAgZnB1dHMoIlVuc2lnbmVkIGlucHV0IG9ubHkgc3VwcG9ydGVkIHdpdGggYml0d2lkdGggOFxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogc2V0IHNvbWUgZGVmYXVsdHMgaW5jYXNlIGlucHV0IGlzIHJhdyBQQ00gKi8KKyAgICAgICAgICAgIGdzX3dmSW5mby5zZWVrYWJsZSA9IChpbnB1dF9mb3JtYXQgIT0gc2ZfcmF3KTsgLyogaWYgdXNlciBzcGVjaWZpZWQgLXIsIHNldCB0byBub3Qgc2Vla2FibGUgKi8KKyAgICAgICAgICAgIGdzX3dmSW5mby5zYW1wbGVyYXRlID0gbGFtZV9nZXRfaW5fc2FtcGxlcmF0ZShnZnApOworICAgICAgICAgICAgZ3Nfd2ZJbmZvLmNoYW5uZWxzID0gbGFtZV9nZXRfbnVtX2NoYW5uZWxzKGdmcCk7CisgICAgICAgICAgICBnc193ZkluZm8uZm9ybWF0ID0gU0ZfRk9STUFUX1JBVzsKKyAgICAgICAgICAgIGlmICgoaW5fZW5kaWFuID09IEJ5dGVPcmRlckxpdHRsZUVuZGlhbikgXiAoc3dhcGJ5dGVzICE9IDApKSB7CisgICAgICAgICAgICAgICAgZ3Nfd2ZJbmZvLmZvcm1hdCB8PSBTRl9FTkRJQU5fTElUVExFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZ3Nfd2ZJbmZvLmZvcm1hdCB8PSBTRl9FTkRJQU5fQklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChpbl9iaXR3aWR0aCkgeworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIGdzX3dmSW5mby5mb3JtYXQgfD0gaW5fc2lnbmVkID09IDAgPyBTRl9GT1JNQVRfUENNX1U4IDogU0ZfRk9STUFUX1BDTV9TODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgZ3Nfd2ZJbmZvLmZvcm1hdCB8PSBTRl9GT1JNQVRfUENNXzE2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICBnc193ZkluZm8uZm9ybWF0IHw9IFNGX0ZPUk1BVF9QQ01fMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIGdzX3dmSW5mby5mb3JtYXQgfD0gU0ZfRk9STUFUX1BDTV8zMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnc19wU25kRmlsZUluID0gc2Zfb3BlbihscHN6RmlsZU5hbWUsIFNGTV9SRUFELCAmZ3Nfd2ZJbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIG11c2ljaW4gPSAoRklMRSAqKSBnc19wU25kRmlsZUluOworCisgICAgICAgIC8qIENoZWNrIHJlc3VsdCAqLworICAgICAgICBpZiAoZ3NfcFNuZEZpbGVJbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZl9wZXJyb3IoZ3NfcFNuZEZpbGVJbik7CisgICAgICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIkNvdWxkIG5vdCBvcGVuIHNvdW5kIGZpbGUgXCIlc1wiLlxuIiwgbHBzekZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGdzX3dmSW5mby5mb3JtYXQgJiBTRl9GT1JNQVRfUkFXKSA9PSBTRl9GT1JNQVRfUkFXKSB7CisgICAgICAgICAgICBpbnB1dF9mb3JtYXQgPSBzZl9yYXc7CisgICAgICAgIH0KKworI2lmZGVmIF9ERUJVR19TTkRfRklMRQorICAgICAgICBERUJVR0YoIlxuXG5TRl9JTkZPIHN0cnVjdHVyZVxuIik7CisgICAgICAgIERFQlVHRigic2FtcGxlcmF0ZSAgICAgICAgOiVkXG4iLCBnc193ZkluZm8uc2FtcGxlcmF0ZSk7CisgICAgICAgIERFQlVHRigic2FtcGxlcyAgICAgICAgICAgOiVkXG4iLCBnc193ZkluZm8uZnJhbWVzKTsKKyAgICAgICAgREVCVUdGKCJjaGFubmVscyAgICAgICAgICA6JWRcbiIsIGdzX3dmSW5mby5jaGFubmVscyk7CisgICAgICAgIERFQlVHRigiZm9ybWF0ICAgICAgICAgICAgOiIpOworCisgICAgICAgIC8qIG5ldyBmb3JtYXRzIGZyb20gc2JlbGxvbkBzYmVsbG9uLmRlICAxLzIwMDAgKi8KKworICAgICAgICBzd2l0Y2ggKGdzX3dmSW5mby5mb3JtYXQgJiBTRl9GT1JNQVRfVFlQRU1BU0spIHsKKyAgICAgICAgY2FzZSBTRl9GT1JNQVRfV0FWOgorICAgICAgICAgICAgREVCVUdGKCJNaWNyb3NvZnQgV0FWIGZvcm1hdCAoYmlnIGVuZGlhbikuICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0ZfRk9STUFUX0FJRkY6CisgICAgICAgICAgICBERUJVR0YoIkFwcGxlL1NHSSBBSUZGIGZvcm1hdCAobGl0dGxlIGVuZGlhbikuICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0ZfRk9STUFUX0FVOgorICAgICAgICAgICAgREVCVUdGKCJTdW4vTmVYVCBBVSBmb3JtYXQgKGJpZyBlbmRpYW4pLiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgIGNhc2UgU0ZfRk9STUFUX0FVTEU6CisgICAgICAgICAgICAgICBERUJVR0YoIkRFQyBBVSBmb3JtYXQgKGxpdHRsZSBlbmRpYW4pLiAiKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICovCisgICAgICAgIGNhc2UgU0ZfRk9STUFUX1JBVzoKKyAgICAgICAgICAgIERFQlVHRigiUkFXIFBDTSBkYXRhLiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNGX0ZPUk1BVF9QQUY6CisgICAgICAgICAgICBERUJVR0YoIkVuc29uaXEgUEFSSVMgZmlsZSBmb3JtYXQuICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0ZfRk9STUFUX1NWWDoKKyAgICAgICAgICAgIERFQlVHRigiQW1pZ2EgSUZGIC8gU1ZYOCAvIFNWMTYgZm9ybWF0LiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNGX0ZPUk1BVF9OSVNUOgorICAgICAgICAgICAgREVCVUdGKCJTcGhlcmUgTklTVCBmb3JtYXQuICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZ3Nfd2ZJbmZvLmZvcm1hdCAmIFNGX0ZPUk1BVF9TVUJNQVNLKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgY2FzZSBTRl9GT1JNQVRfUENNOgorICAgICAgICAgICAgICAgREVCVUdGKCJQQ00gZGF0YSBpbiA4LCAxNiwgMjQgb3IgMzIgYml0cy4iKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICovCisgICAgICAgIGNhc2UgU0ZfRk9STUFUX0ZMT0FUOgorICAgICAgICAgICAgREVCVUdGKCIzMiBiaXQgSW50ZWwgeDg2IGZsb2F0cy4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNGX0ZPUk1BVF9VTEFXOgorICAgICAgICAgICAgREVCVUdGKCJVLUxhdyBlbmNvZGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0ZfRk9STUFUX0FMQVc6CisgICAgICAgICAgICBERUJVR0YoIkEtTGF3IGVuY29kZWQuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRl9GT1JNQVRfSU1BX0FEUENNOgorICAgICAgICAgICAgREVCVUdGKCJJTUEgQURQQ00uIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRl9GT1JNQVRfTVNfQURQQ006CisgICAgICAgICAgICBERUJVR0YoIk1pY3Jvc29mdCBBRFBDTS4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgIGNhc2UgU0ZfRk9STUFUX1BDTV9CRToKKyAgICAgICAgICAgICAgIERFQlVHRigiQmlnIGVuZGlhbiBQQ00gZGF0YS4iKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSBTRl9GT1JNQVRfUENNX0xFOgorICAgICAgICAgICAgICAgREVCVUdGKCJMaXR0bGUgZW5kaWFuIFBDTSBkYXRhLiIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBTRl9GT1JNQVRfUENNX1M4OgorICAgICAgICAgICAgREVCVUdGKCJTaWduZWQgOCBiaXQgUENNLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0ZfRk9STUFUX1BDTV9VODoKKyAgICAgICAgICAgIERFQlVHRigiVW5zaWduZWQgOCBiaXQgUENNLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0ZfRk9STUFUX1BDTV8xNjoKKyAgICAgICAgICAgIERFQlVHRigiU2lnbmVkIDE2IGJpdCBQQ00uIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRl9GT1JNQVRfUENNXzI0OgorICAgICAgICAgICAgREVCVUdGKCJTaWduZWQgMjQgYml0IFBDTS4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNGX0ZPUk1BVF9QQ01fMzI6CisgICAgICAgICAgICBERUJVR0YoIlNpZ25lZCAzMiBiaXQgUENNLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgY2FzZSBTRl9GT1JNQVRfU1ZYX0ZJQjoKKyAgICAgICAgICAgICAgIERFQlVHRigiU1ZYIEZpYm9uYWNjaSBEZWx0YSBlbmNvZGluZy4iKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSBTRl9GT1JNQVRfU1ZYX0VYUDoKKyAgICAgICAgICAgICAgIERFQlVHRigiU1ZYIEV4cG9uZW50aWFsIERlbHRhIGVuY29kaW5nLiIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgREVCVUdGKCJcbiIpOworICAgICAgICBERUJVR0YoInNlY3Rpb25zICAgICAgICAgIDolZFxuIiwgZ3Nfd2ZJbmZvLnNlY3Rpb25zKTsKKyAgICAgICAgREVCVUdGKCJzZWVrYWJsZSAgICAgICAgICA6XG4iLCBnc193ZkluZm8uc2Vla2FibGUpOworI2VuZGlmCisgICAgICAgIC8qIENoZWNrIHJlc3VsdCAqLworICAgICAgICBpZiAoZ3NfcFNuZEZpbGVJbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZl9wZXJyb3IoZ3NfcFNuZEZpbGVJbik7CisgICAgICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIkNvdWxkIG5vdCBvcGVuIHNvdW5kIGZpbGUgXCIlc1wiLlxuIiwgbHBzekZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworCisgICAgICAgICh2b2lkKSBsYW1lX3NldF9udW1fc2FtcGxlcyhnZnAsIGdzX3dmSW5mby5mcmFtZXMpOworICAgICAgICBpZiAoLTEgPT0gbGFtZV9zZXRfbnVtX2NoYW5uZWxzKGdmcCwgZ3Nfd2ZJbmZvLmNoYW5uZWxzKSkgeworICAgICAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICV1ZFxuIiwgZ3Nfd2ZJbmZvLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X2luX3NhbXBsZXJhdGUoZ2ZwLCBnc193ZkluZm8uc2FtcGxlcmF0ZSk7CisgICAgICAgIGdsb2JhbC4gcGNtYml0d2lkdGggPSAzMjsKKyAgICB9CisKKyAgICBpZiAobGFtZV9nZXRfbnVtX3NhbXBsZXMoZ2ZwKSA9PSBNQVhfVV8zMl9OVU0pIHsKKyAgICAgICAgLyogdHJ5IHRvIGZpZ3VyZSBvdXQgbnVtX3NhbXBsZXMgKi8KKyAgICAgICAgZG91YmxlICBmbGVuID0gbGFtZV9nZXRfZmlsZV9zaXplKGxwc3pGaWxlTmFtZSk7CisKKyAgICAgICAgaWYgKGZsZW4gPj0gMCkgeworICAgICAgICAgICAgLyogdHJ5IGZpbGUgc2l6ZSwgYXNzdW1lIDIgYnl0ZXMgcGVyIHNhbXBsZSAqLworICAgICAgICAgICAgaWYgKGlzX21wZWdfZmlsZV9mb3JtYXQoaW5wdXRfZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChtcDNpbnB1dF9kYXRhLmJpdHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgdG90YWxzZWNvbmRzID0gKGZsZW4gKiA4LjAgLyAoMTAwMC4wICogbXAzaW5wdXRfZGF0YS5iaXRyYXRlKSk7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdG1wX251bV9zYW1wbGVzID0gdG90YWxzZWNvbmRzICogbGFtZV9nZXRfaW5fc2FtcGxlcmF0ZShnZnApOworCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9udW1fc2FtcGxlcyhnZnAsIHRtcF9udW1fc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIG1wM2lucHV0X2RhdGEubnNhbXAgPSB0bXBfbnVtX3NhbXBsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfbnVtX3NhbXBsZXMoZ2ZwLCBmbGVuIC8gKDIgKiBsYW1lX2dldF9udW1fY2hhbm5lbHMoZ2ZwKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4gbXVzaWNpbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIHJlYWRfc2FtcGxlcygpCisqCisqIFBVUlBPU0U6ICByZWFkcyB0aGUgUENNIHNhbXBsZXMgZnJvbSBhIGZpbGUgdG8gdGhlIGJ1ZmZlcgorKgorKiAgU0VNQU5USUNTOgorKiBSZWFkcyAjc2FtcGxlc19yZWFkIyBudW1iZXIgb2Ygc2hvcnRzIGZyb20gI211c2ljaW4jIGZpbGVwb2ludGVyCisqIGludG8gI3NhbXBsZV9idWZmZXJbXSMuICBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CityZWFkX3NhbXBsZXNfcGNtKEZJTEUgKiBjb25zdCBtdXNpY2luLCBpbnQgc2FtcGxlX2J1ZmZlclsyMzA0XSwgaW50IHNhbXBsZXNfdG9fcmVhZCkKK3sKKyAgICBpbnQgICAgIHNhbXBsZXNfcmVhZDsKKworICAgIHNhbXBsZXNfcmVhZCA9IHNmX3JlYWRfaW50KChTTkRGSUxFICopIG11c2ljaW4sIHNhbXBsZV9idWZmZXIsIHNhbXBsZXNfdG9fcmVhZCk7CisKKyNpZiAwCisgICAgc3dpdGNoIChnbG9iYWwucGNtYml0d2lkdGgpIHsKKyAgICBjYXNlIDg6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzX3JlYWQ7IGkrKykKKyAgICAgICAgICAgIHNhbXBsZV9idWZmZXJbaV0gPDw9ICg4ICogc2l6ZW9mKGludCkgLSA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXNfcmVhZDsgaSsrKQorICAgICAgICAgICAgc2FtcGxlX2J1ZmZlcltpXSA8PD0gKDggKiBzaXplb2YoaW50KSAtIDE2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXNfcmVhZDsgaSsrKQorICAgICAgICAgICAgc2FtcGxlX2J1ZmZlcltpXSA8PD0gKDggKiBzaXplb2YoaW50KSAtIDI0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIk9ubHkgOCwgMTYsIDI0IGFuZCAzMiBiaXQgaW5wdXQgZmlsZXMgc3VwcG9ydGVkIFxuIik7CisgICAgICAgIH0KKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBzYW1wbGVzX3JlYWQ7Cit9CisKKworI2Vsc2UgLyogZGVmaW5lZChMSUJTTkRGSUxFKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT0xEIElTTy9MQU1FIHJvdXRpbmVzIGZvbGxvdy4gIFVzZWQgaWYgeW91IGRvbnQgaGF2ZSBMSUJTTkRGSUxFCisgKiBvciBmb3Igc3RkaW4vc3Rkb3V0IHN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordW5wYWNrX3JlYWRfc2FtcGxlcyAtIHJlYWQgYW5kIHVucGFjayBzaWduZWQgbG93LXRvLWhpZ2ggYnl0ZSBvciB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBieXRlIGlucHV0LiAodXNlZCBmb3IgcmVhZF9zYW1wbGVzIGZ1bmN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBpbnRlZ2VycyBhcmUgc3RvcmVkIGluIHRoZSBuYXRpdmUgYnl0ZSBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgIChsaXR0bGUgb3IgYmlnIGVuZGlhbikuICAtamQKKyAgaW46IHNhbXBsZXNfdG9fcmVhZAorICAgICAgYnl0ZXNfcGVyX3NhbXBsZQorICAgICAgc3dhcF9vcmRlciAgICAtIHNldCBmb3IgaGlnaC10by1sb3cgYnl0ZSBvcmRlciBpbnB1dCBzdHJlYW0KKyBpL286IHBjbV9pbgorIG91dDogc2FtcGxlX2J1ZmZlciAgKG11c3QgYmUgYWxsb2NhdGVkIHVwIHRvIHNhbXBsZXNfdG9fcmVhZCB1cG9uIGNhbGwpCityZXR1cm5zOiBudW1iZXIgb2Ygc2FtcGxlcyByZWFkCisqLworc3RhdGljIGludAordW5wYWNrX3JlYWRfc2FtcGxlcyhjb25zdCBpbnQgc2FtcGxlc190b19yZWFkLCBjb25zdCBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN3YXBfb3JkZXIsIGludCAqc2FtcGxlX2J1ZmZlciwgRklMRSAqIHBjbV9pbikKK3sKKyAgICBzaXplX3QgIHNhbXBsZXNfcmVhZDsKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICpvcDsgICAgICAgICAgICAgIC8qIG91dHB1dCBwb2ludGVyICovCisgICAgdW5zaWduZWQgY2hhciAqaXAgPSAodW5zaWduZWQgY2hhciAqKSBzYW1wbGVfYnVmZmVyOyAvKiBpbnB1dCBwb2ludGVyICovCisgICAgY29uc3QgaW50IGIgPSBzaXplb2YoaW50KSAqIDg7CisKKyNkZWZpbmUgR0FfVVJTX0lGTE9PUCggZ2FfdXJzX2JwcyApIFwKKyAgICBpZiggYnl0ZXNfcGVyX3NhbXBsZSA9PSBnYV91cnNfYnBzICkgXAorCWZvciggaSA9IHNhbXBsZXNfcmVhZCAqIGJ5dGVzX3Blcl9zYW1wbGU7IChpIC09IGJ5dGVzX3Blcl9zYW1wbGUpID49MDspCisKKyAgICBzYW1wbGVzX3JlYWQgPSBmcmVhZChzYW1wbGVfYnVmZmVyLCBieXRlc19wZXJfc2FtcGxlLCBzYW1wbGVzX3RvX3JlYWQsIHBjbV9pbik7CisgICAgb3AgPSBzYW1wbGVfYnVmZmVyICsgc2FtcGxlc19yZWFkOworCisgICAgaWYgKHN3YXBfb3JkZXIgPT0gMCkgeworICAgICAgICBHQV9VUlNfSUZMT09QKDEpCisgICAgICAgICAgICAqIC0tb3AgPSBpcFtpXSA8PCAoYiAtIDgpOworICAgICAgICBHQV9VUlNfSUZMT09QKDIpCisgICAgICAgICAgICAqIC0tb3AgPSBpcFtpXSA8PCAoYiAtIDE2KSB8IGlwW2kgKyAxXSA8PCAoYiAtIDgpOworICAgICAgICBHQV9VUlNfSUZMT09QKDMpCisgICAgICAgICAgICAqIC0tb3AgPSBpcFtpXSA8PCAoYiAtIDI0KSB8IGlwW2kgKyAxXSA8PCAoYiAtIDE2KSB8IGlwW2kgKyAyXSA8PCAoYiAtIDgpOworICAgICAgICBHQV9VUlNfSUZMT09QKDQpCisgICAgICAgICAgICAqIC0tb3AgPQorICAgICAgICAgICAgaXBbaV0gPDwgKGIgLSAzMikgfCBpcFtpICsgMV0gPDwgKGIgLSAyNCkgfCBpcFtpICsgMl0gPDwgKGIgLSAxNikgfCBpcFtpICsgM10gPDwgKGIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgR0FfVVJTX0lGTE9PUCgxKQorICAgICAgICAgICAgKiAtLW9wID0gKGlwW2ldIF4gMHg4MCkgPDwgKGIgLSA4KSB8IDB4N2YgPDwgKGIgLSAxNik7IC8qIGNvbnZlcnQgZnJvbSB1bnNpZ25lZCAqLworICAgICAgICBHQV9VUlNfSUZMT09QKDIpCisgICAgICAgICAgICAqIC0tb3AgPSBpcFtpXSA8PCAoYiAtIDgpIHwgaXBbaSArIDFdIDw8IChiIC0gMTYpOworICAgICAgICBHQV9VUlNfSUZMT09QKDMpCisgICAgICAgICAgICAqIC0tb3AgPSBpcFtpXSA8PCAoYiAtIDgpIHwgaXBbaSArIDFdIDw8IChiIC0gMTYpIHwgaXBbaSArIDJdIDw8IChiIC0gMjQpOworICAgICAgICBHQV9VUlNfSUZMT09QKDQpCisgICAgICAgICAgICAqIC0tb3AgPQorICAgICAgICAgICAgaXBbaV0gPDwgKGIgLSA4KSB8IGlwW2kgKyAxXSA8PCAoYiAtIDE2KSB8IGlwW2kgKyAyXSA8PCAoYiAtIDI0KSB8IGlwW2kgKyAzXSA8PCAoYiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMik7CisgICAgfQorI3VuZGVmIEdBX1VSU19JRkxPT1AKKyAgICByZXR1cm4gKHNhbXBsZXNfcmVhZCk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIHJlYWRfc2FtcGxlcygpCisqCisqIFBVUlBPU0U6ICByZWFkcyB0aGUgUENNIHNhbXBsZXMgZnJvbSBhIGZpbGUgdG8gdGhlIGJ1ZmZlcgorKgorKiAgU0VNQU5USUNTOgorKiBSZWFkcyAjc2FtcGxlc19yZWFkIyBudW1iZXIgb2Ygc2hvcnRzIGZyb20gI211c2ljaW4jIGZpbGVwb2ludGVyCisqIGludG8gI3NhbXBsZV9idWZmZXJbXSMuICBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CityZWFkX3NhbXBsZXNfcGNtKEZJTEUgKiBtdXNpY2luLCBpbnQgc2FtcGxlX2J1ZmZlclsyMzA0XSwgaW50IHNhbXBsZXNfdG9fcmVhZCkKK3sKKyAgICBpbnQgICAgIHNhbXBsZXNfcmVhZDsKKyAgICBpbnQgICAgIHN3YXBfYnl0ZV9vcmRlcjsgICAgIC8qIGJ5dGUgb3JkZXIgb2YgaW5wdXQgc3RyZWFtICovCisKKyAgICBzd2l0Y2ggKGdsb2JhbC5wY21iaXR3aWR0aCkgeworICAgIGNhc2UgMzI6CisgICAgY2FzZSAyNDoKKyAgICBjYXNlIDE2OgorICAgICAgICBpZiAoaW5fc2lnbmVkID09IDApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50ZigiVW5zaWduZWQgaW5wdXQgb25seSBzdXBwb3J0ZWQgd2l0aCBiaXR3aWR0aCA4XG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3dhcF9ieXRlX29yZGVyID0gKGluX2VuZGlhbiAhPSBCeXRlT3JkZXJMaXR0bGVFbmRpYW4pID8gMSA6IDA7CisgICAgICAgICAgICBpZiAoZ2xvYmFsLnBjbXN3YXBieXRlcykgeworICAgICAgICAgICAgICAgIHN3YXBfYnl0ZV9vcmRlciA9ICFzd2FwX2J5dGVfb3JkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYW1wbGVzX3JlYWQgPSB1bnBhY2tfcmVhZF9zYW1wbGVzKHNhbXBsZXNfdG9fcmVhZCwgZ2xvYmFsLnBjbWJpdHdpZHRoIC8gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF9ieXRlX29yZGVyLCBzYW1wbGVfYnVmZmVyLCBtdXNpY2luKTsKKworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA4OgorICAgICAgICB7CisgICAgICAgICAgICBzYW1wbGVzX3JlYWQgPSB1bnBhY2tfcmVhZF9zYW1wbGVzKHNhbXBsZXNfdG9fcmVhZCwgMSwgZ2xvYmFsLnBjbV9pc191bnNpZ25lZF84Yml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfYnVmZmVyLCBtdXNpY2luKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiT25seSA4LCAxNiwgMjQgYW5kIDMyIGJpdCBpbnB1dCBmaWxlcyBzdXBwb3J0ZWQgXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChmZXJyb3IobXVzaWNpbikpIHsKKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIkVycm9yIHJlYWRpbmcgaW5wdXQgZmlsZVxuIik7CisgICAgICAgIH0KKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2FtcGxlc19yZWFkOworfQorCisKKworLyogQUlGRiBEZWZpbml0aW9ucyAqLworCitzdGF0aWMgaW50IGNvbnN0IElGRl9JRF9GT1JNID0gMHg0NjRmNTI0ZDsgLyogIkZPUk0iICovCitzdGF0aWMgaW50IGNvbnN0IElGRl9JRF9BSUZGID0gMHg0MTQ5NDY0NjsgLyogIkFJRkYiICovCitzdGF0aWMgaW50IGNvbnN0IElGRl9JRF9BSUZDID0gMHg0MTQ5NDY0MzsgLyogIkFJRkMiICovCitzdGF0aWMgaW50IGNvbnN0IElGRl9JRF9DT01NID0gMHg0MzRmNGQ0ZDsgLyogIkNPTU0iICovCitzdGF0aWMgaW50IGNvbnN0IElGRl9JRF9TU05EID0gMHg1MzUzNGU0NDsgLyogIlNTTkQiICovCitzdGF0aWMgaW50IGNvbnN0IElGRl9JRF9NUEVHID0gMHg0ZDUwNDU0NzsgLyogIk1QRUciICovCisKK3N0YXRpYyBpbnQgY29uc3QgSUZGX0lEX05PTkUgPSAweDRlNGY0ZTQ1OyAvKiAiTk9ORSIgKi8gLyogQUlGRi1DIGRhdGEgZm9ybWF0ICovCitzdGF0aWMgaW50IGNvbnN0IElGRl9JRF8yQ0JFID0gMHg3NDc3NmY3MzsgLyogInR3b3MiICovIC8qIEFJRkYtQyBkYXRhIGZvcm1hdCAqLworc3RhdGljIGludCBjb25zdCBJRkZfSURfMkNMRSA9IDB4NzM2Zjc3NzQ7IC8qICJzb3d0IiAqLyAvKiBBSUZGLUMgZGF0YSBmb3JtYXQgKi8KKworc3RhdGljIGludCBjb25zdCBXQVZfSURfUklGRiA9IDB4NTI0OTQ2NDY7IC8qICJSSUZGIiAqLworc3RhdGljIGludCBjb25zdCBXQVZfSURfV0FWRSA9IDB4NTc0MTU2NDU7IC8qICJXQVZFIiAqLworc3RhdGljIGludCBjb25zdCBXQVZfSURfRk1UID0gMHg2NjZkNzQyMDsgLyogImZtdCAiICovCitzdGF0aWMgaW50IGNvbnN0IFdBVl9JRF9EQVRBID0gMHg2NDYxNzQ2MTsgLyogImRhdGEiICovCisKKyNpZm5kZWYgV0FWRV9GT1JNQVRfUENNCitzdGF0aWMgc2hvcnQgY29uc3QgV0FWRV9GT1JNQVRfUENNID0gMHgwMDAxOworI2VuZGlmCisjaWZuZGVmIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUKK3N0YXRpYyBzaG9ydCBjb25zdCBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFID0gMHhGRkZFOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUmVhZCBNaWNyb3NvZnQgV2F2ZSBoZWFkZXJzCisgKgorICoJQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgdGhlIGZpcnN0IDMyLWJpdHMgb2YgdGhlIGZpbGUgaGF2ZSBhbHJlYWR5IGJlZW4KKyAqCXJlYWQsIGFuZCB3ZSdyZSBwcmV0dHkgc3VyZSB0aGF0IHdlJ3JlIGxvb2tpbmcgYXQgYSBXQVYgZmlsZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3BhcnNlX3dhdmVfaGVhZGVyKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBGSUxFICogc2YpCit7CisgICAgaW50ICAgICBmb3JtYXRfdGFnID0gMDsKKyAgICBpbnQgICAgIGNoYW5uZWxzID0gMDsKKyAgICBpbnQgICAgIGJsb2NrX2FsaWduID0gMDsKKyAgICBpbnQgICAgIGJpdHNfcGVyX3NhbXBsZSA9IDA7CisgICAgaW50ICAgICBzYW1wbGVzX3Blcl9zZWMgPSAwOworICAgIGludCAgICAgYXZnX2J5dGVzX3Blcl9zZWMgPSAwOworCisKKyAgICBpbnQgICAgIGlzX3dhdiA9IDA7CisgICAgbG9uZyAgICBkYXRhX2xlbmd0aCA9IDAsIGZpbGVfbGVuZ3RoLCBzdWJTaXplID0gMDsKKyAgICBpbnQgICAgIGxvb3Bfc2FuaXR5ID0gMDsKKworICAgIGZpbGVfbGVuZ3RoID0gUmVhZDMyQml0c0hpZ2hMb3coc2YpOworICAgIGlmIChSZWFkMzJCaXRzSGlnaExvdyhzZikgIT0gV0FWX0lEX1dBVkUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAobG9vcF9zYW5pdHkgPSAwOyBsb29wX3Nhbml0eSA8IDIwOyArK2xvb3Bfc2FuaXR5KSB7CisgICAgICAgIGludCAgICAgdHlwZSA9IFJlYWQzMkJpdHNIaWdoTG93KHNmKTsKKworICAgICAgICBpZiAodHlwZSA9PSBXQVZfSURfRk1UKSB7CisgICAgICAgICAgICBzdWJTaXplID0gUmVhZDMyQml0c0xvd0hpZ2goc2YpOworICAgICAgICAgICAgaWYgKHN1YlNpemUgPCAxNikgeworICAgICAgICAgICAgICAgIC8qREVCVUdGKAorICAgICAgICAgICAgICAgICAgICInZm10JyBjaHVuayB0b28gc2hvcnQgKG9ubHkgJWxkIGJ5dGVzKSEiLCBzdWJTaXplKTsgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRfdGFnID0gUmVhZDE2Qml0c0xvd0hpZ2goc2YpOworICAgICAgICAgICAgc3ViU2l6ZSAtPSAyOworICAgICAgICAgICAgY2hhbm5lbHMgPSBSZWFkMTZCaXRzTG93SGlnaChzZik7CisgICAgICAgICAgICBzdWJTaXplIC09IDI7CisgICAgICAgICAgICBzYW1wbGVzX3Blcl9zZWMgPSBSZWFkMzJCaXRzTG93SGlnaChzZik7CisgICAgICAgICAgICBzdWJTaXplIC09IDQ7CisgICAgICAgICAgICBhdmdfYnl0ZXNfcGVyX3NlYyA9IFJlYWQzMkJpdHNMb3dIaWdoKHNmKTsKKyAgICAgICAgICAgIHN1YlNpemUgLT0gNDsKKyAgICAgICAgICAgIGJsb2NrX2FsaWduID0gUmVhZDE2Qml0c0xvd0hpZ2goc2YpOworICAgICAgICAgICAgc3ViU2l6ZSAtPSAyOworICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlID0gUmVhZDE2Qml0c0xvd0hpZ2goc2YpOworICAgICAgICAgICAgc3ViU2l6ZSAtPSAyOworCisgICAgICAgICAgICAvKiBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIGlmICgoc3ViU2l6ZSA+IDkpICYmIChmb3JtYXRfdGFnID09IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpKSB7CisgICAgICAgICAgICAgICAgUmVhZDE2Qml0c0xvd0hpZ2goc2YpOyAvKiBjYlNpemUgKi8KKyAgICAgICAgICAgICAgICBSZWFkMTZCaXRzTG93SGlnaChzZik7IC8qIFZhbGlkQml0c1BlclNhbXBsZSAqLworICAgICAgICAgICAgICAgIFJlYWQzMkJpdHNMb3dIaWdoKHNmKTsgLyogQ2hhbm5lbE1hc2sgKi8KKyAgICAgICAgICAgICAgICAvKiBTdWJUeXBlIGNvaW5jaWRlbnQgd2l0aCBmb3JtYXRfdGFnIGZvciBQQ00gaW50IG9yIGZsb2F0ICovCisgICAgICAgICAgICAgICAgZm9ybWF0X3RhZyA9IFJlYWQxNkJpdHNMb3dIaWdoKHNmKTsKKyAgICAgICAgICAgICAgICBzdWJTaXplIC09IDEwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBERUJVR0YoIiAgIHNraXBwaW5nICVkIGJ5dGVzXG4iLCBzdWJTaXplKTsgKi8KKworICAgICAgICAgICAgaWYgKHN1YlNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZza2lwKHNmLCAobG9uZykgc3ViU2l6ZSwgU0VFS19DVVIpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IFdBVl9JRF9EQVRBKSB7CisgICAgICAgICAgICBzdWJTaXplID0gUmVhZDMyQml0c0xvd0hpZ2goc2YpOworICAgICAgICAgICAgZGF0YV9sZW5ndGggPSBzdWJTaXplOworICAgICAgICAgICAgaXNfd2F2ID0gMTsKKyAgICAgICAgICAgIC8qIFdlJ3ZlIGZvdW5kIHRoZSBhdWRpbyBkYXRhLiBSZWFkIG5vIGZ1cnRoZXIhICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3ViU2l6ZSA9IFJlYWQzMkJpdHNMb3dIaWdoKHNmKTsKKyAgICAgICAgICAgIGlmIChmc2tpcChzZiwgKGxvbmcpIHN1YlNpemUsIFNFRUtfQ1VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX3dhdikgeworICAgICAgICBpZiAoZm9ybWF0X3RhZyAhPSBXQVZFX0ZPUk1BVF9QQ00pIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiVW5zdXBwb3J0ZWQgZGF0YSBmb3JtYXQ6IDB4JTA0WFxuIiwgZm9ybWF0X3RhZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgLyogb2ggbm8hIG5vbi1zdXBwb3J0ZWQgZm9ybWF0ICAqLworICAgICAgICB9CisKKworICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIGhlYWRlciBpcyBzYW5lICovCisgICAgICAgIGlmICgtMSA9PSBsYW1lX3NldF9udW1fY2hhbm5lbHMoZ2ZwLCBjaGFubmVscykpIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAldVxuIiwgY2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X2luX3NhbXBsZXJhdGUoZ2ZwLCBzYW1wbGVzX3Blcl9zZWMpOworICAgICAgICBnbG9iYWwuIHBjbWJpdHdpZHRoID0gYml0c19wZXJfc2FtcGxlOworICAgICAgICBnbG9iYWwuIHBjbV9pc191bnNpZ25lZF84Yml0ID0gMTsKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X251bV9zYW1wbGVzKGdmcCwgZGF0YV9sZW5ndGggLyAoY2hhbm5lbHMgKiAoKGJpdHNfcGVyX3NhbXBsZSArIDcpIC8gOCkpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogYWlmZl9jaGVjazIKKyoKKyogUFVSUE9TRToJQ2hlY2tzIEFJRkYgaGVhZGVyIGluZm9ybWF0aW9uIHRvIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZC4KKyoJICAgICAgICByZXR1cm5zIDAgb24gc3VjY2VzcywgMSBvbiBlcnJvcnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorYWlmZl9jaGVjazIoSUZGX0FJRkYgKiBjb25zdCBwY21fYWlmZl9kYXRhKQoreworICAgIGlmIChwY21fYWlmZl9kYXRhLT5zYW1wbGVUeXBlICE9ICh1bnNpZ25lZCBsb25nKSBJRkZfSURfU1NORCkgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50ZigiRVJST1I6IGlucHV0IHNvdW5kIGRhdGEgaXMgbm90IFBDTVxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHN3aXRjaCAocGNtX2FpZmZfZGF0YS0+c2FtcGxlU2l6ZSkgeworICAgIGNhc2UgMzI6CisgICAgY2FzZSAyNDoKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgODoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIkVSUk9SOiBpbnB1dCBzb3VuZCBkYXRhIGlzIG5vdCA4LCAxNiwgMjQgb3IgMzIgYml0c1xuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChwY21fYWlmZl9kYXRhLT5udW1DaGFubmVscyAhPSAxICYmIHBjbV9haWZmX2RhdGEtPm51bUNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIkVSUk9SOiBpbnB1dCBzb3VuZCBkYXRhIGlzIG5vdCBtb25vIG9yIHN0ZXJlb1xuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChwY21fYWlmZl9kYXRhLT5ibGtBbGduLmJsb2NrU2l6ZSAhPSAwKSB7CisgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJFUlJPUjogYmxvY2sgc2l6ZSBvZiBpbnB1dCBzb3VuZCBkYXRhIGlzIG5vdCAwIGJ5dGVzXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogQSBidWcsIHNpbmNlIHdlIGNvcnJlY3RseSBza2lwIHRoZSBvZmZzZXQgZWFybGllciBpbiB0aGUgY29kZS4KKyAgICAgICBpZiAocGNtX2FpZmZfZGF0YS0+YmxrQWxnbi5vZmZzZXQgIT0gMCkgeworICAgICAgIGVycm9yX3ByaW50ZigiQmxvY2sgb2Zmc2V0IGlzIG5vdCAwIGJ5dGVzIGluICclcydcbiIsIGZpbGVfbmFtZSk7CisgICAgICAgcmV0dXJuIDE7CisgICAgICAgfSAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGxvbmcKK21ha2VfZXZlbl9udW1iZXJfb2ZfYnl0ZXNfaW5fbGVuZ3RoKGxvbmcgeCkKK3sKKyAgICBpZiAoKHggJiAweDAxKSAhPSAwKSB7CisgICAgICAgIHJldHVybiB4ICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHg7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUmVhZCBBdWRpbyBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdCAoQUlGRikgaGVhZGVycy4KKyAqCisgKglCeSB0aGUgdGltZSB3ZSBnZXQgaGVyZSB0aGUgZmlyc3QgMzIgYml0cyBvZiB0aGUgZmlsZSBoYXZlIGFscmVhZHkgYmVlbgorICoJcmVhZCwgYW5kIHdlJ3JlIHByZXR0eSBzdXJlIHRoYXQgd2UncmUgbG9va2luZyBhdCBhbiBBSUZGIGZpbGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitwYXJzZV9haWZmX2hlYWRlcihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgRklMRSAqIHNmKQoreworICAgIGxvbmcgICAgY2h1bmtTaXplID0gMCwgc3ViU2l6ZSA9IDAsIHR5cGVJRCA9IDAsIGRhdGFUeXBlID0gSUZGX0lEX05PTkU7CisgICAgSUZGX0FJRkYgYWlmZl9pbmZvOworICAgIGludCAgICAgc2Vlbl9jb21tX2NodW5rID0gMCwgc2Vlbl9zc25kX2NodW5rID0gMDsKKyAgICBsb25nICAgIHBjbV9kYXRhX3BvcyA9IC0xOworCisgICAgbWVtc2V0KCZhaWZmX2luZm8sIDAsIHNpemVvZihhaWZmX2luZm8pKTsKKyAgICBjaHVua1NpemUgPSBSZWFkMzJCaXRzSGlnaExvdyhzZik7CisKKyAgICB0eXBlSUQgPSBSZWFkMzJCaXRzSGlnaExvdyhzZik7CisgICAgaWYgKCh0eXBlSUQgIT0gSUZGX0lEX0FJRkYpICYmICh0eXBlSUQgIT0gSUZGX0lEX0FJRkMpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB3aGlsZSAoY2h1bmtTaXplID4gMCkgeworICAgICAgICBsb25nICAgIGNrU2l6ZTsKKyAgICAgICAgaW50ICAgICB0eXBlID0gUmVhZDMyQml0c0hpZ2hMb3coc2YpOworICAgICAgICBjaHVua1NpemUgLT0gNDsKKworICAgICAgICAvKiBERUJVR0YoCisgICAgICAgICAgICJmb3VuZCBjaHVuayB0eXBlICUwOHggJyU0LjRzJ1xuIiwgdHlwZSwgKGNoYXIqKSZ0eXBlKTsgKi8KKworICAgICAgICAvKiBkb24ndCB1c2UgYSBzd2l0Y2ggaGVyZSB0byBtYWtlIGl0IGVhc2llciB0byB1c2UgJ2JyZWFrJyBmb3IgU1NORCAqLworICAgICAgICBpZiAodHlwZSA9PSBJRkZfSURfQ09NTSkgeworICAgICAgICAgICAgc2Vlbl9jb21tX2NodW5rID0gc2Vlbl9zc25kX2NodW5rICsgMTsKKyAgICAgICAgICAgIHN1YlNpemUgPSBSZWFkMzJCaXRzSGlnaExvdyhzZik7CisgICAgICAgICAgICBja1NpemUgPSBtYWtlX2V2ZW5fbnVtYmVyX29mX2J5dGVzX2luX2xlbmd0aChzdWJTaXplKTsKKyAgICAgICAgICAgIGNodW5rU2l6ZSAtPSBja1NpemU7CisKKyAgICAgICAgICAgIGFpZmZfaW5mby5udW1DaGFubmVscyA9IFJlYWQxNkJpdHNIaWdoTG93KHNmKTsKKyAgICAgICAgICAgIGNrU2l6ZSAtPSAyOworICAgICAgICAgICAgYWlmZl9pbmZvLm51bVNhbXBsZUZyYW1lcyA9IFJlYWQzMkJpdHNIaWdoTG93KHNmKTsKKyAgICAgICAgICAgIGNrU2l6ZSAtPSA0OworICAgICAgICAgICAgYWlmZl9pbmZvLnNhbXBsZVNpemUgPSBSZWFkMTZCaXRzSGlnaExvdyhzZik7CisgICAgICAgICAgICBja1NpemUgLT0gMjsKKyAgICAgICAgICAgIGFpZmZfaW5mby5zYW1wbGVSYXRlID0gUmVhZEllZWVFeHRlbmRlZEhpZ2hMb3coc2YpOworICAgICAgICAgICAgY2tTaXplIC09IDEwOworICAgICAgICAgICAgaWYgKHR5cGVJRCA9PSBJRkZfSURfQUlGQykgeworICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gUmVhZDMyQml0c0hpZ2hMb3coc2YpOworICAgICAgICAgICAgICAgIGNrU2l6ZSAtPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZza2lwKHNmLCBja1NpemUsIFNFRUtfQ1VSKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IElGRl9JRF9TU05EKSB7CisgICAgICAgICAgICBzZWVuX3NzbmRfY2h1bmsgPSAxOworICAgICAgICAgICAgc3ViU2l6ZSA9IFJlYWQzMkJpdHNIaWdoTG93KHNmKTsKKyAgICAgICAgICAgIGNrU2l6ZSA9IG1ha2VfZXZlbl9udW1iZXJfb2ZfYnl0ZXNfaW5fbGVuZ3RoKHN1YlNpemUpOworICAgICAgICAgICAgY2h1bmtTaXplIC09IGNrU2l6ZTsKKworICAgICAgICAgICAgYWlmZl9pbmZvLmJsa0FsZ24ub2Zmc2V0ID0gUmVhZDMyQml0c0hpZ2hMb3coc2YpOworICAgICAgICAgICAgY2tTaXplIC09IDQ7CisgICAgICAgICAgICBhaWZmX2luZm8uYmxrQWxnbi5ibG9ja1NpemUgPSBSZWFkMzJCaXRzSGlnaExvdyhzZik7CisgICAgICAgICAgICBja1NpemUgLT0gNDsKKworICAgICAgICAgICAgYWlmZl9pbmZvLnNhbXBsZVR5cGUgPSBJRkZfSURfU1NORDsKKworICAgICAgICAgICAgaWYgKHNlZW5fY29tbV9jaHVuayA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZnNraXAoc2YsIChsb25nKSBhaWZmX2luZm8uYmxrQWxnbi5vZmZzZXQsIFNFRUtfQ1VSKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgLyogV2UndmUgZm91bmQgdGhlIGF1ZGlvIGRhdGEuIFJlYWQgbm8gZnVydGhlciEgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBjbV9kYXRhX3BvcyA9IGZ0ZWxsKHNmKTsKKyAgICAgICAgICAgIGlmIChwY21fZGF0YV9wb3MgPj0gMCkgeworICAgICAgICAgICAgICAgIHBjbV9kYXRhX3BvcyArPSBhaWZmX2luZm8uYmxrQWxnbi5vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnNraXAoc2YsIGNrU2l6ZSwgU0VFS19DVVIpICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3ViU2l6ZSA9IFJlYWQzMkJpdHNIaWdoTG93KHNmKTsKKyAgICAgICAgICAgIGNrU2l6ZSA9IG1ha2VfZXZlbl9udW1iZXJfb2ZfYnl0ZXNfaW5fbGVuZ3RoKHN1YlNpemUpOworICAgICAgICAgICAgY2h1bmtTaXplIC09IGNrU2l6ZTsKKworICAgICAgICAgICAgaWYgKGZza2lwKHNmLCBja1NpemUsIFNFRUtfQ1VSKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGF0YVR5cGUgPT0gSUZGX0lEXzJDTEUpIHsKKyAgICAgICAgZ2xvYmFsLiBwY21zd2FwYnl0ZXMgPSBzd2FwYnl0ZXM7CisgICAgfQorICAgIGVsc2UgaWYgKGRhdGFUeXBlID09IElGRl9JRF8yQ0JFKSB7CisgICAgICAgIGdsb2JhbC4gcGNtc3dhcGJ5dGVzID0gIXN3YXBieXRlczsKKyAgICB9CisgICAgZWxzZSBpZiAoZGF0YVR5cGUgPT0gSUZGX0lEX05PTkUpIHsKKyAgICAgICAgZ2xvYmFsLiBwY21zd2FwYnl0ZXMgPSAhc3dhcGJ5dGVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIERFQlVHRigiUGFyc2VkIEFJRkYgJWRcbiIsIGlzX2FpZmYpOyAqLworICAgIGlmIChzZWVuX2NvbW1fY2h1bmsgJiYgKHNlZW5fc3NuZF9jaHVuayA+IDAgfHwgYWlmZl9pbmZvLm51bVNhbXBsZUZyYW1lcyA9PSAwKSkgeworICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIGhlYWRlciBpcyBzYW5lICovCisgICAgICAgIGlmICgwICE9IGFpZmZfY2hlY2syKCZhaWZmX2luZm8pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICgtMSA9PSBsYW1lX3NldF9udW1fY2hhbm5lbHMoZ2ZwLCBhaWZmX2luZm8ubnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVsczogJXVcbiIsIGFpZmZfaW5mby5udW1DaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgbGFtZV9zZXRfaW5fc2FtcGxlcmF0ZShnZnAsIChpbnQpIGFpZmZfaW5mby5zYW1wbGVSYXRlKTsKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X251bV9zYW1wbGVzKGdmcCwgYWlmZl9pbmZvLm51bVNhbXBsZUZyYW1lcyk7CisgICAgICAgIGdsb2JhbC4gcGNtYml0d2lkdGggPSBhaWZmX2luZm8uc2FtcGxlU2l6ZTsKKyAgICAgICAgZ2xvYmFsLiBwY21faXNfdW5zaWduZWRfOGJpdCA9IDA7CisgICAgICAgIAorICAgICAgICBpZiAocGNtX2RhdGFfcG9zID49IDApIHsKKyAgICAgICAgICAgIGlmIChmc2VlayhzZiwgcGNtX2RhdGFfcG9zLCBTRUVLX1NFVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIkNhbid0IHJld2luZCBzdHJlYW0gdG8gYXVkaW8gZGF0YSBwb3NpdGlvblxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogcGFyc2VfZmlsZV9oZWFkZXIKKyoKKyogUFVSUE9TRTogUmVhZCB0aGUgaGVhZGVyIGZyb20gYSBieXRlc3RyZWFtLiAgVHJ5IHRvIGRldGVybWluZSB3aGV0aGVyCisqCQkgICBpdCdzIGEgV0FWIGZpbGUgb3IgQUlGRiB3aXRob3V0IHJld2luZGluZywgc2luY2UgcmV3aW5kCisqCQkgICBkb2Vzbid0IHdvcmsgb24gcGlwZXMgYW5kIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB3ZSdyZSByZWFkaW5nCisqCQkgICBmcm9tIHN0ZGluIChvdGhlcndpc2Ugd2UnZCBwcm9iYWJseSBiZSB1c2luZyBsaWJzbmRmaWxlKS4KKyoKKyogV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBmaWxlIG9mZnNldCB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlCisqIGJlZ2lubmluZyBvZiB0aGUgc291bmQgZGF0YS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorcGFyc2VfZmlsZV9oZWFkZXIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIEZJTEUgKiBzZikKK3sKKworICAgIGludCAgICAgdHlwZSA9IFJlYWQzMkJpdHNIaWdoTG93KHNmKTsKKyAgICAvKgorICAgICAgIERFQlVHRigKKyAgICAgICAiRmlyc3Qgd29yZCBvZiBpbnB1dCBzdHJlYW06ICUwOHggJyU0LjRzJ1xuIiwgdHlwZSwgKGNoYXIqKSAmdHlwZSk7IAorICAgICAqLworICAgIGdsb2JhbC4gY291bnRfc2FtcGxlc19jYXJlZnVsbHkgPSAwOworICAgIGdsb2JhbC4gcGNtX2lzX3Vuc2lnbmVkXzhiaXQgPSBpbl9zaWduZWQgPT0gMSA/IDAgOiAxOworICAgIC8qaW5wdXRfZm9ybWF0ID0gc2ZfcmF3OyBjb21tZW50ZWQgb3V0LCBiZWNhdXNlIGl0IGlzIGJldHRlciB0byBmYWlsCisgICAgICAgaGVyZSBhcyB0byBlbmNvZGUgc29tZSBodW5kcmVkcyBvZiBpbnB1dCBmaWxlcyBub3Qgc3VwcG9ydGVkIGJ5IExBTUUKKyAgICAgICBJZiB5b3Uga25vdyB5b3UgaGF2ZSBSQVcgUENNIGRhdGEsIHVzZSB0aGUgLXIgc3dpdGNoCisgICAgICovCisKKyAgICBpZiAodHlwZSA9PSBXQVZfSURfUklGRikgeworICAgICAgICAvKiBJdCdzIHByb2JhYmx5IGEgV0FWIGZpbGUgKi8KKyAgICAgICAgaW50IGNvbnN0IHJldCA9IHBhcnNlX3dhdmVfaGVhZGVyKGdmcCwgc2YpOyAKKyAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgIGdsb2JhbC4gY291bnRfc2FtcGxlc19jYXJlZnVsbHkgPSAxOworICAgICAgICAgICAgcmV0dXJuIHNmX3dhdmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiV2FybmluZzogY29ycnVwdCBvciB1bnN1cHBvcnRlZCBXQVZFIGZvcm1hdFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZSA9PSBJRkZfSURfRk9STSkgeworICAgICAgICAvKiBJdCdzIHByb2JhYmx5IGFuIEFJRkYgZmlsZSAqLworICAgICAgICBpbnQgY29uc3QgcmV0ID0gcGFyc2VfYWlmZl9oZWFkZXIoZ2ZwLCBzZik7CisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBnbG9iYWwuIGNvdW50X3NhbXBsZXNfY2FyZWZ1bGx5ID0gMTsKKyAgICAgICAgICAgIHJldHVybiBzZl9haWZmOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIldhcm5pbmc6IGNvcnJ1cHQgb3IgdW5zdXBwb3J0ZWQgQUlGRiBmb3JtYXRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50ZigiV2FybmluZzogdW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0XG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2ZfdW5rbm93bjsKK30KKworCisKK3ZvaWQKK0Nsb3NlU25kRmlsZShzb3VuZF9maWxlX2Zvcm1hdCBpbnB1dCwgRklMRSAqIG11c2ljaW4pCit7CisgICAgKHZvaWQpIGlucHV0OworICAgIGlmIChmY2xvc2UobXVzaWNpbikgIT0gMCkgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50ZigiQ291bGQgbm90IGNsb3NlIGF1ZGlvIGlucHV0IGZpbGVcbiIpOworICAgICAgICB9CisgICAgICAgIGV4aXQoMik7CisgICAgfQorfQorCisKKworCisKK0ZJTEUgICAqCitPcGVuU25kRmlsZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgY2hhciAqaW5QYXRoLCBpbnQgKmVuY19kZWxheSwgaW50ICplbmNfcGFkZGluZykKK3sKKyAgICBGSUxFICAgKm11c2ljaW47CisKKyAgICAvKiBzZXQgdGhlIGRlZmF1bHRzIGZyb20gaW5mbyBpbmNhc2Ugd2UgY2Fubm90IGRldGVybWluZSB0aGVtIGZyb20gZmlsZSAqLworICAgIGxhbWVfc2V0X251bV9zYW1wbGVzKGdmcCwgTUFYX1VfMzJfTlVNKTsKKworCisgICAgaWYgKCFzdHJjbXAoaW5QYXRoLCAiLSIpKSB7CisgICAgICAgIGxhbWVfc2V0X3N0cmVhbV9iaW5hcnlfbW9kZShtdXNpY2luID0gc3RkaW4pOyAvKiBSZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoKG11c2ljaW4gPSBmb3BlbihpblBhdGgsICJyYiIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIkNvdWxkIG5vdCBmaW5kIFwiJXNcIi5cbiIsIGluUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX21wZWdfZmlsZV9mb3JtYXQoaW5wdXRfZm9ybWF0KSkgeworI2lmZGVmIEFNSUdBX01QRUdBCisgICAgICAgIGlmICgtMSA9PSBsYW1lX2RlY29kZV9pbml0ZmlsZShpblBhdGgsICZtcDNpbnB1dF9kYXRhKSkgeworICAgICAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvciByZWFkaW5nIGhlYWRlcnMgaW4gbXAzIGlucHV0IGZpbGUgJXMuXG4iLCBpblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgSEFWRV9NUEdMSUIKKyAgICAgICAgaWYgKC0xID09IGxhbWVfZGVjb2RlX2luaXRmaWxlKG11c2ljaW4sICZtcDNpbnB1dF9kYXRhLCBlbmNfZGVsYXksIGVuY19wYWRkaW5nKSkgeworICAgICAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvciByZWFkaW5nIGhlYWRlcnMgaW4gbXAzIGlucHV0IGZpbGUgJXMuXG4iLCBpblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICgtMSA9PSBsYW1lX3NldF9udW1fY2hhbm5lbHMoZ2ZwLCBtcDNpbnB1dF9kYXRhLnN0ZXJlbykpIHsKKyAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAldWRcbiIsIG1wM2lucHV0X2RhdGEuc3RlcmVvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X2luX3NhbXBsZXJhdGUoZ2ZwLCBtcDNpbnB1dF9kYXRhLnNhbXBsZXJhdGUpOworICAgICAgICAodm9pZCkgbGFtZV9zZXRfbnVtX3NhbXBsZXMoZ2ZwLCBtcDNpbnB1dF9kYXRhLm5zYW1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5wdXRfZm9ybWF0ID09IHNmX29nZykgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50Zigic29ycnksIHZvcmJpcyBzdXBwb3J0IGluIExBTUUgaXMgZGVwcmVjYXRlZC5cbiIpOworICAgICAgICB9CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0X2Zvcm1hdCA9PSBzZl9yYXcpIHsKKyAgICAgICAgLyogYXNzdW1lIHJhdyBQQ00gKi8KKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiQXNzdW1pbmcgcmF3IHBjbSBpbnB1dCBmaWxlIik7CisgICAgICAgICAgICBpZiAoc3dhcGJ5dGVzKQorICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIgOiBGb3JjaW5nIGJ5dGUtc3dhcHBpbmdcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGdsb2JhbC4gcGNtc3dhcGJ5dGVzID0gc3dhcGJ5dGVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW5wdXRfZm9ybWF0ID0gcGFyc2VfZmlsZV9oZWFkZXIoZ2ZwLCBtdXNpY2luKTsKKyAgICB9CisgICAgaWYgKGlucHV0X2Zvcm1hdCA9PSBzZl91bmtub3duKSB7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisKKyAgICBpZiAobGFtZV9nZXRfbnVtX3NhbXBsZXMoZ2ZwKSA9PSBNQVhfVV8zMl9OVU0gJiYgbXVzaWNpbiAhPSBzdGRpbikgeworCisgICAgICAgIGRvdWJsZSAgZmxlbiA9IGxhbWVfZ2V0X2ZpbGVfc2l6ZShpblBhdGgpOyAvKiB0cnkgdG8gZmlndXJlIG91dCBudW1fc2FtcGxlcyAqLworICAgICAgICBpZiAoZmxlbiA+PSAwKSB7CisgICAgICAgICAgICAvKiB0cnkgZmlsZSBzaXplLCBhc3N1bWUgMiBieXRlcyBwZXIgc2FtcGxlICovCisgICAgICAgICAgICBpZiAoaXNfbXBlZ19maWxlX2Zvcm1hdChpbnB1dF9mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1wM2lucHV0X2RhdGEuYml0cmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlICB0b3RhbHNlY29uZHMgPSAoZmxlbiAqIDguMCAvICgxMDAwLjAgKiBtcDNpbnB1dF9kYXRhLmJpdHJhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0bXBfbnVtX3NhbXBsZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICh0b3RhbHNlY29uZHMgKiBsYW1lX2dldF9pbl9zYW1wbGVyYXRlKGdmcCkpOworCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9udW1fc2FtcGxlcyhnZnAsIHRtcF9udW1fc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIG1wM2lucHV0X2RhdGEubnNhbXAgPSB0bXBfbnVtX3NhbXBsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X251bV9zYW1wbGVzKGdmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChmbGVuIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiAqIGxhbWVfZ2V0X251bV9jaGFubmVscyhnZnApKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtdXNpY2luOworfQorI2VuZGlmIC8qIGRlZmluZWQoTElCU05ERklMRSkgKi8KKworCisKKworCisjaWYgZGVmaW5lZChIQVZFX01QR0xJQikKK3N0YXRpYyBpbnQKK2NoZWNrX2FpZChjb25zdCB1bnNpZ25lZCBjaGFyICpoZWFkZXIpCit7CisgICAgcmV0dXJuIDAgPT0gbWVtY21wKGhlYWRlciwgIkFpRFwxIiwgNCk7Cit9CisKKy8qCisgKiBQbGVhc2UgY2hlY2sgdGhpcyBhbmQgZG9uJ3Qga2lsbCBtZSBpZiB0aGVyZSdzIGEgYnVnCisgKiBUaGlzIGlzIGEgKG5lYXJseT8pIGNvbXBsZXRlIGhlYWRlciBhbmFseXNpcyBmb3IgYSBNUEVHLTEvMi8yLjUgTGF5ZXIgSSwgSUkgb3IgSUlJCisgKiBkYXRhIHN0cmVhbQorICovCisKK3N0YXRpYyBpbnQKK2lzX3N5bmN3b3JkX21wMTIzKGNvbnN0IHZvaWQgKmNvbnN0IGhlYWRlcnB0cikKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBwID0gaGVhZGVycHRyOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGFibDJbMTZdID0geyAwLCA3LCA3LCA3LCAwLCA3LCAwLCAwLCAwLCAwLCAwLCA4LCA4LCA4LCA4LCA4IH07CisKKyAgICBpZiAoKHBbMF0gJiAweEZGKSAhPSAweEZGKQorICAgICAgICByZXR1cm4gMDsgICAgICAgLyogZmlyc3QgOCBiaXRzIG11c3QgYmUgJzEnICovCisgICAgaWYgKChwWzFdICYgMHhFMCkgIT0gMHhFMCkKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8qIG5leHQgMyBiaXRzIGFyZSBhbHNvICovCisgICAgaWYgKChwWzFdICYgMHgxOCkgPT0gMHgwOCkKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8qIG5vIE1QRUctMSwgLTIgb3IgLTIuNSAqLworICAgIHN3aXRjaCAocFsxXSAmIDB4MDYpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMHgwMDogICAgICAgICAvKiBpbGxlZ2FsIExheWVyICovCisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSAweDAyOiAgICAgICAgIC8qIExheWVyMyAqLworICAgICAgICBpZiAoaW5wdXRfZm9ybWF0ICE9IHNmX21wMyAmJiBpbnB1dF9mb3JtYXQgIT0gc2ZfbXAxMjMpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlucHV0X2Zvcm1hdCA9IHNmX21wMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDQ6ICAgICAgICAgLyogTGF5ZXIyICovCisgICAgICAgIGlmIChpbnB1dF9mb3JtYXQgIT0gc2ZfbXAyICYmIGlucHV0X2Zvcm1hdCAhPSBzZl9tcDEyMykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXRfZm9ybWF0ID0gc2ZfbXAyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwNjogICAgICAgICAvKiBMYXllcjEgKi8KKyAgICAgICAgaWYgKGlucHV0X2Zvcm1hdCAhPSBzZl9tcDEgJiYgaW5wdXRfZm9ybWF0ICE9IHNmX21wMTIzKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpbnB1dF9mb3JtYXQgPSBzZl9tcDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKHBbMV0gJiAweDA2KSA9PSAweDAwKQorICAgICAgICByZXR1cm4gMDsgICAgICAgLyogbm8gTGF5ZXIgSSwgSUkgYW5kIElJSSAqLworICAgIGlmICgocFsyXSAmIDB4RjApID09IDB4RjApCisgICAgICAgIHJldHVybiAwOyAgICAgICAvKiBiYWQgYml0cmF0ZSAqLworICAgIGlmICgocFsyXSAmIDB4MEMpID09IDB4MEMpCisgICAgICAgIHJldHVybiAwOyAgICAgICAvKiBubyBzYW1wbGUgZnJlcXVlbmN5IHdpdGggKDMyLDQ0LjEsNDgpLygxLDIsNCkgICAgICovCisgICAgaWYgKChwWzFdICYgMHgxOCkgPT0gMHgxOCAmJiAocFsxXSAmIDB4MDYpID09IDB4MDQgJiYgYWJsMltwWzJdID4+IDRdICYgKDEgPDwgKHBbM10gPj4gNikpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoKHBbM10gJiAzKSA9PSAyKQorICAgICAgICByZXR1cm4gMDsgICAgICAgLyogcmVzZXJ2ZWQgZW5waGFzaXMgbW9kZSAqLworICAgIHJldHVybiAxOworfQorCitpbnQKK2xhbWVfZGVjb2RlX2luaXRmaWxlKEZJTEUgKiBmZCwgbXAzZGF0YV9zdHJ1Y3QgKiBtcDNkYXRhLCBpbnQgKmVuY19kZWxheSwgaW50ICplbmNfcGFkZGluZykKK3sKKyAgICAvKiAgVkJSVEFHREFUQSBwVGFnRGF0YTsgKi8KKyAgICAvKiBpbnQgeGluZ19oZWFkZXIsbGVuMixudW1fZnJhbWVzOyAqLworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMF07CisgICAgaW50ICAgICByZXQ7CisgICAgc2l6ZV90ICBsZW47CisgICAgaW50ICAgICBhaWRfaGVhZGVyOworICAgIHNob3J0IGludCBwY21fbFsxMTUyXSwgcGNtX3JbMTE1Ml07CisgICAgaW50ICAgICBmcmVlZm9ybWF0ID0gMDsKKworICAgIG1lbXNldChtcDNkYXRhLCAwLCBzaXplb2YobXAzZGF0YV9zdHJ1Y3QpKTsKKyAgICBpZiAoZ2xvYmFsLmhpcCkgeworICAgICAgICBoaXBfZGVjb2RlX2V4aXQoZ2xvYmFsLmhpcCk7CisgICAgfQorICAgIGdsb2JhbC5oaXAgPSBoaXBfZGVjb2RlX2luaXQoKTsKKworICAgIGxlbiA9IDQ7CisgICAgaWYgKGZyZWFkKGJ1ZiwgMSwgbGVuLCBmZCkgIT0gbGVuKQorICAgICAgICByZXR1cm4gLTE7ICAgICAgLyogZmFpbGVkICovCisgICAgaWYgKGJ1ZlswXSA9PSAnSScgJiYgYnVmWzFdID09ICdEJyAmJiBidWZbMl0gPT0gJzMnKSB7CisgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgY29uc29sZV9wcmludGYoIklEM3YyIGZvdW5kLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmUgYXdhcmUgdGhhdCB0aGUgSUQzIHRhZyBpcyBjdXJyZW50bHkgbG9zdCB3aGVuIHRyYW5zY29kaW5nLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gNjsKKyAgICAgICAgaWYgKGZyZWFkKCZidWYsIDEsIGxlbiwgZmQpICE9IGxlbikKKyAgICAgICAgICAgIHJldHVybiAtMTsgIC8qIGZhaWxlZCAqLworICAgICAgICBidWZbMl0gJj0gMTI3OworICAgICAgICBidWZbM10gJj0gMTI3OworICAgICAgICBidWZbNF0gJj0gMTI3OworICAgICAgICBidWZbNV0gJj0gMTI3OworICAgICAgICBsZW4gPSAoKCgoKGJ1ZlsyXSA8PCA3KSArIGJ1ZlszXSkgPDwgNykgKyBidWZbNF0pIDw8IDcpICsgYnVmWzVdOworICAgICAgICBmc2tpcChmZCwgbGVuLCBTRUVLX0NVUik7CisgICAgICAgIGxlbiA9IDQ7CisgICAgICAgIGlmIChmcmVhZCgmYnVmLCAxLCBsZW4sIGZkKSAhPSBsZW4pCisgICAgICAgICAgICByZXR1cm4gLTE7ICAvKiBmYWlsZWQgKi8KKyAgICB9CisgICAgYWlkX2hlYWRlciA9IGNoZWNrX2FpZChidWYpOworICAgIGlmIChhaWRfaGVhZGVyKSB7CisgICAgICAgIGlmIChmcmVhZCgmYnVmLCAxLCAyLCBmZCkgIT0gMikKKyAgICAgICAgICAgIHJldHVybiAtMTsgIC8qIGZhaWxlZCAqLworICAgICAgICBhaWRfaGVhZGVyID0gKHVuc2lnbmVkIGNoYXIpIGJ1ZlswXSArIDI1NiAqICh1bnNpZ25lZCBjaGFyKSBidWZbMV07CisgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgY29uc29sZV9wcmludGYoIkFsYnVtIElEIGZvdW5kLiAgbGVuZ3RoPSVpIFxuIiwgYWlkX2hlYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgLyogc2tpcCByZXN0IG9mIEFJRCwgZXhjZXB0IGZvciA2IGJ5dGVzIHdlIGhhdmUgYWxyZWFkeSByZWFkICovCisgICAgICAgIGZza2lwKGZkLCBhaWRfaGVhZGVyIC0gNiwgU0VFS19DVVIpOworCisgICAgICAgIC8qIHJlYWQgNCBtb3JlIGJ5dGVzIHRvIHNldCB1cCBidWZmZXIgZm9yIE1QMyBoZWFkZXIgY2hlY2sgKi8KKyAgICAgICAgaWYgKGZyZWFkKCZidWYsIDEsIGxlbiwgZmQpICE9IGxlbikKKyAgICAgICAgICAgIHJldHVybiAtMTsgIC8qIGZhaWxlZCAqLworICAgIH0KKyAgICBsZW4gPSA0OworICAgIHdoaWxlICghaXNfc3luY3dvcmRfbXAxMjMoYnVmKSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykKKyAgICAgICAgICAgIGJ1ZltpXSA9IGJ1ZltpICsgMV07CisgICAgICAgIGlmIChmcmVhZChidWYgKyBsZW4gLSAxLCAxLCAxLCBmZCkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsgIC8qIGZhaWxlZCAqLworICAgIH0KKworICAgIGlmICgoYnVmWzJdICYgMHhmMCkgPT0gMCkgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJJbnB1dCBmaWxlIGlzIGZyZWVmb3JtYXQuXG4iKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlZm9ybWF0ID0gMTsKKyAgICB9CisgICAgLyogbm93IHBhcnNlIHRoZSBjdXJyZW50IGJ1ZmZlciBsb29raW5nIGZvciBNUDMgaGVhZGVycy4gICAgKi8KKyAgICAvKiAoYXMgb2YgMTEvMDA6IG1wZ2xpYiBtb2RpZmllZCBzbyB0aGF0IGZvciB0aGUgZmlyc3QgZnJhbWUgd2hlcmUgICovCisgICAgLyogaGVhZGVycyBhcmUgcGFyc2VkLCBubyBkYXRhIHdpbGwgYmUgZGVjb2RlZC4gICAqLworICAgIC8qIEhvd2V2ZXIsIGZvciBmcmVlZm9ybWF0LCB3ZSBuZWVkIHRvIGRlY29kZSBhbiBlbnRpcmUgZnJhbWUsICovCisgICAgLyogc28gbXAzZGF0YS0+Yml0cmF0ZSB3aWxsIGJlIDAgdW50aWwgd2UgaGF2ZSBkZWNvZGVkIHRoZSBmaXJzdCAqLworICAgIC8qIGZyYW1lLiAgQ2Fubm90IGRlY29kZSBmaXJzdCBmcmFtZSBoZXJlIGJlY2F1c2Ugd2UgYXJlIG5vdCAqLworICAgIC8qIHlldCBwcmVwYXJlZCB0byBoYW5kbGUgdGhlIG91dHB1dC4gKi8KKyAgICByZXQgPSBoaXBfZGVjb2RlMV9oZWFkZXJzQihnbG9iYWwuaGlwLCBidWYsIGxlbiwgcGNtX2wsIHBjbV9yLCBtcDNkYXRhLCBlbmNfZGVsYXksIGVuY19wYWRkaW5nKTsKKyAgICBpZiAoLTEgPT0gcmV0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiByZXBlYXQgdW50aWwgd2UgZGVjb2RlIGEgdmFsaWQgbXAzIGhlYWRlci4gICovCisgICAgd2hpbGUgKCFtcDNkYXRhLT5oZWFkZXJfcGFyc2VkKSB7CisgICAgICAgIGxlbiA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGZkKTsKKyAgICAgICAgaWYgKGxlbiAhPSBzaXplb2YoYnVmKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0ID0gaGlwX2RlY29kZTFfaGVhZGVyc0IoZ2xvYmFsLmhpcCwgYnVmLCBsZW4sIHBjbV9sLCBwY21fciwgbXAzZGF0YSwgZW5jX2RlbGF5LCBlbmNfcGFkZGluZyk7CisgICAgICAgIGlmICgtMSA9PSByZXQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1wM2RhdGEtPmJpdHJhdGUgPT0gMCAmJiAhZnJlZWZvcm1hdCkgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50ZigiZmFpbCB0byBzeW5jLi4uXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFtZV9kZWNvZGVfaW5pdGZpbGUoZmQsIG1wM2RhdGEsIGVuY19kZWxheSwgZW5jX3BhZGRpbmcpOworICAgIH0KKworICAgIGlmIChtcDNkYXRhLT50b3RhbGZyYW1lcyA+IDApIHsKKyAgICAgICAgLyogbXBnbGliIGZvdW5kIGEgWGluZyBWQlIgaGVhZGVyIGFuZCBjb21wdXRlZCBuc2FtcCAmIHRvdGFsZnJhbWVzICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBzZXQgYXMgdW5rbm93bi4gIExhdGVyLCB3ZSB3aWxsIHRha2UgYSBndWVzcyBiYXNlZCBvbiBmaWxlIHNpemUKKyAgICAgICAgICogYW50IGJpdHJhdGUgKi8KKyAgICAgICAgbXAzZGF0YS0+bnNhbXAgPSBNQVhfVV8zMl9OVU07CisgICAgfQorCisKKyAgICAvKgorICAgICAgIHJlcG9ydF9wcmludGYoInJldCA9ICVpIE5FRURfTU9SRT0laSBcbiIscmV0LE1QM19ORUVEX01PUkUpOworICAgICAgIHJlcG9ydF9wcmludGYoInN0ZXJlbyA9ICVpIFxuIixtcC5mci5zdGVyZW8pOworICAgICAgIHJlcG9ydF9wcmludGYoInNhbXAgPSAlaSAgXG4iLGZyZXFzW21wLmZyLnNhbXBsaW5nX2ZyZXF1ZW5jeV0pOworICAgICAgIHJlcG9ydF9wcmludGYoImZyYW1lc2l6ZSA9ICVpICBcbiIsZnJhbWVzaXplKTsKKyAgICAgICByZXBvcnRfcHJpbnRmKCJiaXRyYXRlID0gJWkgIFxuIixtcDNkYXRhLT5iaXRyYXRlKTsKKyAgICAgICByZXBvcnRfcHJpbnRmKCJudW0gZnJhbWVzID0gJXVpICBcbiIsbnVtX2ZyYW1lcyk7CisgICAgICAgcmVwb3J0X3ByaW50ZigibnVtIHNhbXAgPSAldWkgIFxuIixtcDNkYXRhLT5uc2FtcCk7CisgICAgICAgcmVwb3J0X3ByaW50ZigibW9kZSAgICAgPSAlaSAgXG4iLG1wLmZyLm1vZGUpOworICAgICAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCitGb3IgbGFtZV9kZWNvZGVfZnJvbWZpbGU6ICByZXR1cm4gY29kZQorICAtMSAgICAgZXJyb3IKKyAgIG4gICAgIG51bWJlciBvZiBzYW1wbGVzIG91dHB1dC4gIGVpdGhlciA1NzYgb3IgMTE1MiBkZXBlbmRpbmcgb24gTVAzIGZpbGUuCisKKworRm9yIGxhbWVfZGVjb2RlMV9oZWFkZXJzKCk6ICByZXR1cm4gY29kZQorICAtMSAgICAgZXJyb3IKKyAgIDAgICAgIG9rLCBidXQgbmVlZCBtb3JlIGRhdGEgYmVmb3JlIG91dHB1dGluZyBhbnkgc2FtcGxlcworICAgbiAgICAgbnVtYmVyIG9mIHNhbXBsZXMgb3V0cHV0LiAgZWl0aGVyIDU3NiBvciAxMTUyIGRlcGVuZGluZyBvbiBNUDMgZmlsZS4KKyovCitpbnQKK2xhbWVfZGVjb2RlX2Zyb21maWxlKEZJTEUgKiBmZCwgc2hvcnQgcGNtX2xbXSwgc2hvcnQgcGNtX3JbXSwgbXAzZGF0YV9zdHJ1Y3QgKiBtcDNkYXRhKQoreworICAgIGludCAgICAgcmV0ID0gMDsKKyAgICBzaXplX3QgIGxlbiA9IDA7CisgICAgdW5zaWduZWQgY2hhciBidWZbMTAyNF07CisKKyAgICAvKiBmaXJzdCBzZWUgaWYgd2Ugc3RpbGwgaGF2ZSBkYXRhIGJ1ZmZlcmVkIGluIHRoZSBkZWNvZGVyOiAqLworICAgIHJldCA9IGhpcF9kZWNvZGUxX2hlYWRlcnMoZ2xvYmFsLmhpcCwgYnVmLCBsZW4sIHBjbV9sLCBwY21fciwgbXAzZGF0YSk7CisgICAgaWYgKHJldCAhPSAwKQorICAgICAgICByZXR1cm4gcmV0OworCisKKyAgICAvKiByZWFkIHVudGlsIHdlIGdldCBhIHZhbGlkIG91dHB1dCBmcmFtZSAqLworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGxlbiA9IGZyZWFkKGJ1ZiwgMSwgMTAyNCwgZmQpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIC8qIHdlIGFyZSBkb25lIHJlYWRpbmcgdGhlIGZpbGUsIGJ1dCBjaGVjayBmb3IgYnVmZmVyZWQgZGF0YSAqLworICAgICAgICAgICAgcmV0ID0gaGlwX2RlY29kZTFfaGVhZGVycyhnbG9iYWwuaGlwLCBidWYsIGxlbiwgcGNtX2wsIHBjbV9yLCBtcDNkYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgICAgIGhpcF9kZWNvZGVfZXhpdChnbG9iYWwuaGlwKTsgLyogcmVsZWFzZSBtcDNkZWNvZGVyIG1lbW9yeSAqLworICAgICAgICAgICAgICAgIGdsb2JhbC5oaXAgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLyogZG9uZSB3aXRoIGZpbGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gaGlwX2RlY29kZTFfaGVhZGVycyhnbG9iYWwuaGlwLCBidWYsIGxlbiwgcGNtX2wsIHBjbV9yLCBtcDNkYXRhKTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgaGlwX2RlY29kZV9leGl0KGdsb2JhbC5oaXApOyAvKiByZWxlYXNlIG1wM2RlY29kZXIgbWVtb3J5ICovCisgICAgICAgICAgICBnbG9iYWwuaGlwID0gMDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9NUEdMSUIpICovCisKKworaW50Citpc19tcGVnX2ZpbGVfZm9ybWF0KGludCBpbnB1dF9maWxlX2Zvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKGlucHV0X2ZpbGVfZm9ybWF0KSB7CisgICAgY2FzZSBzZl9tcDE6CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2Ugc2ZfbXAyOgorICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIHNmX21wMzoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgY2FzZSBzZl9tcDEyMzoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogZW5kIG9mIGdldF9hdWRpby5jICovCmRpZmYgLS1naXQgYS9mcm9udGVuZC9nZXRfYXVkaW8uaCBiL2Zyb250ZW5kL2dldF9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzE3NjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9nZXRfYXVkaW8uaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqCUdldCBBdWRpbyByb3V0aW5lcyBpbmNsdWRlIGZpbGUKKyAqCisgKglDb3B5cmlnaHQgKGMpIDE5OTkgQWxiZXJ0IEwgRmFiZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworCisjaWZuZGVmIExBTUVfR0VUX0FVRElPX0gKKyNkZWZpbmUgTEFNRV9HRVRfQVVESU9fSAorI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIGVudW0gc291bmRfZmlsZV9mb3JtYXRfZSB7CisgICAgc2ZfdW5rbm93biwKKyAgICBzZl9yYXcsCisgICAgc2Zfd2F2ZSwKKyAgICBzZl9haWZmLAorICAgIHNmX21wMSwgICAgICAgICAgICAgICAgICAvKiBNUEVHIExheWVyIDEsIGFrYSBtcGcgKi8KKyAgICBzZl9tcDIsICAgICAgICAgICAgICAgICAgLyogTVBFRyBMYXllciAyICovCisgICAgc2ZfbXAzLCAgICAgICAgICAgICAgICAgIC8qIE1QRUcgTGF5ZXIgMyAqLworICAgIHNmX21wMTIzLCAgICAgICAgICAgICAgICAvKiBNUEVHIExheWVyIDEsMiBvciAzOyB3aGF0ZXZlciAubXAzLCAubXAyLCAubXAxIG9yIC5tcGcgY29udGFpbnMgKi8KKyAgICBzZl9vZ2cKK30gc291bmRfZmlsZV9mb3JtYXQ7CisKKworaW50ICAgICBpc19tcGVnX2ZpbGVfZm9ybWF0KCBpbnQgaW5wdXRfZm9ybWF0ICk7CisKK0ZJTEUgICAqaW5pdF9vdXRmaWxlKGNoYXIgKm91dFBhdGgsIGludCBkZWNvZGUpOwordm9pZCAgICBpbml0X2luZmlsZShsYW1lX2dsb2JhbF9mbGFncyAqLCBjaGFyICppblBhdGgsIGludCAqZW5jX2RlbGF5LCBpbnQgKmVuY19wYWRkaW5nKTsKK3ZvaWQgICAgY2xvc2VfaW5maWxlKHZvaWQpOworaW50ICAgICBnZXRfYXVkaW8obGFtZV9nbG9iYWxfZmxhZ3MgKiBjb25zdCBnZnAsIGludCBidWZmZXJbMl1bMTE1Ml0pOworaW50ICAgICBnZXRfYXVkaW8xNihsYW1lX2dsb2JhbF9mbGFncyAqIGNvbnN0IGdmcCwgc2hvcnQgYnVmZmVyWzJdWzExNTJdKTsKK2ludCAgICAgV3JpdGVXYXZlSGVhZGVyKEZJTEUgKiBjb25zdCBmcCwgY29uc3QgaW50IHBjbWJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyZXEsIGNvbnN0IGludCBjaGFubmVscywgY29uc3QgaW50IGJpdHMpOworCisKKworLyogdGhlIHNpbXBsZSBsYW1lIGRlY29kZXIgKi8KKy8qIEFmdGVyIGNhbGxpbmcgbGFtZV9pbml0KCksIGxhbWVfaW5pdF9wYXJhbXMoKSBhbmQKKyAqIGluaXRfaW5maWxlKCksIGNhbGwgdGhpcyByb3V0aW5lIHRvIHJlYWQgdGhlIGlucHV0IE1QMyBmaWxlIAorICogYW5kIG91dHB1dCAud2F2IGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlIHBvaW50ZXIKKyAqIGxhbWVfZGVjb2RlciB3aWxsIGlnbm9yZSB0aGUgZmlyc3QgNTI4IHNhbXBsZXMsIHNpbmNlIHRoZXNlIHNhbXBsZXMKKyAqIHJlcHJlc2VudCB0aGUgbXBnbGliIGRlY29kaW5nIGRlbGF5IChhbmQgYXJlIGFsbCAwKS4gIAorICpza2lwID0gbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAqIHNhbXBsZXMgdG8gc2tpcCwgdG8gKGZvciBleGFtcGxlKSBjb21wZW5zYXRlIGZvciB0aGUgZW5jb2RlciBkZWxheSwKKyAqIG9ubHkgdXNlZCB3aGVuIGRlY29kaW5nIG1wMyAKKyovCitpbnQgICAgIGxhbWVfZGVjb2RlcihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgRklMRSAqIG91dGYsIGludCBza2lwLCBjaGFyICppblBhdGgsIGNoYXIgKm91dFBhdGgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuY19kZWxheSwgaW50ICplbmNfcGFkZGluZyk7CisKKworCit2b2lkICAgIFN3YXBCeXRlc0luV29yZHMoc2hvcnQgKmxvYywgaW50IHdvcmRzKTsKKworCisKKyNpZmRlZiBMSUJTTkRGSUxFCisKKyNpbmNsdWRlICJzbmRmaWxlLmgiCisKKworI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTEFNRS9JU08gYnVpbHQgaW4gYXVkaW8gZmlsZSBJL08gcm91dGluZXMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJwb3J0YWJsZWlvLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgYmxvY2tBbGlnbl9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tTaXplOworfSBibG9ja0FsaWduOworCit0eXBlZGVmIHN0cnVjdCBJRkZfQUlGRl9zdHJ1Y3QgeworICAgIHNob3J0ICAgbnVtQ2hhbm5lbHM7CisgICAgdW5zaWduZWQgbG9uZyBudW1TYW1wbGVGcmFtZXM7CisgICAgc2hvcnQgICBzYW1wbGVTaXplOworICAgIGRvdWJsZSAgc2FtcGxlUmF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIHNhbXBsZVR5cGU7CisgICAgYmxvY2tBbGlnbiBibGtBbGduOworfSBJRkZfQUlGRjsKKworZXh0ZXJuIGludCBhaWZmX3JlYWRfaGVhZGVycyhGSUxFICosIElGRl9BSUZGICopOworZXh0ZXJuIGludCBhaWZmX3NlZWtfdG9fc291bmRfZGF0YShGSUxFICopOworZXh0ZXJuIGludCBhaWZmX3dyaXRlX2hlYWRlcnMoRklMRSAqLCBJRkZfQUlGRiAqKTsKK2V4dGVybiBpbnQgcGFyc2Vfd2F2aGVhZGVyKHZvaWQpOworZXh0ZXJuIGludCBwYXJzZV9haWZmKGNvbnN0IGNoYXIgZm5bXSk7CitleHRlcm4gdm9pZCBhaWZmX2NoZWNrKGNvbnN0IGNoYXIgKiwgSUZGX0FJRkYgKiwgaW50ICopOworCisKKworI2VuZGlmIC8qIGlmZGVmIExJQlNOREZJTEUgKi8KKyNlbmRpZiAvKiBpZm5kZWYgTEFNRV9HRVRfQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvZ3BrcGxvdHRpbmcuYyBiL2Zyb250ZW5kL2dwa3Bsb3R0aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0ZDBhMAotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL2dwa3Bsb3R0aW5nLmMKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKglHVEsgcGxvdHRpbmcgcm91dGluZXMgc291cmNlIGZpbGUKKyAqCisgKglDb3B5cmlnaHQgKGMpIDE5OTkgTWFyayBUYXlsb3IKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogJElkOiBncGtwbG90dGluZy5jLHYgMS4xMSAyMDA3LzA3LzI0IDE3OjQ2OjA4IGJvdXZpZ25lIEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJncGtwbG90dGluZy5oIgorCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyMgaWZuZGVmIEhBVkVfU1RSQ0hSCisjICBkZWZpbmUgc3RyY2hyIGluZGV4CisjICBkZWZpbmUgc3RycmNociByaW5kZXgKKyMgZW5kaWYKK2NoYXIgICAqc3RyY2hyKCksICpzdHJyY2hyKCk7CisjIGlmbmRlZiBIQVZFX01FTUNQWQorIyAgZGVmaW5lIG1lbWNweShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgIGRlZmluZSBtZW1tb3ZlKGQsIHMsIG4pIGJjb3B5ICgocyksIChkKSwgKG4pKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKworc3RhdGljIGdpbnQgbnVtX3Bsb3R3aW5kb3dzID0gMDsKK3N0YXRpYyBnaW50IG1heF9wbG90d2luZG93cyA9IDEwOworc3RhdGljIEdka1BpeG1hcCAqcGl4bWFwc1sxMF07CitzdGF0aWMgR3RrV2lkZ2V0ICpwaXhtYXBib3hlc1sxMF07CisKKworCisKKy8qIGNvbXB1dGUgYSBnZGtjb2xvciAqLwordm9pZAorc2V0Y29sb3IoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtDb2xvciAqIGNvbG9yLCBnaW50IHJlZCwgZ2ludCBncmVlbiwgZ2ludCBibHVlKQoreworCisgICAgLyogY29sb3JzIGluIEdka0NvbG9yIGFyZSB0YWtlbiBmcm9tIDAgdG8gNjU1MzUsIG5vdCAwIHRvIDI1NS4gICAgKi8KKyAgICBjb2xvci0+cmVkID0gcmVkICogKDY1NTM1IC8gMjU1KTsKKyAgICBjb2xvci0+Z3JlZW4gPSBncmVlbiAqICg2NTUzNSAvIDI1NSk7CisgICAgY29sb3ItPmJsdWUgPSBibHVlICogKDY1NTM1IC8gMjU1KTsKKyAgICBjb2xvci0+cGl4ZWwgPSAoZ3Vsb25nKSAoY29sb3ItPnJlZCAqIDY1NTM2ICsgY29sb3ItPmdyZWVuICogMjU2ICsgY29sb3ItPmJsdWUpOworICAgIC8qIGZpbmQgY2xvc2VzdCBpbiBjb2xvcm1hcCwgaWYgbmVlZGVkICovCisgICAgZ2RrX2NvbG9yX2FsbG9jKGd0a193aWRnZXRfZ2V0X2NvbG9ybWFwKHdpZGdldCksIGNvbG9yKTsKK30KKworCit2b2lkCitncGtfcmVkcmF3KEdka1BpeG1hcCAqIHBpeG1hcCwgR3RrV2lkZ2V0ICogcGl4bWFwYm94KQoreworICAgIC8qIHJlZHJhdyB0aGUgZW50aXJlIHBpeG1hcCAqLworICAgIGdka19kcmF3X3BpeG1hcChwaXhtYXBib3gtPndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgcGl4bWFwYm94LT5zdHlsZS0+ZmdfZ2NbR1RLX1dJREdFVF9TVEFURShwaXhtYXBib3gpXSwKKyAgICAgICAgICAgICAgICAgICAgcGl4bWFwLCAwLCAwLCAwLCAwLCBwaXhtYXBib3gtPmFsbG9jYXRpb24ud2lkdGgsIHBpeG1hcGJveC0+YWxsb2NhdGlvbi5oZWlnaHQpOworfQorCisKK3N0YXRpYyBHZGtQaXhtYXAgKioKK2ZpbmRwaXhtYXAoR3RrV2lkZ2V0ICogd2lkZ2V0KQoreworICAgIGludCAgICAgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Bsb3R3aW5kb3dzICYmIHdpZGdldCAhPSBwaXhtYXBib3hlc1tpXTsgaSsrKTsKKyAgICBpZiAoaSA+PSBudW1fcGxvdHdpbmRvd3MpIHsKKyAgICAgICAgZ19wcmludCgiZmluZHBpeG1hcCgpOiBiYWQgYXJndW1lbnQgd2lkZ2V0IFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gJnBpeG1hcHNbaV07Cit9CisKK3ZvaWQKK2dwa19ncmFwaF9kcmF3KEd0a1dpZGdldCAqIHdpZGdldCwgLyogcGxvdCBvbiB0aGlzIHdpZGdlZCAqLworICAgICAgICAgICAgICAgaW50IG4sICAgICAgICAvKiBudW1iZXIgb2YgZGF0YSBwb2ludHMgKi8KKyAgICAgICAgICAgICAgIGdkb3VibGUgKiB4Y29yZCwgZ2RvdWJsZSAqIHljb3JkLCAvKiBkYXRhICovCisgICAgICAgICAgICAgICBnZG91YmxlIHhtbiwgZ2RvdWJsZSB5bW4sIC8qIGNvb3JkaW5hdGVzIG9mIGNvcm5lcnMgKi8KKyAgICAgICAgICAgICAgIGdkb3VibGUgeG14LCBnZG91YmxlIHlteCwgaW50IGNsZWFyLCAvKiBjbGVhciBvbGQgcGxvdCBmaXJzdCAqLworICAgICAgICAgICAgICAgY2hhciAqdGl0bGUsICAvKiBhZGQgYSB0aXRsZSAob25seSBpZiBjbGVhcj0xKSAqLworICAgICAgICAgICAgICAgR2RrQ29sb3IgKiBjb2xvcikKK3sKKyAgICBHZGtQaXhtYXAgKipwcGl4bWFwOworICAgIEdka1BvaW50ICpwb2ludHM7CisgICAgaW50ICAgICBpOworICAgIGdpbnQxNiAgd2lkdGgsIGhlaWdodDsKKyAgICBHZGtGb250ICpmaXhlZF9mb250OworICAgIEdka0dDICAqZ2M7CisKKyAgICBnYyA9IGdka19nY19uZXcod2lkZ2V0LT53aW5kb3cpOworICAgIGdka19nY19zZXRfZm9yZWdyb3VuZChnYywgY29sb3IpOworCisKKworICAgIGlmICgocHBpeG1hcCA9IGZpbmRwaXhtYXAod2lkZ2V0KSkpIHsKKyAgICAgICAgd2lkdGggPSB3aWRnZXQtPmFsbG9jYXRpb24ud2lkdGg7CisgICAgICAgIGhlaWdodCA9IHdpZGdldC0+YWxsb2NhdGlvbi5oZWlnaHQ7CisKKworICAgICAgICBpZiAoY2xlYXIpIHsKKyAgICAgICAgICAgIC8qIHdoaXRlIGJhY2tncm91bmQgKi8KKyAgICAgICAgICAgIGdka19kcmF3X3JlY3RhbmdsZSgqcHBpeG1hcCwgd2lkZ2V0LT5zdHlsZS0+d2hpdGVfZ2MsIFRSVUUsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgLyogdGl0bGUgKi8KKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgIGZpeGVkX2ZvbnQgPSBnZGtfZm9udF9sb2FkKCItbWlzYy1maXhlZC1sYXJnZS1yLSotKi0qLTEwMC0qLSotKi0qLSotKiIpOworI2Vsc2UKKyAgICAgICAgICAgIGZpeGVkX2ZvbnQgPSBnZGtfZm9udF9sb2FkKCItbWlzYy1maXhlZC1tZWRpdW0tci0qLSotKi0xMDAtKi0qLSotKi1pc284ODU5LTEiKTsKKyNlbmRpZgorCisgICAgICAgICAgICBnZGtfZHJhd190ZXh0KCpwcGl4bWFwLCBmaXhlZF9mb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQtPnN0eWxlLT5mZ19nY1tHVEtfV0lER0VUX1NUQVRFKHdpZGdldCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxMCwgdGl0bGUsIHN0cmxlbih0aXRsZSkpOworICAgICAgICB9CisKKworICAgICAgICBwb2ludHMgPSBnX21hbGxvYyhuICogc2l6ZW9mKEdka1BvaW50KSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHBvaW50c1tpXS54ID0gLjUgKyAoKHhjb3JkW2ldIC0geG1uKSAqICh3aWR0aCAtIDEpIC8gKHhteCAtIHhtbikpOworICAgICAgICAgICAgcG9pbnRzW2ldLnkgPSAuNSArICgoeWNvcmRbaV0gLSB5bXgpICogKGhlaWdodCAtIDEpIC8gKHltbiAtIHlteCkpOworICAgICAgICB9CisgICAgICAgIGdka19kcmF3X2xpbmVzKCpwcGl4bWFwLCBnYywgcG9pbnRzLCBuKTsKKyAgICAgICAgZ19mcmVlKHBvaW50cyk7CisgICAgICAgIGdwa19yZWRyYXcoKnBwaXhtYXAsIHdpZGdldCk7CisgICAgfQorICAgIGdka19nY19kZXN0cm95KGdjKTsKK30KKworCisKK3ZvaWQKK2dwa19yZWN0YW5nbGVfZHJhdyhHdGtXaWRnZXQgKiB3aWRnZXQsIC8qIHBsb3Qgb24gdGhpcyB3aWRnZWQgKi8KKyAgICAgICAgICAgICAgICAgICBnZG91YmxlICogeGNvcmQsIGdkb3VibGUgKiB5Y29yZCwgLyogY29ybmVycyAqLworICAgICAgICAgICAgICAgICAgIGdkb3VibGUgeG1uLCBnZG91YmxlIHltbiwgLyogY29vcmRpbmF0ZXMgb2YgY29ybmVycyAqLworICAgICAgICAgICAgICAgICAgIGdkb3VibGUgeG14LCBnZG91YmxlIHlteCwgR2RrQ29sb3IgKiBjb2xvcikKK3sKKyAgICBHZGtQaXhtYXAgKipwcGl4bWFwOworICAgIEdka1BvaW50IHBvaW50c1syXTsKKyAgICBpbnQgICAgIGk7CisgICAgZ2ludDE2ICB3aWR0aCwgaGVpZ2h0OworICAgIEdka0dDICAqZ2M7CisKKworICAgIGdjID0gZ2RrX2djX25ldyh3aWRnZXQtPndpbmRvdyk7CisgICAgZ2RrX2djX3NldF9mb3JlZ3JvdW5kKGdjLCBjb2xvcik7CisKKworICAgIGlmICgocHBpeG1hcCA9IGZpbmRwaXhtYXAod2lkZ2V0KSkpIHsKKyAgICAgICAgd2lkdGggPSB3aWRnZXQtPmFsbG9jYXRpb24ud2lkdGg7CisgICAgICAgIGhlaWdodCA9IHdpZGdldC0+YWxsb2NhdGlvbi5oZWlnaHQ7CisKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBwb2ludHNbaV0ueCA9IC41ICsgKCh4Y29yZFtpXSAtIHhtbikgKiAod2lkdGggLSAxKSAvICh4bXggLSB4bW4pKTsKKyAgICAgICAgICAgIHBvaW50c1tpXS55ID0gLjUgKyAoKHljb3JkW2ldIC0geW14KSAqIChoZWlnaHQgLSAxKSAvICh5bW4gLSB5bXgpKTsKKyAgICAgICAgfQorICAgICAgICB3aWR0aCA9IHBvaW50c1sxXS54IC0gcG9pbnRzWzBdLnggKyAxOworICAgICAgICBoZWlnaHQgPSBwb2ludHNbMV0ueSAtIHBvaW50c1swXS55ICsgMTsKKyAgICAgICAgZ2RrX2RyYXdfcmVjdGFuZ2xlKCpwcGl4bWFwLCBnYywgVFJVRSwgcG9pbnRzWzBdLngsIHBvaW50c1swXS55LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZ3BrX3JlZHJhdygqcHBpeG1hcCwgd2lkZ2V0KTsKKyAgICB9CisgICAgZ2RrX2djX2Rlc3Ryb3koZ2MpOworfQorCisKKwordm9pZAorZ3BrX2JhcmdyYXBoX2RyYXcoR3RrV2lkZ2V0ICogd2lkZ2V0LCAvKiBwbG90IG9uIHRoaXMgd2lkZ2VkICovCisgICAgICAgICAgICAgICAgICBpbnQgbiwgICAgIC8qIG51bWJlciBvZiBkYXRhIHBvaW50cyAqLworICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqIHhjb3JkLCBnZG91YmxlICogeWNvcmQsIC8qIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIGdkb3VibGUgeG1uLCBnZG91YmxlIHltbiwgLyogY29vcmRpbmF0ZXMgb2YgY29ybmVycyAqLworICAgICAgICAgICAgICAgICAgZ2RvdWJsZSB4bXgsIGdkb3VibGUgeW14LCBpbnQgY2xlYXIsIC8qIGNsZWFyIG9sZCBwbG90IGZpcnN0ICovCisgICAgICAgICAgICAgICAgICBjaGFyICp0aXRsZSwgLyogYWRkIGEgdGl0bGUgKG9ubHkgaWYgY2xlYXI9MSkgKi8KKyAgICAgICAgICAgICAgICAgIGludCBiYXJ3aWR0aCwgLyogYmFyIHdpZHRoLiAwPWNvbXB1dGUgYmFzZWQgb24gd2luZG93IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgIEdka0NvbG9yICogY29sb3IpCit7CisgICAgR2RrUGl4bWFwICoqcHBpeG1hcDsKKyAgICBHZGtQb2ludCBwb2ludHNbMl07CisgICAgaW50ICAgICBpOworICAgIGdpbnQxNiAgd2lkdGgsIGhlaWdodCwgeCwgeSwgYmFyaGVpZ2h0OworICAgIEdka0ZvbnQgKmZpeGVkX2ZvbnQ7CisgICAgR2RrR0MgICpnYzsKKyAgICBpbnQgICAgIHRpdGxlU3BsaXQ7CisKKworICAgIGdjID0gZ2RrX2djX25ldyh3aWRnZXQtPndpbmRvdyk7CisgICAgZ2RrX2djX3NldF9mb3JlZ3JvdW5kKGdjLCBjb2xvcik7CisKKworICAgIGlmICgocHBpeG1hcCA9IGZpbmRwaXhtYXAod2lkZ2V0KSkpIHsKKyAgICAgICAgd2lkdGggPSB3aWRnZXQtPmFsbG9jYXRpb24ud2lkdGg7CisgICAgICAgIGhlaWdodCA9IHdpZGdldC0+YWxsb2NhdGlvbi5oZWlnaHQ7CisKKworICAgICAgICBpZiAoY2xlYXIpIHsKKyAgICAgICAgICAgIC8qIHdoaXRlIGJhY2tncm91bmQgKi8KKyAgICAgICAgICAgIGdka19kcmF3X3JlY3RhbmdsZSgqcHBpeG1hcCwgd2lkZ2V0LT5zdHlsZS0+d2hpdGVfZ2MsIFRSVUUsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgLyogdGl0bGUgKi8KKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgIGZpeGVkX2ZvbnQgPSBnZGtfZm9udF9sb2FkKCItbWlzYy1maXhlZC1sYXJnZS1yLSotKi0qLTEwMC0qLSotKi0qLSotKiIpOworI2Vsc2UKKyAgICAgICAgICAgIGZpeGVkX2ZvbnQgPSBnZGtfZm9udF9sb2FkKCItbWlzYy1maXhlZC1tZWRpdW0tci0qLSotKi0xMDAtKi0qLSotKi1pc284ODU5LTEiKTsKKyNlbmRpZgorCisgICAgICAgICAgICB0aXRsZVNwbGl0ID0gc3RyY3Nwbih0aXRsZSwgIlxuIik7CisKKyAgICAgICAgICAgIGlmICh0aXRsZVNwbGl0ICYmICh0aXRsZVNwbGl0ICE9IHN0cmxlbih0aXRsZSkpKSB7CisgICAgICAgICAgICAgICAgZ2RrX2RyYXdfdGV4dCgqcHBpeG1hcCwgZml4ZWRfZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldC0+c3R5bGUtPmZnX2djW0dUS19XSURHRVRfU1RBVEUod2lkZ2V0KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxMCwgdGl0bGUsIHRpdGxlU3BsaXQpOworCisgICAgICAgICAgICAgICAgZ2RrX2RyYXdfdGV4dCgqcHBpeG1hcCwgZml4ZWRfZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldC0+c3R5bGUtPmZnX2djW0dUS19XSURHRVRfU1RBVEUod2lkZ2V0KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyMiwgdGl0bGUgKyB0aXRsZVNwbGl0ICsgMSwgKHN0cmxlbih0aXRsZSkgLSB0aXRsZVNwbGl0KSAtIDEpOworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGdka19kcmF3X3RleHQoKnBwaXhtYXAsIGZpeGVkX2ZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQtPnN0eWxlLT5mZ19nY1tHVEtfV0lER0VUX1NUQVRFKHdpZGdldCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTAsIHRpdGxlLCBzdHJsZW4odGl0bGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgcG9pbnRzWzFdLnggPSAuNSArICgoeGNvcmRbaV0gLSB4bW4pICogKHdpZHRoIC0gMSkgLyAoeG14IC0geG1uKSk7CisgICAgICAgICAgICBwb2ludHNbMV0ueSA9IC41ICsgKCh5Y29yZFtpXSAtIHlteCkgKiAoaGVpZ2h0IC0gMSkgLyAoeW1uIC0geW14KSk7CisgICAgICAgICAgICBwb2ludHNbMF0ueCA9IHBvaW50c1sxXS54OworICAgICAgICAgICAgcG9pbnRzWzBdLnkgPSBoZWlnaHQgLSAxOworCisgICAgICAgICAgICB4ID0gLjUgKyAoKHhjb3JkW2ldIC0geG1uKSAqICh3aWR0aCAtIDEpIC8gKHhteCAtIHhtbikpOworICAgICAgICAgICAgeSA9IC41ICsgKCh5Y29yZFtpXSAtIHlteCkgKiAoaGVpZ2h0IC0gMSkgLyAoeW1uIC0geW14KSk7CisgICAgICAgICAgICBpZiAoIWJhcndpZHRoKQorICAgICAgICAgICAgICAgIGJhcndpZHRoID0gKHdpZHRoIC8gKG4gKyAxKSkgLSAxOworICAgICAgICAgICAgYmFyd2lkdGggPSBiYXJ3aWR0aCA+IDUgPyA1IDogYmFyd2lkdGg7CisgICAgICAgICAgICBiYXJ3aWR0aCA9IGJhcndpZHRoIDwgMSA/IDEgOiBiYXJ3aWR0aDsKKyAgICAgICAgICAgIGJhcmhlaWdodCA9IGhlaWdodCAtIDEgLSB5OworICAgICAgICAgICAgLyogZ2RrX2RyYXdfbGluZXMoKnBwaXhtYXAsZ2MscG9pbnRzLDIpOyAqLworICAgICAgICAgICAgZ2RrX2RyYXdfcmVjdGFuZ2xlKCpwcGl4bWFwLCBnYywgVFJVRSwgeCwgeSwgYmFyd2lkdGgsIGJhcmhlaWdodCk7CisKKyAgICAgICAgfQorICAgICAgICBncGtfcmVkcmF3KCpwcGl4bWFwLCB3aWRnZXQpOworICAgIH0KKyAgICBnZGtfZ2NfZGVzdHJveShnYyk7Cit9CisKKworCisKKworLyogQ3JlYXRlIGEgbmV3IGJhY2tpbmcgcGl4bWFwIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplICovCitzdGF0aWMgIGdpbnQKK2NvbmZpZ3VyZV9ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50Q29uZmlndXJlICogZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgR2RrUGl4bWFwICoqcHBpeG1hcDsKKyAgICBpZiAoKHBwaXhtYXAgPSBmaW5kcGl4bWFwKHdpZGdldCkpKSB7CisgICAgICAgIGlmICgqcHBpeG1hcCkKKyAgICAgICAgICAgIGdka19waXhtYXBfdW5yZWYoKnBwaXhtYXApOworICAgICAgICAqcHBpeG1hcCA9IGdka19waXhtYXBfbmV3KHdpZGdldC0+d2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldC0+YWxsb2NhdGlvbi53aWR0aCwgd2lkZ2V0LT5hbGxvY2F0aW9uLmhlaWdodCwgLTEpOworICAgICAgICBnZGtfZHJhd19yZWN0YW5nbGUoKnBwaXhtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQtPnN0eWxlLT53aGl0ZV9nYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIDAsIDAsIHdpZGdldC0+YWxsb2NhdGlvbi53aWR0aCwgd2lkZ2V0LT5hbGxvY2F0aW9uLmhlaWdodCk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKworLyogUmVkcmF3IHRoZSBzY3JlZW4gZnJvbSB0aGUgYmFja2luZyBwaXhtYXAgKi8KK3N0YXRpYyAgZ2ludAorZXhwb3NlX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwgR2RrRXZlbnRFeHBvc2UgKiBldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBHZGtQaXhtYXAgKipwcGl4bWFwOworICAgIGlmICgocHBpeG1hcCA9IGZpbmRwaXhtYXAod2lkZ2V0KSkpIHsKKyAgICAgICAgZ2RrX2RyYXdfcGl4bWFwKHdpZGdldC0+d2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LT5zdHlsZS0+ZmdfZ2NbR1RLX1dJREdFVF9TVEFURSh3aWRnZXQpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICpwcGl4bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmFyZWEueCwgZXZlbnQtPmFyZWEueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5hcmVhLngsIGV2ZW50LT5hcmVhLnksIGV2ZW50LT5hcmVhLndpZHRoLCBldmVudC0+YXJlYS5oZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKworCisKKworCitHdGtXaWRnZXQgKgorZ3BrX3Bsb3RfbmV3KGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBHdGtXaWRnZXQgKnBpeG1hcGJveDsKKworICAgIHBpeG1hcGJveCA9IGd0a19kcmF3aW5nX2FyZWFfbmV3KCk7CisgICAgZ3RrX2RyYXdpbmdfYXJlYV9zaXplKEdUS19EUkFXSU5HX0FSRUEocGl4bWFwYm94KSwgd2lkdGgsIGhlaWdodCk7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QocGl4bWFwYm94KSwgImV4cG9zZV9ldmVudCIsIChHdGtTaWduYWxGdW5jKSBleHBvc2VfZXZlbnQsIE5VTEwpOworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKHBpeG1hcGJveCksICJjb25maWd1cmVfZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAoR3RrU2lnbmFsRnVuYykgY29uZmlndXJlX2V2ZW50LCBOVUxMKTsKKyAgICBndGtfd2lkZ2V0X3NldF9ldmVudHMocGl4bWFwYm94LCBHREtfRVhQT1NVUkVfTUFTSyk7CisKKyAgICBpZiAobnVtX3Bsb3R3aW5kb3dzIDwgbWF4X3Bsb3R3aW5kb3dzKSB7CisgICAgICAgIHBpeG1hcGJveGVzW251bV9wbG90d2luZG93c10gPSBwaXhtYXBib3g7CisgICAgICAgIHBpeG1hcHNbbnVtX3Bsb3R3aW5kb3dzXSA9IE5VTEw7CisgICAgICAgIG51bV9wbG90d2luZG93cysrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ19wcmludCgiZ3RrX3Bsb3RhcmVhX25ldygpOiBleGNlZWRlZCBtYXhpbXVtIG9mIDEwIHBsb3RhcmVhIHdpbmRvd3NcbiIpOworICAgIH0KKworICAgIHJldHVybiBwaXhtYXBib3g7Cit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC9ncGtwbG90dGluZy5oIGIvZnJvbnRlbmQvZ3BrcGxvdHRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY5YzhjCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvZ3BrcGxvdHRpbmcuaApAQCAtMCwwICsxLDUxIEBACisvKgorICoJR1RLIHBsb3R0aW5nIHJvdXRpbmVzIGluY2x1ZGUgZmlsZQorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OSBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfR1BLUExPVFRJTkdfSAorI2RlZmluZSBMQU1FX0dQS1BMT1RUSU5HX0gKKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKworLyogYWxsb2NhdGUgYSBncmFwaGluZyB3aWRnZXQgKi8KK0d0a1dpZGdldCAqZ3BrX3Bsb3RfbmV3KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qIGdyYXBoIGEgZnVuY3Rpb24gaW4gdGhlIGdyYXBoaW5nIHdpZGdlZCAqLwordm9pZCAgICBncGtfZ3JhcGhfZHJhdyhHdGtXaWRnZXQgKiB3aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBnZG91YmxlICogeGNvcmQsIGdkb3VibGUgKiB5Y29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSB4bW4sIGdkb3VibGUgeW1uLCBnZG91YmxlIHhteCwgZ2RvdWJsZSB5bXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGVhciwgY2hhciAqdGl0bGUsIEdka0NvbG9yICogY29sb3IpOworCisvKiBkcmF3IGEgcmVjdGFuZ2xlIGluIHRoZSBncmFwaGluZyB3aWRnZXQgKi8KK3ZvaWQgICAgZ3BrX3JlY3RhbmdsZV9kcmF3KEd0a1dpZGdldCAqIHdpZGdldCwgLyogcGxvdCBvbiB0aGlzIHdpZGdlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSB4Y29yZFsyXSwgZ2RvdWJsZSB5Y29yZFsyXSwgLyogY29ybmVycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSB4bW4sIGdkb3VibGUgeW1uLCAvKiBjb29yZGluYXRlcyBvZiBjb3JuZXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIHhteCwgZ2RvdWJsZSB5bXgsIEdka0NvbG9yICogY29sb3IpOyAvKiBjb2xvciB0byB1c2UgKi8KKworLyogbWFrZSBhIGJhciBncmFwaCBpbiB0aGUgZ3JhcGhpbmcgd2lkZ2VkICovCit2b2lkICAgIGdwa19iYXJncmFwaF9kcmF3KEd0a1dpZGdldCAqIHdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGdkb3VibGUgKiB4Y29yZCwgZ2RvdWJsZSAqIHljb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIHhtbiwgZ2RvdWJsZSB5bW4sIGdkb3VibGUgeG14LCBnZG91YmxlIHlteCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsZWFyLCBjaGFyICp0aXRsZSwgaW50IGJ3aWR0aCwgR2RrQ29sb3IgKiBjb2xvcik7CisKKy8qIHNldCBmb3Jncm91bmQgY29sb3IgICovCit2b2lkICAgIHNldGNvbG9yKEd0a1dpZGdldCAqIHdpZGdldCwgR2RrQ29sb3IgKiBjb2xvciwgaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvZ3RrYW5hbC5jIGIvZnJvbnRlbmQvZ3RrYW5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjNiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9ndGthbmFsLmMKQEAgLTAsMCArMSwxNjM5IEBACisvKgorICogICAgICBHVEsgcGxvdHRpbmcgcm91dGluZXMgc291cmNlIGZpbGUKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5OSBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IGd0a2FuYWwuYyx2IDEuNDEuOC4zIDIwMDkvMDEvMTggMTU6NDQ6Mjggcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibGFtZS5oIgorI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNpbmNsdWRlICJlbmNvZGVyLmgiCisjaW5jbHVkZSAibGFtZS1hbmFseXNpcy5oIgorI2luY2x1ZGUgImdldF9hdWRpby5oIgorI2luY2x1ZGUgImd0a2FuYWwuaCIKKyNpbmNsdWRlICJncGtwbG90dGluZy5oIgorI2luY2x1ZGUgImxhbWVfZ2xvYmFsX2ZsYWdzLmgiCisKKy8qIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVtb3ZlZC4gVGhlIGZldyBkYXRhIGl0ZW1zIGFjY2Vzc2VkIGluICdnZmMnCisgICBzaG91bGQgYmUgbWFkZSBhY2Nlc3NhYmxlIGJ5IHdyaXRpbmcgYSBsYW1lX3NldF92YXJpYWJsZSgpIGZ1bmN0aW9uICovCisjaW5jbHVkZSAidXRpbC5oIgorCisjaW5jbHVkZSAiY29uc29sZS5oIgorCisKKyNpZmRlZiBfV0lOMzIKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgIGRlZmluZSBtc2xlZXAodCkgU2xlZXAodCkKKyNlbHNlCisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgIGRlZmluZSBtc2xlZXAodCkgdXNsZWVwKCh0KSAqIDEwMDApCisjZW5kaWYKKworCisKKworLyohIFN0cmluZ2lmeSBcYSB4LiAqLworI2RlZmluZSBTVFIoeCkgICAjeAorLyohIFN0cmluZ2lmeSBcYSB4LCBwZXJmb3JtIG1hY3JvIGV4cGFuc2lvbi4gKi8KKyNkZWZpbmUgWFNUUih4KSAgU1RSKHgpCisKKyNkZWZpbmUgTVAzWF9NQUpPUl9WRVJTSU9OICAgICAgMCAvKiBNYWpvciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBNUDNYX01JTk9SX1ZFUlNJT04gICAgIDgyIC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIE1QM1hfQUxQSEFfVkVSU0lPTiAgICAgIDAgLyogU2V0IG51bWJlciBpZiB0aGlzIGlzIGFuIGFscGhhIHZlcnNpb24sIG90aGVyd2lzZSB6ZXJvICovCisjZGVmaW5lIE1QM1hfQkVUQV9WRVJTSU9OICAgICAgIDAgLyogU2V0IG51bWJlciBpZiB0aGlzIGlzIGEgYmV0YSB2ZXJzaW9uLCBvdGhlcndpc2UgemVybyAqLworCisKK3Bsb3R0aW5nX2RhdGEgKnBpbmZvOworcGxvdHRpbmdfZGF0YSAqcHBsb3Q7CitwbG90dGluZ19kYXRhIFBpbmZvW05VTVBJTkZPXTsKKworCisvKiBnbG9iYWwgdmFyaWFibGVzIGZvciB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSAqLworc3RhdGljIGdpbnQgaWRsZV9rZWVwZ29pbmc7ICAvKiBwcm9jZXNzaW5nIG9mIGZyYW1lcyBpcyBPTiAqLworc3RhdGljIGdpbnQgaWRsZV9jb3VudF9tYXg7ICAvKiBudW1iZXIgb2YgZnJhbWVzIHRvIHByb2Nlc3MgYmVmb3JlIHBsb3R0aW5nICovCitzdGF0aWMgZ2ludCBpZGxlX2NvdW50OyAgICAgIC8qIHBhdXNlICYgcGxvdCB3aGVuIGlkbGVfY291bnQ9aWRlbF9jb3VudF9tYXggKi8KK3N0YXRpYyBnaW50IGlkbGVfZW5kID0gMDsgICAgLyogcHJvY2VzcyBhbGwgZnJhbWVzLCBzdG9wIGF0IGxhc3QgZnJhbWUgICovCitzdGF0aWMgZ2ludCBpZGxlX2JhY2sgPSAwOyAgIC8qIHNldCB3aGVuIHdlIGFyZSBkaXNwbGF5aW5nIHRoZSBvbGQgZGF0YSAqLworc3RhdGljIGludCBtcDNkb25lID0gMDsgICAgICAvKiBsYXN0IGZyYW1lIGhhcyBiZWVuIHJlYWQgKi8KK3N0YXRpYyBHdGtXaWRnZXQgKmZyYW1lcHJvZ3Jlc3M7IC8qIHByb2dyZXNzIGJhciAqLworc3RhdGljIEd0a1dpZGdldCAqZnJhbWVjb3VudGVyOyAvKiBwcm9ncmVzcyBjb3VudGVyICovCisKK3N0YXRpYyBpbnQgc3ViYmxvY2tfZHJhd1szXSA9IHsgMSwgMSwgMSB9OworCisvKiBtYWluIHdpbmRvdyAqLworR3RrV2lkZ2V0ICp3aW5kb3c7CisvKiBCYWNraW5nIHBpeG1hcCBmb3IgZHJhd2luZyBhcmVhcyAqLworR3RrV2lkZ2V0ICpwY21ib3g7ICAgICAgICAgICAvKiBQQ00gZGF0YSBwbG90dGVkIGhlcmUgKi8KK0d0a1dpZGdldCAqd2luYm94OyAgICAgICAgICAgLyogbXBnMTIzIHN5bnRoZXNpcyBkYXRhIHBsb3R0ZWQgaGVyZSAqLworR3RrV2lkZ2V0ICplbmVyYm94WzJdOyAgICAgICAvKiBzcGVjdHJ1bSwgZ3I9MCwxIHBsb3R0ZWQgaGVyZSAqLworR3RrV2lkZ2V0ICptZGN0Ym94WzJdOyAgICAgICAvKiBtZGN0IGNvZWZmaWNpZW50cyBncj0wLDEgcGxvdHRlZCBoZXJlICovCitHdGtXaWRnZXQgKnNmYmJveFsyXTsgICAgICAgIC8qIHNjYWxlZmFjdG9ycyBncj0wLDEgcGxvdHRlZCBoZXJlICovCitHdGtXaWRnZXQgKmhlYWRlcmJveDsgICAgICAgIC8qIG1wZzEyMyBoZWFkZXIgaW5mbyBzaG93biBoZXJlICovCisKKworc3RydWN0IGd0a2luZm9zdHJ1Y3QgeworICAgIGludCAgICAgZmlsZXR5cGU7ICAgICAgICAvKiBpbnB1dCBmaWxlIHR5cGUgMD1XQVYsIDE9TVAzICovCisgICAgaW50ICAgICBtc2ZsYWc7ICAgICAgICAgIC8qIHRvZ2dsZSBiZXR3ZWVuIEwmUiB2cyBNJlMgUENNIGRhdGEgZGlzcGxheSAqLworICAgIGludCAgICAgY2hmbGFnOyAgICAgICAgICAvKiB0b2dnbGUgYmV0d2VlbiBMICYgUiBjaGFubmVscyAqLworICAgIGludCAgICAga2JmbGFnOyAgICAgICAgICAvKiB0b2dnbGUgYmV0d2VlbiB3YXZlICMgYW5kIGJhcmtzICovCisgICAgaW50ICAgICBmbGFnMTIzOyAgICAgICAgIC8qIHNob3cgbXBnMTIzIGZyYW1lIGluZm8sIE9SIElTTyBlbmNvZGVyIGZyYW1lIGluZm8gKi8KKyAgICBkb3VibGUgIGF2ZWJpdHM7ICAgICAgICAgLyogcnVubmluZyBhdmVyYWdlIGJpdHMgcGVyIGZyYW1lICovCisgICAgaW50ICAgICBhcHByb3hiaXRzOyAgICAgIC8qIChhcHByb3gpIGJpdHMgcGVyIGZyYW1lICovCisgICAgaW50ICAgICBtYXhiaXRzOyAgICAgICAgIC8qIG1heCBiaXRzIHBlciBmcmFtZSB1c2VkIHNvIGZhciAqLworICAgIGludCAgICAgdG90ZW1waDsgICAgICAgICAvKiB0b3RhbCBvZiBmcmFtZXMgd2l0aCBkZS1lbXBoYXNpcyAqLworICAgIGludCAgICAgdG90bXM7ICAgICAgICAgICAvKiB0b3RhbCBmcmFtZXMgd2l0aCBtc19zdGVyZW8gKi8KKyAgICBpbnQgICAgIHRvdGlzOyAgICAgICAgICAgLyogdG90YWwgZnJhbWVzIHdpdGggaV9zdGVyZW8gKi8KKyAgICBpbnQgICAgIHRvdHNob3J0OyAgICAgICAgLyogdG90YWwgZ3JhbnVsZXMgd2l0aCBzaG9ydCBibG9ja3MgKi8KKyAgICBpbnQgICAgIHRvdG1peDsgICAgICAgICAgLyogdG90YWwgZ3JhbnVsZXMgd2l0aCBtaXhlZCBibG9ja3MgKi8KKyAgICBpbnQgICAgIHRvdHByZWZsYWc7ICAgICAgLyogdG90YWwgZ3JhbnVsZXMgd2l0aCBwcmVmbGFnICovCisgICAgaW50ICAgICBwdXBkYXRlOyAgICAgICAgIC8qIHBsb3Qgd2hpbGUgcHJvY2Vzc2luZywgb3Igb25seSB3aGVuIG5lZWRlZCAqLworICAgIGludCAgICAgc2ZibGluZXM7ICAgICAgICAvKiBwbG90IHNjYWxlZmFjdG9yIGJhbmRzIGluIE1EQ1QgcGxvdCAqLworICAgIGludCAgICAgZGlmZmVyZW5jZTsgICAgICAvKiBwbG90IG9yaWdpbmFsIC0gZGVjb2RlZCBpbnN0ZWFkIG9mIG9yaWcgdnMuIGRlY29kZWQgKi8KKyAgICBpbnQgICAgIHRvdGFsZnJhbWVzOworfSBndGtpbmZvOworCisKK3N0YXRpYyBsYW1lX2dsb2JhbF9mbGFncyAqZ2ZwOworbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjOworaGlwX3QgaGlwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmVhZCBvbmUgZnJhbWUgYW5kIGVuY29kZSBpdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2d0a21ha2VmcmFtZSh2b2lkKQoreworICAgIGludCAgICAgaXJlYWQgPSAwOworICAgIHN0YXRpYyBpbnQgaW5pdCA9IDA7CisgICAgc3RhdGljIGludCBtcGdsYWc7CisgICAgc3RhdGljIHNob3J0IGludCBCdWZmZXJbMl1bMTE1Ml07CisgICAgc2hvcnQgaW50IG1wZzEyM3BjbVsyXVsxMTUyXTsKKyAgICBpbnQgICAgIGNoLCBqOworICAgIGludCAgICAgbXAzY291bnQgPSAwOworICAgIGludCAgICAgbXAzb3V0ID0gMDsKKyAgICBpbnQgICAgIGNoYW5uZWxzX291dDsKKyAgICB1bnNpZ25lZCBjaGFyIG1wM2J1ZmZlcltMQU1FX01BWE1QM0JVRkZFUl07CisgICAgc3RhdGljIGludCBmcmFtZU51bSA9IDA7CisgICAgaW50ICAgICBmcmFtZXNpemUgPSBsYW1lX2dldF9mcmFtZXNpemUoZ2ZwKTsKKworICAgIGNoYW5uZWxzX291dCA9IChsYW1lX2dldF9tb2RlKGdmcCkgPT0gTU9OTykgPyAxIDogMjsKKworICAgIHBpbmZvLT5mcmFtZU51bSA9IGZyYW1lTnVtOworICAgIHBpbmZvLT5zYW1wZnJlcSA9IGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlKGdmcCk7CisgICAgcGluZm8tPmZyYW1lc2l6ZSA9IGZyYW1lc2l6ZTsKKyAgICBwaW5mby0+c3RlcmVvID0gY2hhbm5lbHNfb3V0OworCisgICAgLyogSWYgdGhlIGFuYWxzeXMgY29kZSBpcyBlbmFibGVkLCBsYW1lIHdpbGwgd3JpdGVzIGRhdGEgaW50byBnZmMtPnBpbmZvLAorICAgICAqIGFuZCBtcGcxMjMgd2lsbCB3cml0ZSBkYXRhIGludG8gcGluZm8uICBTZXQgdGhlc2Ugc28KKyAgICAgKiB0aGUgbGlicmFyaWVzIHB1dCB0aGlzIGRhdGEgaW4gdGhlIHJpZ2h0IHBsYWNlOiAqLworICAgIGdmYy0+cGluZm8gPSBwaW5mbzsKKyAgICBoaXBfc2V0X3BpbmZvKGhpcCwgcGluZm8pOworCisgICAgaWYgKGlzX21wZWdfZmlsZV9mb3JtYXQoaW5wdXRfZm9ybWF0KSkgeworICAgICAgICBpcmVhZCA9IGdldF9hdWRpbzE2KGdmcCwgQnVmZmVyKTsKKworCisgICAgICAgIC8qIGFkZCBhIGRlbGF5IG9mIGZyYW1lc2l6ZS1ERUNERUxBWSwgd2hpY2ggd2lsbCBtYWtlIHRoZSB0b3RhbCBkZWxheQorICAgICAgICAgKiBleGFjdGx5IG9uZSBmcmFtZSwgc28gd2UgY2FuIHN5bmMgTVAzIG91dHB1dCB3aXRoIFdBViBpbnB1dCAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsc19vdXQ7IGNoKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmcmFtZXNpemUgLSBERUNERUxBWTsgaisrKQorICAgICAgICAgICAgICAgIHBpbmZvLT5wY21kYXRhMltjaF1bal0gPSBwaW5mby0+cGNtZGF0YTJbY2hdW2ogKyBmcmFtZXNpemVdOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZyYW1lc2l6ZTsgaisrKSAvKnJlc2NhbGUgZnJvbSBpbnQgdG8gc2hvcnQgaW50ICovCisgICAgICAgICAgICAgICAgcGluZm8tPnBjbWRhdGEyW2NoXVtqICsgZnJhbWVzaXplIC0gREVDREVMQVldID0gQnVmZmVyW2NoXVtqXTsKKyAgICAgICAgfQorCisgICAgICAgIHBpbmZvLT5mcmFtZU51bTEyMyA9IGZyYW1lTnVtIC0gMTsKKyAgICAgICAgKytmcmFtZU51bTsKKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAvKiBmZWVkIGRhdGEgdG8gZW5jb2RlciB1bnRpbCBlbmNvZGVyIHByb2R1Y2VzIHNvbWUgb3V0cHV0ICovCisgICAgICAgIHdoaWxlIChsYW1lX2dldF9mcmFtZU51bShnZnApID09IHBpbmZvLT5mcmFtZU51bSkgeworCisgICAgICAgICAgICBpZiAoIWluaXQpIHsKKyAgICAgICAgICAgICAgICBpbml0ID0gMTsKKyAgICAgICAgICAgICAgICBtcGdsYWcgPSAxOworICAgICAgICAgICAgICAgIGlmIChoaXApIHsKKyAgICAgICAgICAgICAgICAgICAgaGlwX2RlY29kZV9leGl0KGhpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhpcCA9IGhpcF9kZWNvZGVfaW5pdCgpOworICAgICAgICAgICAgICAgIGhpcF9zZXRfcGluZm8oaGlwLCBwaW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlyZWFkID0gZ2V0X2F1ZGlvMTYoZ2ZwLCBCdWZmZXIpOworICAgICAgICAgICAgaWYgKGlyZWFkID4gZnJhbWVzaXplKSB7CisgICAgICAgICAgICAgICAgLyogTk9URTogZnJhbWUgYW5hbHl6ZXIgcmVxdWlyZXMgdGhhdCB3ZSBlbmNvZGUgb25lIGZyYW1lCisgICAgICAgICAgICAgICAgICogZm9yIGVhY2ggcGFzcyB0aHJvdWdoIHRoaXMgbG9vcC4gIElmIGxhbWVfZW5jb2RlX2J1ZmZlcigpCisgICAgICAgICAgICAgICAgICogaXMgZmVlZCBkYXRhIHRvbyBxdWlja2x5LCBpdCB3aWxsIHNvbWV0aW1lcyBlbmNvZGUgbXVsdGlwbGUgZnJhbWVzCisgICAgICAgICAgICAgICAgICogYnJlYWtpbmcgdGhpcyBsb29wLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiV2FybmluZzogZ2V0X2F1ZGlvIGlzIHJldHVybmluZyB0b28gbXVjaCBkYXRhLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXJlYWQgPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsgIC8qIGVvZiAqLworCisgICAgICAgICAgICBtcDNjb3VudCA9IGxhbWVfZW5jb2RlX2J1ZmZlcihnZnAsIEJ1ZmZlclswXSwgQnVmZmVyWzFdLCBpcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wM2J1ZmZlciwgc2l6ZW9mKG1wM2J1ZmZlcikpOworCisgICAgICAgICAgICBhc3NlcnQoIShtcDNjb3VudCA+IDAgJiYgbGFtZV9nZXRfZnJhbWVOdW0oZ2ZwKSA9PSBwaW5mby0+ZnJhbWVOdW0pKTsKKyAgICAgICAgICAgIC8qIG5vdCBwb3NzaWJsZSB0byBwcm9kdWNlIG1wMyBkYXRhIHdpdGhvdXQgZW5jb2RpbmcgYXQgbGVhc3QKKyAgICAgICAgICAgICAqIG9uZSBmcmFtZSBvZiBkYXRhIHdoaWNoIHdvdWxkIGluY3JlbWVudCBmcmFtZU51bSAqLworICAgICAgICB9CisgICAgICAgIGZyYW1lTnVtID0gbGFtZV9nZXRfZnJhbWVOdW0oZ2ZwKTsgLyogdXNlIHRoZSBpbnRlcm5hbCBNUDMgZnJhbWUgY291bnRlciAqLworCisKKyAgICAgICAgLyogZGVjb2RlIG9uZSBmcmFtZSBvZiBvdXRwdXQgKi8KKyAgICAgICAgbXAzb3V0ID0gaGlwX2RlY29kZTEoaGlwLCBtcDNidWZmZXIsIG1wM2NvdW50LCBtcGcxMjNwY21bMF0sIG1wZzEyM3BjbVsxXSk7IC8qIHJlLXN5bnRoZXNpcyB0byBwY20gKi8KKyAgICAgICAgLyogbXAzb3V0ID0gMDogIG5lZWQgbW9yZSBkYXRhIHRvIGRlY29kZSAqLworICAgICAgICAvKiBtcDNvdXQgPSAtMTogIGVycm9yLiAgTGV0cyBhc3N1bWUgMCBwY20gb3V0cHV0ICovCisgICAgICAgIC8qIG1wM291dCA9IG51bWJlciBvZiBzYW1wbGVzIG91dHB1dCAqLworICAgICAgICBpZiAobXAzb3V0ID4gMCkKKyAgICAgICAgICAgIGFzc2VydChtcDNvdXQgPT0gcGluZm8tPmZyYW1lc2l6ZSk7CisgICAgICAgIGlmIChtcDNvdXQgIT0gMCkgeworICAgICAgICAgICAgLyogZGVjb2RlZCBvdXRwdXQgaXMgZm9yIGZyYW1lIHBpbmZvLT5mcmFtZU51bTEyMworICAgICAgICAgICAgICogYWRkIGEgZGVsYXkgb2YgZnJhbWVzaXplLURFQ0RFTEFZLCB3aGljaCB3aWxsIG1ha2UgdGhlIHRvdGFsIGRlbGF5CisgICAgICAgICAgICAgKiBleGFjdGx5IG9uZSBmcmFtZSAqLworICAgICAgICAgICAgcGluZm8tPmZyYW1lTnVtMTIzID0gcGluZm8tPmZyYW1lTnVtIC0gbXBnbGFnOworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcGluZm8tPnN0ZXJlbzsgY2grKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaW5mby0+ZnJhbWVzaXplIC0gREVDREVMQVk7IGorKykKKyAgICAgICAgICAgICAgICAgICAgcGluZm8tPnBjbWRhdGEyW2NoXVtqXSA9IHBpbmZvLT5wY21kYXRhMltjaF1baiArIHBpbmZvLT5mcmFtZXNpemVdOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaW5mby0+ZnJhbWVzaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGluZm8tPnBjbWRhdGEyW2NoXVtqICsgcGluZm8tPmZyYW1lc2l6ZSAtIERFQ0RFTEFZXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobXAzb3V0ID09IC0xKSA/IDAgOiBtcGcxMjNwY21bY2hdW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtcGdsYWcgPT0gTUFYTVBHTEFHKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJSRUFEX0FIRUFEIHNldCB0b28gbG93IC0gbm90IGVub3VnaCBmcmFtZSBidWZmZXJpbmcuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUDN4IGRpc3BsYXkgb2YgaW5wdXQgYW5kIG91dHB1dCBQQ00gZGF0YSBvdXQgb2Ygc3luYy5cbiIpOworICAgICAgICAgICAgICAgIGVycm9yX2ZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXBnbGFnKys7CisgICAgICAgICAgICBwaW5mby0+ZnJhbWVOdW0xMjMgPSAtMTsgLyogbm8gZnJhbWUgb3V0cHV0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlyZWFkOworfQorCisKK3ZvaWQKK3Bsb3RfZnJhbWUodm9pZCkKK3sKKyAgICBpbnQgICAgIGksIGosIG4sIGNoLCBncjsKKyAgICBnZG91YmxlICp4Y29yZCwgKnljb3JkOworICAgIGdkb3VibGUgeG14LCB4bW4sIHlteCwgeW1uOworICAgIGRvdWJsZSAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisgICAgY2hhciAgICB0aXRsZTJbODBdOworICAgIGNoYXIgICAgbGFiZWxbODBdLCBsYWJlbDJbODBdOworICAgIGNoYXIgICAqdGl0bGU7CisgICAgcGxvdHRpbmdfZGF0YSAqcHBsb3QxOworICAgIHBsb3R0aW5nX2RhdGEgKnBwbG90MiA9IE5VTEw7CisKKyAgICBkb3VibGUgIGVuLCBzYW1wOworICAgIGludCAgICAgc2FtcGluZGV4LCB2ZXJzaW9uID0gMDsKKyAgICBpbnQgICAgIGJhcnRoaWNrOworICAgIHN0YXRpYyBpbnQgZmlyc3RjYWxsID0gMTsKKyAgICBzdGF0aWMgR2RrQ29sb3IgKmJhcmNvbG9yLCAqY29sb3IsICpncmNvbG9yWzJdOworICAgIHN0YXRpYyBHZGtDb2xvciB5ZWxsb3csIGdyYXksIGN5YW4sIG1hZ2VudGEsIG9yYW5nZSwgcGluaywgcmVkLCBncmVlbiwgYmx1ZSwgYmxhY2ssIG9uY29sb3IsCisgICAgICAgIG9mZmNvbG9yOworICAgIGludCAgICAgYmxvY2t0eXBlWzJdWzJdOworICAgIGludCAgICAgaGVhZGJpdHM7CisgICAgaW50ICAgICBtb2RlX2dyID0gMjsKKworICAgIC8qIGZpbmQgdGhlIGZyYW1lIHdoZXJlIG1wZzEyMyBwcm9kdWNlZCBvdXRwdXQgY29taW5nIGZyb20gaW5wdXQgZnJhbWUKKyAgICAgKiBwaW5mby4gIGkuZS46ICAgb3V0X2ZyYW1lICsgb3V0X2ZyYW1lX2xhZyA9IGlucHV0X2ZyYW1lICAqLworICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYTVBHTEFHOyBpKyspIHsKKyAgICAgICAgaWYgKChwcGxvdCAtIGkpLT5mcmFtZU51bTEyMyA9PSBwcGxvdC0+ZnJhbWVOdW0pIHsKKyAgICAgICAgICAgIHBwbG90MiA9IHBwbG90IC0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID4gTUFYTVBHTEFHKSB7CisgICAgICAgIGVycm9yX3ByaW50ZigiaW5wdXQvb3V0cHV0IHBjbSBzeW5jaW5nIHByb2JsZW0uICBzaG91bGQgbm90IGhhcHBlbiFcbiIpOworICAgICAgICBwcGxvdDIgPSBwcGxvdCAtIDE7CisgICAgfQorCisKKyAgICAvKiBob3dldmVyLCB0aGUgUENNIGRhdGEgaXMgZGVsYXllZCBieSA1Mjggc2FtcGxlcyBpbiB0aGUgZW5jb2RlciBmaWx0ZXJiYW5rcy4KKyAgICAgKiBXZSBhZGRlZCBhbm90aGVyIDExNTItNTI4IGRlbGF5IHRvIHRoaXMgc28gdGhlIFBDTSBkYXRhIGlzICpleGFjdGx5KiBvbmUKKyAgICAgKiBmcmFtZSBiZWhpbmQgdGhlIGhlYWRlciAmIE1EQ1QgaW5mb3JtYXRpb24gKi8KKyAgICBwcGxvdDEgPSBwcGxvdDIgKyAxOyAvKiBiYWNrIG9uZSBmcmFtZSBmb3IgaGVhZGVyIGluZm8sIE1EQ1QgKi8KKworICAgIC8qIGFsbG9jYXRlIHRoZXNlIEdDJ3Mgb25seSBvbmNlICovCisgICAgaWYgKGZpcnN0Y2FsbCkgeworICAgICAgICBmaXJzdGNhbGwgPSAwOworICAgICAgICAvKiAgICBncmNvbG9yWzBdID0gJm1hZ2VudGE7ICovCisgICAgICAgIGdyY29sb3JbMF0gPSAmYmx1ZTsKKyAgICAgICAgZ3Jjb2xvclsxXSA9ICZncmVlbjsKKyAgICAgICAgYmFyY29sb3IgPSAmZ3JheTsKKworICAgICAgICBzZXRjb2xvcihoZWFkZXJib3gsICZvbmNvbG9yLCAyNTUsIDAsIDApOworICAgICAgICBzZXRjb2xvcihoZWFkZXJib3gsICZvZmZjb2xvciwgMTc1LCAxNzUsIDE3NSk7CisgICAgICAgIHNldGNvbG9yKHBjbWJveCwgJnJlZCwgMjU1LCAwLCAwKTsKKyAgICAgICAgc2V0Y29sb3IocGNtYm94LCAmcGluaywgMjU1LCAwLCAyNTUpOworICAgICAgICBzZXRjb2xvcihwY21ib3gsICZtYWdlbnRhLCAyNTUsIDAsIDEwMCk7CisgICAgICAgIHNldGNvbG9yKHBjbWJveCwgJm9yYW5nZSwgMjU1LCAxMjcsIDApOworICAgICAgICBzZXRjb2xvcihwY21ib3gsICZjeWFuLCAwLCAyNTUsIDI1NSk7CisgICAgICAgIHNldGNvbG9yKHBjbWJveCwgJmdyZWVuLCAwLCAyNTUsIDApOworICAgICAgICBzZXRjb2xvcihwY21ib3gsICZibHVlLCAwLCAwLCAyNTUpOworICAgICAgICBzZXRjb2xvcihwY21ib3gsICZibGFjaywgMCwgMCwgMCk7CisgICAgICAgIHNldGNvbG9yKHBjbWJveCwgJmdyYXksIDEwMCwgMTAwLCAxMDApOworICAgICAgICBzZXRjb2xvcihwY21ib3gsICZ5ZWxsb3csIDI1NSwgMjU1LCAwKTsKKworICAgIH0KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBmcmFtZSBoZWFkZXIgaW5mbworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocHBsb3QxLT5zYW1wZnJlcSkKKyAgICAgICAgc2FtcCA9IHBwbG90MS0+c2FtcGZyZXE7CisgICAgZWxzZQorICAgICAgICBzYW1wID0gMTsKKyAgICBzYW1waW5kZXggPSBTbXBGcnFJbmRleCgobG9uZykgc2FtcCwgJnZlcnNpb24pOworCisgICAgY2ggPSBndGtpbmZvLmNoZmxhZzsKKworICAgIGhlYWRiaXRzID0gMzIgKyAoKHBwbG90MS0+c3RlcmVvID09IDIpID8gMjU2IDogMTM2KTsKKyAgICBndGtpbmZvLmFwcHJveGJpdHMgPSAocHBsb3QxLT5iaXRyYXRlICogMTAwMCAqIDExNTIuMCAvIHNhbXApIC0gaGVhZGJpdHM7CisgICAgc3ByaW50Zih0aXRsZTIsICIlMy4xZmtIeiAlaWticyAiLCBzYW1wIC8gMTAwMCwgcHBsb3QxLT5iaXRyYXRlKTsKKyAgICBndGtfdGV4dF9mcmVlemUoR1RLX1RFWFQoaGVhZGVyYm94KSk7CisgICAgZ3RrX3RleHRfYmFja3dhcmRfZGVsZXRlKEdUS19URVhUKGhlYWRlcmJveCksIGd0a190ZXh0X2dldF9sZW5ndGgoR1RLX1RFWFQoaGVhZGVyYm94KSkpOworICAgIGd0a190ZXh0X3NldF9wb2ludChHVEtfVEVYVChoZWFkZXJib3gpLCAwKTsKKyAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoaGVhZGVyYm94KSwgTlVMTCwgJm9uY29sb3IsIE5VTEwsIHRpdGxlMiwgLTEpOworICAgIHRpdGxlID0gIiBtb25vICI7CisgICAgaWYgKDIgPT0gcHBsb3QxLT5zdGVyZW8pCisgICAgICAgIHRpdGxlID0gcHBsb3QxLT5qcyA/ICIganMgIiA6ICIgcyAiOworICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChoZWFkZXJib3gpLCBOVUxMLCAmb25jb2xvciwgTlVMTCwgdGl0bGUsIC0xKTsKKyAgICBjb2xvciA9IHBwbG90MS0+bXNfc3RlcmVvID8gJm9uY29sb3IgOiAmb2ZmY29sb3I7CisgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGhlYWRlcmJveCksIE5VTEwsIGNvbG9yLCBOVUxMLCAibXMgIiwgLTEpOworICAgIGNvbG9yID0gcHBsb3QxLT5pX3N0ZXJlbyA/ICZvbmNvbG9yIDogJm9mZmNvbG9yOworICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChoZWFkZXJib3gpLCBOVUxMLCBjb2xvciwgTlVMTCwgImlzICIsIC0xKTsKKworICAgIGNvbG9yID0gcHBsb3QxLT5jcmMgPyAmb25jb2xvciA6ICZvZmZjb2xvcjsKKyAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoaGVhZGVyYm94KSwgTlVMTCwgY29sb3IsIE5VTEwsICJjcmMgIiwgLTEpOworICAgIGNvbG9yID0gcHBsb3QxLT5wYWRkaW5nID8gJm9uY29sb3IgOiAmb2ZmY29sb3I7CisgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGhlYWRlcmJveCksIE5VTEwsIGNvbG9yLCBOVUxMLCAicGFkICIsIC0xKTsKKworICAgIGNvbG9yID0gcHBsb3QxLT5lbXBoID8gJm9uY29sb3IgOiAmb2ZmY29sb3I7CisgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGhlYWRlcmJveCksIE5VTEwsIGNvbG9yLCBOVUxMLCAiZW0gIiwgLTEpOworCisgICAgc3ByaW50Zih0aXRsZTIsICJidj0laSwlaSAiLCBwcGxvdDEtPmJpZ192YWx1ZXNbMF1bY2hdLCBwcGxvdDEtPmJpZ192YWx1ZXNbMV1bY2hdKTsKKyAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoaGVhZGVyYm94KSwgTlVMTCwgJmJsYWNrLCBOVUxMLCB0aXRsZTIsIC0xKTsKKworICAgIGNvbG9yID0gcHBsb3QxLT5zY2ZzaVtjaF0gPyAmb25jb2xvciA6ICZvZmZjb2xvcjsKKyAgICBzcHJpbnRmKHRpdGxlMiwgInNjZnNpPSVpICAgICAgICAgICAgIiwgcHBsb3QxLT5zY2ZzaVtjaF0pOworICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChoZWFkZXJib3gpLCBOVUxMLCBjb2xvciwgTlVMTCwgdGl0bGUyLCAtMSk7CisgICAgaWYgKGd0a2luZm8uZmlsZXR5cGUpCisgICAgICAgIHNwcmludGYodGl0bGUyLCAiIG1kYj0laSAlaS9OQSIsIHBwbG90MS0+bWFpbmRhdGEsIHBwbG90MS0+dG90Yml0cyk7CisgICAgZWxzZQorICAgICAgICBzcHJpbnRmKHRpdGxlMiwgIiBtZGI9JWkgICAlaS8laSIsCisgICAgICAgICAgICAgICAgcHBsb3QxLT5tYWluZGF0YSwgcHBsb3QxLT50b3RiaXRzLCBwcGxvdDEtPnRvdGJpdHMgKyBwcGxvdC0+cmVzdnNpemUpOworICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChoZWFkZXJib3gpLCBOVUxMLCAmb25jb2xvciwgTlVMTCwgdGl0bGUyLCAtMSk7CisgICAgZ3RrX3RleHRfdGhhdyhHVEtfVEVYVChoZWFkZXJib3gpKTsKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogYmxvY2sgdHlwZQorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBtb2RlX2dyOyBncisrKQorICAgICAgICBpZiAoZ3RraW5mby5mbGFnMTIzKQorICAgICAgICAgICAgYmxvY2t0eXBlW2dyXVtjaF0gPSBwcGxvdDEtPm1wZzEyM2Jsb2NrdHlwZVtncl1bY2hdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBibG9ja3R5cGVbZ3JdW2NoXSA9IHBwbG90LT5ibG9ja3R5cGVbZ3JdW2NoXTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIGRyYXcgdGhlIFBDTSBkYXRhICoKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbiA9IDE2MDA7ICAgICAgICAgICAvKiBQQ00gZnJhbWUgKyBGRlQgd2luZG93OiAgIDIyNCArIDExNTIgKyAyMjQgICovCisgICAgeGNvcmQgPSBnX21hbGxvYyhuICogc2l6ZW9mKGdkb3VibGUpKTsKKyAgICB5Y29yZCA9IGdfbWFsbG9jKG4gKiBzaXplb2YoZ2RvdWJsZSkpOworCisKKyAgICBpZiAoZ3RraW5mby5tc2ZsYWcpCisgICAgICAgIHRpdGxlID0gY2ggPyAiU2lkZSBDaGFubmVsIiA6ICJNaWQgQ2hhbm5lbCI7CisgICAgZWxzZQorICAgICAgICB0aXRsZSA9IGNoID8gIlJpZ2h0IENoYW5uZWwiIDogIkxlZnQgQ2hhbm5lbCI7CisKKyAgICBzcHJpbnRmKHRpdGxlMiwgIiVzICBtYXNrX3JhdGlvPSUzLjJmICAlMy4yZiAgZW5lcl9yYXRpbz0lMy4yZiAgJTMuMmYiLAorICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICBwcGxvdC0+bXNfcmF0aW9bMF0sIHBwbG90LT5tc19yYXRpb1sxXSwKKyAgICAgICAgICAgIHBwbG90LT5tc19lbmVyX3JhdGlvWzBdLCBwcGxvdC0+bXNfZW5lcl9yYXRpb1sxXSk7CisKKworICAgIHltbiA9IC0zMjc2NzsKKyAgICB5bXggPSAzMjc2NzsKKyAgICB4bW4gPSAwOworICAgIHhteCA9IDE2MDAgLSAxOworCisgICAgLyogIDAgIC4uLiAyMjQgICAgICBkcmF3IGluIGJsYWNrLCBjb25uZWN0aW5nIHRvIDIyNCBwaXhlbAorICAgICAqIDEzNzUgLi4gMTU5OSAgICAgZHJhdyBpbiBibGFjayAgY29ubmVjdGluZyB0byAxMzc1IHBpeGVsCisgICAgICogMjI0IC4uLiAxMzc1ICAgICBNUDMgZnJhbWUuICBkcmF3IGluIGJsdWUKKyAgICAgKi8KKworICAgIC8qIGRyYXcgdGhlIHRpdGxlICovCisgICAgZ3BrX2dyYXBoX2RyYXcocGNtYm94LCAwLCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgMSwgdGl0bGUyLCAmYmxhY2spOworCisKKyAgICAvKiBkcmF3IHNvbWUgaGFzaCBtYXJrcyBkaXZpZGluZyB0aGUgZnJhbWVzICovCisgICAgeWNvcmRbMF0gPSB5bXggKiAuODsKKyAgICB5Y29yZFsxXSA9IHltbiAqIC44OworICAgIGZvciAoZ3IgPSAwOyBnciA8PSAyOyBncisrKSB7CisgICAgICAgIHhjb3JkWzBdID0gMjIzLjUgKyBnciAqIDU3NjsKKyAgICAgICAgeGNvcmRbMV0gPSAyMjMuNSArIGdyICogNTc2OworICAgICAgICBncGtfcmVjdGFuZ2xlX2RyYXcocGNtYm94LCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgJnllbGxvdyk7CisgICAgfQorICAgIGZvciAoZ3IgPSAwOyBnciA8IG1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgaWYgKGJsb2NrdHlwZVtncl1bY2hdID09IDIpCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IDI7IGkrKykgeworICAgICAgICAgICAgICAgIHhjb3JkWzBdID0gMjIzLjUgKyBnciAqIDU3NiArIGkgKiAxOTI7CisgICAgICAgICAgICAgICAgeGNvcmRbMV0gPSAyMjMuNSArIGdyICogNTc2ICsgaSAqIDE5MjsKKyAgICAgICAgICAgICAgICBncGtfcmVjdGFuZ2xlX2RyYXcocGNtYm94LCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgJnllbGxvdyk7CisgICAgICAgICAgICB9CisgICAgfQorICAgIC8qIGJhcnMgcmVwcmVzZW50aW5nIEZGVCB3aW5kb3dzICovCisgICAgeGNvcmRbMF0gPSAwOworICAgIHljb3JkWzBdID0geW1uICsgMzAwMDsKKyAgICB4Y29yZFsxXSA9IDEwMjQgLSAxOworICAgIHljb3JkWzFdID0geW1uICsgMTAwMDsKKyAgICBncGtfcmVjdGFuZ2xlX2RyYXcocGNtYm94LCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgZ3Jjb2xvclswXSk7CisgICAgeGNvcmRbMF0gPSA1NzY7CisgICAgeWNvcmRbMF0gPSB5bW4gKyAyMDAwOworICAgIHhjb3JkWzFdID0gNTc2ICsgMTAyNCAtIDE7CisgICAgeWNvcmRbMV0gPSB5bW47CisgICAgZ3BrX3JlY3RhbmdsZV9kcmF3KHBjbWJveCwgeGNvcmQsIHljb3JkLCB4bW4sIHltbiwgeG14LCB5bXgsIGdyY29sb3JbMV0pOworCisKKyAgICAvKiBwbG90IFBDTSBkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICB4Y29yZFtpXSA9IGk7CisgICAgICAgIGlmIChndGtpbmZvLm1zZmxhZykKKyAgICAgICAgICAgIHljb3JkW2ldID0gY2ggPyAuNSAqIChwcGxvdC0+cGNtZGF0YVswXVtpXSAtIHBwbG90LT5wY21kYXRhWzFdW2ldKSA6CisgICAgICAgICAgICAgICAgLjUgKiAocHBsb3QtPnBjbWRhdGFbMF1baV0gKyBwcGxvdC0+cGNtZGF0YVsxXVtpXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHljb3JkW2ldID0gcHBsb3QtPnBjbWRhdGFbY2hdW2ldOworICAgIH0KKworICAgIC8qIHNraXAgcGxvdCBpZiB3ZSBhcmUgZG9pbmcgYW4gbXAzIGZpbGUgKi8KKyAgICBpZiAoIWd0a2luZm8uZmlsZXR5cGUpIHsKKyAgICAgICAgZ3BrX2dyYXBoX2RyYXcocGNtYm94LCBuLCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgMCwgdGl0bGUyLCAmYmxhY2spOworICAgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGRyYXcgdGhlIFBDTSByZS1zeW50aGVzaXMgZGF0YSAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBuID0gMTE1MjsKKyAgICAvKgorICAgICAgIHNwcmludGYodGl0bGUyLCJSZS1zeW50aGVzaXMgIG1hc2tfcmF0aW89JTMuMmYgICUzLjJmICBlbmVyX3JhdGlvPSUzLjJmICAlMy4yZiIsCisgICAgICAgcHBsb3QtPm1zX3JhdGlvWzBdLHBwbG90LT5tc19yYXRpb1sxXSwKKyAgICAgICBwcGxvdC0+bXNfZW5lcl9yYXRpb1swXSxwcGxvdC0+bXNfZW5lcl9yYXRpb1sxXSk7CisgICAgICovCisgICAgdGl0bGUgPSAiUmUtc3ludGhlc2lzIjsKKyAgICBpZiAoZ3RraW5mby5kaWZmZXJlbmNlKQorICAgICAgICB0aXRsZSA9ICJSZS1zeW50aGVzaXMgZGlmZmVyZW5jZSAoYW1wbGlmaWVkIDIwZGIpIjsKKworCisgICAgeW1uID0gLTMyNzY3OworICAgIHlteCA9IDMyNzY3OworICAgIHhtbiA9IDA7CisgICAgeG14ID0gMTYwMCAtIDE7CisgICAgZ3BrX2dyYXBoX2RyYXcod2luYm94LCAwLCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgMSwgdGl0bGUsICZibGFjayk7CisgICAgLyogZHJhdyBzb21lIGhhc2ggbWFya3MgZGl2aWRpbmcgdGhlIGZyYW1lcyAqLworICAgIHljb3JkWzBdID0geW14ICogLjg7CisgICAgeWNvcmRbMV0gPSB5bW4gKiAuODsKKyAgICBmb3IgKGdyID0gMDsgZ3IgPD0gMjsgZ3IrKykgeworICAgICAgICB4Y29yZFswXSA9IDIyMy41ICsgZ3IgKiA1NzY7CisgICAgICAgIHhjb3JkWzFdID0gMjIzLjUgKyBnciAqIDU3NjsKKyAgICAgICAgZ3BrX3JlY3RhbmdsZV9kcmF3KHdpbmJveCwgeGNvcmQsIHljb3JkLCB4bW4sIHltbiwgeG14LCB5bXgsICZ5ZWxsb3cpOworICAgIH0KKyAgICBmb3IgKGdyID0gMDsgZ3IgPCAyOyBncisrKSB7CisgICAgICAgIGlmIChibG9ja3R5cGVbZ3JdW2NoXSA9PSAyKQorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICB4Y29yZFswXSA9IDIyMy41ICsgZ3IgKiA1NzYgKyBpICogMTkyOworICAgICAgICAgICAgICAgIHhjb3JkWzFdID0gMjIzLjUgKyBnciAqIDU3NiArIGkgKiAxOTI7CisgICAgICAgICAgICAgICAgZ3BrX3JlY3RhbmdsZV9kcmF3KHdpbmJveCwgeGNvcmQsIHljb3JkLCB4bW4sIHltbiwgeG14LCB5bXgsICZ5ZWxsb3cpOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8qIHRoaXMgcGllY2Ugb2YgUENNIGRhdGEgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICAgIG4gPSAyMjQ7CisgICAgZm9yIChqID0gMTE1MiAtIG4sIGkgPSAwOyBpIDwgbjsgaSsrLCBqKyspIHsKKyAgICAgICAgeGNvcmRbaV0gPSBpOworICAgICAgICBpZiAoZ3RraW5mby5tc2ZsYWcpCisgICAgICAgICAgICB5Y29yZFtpXSA9IGNoID8gLjUgKiAocHBsb3QxLT5wY21kYXRhMlswXVtqXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBsb3QxLT5wY21kYXRhMlsxXVtqXSkgOgorICAgICAgICAgICAgICAgIC41ICogKHBwbG90MS0+cGNtZGF0YTJbMF1bal0gKyBwcGxvdDEtPnBjbWRhdGEyWzFdW2pdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeWNvcmRbaV0gPSBwcGxvdDEtPnBjbWRhdGEyW2NoXVtqXTsKKyAgICB9CisKKyAgICAvKiB0aGlzIHBpZWNlIG9mIFBDTSBkYXRhIGZyb20gY3VycmVudCBmcmFtZSAqLworICAgIG4gPSAxMTUyOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgeGNvcmRbaSArIDIyNF0gPSBpICsgMjI0OworICAgICAgICBpZiAoZ3RraW5mby5tc2ZsYWcpCisgICAgICAgICAgICB5Y29yZFtpICsgMjI0XSA9IGNoID8gLjUgKiAocHBsb3QyLT5wY21kYXRhMlswXVtpXSAtIHBwbG90Mi0+cGNtZGF0YTJbMV1baV0pIDoKKyAgICAgICAgICAgICAgICAuNSAqIChwcGxvdDItPnBjbWRhdGEyWzBdW2ldICsgcHBsb3QyLT5wY21kYXRhMlsxXVtpXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHljb3JkW2kgKyAyMjRdID0gcHBsb3QyLT5wY21kYXRhMltjaF1baV07CisgICAgfQorCisgICAgbiA9IDExNTIgKyAyMjQ7CisgICAgaWYgKGd0a2luZm8uZGlmZmVyZW5jZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ3RraW5mby5tc2ZsYWcpCisgICAgICAgICAgICAgICAgeWNvcmRbaV0gLT0gY2ggPyAuNSAqIChwcGxvdC0+cGNtZGF0YVswXVtpXSAtIHBwbG90LT5wY21kYXRhWzFdW2ldKSA6CisgICAgICAgICAgICAgICAgICAgIC41ICogKHBwbG90LT5wY21kYXRhWzBdW2ldICsgcHBsb3QtPnBjbWRhdGFbMV1baV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHljb3JkW2ldIC09IHBwbG90LT5wY21kYXRhW2NoXVtpXTsKKyAgICAgICAgfQorICAgICAgICB5Y29yZFtpXSAqPSAxMDA7CisgICAgfQorCisKKyAgICBncGtfZ3JhcGhfZHJhdyh3aW5ib3gsIG4sIHhjb3JkLCB5Y29yZCwgeG1uLCB5bW4sIHhteCwgeW14LCAwLCB0aXRsZSwgJmJsYWNrKTsKKworCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGRyYXcgdGhlIE1EQ1QgZW5lcmd5IHNwZWN0cnVtICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZvciAoZ3IgPSAwOyBnciA8IG1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgaW50ICAgICBiaXRzLCBiaXRzMjsKKyAgICAgICAgY2hhciAgICpibG9ja25hbWUgPSAiIjsKKyAgICAgICAgc3dpdGNoIChibG9ja3R5cGVbZ3JdW2NoXSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBibG9ja25hbWUgPSAibm9ybWFsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBibG9ja25hbWUgPSAic3RhcnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJsb2NrbmFtZSA9ICJzaG9ydCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgYmxvY2tuYW1lID0gImVuZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkobGFiZWwsIGJsb2NrbmFtZSk7CisgICAgICAgIGlmIChwcGxvdDEtPm1peGVkW2dyXVtjaF0pCisgICAgICAgICAgICBzdHJjYXQobGFiZWwsICIobWl4ZWQpIik7CisKKworCisKKyAgICAgICAgbiA9IDU3NjsKKyAgICAgICAgaWYgKGd0a2luZm8uZmxhZzEyMykgeworICAgICAgICAgICAgZGF0YSA9IHBwbG90MS0+bXBnMTIzeHJbZ3JdWzBdOworICAgICAgICAgICAgZGF0YTIgPSBwcGxvdDEtPm1wZzEyM3hyW2dyXVsxXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSBwcGxvdC0+eHJbZ3JdWzBdOworICAgICAgICAgICAgZGF0YTIgPSBwcGxvdC0+eHJbZ3JdWzFdOworICAgICAgICB9CisKKworICAgICAgICB4bW4gPSAwOworICAgICAgICB4bXggPSBuIC0gMTsKKyAgICAgICAgeW1uID0gMDsKKyAgICAgICAgeW14ID0gMTE7CisKKyAgICAgICAgLyogZHJhdyB0aXRsZSwgZXJhc2Ugb2xkIHBsb3QgKi8KKyAgICAgICAgaWYgKGd0a2luZm8uZmxhZzEyMykgeworICAgICAgICAgICAgYml0cyA9IHBwbG90MS0+bWFpbmJpdHNbZ3JdW2NoXTsKKyAgICAgICAgICAgIGJpdHMyID0gcHBsb3QxLT5zZmJpdHNbZ3JdW2NoXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJpdHMgPSBwcGxvdC0+TEFNRW1haW5iaXRzW2dyXVtjaF07CisgICAgICAgICAgICBiaXRzMiA9IHBwbG90LT5MQU1Fc2ZiaXRzW2dyXVtjaF07CisgICAgICAgIH0KKyAgICAgICAgc3ByaW50Zih0aXRsZTIsICJNRENUJTFpKCVzKSBiaXRzPSVpLyVpICIsIGdyLCBsYWJlbCwgYml0cywgYml0czIpOworICAgICAgICBncGtfYmFyZ3JhcGhfZHJhdyhtZGN0Ym94W2dyXSwgMCwgeGNvcmQsIHljb3JkLCB4bW4sIHltbiwgeG14LCB5bXgsIDEsIHRpdGxlMiwgMCwgYmFyY29sb3IpOworCisgICAgICAgIC8qIGRyYXcgc29tZSBoYXNoIG1hcmtzIHNob3dpbmcgc2NhbGVmYWN0b3IgYmFuZHMgKi8KKyAgICAgICAgaWYgKGd0a2luZm8uc2ZibGluZXMpIHsKKyAgICAgICAgICAgIGludCAgICAgZmFjLCBuc2ZiLCAqc2NhbGVmYWM7CisgICAgICAgICAgICBpZiAoYmxvY2t0eXBlW2dyXVtjaF0gPT0gU0hPUlRfVFlQRSkgeworICAgICAgICAgICAgICAgIG5zZmIgPSBTQk1BWF9zOworICAgICAgICAgICAgICAgIGkgPSBuc2ZiIC0gNzsKKyAgICAgICAgICAgICAgICBmYWMgPSAzOworICAgICAgICAgICAgICAgIHNjYWxlZmFjID0gZ2ZjLT5zY2FsZWZhY19iYW5kLnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuc2ZiID0gU0JNQVhfbDsKKyAgICAgICAgICAgICAgICBpID0gbnNmYiAtIDEwOworICAgICAgICAgICAgICAgIGZhYyA9IDE7CisgICAgICAgICAgICAgICAgc2NhbGVmYWMgPSBnZmMtPnNjYWxlZmFjX2JhbmQubDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOyBpIDwgbnNmYjsgaSsrKSB7CisgICAgICAgICAgICAgICAgeWNvcmRbMF0gPSAuOCAqIHlteDsKKyAgICAgICAgICAgICAgICB5Y29yZFsxXSA9IHltbjsKKyAgICAgICAgICAgICAgICB4Y29yZFswXSA9IGZhYyAqIHNjYWxlZmFjW2ldOworICAgICAgICAgICAgICAgIHhjb3JkWzFdID0geGNvcmRbMF07CisgICAgICAgICAgICAgICAgZ3BrX3JlY3RhbmdsZV9kcmF3KG1kY3Rib3hbZ3JdLCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgJnllbGxvdyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgeW1uID0gOWUyMDsKKyAgICAgICAgeW14ID0gLTllMjA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSAgY29lZmY7CisgICAgICAgICAgICB4Y29yZFtpXSA9IGk7CisgICAgICAgICAgICBpZiAoZ3RraW5mby5tc2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBjb2VmZiA9IGNoID8gLjUgKiAoZGF0YVtpXSAtIGRhdGEyW2ldKSA6IC41ICogKGRhdGFbaV0gKyBkYXRhMltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb2VmZiA9IGNoID8gZGF0YTJbaV0gOiBkYXRhW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJsb2NrdHlwZVtncl1bY2hdID09IFNIT1JUX1RZUEUgJiYgIXN1YmJsb2NrX2RyYXdbaSAlIDNdKQorICAgICAgICAgICAgICAgIGNvZWZmID0gMDsKKyAgICAgICAgICAgIHljb3JkW2ldID0gY29lZmYgKiBjb2VmZiAqIDFlMTA7CisgICAgICAgICAgICB5Y29yZFtpXSA9IGxvZzEwKE1BWCh5Y29yZFtpXSwgKGRvdWJsZSkgMSkpOworCisjaWYgMAorICAgICAgICAgICAgaWYgKGNoID09IDApCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMjYpCisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2ldICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiJWkgJWkgaT0laSAgbWRjdDogKGRiKSAlZiAgJWYgXG4iLCBwcGxvdC0+ZnJhbWVOdW0sIGdyLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgKiBsb2cxMChkYXRhW2ldICogZGF0YVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAqIGxvZzEwKC4zMyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2kgLSAxXSAqIGRhdGFbaSAtIDFdICsgZGF0YVtpXSAqIGRhdGFbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICsgMV0gKiBkYXRhW2kgKyAxXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZgorCisgICAgICAgICAgICB5bXggPSAoeWNvcmRbaV0gPiB5bXgpID8geWNvcmRbaV0gOiB5bXg7CisgICAgICAgICAgICB5bW4gPSAoeWNvcmRbaV0gPCB5bW4pID8geWNvcmRbaV0gOiB5bW47CisgICAgICAgIH0KKyAgICAgICAgLyogIHByaW50IHRoZSBtaW4vbWF4CisgICAgICAgICAgIHNwcmludGYodGl0bGUyLCJNRENUJTFpICU1LjJmICU1LjJmICBiaXRzPSVpIixncix5bW4seW14LAorICAgICAgICAgICBwcGxvdDEtPm1haW5iaXRzW2dyXVtjaF0pOworICAgICAgICAgKi8KKyAgICAgICAgaWYgKGd0a2luZm8uZmxhZzEyMykKKyAgICAgICAgICAgIGJpdHMgPSBwcGxvdDEtPm1haW5iaXRzW2dyXVtjaF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJpdHMgPSBwcGxvdC0+TEFNRW1haW5iaXRzW2dyXVtjaF07CisKKworICAgICAgICBzcHJpbnRmKHRpdGxlMiwgIk1EQ1QlMWkoJXMpIGJpdHM9JWkgIiwgZ3IsIGxhYmVsLCBiaXRzKTsKKworICAgICAgICB4bW4gPSAwOworICAgICAgICB4bXggPSBuIC0gMTsKKyAgICAgICAgeW1uID0gMDsKKyAgICAgICAgeW14ID0gMTE7CisgICAgICAgIGdwa19iYXJncmFwaF9kcmF3KG1kY3Rib3hbZ3JdLCBuLCB4Y29yZCwgeWNvcmQsIHhtbiwgeW1uLCB4bXgsIHlteCwgMCwgdGl0bGUyLCAwLCBiYXJjb2xvcik7CisgICAgfQorCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIGRyYXcgdGhlIHBzeSBtb2RlbCBlbmVyZ3kgc3BlY3RydW0gKGsgc3BhY2UpCisgICAqIGwzcHN5LmMgY29tcHV0ZXMgcGUsIGVuLCB0aG0gZm9yIFRISVMgZ3JhbnVsZS4KKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGd0a2luZm8ua2JmbGFnKSB7CisgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IG1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgICAgIG4gPSBIQkxLU0laRTsgLyogb25seSBzaG93IGhhbGYgdGhlIHNwZWN0cnVtICovCisKKyAgICAgICAgICAgIGRhdGEgPSAmcHBsb3QtPmVuZXJneVtncl1bY2hdWzBdOworCisgICAgICAgICAgICB5bW4gPSA5ZTIwOworICAgICAgICAgICAgeW14ID0gLTllMjA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgeGNvcmRbaV0gPSBpICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2t0eXBlW2dyXVtjaF0gPT0gU0hPUlRfVFlQRSAmJiAhc3ViYmxvY2tfZHJhd1tpICUgM10pCisgICAgICAgICAgICAgICAgICAgIHljb3JkW2ldID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHljb3JkW2ldID0gbG9nMTAoTUFYKGRhdGFbaV0sIChkb3VibGUpIDEpKTsKKyAgICAgICAgICAgICAgICB5bXggPSAoeWNvcmRbaV0gPiB5bXgpID8geWNvcmRbaV0gOiB5bXg7CisgICAgICAgICAgICAgICAgeW1uID0gKHljb3JkW2ldIDwgeW1uKSA/IHljb3JkW2ldIDogeW1uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChlbiA9IDAsIGogPSAwOyBqIDwgQkxLU0laRTsgaisrKQorICAgICAgICAgICAgICAgIGVuICs9IHBwbG90LT5lbmVyZ3lbZ3JdW2NoXVtqXTsKKworICAgICAgICAgICAgc3ByaW50Zih0aXRsZTIsICJGRlQlMWkgIHBlPSU1LjJmSyAgZW49JTUuMmUgIiwgZ3IsIHBwbG90LT5wZVtncl1bY2hdIC8gMTAwMCwgZW4pOworCisgICAgICAgICAgICB5bW4gPSAzOworICAgICAgICAgICAgeW14ID0gMTU7CisgICAgICAgICAgICB4bW4gPSAxOworICAgICAgICAgICAgeG14ID0gbjsKKyAgICAgICAgICAgIGdwa19iYXJncmFwaF9kcmF3KGVuZXJib3hbZ3JdLCBuLCB4Y29yZCwgeWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bW4sIHltbiwgeG14LCB5bXgsIDEsIHRpdGxlMiwgMCwgYmFyY29sb3IpOworCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBkcmF3IHRoZSBwc3kgbW9kZWwgZW5lcmd5IHNwZWN0cnVtIChzY2FsZWZhY3RvciBiYW5kcykKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgbW9kZV9ncjsgZ3IrKykgeworCisgICAgICAgICAgICBpZiAoYmxvY2t0eXBlW2dyXVtjaF0gPT0gMikgeworICAgICAgICAgICAgICAgIG4gPSAzICogU0JNQVhfczsKKyAgICAgICAgICAgICAgICBkYXRhID0gJnBwbG90LT5lbl9zW2dyXVtjaF1bMF07CisgICAgICAgICAgICAgICAgZGF0YTIgPSAmcHBsb3QtPnRocl9zW2dyXVtjaF1bMF07CisgICAgICAgICAgICAgICAgZGF0YTMgPSAmcHBsb3QtPnhmc2Zfc1tncl1bY2hdWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbiA9IFNCTUFYX2w7CisgICAgICAgICAgICAgICAgZGF0YSA9ICZwcGxvdC0+ZW5bZ3JdW2NoXVswXTsKKyAgICAgICAgICAgICAgICBkYXRhMiA9ICZwcGxvdC0+dGhyW2dyXVtjaF1bMF07CisgICAgICAgICAgICAgICAgZGF0YTMgPSAmcHBsb3QtPnhmc2ZbZ3JdW2NoXVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHltbiA9IDllMjA7CisgICAgICAgICAgICB5bXggPSAtOWUyMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB4Y29yZFtpXSA9IGkgKyAxOworICAgICAgICAgICAgICAgIGlmIChibG9ja3R5cGVbZ3JdW2NoXSA9PSBTSE9SVF9UWVBFICYmICFzdWJibG9ja19kcmF3W2kgJSAzXSkKKyAgICAgICAgICAgICAgICAgICAgeWNvcmRbaV0gPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeWNvcmRbaV0gPSBsb2cxMChNQVgoZGF0YVtpXSwgKGRvdWJsZSkgMSkpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgeW14PSh5Y29yZFtpXSA+IHlteCkgPyB5Y29yZFtpXSA6IHlteDsKKyAgICAgICAgICAgICAgICAgICB5bW49KHljb3JkW2ldIDwgeW1uKSA/IHljb3JkW2ldIDogeW1uOworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorCisKKworICAgICAgICAgICAgLyogZW4gPSBtYXggZW5lcmd5IGRpZmZlcmVuY2UgYW1vdW5nIHRoZSAzIHNob3J0IEZGVHMgZm9yIHRoaXMgZ3JhbnVsZSAqLworICAgICAgICAgICAgZW4gPSBwcGxvdC0+ZXJzW2dyXVtjaF07CisgICAgICAgICAgICBpZiAoZW4gPiA5OTkpCisgICAgICAgICAgICAgICAgZW4gPSA5OTk7CisgICAgICAgICAgICBzcHJpbnRmKHRpdGxlMiwKKyAgICAgICAgICAgICAgICAgICAgIkZGVCUxaSBwZT0lNS4yZksvJTMuMWYgXG5ub2lzZSBvdnJfYjolaS9tYXg6JTMuMWYvb3ZyOiUzLjFmL3RvdDolMy4xZi9zc2Q6JWkiLAorICAgICAgICAgICAgICAgICAgICBnciwgcHBsb3QtPnBlW2dyXVtjaF0gLyAxMDAwLCBlbiwgcHBsb3QtPm92ZXJbZ3JdW2NoXSwgcHBsb3QtPm1heF9ub2lzZVtncl1bY2hdLAorICAgICAgICAgICAgICAgICAgICBwcGxvdC0+b3Zlcl9ub2lzZVtncl1bY2hdLCBwcGxvdC0+dG90X25vaXNlW2dyXVtjaF0sIHBwbG90LT5vdmVyX1NTRFtncl1bY2hdKTsKKworICAgICAgICAgICAgYmFydGhpY2sgPSAzOworICAgICAgICAgICAgaWYgKGJsb2NrdHlwZVtncl1bY2hdID09IFNIT1JUX1RZUEUpCisgICAgICAgICAgICAgICAgYmFydGhpY2sgPSAyOworICAgICAgICAgICAgaWYgKCEoc3ViYmxvY2tfZHJhd1swXSAmJiBzdWJibG9ja19kcmF3WzFdICYmIHN1YmJsb2NrX2RyYXdbMl0pKQorICAgICAgICAgICAgICAgIGJhcnRoaWNrID0gMzsKKworICAgICAgICAgICAgeW1uID0gMzsKKyAgICAgICAgICAgIHlteCA9IDE1OworICAgICAgICAgICAgeG1uID0gMTsKKyAgICAgICAgICAgIHhteCA9IG4gKyAxOyAvKiBhIGxpdHRsZSBleHRyYSBiZWNhdXNlIG9mIHRoZSBiYXIgdGhpY2tuZXNzICovCisgICAgICAgICAgICBncGtfYmFyZ3JhcGhfZHJhdyhlbmVyYm94W2dyXSwgbiwgeGNvcmQsIHljb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1uLCB5bW4sIHhteCwgeW14LCAxLCB0aXRsZTIsIGJhcnRoaWNrLCBiYXJjb2xvcik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB4Y29yZFtpXSA9IGkgKyAxICsgLjIwOworICAgICAgICAgICAgICAgIGlmIChibG9ja3R5cGVbZ3JdW2NoXSA9PSBTSE9SVF9UWVBFICYmICFzdWJibG9ja19kcmF3W2kgJSAzXSkKKyAgICAgICAgICAgICAgICAgICAgeWNvcmRbaV0gPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeWNvcmRbaV0gPSBsb2cxMChNQVgoZGF0YTJbaV0sIChkb3VibGUpIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3BrX2JhcmdyYXBoX2RyYXcoZW5lcmJveFtncl0sIG4sIHhjb3JkLCB5Y29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbiwgeW1uLCB4bXgsIHlteCwgMCwgdGl0bGUyLCBiYXJ0aGljaywgZ3Jjb2xvcltncl0pOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgeGNvcmRbaV0gPSBpICsgMSArIC40MDsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2t0eXBlW2dyXVtjaF0gPT0gU0hPUlRfVFlQRSAmJiAhc3ViYmxvY2tfZHJhd1tpICUgM10pCisgICAgICAgICAgICAgICAgICAgIHljb3JkW2ldID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHljb3JkW2ldID0gbG9nMTAoTUFYKGRhdGEzW2ldLCAoZG91YmxlKSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncGtfYmFyZ3JhcGhfZHJhdyhlbmVyYm94W2dyXSwgbiwgeGNvcmQsIHljb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1uLCB5bW4sIHhteCwgeW14LCAwLCB0aXRsZTIsIGJhcnRoaWNrLCAmcmVkKTsKKworICAgICAgICB9CisgICAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIGRyYXcgc2NhbGVmYWN0b3JzCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZvciAoZ3IgPSAwOyBnciA8IG1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgaW50ICAgICBnZ2FpbjsKKyAgICAgICAgaWYgKGJsb2NrdHlwZVtncl1bY2hdID09IDIpIHsKKyAgICAgICAgICAgIG4gPSAzICogU0JNQVhfczsKKyAgICAgICAgICAgIGlmIChndGtpbmZvLmZsYWcxMjMpCisgICAgICAgICAgICAgICAgZGF0YSA9IHBwbG90MS0+c2ZiX3NbZ3JdW2NoXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkYXRhID0gcHBsb3QtPkxBTUVzZmJfc1tncl1bY2hdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbiA9IFNCTUFYX2w7CisgICAgICAgICAgICBpZiAoZ3RraW5mby5mbGFnMTIzKQorICAgICAgICAgICAgICAgIGRhdGEgPSBwcGxvdDEtPnNmYltncl1bY2hdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRhdGEgPSBwcGxvdC0+TEFNRXNmYltncl1bY2hdOworICAgICAgICB9CisKKyAgICAgICAgeW1uID0gLTE7CisgICAgICAgIHlteCA9IDEwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB4Y29yZFtpXSA9IGkgKyAxOworICAgICAgICAgICAgaWYgKGJsb2NrdHlwZVtncl1bY2hdID09IFNIT1JUX1RZUEUgJiYgIXN1YmJsb2NrX2RyYXdbaSAlIDNdKQorICAgICAgICAgICAgICAgIHljb3JkW2ldID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB5Y29yZFtpXSA9IC1kYXRhW2ldOworCisgICAgICAgICAgICB5bXggPSAoeWNvcmRbaV0gPiB5bXggLSAyKSA/IHljb3JkW2ldICsgMiA6IHlteDsKKyAgICAgICAgICAgIHltbiA9ICh5Y29yZFtpXSA8IHltbikgPyB5Y29yZFtpXSAtIDEgOiB5bW47CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmxvY2t0eXBlW2dyXVtjaF0gPT0gMikgeworICAgICAgICAgICAgc3ByaW50ZihsYWJlbDIsCisgICAgICAgICAgICAgICAgICAgICJTRkIgc2NhbGU9JWkgcHJlZmxhZz0laSAgJWklaSVpIiwKKyAgICAgICAgICAgICAgICAgICAgcHBsb3QxLT5zY2FsZWZhY19zY2FsZVtncl1bY2hdLAorICAgICAgICAgICAgICAgICAgICBwcGxvdDEtPnByZWZsYWdbZ3JdW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgcHBsb3QxLT5zdWJfZ2Fpbltncl1bY2hdWzBdLAorICAgICAgICAgICAgICAgICAgICBwcGxvdDEtPnN1Yl9nYWluW2dyXVtjaF1bMV0sIHBwbG90MS0+c3ViX2dhaW5bZ3JdW2NoXVsyXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzcHJpbnRmKGxhYmVsMiwgIlNGQiBzY2FsZT0laSBwcmVmbGFnPSVpIiwgcHBsb3QxLT5zY2FsZWZhY19zY2FsZVtncl1bY2hdLAorICAgICAgICAgICAgICAgICAgICBwcGxvdDEtPnByZWZsYWdbZ3JdW2NoXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ3RraW5mby5mbGFnMTIzKQorICAgICAgICAgICAgZ2dhaW4gPSAocHBsb3QxLT5xc3NbZ3JdW2NoXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdnYWluID0gKHBwbG90LT5MQU1FcXNzW2dyXVtjaF0pOworCisgICAgICAgIHNwcmludGYodGl0bGUyLCAiIGdnYWluPSVpIiwgZ2dhaW4pOworICAgICAgICBzdHJjYXQobGFiZWwyLCB0aXRsZTIpOworCisgICAgICAgIHhtbiA9IDE7CisgICAgICAgIHhteCA9IG4gKyAxOworICAgICAgICBncGtfYmFyZ3JhcGhfZHJhdyhzZmJib3hbZ3JdLCBuLCB4Y29yZCwgeWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbiwgeW1uLCB4bXgsIHlteCwgMSwgbGFiZWwyLCAwLCBncmNvbG9yW2dyXSk7CisKKyAgICAgICAgeWNvcmRbMF0gPSB5Y29yZFsxXSA9IDA7CisgICAgICAgIHhjb3JkWzBdID0gMTsKKyAgICAgICAgeGNvcmRbMV0gPSBuICsgMTsKKyAgICAgICAgZ3BrX3JlY3RhbmdsZV9kcmF3KHNmYmJveFtncl0sIHhjb3JkLCB5Y29yZCwgeG1uLCB5bW4sIHhteCwgeW14LCAmeWVsbG93KTsKKworCisgICAgfQorCisKK30KKworCisKK3N0YXRpYyB2b2lkCit1cGRhdGVfcHJvZ3Jlc3Modm9pZCkKK3sKKyAgICBjaGFyICAgIGxhYmVsWzgwXTsKKworICAgIGludCAgICAgdGYgPSBsYW1lX2dldF90b3RhbGZyYW1lcyhnZnApOworICAgIGlmIChndGtpbmZvLnRvdGFsZnJhbWVzID4gMCkKKyAgICAgICAgdGYgPSBndGtpbmZvLnRvdGFsZnJhbWVzOworCisgICAgc3ByaW50ZihsYWJlbCwgIkZyYW1lOiU0aS8lNGkgICU2LjJmcyIsIHBwbG90LT5mcmFtZU51bSwgKGludCkgdGYgLSAxLCBwcGxvdC0+ZnJhbWV0aW1lKTsKKyAgICBndGtfcHJvZ3Jlc3Nfc2V0X3ZhbHVlKEdUS19QUk9HUkVTUyhmcmFtZXByb2dyZXNzKSwgKGdkb3VibGUpIHBwbG90LT5mcmFtZU51bSk7CisgICAgZ3RrX2xhYmVsX3NldF90ZXh0KEdUS19MQUJFTChmcmFtZWNvdW50ZXIpLCBsYWJlbCk7Cit9CisKKworCitzdGF0aWMgdm9pZAorYW5hbHl6ZSh2b2lkKQoreworICAgIGlmIChpZGxlX2tlZXBnb2luZykgeworICAgICAgICBpZGxlX2NvdW50ID0gMDsKKyAgICAgICAgaWRsZV9jb3VudF9tYXggPSAwOworICAgICAgICBpZGxlX2tlZXBnb2luZyA9IDA7CisgICAgICAgIGlkbGVfZW5kID0gMDsKKyAgICB9CisgICAgcGxvdF9mcmFtZSgpOworICAgIHVwZGF0ZV9wcm9ncmVzcygpOworfQorCitzdGF0aWMgdm9pZAorcGxvdGNsaWNrKEd0a1dpZGdldCAqIHdpZGdldCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBhbmFseXplKCk7Cit9CisKKworCisKK3N0YXRpYyBpbnQKK2ZyYW1lYWR2MShHdGtXaWRnZXQgKiB3aWRnZXQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgaW50ICAgICBpOworICAgIGlmIChpZGxlX2tlZXBnb2luZykgeworICAgICAgICBpZiAoaWRsZV9iYWNrKSB7CisgICAgICAgICAgICAvKiBmcmFtZSBkaXNwbGF5ZWQgaXMgdGhlIG9sZCBmcmFtZS4gIHRvIGFkdmFuY2UsIGp1c3Qgc3dhcCBpbiBuZXcgZnJhbWUgKi8KKyAgICAgICAgICAgIGlkbGVfYmFjay0tOworICAgICAgICAgICAgcHBsb3QgPSAmUGluZm9bUkVBRF9BSEVBRCArIGlkbGVfYmFja107CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBhZHZhbmNlIHRoZSBmcmFtZSBieSByZWFkaW5nIGluIGEgbmV3IGZyYW1lICovCisgICAgICAgICAgICBwcGxvdCA9ICZQaW5mb1tSRUFEX0FIRUFEXTsKKyAgICAgICAgICAgIGlmIChtcDNkb25lKSB7CisgICAgICAgICAgICAgICAgLyogZG9udCB0cnkgdG8gcmVhZCBhbnkgbW9yZSBmcmFtZXMsIGFuZCBxdWl0IGlmICJmaW5pc2ggTVAzIiB3YXMgc2VsZWN0ZWQgKi8KKyAgICAgICAgICAgICAgICAvKiBpZiAoaWRsZV9maW5pc2gpIGd0a19tYWluX3F1aXQoKTsgKi8KKyAgICAgICAgICAgICAgICBpZGxlX2NvdW50X21heCA9IDA7CisgICAgICAgICAgICAgICAgaWRsZV9lbmQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogcmVhZCBpbiB0aGUgbmV4dCBmcmFtZSAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IE5VTVBJTkZPIC0gMTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZQaW5mb1tpXSwgJlBpbmZvW2kgLSAxXSwgc2l6ZW9mKHBsb3R0aW5nX2RhdGEpKTsKKyAgICAgICAgICAgICAgICBwaW5mbyA9ICZQaW5mb1swXTsKKyAgICAgICAgICAgICAgICBwaW5mby0+bnVtX3NhbXBsZXMgPSBndGttYWtlZnJhbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGluZm8tPm51bV9zYW1wbGVzID09IDAgJiYgZ3RraW5mby50b3RhbGZyYW1lcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICAvKiBhbGxvdyBhbiBleHRyYSBmcmFtZSB0byBmbHVzaCBkZWNvZGVyIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgZ3RraW5mby50b3RhbGZyYW1lcyA9IHBpbmZvLT5mcmFtZU51bSArIDI7CisKKyAgICAgICAgICAgICAgICBpZiAocGluZm8tPnNhbXBmcmVxKQorICAgICAgICAgICAgICAgICAgICBwaW5mby0+ZnJhbWV0aW1lID0gKHBpbmZvLT5mcmFtZU51bSkgKiAxMTUyLjAgLyBwaW5mby0+c2FtcGZyZXE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwaW5mby0+ZnJhbWV0aW1lID0gMDsKKworICAgICAgICAgICAgICAgIC8qIGVvZj8KKyAgICAgICAgICAgICAgICAgICBpZiAoIXBpbmZvLT5udW1fc2FtcGxlcykgaWYgKGlkbGVfZmluaXNoKSBndGtfbWFpbl9xdWl0KCk7CisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBwaW5mby0+dG90Yml0cyA9IDA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGdyLCBjaDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgMjsgZ3IrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IDI7IGNoKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtpbmZvLnRvdHNob3J0ICs9IChwaW5mby0+bXBnMTIzYmxvY2t0eXBlW2dyXVtjaF0gPT0gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RraW5mby50b3RtaXggKz0gIShwaW5mby0+bWl4ZWRbZ3JdW2NoXSA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtpbmZvLnRvdHByZWZsYWcgKz0gKHBpbmZvLT5wcmVmbGFnW2dyXVtjaF0gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZm8tPnRvdGJpdHMgKz0gcGluZm8tPm1haW5iaXRzW2dyXVtjaF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwaW5mby0+ZnJhbWVOdW0gPiAwKSAvKiBzdGFydCBhdmVyYWdpbmcgYXQgc2Vjb25kIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIGd0a2luZm8uYXZlYml0cyA9IChndGtpbmZvLmF2ZWJpdHMgKiAoKHBpbmZvLT5mcmFtZU51bSkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwaW5mby0+dG90Yml0cykgLyAocGluZm8tPmZyYW1lTnVtKTsKKworICAgICAgICAgICAgICAgIGd0a2luZm8ubWF4Yml0cyA9IE1BWChndGtpbmZvLm1heGJpdHMsIHBpbmZvLT50b3RiaXRzKTsKKyAgICAgICAgICAgICAgICBndGtpbmZvLnRvdGVtcGggKz0gIShwaW5mby0+ZW1waCA9PSAwKTsKKyAgICAgICAgICAgICAgICBndGtpbmZvLnRvdG1zICs9ICEocGluZm8tPm1zX3N0ZXJlbyA9PSAwKTsKKyAgICAgICAgICAgICAgICBndGtpbmZvLnRvdGlzICs9ICEocGluZm8tPmlfc3RlcmVvID09IDApOworCisgICAgICAgICAgICAgICAgaWYgKGd0a2luZm8udG90YWxmcmFtZXMgPiAwKQorICAgICAgICAgICAgICAgICAgICBpZiAocHBsb3QtPmZyYW1lTnVtID49IGd0a2luZm8udG90YWxmcmFtZXMgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgbXAzZG9uZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZGxlX2NvdW50Kys7CisgICAgICAgIGlmIChndGtpbmZvLnB1cGRhdGUpCisgICAgICAgICAgICBwbG90X2ZyYW1lKCk7CisgICAgICAgIHVwZGF0ZV9wcm9ncmVzcygpOworICAgICAgICBpZiAoKGlkbGVfY291bnQgPj0gaWRsZV9jb3VudF9tYXgpICYmICghaWRsZV9lbmQpKQorICAgICAgICAgICAgYW5hbHl6ZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLypubyBwcm9jZXNzaW5nIHRvIGRvLCBzbGVlcCBpbiBvcmRlciB0byBub3QgbW9ub3BvbGl6ZSBDUFUgKi8KKyAgICAgICAgbXNsZWVwKDEwKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQKK2ZyYW1lYWR2KEd0a1dpZGdldCAqIHdpZGdldCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBpbnQgICAgIGFkdjsKKworICAgIGlmICghc3RyY21wKChjaGFyICopIGRhdGEsICItMSIpKSB7CisgICAgICAgIC8qIGlnbm9yZSBpZiB3ZSd2ZSBhbHJlYWR5IGdvbmUgYmFjayBhcyBmYXIgYXMgcG9zc2libGUgKi8KKyAgICAgICAgaWYgKHBwbG90LT5mcmFtZU51bSA9PSAwIHx8IChpZGxlX2JhY2sgPT0gTlVNQkFDSykpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlkbGVfYmFjaysrOworICAgICAgICBwcGxvdCA9ICZQaW5mb1tSRUFEX0FIRUFEICsgaWRsZV9iYWNrXTsKKyAgICAgICAgYW5hbHl6ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBhZHYgPSAxOworICAgIGlmICghc3RyY21wKChjaGFyICopIGRhdGEsICIxIikpCisgICAgICAgIGFkdiA9IDE7CisgICAgaWYgKCFzdHJjbXAoKGNoYXIgKikgZGF0YSwgIjEwIikpCisgICAgICAgIGFkdiA9IDEwOworICAgIGlmICghc3RyY21wKChjaGFyICopIGRhdGEsICIxMDAiKSkKKyAgICAgICAgYWR2ID0gMTAwOworICAgIGlmICghc3RyY21wKChjaGFyICopIGRhdGEsICJmaW5pc2giKSkKKyAgICAgICAgaWRsZV9lbmQgPSAxOworCisKKyAgICBpZiAoaWRsZV9rZWVwZ29pbmcpIHsKKyAgICAgICAgLyogYWxyZWFkeSBydW5uaW5nIC0gcXVlIHVwIGFkZGl0aW9uYWwgZnJhbWUgYWR2YW5jZSByZXF1ZXN0cyAqLworICAgICAgICBpZGxlX2NvdW50X21heCArPSBhZHY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiB0dXJuIG9uIGlkbGVpbmcgKi8KKyAgICAgICAgaWRsZV9jb3VudF9tYXggPSBhZHY7CisgICAgICAgIGlkbGVfY291bnQgPSAwOworICAgICAgICBpZGxlX2tlZXBnb2luZyA9IDE7CisgICAgfQorfQorCisKKworCisvKiBhbm90aGVyIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZAorZGVsZXRlX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwgR2RrRXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICAvKiBzZXQgTVAzIGRvbmUgZmxhZyBpbiBjYXNlIHRoZSBGaWxlL1F1aXQgbWVudSBpdGVtIGhhcyBiZWVuIHNlbGVjdGVkICovCisgICAgbXAzZG9uZSA9IDE7CisKKyAgICBndGtfbWFpbl9xdWl0KCk7Cit9CisKKworCisKKworCisKK3N0YXRpYyB2b2lkCitjaGFubmVsX29wdGlvbihHdGtXaWRnZXQgKiB3aWRnZXQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgbG9uZyAgICBvcHRpb247CisgICAgb3B0aW9uID0gKGxvbmcpIGRhdGE7CisgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGd0a2luZm8ubXNmbGFnID0gMDsKKyAgICAgICAgZ3RraW5mby5jaGZsYWcgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGd0a2luZm8ubXNmbGFnID0gMDsKKyAgICAgICAgZ3RraW5mby5jaGZsYWcgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGd0a2luZm8ubXNmbGFnID0gMTsKKyAgICAgICAgZ3RraW5mby5jaGZsYWcgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGd0a2luZm8ubXNmbGFnID0gMTsKKyAgICAgICAgZ3RraW5mby5jaGZsYWcgPSAxOworICAgIH0KKyAgICBhbmFseXplKCk7Cit9CitzdGF0aWMgdm9pZAorc3BlY19vcHRpb24oR3RrV2lkZ2V0ICogd2lkZ2V0LCBncG9pbnRlciBkYXRhKQoreworICAgIGxvbmcgICAgb3B0aW9uOworICAgIG9wdGlvbiA9IChsb25nKSBkYXRhOworICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgY2FzZSAxOgorICAgICAgICBndGtpbmZvLmtiZmxhZyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZ3RraW5mby5rYmZsYWcgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGd0a2luZm8uZmxhZzEyMyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZ3RraW5mby5mbGFnMTIzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBndGtpbmZvLnB1cGRhdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIGd0a2luZm8ucHVwZGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgZ3RraW5mby5zZmJsaW5lcyA9ICFndGtpbmZvLnNmYmxpbmVzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIGd0a2luZm8uZGlmZmVyZW5jZSA9ICFndGtpbmZvLmRpZmZlcmVuY2U7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhbmFseXplKCk7Cit9CisKK3N0YXRpYyAgZ2ludAora2V5X3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwgR2RrRXZlbnRLZXkgKiBldmVudCkKK3sKKyAgICAvKiBpcyBhIHN3aXRjaCgpIHN0YXRlbWVudCBpbiBsYW1lIGZvcmJpZGRlbj8gKi8KKyAgICBpZiAoZXZlbnQtPmtleXZhbCA9PSAnMScpIHsKKyAgICAgICAgc3ViYmxvY2tfZHJhd1swXSA9IDE7CisgICAgICAgIHN1YmJsb2NrX2RyYXdbMV0gPSAwOworICAgICAgICBzdWJibG9ja19kcmF3WzJdID0gMDsKKyAgICAgICAgYW5hbHl6ZSgpOworICAgIH0KKyAgICBlbHNlIGlmIChldmVudC0+a2V5dmFsID09ICcyJykgeworICAgICAgICBzdWJibG9ja19kcmF3WzBdID0gMDsKKyAgICAgICAgc3ViYmxvY2tfZHJhd1sxXSA9IDE7CisgICAgICAgIHN1YmJsb2NrX2RyYXdbMl0gPSAwOworICAgICAgICBhbmFseXplKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGV2ZW50LT5rZXl2YWwgPT0gJzMnKSB7CisgICAgICAgIHN1YmJsb2NrX2RyYXdbMF0gPSAwOworICAgICAgICBzdWJibG9ja19kcmF3WzFdID0gMDsKKyAgICAgICAgc3ViYmxvY2tfZHJhd1syXSA9IDE7CisgICAgICAgIGFuYWx5emUoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZXZlbnQtPmtleXZhbCA9PSAnMCcpIHsKKyAgICAgICAgc3ViYmxvY2tfZHJhd1swXSA9IDE7CisgICAgICAgIHN1YmJsb2NrX2RyYXdbMV0gPSAxOworICAgICAgICBzdWJibG9ja19kcmF3WzJdID0gMTsKKyAgICAgICAgYW5hbHl6ZSgpOworICAgIH0KKyAgICAvKiBhbmFseXplKCk7ICovIC8qIGRvbnQgcmVkcmF3IGVudGlyZSB3aW5kb3cgZm9yIGV2ZXJ5IGtleSEgKi8KKyAgICByZXR1cm4gMDsKK30KKworCisvKiEgR2V0IHRoZSBtcDN4IHZlcnNpb24gc3RyaW5nLiAqLworLyohCisgIFxwYXJhbSB2b2lkCisgIFxyZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgdmVyc2lvbiBvZiBtcDN4LgorKi8KK2NvbnN0IGNoYXIgKgorZ2V0X21wM3hfdmVyc2lvbih2b2lkKQoreworI2lmICAgTVAzWF9BTFBIQV9WRVJTSU9OID4gMAorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgWFNUUihNUDNYX01BSk9SX1ZFUlNJT04pICIuIiBYU1RSKE1QM1hfTUlOT1JfVkVSU0lPTikKKyAgICAgICAgIiAoYWxwaGEgIiBYU1RSKE1QM1hfQUxQSEFfVkVSU0lPTikgIiwgIiBfX0RBVEVfXyAiICIgX19USU1FX18gIikiOworI2VsaWYgTVAzWF9CRVRBX1ZFUlNJT04gPiAwCisgICAgc3RhdGljIC8qQG9ic2VydmVyQCAqLyBjb25zdCBjaGFyICpjb25zdCBzdHIgPQorICAgICAgICBYU1RSKE1QM1hfTUFKT1JfVkVSU0lPTikgIi4iIFhTVFIoTVAzWF9NSU5PUl9WRVJTSU9OKQorICAgICAgICAiIChiZXRhICIgWFNUUihNUDNYX0JFVEFfVkVSU0lPTikgIiwgIiBfX0RBVEVfXyAiKSI7CisjZWxzZQorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgWFNUUihNUDNYX01BSk9SX1ZFUlNJT04pICIuIiBYU1RSKE1QM1hfTUlOT1JfVkVSU0lPTik7CisjZW5kaWYKKworICAgIHJldHVybiBzdHI7Cit9CisKKworc3RhdGljIHZvaWQKK3RleHRfd2luZG93KEd0a1dpZGdldCAqIHdpZGdldCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBsb25nICAgIG9wdGlvbjsKKyAgICBHdGtXaWRnZXQgKmhib3gsICp2Ym94LCAqYnV0dG9uLCAqYm94OworICAgIEd0a1dpZGdldCAqdGV4dHdpbmRvdywgKnZzY3JvbGxiYXI7CisgICAgY2hhciAgICB0ZXh0WzI1Nl07CisKKyAgICBvcHRpb24gPSAobG9uZykgZGF0YTsKKworICAgIHRleHR3aW5kb3cgPSBndGtfd2luZG93X25ldyhHVEtfV0lORE9XX0RJQUxPRyk7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0X29iamVjdChHVEtfT0JKRUNUKHdpbmRvdyksICJkZWxldGVfZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RLX1NJR05BTF9GVU5DKGd0a193aWRnZXRfZGVzdHJveSksIEdUS19PQkpFQ1QodGV4dHdpbmRvdykpOworCisgICAgZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIodGV4dHdpbmRvdyksIDApOworICAgIHZib3ggPSBndGtfdmJveF9uZXcoRkFMU0UsIDApOworICAgIGhib3ggPSBndGtfaGJveF9uZXcoRkFMU0UsIDApOworCisgICAgYnV0dG9uID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCgiY2xvc2UiKTsKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3Rfb2JqZWN0KEdUS19PQkpFQ1QoYnV0dG9uKSwgImNsaWNrZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RLX1NJR05BTF9GVU5DKGd0a193aWRnZXRfZGVzdHJveSksIEdUS19PQkpFQ1QodGV4dHdpbmRvdykpOworCisgICAgYm94ID0gZ3RrX3RleHRfbmV3KE5VTEwsIE5VTEwpOworICAgIGd0a190ZXh0X3NldF9lZGl0YWJsZShHVEtfVEVYVChib3gpLCBGQUxTRSk7CisgICAgdnNjcm9sbGJhciA9IGd0a192c2Nyb2xsYmFyX25ldyhHVEtfVEVYVChib3gpLT52YWRqKTsKKworCisgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGd0a193aW5kb3dfc2V0X3RpdGxlKEdUS19XSU5ET1codGV4dHdpbmRvdyksICJEb2N1bWVudGF0aW9uIik7CisgICAgICAgIGd0a193aWRnZXRfc2V0X3VzaXplKGJveCwgNDUwLCA1MDApOworICAgICAgICBndGtfdGV4dF9zZXRfd29yZF93cmFwKEdUS19URVhUKGJveCksIFRSVUUpOworICAgICAgICAvKiB0ZXh0IHNob3VsZCBiZSBtb3ZlZCBvdXRzaWRlIHRoaXMgZnVuY3Rpb24sIG1heSBiZSBpbiBhIHNlcGFyYXRlIGZpbGUgKi8KKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWUgaGVhZGVyIGluZm9ybWF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRmlyc3QgdGhlIGJpdHJhdGUsIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgbW9ubywgc3RlcmVvIG9yIGpzdGVyZW8gIgorICAgICAgICAgICAgICAgICAgICAgICAgImluZGljYXRvcnMgYXJlIGRpc3BsYXllZCAuICBJZiB0aGUgYml0c3RyZWFtIGlzIGpzdGVyZW8sIHRoZW4gbWlkL3NpZGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0ZXJlbyBvciBpbnRlbnNpdHkgc3RlcmVvIG1heSBiZSBvbiAoaW5kaWNhdGVkIGluIHJlZCkuICBJZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZGUtZW1waGFzaXMgaXMgdXNlZCwgdGhpcyBpcyBhbHNvIGluZGljYXRlZCBpbiByZWQuICBUaGUgbWRiIHZhbHVlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYWluX2RhdGFfYmVnaW4uICBUaGUgZW5jb2RlZCBkYXRhIHN0YXJ0cyB0aGlzIG1hbnkgYnl0ZXMgKmJlZm9yZSogdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZSBoZWFkZXIuICBBIGxhcmdlIHZhbHVlIG9mIG1kYiBtZWFucyB0aGUgYml0c3RyZWFtIGhhcyBzYXZlZCBzb21lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiaXRzIGludG8gdGhlIHJlc2Vydm9pciwgd2hpY2ggaXQgbWF5IGFsbG9jYXRlIGZvciBzb21lIGZ1dHVyZSBmcmFtZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB0d28gbnVtYmVycyBhZnRlciBtZGIgYXJlIHRoZSBzaXplIChpbiBiaXRzKSB1c2VkIHRvIGVuY29kZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIk1EQ1QgY29lZmZpY2llbnRzIGZvciB0aGlzIGZyYW1lLCBmb2xsb3dlZCBieXQgdGhlIHNpemUgb2YgdGhlIGJpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXZvaXIgYmVmb3JlIGVuY29kaW5nIHRoaXMgZnJhbWUuICBUaGUgbWF4aW11bSBmcmFtZSBzaXplIGFuZCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJydW5uaW5nIGF2ZXJhZ2UgYXJlIGdpdmVuIGluIHRoZSBTdGF0cyBwdWxsIGRvd24gbWVudS4gIEEgbGFyZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1heGltdW0gZnJhbWUgc2l6ZSBpbmRpY2F0ZXMgdGhlIGJpdHN0cmVhbSBoYXMgbWFkZSB1c2Ugb2YgdGhlIGJpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXJ2b2lyLiBcblxuIiwgLTEpOworCisgICAgICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChib3gpLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBDTSBkYXRhICh0b3AgZ3JhcGgpOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIFBDTSBkYXRhIGlzIHBsb3R0ZWQgaW4gYmxhY2suICBUaGUgbGF5ZXIzIGZyYW1lIGlzIGRpdmlkZWQgaW50byAyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJncmFudWxlcyBvZiA1NzYgc2FtcGxlcyAobWFya2VkIHdpdGggeWVsbG93IHZlcnRpY2FsIGxpbmVzKS4gIEluIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FzZSBvZiBub3JtYWwsIHN0YXJ0IGFuZCBzdG9wIGJsb2NrcywgdGhlIE1EQ1QgY29lZmZpY2llbnRzIGZvciBlYWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJncmFudWxlIGFyZSBjb21wdXRlZCB1c2luZyBhIDExNTIgc2FtcGxlIHdpbmRvdyBjZW50ZXJlZCBvdmVyIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhbnVsZS4gIEluIHRoZSBjYXNlIG9mIHNob3J0IGJsb2NrcywgdGhlIGdyYW51bGUgaXMgZnVydGhlciBkaXZpZGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRvIDMgYmxvY2tzIG9mIDE5MiBzYW1wbGVzIChhbHNvIG1hcmtlZCB3aXRoIHllbGxvdyB2ZXJ0aWNhbCBsaW5lcykuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBNRENUIGNvZWZmaWNpZW50cyBmb3IgdGhlc2UgYmxvY2tzIGFyZSBjb21wdXRlZCB1c2luZyAzODQgc2FtcGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aW5kb3dzIGNlbnRlcmVkIG92ZXIgdGhlIDE5MiBzYW1wbGUgd2luZG93LiAgKFRoaXMgaW5mbyBub3QgYXZhaWxhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aGVuIGFuYWx5emluZyAubXAzIGZpbGVzLikgIEZvciB0aGUgcHN5Y2hvLWFjb3VzdGljIG1vZGVsLCBhIHdpbmRvd2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJGRlQgaXMgY29tcHV0ZWQgZm9yIGVhY2ggZ3JhbnVsZS4gIFRoZSByYW5nZSBvZiB0aGVzZSB3aW5kb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpcyBkZW5vdGVkIGJ5IHRoZSBibHVlIGFuZCBncmVlbiBiYXJzLlxuXG4iLCAtMSk7CisKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAiUENNIHJlLXN5bnRoZXNpcyBkYXRhIChzZWNvbmQgZ3JhcGgpOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiU2FtZSBhcyB0aGUgUENNIHdpbmRvdyBkZXNjcmliZWQgYWJvdmUuICBUaGUgZGF0YSBkaXNwbGF5ZWQgaXMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHQgb2YgZW5jb2RpbmcgYW5kIHRoZW4gZGVjb2RpbmcgdGhlIG9yaWdpbmFsIHNhbXBsZS4gXG5cbiIsIC0xKTsKKworICAgICAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoYm94KSwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNRENUIHdpbmRvd3M6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTaG93cyB0aGUgZW5lcmd5IGluIHRoZSBNRENUIHNwZWN0cnVtIGZvciBncmFudWxlIDAgKGxlZnQgd2luZG93KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGdyYW51bGUgMSAocmlnaHQgd2luZG93KS4gIFRoZSB0ZXh0IGFsc28gc2hvd3MgdGhlIGJsb2NrdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlZCwgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gZW5jb2RlIHRoZSBjb2VmZmljaWVudHMgYW5kIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIGV4dHJhIGJpdHMgYWxsb2NhdGVkIGZyb20gdGhlIHJlc2Vydm9pci4gIFRoZSBNRENUIHB1bGwgZG93biAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2luZG93IHdpbGwgdG9nZ2xlIGJldHdlZW4gdGhlIG9yaWdpbmFsIHVucXVhbnRpemVkIE1EQ1QgY29lZmZpY2llbnRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgdGhlIGNvbXByZXNzZWQgKHF1YW50aXplZCkgY29lZmZpY2llbnRzLlxuXG4iLCAtMSk7CisKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAiRkZUIHdpbmRvdzogIgorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBncmF5IGJhcnMgc2hvdyB0aGUgZW5lcmd5IGluIHRoZSBGRlQgc3BlY3RydW0gdXNlZCBieSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInBzeWNoby1hY291c3RpYyBtb2RlbC4gIEdyYW51bGUgMCBpcyBpbiB0aGUgbGVmdCB3aW5kb3csIGdyYW51bGUgMSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHJpZ2h0IHdpbmRvdy4gIFRoZSBncmVlbiBhbmQgYmx1ZSBiYXJzIHNob3cgaG93IG11Y2ggZGlzdG9ydGlvbiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYWxsb3dhYmxlLCBhcyBjb21wdXRlZCBieSB0aGUgcHN5Y2hvLWFjb3VzdGljIG1vZGVsLiBUaGUgcmVkIGJhcnMgc2hvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGFjdHVhbCBkaXN0b3J0aW9uIGFmdGVyIGVuY29kaW5nLiAgVGhlcmUgaXMgb25lIEZGVCBmb3IgZWFjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhbnVsZSwgY29tcHV0ZWQgd2l0aCBhIDEwMjQgSGFubiB3aW5kb3cgY2VudGVyZWQgb3ZlciB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgImFwcHJvcHJpYXRlIGdyYW51bGUuICAodGhlIHJhbmdlIG9mIHRoaXMgMTAyNCBzYW1wbGUgd2luZG93IGlzIHNob3duICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJieSB0aGUgYmx1ZSBhbmQgZ3JlZW4gYmFycyBpbiB0aGUgUENNIGRhdGEgd2luZG93KS4gIFRoZSBTcGVjdHJ1bSBwdWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkb3duIHdpbmRvdyB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHNob3dpbmcgdGhlIGVuZXJneSBpbiBlcXVhbGx5IHNwYWNlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IGRvbWFpbiBhbmQgdGhlIHNjYWxlIGZhY3RvciBiYW5kcyB1c2VkIGJ5IGxheWVyMy4gIEZpbmFsbHksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcGVyY2VwdHVhbCBlbnRyb3B5LCB0b3RhbCBlbmVyZ3kgYW5kIG51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBhdWRpYmxlIGRpc3RvcnRpb24gaXMgc2hvd24uICAoVGhpcyBpbmZvIG5vdCBhdmFpbGFibGUgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYW5hbHl6aW5nIC5tcDMgZmlsZXMuKSIsIC0xKTsKKworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIC8qIFNldCB0aGUgYWJvdXQgYm94IGluZm9ybWF0aW9uICovCisgICAgICAgIGd0a193aW5kb3dfc2V0X3RpdGxlKEdUS19XSU5ET1codGV4dHdpbmRvdyksICJBYm91dCIpOworICAgICAgICBndGtfd2lkZ2V0X3NldF91c2l6ZShib3gsIDM1MCwgMjYwKTsKKworICAgICAgICBzcHJpbnRmKHRleHQsICJMQU1FIHZlcnNpb24gJXMgXG4lc1xuXG4iLCBnZXRfbGFtZV92ZXJzaW9uKCksIGdldF9sYW1lX3VybCgpKTsKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsIHRleHQsIC0xKTsKKworICAgICAgICBzcHJpbnRmKHRleHQsICJwc3ljaG8tYWNvdXN0aWMgbW9kZWw6ICBHUFNZQ0hPIHZlcnNpb24gJXNcbiIsIGdldF9wc3lfdmVyc2lvbigpKTsKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsIHRleHQsIC0xKTsKKworICAgICAgICBzcHJpbnRmKHRleHQsICJmcmFtZSBhbmFseXplcjogTVAzeCB2ZXJzaW9uICVzXG5cbiIsIGdldF9tcDN4X3ZlcnNpb24oKSk7CisgICAgICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChib3gpLCBOVUxMLCBOVUxMLCBOVUxMLCB0ZXh0LCAtMSk7CisKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVjb2RlcjogIG1wZzEyMy9tcGdsaWIgIC41OXEgIFxuTWljaGFlbCBIaXBwICh3d3cubXBnMTIzLmRlKVxuXG4iLCAtMSk7CisKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAiRW5jb2RlciwgZGVjb2RlciAmIHBzeS1tb2RlbHMgYmFzZWQgb24gSVNPXG5kZW1vbnN0cmF0aW9uIHNvdXJjZS4gIiwgLTEpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgICAgZ3RrX3dpbmRvd19zZXRfdGl0bGUoR1RLX1dJTkRPVyh0ZXh0d2luZG93KSwgIlN0YXRpc3RpY3MiKTsKKyAgICAgICAgZ3RrX3dpZGdldF9zZXRfdXNpemUoYm94LCAzNTAsIDI2MCk7CisgICAgICAgIHNwcmludGYodGV4dCwgImZyYW1lcyBwcm9jZXNzZWQgc28gZmFyOiAlaSBcbiIsIFBpbmZvWzBdLmZyYW1lTnVtICsgMSk7CisgICAgICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChib3gpLCBOVUxMLCBOVUxMLCBOVUxMLCB0ZXh0LCAtMSk7CisgICAgICAgIHNwcmludGYodGV4dCwgImdyYW51bGVzIHByb2Nlc3NlZCBzbyBmYXI6ICVpIFxuXG4iLCA0ICogKFBpbmZvWzBdLmZyYW1lTnVtICsgMSkpOworICAgICAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoYm94KSwgTlVMTCwgTlVMTCwgTlVMTCwgdGV4dCwgLTEpOworICAgICAgICBzcHJpbnRmKHRleHQsICJtZWFuIGJpdHMvZnJhbWUgKGFwcHJveGltYXRlKTogJWlcbiIsIGd0a2luZm8uYXBwcm94Yml0cyk7CisgICAgICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChib3gpLCBOVUxMLCBOVUxMLCBOVUxMLCB0ZXh0LCAtMSk7CisgICAgICAgIHNwcmludGYodGV4dCwgIm1lYW4gYml0cy9mcmFtZSAoZnJvbSBMQU1FKTogJWlcbiIsIDQgKiBQaW5mb1swXS5tZWFuX2JpdHMpOworICAgICAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoYm94KSwgTlVMTCwgTlVMTCwgTlVMTCwgdGV4dCwgLTEpOworICAgICAgICBzcHJpbnRmKHRleHQsICJiaXRzaXplIG9mIGxhcmdlc3QgZnJhbWU6ICVpIFxuIiwgZ3RraW5mby5tYXhiaXRzKTsKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsIHRleHQsIC0xKTsKKyAgICAgICAgc3ByaW50Zih0ZXh0LCAiYXZlcmFnZSBiaXRzL2ZyYW1lOiAlMy4xZiBcblxuIiwgZ3RraW5mby5hdmViaXRzKTsKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsIHRleHQsIC0xKTsKKyAgICAgICAgc3ByaW50Zih0ZXh0LCAibXNfc3RlcmVvIGZyYW1lczogJWkgXG4iLCBndGtpbmZvLnRvdG1zKTsKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsIHRleHQsIC0xKTsKKyAgICAgICAgc3ByaW50Zih0ZXh0LCAiaV9zdGVyZW8gZnJhbWVzOiAlaSBcbiIsIGd0a2luZm8udG90aXMpOworICAgICAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoYm94KSwgTlVMTCwgTlVMTCwgTlVMTCwgdGV4dCwgLTEpOworICAgICAgICBzcHJpbnRmKHRleHQsICJkZS1lbXBoYXNpcyBmcmFtZXM6ICVpIFxuIiwgZ3RraW5mby50b3RlbXBoKTsKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsIHRleHQsIC0xKTsKKyAgICAgICAgc3ByaW50Zih0ZXh0LCAic2hvcnQgYmxvY2sgZ3JhbnVsZXM6ICVpIFxuIiwgZ3RraW5mby50b3RzaG9ydCk7CisgICAgICAgIGd0a190ZXh0X2luc2VydChHVEtfVEVYVChib3gpLCBOVUxMLCBOVUxMLCBOVUxMLCB0ZXh0LCAtMSk7CisgICAgICAgIHNwcmludGYodGV4dCwgIm1peGVkIGJsb2NrIGdyYW51bGVzOiAlaSBcbiIsIGd0a2luZm8udG90bWl4KTsKKyAgICAgICAgZ3RrX3RleHRfaW5zZXJ0KEdUS19URVhUKGJveCksIE5VTEwsIE5VTEwsIE5VTEwsIHRleHQsIC0xKTsKKyAgICAgICAgc3ByaW50Zih0ZXh0LCAicHJlZmxhZyBncmFudWxlczogJWkgXG4iLCBndGtpbmZvLnRvdHByZWZsYWcpOworICAgICAgICBndGtfdGV4dF9pbnNlcnQoR1RLX1RFWFQoYm94KSwgTlVMTCwgTlVMTCwgTlVMTCwgdGV4dCwgLTEpOworICAgICAgICBicmVhazsKKyAgICB9CisKKworCisgICAgZ3RrX3dpZGdldF9zaG93KHZzY3JvbGxiYXIpOworICAgIGd0a193aWRnZXRfc2hvdyhib3gpOworICAgIGd0a193aWRnZXRfc2hvdyh2Ym94KTsKKyAgICBndGtfd2lkZ2V0X3Nob3coaGJveCk7CisgICAgZ3RrX3dpZGdldF9zaG93KGJ1dHRvbik7CisKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChoYm94KSwgYm94LCBGQUxTRSwgVFJVRSwgMCk7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goaGJveCksIHZzY3JvbGxiYXIsIEZBTFNFLCBGQUxTRSwgMCk7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1godmJveCksIGhib3gsIEZBTFNFLCBUUlVFLCAwKTsKKyAgICBndGtfYm94X3BhY2tfZW5kKEdUS19CT1godmJveCksIGJ1dHRvbiwgRkFMU0UsIFRSVUUsIDApOworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIodGV4dHdpbmRvdyksIHZib3gpOworICAgIGd0a193aWRnZXRfc2hvdyh0ZXh0d2luZG93KTsKKworfQorCisKKworCisvKiAjaW5jbHVkZSA8c3RyaW5ncy5oPiovCisKKworLyogVGhpcyBpcyB0aGUgR3RrSXRlbUZhY3RvcnlFbnRyeSBzdHJ1Y3R1cmUgdXNlZCB0byBnZW5lcmF0ZSBuZXcgbWVudXMuCisgICBJdGVtIDE6IFRoZSBtZW51IHBhdGguIFRoZSBsZXR0ZXIgYWZ0ZXIgdGhlIHVuZGVyc2NvcmUgaW5kaWNhdGVzIGFuCisgICAgICAgICAgIGFjY2VsZXJhdG9yIGtleSBvbmNlIHRoZSBtZW51IGlzIG9wZW4uCisgICBJdGVtIDI6IFRoZSBhY2NlbGVyYXRvciBrZXkgZm9yIHRoZSBlbnRyeQorICAgSXRlbSAzOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgICBJdGVtIDQ6IFRoZSBjYWxsYmFjayBhY3Rpb24uICBUaGlzIGNoYW5nZXMgdGhlIHBhcmFtZXRlcnMgd2l0aAorICAgICAgICAgICB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiAgVGhlIGRlZmF1bHQgaXMgMC4KKyAgIEl0ZW0gNTogVGhlIGl0ZW0gdHlwZSwgdXNlZCB0byBkZWZpbmUgd2hhdCBraW5kIG9mIGFuIGl0ZW0gaXQgaXMuCisgICAgICAgICAgIEhlcmUgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXM6CisKKyAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgIC0+ICI8SXRlbT4iCisgICAgICAgICAgICIiICAgICAgICAgICAgICAgICAtPiAiPEl0ZW0+IgorICAgICAgICAgICAiPFRpdGxlPiIgICAgICAgICAgLT4gY3JlYXRlIGEgdGl0bGUgaXRlbQorICAgICAgICAgICAiPEl0ZW0+IiAgICAgICAgICAgLT4gY3JlYXRlIGEgc2ltcGxlIGl0ZW0KKyAgICAgICAgICAgIjxDaGVja0l0ZW0+IiAgICAgIC0+IGNyZWF0ZSBhIGNoZWNrIGl0ZW0KKyAgICAgICAgICAgIjxUb2dnbGVJdGVtPiIgICAgIC0+IGNyZWF0ZSBhIHRvZ2dsZSBpdGVtCisgICAgICAgICAgICI8UmFkaW9JdGVtPiIgICAgICAtPiBjcmVhdGUgYSByYWRpbyBpdGVtCisgICAgICAgICAgIDxwYXRoPiAgICAgICAgICAgICAtPiBwYXRoIG9mIGEgcmFkaW8gaXRlbSB0byBsaW5rIGFnYWluc3QKKyAgICAgICAgICAgIjxTZXBhcmF0b3I+IiAgICAgIC0+IGNyZWF0ZSBhIHNlcGFyYXRvcgorICAgICAgICAgICAiPEJyYW5jaD4iICAgICAgICAgLT4gY3JlYXRlIGFuIGl0ZW0gdG8gaG9sZCBzdWIgaXRlbXMKKyAgICAgICAgICAgIjxMYXN0QnJhbmNoPiIgICAgIC0+IGNyZWF0ZSBhIHJpZ2h0IGp1c3RpZmllZCBicmFuY2gKKyovCisKKworI2RlZmluZSBDKGNocikgICAgICAgIjxjb250cm9sPiIgI2NocgorI2RlZmluZSBmdW5jKG5hbWUpICAgKEd0a0l0ZW1GYWN0b3J5Q2FsbGJhY2spIChuYW1lKQorCitzdGF0aWMgY29uc3QgR3RrSXRlbUZhY3RvcnlFbnRyeSBtZW51X2l0ZW1zW10gPSB7CisgICAgeyIvX0ZpbGUiLCBOVUxMLCBOVUxMLCAwLCAiPEJyYW5jaD4ifSwKKyNpZiAwCisgICAgeyIvRmlsZS9fTmV3IiwgQyhOKSwgZnVuYyhwcmludF9oZWxsbyksIDAsIE5VTEx9LAorICAgIHsiL0ZpbGUvX09wZW4iLCBDKE8pLCBmdW5jKHByaW50X2hlbGxvKSwgMCwgTlVMTH0sCisgICAgeyIvRmlsZS9fU2F2ZSIsIEMoUyksIGZ1bmMocHJpbnRfaGVsbG8pLCAwLCBOVUxMfSwKKyAgICB7Ii9GaWxlL1NhdmUgX0FzIiwgTlVMTCwgTlVMTCwgMCwgTlVMTH0sCisgICAgeyIvRmlsZS9zZXAxIiwgTlVMTCwgTlVMTCwgMCwgIjxTZXBhcmF0b3I+In0sCisgICAgeyIvRmlsZS9RdWl0IiwgQyhRKSwgZnVuYyhndGtfbWFpbl9xdWl0KSwgMCwgTlVMTH0sCisjZW5kaWYKKyAgICB7Ii9GaWxlL19RdWl0IiwgQyhRKSwgZnVuYyhkZWxldGVfZXZlbnQpLCAwLCBOVUxMfSwKKworICAgIHsiL19QbG90dGluZyIsIE5VTEwsIE5VTEwsIDAsICI8QnJhbmNoPiJ9LAorICAgIHsiL1Bsb3R0aW5nL19XaGlsZSBhZHZhbmNpbmciLCBOVUxMLCBmdW5jKHNwZWNfb3B0aW9uKSwgNSwgTlVMTH0sCisgICAgeyIvUGxvdHRpbmcvX0FmdGVyIGFkdmFuY2luZyIsIE5VTEwsIGZ1bmMoc3BlY19vcHRpb24pLCA2LCBOVUxMfSwKKyAgICB7Ii9QbG90dGluZy9Ub2dnbGUgU0ZCIGxpbmVzIiwgTlVMTCwgZnVuYyhzcGVjX29wdGlvbiksIDcsIE5VTEx9LAorICAgIHsiL1Bsb3R0aW5nL1RvZ2dsZSBvcmlnLWRpZmYiLCBOVUxMLCBmdW5jKHNwZWNfb3B0aW9uKSwgOCwgTlVMTH0sCisKKyAgICB7Ii9fQ2hhbm5lbCIsIE5VTEwsIE5VTEwsIDAsICI8QnJhbmNoPiJ9LAorICAgIHsiL0NoYW5uZWwvc2hvdyBfTGVmdCIsIE5VTEwsIGZ1bmMoY2hhbm5lbF9vcHRpb24pLCAxLCBOVUxMfSwKKyAgICB7Ii9DaGFubmVsL3Nob3cgX1JpZ2h0IiwgTlVMTCwgZnVuYyhjaGFubmVsX29wdGlvbiksIDIsIE5VTEx9LAorICAgIHsiL0NoYW5uZWwvc2hvdyBfTWlkIiwgTlVMTCwgZnVuYyhjaGFubmVsX29wdGlvbiksIDMsIE5VTEx9LAorICAgIHsiL0NoYW5uZWwvc2hvdyBfU2lkZSIsIE5VTEwsIGZ1bmMoY2hhbm5lbF9vcHRpb24pLCA0LCBOVUxMfSwKKworICAgIHsiL19TcGVjdHJ1bSIsIE5VTEwsIE5VTEwsIDAsICI8QnJhbmNoPiJ9LAorICAgIHsiL1NwZWN0cnVtL19TY2FsZWZhY3RvciBiYW5kcyIsIE5VTEwsIGZ1bmMoc3BlY19vcHRpb24pLCAxLCBOVUxMfSwKKyAgICB7Ii9TcGVjdHJ1bS9fV2F2ZSBudW1iZXIiLCBOVUxMLCBmdW5jKHNwZWNfb3B0aW9uKSwgMiwgTlVMTH0sCisKKyAgICB7Ii9fTURDVCIsIE5VTEwsIE5VTEwsIDAsICI8QnJhbmNoPiJ9LAorICAgIHsiL01EQ1QvX09yaWdpbmFsIiwgTlVMTCwgZnVuYyhzcGVjX29wdGlvbiksIDMsIE5VTEx9LAorICAgIHsiL01EQ1QvX0NvbXByZXNzZWQiLCBOVUxMLCBmdW5jKHNwZWNfb3B0aW9uKSwgNCwgTlVMTH0sCisgICAgeyIvTURDVC9fVG9nZ2xlIFNGQiBsaW5lcyIsIE5VTEwsIGZ1bmMoc3BlY19vcHRpb24pLCA3LCBOVUxMfSwKKworICAgIHsiL19TdGF0cyIsIE5VTEwsIE5VTEwsIDAsICI8QnJhbmNoPiJ9LAorICAgIHsiL1N0YXRzL19TaG93IiwgTlVMTCwgZnVuYyh0ZXh0X3dpbmRvdyksIDIsIE5VTEx9LAorCisgICAgeyIvX0hlbHAiLCBOVUxMLCBOVUxMLCAwLCAiPExhc3RCcmFuY2g+In0sCisgICAgeyIvX0hlbHAvX0RvY3VtZW50YXRpb24iLCBOVUxMLCBmdW5jKHRleHRfd2luZG93KSwgMCwgTlVMTH0sCisgICAgeyIvX0hlbHAvX0Fib3V0IiwgTlVMTCwgZnVuYyh0ZXh0X3dpbmRvdyksIDEsIE5VTEx9LAorfTsKKworI3VuZGVmIEMKKyN1bmRlZiBmdW5jCisKKworc3RhdGljIHZvaWQKK2dldF9tYWluX21lbnUoR3RrV2lkZ2V0ICogd2luZG93cywgR3RrV2lkZ2V0ICoqIG1lbnViYXIpCit7CisgICAgdW5zaWduZWQgaW50IG5tZW51X2l0ZW1zID0gc2l6ZW9mKG1lbnVfaXRlbXMpIC8gc2l6ZW9mKG1lbnVfaXRlbXNbMF0pOworICAgIEd0a0l0ZW1GYWN0b3J5ICppdGVtX2ZhY3Rvcnk7CisgICAgR3RrQWNjZWxHcm91cCAqYWNjZWxfZ3JvdXA7CisKKyAgICBhY2NlbF9ncm91cCA9IGd0a19hY2NlbF9ncm91cF9uZXcoKTsKKworICAgIC8qIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGl0ZW0gZmFjdG9yeS4KKyAgICAgICBQYXJhbSAxOiBUaGUgdHlwZSBvZiBtZW51IC0gY2FuIGJlIEdUS19UWVBFX01FTlVfQkFSLCBHVEtfVFlQRV9NRU5VLAorICAgICAgIG9yIEdUS19UWVBFX09QVElPTl9NRU5VLgorICAgICAgIFBhcmFtIDI6IFRoZSBwYXRoIG9mIHRoZSBtZW51LgorICAgICAgIFBhcmFtIDM6IEEgcG9pbnRlciB0byBhIGd0a19hY2NlbF9ncm91cC4gIFRoZSBpdGVtIGZhY3Rvcnkgc2V0cyB1cAorICAgICAgIHRoZSBhY2NlbGVyYXRvciB0YWJsZSB3aGlsZSBnZW5lcmF0aW5nIG1lbnVzLgorICAgICAqLworCisgICAgaXRlbV9mYWN0b3J5ID0gZ3RrX2l0ZW1fZmFjdG9yeV9uZXcoR1RLX1RZUEVfTUVOVV9CQVIsICI8bWFpbj4iLCBhY2NlbF9ncm91cCk7CisKKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyB0aGUgbWVudSBpdGVtcy4gUGFzcyB0aGUgaXRlbSBmYWN0b3J5LAorICAgICAgIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFycmF5LCB0aGUgYXJyYXkgaXRzZWxmLCBhbmQgYW55CisgICAgICAgY2FsbGJhY2sgZGF0YSBmb3IgdGhlIHRoZSBtZW51IGl0ZW1zLiAqLworICAgIGd0a19pdGVtX2ZhY3RvcnlfY3JlYXRlX2l0ZW1zKGl0ZW1fZmFjdG9yeSwgbm1lbnVfaXRlbXMsIChHdGtJdGVtRmFjdG9yeUVudHJ5ICopIG1lbnVfaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAvKiBBdHRhY2ggdGhlIG5ldyBhY2NlbGVyYXRvciBncm91cCB0byB0aGUgd2luZG93LiAqLworICAgIGd0a19hY2NlbF9ncm91cF9hdHRhY2goYWNjZWxfZ3JvdXAsIEdUS19PQkpFQ1Qod2luZG93cykpOworCisgICAgaWYgKG1lbnViYXIpCisgICAgICAgIC8qIEZpbmFsbHksIHJldHVybiB0aGUgYWN0dWFsIG1lbnUgYmFyIGNyZWF0ZWQgYnkgdGhlIGl0ZW0gZmFjdG9yeS4gKi8KKyAgICAgICAgKm1lbnViYXIgPSBndGtfaXRlbV9mYWN0b3J5X2dldF93aWRnZXQoaXRlbV9mYWN0b3J5LCAiPG1haW4+Iik7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCisKK2ludAorZ3RrY29udHJvbChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcDIsIGNoYXIgKmluUGF0aCkKK3sKKyAgICAvKiBHdGtXaWRnZXQgaXMgdGhlIHN0b3JhZ2UgdHlwZSBmb3Igd2lkZ2V0cyAqLworICAgIEd0a1dpZGdldCAqYnV0dG9uOworICAgIEd0a0FkanVzdG1lbnQgKmFkajsKKyAgICBHdGtXaWRnZXQgKm1ib3g7ICAgICAgICAgLyogbWFpbiBib3ggKi8KKyAgICBHdGtXaWRnZXQgKmJveDE7ICAgICAgICAgLyogZnJhbWUgY29udHJvbCBidXR0b25zIGdvICovCisgICAgR3RrV2lkZ2V0ICpib3gyOyAgICAgICAgIC8qIGZyYW1lIGNvdW50ZXJzICovCisgICAgR3RrV2lkZ2V0ICpib3gzOyAgICAgICAgIC8qIGZyYW1lIGhlYWRlciBpbmZvICovCisgICAgR3RrV2lkZ2V0ICp0YWJsZTsgICAgICAgIC8qIHRhYmxlIGZvciBhbGwgdGhlIHBsb3R0aW5nIGFyZWFzICovCisgICAgR3RrV2lkZ2V0ICptZW51YmFyOworCisgICAgZ2ludCAgICB0YWJsZW9wcywgZ3JhcGh4LCBncmFwaHk7CisgICAgY2hhciAgICBmcmFtZWluZm9bODBdOworCisgICAgZ3JhcGh4ID0gNjAwOyAgICAgICAvKiBtaW5pbXVtIGFsbG93ZWQgc2l6ZSBvZiBwaXhtYXAgKi8KKyAgICBncmFwaHkgPSA5NTsKKworICAgIGdmcCA9IGdmcDI7CisgICAgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIC8qIHNldCBzb21lIGdsb2JhbCBkZWZhdWx0cy92YXJpYWJsZXMgKi8KKyAgICBndGtpbmZvLmZpbGV0eXBlID0gaXNfbXBlZ19maWxlX2Zvcm1hdChpbnB1dF9mb3JtYXQpID8gMSA6IDA7CisgICAgZ3RraW5mby5tc2ZsYWcgPSAwOworICAgIGd0a2luZm8uY2hmbGFnID0gMDsKKyAgICBndGtpbmZvLmtiZmxhZyA9IDA7CisgICAgZ3RraW5mby5mbGFnMTIzID0gaXNfbXBlZ19maWxlX2Zvcm1hdChpbnB1dF9mb3JtYXQpID8gMSA6IDA7IC8qIE1QMyBmaWxlPXVzZSBtcGcxMjMgb3V0cHV0ICovCisgICAgZ3RraW5mby5wdXBkYXRlID0gMDsKKyAgICBndGtpbmZvLmF2ZWJpdHMgPSAwOworICAgIGd0a2luZm8ubWF4Yml0cyA9IDA7CisgICAgZ3RraW5mby5hcHByb3hiaXRzID0gMDsKKyAgICBndGtpbmZvLnRvdGVtcGggPSAwOworICAgIGd0a2luZm8udG90bXMgPSAwOworICAgIGd0a2luZm8udG90aXMgPSAwOworICAgIGd0a2luZm8udG90c2hvcnQgPSAwOworICAgIGd0a2luZm8udG90bWl4ID0gMDsKKyAgICBndGtpbmZvLnNmYmxpbmVzID0gMTsKKyAgICBndGtpbmZvLmRpZmZlcmVuY2UgPSAwOworICAgIGd0a2luZm8udG90YWxmcmFtZXMgPSAwOworCisgICAgbWVtc2V0KChjaGFyICopIFBpbmZvLCAwLCBzaXplb2YoUGluZm8pKTsKKyAgICBwcGxvdCA9ICZQaW5mb1tSRUFEX0FIRUFEXTsKKworICAgIHN0cmNweShmcmFtZWluZm8sICJNUDN4OiAiKTsKKyAgICBzdHJuY2F0KGZyYW1laW5mbywgaW5QYXRoLCA3MCk7CisKKyAgICB3aW5kb3cgPSBndGtfd2luZG93X25ldyhHVEtfV0lORE9XX1RPUExFVkVMKTsKKyAgICBndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKHdpbmRvdyksIGZyYW1laW5mbyk7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1Qod2luZG93KSwgImRlbGV0ZV9ldmVudCIsIEdUS19TSUdOQUxfRlVOQyhkZWxldGVfZXZlbnQpLCBOVUxMKTsKKworICAgIGd0a19zaWduYWxfY29ubmVjdF9vYmplY3QoR1RLX09CSkVDVCh3aW5kb3cpLCAia2V5X3ByZXNzX2V2ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUS19TSUdOQUxfRlVOQyhrZXlfcHJlc3NfZXZlbnQpLCBHVEtfT0JKRUNUKHdpbmRvdykpOworCisgICAgZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIod2luZG93KSwgMCk7CisKKworICAgIG1ib3ggPSBndGtfdmJveF9uZXcoRkFMU0UsIDApOworCisKKyAgICAvKiBsYXlvdXQgb2YgbWJveCAqLworICAgIGJveDEgPSBndGtfaGJveF9uZXcoRkFMU0UsIDApOworICAgIGJveDIgPSBndGtfaGJveF9uZXcoRkFMU0UsIDApOworICAgIGJveDMgPSBndGtfaGJveF9uZXcoRkFMU0UsIDApOworICAgIHRhYmxlID0gZ3RrX3RhYmxlX25ldyg1LCAyLCBGQUxTRSk7CisgICAgdGFibGVvcHMgPSBHVEtfRklMTCB8IEdUS19FWFBBTkQgfCBHVEtfU0hSSU5LOworICAgIGdldF9tYWluX21lbnUod2luZG93LCAmbWVudWJhcik7CisKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChtYm94KSwgbWVudWJhciwgRkFMU0UsIFRSVUUsIDApOworICAgIGd0a19ib3hfcGFja19lbmQoR1RLX0JPWChtYm94KSwgYm94MSwgRkFMU0UsIFRSVUUsIDApOworICAgIGd0a19ib3hfcGFja19lbmQoR1RLX0JPWChtYm94KSwgYm94MiwgRkFMU0UsIFRSVUUsIDApOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKG1ib3gpLCBib3gzLCBGQUxTRSwgVFJVRSwgMCk7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1gobWJveCksIHRhYmxlLCBUUlVFLCBUUlVFLCAwKTsKKyAgICBndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKHdpbmRvdyksIG1ib3gpOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHN0dWZmIGluIGJveDMgIGZyYW1lIGhlYWRlciBpbmZvICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKgorICAgICAgIGhlYWRlcmJveCA9IGd0a19sYWJlbF9uZXcoIiAiKTsKKyAgICAgICBndGtfbGFiZWxfc2V0X2p1c3RpZnkoR1RLX0xBQkVMKGhlYWRlcmJveCksR1RLX0pVU1RJRllfTEVGVCk7CisgICAgICovCisgICAgaGVhZGVyYm94ID0gZ3RrX3RleHRfbmV3KE5VTEwsIE5VTEwpOworICAgIGd0a190ZXh0X3NldF9lZGl0YWJsZShHVEtfVEVYVChoZWFkZXJib3gpLCBGQUxTRSk7CisgICAgZ3RrX3dpZGdldF9zZXRfdXNpemUoaGVhZGVyYm94LCAyMDAsIDIwKTsKKyAgICBndGtfd2lkZ2V0X3Nob3coaGVhZGVyYm94KTsKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChib3gzKSwgaGVhZGVyYm94LCBUUlVFLCBUUlVFLCAwKTsKKworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHN0dWZmIGluIGJveDIgICBmcmFtZSBjb3VudGVycyAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZyYW1lY291bnRlciA9IGd0a19sYWJlbF9uZXcoIiIpOworICAgIGd0a193aWRnZXRfc2hvdyhmcmFtZWNvdW50ZXIpOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKGJveDIpLCBmcmFtZWNvdW50ZXIsIEZBTFNFLCBUUlVFLCAwKTsKKworICAgIGFkaiA9IChHdGtBZGp1c3RtZW50ICopIGd0a19hZGp1c3RtZW50X25ldygwLCAwLCAoZ2ludCkgbGFtZV9nZXRfdG90YWxmcmFtZXMoZ2ZwKSAtIDEsIDAsIDAsIDApOworICAgIGZyYW1lcHJvZ3Jlc3MgPSBndGtfcHJvZ3Jlc3NfYmFyX25ld193aXRoX2FkanVzdG1lbnQoYWRqKTsKKyAgICAvKiBTZXQgdGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUKKyAgICAgKiB0cm91Z2ggb2YgdGhlIHByb2dyZXNzIGJhcjoKKyAgICAgKiAlcCAtIHBlcmNlbnRhZ2UKKyAgICAgKiAldiAtIHZhbHVlCisgICAgICogJWwgLSBsb3dlciByYW5nZSB2YWx1ZQorICAgICAqICV1IC0gdXBwZXIgcmFuZ2UgdmFsdWUgKi8KKyAgICBndGtfcHJvZ3Jlc3Nfc2V0X2Zvcm1hdF9zdHJpbmcoR1RLX1BST0dSRVNTKGZyYW1lcHJvZ3Jlc3MpLCAiJXAlJSIpOworICAgIGd0a19wcm9ncmVzc19zZXRfdmFsdWUoR1RLX1BST0dSRVNTKGZyYW1lcHJvZ3Jlc3MpLCAoZ2RvdWJsZSkgMCk7CisgICAgZ3RrX3Byb2dyZXNzX3NldF9zaG93X3RleHQoR1RLX1BST0dSRVNTKGZyYW1lcHJvZ3Jlc3MpLCBUUlVFKTsKKyAgICBndGtfd2lkZ2V0X3Nob3coZnJhbWVwcm9ncmVzcyk7CisgICAgZ3RrX2JveF9wYWNrX2VuZChHVEtfQk9YKGJveDIpLCBmcmFtZXByb2dyZXNzLCBGQUxTRSwgVFJVRSwgMCk7CisKKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBzdHVmZiBpbiBib3gxICBidXR0b25zIGFsb25nIGJvdHRvbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgYnV0dG9uID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCgiLTEiKTsKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChidXR0b24pLCAiY2xpY2tlZCIsIEdUS19TSUdOQUxfRlVOQyhmcmFtZWFkdiksIChncG9pbnRlcikgIi0xIik7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goYm94MSksIGJ1dHRvbiwgVFJVRSwgVFJVRSwgMCk7CisgICAgZ3RrX3dpZGdldF9zaG93KGJ1dHRvbik7CisKKyAgICBidXR0b24gPSBndGtfYnV0dG9uX25ld193aXRoX2xhYmVsKCIrMSIpOworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGJ1dHRvbiksICJjbGlja2VkIiwgR1RLX1NJR05BTF9GVU5DKGZyYW1lYWR2KSwgKGdwb2ludGVyKSAiMSIpOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKGJveDEpLCBidXR0b24sIFRSVUUsIFRSVUUsIDApOworICAgIGd0a193aWRnZXRfc2hvdyhidXR0b24pOworCisgICAgYnV0dG9uID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCgiKzEwIik7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoYnV0dG9uKSwgImNsaWNrZWQiLCBHVEtfU0lHTkFMX0ZVTkMoZnJhbWVhZHYpLCAoZ3BvaW50ZXIpICIxMCIpOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKGJveDEpLCBidXR0b24sIFRSVUUsIFRSVUUsIDApOworICAgIGd0a193aWRnZXRfc2hvdyhidXR0b24pOworCisgICAgYnV0dG9uID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCgiKzEwMCIpOworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGJ1dHRvbiksICJjbGlja2VkIiwgR1RLX1NJR05BTF9GVU5DKGZyYW1lYWR2KSwgKGdwb2ludGVyKSAiMTAwIik7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goYm94MSksIGJ1dHRvbiwgVFJVRSwgVFJVRSwgMCk7CisgICAgZ3RrX3dpZGdldF9zaG93KGJ1dHRvbik7CisKKyAgICBidXR0b24gPSBndGtfYnV0dG9uX25ld193aXRoX2xhYmVsKCJsYXN0IGZyYW1lIik7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoYnV0dG9uKSwgImNsaWNrZWQiLAorICAgICAgICAgICAgICAgICAgICAgICBHVEtfU0lHTkFMX0ZVTkMoZnJhbWVhZHYpLCAoZ3BvaW50ZXIpICJmaW5pc2giKTsKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChib3gxKSwgYnV0dG9uLCBUUlVFLCBUUlVFLCAwKTsKKyAgICBndGtfd2lkZ2V0X3Nob3coYnV0dG9uKTsKKworICAgIGJ1dHRvbiA9IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwoInN0b3AvcGxvdCIpOworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGJ1dHRvbiksICJjbGlja2VkIiwgR1RLX1NJR05BTF9GVU5DKHBsb3RjbGljayksIE5VTEwpOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKGJveDEpLCBidXR0b24sIFRSVUUsIFRSVUUsIDApOworICAgIGd0a193aWRnZXRfc2hvdyhidXR0b24pOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHN0dWZmIGluIHRhYmxlLiAgYWxsIHRoZSBwbG90dGluZyB3aW5kb3dzICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBwY21ib3ggPSBncGtfcGxvdF9uZXcoZ3JhcGh4LCBncmFwaHkpOworICAgIGd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgcGNtYm94LCAwLCAyLCAwLCAxLCB0YWJsZW9wcywgdGFibGVvcHMsIDIsIDIpOworICAgIGd0a193aWRnZXRfc2hvdyhwY21ib3gpOworCisgICAgd2luYm94ID0gZ3BrX3Bsb3RfbmV3KGdyYXBoeSwgZ3JhcGh5KTsKKyAgICBndGtfdGFibGVfYXR0YWNoKEdUS19UQUJMRSh0YWJsZSksIHdpbmJveCwgMCwgMiwgMSwgMiwgdGFibGVvcHMsIHRhYmxlb3BzLCAyLCAyKTsKKyAgICBndGtfd2lkZ2V0X3Nob3cod2luYm94KTsKKworCisgICAgbWRjdGJveFswXSA9IGdwa19wbG90X25ldyhncmFwaHksIGdyYXBoeSk7CisgICAgZ3RrX3RhYmxlX2F0dGFjaChHVEtfVEFCTEUodGFibGUpLCBtZGN0Ym94WzBdLCAwLCAxLCAyLCAzLCB0YWJsZW9wcywgdGFibGVvcHMsIDIsIDIpOworICAgIGd0a193aWRnZXRfc2hvdyhtZGN0Ym94WzBdKTsKKworICAgIG1kY3Rib3hbMV0gPSBncGtfcGxvdF9uZXcoZ3JhcGh5LCBncmFwaHkpOworICAgIGd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgbWRjdGJveFsxXSwgMSwgMiwgMiwgMywgdGFibGVvcHMsIHRhYmxlb3BzLCAyLCAyKTsKKyAgICBndGtfd2lkZ2V0X3Nob3cobWRjdGJveFsxXSk7CisKKyAgICBlbmVyYm94WzBdID0gZ3BrX3Bsb3RfbmV3KGdyYXBoeSwgZ3JhcGh5KTsKKyAgICBndGtfdGFibGVfYXR0YWNoKEdUS19UQUJMRSh0YWJsZSksIGVuZXJib3hbMF0sIDAsIDEsIDMsIDQsIHRhYmxlb3BzLCB0YWJsZW9wcywgMiwgMik7CisgICAgZ3RrX3dpZGdldF9zaG93KGVuZXJib3hbMF0pOworCisgICAgZW5lcmJveFsxXSA9IGdwa19wbG90X25ldyhncmFwaHksIGdyYXBoeSk7CisgICAgZ3RrX3RhYmxlX2F0dGFjaChHVEtfVEFCTEUodGFibGUpLCBlbmVyYm94WzFdLCAxLCAyLCAzLCA0LCB0YWJsZW9wcywgdGFibGVvcHMsIDIsIDIpOworICAgIGd0a193aWRnZXRfc2hvdyhlbmVyYm94WzFdKTsKKworICAgIHNmYmJveFswXSA9IGdwa19wbG90X25ldyhncmFwaHksIGdyYXBoeSk7CisgICAgZ3RrX3RhYmxlX2F0dGFjaChHVEtfVEFCTEUodGFibGUpLCBzZmJib3hbMF0sIDAsIDEsIDQsIDUsIHRhYmxlb3BzLCB0YWJsZW9wcywgMiwgMik7CisgICAgZ3RrX3dpZGdldF9zaG93KHNmYmJveFswXSk7CisKKyAgICBzZmJib3hbMV0gPSBncGtfcGxvdF9uZXcoZ3JhcGh5LCBncmFwaHkpOworICAgIGd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgc2ZiYm94WzFdLCAxLCAyLCA0LCA1LCB0YWJsZW9wcywgdGFibGVvcHMsIDIsIDIpOworICAgIGd0a193aWRnZXRfc2hvdyhzZmJib3hbMV0pOworCisKKworCisgICAgZ3RrX2lkbGVfYWRkKChHdGtGdW5jdGlvbikgZnJhbWVhZHYxLCBOVUxMKTsKKyAgICBndGtfd2lkZ2V0X3Nob3cobWVudWJhcik7CisgICAgZ3RrX3dpZGdldF9zaG93KGJveDIpOworICAgIGd0a193aWRnZXRfc2hvdyhib3gzKTsKKyAgICBndGtfd2lkZ2V0X3Nob3codGFibGUpOworICAgIGd0a193aWRnZXRfc2hvdyhib3gxKTsKKyAgICBndGtfd2lkZ2V0X3Nob3cobWJveCk7CisgICAgZ3RrX3dpZGdldF9zaG93KHdpbmRvdyk7IC8qIHNob3cgc21hbGxlc3QgYWxsb3dlZCB3aW5kb3cgKi8KKworICAgIC8qIG1ha2Ugd2luZG93IGJpZ2dlci4gICAqLworICAgIC8qIG5vdyB0aGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2hyaW5rIGl0LCBpZiBkZXNpcmVkICovCisgICAgLyogZ3RrX3dpZGdldF9zZXRfdXNpemUobWJveCw1MDAsNTAwKTsgICovCisgICAgLyogZ3RrX3dpZGdldF9zaG93ICh3aW5kb3cpOyAqLyAvKiBzaG93IHNtYWxsZXN0IGFsbG93ZWQgd2luZG93ICovCisKKworCisgICAgaWRsZV9rZWVwZ29pbmcgPSAxOyAvKiBwcm9jZXNzaW5nIG9mIGZyYW1lcyBpcyBPTiAqLworICAgIGlkbGVfY291bnRfbWF4ID0gUkVBRF9BSEVBRCArIDE7IC8qIG51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyBiZWZvcmUgcGxvdHRpbmcgKi8KKyAgICBpZGxlX2NvdW50ID0gMDsgICAgIC8qIHBhdXNlICYgcGxvdCB3aGVuIGlkbGVfY291bnQ9aWRsZV9jb3VudF9tYXggKi8KKworICAgIGd0a19tYWluKCk7CisgICAgYXNzZXJ0KG1wM2RvbmUpOworICAgIHJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC9ndGthbmFsLmggYi9mcm9udGVuZC9ndGthbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlMjEwYwotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL2d0a2FuYWwuaApAQCAtMCwwICsxLDI1IEBACisvKgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfR1RLQ09OVFJPTF9ICisjZGVmaW5lIExBTUVfR1RLQ09OVFJPTF9ICisKKworaW50ICAgICBndGtjb250cm9sKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwMiwgY2hhciAqaW5QYXRoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcm9udGVuZC9sYW1lX3ZjNi5kc3AgYi9mcm9udGVuZC9sYW1lX3ZjNi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1MzZkMAotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL2xhbWVfdmM2LmRzcApAQCAtMCwwICsxLDE4OCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJsYW1lIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogTklDSFQgQkVBUkJFSVRFTiAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1MQU1FIC0gV0lOMzIgREVCVUcNCishTUVTU0FHRSBEaWVzIGlzdCBrZWluIGf8bHRpZ2VzIE1ha2VmaWxlLiBadW0gRXJzdGVsbGVuIGRpZXNlcyBQcm9qZWt0cyBtaXQgTk1BS0UNCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZvxocmVuIFNpZSBkZW4gQmVmZWhsDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImxhbWVfdmM2Lm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgU2llIGv2bm5lbiBiZWltIEF1c2b8aHJlbiB2b24gTk1BS0UgZWluZSBLb25maWd1cmF0aW9uIGFuZ2ViZW4NCishTUVTU0FHRSBkdXJjaCBEZWZpbmllcmVuIGRlcyBNYWtyb3MgQ0ZHIGluIGRlciBCZWZlaGxzemVpbGUuIFp1bSBCZWlzcGllbDoNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibGFtZV92YzYubWFrIiBDRkc9IkxBTUUgLSBXSU4zMiBERUJVRyINCishTUVTU0FHRSANCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJsYW1lIC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAibGFtZSAtIFdpbjMyIERlYnVnIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJsYW1lIC0gV2luMzIgUmVsZWFzZSBOQVNNIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJsYW1lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXG91dHB1dFxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZVxmcm9udGVuZCINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvT2IyIC9JICIuLiIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJIQVZFX0NPTkZJR19IIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL291dDoiLi5cb3V0cHV0XFJlbGVhc2VcbGFtZS5leGUiIC9vcHQ6Tk9XSU45OA0KKyMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsYW1lIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIlxvdXRwdXRcRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxEZWJ1Z1xmcm9udGVuZCINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9JICIuLi8iIC9JICIuLi9tcGdsaWIiIC9JICIuLi9saWJtcDNsYW1lIiAvSSAiLi4vaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJfV0lORE9XUyIgL0QgIkhBVkVfTVBHTElCIiAvRCAiSEFWRV9DT05GSUdfSCIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiLi5cb3V0cHV0XERlYnVnXGxhbWUuZXhlIiAvcGRidHlwZTpzZXB0IC9vcHQ6Tk9XSU45OA0KKyMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsYW1lIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImxhbWVfX19XaW4zMl9SZWxlYXNlX05BU00iDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGFtZV9fX1dpbjMyX1JlbGVhc2VfTkFTTSINCisjIFBST1AgQkFTRSBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXG91dHB1dFxSZWxlYXNlX05BU00iDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cZnJvbnRlbmQiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvT2IyIC9JICIuLiIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJIQVZFX0NPTkZJR19IIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvT2IyIC9JICIuLiIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJIQVZFX0NPTkZJR19IIiAvRCAiSEFWRV9OQVNNIiAvRCAiTU1YX2Nob29zZV90YWJsZSIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvb3V0OiIuLi9vdXRwdXQvbGFtZS5leGUiDQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL291dDoiLi5cb3V0cHV0XFJlbGVhc2VfTkFTTVxsYW1lLmV4ZSIgL29wdDpOT1dJTjk4DQorIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJsYW1lIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgImxhbWUgLSBXaW4zMiBEZWJ1ZyINCisjIE5hbWUgImxhbWUgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYnJoaXN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxjb25zb2xlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxnZXRfYXVkaW8uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxhbWV0aW1lLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxtYWluLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxwYXJzZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccG9ydGFibGVpby5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdGltZXN0YXR1cy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGJyaGlzdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cY29uc29sZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZ2V0X2F1ZGlvLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxsYW1ldGltZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbWFpbi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccGFyc2UuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHBvcnRhYmxlaW8uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHRpbWVzdGF0dXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvbGFtZV92YzgudmNwcm9qIGIvZnJvbnRlbmQvbGFtZV92YzgudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYmNjODAKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9sYW1lX3ZjOC52Y3Byb2oKQEAgLTAsMCArMSw1NTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LjAwIg0KKwlOYW1lPSJsYW1lX3ZjOCINCisJUHJvamVjdEdVSUQ9IntBNUJDNzNERi1FOEJCLTQ1RDUtOTg0RS1BMjA5MTcwRDQwQkJ9Ig0KKwlSb290TmFtZXNwYWNlPSJsYW1lX3ZjOCINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi87Li4vaW5jbHVkZTsuLi9saWJtcDNsYW1lIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19ERUJVRztXSU4zMjtfV0lOMzI7X0NPTlNPTEU7X1dJTkRPV1M7SEFWRV9NUEdMSUI7SEFWRV9DT05GSUdfSCINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLi4vb3V0cHV0L2xhbWUuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi87Li4vaW5jbHVkZTsuLi9saWJtcDNsYW1lIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO05ERUJVRztXSU4zMjtfV0lOMzI7X0NPTlNPTEU7X1dJTkRPV1M7SEFWRV9NUEdMSUI7SEFWRV9DT05GSUdfSCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLi4vb3V0cHV0L2xhbWUuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWcgR1RLfFdpbjMyIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3x4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2luY2x1ZGU7Li4vbGlibXAzbGFtZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfREVCVUc7V0lOMzI7X1dJTjMyO19DT05TT0xFO19XSU5ET1dTO0hBVkVfTVBHTElCO0hBVkVfQ09ORklHX0giDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii4uL291dHB1dC9sYW1lLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2luY2x1ZGU7Li4vbGlibXAzbGFtZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtOREVCVUc7V0lOMzI7X1dJTjMyO19DT05TT0xFO19XSU5ET1dTO0hBVkVfTVBHTElCO0hBVkVfQ09ORklHX0giDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii4uL291dHB1dC9sYW1lLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWcgR1RLfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi87Li4vaW5jbHVkZTsuLi9saWJtcDNsYW1lIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19ERUJVRztXSU4zMjtfV0lOMzI7X0NPTlNPTEU7X1dJTkRPV1M7SEFWRV9NUEdMSUI7SEFWRV9DT05GSUdfSCINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLi4vb3V0cHV0L2xhbWUuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSINCisJCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cYnJoaXN0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGNvbnNvbGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ2V0X2F1ZGlvLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGxhbWV0aW1lLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXG1haW4uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccGFyc2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccG9ydGFibGVpby5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0aW1lc3RhdHVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxicmhpc3QuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY29uc29sZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnZXRfYXVkaW8uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbGFtZXRpbWUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbWFpbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxwYXJzZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxwb3J0YWJsZWlvLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHRpbWVzdGF0dXMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9mcm9udGVuZC9sYW1ldGltZS5jIGIvZnJvbnRlbmQvbGFtZXRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RlMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvbGFtZXRpbWUuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqCUxhbWUgdGltZSByb3V0aW5lcyBzb3VyY2UgZmlsZQorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IGxhbWV0aW1lLmMsdiAxLjE4LjguMSAyMDA5LzAxLzE4IDE1OjQ0OjI4IHJvYmVydCBFeHAgJCAqLworCisvKgorICogbmFtZTogICAgICAgIEdldENQVVRpbWUgKCB2b2lkICkKKyAqCisgKiBkZXNjcmlwdGlvbjogcmV0dXJucyBDUFUgdGltZSB1c2VkIGJ5IHRoZSBwcm9jZXNzCisgKiBpbnB1dDogICAgICAgbm9uZQorICogb3V0cHV0OiAgICAgIHRpbWUgaW4gc2Vjb25kcworICoga25vd24gYnVnczogIG1heSBub3Qgd29yayBpbiBTTVAgYW5kIFJQQworICogY29uZm9ybWluZzogIEFOU0kgQworICoKKyAqIFRoZXJlIGlzIHNvbWUgb2xkIGRpZmZpY3VsdCB0byByZWFkIGNvZGUgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKiBDYW4gc29tZW9uZSBpbnRlZ3JhdGUgdGhpcyBpbnRvIHRoaXMgZnVuY3Rpb24gKGlmIHVzZWZ1bCk/CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsYW1ldGltZS5oIgorCisjaWYgIWRlZmluZWQoQ0xPQ0tTX1BFUl9TRUMpCisjIHdhcm5pbmcgWW91ciBzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIENMT0NLU19QRVJfU0VDLCBndWVzc2luZyBvbmUuLi4KKyMgZGVmaW5lIENMT0NLU19QRVJfU0VDIDEwMDAwMDAKKyNlbmRpZgorCisKK2RvdWJsZQorR2V0Q1BVVGltZSh2b2lkKQoreworICAgIGNsb2NrX3QgdDsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICB8fCAgZGVmaW5lZChfX0JPUkxBTkRDX18pCisgICAgdCA9IGNsb2NrKCk7CisjZWxzZQorICAgIHQgPSBjbG9jaygpOworI2VuZGlmCisgICAgcmV0dXJuIHQgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworCisvKgorICogbmFtZTogICAgICAgIEdldFJlYWxUaW1lICggdm9pZCApCisgKgorICogZGVzY3JpcHRpb246IHJldHVybnMgcmVhbCAoaHVtYW4pIHRpbWUgZWxhcHNlZCByZWxhdGl2ZSB0byBhIGZpeGVkIHRpbWUgKG1vc3RseSAxOTcwLTAxLTAxIDAwOjAwOjAwKQorICogaW5wdXQ6ICAgICAgIG5vbmUKKyAqIG91dHB1dDogICAgICB0aW1lIGluIHNlY29uZHMKKyAqIGtub3duIGJ1Z3M6ICBiYWQgcHJlY2lzaW9uIHdpdGggdGltZSgpCisgKi8KKworI2lmIGRlZmluZWQoX191bml4X18pICB8fCAgZGVmaW5lZChTVlI0KSAgfHwgIGRlZmluZWQoQlNEKQorCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorCitkb3VibGUKK0dldFJlYWxUaW1lKHZvaWQpCit7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25mb3JtaW5nOiAgU1ZyNCwgQlNEIDQuMyAqLworICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisKKyAgICBpZiAoMCAhPSBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpKQorICAgICAgICBhc3NlcnQoMCk7CisgICAgcmV0dXJuIHQudHZfc2VjICsgMS5lLTYgKiB0LnR2X3VzZWM7Cit9CisKKyNlbGlmIGRlZmluZWQoV0lOMTYpICB8fCAgZGVmaW5lZChXSU4zMikKKworIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3RpbWViLmg+CisKK2RvdWJsZQorR2V0UmVhbFRpbWUodm9pZCkKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbmZvcm1pbmc6ICBXaW4gOTUsIFdpbiBOVCAqLworICAgIHN0cnVjdCB0aW1lYiB0OworCisgICAgZnRpbWUoJnQpOworICAgIHJldHVybiB0LnRpbWUgKyAxLmUtMyAqIHQubWlsbGl0bTsKK30KKworI2Vsc2UKKworZG91YmxlCitHZXRSZWFsVGltZSh2b2lkKQoreyAgICAgICAgICAgICAgICAgICAgICAgLyogY29uZm9ybWluZzogIFNWcjQsIFNWSUQsIFBPU0lYLCBYL09QRU4sIEJTRCA0LjMgKi8gLyogQlVUIE5PVCBHVUFSQU5URUVEIEJZIEFOU0kgKi8KKyAgICB0aW1lX3QgIHQ7CisKKyAgICB0ID0gdGltZShOVUxMKTsKKyAgICByZXR1cm4gKGRvdWJsZSkgdDsKK30KKworI2VuZGlmCisKKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGluY2x1ZGUgPGlvLmg+CisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitpbnQKK2xhbWVfc2V0X3N0cmVhbV9iaW5hcnlfbW9kZShGSUxFICogY29uc3QgZnApCit7CisjaWYgICBkZWZpbmVkIF9fRU1YX18KKyAgICBfZnNldG1vZGUoZnAsICJiIik7CisjZWxpZiBkZWZpbmVkIF9fQk9STEFORENfXworICAgIHNldG1vZGUoX2ZpbGVubyhmcCksIE9fQklOQVJZKTsKKyNlbGlmIGRlZmluZWQgX19DWUdXSU5fXworICAgIHNldG1vZGUoZmlsZW5vKGZwKSwgX09fQklOQVJZKTsKKyNlbGlmIGRlZmluZWQgX1dJTjMyCisgICAgX3NldG1vZGUoX2ZpbGVubyhmcCksIF9PX0JJTkFSWSk7CisjZWxzZQorICAgICh2b2lkKSBmcDsgICAgICAgICAgLyogZG9pbmcgbm90aGluZyBoZXJlLCBzaWxlbmNpbmcgdGhlIGNvbXBpbGVyIG9ubHkuICovCisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworCisjaWYgZGVmaW5lZChfX3Jpc2Nvc19fKQorIyBpbmNsdWRlIDxrZXJuZWwuaD4KKyMgaW5jbHVkZSA8c3lzL3N3aXMuaD4KKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworb2ZmX3QKK2xhbWVfZ2V0X2ZpbGVfc2l6ZShjb25zdCBjaGFyICpjb25zdCBmaWxlbmFtZSkKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgIGlmICgwID09IHN0YXQoZmlsZW5hbWUsICZzYikpCisgICAgICAgIHJldHVybiBzYi5zdF9zaXplOworICAgIHJldHVybiAob2ZmX3QpIC0gMTsKK30KKworLyogRW5kIG9mIGxhbWV0aW1lLmMgKi8KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL2xhbWV0aW1lLmggYi9mcm9udGVuZC9sYW1ldGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDE2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9sYW1ldGltZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKglMYW1lIHRpbWUgcm91dGluZXMgaW5jbHVkZSBmaWxlCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIE1hcmsgVGF5bG9yCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTEFNRV9MQU1FVElNRV9ICisjZGVmaW5lIExBTUVfTEFNRVRJTUVfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAibGFtZS5oIgorCitleHRlcm4gZG91YmxlIEdldENQVVRpbWUodm9pZCk7CitleHRlcm4gZG91YmxlIEdldFJlYWxUaW1lKHZvaWQpOworCitleHRlcm4gaW50IGxhbWVfc2V0X3N0cmVhbV9iaW5hcnlfbW9kZShGSUxFICogY29uc3QgZnApOworZXh0ZXJuIG9mZl90IGxhbWVfZ2V0X2ZpbGVfc2l6ZShjb25zdCBjaGFyICpjb25zdCBmaWxlbmFtZSk7CisKKyNlbmRpZiAvKiBMQU1FX0xBTUVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL21haW4uYyBiL2Zyb250ZW5kL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNlNDAzCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvbWFpbi5jCkBAIC0wLDAgKzEsODY0IEBACisvKgorICogICAgICBDb21tYW5kIGxpbmUgZnJvbnRlbmQgcHJvZ3JhbQorICoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk5IE1hcmsgVGF5bG9yCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBUYWtlaGlybyBUT01JTkFHQQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IG1haW4uYyx2IDEuMTA3LjIuMSAyMDA5LzAxLzE4IDE1OjQ0OjI4IHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpZm5kZWYgSEFWRV9TVFJDSFIKKyMgIGRlZmluZSBzdHJjaHIgaW5kZXgKKyMgIGRlZmluZSBzdHJyY2hyIHJpbmRleAorIyBlbmRpZgorY2hhciAgICpzdHJjaHIoKSwgKnN0cnJjaHIoKTsKKyMgaWZuZGVmIEhBVkVfTUVNQ1BZCisjICBkZWZpbmUgbWVtY3B5KGQsIHMsIG4pIGJjb3B5ICgocyksIChkKSwgKG4pKQorIyAgZGVmaW5lIG1lbW1vdmUoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX3N1bl9fCisvKiB3b3Jhcm91bmQgZm9yIFN1bk9TIDQueCwgaXQgaGFzIFNFRUtfKiBkZWZpbmVkIGhlcmUgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisKKy8qCisgbWFpbi5jIGlzIGV4YW1wbGUgY29kZSBmb3IgaG93IHRvIHVzZSBsaWJtcDNsYW1lLmEuICBUbyB1c2UgdGhpcyBsaWJyYXJ5LAorIHlvdSBvbmx5IG5lZWQgdGhlIGxpYnJhcnkgYW5kIGxhbWUuaC4gIEFsbCBvdGhlciAuaCBmaWxlcyBhcmUgcHJpdmF0ZQorIHRvIHRoZSBsaWJyYXJ5LgorKi8KKyNpbmNsdWRlICJsYW1lLmgiCisKKyNpbmNsdWRlICJjb25zb2xlLmgiCisjaW5jbHVkZSAiYnJoaXN0LmgiCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiZ2V0X2F1ZGlvLmgiCisjaW5jbHVkZSAicG9ydGFibGVpby5oIgorI2luY2x1ZGUgInRpbWVzdGF0dXMuaCIKKworLyogUExMIDE0LzA0LzIwMDAgKi8KKyNpZiBtYWNpbnRvc2gKKyNpbmNsdWRlIDxjb25zb2xlLmg+CisjZW5kaWYKKworI2lmZGVmIFdJVEhfRE1BTExPQworI2luY2x1ZGUgPGRtYWxsb2MuaD4KKyNlbmRpZgorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIG1haW4KKyoKKyogUFVSUE9TRTogIE1QRUctMSwyIExheWVyIElJSSBlbmNvZGVyIHdpdGggR1BTWUNITworKiBwc3ljaG9hY291c3RpYyBtb2RlbC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorcGFyc2VfYXJnc19mcm9tX3N0cmluZyhsYW1lX2dsb2JhbF9mbGFncyAqIGNvbnN0IGdmcCwgY29uc3QgY2hhciAqcCwgY2hhciAqaW5QYXRoLCBjaGFyICpvdXRQYXRoKQoreyAgICAgICAgICAgICAgICAgICAgICAgLyogUXVpY2sgJiB2ZXJ5IERpcnR5ICovCisgICAgY2hhciAgICpxOworICAgIGNoYXIgICAqZjsKKyAgICBjaGFyICAgKnJbMTI4XTsKKyAgICBpbnQgICAgIGMgPSAwOworICAgIGludCAgICAgcmV0OworCisgICAgaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAnXDAnKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGYgPSBxID0gbWFsbG9jKHN0cmxlbihwKSArIDEpOworICAgIHN0cmNweShxLCBwKTsKKworICAgIHJbYysrXSA9ICJsaGFtYSI7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcltjKytdID0gcTsKKyAgICAgICAgd2hpbGUgKCpxICE9ICcgJyAmJiAqcSAhPSAnXDAnKQorICAgICAgICAgICAgcSsrOworICAgICAgICBpZiAoKnEgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqcSsrID0gJ1wwJzsKKyAgICB9CisgICAgcltjXSA9IE5VTEw7CisKKyAgICByZXQgPSBwYXJzZV9hcmdzKGdmcCwgYywgciwgaW5QYXRoLCBvdXRQYXRoLCBOVUxMLCBOVUxMKTsKKyAgICBmcmVlKGYpOworICAgIHJldHVybiByZXQ7Cit9CisKKworCisKKworc3RhdGljIEZJTEUgKgoraW5pdF9maWxlcyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmLCBjaGFyICppblBhdGgsIGNoYXIgKm91dFBhdGgsIGludCAqZW5jX2RlbGF5LCBpbnQgKmVuY19wYWRkaW5nKQoreworICAgIEZJTEUgICAqb3V0ZjsKKyAgICAvKiBNb3N0bHkgaXQgaXMgbm90IHVzZWZ1bCB0byB1c2UgdGhlIHNhbWUgaW5wdXQgYW5kIG91dHB1dCBuYW1lLgorICAgICAgIFRoaXMgdGVzdCBpcyB2ZXJ5IGVhc3kgYW5kIGJ1Z2d5IGFuZCBkb24ndCByZWNvZ25pemUgZGlmZmVyZW50IG5hbWVzCisgICAgICAgYXNzaWduaW5nIHRoZSBzYW1lIGZpbGUKKyAgICAgKi8KKyAgICBpZiAoMCAhPSBzdHJjbXAoIi0iLCBvdXRQYXRoKSAmJiAwID09IHN0cmNtcChpblBhdGgsIG91dFBhdGgpKSB7CisgICAgICAgIGVycm9yX3ByaW50ZigiSW5wdXQgZmlsZSBhbmQgT3V0cHV0IGZpbGUgYXJlIHRoZSBzYW1lLiBBYm9ydC5cbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBvcGVuIHRoZSB3YXYvYWlmZi9yYXcgcGNtIG9yIG1wMyBpbnB1dCBmaWxlLiAgVGhpcyBjYWxsIHdpbGwKKyAgICAgKiBvcGVuIHRoZSBmaWxlLCB0cnkgdG8gcGFyc2UgdGhlIGhlYWRlcnMgYW5kCisgICAgICogc2V0IGdmLnNhbXBsZXJhdGUsIGdmLm51bV9jaGFubmVscywgZ2YubnVtX3NhbXBsZXMuCisgICAgICogaWYgeW91IHdhbnQgdG8gZG8geW91ciBvd24gZmlsZSBpbnB1dCwgc2tpcCB0aGlzIGNhbGwgYW5kIHNldAorICAgICAqIHNhbXBsZXJhdGUsIG51bV9jaGFubmVscyBhbmQgbnVtX3NhbXBsZXMgeW91cnNlbGYuCisgICAgICovCisgICAgaW5pdF9pbmZpbGUoZ2YsIGluUGF0aCwgZW5jX2RlbGF5LCBlbmNfcGFkZGluZyk7CisgICAgaWYgKChvdXRmID0gaW5pdF9vdXRmaWxlKG91dFBhdGgsIGxhbWVfZ2V0X2RlY29kZV9vbmx5KGdmKSkpID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJDYW4ndCBpbml0IG91dGZpbGUgJyVzJ1xuIiwgb3V0UGF0aCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBvdXRmOworfQorCisKKworCisKKworLyogdGhlIHNpbXBsZSBsYW1lIGRlY29kZXIgKi8KKy8qIEFmdGVyIGNhbGxpbmcgbGFtZV9pbml0KCksIGxhbWVfaW5pdF9wYXJhbXMoKSBhbmQKKyAqIGluaXRfaW5maWxlKCksIGNhbGwgdGhpcyByb3V0aW5lIHRvIHJlYWQgdGhlIGlucHV0IE1QMyBmaWxlCisgKiBhbmQgb3V0cHV0IC53YXYgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUgcG9pbnRlciovCisvKiBsYW1lX2RlY29kZXIgd2lsbCBpZ25vcmUgdGhlIGZpcnN0IDUyOCBzYW1wbGVzLCBzaW5jZSB0aGVzZSBzYW1wbGVzCisgKiByZXByZXNlbnQgdGhlIG1wZ2xpYiBkZWxheSAoYW5kIGFyZSBhbGwgMCkuICBza2lwID0gbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAqIHNhbXBsZXMgdG8gc2tpcCwgdG8gKGZvciBleGFtcGxlKSBjb21wZW5zYXRlIGZvciB0aGUgZW5jb2RlciBkZWxheSAqLworCitpbnQKK2xhbWVfZGVjb2RlcihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgRklMRSAqIG91dGYsIGludCBza2lwX3N0YXJ0LCBjaGFyICppblBhdGgsIGNoYXIgKm91dFBhdGgsCisgICAgICAgICAgICAgaW50ICplbmNfZGVsYXksIGludCAqZW5jX3BhZGRpbmcpCit7CisgICAgc2hvcnQgaW50IEJ1ZmZlclsyXVsxMTUyXTsKKyAgICBpbnQgICAgIGlyZWFkOworICAgIGludCAgICAgc2tpcF9lbmQgPSAwOworICAgIGRvdWJsZSAgd2F2c2l6ZTsKKyAgICBpbnQgICAgIGk7CisgICAgdm9pZCAgICAoKldyaXRlRnVuY3Rpb24pIChGSUxFICogZnAsIGNoYXIgKnAsIGludCBuKTsKKyAgICBpbnQgICAgIHRtcF9udW1fY2hhbm5lbHMgPSBsYW1lX2dldF9udW1fY2hhbm5lbHMoZ2ZwKTsKKworCisKKyAgICBpZiAoc2lsZW50IDwgMTApCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJccmlucHV0OiAgJXMlcyglZyBrSHosICVpIGNoYW5uZWwlcywgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGluUGF0aCwgIi0iKSA/IGluUGF0aCA6ICI8c3RkaW4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluUGF0aCkgPiAyNiA/ICJcblx0IiA6ICIgICIsCisgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X2luX3NhbXBsZXJhdGUoZ2ZwKSAvIDEuZTMsCisgICAgICAgICAgICAgICAgICAgICAgIHRtcF9udW1fY2hhbm5lbHMsIHRtcF9udW1fY2hhbm5lbHMgIT0gMSA/ICJzIiA6ICIiKTsKKworICAgIHN3aXRjaCAoaW5wdXRfZm9ybWF0KSB7CisgICAgY2FzZSBzZl9tcDEyMzogLyogRklYTUU6ICEhISAqLworICAgICAgZXJyb3JfcHJpbnRmKCJJbnRlcm5hbCBlcnJvci4gIEFib3J0aW5nLiIpOworICAgICAgZXhpdCgtMSk7CisKKyAgICBjYXNlIHNmX21wMzoKKyAgICAgICAgaWYgKHNraXBfc3RhcnQgPT0gMCkgeworICAgICAgICAgICAgaWYgKCplbmNfZGVsYXkgPiAtMSB8fCAqZW5jX3BhZGRpbmcgPiAtMSkgeworICAgICAgICAgICAgICAgIGlmICgqZW5jX2RlbGF5ID4gLTEpCisgICAgICAgICAgICAgICAgICAgIHNraXBfc3RhcnQgPSAqZW5jX2RlbGF5ICsgNTI4ICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoKmVuY19wYWRkaW5nID4gLTEpCisgICAgICAgICAgICAgICAgICAgIHNraXBfZW5kID0gKmVuY19wYWRkaW5nIC0gKDUyOCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNraXBfc3RhcnQgPSBsYW1lX2dldF9lbmNvZGVyX2RlbGF5KGdmcCkgKyA1MjggKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogdXNlciBzcGVjaWZpZWQgYSB2YWx1ZSBvZiBza2lwLiBqdXN0IGFkZCBmb3IgZGVjb2RlciAqLworICAgICAgICAgICAgc2tpcF9zdGFydCArPSA1MjggKyAxOyAvKiBtcDMgZGVjb2RlciBoYXMgYSA1Mjggc2FtcGxlIGRlbGF5LCBwbHVzIHVzZXIgc3VwcGxpZWQgInNraXAiICovCisgICAgICAgIH0KKworICAgICAgICBpZiAoc2lsZW50IDwgMTApCisgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiTVBFRy0ldSVzIExheWVyICVzIiwgMiAtIGxhbWVfZ2V0X3ZlcnNpb24oZ2ZwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlKGdmcCkgPCAxNjAwMCA/ICIuNSIgOiAiIiwgIklJSSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNmX21wMjoKKyAgICAgICAgc2tpcF9zdGFydCArPSAyNDAgKyAxOworICAgICAgICBpZiAoc2lsZW50IDwgMTApCisgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiTVBFRy0ldSVzIExheWVyICVzIiwgMiAtIGxhbWVfZ2V0X3ZlcnNpb24oZ2ZwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlKGdmcCkgPCAxNjAwMCA/ICIuNSIgOiAiIiwgIklJIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ZfbXAxOgorICAgICAgICBza2lwX3N0YXJ0ICs9IDI0MCArIDE7CisgICAgICAgIGlmIChzaWxlbnQgPCAxMCkKKyAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJNUEVHLSV1JXMgTGF5ZXIgJXMiLCAyIC0gbGFtZV9nZXRfdmVyc2lvbihnZnApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoZ2ZwKSA8IDE2MDAwID8gIi41IiA6ICIiLCAiSSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNmX3JhdzoKKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKQorICAgICAgICAgICAgY29uc29sZV9wcmludGYoInJhdyBQQ00gZGF0YSIpOworICAgICAgICBtcDNpbnB1dF9kYXRhLm5zYW1wID0gbGFtZV9nZXRfbnVtX3NhbXBsZXMoZ2ZwKTsKKyAgICAgICAgbXAzaW5wdXRfZGF0YS5mcmFtZXNpemUgPSAxMTUyOworICAgICAgICBza2lwX3N0YXJ0ID0gMDsgLyogb3RoZXIgZm9ybWF0cyBoYXZlIG5vIGRlbGF5ICovIC8qIGlzICs9IDAgbm90IGJldHRlciA/Pz8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzZl93YXZlOgorICAgICAgICBpZiAoc2lsZW50IDwgMTApCisgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigiTWljcm9zb2Z0IFdBVkUiKTsKKyAgICAgICAgbXAzaW5wdXRfZGF0YS5uc2FtcCA9IGxhbWVfZ2V0X251bV9zYW1wbGVzKGdmcCk7CisgICAgICAgIG1wM2lucHV0X2RhdGEuZnJhbWVzaXplID0gMTE1MjsKKyAgICAgICAgc2tpcF9zdGFydCA9IDA7IC8qIG90aGVyIGZvcm1hdHMgaGF2ZSBubyBkZWxheSAqLyAvKiBpcyArPSAwIG5vdCBiZXR0ZXIgPz8/ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ZfYWlmZjoKKyAgICAgICAgaWYgKHNpbGVudCA8IDEwKQorICAgICAgICAgICAgY29uc29sZV9wcmludGYoIlNHSS9BcHBsZSBBSUZGIik7CisgICAgICAgIG1wM2lucHV0X2RhdGEubnNhbXAgPSBsYW1lX2dldF9udW1fc2FtcGxlcyhnZnApOworICAgICAgICBtcDNpbnB1dF9kYXRhLmZyYW1lc2l6ZSA9IDExNTI7CisgICAgICAgIHNraXBfc3RhcnQgPSAwOyAvKiBvdGhlciBmb3JtYXRzIGhhdmUgbm8gZGVsYXkgKi8gLyogaXMgKz0gMCBub3QgYmV0dGVyID8/PyAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoc2lsZW50IDwgMTApCisgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigidW5rbm93biIpOworICAgICAgICBtcDNpbnB1dF9kYXRhLm5zYW1wID0gbGFtZV9nZXRfbnVtX3NhbXBsZXMoZ2ZwKTsKKyAgICAgICAgbXAzaW5wdXRfZGF0YS5mcmFtZXNpemUgPSAxMTUyOworICAgICAgICBza2lwX3N0YXJ0ID0gMDsgLyogb3RoZXIgZm9ybWF0cyBoYXZlIG5vIGRlbGF5ICovIC8qIGlzICs9IDAgbm90IGJldHRlciA/Pz8gKi8KKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgY29uc29sZV9wcmludGYoIilcbm91dHB1dDogJXMlcygxNiBiaXQsIE1pY3Jvc29mdCBXQVZFKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKG91dFBhdGgsICItIikgPyBvdXRQYXRoIDogIjxzdGRvdXQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKG91dFBhdGgpID4gNDUgPyAiXG5cdCIgOiAiICAiKTsKKworICAgICAgICBpZiAoc2tpcF9zdGFydCA+IDApCisgICAgICAgICAgICBjb25zb2xlX3ByaW50Zigic2tpcHBpbmcgaW5pdGlhbCAlaSBzYW1wbGVzIChlbmNvZGVyK2RlY29kZXIgZGVsYXkpXG4iLCBza2lwX3N0YXJ0KTsKKyAgICAgICAgaWYgKHNraXBfZW5kID4gMCkKKyAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJza2lwcGluZyBmaW5hbCAlaSBzYW1wbGVzIChlbmNvZGVyIHBhZGRpbmctZGVjb2RlciBkZWxheSlcbiIsIHNraXBfZW5kKTsKKyAgICB9CisKKyAgICBpZiAoMCA9PSBkaXNhYmxlX3dhdl9oZWFkZXIpCisgICAgICAgIFdyaXRlV2F2ZUhlYWRlcihvdXRmLCAweDdGRkZGRkZGLCBsYW1lX2dldF9pbl9zYW1wbGVyYXRlKGdmcCksIHRtcF9udW1fY2hhbm5lbHMsIDE2KTsKKyAgICAvKiB1bmtub3duIHNpemUsIHNvIHdyaXRlIG1heGltdW0gMzIgYml0IHNpZ25lZCB2YWx1ZSAqLworCisgICAgd2F2c2l6ZSA9IC0oc2tpcF9zdGFydCArIHNraXBfZW5kKTsKKyAgICBXcml0ZUZ1bmN0aW9uID0gc3dhcGJ5dGVzID8gV3JpdGVCeXRlc1N3YXBwZWQgOiBXcml0ZUJ5dGVzOworICAgIG1wM2lucHV0X2RhdGEudG90YWxmcmFtZXMgPSBtcDNpbnB1dF9kYXRhLm5zYW1wIC8gbXAzaW5wdXRfZGF0YS5mcmFtZXNpemU7CisKKyAgICBhc3NlcnQodG1wX251bV9jaGFubmVscyA+PSAxICYmIHRtcF9udW1fY2hhbm5lbHMgPD0gMik7CisKKyAgICBkbyB7CisgICAgICAgIGlyZWFkID0gZ2V0X2F1ZGlvMTYoZ2ZwLCBCdWZmZXIpOyAvKiByZWFkIGluICdpcmVhZCcgc2FtcGxlcyAqLworICAgICAgICBpZiAoaXJlYWQgPj0gMCkgeworICAgICAgICAgICAgbXAzaW5wdXRfZGF0YS5mcmFtZW51bSArPSBpcmVhZCAvIG1wM2lucHV0X2RhdGEuZnJhbWVzaXplOworICAgICAgICAgICAgd2F2c2l6ZSArPSBpcmVhZDsKKworICAgICAgICAgICAgaWYgKHNpbGVudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgZGVjb2Rlcl9wcm9ncmVzcygmbXAzaW5wdXRfZGF0YSk7CisgICAgICAgICAgICAgICAgY29uc29sZV9mbHVzaCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBza2lwX3N0YXJ0IC09IChpID0gc2tpcF9zdGFydCA8IGlyZWFkID8gc2tpcF9zdGFydCA6IGlyZWFkKTsgLyogJ2knIHNhbXBsZXMgYXJlIHRvIHNraXAgaW4gdGhpcyBmcmFtZSAqLworCisgICAgICAgICAgICBpZiAoc2tpcF9lbmQgPiAxMTUyICYmIG1wM2lucHV0X2RhdGEuZnJhbWVudW0gKyAyID4gbXAzaW5wdXRfZGF0YS50b3RhbGZyYW1lcykgeworICAgICAgICAgICAgICAgIGlyZWFkIC09IChza2lwX2VuZCAtIDExNTIpOworICAgICAgICAgICAgICAgIHNraXBfZW5kID0gMTE1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1wM2lucHV0X2RhdGEuZnJhbWVudW0gPT0gbXAzaW5wdXRfZGF0YS50b3RhbGZyYW1lcyAmJiBpcmVhZCAhPSAwKQorICAgICAgICAgICAgICAgIGlyZWFkIC09IHNraXBfZW5kOworCisgICAgICAgICAgICBmb3IgKDsgaSA8IGlyZWFkOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZV93YXZfaGVhZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlRnVuY3Rpb24ob3V0ZiwgKGNoYXIgKikgJkJ1ZmZlclswXVtpXSwgc2l6ZW9mKHNob3J0KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBfbnVtX2NoYW5uZWxzID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZUZ1bmN0aW9uKG91dGYsIChjaGFyICopICZCdWZmZXJbMV1baV0sIHNpemVvZihzaG9ydCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGUxNkJpdHNMb3dIaWdoKG91dGYsIEJ1ZmZlclswXVtpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBfbnVtX2NoYW5uZWxzID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZTE2Qml0c0xvd0hpZ2gob3V0ZiwgQnVmZmVyWzFdW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmx1c2hfd3JpdGUgPT0gMSkgeworICAgICAgICAgICAgICAgIGZmbHVzaChvdXRmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGlyZWFkID4gMCk7CisKKyAgICBpID0gKDE2IC8gOCkgKiB0bXBfbnVtX2NoYW5uZWxzOworICAgIGFzc2VydChpID4gMCk7CisgICAgaWYgKHdhdnNpemUgPD0gMCkgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApCisgICAgICAgICAgICBlcnJvcl9wcmludGYoIldBVkUgZmlsZSBjb250YWlucyAwIFBDTSBzYW1wbGVzXG4iKTsKKyAgICAgICAgd2F2c2l6ZSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHdhdnNpemUgPiAweEZGRkZGRkQwIC8gaSkgeworICAgICAgICBpZiAoc2lsZW50IDwgMTApCisgICAgICAgICAgICBlcnJvcl9wcmludGYoIlZlcnkgaHVnZSBXQVZFIGZpbGUsIGNhbid0IHNldCBmaWxlc2l6ZSBhY2NvcmRpbmdseVxuIik7CisgICAgICAgIHdhdnNpemUgPSAweEZGRkZGRkQwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgd2F2c2l6ZSAqPSBpOworICAgIH0KKworICAgIC8qIGlmIG91dGYgaXMgc2Vla2FibGUsIHJld2luZCBhbmQgYWRqdXN0IGxlbmd0aCAqLworICAgIGlmICghZGlzYWJsZV93YXZfaGVhZGVyICYmIHN0cmNtcCgiLSIsIG91dFBhdGgpCisJJiYgIWZzZWVrKG91dGYsIDBsLCBTRUVLX1NFVCkpCisJV3JpdGVXYXZlSGVhZGVyKG91dGYsIChpbnQpIHdhdnNpemUsIGxhbWVfZ2V0X2luX3NhbXBsZXJhdGUoZ2ZwKSwKKwkJCXRtcF9udW1fY2hhbm5lbHMsIDE2KTsKKyAgICBmY2xvc2Uob3V0Zik7CisKKyAgICBpZiAoc2lsZW50IDw9IDApCisgICAgICAgIGRlY29kZXJfcHJvZ3Jlc3NfZmluaXNoKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZAorcHJpbnRfbGFtZV90YWdfbGVhZGluZ19pbmZvKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2YpCit7CisgICAgaWYgKGxhbWVfZ2V0X2JXcml0ZVZiclRhZyhnZikpCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJXcml0aW5nIExBTUUgVGFnLi4uIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF90cmFpbGluZ19pbmZvKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2YpCit7CisgICAgaWYgKGxhbWVfZ2V0X2JXcml0ZVZiclRhZyhnZikpCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJkb25lXG4iKTsKKworICAgIGlmIChsYW1lX2dldF9maW5kUmVwbGF5R2FpbihnZikpIHsKKyAgICAgICAgaW50ICAgICBSYWRpb0dhaW4gPSBsYW1lX2dldF9SYWRpb0dhaW4oZ2YpOworICAgICAgICBjb25zb2xlX3ByaW50ZigiUmVwbGF5R2FpbjogJXMlLjFmZEJcbiIsIFJhZGlvR2FpbiA+IDAgPyAiKyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkgUmFkaW9HYWluKSAvIDEwLjApOworICAgICAgICBpZiAoUmFkaW9HYWluID4gMHgxRkUgfHwgUmFkaW9HYWluIDwgLTB4MUZFKQorICAgICAgICAgICAgZXJyb3JfcHJpbnRmCisgICAgICAgICAgICAgICAgICAgICgiV0FSTklORzogUmVwbGF5R2FpbiBleGNlZWRzIHRoZSAtNTFkQiB0byArNTFkQiByYW5nZS4gU3VjaCBhIHJlc3VsdCBpcyB0b29cbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIGhpZ2ggdG8gYmUgc3RvcmVkIGluIHRoZSBoZWFkZXIuXG4iKTsKKyAgICB9CisKKyAgICAvKiBpZiAodGhlIHVzZXIgcmVxdWVzdGVkIHByaW50aW5nIGluZm8gYWJvdXQgY2xpcHBpbmcpIGFuZCAoZGVjb2RpbmcKKyAgICBvbiB0aGUgZmx5IGhhcyBhY3R1YWxseSBiZWVuIHBlcmZvcm1lZCkgKi8KKyAgICBpZiAocHJpbnRfY2xpcHBpbmdfaW5mbyAmJiBsYW1lX2dldF9kZWNvZGVfb25fdGhlX2ZseShnZikpIHsKKyAgICAgICAgZmxvYXQgICBub2NsaXBHYWluQ2hhbmdlID0gKGZsb2F0KSBsYW1lX2dldF9ub2NsaXBHYWluQ2hhbmdlKGdmKSAvIDEwLjBmOworICAgICAgICBmbG9hdCAgIG5vY2xpcFNjYWxlID0gbGFtZV9nZXRfbm9jbGlwU2NhbGUoZ2YpOworCisgICAgICAgIGlmIChub2NsaXBHYWluQ2hhbmdlID4gMC4wKSB7IC8qIGNsaXBwaW5nIG9jY3VycyAqLworICAgICAgICAgICAgY29uc29sZV9wcmludGYKKyAgICAgICAgICAgICAgICAgICAgKCJXQVJOSU5HOiBjbGlwcGluZyBvY2N1cnMgYXQgdGhlIGN1cnJlbnQgZ2Fpbi4gU2V0IHlvdXIgZGVjb2RlciB0byBkZWNyZWFzZVxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgdGhlICBnYWluICBieSAgYXQgbGVhc3QgJS4xZmRCIG9yIGVuY29kZSBhZ2FpbiAiLCBub2NsaXBHYWluQ2hhbmdlKTsKKworICAgICAgICAgICAgLyogYWR2aWNlIHRoZSB1c2VyIG9uIHRoZSBzY2FsZSBmYWN0b3IgKi8KKyAgICAgICAgICAgIGlmIChub2NsaXBTY2FsZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigidXNpbmcgIC0tc2NhbGUgJS4yZlxuIiwgbm9jbGlwU2NhbGUpOworICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIgICAgICAgICBvciBsZXNzICh0aGUgdmFsdWUgdW5kZXIgLS1zY2FsZSBpcyBhcHByb3hpbWF0ZSkuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHRoZSB1c2VyIHNwZWNpZmllZCBoaXMgb3duIHNjYWxlIGZhY3Rvci4gV2UgY291bGQgc3VnZ2VzdAorICAgICAgICAgICAgICAgICogdGhlIHNjYWxlIGZhY3RvciBvZiAoMzI3NjcuMC9nZnAtPlBlYWtTYW1wbGUpKihnZnAtPnNjYWxlKQorICAgICAgICAgICAgICAgICogYnV0IGl0J3MgdXN1YWxseSB2ZXJ5IGluYWNjdXJhdGUuIFNvIHdlJ2QgcmF0aGVyIGFkdmljZSBoaW0gdG8KKyAgICAgICAgICAgICAgICAqIGRpc2FibGUgc2NhbGluZyBmaXJzdCBhbmQgc2VlIG91ciBzdWdnZXN0aW9uIG9uIHRoZSBzY2FsZSBmYWN0b3IgdGhlbi4gKi8KKyAgICAgICAgICAgICAgICBjb25zb2xlX3ByaW50ZigidXNpbmcgLS1zY2FsZSA8YXJnPlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIChGb3IgICBhICAgc3VnZ2VzdGlvbiAgb24gIHRoZSAgb3B0aW1hbCAgdmFsdWUgIG9mICA8YXJnPiAgZW5jb2RlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgd2l0aCAgLS1zY2FsZSAxICBmaXJzdClcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7ICAgICAgICAgIC8qIG5vIGNsaXBwaW5nICovCisgICAgICAgICAgICBpZiAobm9jbGlwR2FpbkNoYW5nZSA+IC0wLjEpCisgICAgICAgICAgICAgICAgY29uc29sZV9wcmludGYKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXG5UaGUgd2F2ZWZvcm0gZG9lcyBub3QgY2xpcCBhbmQgaXMgbGVzcyB0aGFuIDAuMWRCIGF3YXkgZnJvbSBmdWxsIHNjYWxlLlxuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29uc29sZV9wcmludGYKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXG5UaGUgd2F2ZWZvcm0gZG9lcyBub3QgY2xpcCBhbmQgaXMgYXQgbGVhc3QgJS4xZmRCIGF3YXkgZnJvbSBmdWxsIHNjYWxlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtbm9jbGlwR2FpbkNoYW5nZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisKKworc3RhdGljIGludAord3JpdGVfeGluZ19mcmFtZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmLCBGSUxFICogb3V0ZikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG1wM2J1ZmZlcltMQU1FX01BWE1QM0JVRkZFUl07CisgICAgc2l6ZV90ICBpbXAzLCBvd3JpdGU7CisgICAgCisgICAgaW1wMyA9IGxhbWVfZ2V0X2xhbWV0YWdfZnJhbWUoZ2YsIG1wM2J1ZmZlciwgc2l6ZW9mKG1wM2J1ZmZlcikpOworICAgIGlmIChpbXAzID4gc2l6ZW9mKG1wM2J1ZmZlcikpIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvciB3cml0aW5nIExBTUUtdGFnIGZyYW1lOiBidWZmZXIgdG9vIHNtYWxsOiBidWZmZXIgc2l6ZT0lZCAgZnJhbWUgc2l6ZT0lZFxuIgorICAgICAgICAgICAgICAgICAgICAsIHNpemVvZihtcDNidWZmZXIpCisgICAgICAgICAgICAgICAgICAgICwgaW1wMworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpbXAzIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG93cml0ZSA9IChpbnQpIGZ3cml0ZShtcDNidWZmZXIsIDEsIGltcDMsIG91dGYpOworICAgIGlmIChvd3JpdGUgIT0gaW1wMykgeworICAgICAgICBlcnJvcl9wcmludGYoIkVycm9yIHdyaXRpbmcgTEFNRS10YWcgXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZmx1c2hfd3JpdGUgPT0gMSkgeworICAgICAgICBmZmx1c2gob3V0Zik7CisgICAgfQorICAgIHJldHVybiBpbXAzOworfQorCisKKworc3RhdGljIGludAorbGFtZV9lbmNvZGVyKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2YsIEZJTEUgKiBvdXRmLCBpbnQgbm9nYXAsIGNoYXIgKmluUGF0aCwgY2hhciAqb3V0UGF0aCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG1wM2J1ZmZlcltMQU1FX01BWE1QM0JVRkZFUl07CisgICAgaW50ICAgICBCdWZmZXJbMl1bMTE1Ml07CisgICAgaW50ICAgICBpcmVhZCwgaW1wMywgb3dyaXRlLCBpZDN2Ml9zaXplOworCisgICAgZW5jb2Rlcl9wcm9ncmVzc19iZWdpbihnZiwgaW5QYXRoLCBvdXRQYXRoKTsKKworICAgIGltcDMgPSBsYW1lX2dldF9pZDN2Ml90YWcoZ2YsIG1wM2J1ZmZlciwgc2l6ZW9mKG1wM2J1ZmZlcikpOworICAgIGlmICgoc2l6ZV90KWltcDMgPiBzaXplb2YobXAzYnVmZmVyKSkgeworICAgICAgICBlbmNvZGVyX3Byb2dyZXNzX2VuZChnZik7CisgICAgICAgIGVycm9yX3ByaW50ZigiRXJyb3Igd3JpdGluZyBJRDN2MiB0YWc6IGJ1ZmZlciB0b28gc21hbGw6IGJ1ZmZlciBzaXplPSVkICBJRDN2MiBzaXplPSVkXG4iCisgICAgICAgICAgICAgICAgLCBzaXplb2YobXAzYnVmZmVyKQorICAgICAgICAgICAgICAgICwgaW1wMworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgb3dyaXRlID0gKGludCkgZndyaXRlKG1wM2J1ZmZlciwgMSwgaW1wMywgb3V0Zik7CisgICAgaWYgKG93cml0ZSAhPSBpbXAzKSB7CisgICAgICAgIGVuY29kZXJfcHJvZ3Jlc3NfZW5kKGdmKTsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvciB3cml0aW5nIElEM3YyIHRhZyBcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGZsdXNoX3dyaXRlID09IDEpIHsKKyAgICAgICAgZmZsdXNoKG91dGYpOworICAgIH0gICAgCisgICAgaWQzdjJfc2l6ZSA9IGltcDM7CisgICAgCisgICAgLyogZW5jb2RlIHVudGlsIHdlIGhpdCBlb2YgKi8KKyAgICBkbyB7CisgICAgICAgIC8qIHJlYWQgaW4gJ2lyZWFkJyBzYW1wbGVzICovCisgICAgICAgIGlyZWFkID0gZ2V0X2F1ZGlvKGdmLCBCdWZmZXIpOworCisgICAgICAgIGlmIChpcmVhZCA+PSAwKSB7CisgICAgICAgICAgICBlbmNvZGVyX3Byb2dyZXNzKGdmKTsKKworICAgICAgICAgICAgLyogZW5jb2RlICovCisgICAgICAgICAgICBpbXAzID0gbGFtZV9lbmNvZGVfYnVmZmVyX2ludChnZiwgQnVmZmVyWzBdLCBCdWZmZXJbMV0sIGlyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAzYnVmZmVyLCBzaXplb2YobXAzYnVmZmVyKSk7CisKKyAgICAgICAgICAgIC8qIHdhcyBvdXIgb3V0cHV0IGJ1ZmZlciBiaWcgZW5vdWdoPyAqLworICAgICAgICAgICAgaWYgKGltcDMgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGltcDMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigibXAzIGJ1ZmZlciBpcyBub3QgYmlnIGVub3VnaC4uLiBcbiIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJtcDMgaW50ZXJuYWwgZXJyb3I6ICBlcnJvciBjb2RlPSVpXG4iLCBpbXAzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG93cml0ZSA9IChpbnQpIGZ3cml0ZShtcDNidWZmZXIsIDEsIGltcDMsIG91dGYpOworICAgICAgICAgICAgaWYgKG93cml0ZSAhPSBpbXAzKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvciB3cml0aW5nIG1wMyBvdXRwdXQgXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmx1c2hfd3JpdGUgPT0gMSkgeworICAgICAgICAgICAgZmZsdXNoKG91dGYpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoaXJlYWQgPiAwKTsKKworICAgIGlmIChub2dhcCkKKyAgICAgICAgaW1wMyA9IGxhbWVfZW5jb2RlX2ZsdXNoX25vZ2FwKGdmLCBtcDNidWZmZXIsIHNpemVvZihtcDNidWZmZXIpKTsgLyogbWF5IHJldHVybiBvbmUgbW9yZSBtcDMgZnJhbWUgKi8KKyAgICBlbHNlCisgICAgICAgIGltcDMgPSBsYW1lX2VuY29kZV9mbHVzaChnZiwgbXAzYnVmZmVyLCBzaXplb2YobXAzYnVmZmVyKSk7IC8qIG1heSByZXR1cm4gb25lIG1vcmUgbXAzIGZyYW1lICovCisKKyAgICBpZiAoaW1wMyA8IDApIHsKKyAgICAgICAgaWYgKGltcDMgPT0gLTEpCisgICAgICAgICAgICBlcnJvcl9wcmludGYoIm1wMyBidWZmZXIgaXMgbm90IGJpZyBlbm91Z2guLi4gXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJtcDMgaW50ZXJuYWwgZXJyb3I6ICBlcnJvciBjb2RlPSVpXG4iLCBpbXAzKTsKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICB9CisKKyAgICBlbmNvZGVyX3Byb2dyZXNzX2VuZChnZik7CisgICAgCisgICAgb3dyaXRlID0gKGludCkgZndyaXRlKG1wM2J1ZmZlciwgMSwgaW1wMywgb3V0Zik7CisgICAgaWYgKG93cml0ZSAhPSBpbXAzKSB7CisgICAgICAgIGVycm9yX3ByaW50ZigiRXJyb3Igd3JpdGluZyBtcDMgb3V0cHV0IFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoZmx1c2hfd3JpdGUgPT0gMSkgeworICAgICAgICBmZmx1c2gob3V0Zik7CisgICAgfQorCisgICAgCisgICAgaW1wMyA9IGxhbWVfZ2V0X2lkM3YxX3RhZyhnZiwgbXAzYnVmZmVyLCBzaXplb2YobXAzYnVmZmVyKSk7CisgICAgaWYgKChzaXplX3QpaW1wMyA+IHNpemVvZihtcDNidWZmZXIpKSB7CisgICAgICAgIGVycm9yX3ByaW50ZigiRXJyb3Igd3JpdGluZyBJRDN2MSB0YWc6IGJ1ZmZlciB0b28gc21hbGw6IGJ1ZmZlciBzaXplPSVkICBJRDN2MSBzaXplPSVkXG4iCisgICAgICAgICAgICAgICAgLCBzaXplb2YobXAzYnVmZmVyKQorICAgICAgICAgICAgICAgICwgaW1wMworICAgICAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGltcDMgPiAwKSB7CisgICAgICAgICAgICBvd3JpdGUgPSAoaW50KSBmd3JpdGUobXAzYnVmZmVyLCAxLCBpbXAzLCBvdXRmKTsKKyAgICAgICAgICAgIGlmIChvd3JpdGUgIT0gaW1wMykgeworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiRXJyb3Igd3JpdGluZyBJRDN2MSB0YWcgXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbHVzaF93cml0ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgZmZsdXNoKG91dGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChzaWxlbnQgPD0gMCkgeworICAgICAgICBwcmludF9sYW1lX3RhZ19sZWFkaW5nX2luZm8oZ2YpOworICAgIH0KKyAgICBpZiAoZnNlZWsob3V0ZiwgaWQzdjJfc2l6ZSwgU0VFS19TRVQpICE9IDApIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJmYXRhbCBlcnJvcjogY2FuJ3QgdXBkYXRlIExBTUUtdGFnIGZyYW1lIVxuIik7ICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHdyaXRlX3hpbmdfZnJhbWUoZ2YsIG91dGYpOworICAgIH0KKworICAgIGlmIChzaWxlbnQgPD0gMCkgeworICAgICAgICBwcmludF90cmFpbGluZ19pbmZvKGdmKTsKKyAgICB9ICAgIAorICAgIHJldHVybiAwOworfQorCisKKworCisKKworc3RhdGljIHZvaWQKK2JyaGlzdF9pbml0X3BhY2thZ2UobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZikKK3sKKyNpZmRlZiBCUkhJU1QKKyAgICBpZiAoYnJoaXN0KSB7CisgICAgICAgIGlmIChicmhpc3RfaW5pdChnZiwgbGFtZV9nZXRfVkJSX21pbl9iaXRyYXRlX2ticHMoZ2YpLCBsYW1lX2dldF9WQlJfbWF4X2JpdHJhdGVfa2JwcyhnZikpKSB7CisgICAgICAgICAgICAvKiBmYWlsIHRvIGluaXRpYWxpemUgKi8KKyAgICAgICAgICAgIGJyaGlzdCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJyaGlzdF9pbml0KGdmLCAxMjgsIDEyOCk7IC8qIERpcnR5IGhhY2sgKi8KKyAgICB9CisjZW5kaWYKK30KKworCisKK3N0YXRpYworICAgIHZvaWQKK3BhcnNlX25vZ2FwX2ZpbGVuYW1lcyhpbnQgbm9nYXBvdXQsIGNoYXIgKmluUGF0aCwgY2hhciAqb3V0UGF0aCwgY2hhciAqb3V0ZGlyKQoreworCisgICAgY2hhciAgICpzbGFzaGVyOworICAgIHNpemVfdCAgbjsKKworICAgIHN0cmNweShvdXRQYXRoLCBvdXRkaXIpOworICAgIGlmICghbm9nYXBvdXQpIHsKKyAgICAgICAgc3RybmNweShvdXRQYXRoLCBpblBhdGgsIFBBVEhfTUFYICsgMSAtIDQpOworICAgICAgICBuID0gc3RybGVuKG91dFBhdGgpOworICAgICAgICAvKiBudWtlIG9sZCBleHRlbnNpb24sIGlmIG9uZSAgKi8KKyAgICAgICAgaWYgKG91dFBhdGhbbiAtIDNdID09ICd3JworICAgICAgICAgICAgJiYgb3V0UGF0aFtuIC0gMl0gPT0gJ2EnICYmIG91dFBhdGhbbiAtIDFdID09ICd2JyAmJiBvdXRQYXRoW24gLSA0XSA9PSAnLicpIHsKKyAgICAgICAgICAgIG91dFBhdGhbbiAtIDNdID0gJ20nOworICAgICAgICAgICAgb3V0UGF0aFtuIC0gMl0gPSAncCc7CisgICAgICAgICAgICBvdXRQYXRoW24gLSAxXSA9ICczJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG91dFBhdGhbbiArIDBdID0gJy4nOworICAgICAgICAgICAgb3V0UGF0aFtuICsgMV0gPSAnbSc7CisgICAgICAgICAgICBvdXRQYXRoW24gKyAyXSA9ICdwJzsKKyAgICAgICAgICAgIG91dFBhdGhbbiArIDNdID0gJzMnOworICAgICAgICAgICAgb3V0UGF0aFtuICsgNF0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzbGFzaGVyID0gaW5QYXRoOworICAgICAgICBzbGFzaGVyICs9IFBBVEhfTUFYICsgMSAtIDQ7CisKKyAgICAgICAgLyogYmFja3NlZWsgdG8gbGFzdCBkaXIgZGVsZW1pdGVyICovCisgICAgICAgIHdoaWxlICgqc2xhc2hlciAhPSAnLycgJiYgKnNsYXNoZXIgIT0gJ1xcJyAmJiBzbGFzaGVyICE9IGluUGF0aCAmJiAqc2xhc2hlciAhPSAnOicpIHsKKyAgICAgICAgICAgIHNsYXNoZXItLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNraXAgb25lIGZvd2FyZCBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKHNsYXNoZXIgIT0gaW5QYXRoCisgICAgICAgICAgICAmJiAob3V0UGF0aFtzdHJsZW4ob3V0UGF0aCkgLSAxXSA9PSAnLycKKyAgICAgICAgICAgICAgICB8fCBvdXRQYXRoW3N0cmxlbihvdXRQYXRoKSAtIDFdID09ICdcXCcgfHwgb3V0UGF0aFtzdHJsZW4ob3V0UGF0aCkgLSAxXSA9PSAnOicpKQorICAgICAgICAgICAgc2xhc2hlcisrOworICAgICAgICBlbHNlIGlmIChzbGFzaGVyID09IGluUGF0aAorICAgICAgICAgICAgICAgICAmJiAob3V0UGF0aFtzdHJsZW4ob3V0UGF0aCkgLSAxXSAhPSAnLycKKyAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICBvdXRQYXRoW3N0cmxlbihvdXRQYXRoKSAtIDFdICE9ICdcXCcgJiYgb3V0UGF0aFtzdHJsZW4ob3V0UGF0aCkgLSAxXSAhPSAnOicpKQorI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgc3RyY2F0KG91dFBhdGgsICJcXCIpOworI2VsaWYgX19PUzJfXworICAgICAgICAgICAgc3RyY2F0KG91dFBhdGgsICJcXCIpOworI2Vsc2UKKyAgICAgICAgICAgIHN0cmNhdChvdXRQYXRoLCAiLyIpOworI2VuZGlmCisKKyAgICAgICAgc3RybmNhdChvdXRQYXRoLCBzbGFzaGVyLCBQQVRIX01BWCArIDEgLSA0KTsKKyAgICAgICAgbiA9IHN0cmxlbihvdXRQYXRoKTsKKyAgICAgICAgLyogbnVrZSBvbGQgZXh0ZW5zaW9uICAqLworICAgICAgICBpZiAob3V0UGF0aFtuIC0gM10gPT0gJ3cnCisgICAgICAgICAgICAmJiBvdXRQYXRoW24gLSAyXSA9PSAnYScgJiYgb3V0UGF0aFtuIC0gMV0gPT0gJ3YnICYmIG91dFBhdGhbbiAtIDRdID09ICcuJykgeworICAgICAgICAgICAgb3V0UGF0aFtuIC0gM10gPSAnbSc7CisgICAgICAgICAgICBvdXRQYXRoW24gLSAyXSA9ICdwJzsKKyAgICAgICAgICAgIG91dFBhdGhbbiAtIDFdID0gJzMnOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb3V0UGF0aFtuICsgMF0gPSAnLic7CisgICAgICAgICAgICBvdXRQYXRoW24gKyAxXSA9ICdtJzsKKyAgICAgICAgICAgIG91dFBhdGhbbiArIDJdID0gJ3AnOworICAgICAgICAgICAgb3V0UGF0aFtuICsgM10gPSAnMyc7CisgICAgICAgICAgICBvdXRQYXRoW24gKyA0XSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgTWVzc2FnZSBPdXRwdXQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50ICAgICByZXQ7CisgICAgbGFtZV9nbG9iYWxfZmxhZ3MgKmdmOworICAgIGNoYXIgICAgb3V0UGF0aFtQQVRIX01BWCArIDFdOworICAgIGNoYXIgICAgbm9nYXBkaXJbUEFUSF9NQVggKyAxXTsKKyAgICBjaGFyICAgIGluUGF0aFtQQVRIX01BWCArIDFdOworCisgICAgLyogYWRkIHZhcmlhYmxlcyBmb3IgZW5jb2RlciBkZWxheS9wYWRkaW5nICovCisgICAgaW50ICAgICBlbmNfZGVsYXkgPSAtMTsKKyAgICBpbnQgICAgIGVuY19wYWRkaW5nID0gLTE7CisKKyAgICAvKiBzdXBwb3J0IGZvciAibm9nYXAiIGVuY29kaW5nIG9mIHVwIHRvIDIwMCAud2F2IGZpbGVzICovCisjZGVmaW5lIE1BWF9OT0dBUCAyMDAKKyAgICBpbnQgICAgIG5vZ2Fwb3V0ID0gMDsKKyAgICBpbnQgICAgIG1heF9ub2dhcCA9IE1BWF9OT0dBUDsKKyAgICBjaGFyICAgIG5vZ2FwX2luUGF0aF9bTUFYX05PR0FQXVtQQVRIX01BWCsxXTsKKyAgICBjaGFyKiAgIG5vZ2FwX2luUGF0aFtNQVhfTk9HQVBdOworCisgICAgaW50ICAgICBpOworICAgIEZJTEUgICAqb3V0ZjsKKworI2lmIG1hY2ludG9zaAorICAgIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7CisjZW5kaWYKKyNpZiAwCisgICAgLyogcmggMDYxMjA3CisgICAgICAgdGhlIGZvbGxvd2luZyBmaXggc2VlbXMgdG8gYmUgYSB3b3JrYXJvdW5kIGZvciBhIHByb2JsZW0gaW4gdGhlCisgICAgICAgcGFyZW50IHByb2Nlc3MgY2FsbGluZyBMQU1FLiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZml4IHRoZSBicm9rZW4KKyAgICAgICBhcHBsaWNhdGlvbiA9PiBjb2RlIGRpc2FibGVkLgorICAgICAqLworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgIC8qIHNldCBhZmZpbml0eSBiYWNrIHRvIGFsbCBDUFVzLiAgRml4IGZvciBFQUMvbGFtZSBvbiBTTVAgc3lzdGVtcyBmcm9tCisgICAgICAgIlRvZGQgUmljaG1vbmQiIDx0b2RkLnJpY2htb25kQG9wZW53YXZlLmNvbT4gKi8KKyAgICB0eXBlZGVmIEJPT0woV0lOQVBJICogU1BBTUZ1bmMpIChIQU5ETEUsIERXT1JEX1BUUik7CisgICAgU1BBTUZ1bmMgZnVuYzsKKyAgICBTWVNURU1fSU5GTyBzaTsKKworICAgIGlmICgoZnVuYyA9IChTUEFNRnVuYykgR2V0UHJvY0FkZHJlc3MoR2V0TW9kdWxlSGFuZGxlVyhMIktFUk5FTDMyLkRMTCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb2Nlc3NBZmZpbml0eU1hc2siKSkgIT0gTlVMTCkgeworICAgICAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisgICAgICAgIGZ1bmMoR2V0Q3VycmVudFByb2Nlc3MoKSwgc2kuZHdBY3RpdmVQcm9jZXNzb3JNYXNrKTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19FTVhfXworICAgIC8qIFRoaXMgZ2l2ZXMgd2lsZGNhcmQgZXhwYW5zaW9uIG9uIE5vbi1QT1NJWCBzaGVsbHMgd2l0aCBPUy8yICovCisgICAgX3dpbGRjYXJkKCZhcmdjLCAmYXJndik7CisjZW5kaWYKKworICAgIG1lbXNldChub2dhcF9pblBhdGhfLCAwLCBzaXplb2Yobm9nYXBfaW5QYXRoXykpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9HQVA7ICsraSkgeworICAgICAgICBub2dhcF9pblBhdGhbaV0gPSAmbm9nYXBfaW5QYXRoX1tpXVswXTsKKyAgICB9CisKKyAgICBtZW1zZXQoaW5QYXRoLCAwLCBzaXplb2YoaW5QYXRoKSk7CisKKyAgICBmcm9udGVuZF9vcGVuX2NvbnNvbGUoKTsKKworICAgIC8qIGluaXRpYWxpemUgbGlibXAzbGFtZSAqLworICAgIGlucHV0X2Zvcm1hdCA9IHNmX3Vua25vd247CisgICAgaWYgKE5VTEwgPT0gKGdmID0gbGFtZV9pbml0KCkpKSB7CisgICAgICAgIGVycm9yX3ByaW50ZigiZmF0YWwgZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4iKTsKKyAgICAgICAgZnJvbnRlbmRfY2xvc2VfY29uc29sZSgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgbGFtZV9zZXRfZXJyb3JmKGdmLCAmZnJvbnRlbmRfZXJyb3JmKTsKKyAgICBsYW1lX3NldF9kZWJ1Z2YoZ2YsICZmcm9udGVuZF9kZWJ1Z2YpOworICAgIGxhbWVfc2V0X21zZ2YoZ2YsICZmcm9udGVuZF9tc2dmKTsKKyAgICBpZiAoYXJnYyA8PSAxKSB7CisgICAgICAgIHVzYWdlKHN0ZGVyciwgYXJndlswXSk7IC8qIG5vIGNvbW1hbmQtbGluZSBhcmdzLCBwcmludCB1c2FnZSwgZXhpdCAgKi8KKyAgICAgICAgbGFtZV9jbG9zZShnZik7CisgICAgICAgIGZyb250ZW5kX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIHNldHRpbmcgdmFyaW91cyBmbGFncyBpbiB0aGUKKyAgICAgKiBzdHJ1Y3QgJ2dmJy4gIElmIHlvdSB3YW50IHRvIHBhcnNlIHlvdXIgb3duIGFyZ3VtZW50cywKKyAgICAgKiBvciBjYWxsIGxpYm1wM2xhbWUgZnJvbSBhIHByb2dyYW0gd2hpY2ggdXNlcyBhIEdVSSB0byBzZXQgYXJndW1lbnRzLAorICAgICAqIHNraXAgdGhpcyBjYWxsIGFuZCBzZXQgdGhlIHZhbHVlcyBvZiBpbnRlcmVzdCBpbiB0aGUgZ2Ygc3RydWN0LgorICAgICAqIChzZWUgdGhlIGZpbGUgQVBJIGFuZCBsYW1lLmggZm9yIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlc2UgcGFyYW1ldGVycykKKyAgICAgKi8KKyAgICBwYXJzZV9hcmdzX2Zyb21fc3RyaW5nKGdmLCBnZXRlbnYoIkxBTUVPUFQiKSwgaW5QYXRoLCBvdXRQYXRoKTsKKyAgICByZXQgPSBwYXJzZV9hcmdzKGdmLCBhcmdjLCBhcmd2LCBpblBhdGgsIG91dFBhdGgsIG5vZ2FwX2luUGF0aCwgJm1heF9ub2dhcCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgbGFtZV9jbG9zZShnZik7CisgICAgICAgIGZyb250ZW5kX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAgICAgcmV0dXJuIHJldCA9PSAtMiA/IDAgOiAxOworICAgIH0KKyAgICBpZiAodXBkYXRlX2ludGVydmFsIDwgMC4pCisgICAgICAgIHVwZGF0ZV9pbnRlcnZhbCA9IDIuOworCisgICAgaWYgKG91dFBhdGhbMF0gIT0gJ1wwJyAmJiBtYXhfbm9nYXAgPiAwKSB7CisgICAgICAgIHN0cm5jcHkobm9nYXBkaXIsIG91dFBhdGgsIFBBVEhfTUFYICsgMSk7CisgICAgICAgIG5vZ2Fwb3V0ID0gMTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGlucHV0IGZpbGUuICBUaGlzIGFsc28gc2V0cyBzYW1wbGVyYXRlIGFuZCBhcyBtdWNoCisgICAgICAgb3RoZXIgZGF0YSBvbiB0aGUgaW5wdXQgZmlsZSBhcyBhdmFpbGFibGUgaW4gdGhlIGhlYWRlcnMgKi8KKyAgICBpZiAobWF4X25vZ2FwID4gMCkgeworICAgICAgICAvKiBmb3Igbm9nYXAgZW5jb2Rpbmcgb2YgbXVsdGlwbGUgaW5wdXQgZmlsZXMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworICAgICAgICAgKiBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLCBvbmx5IGFuIG9wdGlvbmFsIG91dHB1dCBkaXJlY3RvcnkuICovCisgICAgICAgIHBhcnNlX25vZ2FwX2ZpbGVuYW1lcyhub2dhcG91dCwgbm9nYXBfaW5QYXRoWzBdLCBvdXRQYXRoLCBub2dhcGRpcik7CisgICAgICAgIG91dGYgPSBpbml0X2ZpbGVzKGdmLCBub2dhcF9pblBhdGhbMF0sIG91dFBhdGgsICZlbmNfZGVsYXksICZlbmNfcGFkZGluZyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBvdXRmID0gaW5pdF9maWxlcyhnZiwgaW5QYXRoLCBvdXRQYXRoLCAmZW5jX2RlbGF5LCAmZW5jX3BhZGRpbmcpOworICAgIH0KKyAgICBpZiAob3V0ZiA9PSBOVUxMKSB7CisgICAgICAgIGxhbWVfY2xvc2UoZ2YpOworICAgICAgICBmcm9udGVuZF9jbG9zZV9jb25zb2xlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogdHVybiBvZmYgYXV0b21hdGljIHdyaXRpbmcgb2YgSUQzIHRhZyBkYXRhIGludG8gbXAzIHN0cmVhbSAKKyAgICAgKiB3ZSBoYXZlIHRvIGNhbGwgaXQgYmVmb3JlICdsYW1lX2luaXRfcGFyYW1zJywgYmVjYXVzZSB0aGF0CisgICAgICogZnVuY3Rpb24gd291bGQgc3BpdCBvdXQgSUQzdjIgdGFnIGRhdGEuCisgICAgICovCisgICAgbGFtZV9zZXRfd3JpdGVfaWQzdGFnX2F1dG9tYXRpYyhnZiwgMCk7CisKKyAgICAvKiBOb3cgdGhhdCBhbGwgdGhlIG9wdGlvbnMgYXJlIHNldCwgbGFtZSBuZWVkcyB0byBhbmFseXplIHRoZW0gYW5kCisgICAgICogc2V0IHNvbWUgbW9yZSBpbnRlcm5hbCBvcHRpb25zIGFuZCBjaGVjayBmb3IgcHJvYmxlbXMKKyAgICAgKi8KKyAgICBpID0gbGFtZV9pbml0X3BhcmFtcyhnZik7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICBkaXNwbGF5X2JpdHJhdGVzKHN0ZGVycik7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3JfcHJpbnRmKCJmYXRhbCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbiIpOworICAgICAgICBsYW1lX2Nsb3NlKGdmKTsKKyAgICAgICAgZnJvbnRlbmRfY2xvc2VfY29uc29sZSgpOworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICBpZiAoc2lsZW50ID4gMCkgeworICAgICAgICBicmhpc3QgPSAwOyAgICAgLyogdHVybiBvZmYgVkJSIGhpc3RvZ3JhbSAqLworICAgIH0KKworCisgICAgaWYgKGxhbWVfZ2V0X2RlY29kZV9vbmx5KGdmKSkgeworICAgICAgICAvKiBkZWNvZGUgYW4gbXAzIGZpbGUgdG8gYSAud2F2ICovCisgICAgICAgIGlmIChtcDNfZGVsYXlfc2V0KQorICAgICAgICAgICAgbGFtZV9kZWNvZGVyKGdmLCBvdXRmLCBtcDNfZGVsYXksIGluUGF0aCwgb3V0UGF0aCwgJmVuY19kZWxheSwgJmVuY19wYWRkaW5nKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGFtZV9kZWNvZGVyKGdmLCBvdXRmLCAwLCBpblBhdGgsIG91dFBhdGgsICZlbmNfZGVsYXksICZlbmNfcGFkZGluZyk7CisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChtYXhfbm9nYXAgPiAwKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogZW5jb2RlIG11bHRpcGxlIGlucHV0IGZpbGVzIHVzaW5nIG5vZ2FwIG9wdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X25vZ2FwOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIHVzZV9mbHVzaF9ub2dhcCA9IChpICE9IChtYXhfbm9nYXAgLSAxKSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlX25vZ2FwX2ZpbGVuYW1lcyhub2dhcG91dCwgbm9nYXBfaW5QYXRoW2ldLCBvdXRQYXRoLCBub2dhcGRpcik7CisgICAgICAgICAgICAgICAgICAgIC8qIG5vdGU6IGlmIGluaXRfZmlsZXMgY2hhbmdlcyBhbnl0aGluZywgbGlrZQorICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlLCBudW1fY2hhbm5lbHMsIGV0Yywgd2UgYXJlIHNjcmV3ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0ZiA9IGluaXRfZmlsZXMoZ2YsIG5vZ2FwX2luUGF0aFtpXSwgb3V0UGF0aCwgJmVuY19kZWxheSwgJmVuY19wYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVpbml0aWFsaXplIGJpdHN0cmVhbSBmb3IgbmV4dCBlbmNvZGluZy4gIHRoaXMgaXMgbm9ybWFsbHkgZG9uZQorICAgICAgICAgICAgICAgICAgICAgKiBieSBsYW1lX2luaXRfcGFyYW1zKCksIGJ1dCB3ZSBjYW5ub3QgY2FsbCB0aGF0IHJvdXRpbmUgdHdpY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgbGFtZV9pbml0X2JpdHN0cmVhbShnZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyaGlzdF9pbml0X3BhY2thZ2UoZ2YpOworICAgICAgICAgICAgICAgIGxhbWVfc2V0X25vZ2FwX3RvdGFsKGdmLCBtYXhfbm9nYXApOworICAgICAgICAgICAgICAgIGxhbWVfc2V0X25vZ2FwX2N1cnJlbnRpbmRleChnZiwgaSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0ID0gbGFtZV9lbmNvZGVyKGdmLCBvdXRmLCB1c2VfZmx1c2hfbm9nYXAsIG5vZ2FwX2luUGF0aFtpXSwgb3V0UGF0aCk7CisKKyAgICAgICAgICAgICAgICBmY2xvc2Uob3V0Zik7IC8qIGNsb3NlIHRoZSBvdXRwdXQgZmlsZSAqLworICAgICAgICAgICAgICAgIGNsb3NlX2luZmlsZSgpOyAvKiBjbG9zZSB0aGUgaW5wdXQgZmlsZSAqLworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogZW5jb2RlIGEgc2luZ2xlIGlucHV0IGZpbGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYnJoaXN0X2luaXRfcGFja2FnZShnZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IGxhbWVfZW5jb2RlcihnZiwgb3V0ZiwgMCwgaW5QYXRoLCBvdXRQYXRoKTsKKworICAgICAgICAgICAgZmNsb3NlKG91dGYpOyAvKiBjbG9zZSB0aGUgb3V0cHV0IGZpbGUgKi8KKyAgICAgICAgICAgIGNsb3NlX2luZmlsZSgpOyAvKiBjbG9zZSB0aGUgaW5wdXQgZmlsZSAqLworICAgICAgICB9CisgICAgfQorICAgIGxhbWVfY2xvc2UoZ2YpOworICAgIGZyb250ZW5kX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvbWFpbi5oIGIvZnJvbnRlbmQvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTg2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9tYWluLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqCUNvbW1hbmQgbGluZSBmcm9udGVuZCBwcm9ncmFtCisgKgorICoJQ29weXJpZ2h0IChjKSAxOTk5IE1hcmsgVGF5bG9yCisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBUYWtlaGlybyBUT01JQU5HQQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisKKyNpZmRlZiBIQVZFX0xJTUlUU19ICisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXRfYXVkaW8uaCIKKworI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCAxMDI0CisjZW5kaWYKKworCisvKiBHTE9CQUwgVkFSSUFCTEVTIHVzZWQgYnkgcGFyc2UuYyBhbmQgbWFpbi5jLiAgCisgICBpbnN0YW50aWF0ZWQgaW4gcGFyY2UuYy4gIHVnbHksIHVnbHkgKi8KK2V4dGVybiBzb3VuZF9maWxlX2Zvcm1hdCBpbnB1dF9mb3JtYXQ7CitleHRlcm4gaW50IHN3YXBieXRlczsgICAgICAgIC8qIGZvcmNlIGJ5dGUgc3dhcHBpbmcgICBkZWZhdWx0PTAgKi8KK2V4dGVybiBpbnQgc2lsZW50OworZXh0ZXJuIGludCBicmhpc3Q7CisKK2V4dGVybiBpbnQgbXAzX2RlbGF5OyAgICAgICAgLyogZm9yIGRlY29kZXIgb25seSAqLworZXh0ZXJuIGludCBtcDNfZGVsYXlfc2V0OyAgICAvKiBmb3IgZGVjb2RlciBvbmx5ICovCitleHRlcm4gZmxvYXQgdXBkYXRlX2ludGVydmFsOyAvKiB0byB1c2UgRnJhbmsncyB0aW1lIHN0YXR1cyBkaXNwbGF5ICovCitleHRlcm4gaW50IGRpc2FibGVfd2F2X2hlYWRlcjsgLyogZm9yIGRlY29kZXIgb25seSAqLworZXh0ZXJuIG1wM2RhdGFfc3RydWN0IG1wM2lucHV0X2RhdGE7IC8qIHVzZWQgYnkgTVAzICovCitleHRlcm4gaW50IHByaW50X2NsaXBwaW5nX2luZm87IC8qIHByaW50IGluZm8gd2hldGhlciB3YXZlZm9ybSBjbGlwcyAqLworZXh0ZXJuIGludCBpbl9zaWduZWQ7CitleHRlcm4gaW50IGluX3Vuc2lnbmVkOworZXh0ZXJuIGludCBpbl9iaXR3aWR0aDsKK2V4dGVybiBpbnQgZmx1c2hfd3JpdGU7CisKKyNkZWZpbmUgICAgICAgICBNaW4oQSwgQikgICAgICAgKChBKSA8IChCKSA/IChBKSA6IChCKSkKKyNkZWZpbmUgICAgICAgICBNYXgoQSwgQikgICAgICAgKChBKSA+IChCKSA/IChBKSA6IChCKSkKKworCitlbnVtIEJ5dGVPcmRlciB7IEJ5dGVPcmRlckxpdHRsZUVuZGlhbiwgQnl0ZU9yZGVyQmlnRW5kaWFuIH07CitleHRlcm4gZW51bSBCeXRlT3JkZXIgaW5fZW5kaWFuOwpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvbXAzcnRwLmMgYi9mcm9udGVuZC9tcDNydHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzU1ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvbXAzcnRwLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qICRJZDogbXAzcnRwLmMsdiAxLjI1LjguMSAyMDA4LzA4LzA1IDE0OjE2OjA2IHJvYmVydCBFeHAgJCAqLworCisvKiBTdGlsbCB1bmRlciB3b3JrIC4uLiwgbmVlZCBhIGNsaWVudCBmb3IgdGVzdCwgd2hlcmUgY2FuIEkgZ2V0IG9uZT8gKi8KKworLyogCisgKiAgZXhwZXJpbWVudGFsIHRyYW5zbGF0aW9uOgorICoKKyAqICBnY2MgLUkuLlxpbmNsdWRlIC1JLi5cbGlibXAzbGFtZSAtbyBtcDNydHAgbXAzcnRwLmMgLi4vbGlibXAzbGFtZS9saWJtcDNsYW1lLmEgbGFtZXRpbWUuYyBnZXRfYXVkaW8uYyBwb3J0YWJsZWlvLmMgaWVlZWZsb2F0LmMgdGltZXN0YXR1cy5jIHBhcnNlLmMgcnRwLmMgLWxtCisgKgorICogIHdhdnJlYyAtdCAxNDQwMCAtcyA0NDEwMCAtUyAvcHJvYy9zZWxmL2ZkLzEgfCAuL21wM3J0cCAxMC4xLjEuNDIgLVYyIC1iMTI4IC1CMjU2IC0gbXlfbXAzZmlsZS5tcDMKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGlmbmRlZiBIQVZFX1NUUkNIUgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyAgZGVmaW5lIHN0cnJjaHIgcmluZGV4CisjIGVuZGlmCitjaGFyICAgKnN0cmNocigpLCAqc3RycmNocigpOworIyBpZm5kZWYgSEFWRV9NRU1DUFkKKyMgIGRlZmluZSBtZW1jcHkoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjICBkZWZpbmUgbWVtbW92ZShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGFtZS5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJwYXJzZS5oIgorI2luY2x1ZGUgImxhbWV0aW1lLmgiCisjaW5jbHVkZSAidGltZXN0YXR1cy5oIgorI2luY2x1ZGUgImdldF9hdWRpby5oIgorI2luY2x1ZGUgInJ0cC5oIgorI2luY2x1ZGUgImNvbnNvbGUuaCIKKworI2lmZGVmIFdJVEhfRE1BTExPQworI2luY2x1ZGUgPGRtYWxsb2MuaD4KKyNlbmRpZgorCisvKgorICogRW5jb2RlICh2aWEgTEFNRSkgdG8gbXAzIHdpdGggUlRQIHN0cmVhbWluZyBvZiB0aGUgb3V0cHV0LgorICoKKyAqIEF1dGhvcjogRmVsaXggdm9uIExlaXRuZXIgPGxlaXRuZXJAdmltLm9yZz4KKyAqCisgKiAgIG1wM3J0cCBpcFs6cG9ydFs6dHRsXV0gW2xhbWUgZW5jb2Rpbmcgb3B0aW9uc10gaW5maWxlIG91dGZpbGUKKyAqCisgKiBleGFtcGxlczoKKyAqICAgYXJlY29yZCAtYiAxNiAtcyAyMjA1MCAtdyB8IC4vbXAzcnRwIDIyNC4xNy4yMy40Mjo1MDA0OjIgLWIgNTYgLSAvZGV2L251bGwKKyAqICAgYXJlY29yZCAtYiAxNiAtcyA0NDEwMCAtdyB8IC4vbXAzcnRwIDEwLjEuMS40MiAtVjIgLWIxMjggLUIyNTYgLSBteV9tcDNmaWxlLm1wMworICoKKyAqLworCitzdHJ1Y3QgcnRwaGVhZGVyIFJUUGhlYWRlcjsKK3N0cnVjdCBzb2NrYWRkcl9pbiBydHBzaTsKK2ludCAgICAgcnRwc29ja2V0OworCit2b2lkCitydHBfb3V0cHV0KGNvbnN0IGNoYXIgKm1wM2J1ZmZlciwgY29uc3QgaW50IG1wM3NpemUpCit7CisgICAgc2VuZHJ0cChydHBzb2NrZXQsICZydHBzaSwgJlJUUGhlYWRlciwgbXAzYnVmZmVyLCBtcDNzaXplKTsKKyAgICBSVFBoZWFkZXIudGltZXN0YW1wICs9IDU7CisgICAgUlRQaGVhZGVyLmIuc2VxdWVuY2UrKzsKK30KKworI2lmIDAKK3N0cnVjdCBydHBoZWFkZXIgUlRQaGVhZGVyOworU09DS0VUICBydHBzb2NrZXQ7CisKK3ZvaWQKK3J0cF9vdXRwdXQoY2hhciAqbXAzYnVmZmVyLCBpbnQgbXAzc2l6ZSkKK3sKKyAgICBydHBfc2VuZChydHBzb2NrZXQsICZSVFBoZWFkZXIsIG1wM2J1ZmZlciwgbXAzc2l6ZSk7CisgICAgUlRQaGVhZGVyLnRpbWVzdGFtcCArPSA1OworICAgIFJUUGhlYWRlci5iLnNlcXVlbmNlKys7Cit9CisjZW5kaWYKKworCisKKworc3RhdGljIHVuc2lnbmVkIGludAorbWF4dmFsdWUoaW50IEJ1ZmZlclsyXVsxMTUyXSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbWF4ID0gMDsKKyAgICBpbnQgICAgIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTE1MjsgaSsrKSB7CisgICAgICAgIGlmIChhYnMoQnVmZmVyWzBdW2ldKSA+IG1heCkKKyAgICAgICAgICAgIG1heCA9IGFicyhCdWZmZXJbMF1baV0pOworICAgICAgICBpZiAoYWJzKEJ1ZmZlclsxXVtpXSkgPiBtYXgpCisgICAgICAgICAgICBtYXggPSBhYnMoQnVmZmVyWzFdW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIG1heCA+PiAxNjsKK30KKworc3RhdGljIHZvaWQKK2xldmVsbWVzc2FnZSh1bnNpZ25lZCBpbnQgbWF4dikKK3sKKyAgICBjaGFyICAgIGJ1ZmZbXSA9ICJ8ICAuICB8ICAuICB8ICAuICB8ICAuICB8ICAuICB8ICAuICB8ICAuICB8ICAuICB8ICAuICB8ICAuICB8ICBcciI7CisgICAgc3RhdGljIHVuc2lnbmVkIGludCBtYXggPSAwOworICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgdG1wID0gMDsKKworICAgIGJ1ZmZbdG1wXSA9ICcrJzsKKyAgICB0bXAgPSAobWF4diAqIDYxICsgMTYzODQpIC8gKDMyNzY3ICsgMTYzODQgLyA2MSk7CisgICAgaWYgKHRtcCA+IHNpemVvZihidWZmKSAtIDIpCisgICAgICAgIHRtcCA9IHNpemVvZihidWZmKSAtIDI7CisgICAgaWYgKG1heCA8IHRtcCkKKyAgICAgICAgbWF4ID0gdG1wOworICAgIGJ1ZmZbbWF4XSA9ICd4JzsKKyAgICBidWZmW3RtcF0gPSAnIyc7CisgICAgY29uc29sZV9wcmludGYoYnVmZik7CisgICAgY29uc29sZV9mbHVzaCgpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogbWFpbgorKgorKiBQVVJQT1NFOiAgTVBFRy0xLDIgTGF5ZXIgSUlJIGVuY29kZXIgd2l0aCBHUFNZQ0hPIAorKiBwc3ljaG9hY291c3RpYyBtb2RlbC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG1wM2J1ZmZlcltMQU1FX01BWE1QM0JVRkZFUl07CisgICAgY2hhciAgICBpblBhdGhbUEFUSF9NQVggKyAxXTsKKyAgICBjaGFyICAgIG91dFBhdGhbUEFUSF9NQVggKyAxXTsKKyAgICBpbnQgICAgIEJ1ZmZlclsyXVsxMTUyXTsKKworICAgIGxhbWVfZ2xvYmFsX2ZsYWdzICpnZjsKKworICAgIGludCAgICAgcmV0OworICAgIGludCAgICAgd2F2c2FtcGxlczsKKyAgICBpbnQgICAgIG1wM2J5dGVzOworICAgIEZJTEUgICAqb3V0ZjsKKworICAgIGNoYXIgICAgaXBbMTZdOworICAgIHVuc2lnbmVkIHBvcnQgPSA1MDA0OworICAgIHVuc2lnbmVkIHR0bCA9IDI7CisgICAgY2hhciAgICBkdW1teTsKKworICAgIGludCAgICAgZW5jX2RlbGF5ID0gLTE7CisgICAgaW50ICAgICBlbmNfcGFkZGluZyA9IC0xOworCisgICAgZnJvbnRlbmRfb3Blbl9jb25zb2xlKCk7CisgICAgaWYgKGFyZ2MgPD0gMikgeworICAgICAgICBjb25zb2xlX3ByaW50ZigiRW5jb2RlICh2aWEgTEFNRSkgdG8gbXAzIHdpdGggUlRQIHN0cmVhbWluZyBvZiB0aGUgb3V0cHV0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICBtcDNydHAgaXBbOnBvcnRbOnR0bF1dIFtsYW1lIGVuY29kaW5nIG9wdGlvbnNdIGluZmlsZSBvdXRmaWxlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICBleGFtcGxlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGFyZWNvcmQgLWIgMTYgLXMgMjIwNTAgLXcgfCAuL21wM3J0cCAyMjQuMTcuMjMuNDI6NTAwNDoyIC1iIDU2IC0gL2Rldi9udWxsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBhcmVjb3JkIC1iIDE2IC1zIDQ0MTAwIC13IHwgLi9tcDNydHAgMTAuMS4xLjQyIC1WMiAtYjEyOCAtQjI1NiAtIG15X21wM2ZpbGUubXAzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJcbiIpOworICAgICAgICBmcm9udGVuZF9jbG9zZV9jb25zb2xlKCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN3aXRjaCAoc3NjYW5mKGFyZ3ZbMV0sICIlMTFbLjAtOV06JXU6JXUlYyIsIGlwLCAmcG9ydCwgJnR0bCwgJmR1bW15KSkgeworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnJvcl9wcmludGYoIklsbGVnYWwgZGVzdGluYXRpb24gc2VsZWN0b3IgJyVzJywgbXVzdCBiZSBpcFs6cG9ydFs6dHRsXV1cbiIsIGFyZ3ZbMV0pOworICAgICAgICBmcm9udGVuZF9jbG9zZV9jb25zb2xlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBydHBzb2NrZXQgPSBtYWtlc29ja2V0KGlwLCBwb3J0LCB0dGwsICZydHBzaSk7CisgICAgc3JhbmQoZ2V0cGlkKCkgXiB0aW1lKE5VTEwpKTsKKyAgICBpbml0cnRwKCZSVFBoZWFkZXIpOworCisgICAgLyogaW5pdGlhbGl6ZSBlbmNvZGVyICovCisgICAgZ2YgPSBsYW1lX2luaXQoKTsKKyAgICBpZiAoTlVMTCA9PSBnZikgeworICAgICAgICBlcnJvcl9wcmludGYoImZhdGFsIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvblxuIik7CisgICAgICAgIGZyb250ZW5kX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGxhbWVfc2V0X2Vycm9yZihnZiwgJmZyb250ZW5kX2Vycm9yZik7CisgICAgbGFtZV9zZXRfZGVidWdmKGdmLCAmZnJvbnRlbmRfZGVidWdmKTsKKyAgICBsYW1lX3NldF9tc2dmKGdmLCAmZnJvbnRlbmRfbXNnZik7CisKKyAgICAvKiBSZW1vdmUgdGhlIGFyZ3VtZXRzIHRoYXQgYXJlIHJ0cCByZWxhdGVkLCBhbmQgdGhlbiAKKyAgICAgKiBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgc2V0dGluZyB2YXJpb3VzIGZsYWdzIGluIHRoZQorICAgICAqIHN0cnVjdCBwb2ludGVkIHRvIGJ5ICdnZicuICBJZiB5b3Ugd2FudCB0byBwYXJzZSB5b3VyIG93biBhcmd1bWVudHMsCisgICAgICogb3IgY2FsbCBsaWJtcDNsYW1lIGZyb20gYSBwcm9ncmFtIHdoaWNoIHVzZXMgYSBHVUkgdG8gc2V0IGFyZ3VtZW50cywKKyAgICAgKiBza2lwIHRoaXMgY2FsbCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaW50ZXJlc3QgaW4gdGhlIGdmIHN0cnVjdC4gIAorICAgICAqIChzZWUgbGFtZS5oIGZvciBkb2N1bWVudGF0aW9uIGFib3V0IHRoZXNlIHBhcmFtZXRlcnMpCisgICAgICovCisKKyAgICBhcmd2WzFdID0gYXJndlswXTsKKyAgICBwYXJzZV9hcmdzKGdmLCBhcmdjIC0gMSwgYXJndiArIDEsIGluUGF0aCwgb3V0UGF0aCwgTlVMTCwgTlVMTCk7CisKKyAgICAvKiBvcGVuIHRoZSBvdXRwdXQgZmlsZS4gIEZpbGVuYW1lIHBhcnNlZCBpbnRvIGdmLmluUGF0aCAqLworICAgIGlmICgwID09IHN0cmNtcChvdXRQYXRoLCAiLSIpKSB7CisgICAgICAgIGxhbWVfc2V0X3N0cmVhbV9iaW5hcnlfbW9kZShvdXRmID0gc3Rkb3V0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICgob3V0ZiA9IGZvcGVuKG91dFBhdGgsICJ3YisiKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJDb3VsZCBub3QgY3JlYXRlIFwiJXNcIi5cbiIsIG91dFBhdGgpOworICAgICAgICAgICAgZnJvbnRlbmRfY2xvc2VfY29uc29sZSgpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIG9wZW4gdGhlIHdhdi9haWZmL3JhdyBwY20gb3IgbXAzIGlucHV0IGZpbGUuICBUaGlzIGNhbGwgd2lsbAorICAgICAqIG9wZW4gdGhlIGZpbGUgd2l0aCBuYW1lIGdmLmluRmlsZSwgdHJ5IHRvIHBhcnNlIHRoZSBoZWFkZXJzIGFuZAorICAgICAqIHNldCBnZi5zYW1wbGVyYXRlLCBnZi5udW1fY2hhbm5lbHMsIGdmLm51bV9zYW1wbGVzLgorICAgICAqIGlmIHlvdSB3YW50IHRvIGRvIHlvdXIgb3duIGZpbGUgaW5wdXQsIHNraXAgdGhpcyBjYWxsIGFuZCBzZXQKKyAgICAgKiB0aGVzZSB2YWx1ZXMgeW91cnNlbGYuICAKKyAgICAgKi8KKyAgICBpbml0X2luZmlsZShnZiwgaW5QYXRoLCAmZW5jX2RlbGF5LCAmZW5jX3BhZGRpbmcpOworCisKKyAgICAvKiBOb3cgdGhhdCBhbGwgdGhlIG9wdGlvbnMgYXJlIHNldCwgbGFtZSBuZWVkcyB0byBhbmFseXplIHRoZW0gYW5kCisgICAgICogc2V0IHNvbWUgbW9yZSBvcHRpb25zIAorICAgICAqLworICAgIHJldCA9IGxhbWVfaW5pdF9wYXJhbXMoZ2YpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICBkaXNwbGF5X2JpdHJhdGVzKHN0ZGVycik7CisgICAgICAgIGVycm9yX3ByaW50ZigiZmF0YWwgZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4iKTsKKyAgICAgICAgZnJvbnRlbmRfY2xvc2VfY29uc29sZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbGFtZV9wcmludF9jb25maWcoZ2YpOyAvKiBwcmludCB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBiZWluZyB1c2VkICovCisKKyAgICBpZiAodXBkYXRlX2ludGVydmFsIDwgMC4pCisgICAgICAgIHVwZGF0ZV9pbnRlcnZhbCA9IDIuOworCisgICAgLyogZW5jb2RlIHVudGlsIHdlIGhpdCBFT0YgKi8KKyAgICB3aGlsZSAoKHdhdnNhbXBsZXMgPSBnZXRfYXVkaW8oZ2YsIEJ1ZmZlcikpID4gMCkgeyAvKiByZWFkIGluICd3YXZzYW1wbGVzJyBzYW1wbGVzICovCisgICAgICAgIGxldmVsbWVzc2FnZShtYXh2YWx1ZShCdWZmZXIpKTsKKyAgICAgICAgbXAzYnl0ZXMgPSBsYW1lX2VuY29kZV9idWZmZXJfaW50KGdmLCAvKiBlbmNvZGUgdGhlIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJbMF0sIEJ1ZmZlclsxXSwgd2F2c2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wM2J1ZmZlciwgc2l6ZW9mKG1wM2J1ZmZlcikpOworCisgICAgICAgIHJ0cF9vdXRwdXQobXAzYnVmZmVyLCBtcDNieXRlcyk7IC8qIHdyaXRlIE1QMyBvdXRwdXQgdG8gUlRQIHBvcnQgKi8KKyAgICAgICAgZndyaXRlKG1wM2J1ZmZlciwgMSwgbXAzYnl0ZXMsIG91dGYpOyAvKiB3cml0ZSB0aGUgTVAzIG91dHB1dCB0byBmaWxlICovCisgICAgfQorCisgICAgbXAzYnl0ZXMgPSBsYW1lX2VuY29kZV9mbHVzaChnZiwgLyogbWF5IHJldHVybiBvbmUgb3IgbW9yZSBtcDMgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wM2J1ZmZlciwgc2l6ZW9mKG1wM2J1ZmZlcikpOworICAgIHJ0cF9vdXRwdXQobXAzYnVmZmVyLCBtcDNieXRlcyk7IC8qIHdyaXRlIE1QMyBvdXRwdXQgdG8gUlRQIHBvcnQgKi8KKyAgICBmd3JpdGUobXAzYnVmZmVyLCAxLCBtcDNieXRlcywgb3V0Zik7IC8qIHdyaXRlIHRoZSBNUDMgb3V0cHV0IHRvIGZpbGUgKi8KKworICAgIGxhbWVfbXAzX3RhZ3NfZmlkKGdmLCBvdXRmKTsgLyogYWRkIFZCUiB0YWdzIHRvIG1wMyBmaWxlICovCisKKyAgICBsYW1lX2Nsb3NlKGdmKTsKKyAgICBmY2xvc2Uob3V0Zik7CisgICAgY2xvc2VfaW5maWxlKCk7ICAgICAvKiBjbG9zZSB0aGUgc291bmQgaW5wdXQgZmlsZSAqLworICAgIGZyb250ZW5kX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogZW5kIG9mIG1wM3J0cC5jICovCmRpZmYgLS1naXQgYS9mcm9udGVuZC9tcDN4LmMgYi9mcm9udGVuZC9tcDN4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0OWVmMwotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL21wM3guYwpAQCAtMCwwICsxLDgwIEBACisvKiAkSWQ6IG1wM3guYyx2IDEuMjUgMjAwOC8wMy8wOSAxNzoxMzoyMyByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImVuY29kZXIuaCIKKyNpbmNsdWRlICJsYW1lLWFuYWx5c2lzLmgiCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgInBhcnNlLmgiCisjaW5jbHVkZSAiZ2V0X2F1ZGlvLmgiCisjaW5jbHVkZSAiZ3RrYW5hbC5oIgorI2luY2x1ZGUgImxhbWV0aW1lLmgiCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiY29uc29sZS5oIgorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogbWFpbgorKgorKiBQVVJQT1NFOiAgTVBFRy0xLDIgTGF5ZXIgSUlJIGVuY29kZXIgd2l0aCBHUFNZQ0hPCisqIHBzeWNob2Fjb3VzdGljIG1vZGVsLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBjaGFyICAgIG1wM2J1ZmZlcltMQU1FX01BWE1QM0JVRkZFUl07CisgICAgbGFtZV9nbG9iYWxfZmxhZ3MgKmdmOworICAgIGNoYXIgICAgb3V0UGF0aFtQQVRIX01BWCArIDFdOworICAgIGNoYXIgICAgaW5QYXRoW1BBVEhfTUFYICsgMV07CisgICAgaW50ICAgICByZXQ7CisgICAgaW50ICAgICBlbmNfZGVsYXkgPSAtMTsKKyAgICBpbnQgICAgIGVuY19wYWRkaW5nID0gLTE7CisKKyAgICBmcm9udGVuZF9vcGVuX2NvbnNvbGUoKTsKKyAgICBnZiA9IGxhbWVfaW5pdCgpOworICAgIGlmIChOVUxMID09IGdmKSB7CisgICAgICAgIGVycm9yX3ByaW50ZigiZmF0YWwgZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4iKTsKKyAgICAgICAgZnJvbnRlbmRfY2xvc2VfY29uc29sZSgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgbGFtZV9zZXRfZXJyb3JmKGdmLCAmZnJvbnRlbmRfZXJyb3JmKTsKKyAgICBsYW1lX3NldF9kZWJ1Z2YoZ2YsICZmcm9udGVuZF9kZWJ1Z2YpOworICAgIGxhbWVfc2V0X21zZ2YoZ2YsICZmcm9udGVuZF9tc2dmKTsKKyAgICBpZiAoYXJnYyA8PSAxKSB7CisgICAgICAgIHVzYWdlKHN0ZGVyciwgYXJndlswXSk7IC8qIG5vIGNvbW1hbmQtbGluZSBhcmdzICAqLworICAgICAgICBmcm9udGVuZF9jbG9zZV9jb25zb2xlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0ID0gcGFyc2VfYXJncyhnZiwgYXJnYywgYXJndiwgaW5QYXRoLCBvdXRQYXRoLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcm9udGVuZF9jbG9zZV9jb25zb2xlKCk7CisgICAgICAgIHJldHVybiByZXQgPT0gLTIgPyAwIDogMTsKKyAgICB9CisgICAgKHZvaWQpIGxhbWVfc2V0X2FuYWx5c2lzKGdmLCAxKTsKKworICAgIGluaXRfaW5maWxlKGdmLCBpblBhdGgsICZlbmNfZGVsYXksICZlbmNfcGFkZGluZyk7CisgICAgbGFtZV9pbml0X3BhcmFtcyhnZik7CisgICAgbGFtZV9wcmludF9jb25maWcoZ2YpOworCisKKyAgICBndGtfaW5pdCgmYXJnYywgJmFyZ3YpOworICAgIGd0a2NvbnRyb2woZ2YsIGluUGF0aCk7CisKKyAgICBsYW1lX2VuY29kZV9mbHVzaChnZiwgbXAzYnVmZmVyLCBzaXplb2YobXAzYnVmZmVyKSk7CisgICAgbGFtZV9jbG9zZShnZik7CisgICAgY2xvc2VfaW5maWxlKCk7CisgICAgZnJvbnRlbmRfY2xvc2VfY29uc29sZSgpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvbXAzeF92YzYuZHNwIGIvZnJvbnRlbmQvbXAzeF92YzYuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjA1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC9tcDN4X3ZjNi5kc3AKQEAgLTAsMCArMSwxODEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iTVAzeCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIE5JQ0hUIEJFQVJCRUlURU4gKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9TVAzeCAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJtcDN4X3ZjNi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIm1wM3hfdmM2Lm1hayIgQ0ZHPSJNUDN4IC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgRvxyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoNCishTUVTU0FHRSANCishTUVTU0FHRSAiTVAzeCAtIFdpbjMyIERlYnVnIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJNUDN4IC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiTVAzeCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIk1QM3hfX19XaW4zMl9EZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJNUDN4X19fV2luMzJfRGVidWciDQorIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxvdXRwdXRcRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxEZWJ1Z1xmcm9udGVuZCINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0kgIi4vV2luR3RrL3NyYy9ndGsrIiAvSSAiLi9XaW5HdGsvc3JjL2dsaWIiIC9JICIuL1dpbkd0ay9zcmMvZ3RrKy9nZGsiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vbGlibXAzbGFtZSIgL0kgIi4uL21wM3giIC9JICIuLi9mcm9udGVuZCIgL0kgIi4uIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJMQU1FU05ERklMRSIgL0QgIkJSSElTVCIgL0QgIkhBVkVfQ09ORklHX0giIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9JICIuL1dpbkd0ay9zcmMvZ3RrKyIgL0kgIi4vV2luR3RrL3NyYy9nbGliIiAvSSAiLi9XaW5HdGsvc3JjL2d0aysvZ2RrIiAvSSAiLi4vaW5jbHVkZSIgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9tcDN4IiAvSSAiLi4vZnJvbnRlbmQiIC9JICIuLiIgL0QgIl9NQkNTIiAvRCAiTEFNRVNOREZJTEUiIC9EICJCUkhJU1QiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJIQVZFX0NPTkZJR19IIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWVgNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGdsaWItMi4wLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBnZGsubGliIGd0ay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiLi4vb3V0cHV0L21wM3guZXhlIiAvcGRidHlwZTpzZXB0IC9saWJwYXRoOiIuL1dpbkd0ay9zcmMvZ3RrKy9ndGsiIC9saWJwYXRoOiIuL1dpbkd0ay9zcmMvZ3RrKy9nZGsiIC9saWJwYXRoOiIuL1dpbkd0ay9zcmMvZ2xpYiINCisjIEFERCBMSU5LMzIgZ2xpYi0yLjAubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGdkay5saWIgZ3RrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiIuLlxvdXRwdXRcRGVidWdcbXAzeC5leGUiIC9wZGJ0eXBlOnNlcHQgL2xpYnBhdGg6Ii4vV2luR3RrL3NyYy9ndGsrL2d0ayIgL2xpYnBhdGg6Ii4vV2luR3RrL3NyYy9ndGsrL2dkayIgL2xpYnBhdGg6Ii4vV2luR3RrL3NyYy9nbGliIiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiTVAzeCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiTVAzeF9fX1dpbjMyX1JlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiTVAzeF9fX1dpbjMyX1JlbGVhc2UiDQorIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxvdXRwdXRcUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VcZnJvbnRlbmQiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvSSAiLi9XaW5HVEsvZ3RrLXBsdXMiIC9JICIuL1dpbkdUSy9nbGliLTEuMiIgL0kgIi4vV2luR3RrL3NyYy9ndGsrIiAvSSAiLi9XaW5HdGsvc3JjL2dsaWIiIC9JICIuL1dpbkd0ay9zcmMvZ3RrKy9nZGsiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vbGlibXAzbGFtZSIgL0kgIi4uL21wM3giIC9JICIuLi9mcm9udGVuZCIgL0kgIi4uIiAvRCAiTkRFQlVHIiAvRCAiTEFNRVBBUlNFIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJMQU1FU05ERklMRSIgL0QgIkJSSElTVCIgL0QgIkhBVkVfQ09ORklHX0giIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvSSAiLi9XaW5HVEsvZ3RrLXBsdXMiIC9JICIuL1dpbkdUSy9nbGliLTEuMiIgL0kgIi4vV2luR3RrL3NyYy9ndGsrIiAvSSAiLi9XaW5HdGsvc3JjL2dsaWIiIC9JICIuL1dpbkd0ay9zcmMvZ3RrKy9nZGsiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vbGlibXAzbGFtZSIgL0kgIi4uL21wM3giIC9JICIuLi9mcm9udGVuZCIgL0kgIi4uIiAvRCAiTkRFQlVHIiAvRCAiTEFNRVBBUlNFIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJMQU1FU05ERklMRSIgL0QgIkJSSElTVCIgL0QgIkhBVkVfQ09ORklHX0giIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWA0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIgZ2xpYi0xLjMubGliIGdsaWItMi4wLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBnZGsubGliIGd0ay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL3Byb2ZpbGUgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uL291dHB1dC9tcDN4LmV4ZSIgL2xpYnBhdGg6Ii4vV2luR3RrL3NyYy9ndGsrL2d0ayIgL2xpYnBhdGg6Ii4vV2luR3RrL3NyYy9ndGsrL2dkayIgL2xpYnBhdGg6Ii4vV2luR3RrL3NyYy9nbGliIg0KKyMgQUREIExJTkszMiBnbGliLTIuMC5saWIgZ2xpYi0yLjAubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGdkay5saWIgZ3RrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvcHJvZmlsZSAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiLi5cb3V0cHV0XFJlbGVhc2VcbXAzeC5leGUiIC9saWJwYXRoOiIuL1dpbkd0ay9zcmMvZ3RrKy9ndGsiIC9saWJwYXRoOiIuL1dpbkd0ay9zcmMvZ3RrKy9nZGsiIC9saWJwYXRoOiIuL1dpbkd0ay9zcmMvZ2xpYiIgL29wdDpOT1dJTjk4DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJNUDN4IC0gV2luMzIgRGVidWciDQorIyBOYW1lICJNUDN4IC0gV2luMzIgUmVsZWFzZSINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cZnJvbnRlbmRcYnJoaXN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cZnJvbnRlbmRcY29uc29sZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGZyb250ZW5kXGdldF9hdWRpby5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZ3BrcGxvdHRpbmcuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGd0a2FuYWwuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxmcm9udGVuZFxsYW1ldGltZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbXAzeC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGZyb250ZW5kXHBhcnNlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cZnJvbnRlbmRccG9ydGFibGVpby5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGZyb250ZW5kXHRpbWVzdGF0dXMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJJbmNsdWRlIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGZyb250ZW5kXGJyaGlzdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGNvbmZpZ01TLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cZnJvbnRlbmRcY29uc29sZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGZyb250ZW5kXGdldF9hdWRpby5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZ3BrcGxvdHRpbmcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxmcm9udGVuZFxsYW1ldGltZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGZyb250ZW5kXHBhcnNlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cZnJvbnRlbmRccG9ydGFibGVpby5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGZyb250ZW5kXHRpbWVzdGF0dXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXFJFQURNRS5XSU5HVEsNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9mcm9udGVuZC9tcDN4X3ZjOC52Y3Byb2ogYi9mcm9udGVuZC9tcDN4X3ZjOC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlNWZjOQotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL21wM3hfdmM4LnZjcHJvagpAQCAtMCwwICsxLDI0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjkuMDAiDQorCU5hbWU9Im1wM3hfdmM4Ig0KKwlQcm9qZWN0R1VJRD0ie0Y2MTQwRjI1LTA0NjAtNDlFNS1BMkVCLTA2Q0VEMzNCRjA4Rn0iDQorCVJvb3ROYW1lc3BhY2U9Im1wM3hfdmM4Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWcgR1RLfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLi4vb3V0cHV0Ig0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2luY2x1ZGU7Li4vbGlibXAzbGFtZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfREVCVUc7V0lOMzI7X1dJTjMyO19DT05TT0xFO19XSU5ET1dTO0hBVkVfTVBHTElCO0hBVkVfQ09ORklHX0g7SEFWRV9HVEsiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImdsaWItMi4wLmxpYiBnZGsubGliIGd0ay5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVxtcDN4LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGJyaGlzdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxjb25zb2xlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdldF9hdWRpby5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxncGtwbG90dGluZy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxndGthbmFsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGxhbWV0aW1lLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXG1wM3guYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccGFyc2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccG9ydGFibGVpby5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0aW1lc3RhdHVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxicmhpc3QuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY29uc29sZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnZXRfYXVkaW8uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ3BrcGxvdHRpbmcuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9mcm9udGVuZC9wYXJzZS5jIGIvZnJvbnRlbmQvcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZhMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvcGFyc2UuYwpAQCAtMCwwICsxLDIzNDEgQEAKKy8qCisgKiAgICAgIENvbW1hbmQgbGluZSBwYXJzaW5nIHJlbGF0ZWQgZnVuY3Rpb25zCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgTWFyayBUYXlsb3IKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogJElkOiBwYXJzZS5jLHYgMS4yNDcuMi44IDIwMDkvMTIvMTEgMjI6NDQ6MjUgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGlmbmRlZiBIQVZFX1NUUkNIUgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyAgZGVmaW5lIHN0cnJjaHIgcmluZGV4CisjIGVuZGlmCitjaGFyICAgKnN0cmNocigpLCAqc3RycmNocigpOworIyBpZm5kZWYgSEFWRV9NRU1DUFkKKyMgIGRlZmluZSBtZW1jcHkoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjICBkZWZpbmUgbWVtbW92ZShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19PUzJfXworI2luY2x1ZGUgPG9zMi5oPgorI2RlZmluZSBQUlRZQ19JRExFIDEKKyNkZWZpbmUgUFJUWUNfUkVHVUxBUiAyCisjZGVmaW5lIFBSVFlEX01JTklNVU0gLTMxCisjZGVmaW5lIFBSVFlEX01BWElNVU0gMzEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9MSU1JVFNfSAorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGFtZS5oIgorI2luY2x1ZGUgInNldF9nZXQuaCIKKworI2luY2x1ZGUgImJyaGlzdC5oIgorI2luY2x1ZGUgInBhcnNlLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImdldF9hdWRpby5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJjb25zb2xlLmgiCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAKKyNpZmRlZiBIQVZFX0lDT05WCisjaW5jbHVkZSA8aWNvbnYuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIERFQlVHIHx8IF9ERUJVRyB8fCBfQUxMT1dfSU5URVJOQUxfT1BUSU9OUworI2RlZmluZSBJTlRFUk5BTF9PUFRTIDEKKyNlbHNlCisjZGVmaW5lIElOVEVSTkFMX09QVFMgTEFNRV9BTFBIQV9WRVJTSU9OCisjZW5kaWYKKworI2lmIChJTlRFUk5BTF9PUFRTIT0wKQorI2RlZmluZSBERVZfSEVMUChhKSBhCisjZWxzZQorI2RlZmluZSBERVZfSEVMUChhKQorI2VuZGlmCisKKworCisvKiBHTE9CQUwgVkFSSUFCTEVTLiAgc2V0IGJ5IHBhcnNlX2FyZ3MoKSAqLworLyogd2UgbmVlZCB0byBjbGVhbiB0aGlzIHVwICovCitzb3VuZF9maWxlX2Zvcm1hdCBpbnB1dF9mb3JtYXQ7CitpbnQgICAgIHN3YXBieXRlcyA9IDA7ICAgICAgIC8qIGZvcmNlIGJ5dGUgc3dhcHBpbmcgICBkZWZhdWx0PTAgKi8KK2ludCAgICAgc2lsZW50OyAgICAgICAgICAgICAgLyogVmVyYm9zaXR5ICovCitpbnQgICAgIGlnbm9yZV90YWdfZXJyb3JzOyAgIC8qIElnbm9yZSBlcnJvcnMgaW4gdmFsdWVzIHBhc3NlZCBmb3IgdGFncyAqLworaW50ICAgICBicmhpc3Q7CitmbG9hdCAgIHVwZGF0ZV9pbnRlcnZhbDsgICAgIC8qIHRvIHVzZSBGcmFuaydzIHRpbWUgc3RhdHVzIGRpc3BsYXkgKi8KK2ludCAgICAgbXAzX2RlbGF5OyAgICAgICAgICAgLyogdG8gYWRqdXN0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0cnVuY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGRlY29kZSAqLworaW50ICAgICBtcDNfZGVsYXlfc2V0OyAgICAgICAvKiB1c2VyIHNwZWNpZmllZCB0aGUgdmFsdWUgb2YgdGhlIG1wMyBlbmNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IHRvIGFzc3VtZSBmb3IgZGVjb2RpbmcgKi8KKworaW50ICAgICBkaXNhYmxlX3dhdl9oZWFkZXI7CittcDNkYXRhX3N0cnVjdCBtcDNpbnB1dF9kYXRhOyAvKiB1c2VkIGJ5IE1QMyAqLworaW50ICAgICBwcmludF9jbGlwcGluZ19pbmZvOyAvKiBwcmludCBpbmZvIHdoZXRoZXIgd2F2ZWZvcm0gY2xpcHMgKi8KKworCitpbnQgICAgIGluX3NpZ25lZCA9IC0xOworCitlbnVtIEJ5dGVPcmRlciBpbl9lbmRpYW4gPSBCeXRlT3JkZXJMaXR0bGVFbmRpYW47CisKK2ludCAgICAgaW5fYml0d2lkdGggPSAxNjsKKworaW50ICAgICBmbHVzaF93cml0ZSA9IDA7CisKKworCisvKioKKyAqICBMb25nIEZpbGVuYW1lIHN1cHBvcnQgZm9yIHRoZSBXSU4zMiBwbGF0Zm9ybQorICoKKyAqLworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8d2luYmFzZS5oPgorc3RhdGljIHZvaWQKK2Rvc1RvTG9uZ0ZpbGVOYW1lKGNoYXIgKmZuKQoreworICAgIGNvbnN0IGludCBNU0laRSA9IFBBVEhfTUFYICsgMSAtIDQ7IC8qICB3ZSB3YW5uYSBhZGQgIi5tcDMiIGxhdGVyICovCisgICAgV0lOMzJfRklORF9EQVRBQSBscEZpbmRGaWxlRGF0YTsKKyAgICBIQU5ETEUgIGggPSBGaW5kRmlyc3RGaWxlQShmbiwgJmxwRmluZEZpbGVEYXRhKTsKKyAgICBpZiAoaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBpbnQgICAgIGE7CisgICAgICAgIGNoYXIgICAqcSwgKnA7CisgICAgICAgIEZpbmRDbG9zZShoKTsKKyAgICAgICAgZm9yIChhID0gMDsgYSA8IE1TSVpFOyBhKyspIHsKKyAgICAgICAgICAgIGlmICgnXDAnID09IGxwRmluZEZpbGVEYXRhLmNGaWxlTmFtZVthXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYSA+PSBNU0laRSB8fCBhID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHEgPSBzdHJyY2hyKGZuLCAnXFwnKTsKKyAgICAgICAgcCA9IHN0cnJjaHIoZm4sICcvJyk7CisgICAgICAgIGlmIChwIC0gcSA+IDApCisgICAgICAgICAgICBxID0gcDsKKyAgICAgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgICAgICAgIHEgPSBzdHJyY2hyKGZuLCAnOicpOworICAgICAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICAgICAgc3RybmNweShmbiwgbHBGaW5kRmlsZURhdGEuY0ZpbGVOYW1lLCBhKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhICs9IHEgLSBmbiArIDE7CisgICAgICAgICAgICBpZiAoYSA+PSBNU0laRSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzdHJuY3B5KCsrcSwgbHBGaW5kRmlsZURhdGEuY0ZpbGVOYW1lLCBNU0laRSAtIGEpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisjaWYgZGVmaW5lZChXSU4zMikKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CitCT09MCitTZXRQcmlvcml0eUNsYXNzTWFjcm8oRFdPUkQgcCkKK3sKKyAgICBIQU5ETEUgIG9wID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKKyAgICByZXR1cm4gU2V0UHJpb3JpdHlDbGFzcyhvcCwgcCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRXaW4zMlByaW9yaXR5KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgUHJpb3JpdHkpCit7CisgICAgc3dpdGNoIChQcmlvcml0eSkgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgICAgIFNldFByaW9yaXR5Q2xhc3NNYWNybyhJRExFX1BSSU9SSVRZX0NMQVNTKTsKKyAgICAgICAgY29uc29sZV9wcmludGYoIj09PiBQcmlvcml0eSBzZXQgdG8gTG93LlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAyOgorICAgICAgICBTZXRQcmlvcml0eUNsYXNzTWFjcm8oTk9STUFMX1BSSU9SSVRZX0NMQVNTKTsKKyAgICAgICAgY29uc29sZV9wcmludGYoIj09PiBQcmlvcml0eSBzZXQgdG8gTm9ybWFsLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgICAgIFNldFByaW9yaXR5Q2xhc3NNYWNybyhISUdIX1BSSU9SSVRZX0NMQVNTKTsKKyAgICAgICAgY29uc29sZV9wcmludGYoIj09PiBQcmlvcml0eSBzZXQgdG8gSGlnaC5cbiIpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX09TMl9fKQorLyogT1MvMiBwcmlvcml0eSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQKK3NldE9TMlByaW9yaXR5KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgUHJpb3JpdHkpCit7CisgICAgaW50ICAgICByYzsKKworICAgIHN3aXRjaCAoUHJpb3JpdHkpIHsKKworICAgIGNhc2UgMDoKKyAgICAgICAgcmMgPSBEb3NTZXRQcmlvcml0eSgwLCAvKiBTY29wZTogb25seSBvbmUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSVFlDX0lETEUsIC8qIHNlbGVjdCBwcmlvcml0eSBjbGFzcyAoaWRsZSwgcmVndWxhciwgZXRjKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHNldCBkZWx0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKiBBc3N1bWUgY3VycmVudCBwcm9jZXNzICovCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCI9PT4gUHJpb3JpdHkgc2V0IHRvIDAgKExvdyBwcmlvcml0eSkuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgIHJjID0gRG9zU2V0UHJpb3JpdHkoMCwgLyogU2NvcGU6IG9ubHkgb25lIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlRZQ19JRExFLCAvKiBzZWxlY3QgcHJpb3JpdHkgY2xhc3MgKGlkbGUsIHJlZ3VsYXIsIGV0YykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlRZRF9NQVhJTVVNLCAvKiBzZXQgZGVsdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLyogQXNzdW1lIGN1cnJlbnQgcHJvY2VzcyAqLworICAgICAgICBjb25zb2xlX3ByaW50ZigiPT0+IFByaW9yaXR5IHNldCB0byAxIChNZWRpdW0gcHJpb3JpdHkpLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgICByYyA9IERvc1NldFByaW9yaXR5KDAsIC8qIFNjb3BlOiBvbmx5IG9uZSBwcm9jZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJUWUNfUkVHVUxBUiwgLyogc2VsZWN0IHByaW9yaXR5IGNsYXNzIChpZGxlLCByZWd1bGFyLCBldGMpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJUWURfTUlOSU1VTSwgLyogc2V0IGRlbHRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qIEFzc3VtZSBjdXJyZW50IHByb2Nlc3MgKi8KKyAgICAgICAgY29uc29sZV9wcmludGYoIj09PiBQcmlvcml0eSBzZXQgdG8gMiAoUmVndWxhciBwcmlvcml0eSkuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgICAgIHJjID0gRG9zU2V0UHJpb3JpdHkoMCwgLyogU2NvcGU6IG9ubHkgb25lIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlRZQ19SRUdVTEFSLCAvKiBzZWxlY3QgcHJpb3JpdHkgY2xhc3MgKGlkbGUsIHJlZ3VsYXIsIGV0YykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBzZXQgZGVsdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLyogQXNzdW1lIGN1cnJlbnQgcHJvY2VzcyAqLworICAgICAgICBjb25zb2xlX3ByaW50ZigiPT0+IFByaW9yaXR5IHNldCB0byAzIChIaWdoIHByaW9yaXR5KS5cbiIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICAgICAgcmMgPSBEb3NTZXRQcmlvcml0eSgwLCAvKiBTY29wZTogb25seSBvbmUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSVFlDX1JFR1VMQVIsIC8qIHNlbGVjdCBwcmlvcml0eSBjbGFzcyAoaWRsZSwgcmVndWxhciwgZXRjKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSVFlEX01BWElNVU0sIC8qIHNldCBkZWx0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKiBBc3N1bWUgY3VycmVudCBwcm9jZXNzICovCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCI9PT4gUHJpb3JpdHkgc2V0IHRvIDQgKE1heGltdW0gcHJpb3JpdHkpLiBJIGhvcGUgeW91IGVuam95IGl0IDopXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBjb25zb2xlX3ByaW50ZigiPT0+IEludmFsaWQgcHJpb3JpdHkgc3BlY2lmaWVkISBBc3N1bWluZyBpZGxlIHByaW9yaXR5LlxuIik7CisgICAgfQorCisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKK2V4dGVybiBpbnQKK2lkM3RhZ19zZXRfdGV4dGluZm9fdWNzMihsYW1lX2dsb2JhbF9mbGFncyogZ2ZwLCBjaGFyIGNvbnN0KiBpZCwgdW5zaWduZWQgc2hvcnQgY29uc3QqIHRleHQpOworCitleHRlcm4gaW50CitpZDN0YWdfc2V0X2NvbW1lbnRfdWNzMihsYW1lX2dsb2JhbF9mbGFncyogZ2ZwLCBjaGFyIGNvbnN0KiBsbmcsIHVuc2lnbmVkIHNob3J0IGNvbnN0KiBkZXNjLCB1bnNpZ25lZCBzaG9ydCBjb25zdCogdGV4dCk7CisKKy8qIHBvc3NpYmxlIHRleHQgZW5jb2RpbmdzICovCit0eXBlZGVmIGVudW0gVGV4dEVuY29kaW5nCit7IFRFTkNfUkFXICAgICAvKiBieXRlcyB3aWxsIGJlIHN0b3JlZCBhcy1pcyBpbnRvIElEMyB0YWdzLCB3aGljaCBhcmUgTGF0aW4xL1VDUzIgcGVyIGRlZmluaXRpb24gKi8KKywgVEVOQ19MQVRJTjEgIC8qIHRleHQgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBsb2NhbCBlbmNvZGluZyB0byBMYXRpbjEsIGFzIElEMyBuZWVkcyBpdCAqLworLCBURU5DX1VDUzIgICAgLyogdGV4dCB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIGxvY2FsIGVuY29kaW5nIHRvIFVDUy0yLCBhcyBJRDN2MiB3YW50cyBpdCAqLworfSBUZXh0RW5jb2Rpbmc7CisKKyNpZmRlZiBIQVZFX0lDT05WCisKKy8qIHNlYXJjaCBmb3IgWmVybyB0ZXJtaW5hdGlvbiBpbiBtdWx0aS1ieXRlIHN0cmluZ3MgKi8KK3N0YXRpYyBzaXplX3QKK3N0cmxlbk11bHRpQnl0ZShjaGFyIGNvbnN0KiBzdHIsIHNpemVfdCB3KQoreyAgICAKKyAgICBzaXplX3QgbiA9IDA7CisgICAgaWYgKHN0ciAhPSAwKSB7CisgICAgICAgIHNpemVfdCBpLCB4ID0gMDsKKyAgICAgICAgZm9yIChuID0gMDsgOyArK24pIHsKKyAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworICAgICAgICAgICAgICAgIHggKz0gKnN0cisrID09IDAgPyAxIDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh4ID09IHcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbjsKK30KKworCitzdGF0aWMgc2l6ZV90CitjdXJyQ2hhckNvZGVTaXplKHZvaWQpCit7CisgICAgc2l6ZV90IG4gPSAxOworICAgIGNoYXIgZHN0WzMyXTsKKyAgICBjaGFyKiBzcmMgPSAiQSI7CisgICAgY2hhciogZW52X2xhbmcgPSBnZXRlbnYoIkxBTkciKTsKKyAgICBjaGFyKiB4eHhfY29kZSA9IGVudl9sYW5nID09IE5VTEwgPyBOVUxMIDogc3RycmNocihlbnZfbGFuZywgJy4nKTsKKyAgICBjaGFyKiBjdXJfY29kZSA9IHh4eF9jb2RlID09IE5VTEwgPyAiIiA6IHh4eF9jb2RlKzE7CisgICAgaWNvbnZfdCB4aWNvbnYgPSBpY29udl9vcGVuKGN1cl9jb2RlLCAiSVNPXzg4NTktMSIpOworICAgIGlmICh4aWNvbnYgIT0gKGljb252X3QpLTEpIHsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDMyOyArK24pIHsKKyAgICAgICAgICAgIGNoYXIqIGlfcHRyID0gc3JjOworICAgICAgICAgICAgY2hhciogb19wdHIgPSBkc3Q7CisgICAgICAgICAgICBzaXplX3Qgc3JjbG4gPSAxOworICAgICAgICAgICAgc2l6ZV90IGF2YWlsID0gbjsKKyAgICAgICAgICAgIHNpemVfdCByYyA9IGljb252KHhpY29udiwgJmlfcHRyLCAmc3JjbG4sICZvX3B0ciwgJmF2YWlsKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSAoc2l6ZV90KS0xKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWNvbnZfY2xvc2UoeGljb252KTsKKyAgICB9CisgICAgcmV0dXJuIG47Cit9CisKKyNpZiAwCitzdGF0aWMKK2NoYXIqIGZyb21MYXRpbjEoIGNoYXIqIHNyYyApCit7CisgICAgY2hhciogZHN0ID0gMDsKKyAgICBpZiAoc3JjICE9IDApIHsKKyAgICAgICAgc2l6ZV90IGNvbnN0IGwgPSBzdHJsZW4oc3JjKTsKKyAgICAgICAgc2l6ZV90IGNvbnN0IG4gPSBsKjQ7CisgICAgICAgIGRzdCA9IGNhbGxvYyhuKzQsIDQpOworICAgICAgICBpZiAoZHN0ICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIqIGVudl9sYW5nID0gZ2V0ZW52KCJMQU5HIik7CisgICAgICAgICAgICBjaGFyKiB4eHhfY29kZSA9IGVudl9sYW5nID09IE5VTEwgPyBOVUxMIDogc3RycmNocihlbnZfbGFuZywgJy4nKTsKKyAgICAgICAgICAgIGNoYXIqIGN1cl9jb2RlID0geHh4X2NvZGUgPT0gTlVMTCA/ICIiIDogeHh4X2NvZGUrMTsKKyAgICAgICAgICAgIGljb252X3QgeGljb252ID0gaWNvbnZfb3BlbihjdXJfY29kZSwgIklTT184ODU5LTEiKTsKKyAgICAgICAgICAgIGlmICh4aWNvbnYgIT0gKGljb252X3QpLTEpIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBpX3B0ciA9IHNyYzsKKyAgICAgICAgICAgICAgICBjaGFyKiBvX3B0ciA9IGRzdDsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3JjbG4gPSBsOworICAgICAgICAgICAgICAgIHNpemVfdCBhdmFpbCA9IG47ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGljb252KHhpY29udiwgJmlfcHRyLCAmc3JjbG4sICZvX3B0ciwgJmF2YWlsKTsKKyAgICAgICAgICAgICAgICBpY29udl9jbG9zZSh4aWNvbnYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkc3Q7Cit9CisKK3N0YXRpYworY2hhciogZnJvbVVjczIoIGNoYXIqIHNyYyApCit7CisgICAgY2hhciogZHN0ID0gMDsKKyAgICBpZiAoc3JjICE9IDApIHsKKyAgICAgICAgc2l6ZV90IGNvbnN0IGwgPSBzdHJsZW5NdWx0aUJ5dGUoc3JjLCAyKTsKKyAgICAgICAgc2l6ZV90IGNvbnN0IG4gPSBsKjQ7CisgICAgICAgIGRzdCA9IGNhbGxvYyhuKzQsIDQpOworICAgICAgICBpZiAoZHN0ICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIqIGVudl9sYW5nID0gZ2V0ZW52KCJMQU5HIik7CisgICAgICAgICAgICBjaGFyKiB4eHhfY29kZSA9IGVudl9sYW5nID09IE5VTEwgPyBOVUxMIDogc3RycmNocihlbnZfbGFuZywgJy4nKTsKKyAgICAgICAgICAgIGNoYXIqIGN1cl9jb2RlID0geHh4X2NvZGUgPT0gTlVMTCA/ICIiIDogeHh4X2NvZGUrMTsKKyAgICAgICAgICAgIGljb252X3QgeGljb252ID0gaWNvbnZfb3BlbihjdXJfY29kZSwgIlVDUy0yTEUiKTsKKyAgICAgICAgICAgIGlmICh4aWNvbnYgIT0gKGljb252X3QpLTEpIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBpX3B0ciA9IChjaGFyKilzcmM7CisgICAgICAgICAgICAgICAgY2hhciogb19wdHIgPSBkc3Q7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNyY2xuID0gbCoyOworICAgICAgICAgICAgICAgIHNpemVfdCBhdmFpbCA9IG47ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGljb252KHhpY29udiwgJmlfcHRyLCAmc3JjbG4sICZvX3B0ciwgJmF2YWlsKTsKKyAgICAgICAgICAgICAgICBpY29udl9jbG9zZSh4aWNvbnYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkc3Q7Cit9CisjZW5kaWYKKworc3RhdGljCitjaGFyKiB0b0xhdGluMSggY2hhciogc3JjICkKK3sKKyAgICBzaXplX3QgdyA9IGN1cnJDaGFyQ29kZVNpemUoKTsKKyAgICBjaGFyKiBkc3QgPSAwOworICAgIGlmIChzcmMgIT0gMCkgeworICAgICAgICBzaXplX3QgY29uc3QgbCA9IHN0cmxlbk11bHRpQnl0ZShzcmMsIHcpOworICAgICAgICBzaXplX3QgY29uc3QgbiA9IGwqNDsKKyAgICAgICAgZHN0ID0gY2FsbG9jKG4rNCwgNCk7CisgICAgICAgIGlmIChkc3QgIT0gMCkgeworICAgICAgICAgICAgY2hhciogZW52X2xhbmcgPSBnZXRlbnYoIkxBTkciKTsKKyAgICAgICAgICAgIGNoYXIqIHh4eF9jb2RlID0gZW52X2xhbmcgPT0gTlVMTCA/IE5VTEwgOiBzdHJyY2hyKGVudl9sYW5nLCAnLicpOworICAgICAgICAgICAgY2hhciogY3VyX2NvZGUgPSB4eHhfY29kZSA9PSBOVUxMID8gIiIgOiB4eHhfY29kZSsxOworICAgICAgICAgICAgaWNvbnZfdCB4aWNvbnYgPSBpY29udl9vcGVuKCJJU09fODg1OS0xIiwgY3VyX2NvZGUpOworICAgICAgICAgICAgaWYgKHhpY29udiAhPSAoaWNvbnZfdCktMSkgeworICAgICAgICAgICAgICAgIGNoYXIqIGlfcHRyID0gKGNoYXIqKXNyYzsKKyAgICAgICAgICAgICAgICBjaGFyKiBvX3B0ciA9IGRzdDsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3JjbG4gPSBsKnc7CisgICAgICAgICAgICAgICAgc2l6ZV90IGF2YWlsID0gbjsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWNvbnYoeGljb252LCAmaV9wdHIsICZzcmNsbiwgJm9fcHRyLCAmYXZhaWwpOworICAgICAgICAgICAgICAgIGljb252X2Nsb3NlKHhpY29udik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRzdDsKK30KKworCitzdGF0aWMKK2NoYXIqIHRvVWNzMiggY2hhciogc3JjICkKK3sKKyAgICBzaXplX3QgdyA9IGN1cnJDaGFyQ29kZVNpemUoKTsKKyAgICBjaGFyKiBkc3QgPSAwOworICAgIGlmIChzcmMgIT0gMCkgeworICAgICAgICBzaXplX3QgY29uc3QgbCA9IHN0cmxlbk11bHRpQnl0ZShzcmMsIHcpOworICAgICAgICBzaXplX3QgY29uc3QgbiA9IChsKzEpKjQ7CisgICAgICAgIGRzdCA9IGNhbGxvYyhuKzQsIDQpOworICAgICAgICBpZiAoZHN0ICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIqIGVudl9sYW5nID0gZ2V0ZW52KCJMQU5HIik7CisgICAgICAgICAgICBjaGFyKiB4eHhfY29kZSA9IGVudl9sYW5nID09IE5VTEwgPyBOVUxMIDogc3RycmNocihlbnZfbGFuZywgJy4nKTsKKyAgICAgICAgICAgIGNoYXIqIGN1cl9jb2RlID0geHh4X2NvZGUgPT0gTlVMTCA/ICIiIDogeHh4X2NvZGUrMTsKKyAgICAgICAgICAgIGljb252X3QgeGljb252ID0gaWNvbnZfb3BlbigiVUNTLTJMRSIsIGN1cl9jb2RlKTsKKyAgICAgICAgICAgIGRzdFswXSA9IDB4ZmY7CisgICAgICAgICAgICBkc3RbMV0gPSAweGZlOworICAgICAgICAgICAgaWYgKHhpY29udiAhPSAoaWNvbnZfdCktMSkgeworICAgICAgICAgICAgICAgIGNoYXIqIGlfcHRyID0gKGNoYXIqKXNyYzsKKyAgICAgICAgICAgICAgICBjaGFyKiBvX3B0ciA9ICZkc3RbMl07CisgICAgICAgICAgICAgICAgc2l6ZV90IHNyY2xuID0gbCp3OworICAgICAgICAgICAgICAgIHNpemVfdCBhdmFpbCA9IG47ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGljb252KHhpY29udiwgJmlfcHRyLCAmc3JjbG4sICZvX3B0ciwgJmF2YWlsKTsKKyAgICAgICAgICAgICAgICBpY29udl9jbG9zZSh4aWNvbnYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkc3Q7Cit9CisKKworc3RhdGljIGludAorc2V0X2lkM3YydGFnKGxhbWVfZ2xvYmFsX2ZsYWdzKiBnZnAsIGludCB0eXBlLCB1bnNpZ25lZCBzaG9ydCBjb25zdCogc3RyKQoreworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgJ2EnOiByZXR1cm4gaWQzdGFnX3NldF90ZXh0aW5mb191Y3MyKGdmcCwgIlRQRTEiLCBzdHIpOworICAgICAgICBjYXNlICd0JzogcmV0dXJuIGlkM3RhZ19zZXRfdGV4dGluZm9fdWNzMihnZnAsICJUSVQyIiwgc3RyKTsKKyAgICAgICAgY2FzZSAnbCc6IHJldHVybiBpZDN0YWdfc2V0X3RleHRpbmZvX3VjczIoZ2ZwLCAiVEFMQiIsIHN0cik7CisgICAgICAgIGNhc2UgJ2cnOiByZXR1cm4gaWQzdGFnX3NldF90ZXh0aW5mb191Y3MyKGdmcCwgIlRDT04iLCBzdHIpOworICAgICAgICBjYXNlICdjJzogcmV0dXJuIGlkM3RhZ19zZXRfY29tbWVudF91Y3MyKGdmcCwgMCwgMCwgc3RyKTsKKyAgICAgICAgY2FzZSAnbic6IHJldHVybiBpZDN0YWdfc2V0X3RleHRpbmZvX3VjczIoZ2ZwLCAiVFJDSyIsIHN0cik7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3NldF9pZDN0YWcobGFtZV9nbG9iYWxfZmxhZ3MqIGdmcCwgaW50IHR5cGUsIGNoYXIgY29uc3QqIHN0cikKK3sKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlICdhJzogcmV0dXJuIGlkM3RhZ19zZXRfYXJ0aXN0KGdmcCwgc3RyKSwgMDsKKyAgICAgICAgY2FzZSAndCc6IHJldHVybiBpZDN0YWdfc2V0X3RpdGxlKGdmcCwgc3RyKSwgMDsKKyAgICAgICAgY2FzZSAnbCc6IHJldHVybiBpZDN0YWdfc2V0X2FsYnVtKGdmcCwgc3RyKSwgMDsKKyAgICAgICAgY2FzZSAnZyc6IHJldHVybiBpZDN0YWdfc2V0X2dlbnJlKGdmcCwgc3RyKTsKKyAgICAgICAgY2FzZSAnYyc6IHJldHVybiBpZDN0YWdfc2V0X2NvbW1lbnQoZ2ZwLCBzdHIpLCAwOworICAgICAgICBjYXNlICduJzogcmV0dXJuIGlkM3RhZ19zZXRfdHJhY2soZ2ZwLCBzdHIpOworICAgICAgICBjYXNlICd5JzogcmV0dXJuIGlkM3RhZ19zZXRfeWVhcihnZnAsIHN0ciksIDA7CisgICAgICAgIGNhc2UgJ3YnOiByZXR1cm4gaWQzdGFnX3NldF9maWVsZHZhbHVlKGdmcCwgc3RyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lkM190YWcobGFtZV9nbG9iYWxfZmxhZ3MqIGdmcCwgaW50IHR5cGUsIFRleHRFbmNvZGluZyBlbmMsIGNoYXIqIHN0cikKK3sKKyAgICB2b2lkKiB4ID0gMDsKKyAgICBpbnQgcmVzdWx0OworICAgIHN3aXRjaCAoZW5jKSAKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgVEVOQ19SQVc6ICAgIHggPSBzdHJkdXAoc3RyKTsgICBicmVhazsKKyNpZmRlZiBIQVZFX0lDT05WCisgICAgICAgIGNhc2UgVEVOQ19MQVRJTjE6IHggPSB0b0xhdGluMShzdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSBURU5DX1VDUzI6ICAgeCA9IHRvVWNzMihzdHIpOyAgIGJyZWFrOworI2VuZGlmCisgICAgfQorICAgIHN3aXRjaCAoZW5jKQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBURU5DX1JBVzoKKyAgICAgICAgY2FzZSBURU5DX0xBVElOMTogcmVzdWx0ID0gc2V0X2lkM3RhZyhnZnAsIHR5cGUsIHgpOyAgIGJyZWFrOworI2lmZGVmIEhBVkVfSUNPTlYKKyAgICAgICAgY2FzZSBURU5DX1VDUzI6ICAgcmVzdWx0ID0gc2V0X2lkM3YydGFnKGdmcCwgdHlwZSwgeCk7IGJyZWFrOworI2VuZGlmCisgICAgfQorICAgIGZyZWUoeCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBsaWNlbnNlCisqCisqIFBVUlBPU0U6ICBXcml0ZXMgdmVyc2lvbiBhbmQgbGljZW5zZSB0byB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgZnAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorbGFtZV92ZXJzaW9uX3ByaW50KEZJTEUgKiBjb25zdCBmcCkKK3sKKyAgICBjb25zdCBjaGFyICpiID0gZ2V0X2xhbWVfb3NfYml0bmVzcygpOworICAgIGNvbnN0IGNoYXIgKnYgPSBnZXRfbGFtZV92ZXJzaW9uKCk7CisgICAgY29uc3QgY2hhciAqdSA9IGdldF9sYW1lX3VybCgpOworICAgIGNvbnN0IHNpemVfdCBsZW5iID0gc3RybGVuKGIpOworICAgIGNvbnN0IHNpemVfdCBsZW52ID0gc3RybGVuKHYpOworICAgIGNvbnN0IHNpemVfdCBsZW51ID0gc3RybGVuKHUpOworICAgIGNvbnN0IHNpemVfdCBsdyA9IDgwOyAgICAgICAvKiBsaW5lIHdpZHRoIG9mIHRlcm1pbmFsIGluIGNoYXJhY3RlcnMgKi8KKyAgICBjb25zdCBzaXplX3Qgc3cgPSAxNjsgICAgICAgLyogc3RhdGljIHdpZHRoIG9mIHRleHQgKi8KKworICAgIGlmIChsdyA+PSBsZW5iICsgbGVudiArIGxlbnUgKyBzdyB8fCBsdyA8IGxlbnUgKyAyKQorICAgICAgICAvKiB0ZXh0IGZpdHMgaW4gODAgY2hhcnMgcGVyIGxpbmUsIG9yIGxpbmUgZXZlbiB0b28gc21hbGwgZm9yIHVybCAqLworICAgICAgICBpZiAobGVuYiA+IDApCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiTEFNRSAlcyB2ZXJzaW9uICVzICglcylcblxuIiwgYiwgdiwgdSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJMQU1FIHZlcnNpb24gJXMgKCVzKVxuXG4iLCB2LCB1KTsKKyAgICBlbHNlCisgICAgICAgIC8qIHRleHQgdG9vIGxvbmcsIHdyYXAgdXJsIGludG8gbmV4dCBsaW5lLCByaWdodCBhbGlnbmVkICovCisgICAgaWYgKGxlbmIgPiAwKQorICAgICAgICBmcHJpbnRmKGZwLCAiTEFNRSAlcyB2ZXJzaW9uICVzXG4lKnMoJXMpXG5cbiIsIGIsIHYsIGx3IC0gMiAtIGxlbnUsICIiLCB1KTsKKyAgICBlbHNlCisgICAgICAgIGZwcmludGYoZnAsICJMQU1FIHZlcnNpb24gJXNcbiUqcyglcylcblxuIiwgdiwgbHcgLSAyIC0gbGVudSwgIiIsIHUpOworCisgICAgaWYgKExBTUVfQUxQSEFfVkVSU0lPTikKKyAgICAgICAgZnByaW50ZihmcCwgIndhcm5pbmc6IGFscGhhIHZlcnNpb25zIHNob3VsZCBiZSB1c2VkIGZvciB0ZXN0aW5nIG9ubHlcblxuIik7CisKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmludF9saWNlbnNlKEZJTEUgKiBjb25zdCBmcCkKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW50IHZlcnNpb24gJiBsaWNlbnNlICovCisgICAgbGFtZV92ZXJzaW9uX3ByaW50KGZwKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIkNhbiBJIHVzZSBMQU1FIGluIG15IGNvbW1lcmNpYWwgcHJvZ3JhbT9cbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJZZXMsIHlvdSBjYW4sIHVuZGVyIHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIExHUEwuICBJbiBwYXJ0aWN1bGFyLCB5b3VcbiIKKyAgICAgICAgICAgICJjYW4gaW5jbHVkZSBhIGNvbXBpbGVkIHZlcnNpb24gb2YgdGhlIExBTUUgbGlicmFyeSAoZm9yIGV4YW1wbGUsXG4iCisgICAgICAgICAgICAibGFtZS5kbGwpIHdpdGggYSBjb21tZXJjaWFsIHByb2dyYW0uICBTb21lIG5vdGFibGUgcmVxdWlyZW1lbnRzIG9mXG4iCisgICAgICAgICAgICAidGhlIExHUEw6XG4iICJcbiIpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiMS4gSW4geW91ciBwcm9ncmFtLCB5b3UgY2Fubm90IGluY2x1ZGUgYW55IHNvdXJjZSBjb2RlIGZyb20gTEFNRSwgd2l0aFxuIgorICAgICAgICAgICAgIiAgIHRoZSBleGNlcHRpb24gb2YgZmlsZXMgd2hvc2Ugb25seSBwdXJwb3NlIGlzIHRvIGRlc2NyaWJlIHRoZSBsaWJyYXJ5XG4iCisgICAgICAgICAgICAiICAgaW50ZXJmYWNlIChzdWNoIGFzIGxhbWUuaCkuXG4iICJcbiIpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiMi4gQW55IG1vZGlmaWNhdGlvbnMgb2YgTEFNRSBtdXN0IGJlIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMLlxuIgorICAgICAgICAgICAgIiAgIFRoZSBMQU1FIHByb2plY3QgKHd3dy5tcDNkZXYub3JnKSB3b3VsZCBhcHByZWNpYXRlIGJlaW5nXG4iCisgICAgICAgICAgICAiICAgbm90aWZpZWQgb2YgYW55IG1vZGlmaWNhdGlvbnMuXG4iICJcbiIpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiMy4gWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHRoYXQgeW91ciBwcm9ncmFtIGlzOlxuIgorICAgICAgICAgICAgIiAgICAgIEEuIHVzaW5nIExBTUUgKGluY2x1ZGluZyB2ZXJzaW9uIG51bWJlcilcbiIKKyAgICAgICAgICAgICIgICAgICBCLiBMQU1FIGlzIHVuZGVyIHRoZSBMR1BMXG4iCisgICAgICAgICAgICAiICAgICAgQy4gUHJvdmlkZSBhIGNvcHkgb2YgdGhlIExHUEwuICAodGhlIGZpbGUgQ09QWUlORyBjb250YWlucyB0aGUgTEdQTClcbiIKKyAgICAgICAgICAgICIgICAgICBELiBQcm92aWRlIGEgY29weSBvZiBMQU1FIHNvdXJjZSwgb3IgYSBwb2ludGVyIHdoZXJlIHRoZSBMQU1FXG4iCisgICAgICAgICAgICAiICAgICAgICAgc291cmNlIGNhbiBiZSBvYnRhaW5lZCAoc3VjaCBhcyB3d3cubXAzZGV2Lm9yZylcbiIKKyAgICAgICAgICAgICIgICBBbiBleGFtcGxlIG9mIHByb21pbmVudCBub3RpY2Ugd291bGQgYmUgYW4gXCJBYm91dCB0aGUgTEFNRSBlbmNvZGluZyBlbmdpbmVcIlxuIgorICAgICAgICAgICAgIiAgIGJ1dHRvbiBpbiBzb21lIHB1bGwgZG93biBtZW51IHdpdGhpbiB0aGUgZXhlY3V0YWJsZSBvZiB5b3VyIHByb2dyYW0uXG4iICJcbiIpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiNC4gSWYgeW91IGRldGVybWluZSB0aGF0IGRpc3RyaWJ1dGlvbiBvZiBMQU1FIHJlcXVpcmVzIGEgcGF0ZW50IGxpY2Vuc2UsXG4iCisgICAgICAgICAgICAiICAgeW91IG11c3Qgb2J0YWluIHN1Y2ggbGljZW5zZS5cbiIgIlxuIiAiXG4iKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIioqKiBJTVBPUlRBTlQgTk9URSAqKipcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJUaGUgZGVjb2RpbmcgZnVuY3Rpb25zIHByb3ZpZGVkIGluIExBTUUgdXNlIHRoZSBtcGdsaWIgZGVjb2RpbmcgZW5naW5lIHdoaWNoXG4iCisgICAgICAgICAgICAiaXMgdW5kZXIgdGhlIEdQTC4gIFRoZXkgbWF5IG5vdCBiZSB1c2VkIGJ5IGFueSBwcm9ncmFtIG5vdCByZWxlYXNlZCB1bmRlciB0aGVcbiIKKyAgICAgICAgICAgICJHUEwgdW5sZXNzIHlvdSBvYnRhaW4gc3VjaCBwZXJtaXNzaW9uIGZyb20gdGhlIE1QRzEyMyBwcm9qZWN0ICh3d3cubXBnMTIzLmRlKS5cbiIKKyAgICAgICAgICAgICJcbiIpOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogdXNhZ2UKKyoKKyogUFVSUE9TRTogIFdyaXRlcyBjb21tYW5kIGxpbmUgc3ludGF4IHRvIHRoZSBmaWxlIHNwZWNpZmllZCBieSBmcAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK3VzYWdlKEZJTEUgKiBjb25zdCBmcCwgY29uc3QgY2hhciAqUHJvZ3JhbU5hbWUpCit7ICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmludCBnZW5lcmFsIHN5bnRheCAqLworICAgIGxhbWVfdmVyc2lvbl9wcmludChmcCk7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICJ1c2FnZTogJXMgW29wdGlvbnNdIDxpbmZpbGU+IFtvdXRmaWxlXVxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiAgICA8aW5maWxlPiBhbmQvb3IgPG91dGZpbGU+IGNhbiBiZSBcIi1cIiwgd2hpY2ggbWVhbnMgc3RkaW4vc3Rkb3V0LlxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIlRyeTpcbiIKKyAgICAgICAgICAgICIgICAgIFwiJXMgLS1oZWxwXCIgICAgICAgICAgIGZvciBnZW5lcmFsIHVzYWdlIGluZm9ybWF0aW9uXG4iCisgICAgICAgICAgICAiIG9yOlxuIgorICAgICAgICAgICAgIiAgICAgXCIlcyAtLXByZXNldCBoZWxwXCIgICAgZm9yIGluZm9ybWF0aW9uIG9uIHN1Z2dlc3RlZCBwcmVkZWZpbmVkIHNldHRpbmdzXG4iCisgICAgICAgICAgICAiIG9yOlxuIgorICAgICAgICAgICAgIiAgICAgXCIlcyAtLWxvbmdoZWxwXCJcbiIKKyAgICAgICAgICAgICIgIG9yIFwiJXMgLT9cIiAgICAgICAgICAgICAgZm9yIGEgY29tcGxldGUgb3B0aW9ucyBsaXN0XG5cbiIsCisgICAgICAgICAgICBQcm9ncmFtTmFtZSwgUHJvZ3JhbU5hbWUsIFByb2dyYW1OYW1lLCBQcm9ncmFtTmFtZSwgUHJvZ3JhbU5hbWUpOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogdXNhZ2UKKyoKKyogUFVSUE9TRTogIFdyaXRlcyBjb21tYW5kIGxpbmUgc3ludGF4IHRvIHRoZSBmaWxlIHNwZWNpZmllZCBieSBmcAorKiAgICAgICAgICAgYnV0IG9ubHkgdGhlIG1vc3QgaW1wb3J0YW50IG9uZXMsIHRvIGZpdCBvbiBhIHZ0MTAwIHRlcm1pbmFsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAorc2hvcnRfaGVscChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgRklMRSAqIGNvbnN0IGZwLCBjb25zdCBjaGFyICpQcm9ncmFtTmFtZSkKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW50IHNob3J0IHN5bnRheCBoZWxwICovCisgICAgbGFtZV92ZXJzaW9uX3ByaW50KGZwKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgInVzYWdlOiAlcyBbb3B0aW9uc10gPGluZmlsZT4gW291dGZpbGVdXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiICAgIDxpbmZpbGU+IGFuZC9vciA8b3V0ZmlsZT4gY2FuIGJlIFwiLVwiLCB3aGljaCBtZWFucyBzdGRpbi9zdGRvdXQuXG4iCisgICAgICAgICAgICAiXG4iICJSRUNPTU1FTkRFRDpcbiIgIiAgICBsYW1lIC1WMiBpbnB1dC53YXYgb3V0cHV0Lm1wM1xuIiAiXG4iLCBQcm9ncmFtTmFtZSk7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICJPUFRJT05TOlxuIgorICAgICAgICAgICAgIiAgICAtYiBiaXRyYXRlICAgICAgc2V0IHRoZSBiaXRyYXRlLCBkZWZhdWx0IDEyOCBrYnBzXG4iCisgICAgICAgICAgICAiICAgIC1oICAgICAgICAgICAgICBoaWdoZXIgcXVhbGl0eSwgYnV0IGEgbGl0dGxlIHNsb3dlci4gIFJlY29tbWVuZGVkLlxuIgorICAgICAgICAgICAgIiAgICAtZiAgICAgICAgICAgICAgZmFzdCBtb2RlIChsb3dlciBxdWFsaXR5KVxuIgorICAgICAgICAgICAgIiAgICAtViBuICAgICAgICAgICAgcXVhbGl0eSBzZXR0aW5nIGZvciBWQlIuICBkZWZhdWx0IG49JWlcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDA9aGlnaCBxdWFsaXR5LGJpZ2dlciBmaWxlcy4gOT1zbWFsbGVyIGZpbGVzXG4iLAorICAgICAgICAgICAgbGFtZV9nZXRfVkJSX3EoZ2ZwKSk7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgICAgLS1wcmVzZXQgdHlwZSAgIHR5cGUgbXVzdCBiZSBcIm1lZGl1bVwiLCBcInN0YW5kYXJkXCIsIFwiZXh0cmVtZVwiLCBcImluc2FuZVwiLFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgb3IgYSB2YWx1ZSBmb3IgYW4gYXZlcmFnZSBkZXNpcmVkIGJpdHJhdGUgYW5kIGRlcGVuZGluZ1xuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgb24gdGhlIHZhbHVlIHNwZWNpZmllZCwgYXBwcm9wcmlhdGUgcXVhbGl0eSBzZXR0aW5ncyB3aWxsXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBiZSB1c2VkLlxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgXCItLXByZXNldCBoZWxwXCIgZ2l2ZXMgbW9yZSBpbmZvIG9uIHRoZXNlXG4iICJcbiIpOworICAgIGZwcmludGYoZnAsCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgICAgICAgICIgICAgLS1wcmlvcml0eSB0eXBlICBzZXRzIHRoZSBwcm9jZXNzIHByaW9yaXR5XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgMCwxID0gTG93IHByaW9yaXR5XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgMiAgID0gbm9ybWFsIHByaW9yaXR5XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgMyw0ID0gSGlnaCBwcmlvcml0eVxuIiAiXG4iCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fT1MyX18pCisgICAgICAgICAgICAiICAgIC0tcHJpb3JpdHkgdHlwZSAgc2V0cyB0aGUgcHJvY2VzcyBwcmlvcml0eVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIDAgPSBMb3cgcHJpb3JpdHlcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAxID0gTWVkaXVtIHByaW9yaXR5XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgMiA9IFJlZ3VsYXIgcHJpb3JpdHlcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAzID0gSGlnaCBwcmlvcml0eVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIDQgPSBNYXhpbXVtIHByaW9yaXR5XG4iICJcbiIKKyNlbmRpZgorICAgICAgICAgICAgIiAgICAtLWxvbmdoZWxwICAgICAgZnVsbCBsaXN0IG9mIG9wdGlvbnNcbiIgIlxuIgorICAgICAgICAgICAgIiAgICAtLWxpY2Vuc2UgICAgICAgcHJpbnQgTGljZW5zZSBpbmZvcm1hdGlvblxuXG4iCisgICAgICAgICAgICApOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogdXNhZ2UKKyoKKyogUFVSUE9TRTogIFdyaXRlcyBjb21tYW5kIGxpbmUgc3ludGF4IHRvIHRoZSBmaWxlIHNwZWNpZmllZCBieSBmcAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAord2FpdF9mb3IoRklMRSAqIGNvbnN0IGZwLCBpbnQgbGVzc21vZGUpCit7CisgICAgaWYgKGxlc3Ntb2RlKSB7CisgICAgICAgIGZmbHVzaChmcCk7CisgICAgICAgIGdldGNoYXIoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG4iKTsKK30KKworaW50Citsb25nX2hlbHAoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIEZJTEUgKiBjb25zdCBmcCwgY29uc3QgY2hhciAqUHJvZ3JhbU5hbWUsIGludCBsZXNzbW9kZSkKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW50IGxvbmcgc3ludGF4IGhlbHAgKi8KKyAgICBsYW1lX3ZlcnNpb25fcHJpbnQoZnApOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAidXNhZ2U6ICVzIFtvcHRpb25zXSA8aW5maWxlPiBbb3V0ZmlsZV1cbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIgICAgPGluZmlsZT4gYW5kL29yIDxvdXRmaWxlPiBjYW4gYmUgXCItXCIsIHdoaWNoIG1lYW5zIHN0ZGluL3N0ZG91dC5cbiIKKyAgICAgICAgICAgICJcbiIgIlJFQ09NTUVOREVEOlxuIiAiICAgIGxhbWUgLVYyIGlucHV0LndhdiBvdXRwdXQubXAzXG4iICJcbiIsIFByb2dyYW1OYW1lKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIk9QVElPTlM6XG4iCisgICAgICAgICAgICAiICBJbnB1dCBvcHRpb25zOlxuIgorICAgICAgICAgICAgIiAgICAtLXNjYWxlIDxhcmc+ICAgc2NhbGUgaW5wdXQgKG11bHRpcGx5IFBDTSBkYXRhKSBieSA8YXJnPlxuIgorICAgICAgICAgICAgIiAgICAtLXNjYWxlLWwgPGFyZz4gc2NhbGUgY2hhbm5lbCAwIChsZWZ0KSBpbnB1dCAobXVsdGlwbHkgUENNIGRhdGEpIGJ5IDxhcmc+XG4iCisgICAgICAgICAgICAiICAgIC0tc2NhbGUtciA8YXJnPiBzY2FsZSBjaGFubmVsIDEgKHJpZ2h0KSBpbnB1dCAobXVsdGlwbHkgUENNIGRhdGEpIGJ5IDxhcmc+XG4iCisjaWYgKGRlZmluZWQgSEFWRV9NUEdMSUIgfHwgZGVmaW5lZCBBTUlHQV9NUEVHQSkKKyAgICAgICAgICAgICIgICAgLS1tcDFpbnB1dCAgICAgIGlucHV0IGZpbGUgaXMgYSBNUEVHIExheWVyIEkgICBmaWxlXG4iCisgICAgICAgICAgICAiICAgIC0tbXAyaW5wdXQgICAgICBpbnB1dCBmaWxlIGlzIGEgTVBFRyBMYXllciBJSSAgZmlsZVxuIgorICAgICAgICAgICAgIiAgICAtLW1wM2lucHV0ICAgICAgaW5wdXQgZmlsZSBpcyBhIE1QRUcgTGF5ZXIgSUlJIGZpbGVcbiIKKyNlbmRpZgorICAgICAgICAgICAgIiAgICAtLW5vZ2FwIDxmaWxlMT4gPGZpbGUyPiA8Li4uPlxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZ2FwbGVzcyBlbmNvZGluZyBmb3IgYSBzZXQgb2YgY29udGlndW91cyBmaWxlc1xuIgorICAgICAgICAgICAgIiAgICAtLW5vZ2Fwb3V0IDxkaXI+XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZGlyIGZvciBnYXBsZXNzIGVuY29kaW5nIChtdXN0IHByZWNlZGUgLS1ub2dhcClcbiIKKyAgICAgICAgICAgICIgICAgLS1ub2dhcHRhZ3MgICAgIGFsbG93IHRoZSB1c2Ugb2YgVkJSIHRhZ3MgaW4gZ2FwbGVzcyBlbmNvZGluZ1xuIgorICAgICAgICAgICApOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiICBJbnB1dCBvcHRpb25zIGZvciBSQVcgUENNOlxuIgorICAgICAgICAgICAgIiAgICAtciAgICAgICAgICAgICAgaW5wdXQgaXMgcmF3IHBjbVxuIgorICAgICAgICAgICAgIiAgICAteCAgICAgICAgICAgICAgZm9yY2UgYnl0ZS1zd2FwcGluZyBvZiBpbnB1dFxuIgorICAgICAgICAgICAgIiAgICAtcyBzZnJlcSAgICAgICAgc2FtcGxpbmcgZnJlcXVlbmN5IG9mIGlucHV0IGZpbGUgKGtIeikgLSBkZWZhdWx0IDQ0LjEga0h6XG4iCisgICAgICAgICAgICAiICAgIC0tYml0d2lkdGggdyAgICBpbnB1dCBiaXQgd2lkdGggaXMgdyAoZGVmYXVsdCAxNilcbiIKKyAgICAgICAgICAgICIgICAgLS1zaWduZWQgICAgICAgIGlucHV0IGlzIHNpZ25lZCAoZGVmYXVsdClcbiIKKyAgICAgICAgICAgICIgICAgLS11bnNpZ25lZCAgICAgIGlucHV0IGlzIHVuc2lnbmVkXG4iCisgICAgICAgICAgICAiICAgIC0tbGl0dGxlLWVuZGlhbiBpbnB1dCBpcyBsaXR0bGUtZW5kaWFuIChkZWZhdWx0KVxuIgorICAgICAgICAgICAgIiAgICAtLWJpZy1lbmRpYW4gICAgaW5wdXQgaXMgYmlnLWVuZGlhblxuIgorICAgICAgICAgICApOworCisgICAgd2FpdF9mb3IoZnAsIGxlc3Ntb2RlKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIiAgT3BlcmF0aW9uYWwgb3B0aW9uczpcbiIKKyAgICAgICAgICAgICIgICAgLWEgICAgICAgICAgICAgIGRvd25taXggZnJvbSBzdGVyZW8gdG8gbW9ubyBmaWxlIGZvciBtb25vIGVuY29kaW5nXG4iCisgICAgICAgICAgICAiICAgIC1tIDxtb2RlPiAgICAgICAoailvaW50LCAocylpbXBsZSwgKGYpb3JjZSwgKGQpZHVhbC1tb25vLCAobSlvbm9cbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgKGopIG9yIChzKSBkZXBlbmRpbmcgb24gYml0cmF0ZVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgam9pbnQgID0gam9pbnMgdGhlIGJlc3QgcG9zc2libGUgb2YgTVMgYW5kIExSIHN0ZXJlb1xuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gZm9yY2UgTFIgc3RlcmVvIG9uIGFsbCBmcmFtZXNcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGZvcmNlICA9IGZvcmNlIE1TIHN0ZXJlbyBvbiBhbGwgZnJhbWVzLlxuIgorICAgICAgICAgICAgIiAgICAtLXByZXNldCB0eXBlICAgdHlwZSBtdXN0IGJlIFwibWVkaXVtXCIsIFwic3RhbmRhcmRcIiwgXCJleHRyZW1lXCIsIFwiaW5zYW5lXCIsXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBvciBhIHZhbHVlIGZvciBhbiBhdmVyYWdlIGRlc2lyZWQgYml0cmF0ZSBhbmQgZGVwZW5kaW5nXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBvbiB0aGUgdmFsdWUgc3BlY2lmaWVkLCBhcHByb3ByaWF0ZSBxdWFsaXR5IHNldHRpbmdzIHdpbGxcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQuXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBcIi0tcHJlc2V0IGhlbHBcIiBnaXZlcyBtb3JlIGluZm8gb24gdGhlc2VcbiIKKyAgICAgICAgICAgICIgICAgLS1jb21wICA8YXJnPiAgIGNob29zZSBiaXRyYXRlIHRvIGFjaGl2ZSBhIGNvbXByZXNzaW9uIHJhdGlvIG9mIDxhcmc+XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiICAgIC0tcmVwbGF5Z2Fpbi1mYXN0ICAgY29tcHV0ZSBSRyBmYXN0IGJ1dCBzbGlnaHRseSBpbmFjY3VyYXRlbHkgKGRlZmF1bHQpXG4iCisjaWZkZWYgREVDT0RFX09OX1RIRV9GTFkKKyAgICAgICAgICAgICIgICAgLS1yZXBsYXlnYWluLWFjY3VyYXRlICAgY29tcHV0ZSBSRyBtb3JlIGFjY3VyYXRlbHkgYW5kIGZpbmQgdGhlIHBlYWsgc2FtcGxlXG4iCisjZW5kaWYKKyAgICAgICAgICAgICIgICAgLS1ub3JlcGxheWdhaW4gIGRpc2FibGUgUmVwbGF5R2FpbiBhbmFseXNpc1xuIgorI2lmZGVmIERFQ09ERV9PTl9USEVfRkxZCisgICAgICAgICAgICAiICAgIC0tY2xpcGRldGVjdCAgICBlbmFibGUgLS1yZXBsYXlnYWluLWFjY3VyYXRlIGFuZCBwcmludCBhIG1lc3NhZ2Ugd2hldGhlclxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgY2xpcHBpbmcgb2NjdXJzIGFuZCBob3cgZmFyIHRoZSB3YXZlZm9ybSBpcyBmcm9tIGZ1bGwgc2NhbGVcbiIKKyNlbmRpZgorICAgICAgICApOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiICAgIC0tZmx1c2ggICAgICAgICBmbHVzaCBvdXRwdXQgc3RyZWFtIGFzIHNvb24gYXMgcG9zc2libGVcbiIKKyAgICAgICAgICAgICIgICAgLS1mcmVlZm9ybWF0ICAgIHByb2R1Y2UgYSBmcmVlIGZvcm1hdCBiaXRzdHJlYW1cbiIKKyAgICAgICAgICAgICIgICAgLS1kZWNvZGUgICAgICAgIGlucHV0PW1wMyBmaWxlLCBvdXRwdXQ9d2F2XG4iCisgICAgICAgICAgICAiICAgIC10ICAgICAgICAgICAgICBkaXNhYmxlIHdyaXRpbmcgd2F2IGhlYWRlciB3aGVuIHVzaW5nIC0tZGVjb2RlXG4iKTsKKworICAgIHdhaXRfZm9yKGZwLCBsZXNzbW9kZSk7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgIFZlcmJvc2l0eTpcbiIKKyAgICAgICAgICAgICIgICAgLS1kaXNwdGltZSA8YXJnPnByaW50IHByb2dyZXNzIHJlcG9ydCBldmVyeSBhcmcgc2Vjb25kc1xuIgorICAgICAgICAgICAgIiAgICAtUyAgICAgICAgICAgICAgZG9uJ3QgcHJpbnQgcHJvZ3Jlc3MgcmVwb3J0LCBWQlIgaGlzdG9ncmFtc1xuIgorICAgICAgICAgICAgIiAgICAtLW5vaGlzdCAgICAgICAgZGlzYWJsZSBWQlIgaGlzdG9ncmFtIGRpc3BsYXlcbiIKKyAgICAgICAgICAgICIgICAgLS1zaWxlbnQgICAgICAgIGRvbid0IHByaW50IGFueXRoaW5nIG9uIHNjcmVlblxuIgorICAgICAgICAgICAgIiAgICAtLXF1aWV0ICAgICAgICAgZG9uJ3QgcHJpbnQgYW55dGhpbmcgb24gc2NyZWVuXG4iCisgICAgICAgICAgICAiICAgIC0tYnJpZWYgICAgICAgICBwcmludCBtb3JlIHVzZWZ1bCBpbmZvcm1hdGlvblxuIgorICAgICAgICAgICAgIiAgICAtLXZlcmJvc2UgICAgICAgcHJpbnQgYSBsb3Qgb2YgdXNlZnVsIGluZm9ybWF0aW9uXG4iICJcbiIpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiICBOb2lzZSBzaGFwaW5nICYgcHN5Y2hvIGFjb3VzdGljIGFsZ29yaXRobXM6XG4iCisgICAgICAgICAgICAiICAgIC1xIDxhcmc+ICAgICAgICA8YXJnPiA9IDAuLi45LiAgRGVmYXVsdCAgLXEgNSBcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIC1xIDA6ICBIaWdoZXN0IHF1YWxpdHksIHZlcnkgc2xvdyBcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIC1xIDk6ICBQb29yIHF1YWxpdHksIGJ1dCBmYXN0IFxuIgorICAgICAgICAgICAgIiAgICAtaCAgICAgICAgICAgICAgU2FtZSBhcyAtcSAyLiAgIFJlY29tbWVuZGVkLlxuIgorICAgICAgICAgICAgIiAgICAtZiAgICAgICAgICAgICAgU2FtZSBhcyAtcSA3LiAgIEZhc3QsIG9rIHF1YWxpdHlcbiIpOworCisgICAgd2FpdF9mb3IoZnAsIGxlc3Ntb2RlKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIiAgQ0JSIChjb25zdGFudCBiaXRyYXRlLCB0aGUgZGVmYXVsdCkgb3B0aW9uczpcbiIKKyAgICAgICAgICAgICIgICAgLWIgPGJpdHJhdGU+ICAgIHNldCB0aGUgYml0cmF0ZSBpbiBrYnBzLCBkZWZhdWx0IDEyOCBrYnBzXG4iCisgICAgICAgICAgICAiICAgIC0tY2JyICAgICAgICAgICBlbmZvcmNlIHVzZSBvZiBjb25zdGFudCBiaXRyYXRlXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiICBBQlIgb3B0aW9uczpcbiIKKyAgICAgICAgICAgICIgICAgLS1hYnIgPGJpdHJhdGU+IHNwZWNpZnkgYXZlcmFnZSBiaXRyYXRlIGRlc2lyZWQgKGluc3RlYWQgb2YgcXVhbGl0eSlcbiIgIlxuIik7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgIFZCUiBvcHRpb25zOlxuIgorICAgICAgICAgICAgIiAgICAtViBuICAgICAgICAgICAgcXVhbGl0eSBzZXR0aW5nIGZvciBWQlIuICBkZWZhdWx0IG49JWlcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDA9aGlnaCBxdWFsaXR5LGJpZ2dlciBmaWxlcy4gOT1zbWFsbGVyIGZpbGVzXG4iCisgICAgICAgICAgICAiICAgIC12ICAgICAgICAgICAgICB0aGUgc2FtZSBhcyAtViA0XG4iCisgICAgICAgICAgICAiICAgIC0tdmJyLW9sZCAgICAgICB1c2Ugb2xkIHZhcmlhYmxlIGJpdHJhdGUgKFZCUikgcm91dGluZVxuIgorICAgICAgICAgICAgIiAgICAtLXZici1uZXcgICAgICAgdXNlIG5ldyB2YXJpYWJsZSBiaXRyYXRlIChWQlIpIHJvdXRpbmUgKGRlZmF1bHQpXG4iCisgICAgICAgICAgICAsCisgICAgICAgICAgICBsYW1lX2dldF9WQlJfcShnZnApKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIiAgICAtYiA8Yml0cmF0ZT4gICAgc3BlY2lmeSBtaW5pbXVtIGFsbG93ZWQgYml0cmF0ZSwgZGVmYXVsdCAgMzIga2Jwc1xuIgorICAgICAgICAgICAgIiAgICAtQiA8Yml0cmF0ZT4gICAgc3BlY2lmeSBtYXhpbXVtIGFsbG93ZWQgYml0cmF0ZSwgZGVmYXVsdCAzMjAga2Jwc1xuIgorICAgICAgICAgICAgIiAgICAtRiAgICAgICAgICAgICAgc3RyaWN0bHkgZW5mb3JjZSB0aGUgLWIgb3B0aW9uLCBmb3IgdXNlIHdpdGggcGxheWVycyB0aGF0XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBkbyBub3Qgc3VwcG9ydCBsb3cgYml0cmF0ZSBtcDNcbiIKKyAgICAgICAgICAgICIgICAgLXQgICAgICAgICAgICAgIGRpc2FibGUgd3JpdGluZyBMQU1FIFRhZ1xuIgorICAgICAgICAgICAgIiAgICAtVCAgICAgICAgICAgICAgZW5hYmxlIGFuZCBmb3JjZSB3cml0aW5nIExBTUUgVGFnXG4iKTsKKworICAgIHdhaXRfZm9yKGZwLCBsZXNzbW9kZSk7CisgICAgREVWX0hFTFAoZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICIgIEFUSCByZWxhdGVkOlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICAtLW5vYXRoICAgICAgICAgdHVybnMgQVRIIGRvd24gdG8gYSBmbGF0IG5vaXNlIGZsb29yXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgIC0tYXRoc2hvcnQgICAgICBpZ25vcmUgR1BTWUNITyBmb3Igc2hvcnQgYmxvY2tzLCB1c2UgQVRIIG9ubHlcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICAgLS1hdGhvbmx5ICAgICAgIGlnbm9yZSBHUFNZQ0hPIGNvbXBsZXRlbHksIHVzZSBBVEggb25seVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICAtLWF0aHR5cGUgbiAgICAgc2VsZWN0cyBiZXR3ZWVuIGRpZmZlcmVudCBBVEggdHlwZXMgWzAtNF1cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICAgLS1hdGhsb3dlciB4ICAgIGxvd2VycyBBVEggYnkgeCBkQlxuIik7CisgICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgICAtLWF0aGFhLXR5cGUgbiAgQVRIIGF1dG8gYWRqdXN0OiAwICdubycgZWxzZSAnbG91ZG5lc3MgYmFzZWQnXG4iCisvKiogT0JTT0xFVEUgIiAgICAtLWF0aGFhLWxvdWRhcHByb3ggbiAgIG49MSB0b3RhbCBlbmVyZ3kgb3Igbj0yIGVxdWFsIGxvdWRuZXNzIGN1cnZlXG4iKi8KKyAgICAgICAgICAgICAgICAgICAgICIgICAgLS1hdGhhYS1zZW5zaXRpdml0eSB4ICBhY3RpdmF0aW9uIG9mZnNldCBpbiAtLysgZEIgZm9yIEFUSCBhdXRvLWFkanVzdG1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICJcbiIpOworICAgICAgICApCisgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgIiAgUFNZIHJlbGF0ZWQ6XG4iCisgICAgICAgICAgICAgICAgREVWX0hFTFAoCisgICAgICAgICAgICAgICAgIiAgICAtLXNob3J0ICAgICAgICAgdXNlIHNob3J0IGJsb2NrcyB3aGVuIGFwcHJvcHJpYXRlXG4iCisgICAgICAgICAgICAgICAgIiAgICAtLW5vc2hvcnQgICAgICAgZG8gbm90IHVzZSBzaG9ydCBibG9ja3NcbiIKKyAgICAgICAgICAgICAgICAiICAgIC0tYWxsc2hvcnQgICAgICB1c2Ugb25seSBzaG9ydCBibG9ja3NcbiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgICAgLS10ZW1wb3JhbC1tYXNraW5nIHggICB4PTAgZGlzYWJsZXMsIHg9MSBlbmFibGVzIHRlbXBvcmFsIG1hc2tpbmcgZWZmZWN0XG4iCisgICAgICAgICAgICAiICAgIC0tbnNzYWZlam9pbnQgICBNL1Mgc3dpdGNoaW5nIGNyaXRlcmlvblxuIgorICAgICAgICAgICAgIiAgICAtLW5zbXNmaXggPGFyZz4gTS9TIHN3aXRjaGluZyB0dW5pbmcgW2VmZmVjdGl2ZSAwLTMuNV1cbiIKKyAgICAgICAgICAgICIgICAgLS1pbnRlcmNoIHggICAgIGFkanVzdCBpbnRlci1jaGFubmVsIG1hc2tpbmcgcmF0aW9cbiIKKyAgICAgICAgICAgICIgICAgLS1ucy1iYXNzIHggICAgIGFkanVzdCBtYXNraW5nIGZvciBzZmJzICAwIC0gIDYgKGxvbmcpICAwIC0gIDUgKHNob3J0KVxuIgorICAgICAgICAgICAgIiAgICAtLW5zLWFsdG8geCAgICAgYWRqdXN0IG1hc2tpbmcgZm9yIHNmYnMgIDcgLSAxMyAobG9uZykgIDYgLSAxMCAoc2hvcnQpXG4iCisgICAgICAgICAgICAiICAgIC0tbnMtdHJlYmxlIHggICBhZGp1c3QgbWFza2luZyBmb3Igc2ZicyAxNCAtIDIxIChsb25nKSAxMSAtIDEyIChzaG9ydClcbiIpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiICAgIC0tbnMtc2ZiMjEgeCAgICBjaGFuZ2UgbnMtdHJlYmxlIGJ5IHggZEIgZm9yIHNmYjIxXG4iCisgICAgICAgICAgICBERVZfSEVMUCgiICAgIC0tc2hvcnR0aHJlc2hvbGQgeCx5ICBzaG9ydCBibG9jayBzd2l0Y2hpbmcgdGhyZXNob2xkLFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgeCBmb3IgTC9SL00gY2hhbm5lbCwgeSBmb3IgUyBjaGFubmVsXG4iCisgICAgICAgICAgICAgICAgICAgICAiICBOb2lzZSBTaGFwaW5nIHJlbGF0ZWQ6XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgIC0tc3Vic3RlcCBuICAgICB1c2UgcHNldWRvIHN1YnN0ZXAgbm9pc2Ugc2hhcGluZyBtZXRob2QgdHlwZXMgMC0yXG4iKQorICAgICAgICApOworCisgICAgd2FpdF9mb3IoZnAsIGxlc3Ntb2RlKTsKKworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiICBleHBlcmltZW50YWwgc3dpdGNoZXM6XG4iCisgICAgICAgICAgICBERVZfSEVMUCgKKyAgICAgICAgICAgICIgICAgLVggblssbV0gICAgICAgIHNlbGVjdHMgYmV0d2VlbiBkaWZmZXJlbnQgbm9pc2UgbWVhc3VyZW1lbnRzXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBuIGZvciBsb25nIGJsb2NrLCBtIGZvciBzaG9ydC4gaWYgbSBpcyBvbWl0dGVkLCBtID0gblxuIgorICAgICAgICAgICAgKQorICAgICAgICAgICAgIiAgICAtWSAgICAgICAgICAgICAgbGV0cyBMQU1FIGlnbm9yZSBub2lzZSBpbiBzZmIyMSwgbGlrZSBpbiBDQlJcbiIKKyAgICAgICAgICAgIERFVl9IRUxQKAorICAgICAgICAgICAgIiAgICAtWiBbbl0gICAgICAgICAgY3VycmVudGx5IG5vIGVmZmVjdHNcbiIKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICB3YWl0X2ZvcihmcCwgbGVzc21vZGUpOworCisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgIE1QMyBoZWFkZXIvc3RyZWFtIG9wdGlvbnM6XG4iCisgICAgICAgICAgICAiICAgIC1lIDxlbXA+ICAgICAgICBkZS1lbXBoYXNpcyBuLzUvYyAgKG9ic29sZXRlKVxuIgorICAgICAgICAgICAgIiAgICAtYyAgICAgICAgICAgICAgbWFyayBhcyBjb3B5cmlnaHRcbiIKKyAgICAgICAgICAgICIgICAgLW8gICAgICAgICAgICAgIG1hcmsgYXMgbm9uLW9yaWdpbmFsXG4iCisgICAgICAgICAgICAiICAgIC1wICAgICAgICAgICAgICBlcnJvciBwcm90ZWN0aW9uLiAgYWRkcyAxNiBiaXQgY2hlY2tzdW0gdG8gZXZlcnkgZnJhbWVcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICh0aGUgY2hlY2tzdW0gaXMgY29tcHV0ZWQgY29ycmVjdGx5KVxuIgorICAgICAgICAgICAgIiAgICAtLW5vcmVzICAgICAgICAgZGlzYWJsZSB0aGUgYml0IHJlc2Vydm9pclxuIgorICAgICAgICAgICAgIiAgICAtLXN0cmljdGx5LWVuZm9yY2UtSVNPICAgY29tcGx5IGFzIG11Y2ggYXMgcG9zc2libGUgdG8gSVNPIE1QRUcgc3BlY1xuIiAiXG4iKTsKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIiAgRmlsdGVyIG9wdGlvbnM6XG4iCisgICAgICAgICAgICAiICAtLWxvd3Bhc3MgPGZyZXE+ICAgICAgICBmcmVxdWVuY3koa0h6KSwgbG93cGFzcyBmaWx0ZXIgY3V0b2ZmIGFib3ZlIGZyZXFcbiIKKyAgICAgICAgICAgICIgIC0tbG93cGFzcy13aWR0aCA8ZnJlcT4gIGZyZXF1ZW5jeShrSHopIC0gZGVmYXVsdCAxNSUlIG9mIGxvd3Bhc3MgZnJlcVxuIgorICAgICAgICAgICAgIiAgLS1oaWdocGFzcyA8ZnJlcT4gICAgICAgZnJlcXVlbmN5KGtIeiksIGhpZ2hwYXNzIGZpbHRlciBjdXRvZmYgYmVsb3cgZnJlcVxuIgorICAgICAgICAgICAgIiAgLS1oaWdocGFzcy13aWR0aCA8ZnJlcT4gZnJlcXVlbmN5KGtIeikgLSBkZWZhdWx0IDE1JSUgb2YgaGlnaHBhc3MgZnJlcVxuIik7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgIC0tcmVzYW1wbGUgPHNmcmVxPiAgc2FtcGxpbmcgZnJlcXVlbmN5IG9mIG91dHB1dCBmaWxlKGtIeiktIGRlZmF1bHQ9YXV0b21hdGljXG4iKTsKKworICAgIHdhaXRfZm9yKGZwLCBsZXNzbW9kZSk7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgIElEMyB0YWcgb3B0aW9uczpcbiIKKyAgICAgICAgICAgICIgICAgLS10dCA8dGl0bGU+ICAgIGF1ZGlvL3NvbmcgdGl0bGUgKG1heCAzMCBjaGFycyBmb3IgdmVyc2lvbiAxIHRhZylcbiIKKyAgICAgICAgICAgICIgICAgLS10YSA8YXJ0aXN0PiAgIGF1ZGlvL3NvbmcgYXJ0aXN0IChtYXggMzAgY2hhcnMgZm9yIHZlcnNpb24gMSB0YWcpXG4iCisgICAgICAgICAgICAiICAgIC0tdGwgPGFsYnVtPiAgICBhdWRpby9zb25nIGFsYnVtIChtYXggMzAgY2hhcnMgZm9yIHZlcnNpb24gMSB0YWcpXG4iCisgICAgICAgICAgICAiICAgIC0tdHkgPHllYXI+ICAgICBhdWRpby9zb25nIHllYXIgb2YgaXNzdWUgKDEgdG8gOTk5OSlcbiIKKyAgICAgICAgICAgICIgICAgLS10YyA8Y29tbWVudD4gIHVzZXItZGVmaW5lZCB0ZXh0IChtYXggMzAgY2hhcnMgZm9yIHYxIHRhZywgMjggZm9yIHYxLjEpXG4iCisgICAgICAgICAgICAiICAgIC0tdG4gPHRyYWNrWy90b3RhbF0+ICAgYXVkaW8vc29uZyB0cmFjayBudW1iZXIgYW5kIChvcHRpb25hbGx5KSB0aGUgdG90YWxcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgdHJhY2tzIG9uIHRoZSBvcmlnaW5hbCByZWNvcmRpbmcuICh0cmFja1xuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0b3RhbCBlYWNoIDEgdG8gMjU1LiBqdXN0IHRoZSB0cmFjayBudW1iZXJcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVzIHYxLjEgdGFnLCBwcm92aWRpbmcgYSB0b3RhbCBmb3JjZXMgdjIuMCkuXG4iCisgICAgICAgICAgICAiICAgIC0tdGcgPGdlbnJlPiAgICBhdWRpby9zb25nIGdlbnJlIChuYW1lIG9yIG51bWJlciBpbiBsaXN0KVxuIgorICAgICAgICAgICAgIiAgICAtLXRpIDxmaWxlPiAgICAgYXVkaW8vc29uZyBhbGJ1bUFydCAoanBlZy9wbmcvZ2lmIGZpbGUsIDEyOEtCIG1heCwgdjIuMylcbiIKKyAgICAgICAgICAgICIgICAgLS10diA8aWQ9dmFsdWU+IHVzZXItZGVmaW5lZCBmcmFtZSBzcGVjaWZpZWQgYnkgaWQgYW5kIHZhbHVlICh2Mi4zIHRhZylcbiIpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiICAgIC0tYWRkLWlkM3YyICAgICBmb3JjZSBhZGRpdGlvbiBvZiB2ZXJzaW9uIDIgdGFnXG4iCisgICAgICAgICAgICAiICAgIC0taWQzdjEtb25seSAgICBhZGQgb25seSBhIHZlcnNpb24gMSB0YWdcbiIKKyAgICAgICAgICAgICIgICAgLS1pZDN2Mi1vbmx5ICAgIGFkZCBvbmx5IGEgdmVyc2lvbiAyIHRhZ1xuIgorICAgICAgICAgICAgIiAgICAtLXNwYWNlLWlkM3YxICAgcGFkIHZlcnNpb24gMSB0YWcgd2l0aCBzcGFjZXMgaW5zdGVhZCBvZiBudWxsc1xuIgorICAgICAgICAgICAgIiAgICAtLXBhZC1pZDN2MiAgICAgc2FtZSBhcyAnLS1wYWQtaWQzdjItc2l6ZSAxMjgnXG4iCisgICAgICAgICAgICAiICAgIC0tcGFkLWlkM3YyLXNpemUgPHZhbHVlPiBhZGRzIHZlcnNpb24gMiB0YWcsIHBhZCB3aXRoIGV4dHJhIDx2YWx1ZT4gYnl0ZXNcbiIKKyAgICAgICAgICAgICIgICAgLS1nZW5yZS1saXN0ICAgIHByaW50IGFscGhhYmV0aWNhbGx5IHNvcnRlZCBJRDMgZ2VucmUgbGlzdCBhbmQgZXhpdFxuIgorICAgICAgICAgICAgIiAgICAtLWlnbm9yZS10YWctZXJyb3JzICBpZ25vcmUgZXJyb3JzIGluIHZhbHVlcyBwYXNzZWQgZm9yIHRhZ3NcbiIgIlxuIik7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICIgICAgTm90ZTogQSB2ZXJzaW9uIDIgdGFnIHdpbGwgTk9UIGJlIGFkZGVkIHVubGVzcyBvbmUgb2YgdGhlIGlucHV0IGZpZWxkc1xuIgorICAgICAgICAgICAgIiAgICB3b24ndCBmaXQgaW4gYSB2ZXJzaW9uIDEgdGFnIChlLmcuIHRoZSB0aXRsZSBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gMzBcbiIKKyAgICAgICAgICAgICIgICAgY2hhcmFjdGVycyksIG9yIHRoZSAnLS1hZGQtaWQzdjInIG9yICctLWlkM3YyLW9ubHknIG9wdGlvbnMgYXJlIHVzZWQsXG4iCisgICAgICAgICAgICAiICAgIG9yIG91dHB1dCBpcyByZWRpcmVjdGVkIHRvIHN0ZG91dC5cbiIKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgICAgICAgIlxuXG5NUy1XaW5kb3dzLXNwZWNpZmljIG9wdGlvbnM6XG4iCisgICAgICAgICAgICAiICAgIC0tcHJpb3JpdHkgPHR5cGU+ICBzZXRzIHRoZSBwcm9jZXNzIHByaW9yaXR5OlxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAwLDEgPSBMb3cgcHJpb3JpdHkgKElETEVfUFJJT1JJVFlfQ0xBU1MpXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSBub3JtYWwgcHJpb3JpdHkgKE5PUk1BTF9QUklPUklUWV9DTEFTUywgZGVmYXVsdClcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgMyw0ID0gSGlnaCBwcmlvcml0eSAoSElHSF9QUklPUklUWV9DTEFTUykpXG4iCisgICAgICAgICAgICAiICAgIE5vdGU6IENhbGxpbmcgJy0tcHJpb3JpdHknIHdpdGhvdXQgYSBwYXJhbWV0ZXIgd2lsbCBzZWxlY3QgcHJpb3JpdHkgMC5cbiIKKyNlbmRpZgorI2lmIGRlZmluZWQoX19PUzJfXykKKyAgICAgICAgICAgICJcblxuT1MvMi1zcGVjaWZpYyBvcHRpb25zOlxuIgorICAgICAgICAgICAgIiAgICAtLXByaW9yaXR5IDx0eXBlPiAgc2V0cyB0aGUgcHJvY2VzcyBwcmlvcml0eTpcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IExvdyBwcmlvcml0eSAoSURMRSwgZGVsdGEgPSAwKVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAxID0gTWVkaXVtIHByaW9yaXR5IChJRExFLCBkZWx0YSA9ICszMSlcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IFJlZ3VsYXIgcHJpb3JpdHkgKFJFR1VMQVIsIGRlbHRhID0gLTMxKVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAzID0gSGlnaCBwcmlvcml0eSAoUkVHVUxBUiwgZGVsdGEgPSAwKVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICA0ID0gTWF4aW11bSBwcmlvcml0eSAoUkVHVUxBUiwgZGVsdGEgPSArMzEpXG4iCisgICAgICAgICAgICAiICAgIE5vdGU6IENhbGxpbmcgJy0tcHJpb3JpdHknIHdpdGhvdXQgYSBwYXJhbWV0ZXIgd2lsbCBzZWxlY3QgcHJpb3JpdHkgMC5cbiIKKyNlbmRpZgorICAgICAgICAgICAgIlxuTWlzYzpcbiAgICAtLWxpY2Vuc2UgICAgICAgcHJpbnQgTGljZW5zZSBpbmZvcm1hdGlvblxuXG4iCisgICAgICAgICk7CisKKyNpZiBkZWZpbmVkKEhBVkVfTkFTTSkKKyAgICB3YWl0X2ZvcihmcCwgbGVzc21vZGUpOworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiICBQbGF0Zm9ybSBzcGVjaWZpYzpcbiIKKyAgICAgICAgICAgICIgICAgLS1ub2FzbSA8aW5zdHJ1Y3Rpb25zPiBkaXNhYmxlIGFzc2VtYmx5IG9wdGltaXphdGlvbnMgZm9yIG1teC8zZG5vdy9zc2VcbiIpOworICAgIHdhaXRfZm9yKGZwLCBsZXNzbW9kZSk7CisjZW5kaWYKKworICAgIGRpc3BsYXlfYml0cmF0ZXMoZnApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2JpdHJhdGUoRklMRSAqIGNvbnN0IGZwLCBjb25zdCBjaGFyICpjb25zdCB2ZXJzaW9uLCBjb25zdCBpbnQgZCwgY29uc3QgaW50IGluZHgpCit7CisgICAgaW50ICAgICBpOworICAgIGludCBuQml0cmF0ZXMgPSAxNDsKKyAgICBpZiAoZCA9PSA0KQorICAgICAgICBuQml0cmF0ZXMgPSA4OworCisKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgIlxuTVBFRy0lLTNzIGxheWVyIElJSSBzYW1wbGUgZnJlcXVlbmNpZXMgKGtIeik6ICAlMmQgICUyZCAgJWdcbiIKKyAgICAgICAgICAgICJiaXRyYXRlcyAoa2Jwcyk6IiwgdmVyc2lvbiwgMzIgLyBkLCA0OCAvIGQsIDQ0LjEgLyBkKTsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IG5CaXRyYXRlczsgaSsrKQorICAgICAgICBmcHJpbnRmKGZwLCAiICUyaSIsIGJpdHJhdGVfdGFibGVbaW5keF1baV0pOworICAgIGZwcmludGYoZnAsICJcbiIpOworfQorCitpbnQKK2Rpc3BsYXlfYml0cmF0ZXMoRklMRSAqIGNvbnN0IGZwKQoreworICAgIGRpc3BsYXlfYml0cmF0ZShmcCwgIjEiLCAxLCAxKTsKKyAgICBkaXNwbGF5X2JpdHJhdGUoZnAsICIyIiwgMiwgMCk7CisgICAgZGlzcGxheV9iaXRyYXRlKGZwLCAiMi41IiwgNCwgMCk7CisgICAgZnByaW50ZihmcCwgIlxuIik7CisgICAgZmZsdXNoKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKiAgbm90ZTogZm9yIHByZXNldHMgaXQgd291bGQgYmUgYmV0dGVyIHRvIGV4dGVybmFsaXplIHRoZW0gaW4gYSBmaWxlLgorICAgIHN1Z2dlc3Rpb246ICBsYW1lIC0tcHJlc2V0IDxmaWxlLW5hbWU+IC4uLgorICAgICAgICAgICAgb3I6ICBsYW1lIC0tcHJlc2V0IG15LXNldHRpbmcgIC4uLiBhbmQgbXktc2V0dGluZyBpcyBkZWZpbmVkIGluIGxhbWUuaW5pCisgKi8KKworLyoKK05vdGUgZnJvbSBHQiBvbiAwOC8yNS8yMDAyOgorSSBhbSBtZXJnaW5nIC0tcHJlc2V0cyBhbmQgLS1hbHQtcHJlc2V0cy4gT2xkIHByZXNldHMgYXJlIG5vdyBhbGlhc2VzIGZvcgorY29ycmVzcG9uZGluZyBhYnIgdmFsdWVzIGZyb20gb2xkIGFsdC1wcmVzZXRzLiBUaGlzIHdheSB3ZSBub3cgaGF2ZSBhCit1bmlmaWVkIHByZXNldCBzeXN0ZW0sIGFuZCBJIGhvcGUgdGhhbiBtb3JlIHBlb3BsZSB3aWxsIHVzZSB0aGUgbmV3IHR1bmVkCitwcmVzZXRzIGluc3RlYWQgb2YgdGhlIG9sZCB1bm1haW50YWluZWQgb25lcy4KKyovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIHVzYWdlCisqCisqIFBVUlBPU0U6ICBXcml0ZXMgcHJlc2V0dGluZyBpbmZvIHRvICNzdGRvdXQjCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQKK3ByZXNldHNfbG9uZ2luZm9fZG0oRklMRSAqIG1zZ2ZwKQoreworICAgIGZwcmludGYobXNnZnAsCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiVGhlIC0tcHJlc2V0IHN3aXRjaGVzIGFyZSBhbGlhc2VzIG92ZXIgTEFNRSBzZXR0aW5ncy5cbiIKKyAgICAgICAgICAgICJcbiIgIlxuIik7CisgICAgZnByaW50Zihtc2dmcCwKKyAgICAgICAgICAgICJUbyBhY3RpdmF0ZSB0aGVzZSBwcmVzZXRzOlxuIgorICAgICAgICAgICAgIlxuIiAiICAgRm9yIFZCUiBtb2RlcyAoZ2VuZXJhbGx5IGhpZ2hlc3QgcXVhbGl0eSk6XG4iICJcbiIpOworICAgIGZwcmludGYobXNnZnAsCisgICAgICAgICAgICAiICAgICBcIi0tcHJlc2V0IG1lZGl1bVwiIFRoaXMgcHJlc2V0IHNob3VsZCBwcm92aWRlIG5lYXIgdHJhbnNwYXJlbmN5XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBtb3N0IHBlb3BsZSBvbiBtb3N0IG11c2ljLlxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiAgICAgXCItLXByZXNldCBzdGFuZGFyZFwiIFRoaXMgcHJlc2V0IHNob3VsZCBnZW5lcmFsbHkgYmUgdHJhbnNwYXJlbnRcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1vc3QgcGVvcGxlIG9uIG1vc3QgbXVzaWMgYW5kIGlzIGFscmVhZHlcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXRlIGhpZ2ggaW4gcXVhbGl0eS5cbiIgIlxuIik7CisgICAgZnByaW50Zihtc2dmcCwKKyAgICAgICAgICAgICIgICAgIFwiLS1wcmVzZXQgZXh0cmVtZVwiIElmIHlvdSBoYXZlIGV4dHJlbWVseSBnb29kIGhlYXJpbmcgYW5kIHNpbWlsYXJcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWlwbWVudCwgdGhpcyBwcmVzZXQgd2lsbCBnZW5lcmFsbHkgcHJvdmlkZVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZ2h0bHkgaGlnaGVyIHF1YWxpdHkgdGhhbiB0aGUgXCJzdGFuZGFyZFwiXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLlxuIiAiXG4iKTsKKyAgICBmcHJpbnRmKG1zZ2ZwLAorICAgICAgICAgICAgIiAgIEZvciBDQlIgMzIwa2JwcyAoaGlnaGVzdCBxdWFsaXR5IHBvc3NpYmxlIGZyb20gdGhlIC0tcHJlc2V0IHN3aXRjaGVzKTpcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIgICAgIFwiLS1wcmVzZXQgaW5zYW5lXCIgIFRoaXMgcHJlc2V0IHdpbGwgdXN1YWxseSBiZSBvdmVya2lsbCBmb3IgbW9zdFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVvcGxlIGFuZCBtb3N0IHNpdHVhdGlvbnMsIGJ1dCBpZiB5b3UgbXVzdFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0aGUgYWJzb2x1dGUgaGlnaGVzdCBxdWFsaXR5IHdpdGggbm9cbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2FyZCB0byBmaWxlc2l6ZSwgdGhpcyBpcyB0aGUgd2F5IHRvIGdvLlxuIiAiXG4iKTsKKyAgICBmcHJpbnRmKG1zZ2ZwLAorICAgICAgICAgICAgIiAgIEZvciBBQlIgbW9kZXMgKGhpZ2ggcXVhbGl0eSBwZXIgZ2l2ZW4gYml0cmF0ZSBidXQgbm90IGFzIGhpZ2ggYXMgVkJSKTpcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIgICAgIFwiLS1wcmVzZXQgPGticHM+XCIgIFVzaW5nIHRoaXMgcHJlc2V0IHdpbGwgdXN1YWxseSBnaXZlIHlvdSBnb29kXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5IGF0IGEgc3BlY2lmaWVkIGJpdHJhdGUuIERlcGVuZGluZyBvbiB0aGVcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgZW50ZXJlZCwgdGhpcyBwcmVzZXQgd2lsbCBkZXRlcm1pbmUgdGhlXG4iKTsKKyAgICBmcHJpbnRmKG1zZ2ZwLAorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1hbCBzZXR0aW5ncyBmb3IgdGhhdCBwYXJ0aWN1bGFyIHNpdHVhdGlvbi5cbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaWxlIHRoaXMgYXBwcm9hY2ggd29ya3MsIGl0IGlzIG5vdCBuZWFybHkgYXNcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhpYmxlIGFzIFZCUiwgYW5kIHVzdWFsbHkgd2lsbCBub3QgYXR0YWluIHRoZVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSBsZXZlbCBvZiBxdWFsaXR5IGFzIFZCUiBhdCBoaWdoZXIgYml0cmF0ZXMuXG4iICJcbiIpOworICAgIGZwcmludGYobXNnZnAsCisgICAgICAgICAgICAiVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhbHNvIGF2YWlsYWJsZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvZmlsZXM6XG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiICAgPGZhc3Q+ICAgICAgICBzdGFuZGFyZFxuIgorICAgICAgICAgICAgIiAgIDxmYXN0PiAgICAgICAgZXh0cmVtZVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgaW5zYW5lXG4iCisgICAgICAgICAgICAiICAgPGNicj4gKEFCUiBNb2RlKSAtIFRoZSBBQlIgTW9kZSBpcyBpbXBsaWVkLiBUbyB1c2UgaXQsXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgIHNpbXBseSBzcGVjaWZ5IGEgYml0cmF0ZS4gRm9yIGV4YW1wbGU6XG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgIFwiLS1wcmVzZXQgMTg1XCIgYWN0aXZhdGVzIHRoaXNcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0IGFuZCB1c2VzIDE4NSBhcyBhbiBhdmVyYWdlIGticHMuXG4iICJcbiIpOworICAgIGZwcmludGYobXNnZnAsCisgICAgICAgICAgICAiICAgXCJmYXN0XCIgLSBFbmFibGVzIHRoZSBmYXN0IFZCUiBtb2RlIGZvciBhIHBhcnRpY3VsYXIgcHJvZmlsZS5cbiIgIlxuIik7CisgICAgZnByaW50Zihtc2dmcCwKKyAgICAgICAgICAgICIgICBcImNiclwiICAtIElmIHlvdSB1c2UgdGhlIEFCUiBtb2RlIChyZWFkIGFib3ZlKSB3aXRoIGEgc2lnbmlmaWNhbnRcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICBiaXRyYXRlIHN1Y2ggYXMgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgeW91IGNhbiB1c2UgdGhlIFwiY2JyXCIgb3B0aW9uIHRvIGZvcmNlIENCUiBtb2RlIGVuY29kaW5nXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgYWJyIG1vZGUuIEFCUiBkb2VzIHByb3ZpZGUgaGlnaGVyXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgcXVhbGl0eSBidXQgQ0JSIG1heSBiZSB1c2VmdWwgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIHdoZW5cbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICBzdHJlYW1pbmcgYW4gbXAzIG92ZXIgdGhlIGludGVybmV0IG1heSBiZSBpbXBvcnRhbnQuXG4iICJcbiIpOworICAgIGZwcmludGYobXNnZnAsCisgICAgICAgICAgICAiICAgIEZvciBleGFtcGxlOlxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiAgICBcIi0tcHJlc2V0IGZhc3Qgc3RhbmRhcmQgPGlucHV0IGZpbGU+IDxvdXRwdXQgZmlsZT5cIlxuIgorICAgICAgICAgICAgIiBvciBcIi0tcHJlc2V0IGNiciAxOTIgPGlucHV0IGZpbGU+IDxvdXRwdXQgZmlsZT5cIlxuIgorICAgICAgICAgICAgIiBvciBcIi0tcHJlc2V0IDE3MiA8aW5wdXQgZmlsZT4gPG91dHB1dCBmaWxlPlwiXG4iCisgICAgICAgICAgICAiIG9yIFwiLS1wcmVzZXQgZXh0cmVtZSA8aW5wdXQgZmlsZT4gPG91dHB1dCBmaWxlPlwiXG4iICJcbiIgIlxuIik7CisgICAgZnByaW50Zihtc2dmcCwKKyAgICAgICAgICAgICJBIGZldyBhbGlhc2VzIGFyZSBhbHNvIGF2YWlsYWJsZSBmb3IgQUJSIG1vZGU6XG4iCisgICAgICAgICAgICAicGhvbmUgPT4gMTZrYnBzL21vbm8gICAgICAgIHBob24rL2x3L213LWV1L3N3ID0+IDI0a2Jwcy9tb25vXG4iCisgICAgICAgICAgICAibXctdXMgPT4gNDBrYnBzL21vbm8gICAgICAgIHZvaWNlID0+IDU2a2Jwcy9tb25vXG4iCisgICAgICAgICAgICAiZm0vcmFkaW8vdGFwZSA9PiAxMTJrYnBzICAgIGhpZmkgPT4gMTYwa2Jwc1xuIgorICAgICAgICAgICAgImNkID0+IDE5MmticHMgICAgICAgICAgICAgICBzdHVkaW8gPT4gMjU2a2Jwc1xuIik7Cit9CisKKworZXh0ZXJuIHZvaWQgbGFtZV9zZXRfbXNmaXgobGFtZV90IGdmcCwgZG91YmxlIG1zZml4KTsKKworCisKK3N0YXRpYyBpbnQKK3ByZXNldHNfc2V0KGxhbWVfdCBnZnAsIGludCBmYXN0LCBpbnQgY2JyLCBjb25zdCBjaGFyICpwcmVzZXRfbmFtZSwgY29uc3QgY2hhciAqUHJvZ3JhbU5hbWUpCit7CisgICAgaW50ICAgICBtb25vID0gMDsKKworICAgIGlmICgoc3RyY21wKHByZXNldF9uYW1lLCAiaGVscCIpID09IDApICYmIChmYXN0IDwgMSkKKyAgICAgICAgJiYgKGNiciA8IDEpKSB7CisgICAgICAgIGxhbWVfdmVyc2lvbl9wcmludChzdGRvdXQpOworICAgICAgICBwcmVzZXRzX2xvbmdpbmZvX2RtKHN0ZG91dCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKworCisgICAgLyphbGlhc2VzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHByZXNldHMgKi8KKworICAgIGlmIChzdHJjbXAocHJlc2V0X25hbWUsICJwaG9uZSIpID09IDApIHsKKyAgICAgICAgcHJlc2V0X25hbWUgPSAiMTYiOworICAgICAgICBtb25vID0gMTsKKyAgICB9CisgICAgaWYgKChzdHJjbXAocHJlc2V0X25hbWUsICJwaG9uKyIpID09IDApIHx8CisgICAgICAgIChzdHJjbXAocHJlc2V0X25hbWUsICJsdyIpID09IDApIHx8CisgICAgICAgIChzdHJjbXAocHJlc2V0X25hbWUsICJtdy1ldSIpID09IDApIHx8IChzdHJjbXAocHJlc2V0X25hbWUsICJzdyIpID09IDApKSB7CisgICAgICAgIHByZXNldF9uYW1lID0gIjI0IjsKKyAgICAgICAgbW9ubyA9IDE7CisgICAgfQorICAgIGlmIChzdHJjbXAocHJlc2V0X25hbWUsICJtdy11cyIpID09IDApIHsKKyAgICAgICAgcHJlc2V0X25hbWUgPSAiNDAiOworICAgICAgICBtb25vID0gMTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChwcmVzZXRfbmFtZSwgInZvaWNlIikgPT0gMCkgeworICAgICAgICBwcmVzZXRfbmFtZSA9ICI1NiI7CisgICAgICAgIG1vbm8gPSAxOworICAgIH0KKyAgICBpZiAoc3RyY21wKHByZXNldF9uYW1lLCAiZm0iKSA9PSAwKSB7CisgICAgICAgIHByZXNldF9uYW1lID0gIjExMiI7CisgICAgfQorICAgIGlmICgoc3RyY21wKHByZXNldF9uYW1lLCAicmFkaW8iKSA9PSAwKSB8fCAoc3RyY21wKHByZXNldF9uYW1lLCAidGFwZSIpID09IDApKSB7CisgICAgICAgIHByZXNldF9uYW1lID0gIjExMiI7CisgICAgfQorICAgIGlmIChzdHJjbXAocHJlc2V0X25hbWUsICJoaWZpIikgPT0gMCkgeworICAgICAgICBwcmVzZXRfbmFtZSA9ICIxNjAiOworICAgIH0KKyAgICBpZiAoc3RyY21wKHByZXNldF9uYW1lLCAiY2QiKSA9PSAwKSB7CisgICAgICAgIHByZXNldF9uYW1lID0gIjE5MiI7CisgICAgfQorICAgIGlmIChzdHJjbXAocHJlc2V0X25hbWUsICJzdHVkaW8iKSA9PSAwKSB7CisgICAgICAgIHByZXNldF9uYW1lID0gIjI1NiI7CisgICAgfQorCisgICAgaWYgKHN0cmNtcChwcmVzZXRfbmFtZSwgIm1lZGl1bSIpID09IDApIHsKKyAgICAgICAgbGFtZV9zZXRfVkJSX3EoZ2ZwLCA0KTsKKyAgICAgICAgaWYgKGZhc3QgPiAwKSB7CisgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfbXRyaCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfcmgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzdHJjbXAocHJlc2V0X25hbWUsICJzdGFuZGFyZCIpID09IDApIHsKKyAgICAgICAgbGFtZV9zZXRfVkJSX3EoZ2ZwLCAyKTsKKyAgICAgICAgaWYgKGZhc3QgPiAwKSB7CisgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfbXRyaCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfcmgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGVsc2UgaWYgKHN0cmNtcChwcmVzZXRfbmFtZSwgImV4dHJlbWUiKSA9PSAwKSB7CisgICAgICAgIGxhbWVfc2V0X1ZCUl9xKGdmcCwgMCk7CisgICAgICAgIGlmIChmYXN0ID4gMCkgeworICAgICAgICAgICAgbGFtZV9zZXRfVkJSKGdmcCwgdmJyX210cmgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGFtZV9zZXRfVkJSKGdmcCwgdmJyX3JoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlbHNlIGlmICgoc3RyY21wKHByZXNldF9uYW1lLCAiaW5zYW5lIikgPT0gMCkgJiYgKGZhc3QgPCAxKSkgeworCisgICAgICAgIGxhbWVfc2V0X3ByZXNldChnZnAsIElOU0FORSk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogR2VuZXJpYyBBQlIgUHJlc2V0ICovCisgICAgaWYgKCgoYXRvaShwcmVzZXRfbmFtZSkpID4gMCkgJiYgKGZhc3QgPCAxKSkgeworICAgICAgICBpZiAoKGF0b2kocHJlc2V0X25hbWUpKSA+PSA4ICYmIChhdG9pKHByZXNldF9uYW1lKSkgPD0gMzIwKSB7CisgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoZ2ZwLCBhdG9pKHByZXNldF9uYW1lKSk7CisKKyAgICAgICAgICAgIGlmIChjYnIgPT0gMSkKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfb2ZmKTsKKworICAgICAgICAgICAgaWYgKG1vbm8gPT0gMSkgeworICAgICAgICAgICAgICAgIGxhbWVfc2V0X21vZGUoZ2ZwLCBNT05PKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxhbWVfdmVyc2lvbl9wcmludChDb25zb2xlX0lPLkVycm9yX2ZwKTsKKyAgICAgICAgICAgIGVycm9yX3ByaW50ZigiRXJyb3I6IFRoZSBiaXRyYXRlIHNwZWNpZmllZCBpcyBvdXQgb2YgdGhlIHZhbGlkIHJhbmdlIGZvciB0aGlzIHByZXNldFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiB1c2luZyB0aGlzIG1vZGUgeW91IG11c3QgZW50ZXIgYSB2YWx1ZSBiZXR3ZWVuIFwiMzJcIiBhbmQgXCIzMjBcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgIkZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHRyeTogXCIlcyAtLXByZXNldCBoZWxwXCJcbiIsIFByb2dyYW1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxhbWVfdmVyc2lvbl9wcmludChDb25zb2xlX0lPLkVycm9yX2ZwKTsKKyAgICBlcnJvcl9wcmludGYoIkVycm9yOiBZb3UgZGlkIG5vdCBlbnRlciBhIHZhbGlkIHByb2ZpbGUgYW5kL29yIG9wdGlvbnMgd2l0aCAtLXByZXNldFxuIgorICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICJBdmFpbGFibGUgcHJvZmlsZXMgYXJlOlxuIgorICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICIgICA8ZmFzdD4gICAgICAgIG1lZGl1bVxuIgorICAgICAgICAgICAgICAgICAiICAgPGZhc3Q+ICAgICAgICBzdGFuZGFyZFxuIgorICAgICAgICAgICAgICAgICAiICAgPGZhc3Q+ICAgICAgICBleHRyZW1lXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIGluc2FuZVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICAgIDxjYnI+IChBQlIgTW9kZSkgLSBUaGUgQUJSIE1vZGUgaXMgaW1wbGllZC4gVG8gdXNlIGl0LFxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbHkgc3BlY2lmeSBhIGJpdHJhdGUuIEZvciBleGFtcGxlOlxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi0tcHJlc2V0IDE4NVwiIGFjdGl2YXRlcyB0aGlzXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldCBhbmQgdXNlcyAxODUgYXMgYW4gYXZlcmFnZSBrYnBzLlxuIiAiXG4iKTsKKyAgICBlcnJvcl9wcmludGYoIiAgICBTb21lIGV4YW1wbGVzOlxuIgorICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICIgb3IgXCIlcyAtLXByZXNldCBmYXN0IHN0YW5kYXJkIDxpbnB1dCBmaWxlPiA8b3V0cHV0IGZpbGU+XCJcbiIKKyAgICAgICAgICAgICAgICAgIiBvciBcIiVzIC0tcHJlc2V0IGNiciAxOTIgPGlucHV0IGZpbGU+IDxvdXRwdXQgZmlsZT5cIlxuIgorICAgICAgICAgICAgICAgICAiIG9yIFwiJXMgLS1wcmVzZXQgMTcyIDxpbnB1dCBmaWxlPiA8b3V0cHV0IGZpbGU+XCJcbiIKKyAgICAgICAgICAgICAgICAgIiBvciBcIiVzIC0tcHJlc2V0IGV4dHJlbWUgPGlucHV0IGZpbGU+IDxvdXRwdXQgZmlsZT5cIlxuIgorICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICJGb3IgZnVydGhlciBpbmZvcm1hdGlvbiB0cnk6IFwiJXMgLS1wcmVzZXQgaGVscFwiXG4iLCBQcm9ncmFtTmFtZSwgUHJvZ3JhbU5hbWUsCisgICAgICAgICAgICAgICAgIFByb2dyYW1OYW1lLCBQcm9ncmFtTmFtZSwgUHJvZ3JhbU5hbWUpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQKK2dlbnJlX2xpc3RfaGFuZGxlcihpbnQgbnVtLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpjb29raWUpCit7CisgICAgKHZvaWQpIGNvb2tpZTsKKyAgICBjb25zb2xlX3ByaW50ZigiJTNkICVzXG4iLCBudW0sIG5hbWUpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogcGFyc2VfYXJncworKgorKiBQVVJQT1NFOiAgU2V0cyBlbmNvZGluZyBwYXJhbWV0ZXJzIHRvIHRoZSBzcGVjaWZpY2F0aW9ucyBvZiB0aGUKKyogY29tbWFuZCBsaW5lLiAgRGVmYXVsdCBzZXR0aW5ncyBhcmUgdXNlZCBmb3IgcGFyYW1ldGVycworKiBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kIGxpbmUuCisqCisqIElmIHRoZSBpbnB1dCBmaWxlIGlzIGluIFdBVkUgb3IgQUlGRiBmb3JtYXQsIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaXMgcmVhZAorKiBmcm9tIHRoZSBBSUZGIGhlYWRlci4KKyoKKyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZW5hbWVzIGFyZSByZWFkIGludG8gI2lucGF0aCMgYW5kICNvdXRwYXRoIy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogd291bGQgdXNlIHJlYWwgInN0cmNhc2VjbXAiIGJ1dCBpdCBpc24ndCBwb3J0YWJsZSAqLworc3RhdGljIGludAorbG9jYWxfc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgICAgdW5zaWduZWQgY2hhciBjMTsKKyAgICB1bnNpZ25lZCBjaGFyIGMyOworCisgICAgZG8geworICAgICAgICBjMSA9IHRvbG93ZXIoKnMxKTsKKyAgICAgICAgYzIgPSB0b2xvd2VyKCpzMik7CisgICAgICAgIGlmICghYzEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICsrczE7CisgICAgICAgICsrczI7CisgICAgfSB3aGlsZSAoYzEgPT0gYzIpOworICAgIHJldHVybiBjMSAtIGMyOworfQorCisKKworLyogTEFNRSBpcyBhIHNpbXBsZSBmcm9udGVuZCB3aGljaCBqdXN0IHVzZXMgdGhlIGZpbGUgZXh0ZW5zaW9uICovCisvKiB0byBkZXRlcm1pbmUgdGhlIGZpbGUgdHlwZS4gIFRyeWluZyB0byBhbmFseXplIHRoZSBmaWxlICovCisvKiBjb250ZW50cyBpcyB3ZWxsIGJleW9uZCB0aGUgc2NvcGUgb2YgTEFNRSBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZC4gKi8KK3N0YXRpYyBpbnQKK2ZpbGVuYW1lX3RvX3R5cGUoY29uc3QgY2hhciAqRmlsZU5hbWUpCit7CisgICAgc2l6ZV90ICBsZW4gPSBzdHJsZW4oRmlsZU5hbWUpOworCisgICAgaWYgKGxlbiA8IDQpCisgICAgICAgIHJldHVybiBzZl91bmtub3duOworCisgICAgRmlsZU5hbWUgKz0gbGVuIC0gNDsKKyAgICBpZiAoMCA9PSBsb2NhbF9zdHJjYXNlY21wKEZpbGVOYW1lLCAiLm1wZyIpKQorICAgICAgICByZXR1cm4gc2ZfbXAxMjM7CisgICAgaWYgKDAgPT0gbG9jYWxfc3RyY2FzZWNtcChGaWxlTmFtZSwgIi5tcDEiKSkKKyAgICAgICAgcmV0dXJuIHNmX21wMTIzOworICAgIGlmICgwID09IGxvY2FsX3N0cmNhc2VjbXAoRmlsZU5hbWUsICIubXAyIikpCisgICAgICAgIHJldHVybiBzZl9tcDEyMzsKKyAgICBpZiAoMCA9PSBsb2NhbF9zdHJjYXNlY21wKEZpbGVOYW1lLCAiLm1wMyIpKQorICAgICAgICByZXR1cm4gc2ZfbXAxMjM7CisgICAgaWYgKDAgPT0gbG9jYWxfc3RyY2FzZWNtcChGaWxlTmFtZSwgIi53YXYiKSkKKyAgICAgICAgcmV0dXJuIHNmX3dhdmU7CisgICAgaWYgKDAgPT0gbG9jYWxfc3RyY2FzZWNtcChGaWxlTmFtZSwgIi5haWYiKSkKKyAgICAgICAgcmV0dXJuIHNmX2FpZmY7CisgICAgaWYgKDAgPT0gbG9jYWxfc3RyY2FzZWNtcChGaWxlTmFtZSwgIi5yYXciKSkKKyAgICAgICAgcmV0dXJuIHNmX3JhdzsKKyAgICBpZiAoMCA9PSBsb2NhbF9zdHJjYXNlY21wKEZpbGVOYW1lLCAiLm9nZyIpKQorICAgICAgICByZXR1cm4gc2Zfb2dnOworICAgIHJldHVybiBzZl91bmtub3duOworfQorCitzdGF0aWMgaW50CityZXNhbXBsZV9yYXRlKGRvdWJsZSBmcmVxKQoreworICAgIGlmIChmcmVxID49IDEuZTMpCisgICAgICAgIGZyZXEgKj0gMS5lLTM7CisKKyAgICBzd2l0Y2ggKChpbnQpIGZyZXEpIHsKKyAgICBjYXNlIDg6CisgICAgICAgIHJldHVybiA4MDAwOworICAgIGNhc2UgMTE6CisgICAgICAgIHJldHVybiAxMTAyNTsKKyAgICBjYXNlIDEyOgorICAgICAgICByZXR1cm4gMTIwMDA7CisgICAgY2FzZSAxNjoKKyAgICAgICAgcmV0dXJuIDE2MDAwOworICAgIGNhc2UgMjI6CisgICAgICAgIHJldHVybiAyMjA1MDsKKyAgICBjYXNlIDI0OgorICAgICAgICByZXR1cm4gMjQwMDA7CisgICAgY2FzZSAzMjoKKyAgICAgICAgcmV0dXJuIDMyMDAwOworICAgIGNhc2UgNDQ6CisgICAgICAgIHJldHVybiA0NDEwMDsKKyAgICBjYXNlIDQ4OgorICAgICAgICByZXR1cm4gNDgwMDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJJbGxlZ2FsIHJlc2FtcGxlIGZyZXF1ZW5jeTogJS4zZiBrSHpcbiIsIGZyZXEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKworc3RhdGljIGludAorc2V0X2lkM19hbGJ1bWFydChsYW1lX3QgZ2ZwLCBjaGFyIGNvbnN0KiBmaWxlX25hbWUpCit7CisgICAgaW50IHJldCA9IC0xOworICAgIEZJTEUgKmZwaSA9IDA7CisgICAgY2hhciAqYWxidW1hcnQgPSAwOworCisgICAgaWYgKGZpbGVfbmFtZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmcGkgPSBmb3BlbihmaWxlX25hbWUsICJyYiIpOworICAgIGlmICghZnBpKSB7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzaXplX3Qgc2l6ZTsKKworICAgICAgICBmc2VlayhmcGksIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgc2l6ZSA9IGZ0ZWxsKGZwaSk7CisgICAgICAgIGZzZWVrKGZwaSwgMCwgU0VFS19TRVQpOworICAgICAgICBhbGJ1bWFydCA9IChjaGFyICopbWFsbG9jKHNpemUpOworICAgICAgICBpZiAoIWFsYnVtYXJ0KSB7CisgICAgICAgICAgICByZXQgPSAyOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGZyZWFkKGFsYnVtYXJ0LCAxLCBzaXplLCBmcGkpICE9IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gaWQzdGFnX3NldF9hbGJ1bWFydChnZnAsIGFsYnVtYXJ0LCBzaXplKSA/IDQgOiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShhbGJ1bWFydCk7CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZwaSk7CisgICAgfQorICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSAxOiBlcnJvcl9wcmludGYoIkNvdWxkIG5vdCBmaW5kOiAnJXMnLlxuIiwgZmlsZV9uYW1lKTsgYnJlYWs7CisgICAgY2FzZSAyOiBlcnJvcl9wcmludGYoIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHJlYWRpbmcgdGhlIGFsYnVtYXJ0LlxuIik7IGJyZWFrOworICAgIGNhc2UgMzogZXJyb3JfcHJpbnRmKCJSZWFkIGVycm9yOiAnJXMnLlxuIiwgZmlsZV9uYW1lKTsgYnJlYWs7CisgICAgY2FzZSA0OiBlcnJvcl9wcmludGYoIlVuc3VwcG9ydGVkIGltYWdlOiAnJXMnLlxuU3BlY2lmeSBKUEVHL1BORy9HSUYgaW1hZ2UgKDEyOEtCIG1heGltdW0pXG4iLCBmaWxlX25hbWUpOyBicmVhazsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCitlbnVtIElEM1RBR19NT0RFIAoreyBJRDNUQUdfTU9ERV9ERUZBVUxUCissIElEM1RBR19NT0RFX1YxX09OTFkKKywgSUQzVEFHX01PREVfVjJfT05MWQorfTsKKworLyogVWdseSwgTk9UIGZpbmFsIHZlcnNpb24gKi8KKworI2RlZmluZSBUX0lGKHN0cikgICAgICAgICAgaWYgKCAwID09IGxvY2FsX3N0cmNhc2VjbXAgKHRva2VuLHN0cikgKSB7CisjZGVmaW5lIFRfRUxJRihzdHIpICAgICAgICB9IGVsc2UgaWYgKCAwID09IGxvY2FsX3N0cmNhc2VjbXAgKHRva2VuLHN0cikgKSB7CisjZGVmaW5lIFRfRUxJRl9JTlRFUk5BTChzdHIpICAgICAgICB9IGVsc2UgaWYgKElOVEVSTkFMX09QVFMgJiYgKDAgPT0gbG9jYWxfc3RyY2FzZWNtcCAodG9rZW4sc3RyKSkgKSB7CisjZGVmaW5lIFRfRUxJRjIoc3RyMSxzdHIyKSB9IGVsc2UgaWYgKCAwID09IGxvY2FsX3N0cmNhc2VjbXAgKHRva2VuLHN0cjEpICB8fCAgMCA9PSBsb2NhbF9zdHJjYXNlY21wICh0b2tlbixzdHIyKSApIHsKKyNkZWZpbmUgVF9FTFNFICAgICAgICAgICAgIH0gZWxzZSB7CisjZGVmaW5lIFRfRU5EICAgICAgICAgICAgICB9CisKK2ludAorcGFyc2VfYXJncyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorICAgICAgICAgICBjaGFyICpjb25zdCBpblBhdGgsIGNoYXIgKmNvbnN0IG91dFBhdGgsIGNoYXIgKipub2dhcF9pblBhdGgsIGludCAqbnVtX25vZ2FwKQoreworICAgIGludCAgICAgaW5wdXRfZmlsZSA9IDA7ICAvKiBzZXQgdG8gMSBpZiB3ZSBwYXJzZSBhbiBpbnB1dCBmaWxlIG5hbWUgICovCisgICAgaW50ICAgICBpOworICAgIGludCAgICAgYXV0b2NvbnZlcnQgPSAwOworICAgIGRvdWJsZSAgdmFsOworICAgIGludCAgICAgbm9nYXAgPSAwOworICAgIGludCAgICAgbm9nYXBfdGFncyA9IDA7ICAvKiBzZXQgdG8gMSB0byB1c2UgVkJSIHRhZ3MgaW4gTk9HQVAgbW9kZSAqLworICAgIGNvbnN0IGNoYXIgKlByb2dyYW1OYW1lID0gYXJndlswXTsKKyAgICBpbnQgICAgIGNvdW50X25vZ2FwID0gMDsKKyAgICBpbnQgICAgIG5vcmVwbGF5Z2FpbiA9IDA7IC8qIGlzIFJHIGV4cGxpY2l0bHkgZGlzYWJsZWQgYnkgdGhlIHVzZXIgKi8KKyAgICBpbnQgICAgIGlkM3RhZ19tb2RlID0gSUQzVEFHX01PREVfREVGQVVMVDsgCisKKyAgICBpblBhdGhbMF0gPSAnXDAnOworICAgIG91dFBhdGhbMF0gPSAnXDAnOworICAgIC8qIHR1cm4gb24gZGlzcGxheSBvcHRpb25zLiB1c2VyIHNldHRpbmdzIG1heSB0dXJuIHRoZW0gb2ZmIGJlbG93ICovCisgICAgc2lsZW50ID0gMDsKKyAgICBpZ25vcmVfdGFnX2Vycm9ycyA9IDA7CisgICAgYnJoaXN0ID0gMTsKKyAgICBtcDNfZGVsYXkgPSAwOworICAgIG1wM19kZWxheV9zZXQgPSAwOworICAgIHByaW50X2NsaXBwaW5nX2luZm8gPSAwOworICAgIGRpc2FibGVfd2F2X2hlYWRlciA9IDA7CisgICAgaWQzdGFnX2luaXQoZ2ZwKTsKKworICAgIC8qIHByb2Nlc3MgYXJncyAqLworICAgIGZvciAoaSA9IDA7ICsraSA8IGFyZ2M7KSB7CisgICAgICAgIGNoYXIgICAgYzsKKyAgICAgICAgY2hhciAgICp0b2tlbjsKKyAgICAgICAgY2hhciAgICphcmc7CisgICAgICAgIGNoYXIgICAqbmV4dEFyZzsKKyAgICAgICAgaW50ICAgICBhcmdVc2VkOworCisgICAgICAgIHRva2VuID0gYXJndltpXTsKKyAgICAgICAgaWYgKCp0b2tlbisrID09ICctJykgeworICAgICAgICAgICAgYXJnVXNlZCA9IDA7CisgICAgICAgICAgICBuZXh0QXJnID0gaSArIDEgPCBhcmdjID8gYXJndltpICsgMV0gOiAiIjsKKworICAgICAgICAgICAgaWYgKCEqdG9rZW4pIHsgLyogVGhlIHVzZXIgd2FudHMgdG8gdXNlIHN0ZGluIGFuZC9vciBzdGRvdXQuICovCisgICAgICAgICAgICAgICAgaW5wdXRfZmlsZSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGluUGF0aFswXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KGluUGF0aCwgYXJndltpXSwgUEFUSF9NQVggKyAxKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChvdXRQYXRoWzBdID09ICdcMCcpCisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkob3V0UGF0aCwgYXJndltpXSwgUEFUSF9NQVggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqdG9rZW4gPT0gJy0nKSB7IC8qIEdOVSBzdHlsZSAqLworICAgICAgICAgICAgICAgIHRva2VuKys7CisKKyAgICAgICAgICAgICAgICBUX0lGKCJyZXNhbXBsZSIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZShnZnAsIHJlc2FtcGxlX3JhdGUoYXRvZihuZXh0QXJnKSkpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJ2YnItb2xkIikKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfVkJSKGdmcCwgdmJyX3JoKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigidmJyLW5ldyIpCisgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X1ZCUihnZnAsIHZicl9tdHJoKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigidmJyLW10cmgiKQorICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfbXRyaCk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoImNiciIpCisgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X1ZCUihnZnAsIHZicl9vZmYpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJhYnIiKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfYWJyKTsKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlJfbWVhbl9iaXRyYXRlX2ticHMoZ2ZwLCBhdG9pKG5leHRBcmcpKTsKKyAgICAgICAgICAgICAgICAvKiB2YWx1ZXMgbGFyZ2VyIHRoYW4gODAwMCBhcmUgYnBzIChsaWtlIEZyYXVuaG9mZXIpLCBzbyBpdCdzIHN0cmFuZ2UgdG8gZ2V0IDMyMDAwMCBicHMgTVAzIHdoZW4gc3BlY2lmeWluZyA4MDAwIGJwcyBNUDMgKi8KKyAgICAgICAgICAgICAgICBpZiAobGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCkgPj0gODAwMCkKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1lX2dldF9WQlJfbWVhbl9iaXRyYXRlX2ticHMoZ2ZwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAwKSAvIDEwMDApOworCisgICAgICAgICAgICAgICAgbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCwgTWluKGxhbWVfZ2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyhnZnApLCAzMjApKTsKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlJfbWVhbl9iaXRyYXRlX2ticHMoZ2ZwLCBNYXgobGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCksIDgpKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigicjNtaXgiKQorICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9wcmVzZXQoZ2ZwLCBSM01JWCk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoImJpdHdpZHRoIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgaW5fYml0d2lkdGggPSBhdG9pKG5leHRBcmcpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFRfRUxJRigic2lnbmVkIikKKyAgICAgICAgICAgICAgICAgICAgaW5fc2lnbmVkID0gMTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigidW5zaWduZWQiKQorICAgICAgICAgICAgICAgICAgICBpbl9zaWduZWQgPSAwOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJsaXR0bGUtZW5kaWFuIikKKyAgICAgICAgICAgICAgICAgICAgaW5fZW5kaWFuID0gQnl0ZU9yZGVyTGl0dGxlRW5kaWFuOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJiaWctZW5kaWFuIikKKyAgICAgICAgICAgICAgICAgICAgaW5fZW5kaWFuID0gQnl0ZU9yZGVyQmlnRW5kaWFuOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJtcDFpbnB1dCIpCisgICAgICAgICAgICAgICAgICAgIGlucHV0X2Zvcm1hdCA9IHNmX21wMTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigibXAyaW5wdXQiKQorICAgICAgICAgICAgICAgICAgICBpbnB1dF9mb3JtYXQgPSBzZl9tcDI7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm1wM2lucHV0IikKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRfZm9ybWF0ID0gc2ZfbXAzOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJvZ2dpbnB1dCIpCisgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50Zigic29ycnksIHZvcmJpcyBzdXBwb3J0IGluIExBTUUgaXMgZGVwcmVjYXRlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigicGhvbmUiKQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2V0c19zZXQoZ2ZwLCAwLCAwLCB0b2tlbiwgUHJvZ3JhbU5hbWUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiV2FybmluZzogLS1waG9uZSBpcyBkZXByZWNhdGVkLCB1c2UgLS1wcmVzZXQgcGhvbmUgaW5zdGVhZCEiKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigidm9pY2UiKQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2V0c19zZXQoZ2ZwLCAwLCAwLCB0b2tlbiwgUHJvZ3JhbU5hbWUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiV2FybmluZzogLS12b2ljZSBpcyBkZXByZWNhdGVkLCB1c2UgLS1wcmVzZXQgdm9pY2UgaW5zdGVhZCEiKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRl9JTlRFUk5BTCgibm9zaG9ydCIpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9ub19zaG9ydF9ibG9ja3MoZ2ZwLCAxKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRl9JTlRFUk5BTCgic2hvcnQiKQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfbm9fc2hvcnRfYmxvY2tzKGdmcCwgMCk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUZfSU5URVJOQUwoImFsbHNob3J0IikKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X2ZvcmNlX3Nob3J0X2Jsb2NrcyhnZnAsIDEpOworCisKKyAgICAgICAgICAgICAgICBUX0VMSUYoImRlY29kZSIpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9kZWNvZGVfb25seShnZnAsIDEpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJmbHVzaCIpCisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3dyaXRlID0gMTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigiZGVjb2RlLW1wM2RlbGF5IikKKyAgICAgICAgICAgICAgICAgICAgbXAzX2RlbGF5ID0gYXRvaShuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICBtcDNfZGVsYXlfc2V0ID0gMTsKKyAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigibm9yZXMiKQorICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9kaXNhYmxlX3Jlc2Vydm9pcihnZnAsIDEpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJzdHJpY3RseS1lbmZvcmNlLUlTTyIpCisgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X3N0cmljdF9JU08oZ2ZwLCAxKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigic2NhbGUiKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfc2NhbGUoZ2ZwLCAoZmxvYXQpIGF0b2YobmV4dEFyZykpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJzY2FsZS1sIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3NjYWxlX2xlZnQoZ2ZwLCAoZmxvYXQpIGF0b2YobmV4dEFyZykpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJzY2FsZS1yIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3NjYWxlX3JpZ2h0KGdmcCwgKGZsb2F0KSBhdG9mKG5leHRBcmcpKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigibm9hc20iKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChuZXh0QXJnLCAibW14IikpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9hc21fb3B0aW1pemF0aW9ucyhnZnAsIE1NWCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobmV4dEFyZywgIjNkbm93IikpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9hc21fb3B0aW1pemF0aW9ucyhnZnAsIEFNRF8zRE5PVywgMCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobmV4dEFyZywgInNzZSIpKQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfYXNtX29wdGltaXphdGlvbnMoZ2ZwLCBTU0UsIDApOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJmcmVlZm9ybWF0IikKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZnJlZV9mb3JtYXQoZ2ZwLCAxKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigicmVwbGF5Z2Fpbi1mYXN0IikKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZmluZFJlcGxheUdhaW4oZ2ZwLCAxKTsKKworI2lmZGVmIERFQ09ERV9PTl9USEVfRkxZCisgICAgICAgICAgICAgICAgVF9FTElGKCJyZXBsYXlnYWluLWFjY3VyYXRlIikKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZGVjb2RlX29uX3RoZV9mbHkoZ2ZwLCAxKTsKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9maW5kUmVwbGF5R2FpbihnZnAsIDEpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5vcmVwbGF5Z2FpbiIpCisgICAgICAgICAgICAgICAgICAgIG5vcmVwbGF5Z2FpbiA9IDE7CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfZmluZFJlcGxheUdhaW4oZ2ZwLCAwKTsKKworCisjaWZkZWYgREVDT0RFX09OX1RIRV9GTFkKKyAgICAgICAgICAgICAgICBUX0VMSUYoImNsaXBkZXRlY3QiKQorICAgICAgICAgICAgICAgICAgICBwcmludF9jbGlwcGluZ19pbmZvID0gMTsKKyAgICAgICAgICAgICAgICBsYW1lX3NldF9kZWNvZGVfb25fdGhlX2ZseShnZnAsIDEpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5vaGlzdCIpCisgICAgICAgICAgICAgICAgICAgIGJyaGlzdCA9IDA7CisKKyNpZiBkZWZpbmVkKF9fT1MyX18pIHx8IGRlZmluZWQoV0lOMzIpCisgICAgICAgICAgICAgICAgVF9FTElGKCJwcmlvcml0eSIpCisgICAgICAgICAgICAgICAgY2hhciAgICplbmRwdHI7CisgICAgICAgICAgICAgICAgaW50ICAgICBwcmlvcml0eSA9IChpbnQpIHN0cnRvbChuZXh0QXJnLCAmZW5kcHRyLCAxMCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZHB0ciAhPSBuZXh0QXJnKSB7CisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyMgaWYgZGVmaW5lZChfX09TMl9fKQorICAgICAgICAgICAgICAgIHNldE9TMlByaW9yaXR5KGdmcCwgcHJpb3JpdHkpOworIyBlbHNlIC8qIFdJTjMyICovCisgICAgICAgICAgICAgICAgc2V0V2luMzJQcmlvcml0eShnZnAsIHByaW9yaXR5KTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgLyogb3B0aW9ucyBmb3IgSUQzIHRhZyAqLworICAgICAgICAgICAgICAgIFRfRUxJRigidHQiKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWQzX3RhZyhnZnAsICd0JywgVEVOQ19SQVcsIG5leHRBcmcpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJ0YSIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIGlkM190YWcoZ2ZwLCAnYScsIFRFTkNfUkFXLCBuZXh0QXJnKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigidGwiKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICBpZDNfdGFnKGdmcCwgJ2wnLCBURU5DX1JBVywgbmV4dEFyZyk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoInR5IikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgaWQzX3RhZyhnZnAsICd5JywgVEVOQ19SQVcsIG5leHRBcmcpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJ0YyIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIGlkM190YWcoZ2ZwLCAnYycsIFRFTkNfUkFXLCBuZXh0QXJnKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigidG4iKQorICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gaWQzX3RhZyhnZnAsICduJywgVEVOQ19SQVcsIG5leHRBcmcpOworICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBpZ25vcmVfdGFnX2Vycm9ycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZDN0YWdfbW9kZSA9PSBJRDNUQUdfTU9ERV9WMV9PTkxZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiVGhlIHRyYWNrIG51bWJlciBoYXMgdG8gYmUgYmV0d2VlbiAxIGFuZCAyNTUgZm9yIElEM3YxLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWQzdGFnX21vZGUgPT0gSUQzVEFHX01PREVfVjJfT05MWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFjayB3aWxsIGJlIHN0b3JlZCBhcy1pcyBpbiBJRDN2MiBjYXNlLCBzbyBubyBwcm9ibGVtIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJUaGUgdHJhY2sgbnVtYmVyIGhhcyB0byBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBmb3IgSUQzdjEsIGlnbm9yZWQgZm9yIElEM3YxLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRfRUxJRigidGciKQorICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gaWQzX3RhZyhnZnAsICdnJywgVEVOQ19SQVcsIG5leHRBcmcpOworICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBpZ25vcmVfdGFnX2Vycm9ycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJVbmtub3duIElEM3YxIGdlbnJlIG51bWJlcjogJyVzJy5cbiIsIG5leHRBcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJldCA9PSAtMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQzdGFnX21vZGUgPT0gSUQzVEFHX01PREVfVjFfT05MWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJVbmtub3duIElEM3YxIGdlbnJlOiAnJXMnLlxuIiwgbmV4dEFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWQzdGFnX21vZGUgPT0gSUQzVEFHX01PREVfVjJfT05MWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2VucmUgd2lsbCBiZSBzdG9yZWQgYXMtaXMgaW4gSUQzdjIgY2FzZSwgc28gbm8gcHJvYmxlbSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lsZW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIlVua25vd24gSUQzdjEgZ2VucmU6ICclcycuICBTZXR0aW5nIElEM3YxIGdlbnJlIHRvICdPdGhlcidcbiIsIG5leHRBcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIkludGVybmFsIGVycm9yLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRfRUxJRigidHYiKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkM190YWcoZ2ZwLCAndicsIFRFTkNfUkFXLCBuZXh0QXJnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJJbnZhbGlkIGZpZWxkIHZhbHVlOiAnJXMnLiBJZ25vcmVkXG4iLCBuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVF9FTElGKCJ0aSIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoc2V0X2lkM19hbGJ1bWFydChnZnAsIG5leHRBcmcpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGlnbm9yZV90YWdfZXJyb3JzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoImlnbm9yZS10YWctZXJyb3JzIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV90YWdfZXJyb3JzID0gMTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigiYWRkLWlkM3YyIikKKyAgICAgICAgICAgICAgICAgICAgaWQzdGFnX2FkZF92MihnZnApOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJpZDN2MS1vbmx5IikKKyAgICAgICAgICAgICAgICAgICAgaWQzdGFnX3YxX29ubHkoZ2ZwKTsKKyAgICAgICAgICAgICAgICAgICAgaWQzdGFnX21vZGUgPSBJRDNUQUdfTU9ERV9WMV9PTkxZOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJpZDN2Mi1vbmx5IikKKyAgICAgICAgICAgICAgICAgICAgaWQzdGFnX3YyX29ubHkoZ2ZwKTsKKyAgICAgICAgICAgICAgICAgICAgaWQzdGFnX21vZGUgPSBJRDNUQUdfTU9ERV9WMl9PTkxZOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJzcGFjZS1pZDN2MSIpCisgICAgICAgICAgICAgICAgICAgIGlkM3RhZ19zcGFjZV92MShnZnApOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJwYWQtaWQzdjIiKQorICAgICAgICAgICAgICAgICAgICBpZDN0YWdfcGFkX3YyKGdmcCk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoInBhZC1pZDN2Mi1zaXplIikKKyAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBhdG9pKG5leHRBcmcpOworICAgICAgICAgICAgICAgICAgICBuID0gbiA8PSAxMjgwMDAgPyBuIDogMTI4MDAwOworICAgICAgICAgICAgICAgICAgICBuID0gbiA+PSAwICAgICAgPyBuIDogMDsKKyAgICAgICAgICAgICAgICAgICAgaWQzdGFnX3NldF9wYWQoZ2ZwLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisKKworICAgICAgICAgICAgICAgIFRfRUxJRigiZ2VucmUtbGlzdCIpCisgICAgICAgICAgICAgICAgICAgIGlkM3RhZ19nZW5yZV9saXN0KGdlbnJlX2xpc3RfaGFuZGxlciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKworI2lmZGVmIEhBVkVfSUNPTlYKKyAgICAgICAgICAgICAgICAgICAgLyogc29tZSBleHBlcmltZW50YWwgc3dpdGNoZXMgZm9yIHNldHRpbmcgSUQzIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgICogd2l0aCBwcm9wZXIgY2hhcmFjdGVyIGVuY29kaW5ncworICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFRfRUxJRigibFRpdGxlIikgIGFyZ1VzZWQgPSAxOyBpZDNfdGFnKGdmcCwgJ3QnLCBURU5DX0xBVElOMSwgbmV4dEFyZyk7CisgICAgICAgICAgICAgICAgVF9FTElGKCJsQXJ0aXN0IikgYXJnVXNlZCA9IDE7IGlkM190YWcoZ2ZwLCAnYScsIFRFTkNfTEFUSU4xLCBuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICBUX0VMSUYoImxBbGJ1bSIpICBhcmdVc2VkID0gMTsgaWQzX3RhZyhnZnAsICdsJywgVEVOQ19MQVRJTjEsIG5leHRBcmcpOworICAgICAgICAgICAgICAgIFRfRUxJRigibEdlbnJlIikgIGFyZ1VzZWQgPSAxOyBpZDNfdGFnKGdmcCwgJ2cnLCBURU5DX0xBVElOMSwgbmV4dEFyZyk7CisgICAgICAgICAgICAgICAgVF9FTElGKCJsQ29tbWVudCIpYXJnVXNlZCA9IDE7IGlkM190YWcoZ2ZwLCAnYycsIFRFTkNfTEFUSU4xLCBuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICBUX0VMSUYoImxGaWVsZHZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZDNfdGFnKGdmcCwgJ3YnLCBURU5DX0xBVElOMSwgbmV4dEFyZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiSW52YWxpZCBmaWVsZCB2YWx1ZTogJyVzJy4gSWdub3JlZFxuIiwgbmV4dEFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRfRUxJRigidVRpdGxlIikgIGFyZ1VzZWQgPSAxOyBpZDNfdGFnKGdmcCwgJ3QnLCBURU5DX1VDUzIsIG5leHRBcmcpOworICAgICAgICAgICAgICAgIFRfRUxJRigidUFydGlzdCIpIGFyZ1VzZWQgPSAxOyBpZDNfdGFnKGdmcCwgJ2EnLCBURU5DX1VDUzIsIG5leHRBcmcpOworICAgICAgICAgICAgICAgIFRfRUxJRigidUFsYnVtIikgIGFyZ1VzZWQgPSAxOyBpZDNfdGFnKGdmcCwgJ2wnLCBURU5DX1VDUzIsIG5leHRBcmcpOworICAgICAgICAgICAgICAgIFRfRUxJRigidUdlbnJlIikgIGFyZ1VzZWQgPSAxOyBpZDNfdGFnKGdmcCwgJ2cnLCBURU5DX1VDUzIsIG5leHRBcmcpOworICAgICAgICAgICAgICAgIFRfRUxJRigidUNvbW1lbnQiKWFyZ1VzZWQgPSAxOyBpZDNfdGFnKGdmcCwgJ2MnLCBURU5DX1VDUzIsIG5leHRBcmcpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgVF9FTElGKCJ1RmllbGR2YWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoaWQzX3RhZyhnZnAsICd2JywgVEVOQ19VQ1MyLCBuZXh0QXJnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpbGVudCA8IDEwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJJbnZhbGlkIGZpZWxkIHZhbHVlOiAnJXMnLiBJZ25vcmVkXG4iLCBuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICovCisjZW5kaWYKKworICAgICAgICAgICAgICAgIFRfRUxJRigibG93cGFzcyIpCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGF0b2YobmV4dEFyZyk7CisgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfbG93cGFzc2ZyZXEoZ2ZwLCAtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiB1c2VmdWwgYXJlIDAuMDAxIGtIei4uLjUwIGtIeiwgNTAgSHouLi41MDAwMCBIeiAqLworICAgICAgICAgICAgICAgICAgICBpZiAodmFsIDwgMC4wMDEgfHwgdmFsID4gNTAwMDAuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIk11c3Qgc3BlY2lmeSBsb3dwYXNzIHdpdGggLS1sb3dwYXNzIGZyZXEsIGZyZXEgPj0gMC4wMDEga0h6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9sb3dwYXNzZnJlcShnZnAsIChpbnQpICh2YWwgKiAodmFsIDwgNTAuID8gMS5lMyA6IDEuZTApICsgMC41KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFRfRUxJRigibG93cGFzcy13aWR0aCIpCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGF0b2YobmV4dEFyZyk7CisgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgLyogdXNlZnVsIGFyZSAwLjAwMSBrSHouLi4xNiBrSHosIDE2IEh6Li4uNTAwMDAgSHogKi8KKyAgICAgICAgICAgICAgICBpZiAodmFsIDwgMC4wMDEgfHwgdmFsID4gNTAwMDAuKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZgorICAgICAgICAgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgbG93cGFzcyB3aWR0aCB3aXRoIC0tbG93cGFzcy13aWR0aCBmcmVxLCBmcmVxID49IDAuMDAxIGtIelxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfbG93cGFzc3dpZHRoKGdmcCwgKGludCkgKHZhbCAqICh2YWwgPCAxNi4gPyAxLmUzIDogMS5lMCkgKyAwLjUpKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigiaGlnaHBhc3MiKQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBhdG9mKG5leHRBcmcpOworICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwLjApIHsKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfaGlnaHBhc3NmcmVxKGdmcCwgLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogdXNlZnVsIGFyZSAwLjAwMSBrSHouLi4xNiBrSHosIDE2IEh6Li4uNTAwMDAgSHogKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA8IDAuMDAxIHx8IHZhbCA+IDUwMDAwLikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJNdXN0IHNwZWNpZnkgaGlnaHBhc3Mgd2l0aCAtLWhpZ2hwYXNzIGZyZXEsIGZyZXEgPj0gMC4wMDEga0h6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9oaWdocGFzc2ZyZXEoZ2ZwLCAoaW50KSAodmFsICogKHZhbCA8IDE2LiA/IDEuZTMgOiAxLmUwKSArIDAuNSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBUX0VMSUYoImhpZ2hwYXNzLXdpZHRoIikKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gYXRvZihuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAvKiB1c2VmdWwgYXJlIDAuMDAxIGtIei4uLjE2IGtIeiwgMTYgSHouLi41MDAwMCBIeiAqLworICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwLjAwMSB8fCB2YWwgPiA1MDAwMC4pIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmCisgICAgICAgICAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSBoaWdocGFzcyB3aWR0aCB3aXRoIC0taGlnaHBhc3Mtd2lkdGggZnJlcSwgZnJlcSA+PSAwLjAwMSBrSHpcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhbWVfc2V0X2hpZ2hwYXNzd2lkdGgoZ2ZwLCAoaW50KSB2YWwpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJjb21wIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgdmFsID0gYXRvZihuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsIDwgMS4wKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiTXVzdCBzcGVjaWZ5IGNvbXByZXNzaW9uIHJhdGlvID49IDEuMFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFtZV9zZXRfY29tcHJlc3Npb25fcmF0aW8oZ2ZwLCAoZmxvYXQpIHZhbCk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5vdGVtcCIpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF91c2VUZW1wb3JhbChnZnAsIDApOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJpbnRlcmNoIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X2ludGVyQ2hSYXRpbyhnZnAsIChmbG9hdCkgYXRvZihuZXh0QXJnKSk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoInRlbXBvcmFsLW1hc2tpbmciKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfdXNlVGVtcG9yYWwoZ2ZwLCBhdG9pKG5leHRBcmcpID8gMSA6IDApOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJuc3BzeXR1bmUiKQorICAgICAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5zc2FmZWpvaW50IikKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZXhwX25zcHN5dHVuZShnZnAsIGxhbWVfZ2V0X2V4cF9uc3BzeXR1bmUoZ2ZwKSB8IDIpOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJuc21zZml4IikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X21zZml4KGdmcCwgYXRvZihuZXh0QXJnKSk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5zLWJhc3MiKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgZDsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICBrOworICAgICAgICAgICAgICAgICAgICBkID0gYXRvZihuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICAgICAgayA9IChpbnQpIChkICogNCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChrIDwgLTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgayA9IC0zMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPiAzMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAzMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgayArPSA2NDsKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZXhwX25zcHN5dHVuZShnZnAsIGxhbWVfZ2V0X2V4cF9uc3BzeXR1bmUoZ2ZwKSB8IChrIDw8IDIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5zLWFsdG8iKQorICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgZDsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICBrOworICAgICAgICAgICAgICAgICAgICBkID0gYXRvZihuZXh0QXJnKTsKKyAgICAgICAgICAgICAgICAgICAgayA9IChpbnQpIChkICogNCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChrIDwgLTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgayA9IC0zMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPiAzMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAzMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgayArPSA2NDsKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZXhwX25zcHN5dHVuZShnZnAsIGxhbWVfZ2V0X2V4cF9uc3BzeXR1bmUoZ2ZwKSB8IChrIDw8IDgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5zLXRyZWJsZSIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkOworICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGs7CisgICAgICAgICAgICAgICAgICAgIGQgPSBhdG9mKG5leHRBcmcpOworICAgICAgICAgICAgICAgICAgICBrID0gKGludCkgKGQgKiA0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPCAtMzIpCisgICAgICAgICAgICAgICAgICAgICAgICBrID0gLTMyOworICAgICAgICAgICAgICAgICAgICBpZiAoayA+IDMxKQorICAgICAgICAgICAgICAgICAgICAgICAgayA9IDMxOworICAgICAgICAgICAgICAgICAgICBpZiAoayA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDY0OworICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9leHBfbnNwc3l0dW5lKGdmcCwgbGFtZV9nZXRfZXhwX25zcHN5dHVuZShnZnApIHwgKGsgPDwgMTQpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5zLXNmYjIxIikKKyAgICAgICAgICAgICAgICAgICAgLyogIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBOYW9raSdzIG9yaWdpbmFsIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAqICBucy1zZmIyMSBzcGVjaWZpZXMgaG93IHRvIGNoYW5nZSBucy10cmVibGUgZm9yIHNmYjIxICovCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkOworICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGs7CisgICAgICAgICAgICAgICAgICAgIGQgPSBhdG9mKG5leHRBcmcpOworICAgICAgICAgICAgICAgICAgICBrID0gKGludCkgKGQgKiA0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPCAtMzIpCisgICAgICAgICAgICAgICAgICAgICAgICBrID0gLTMyOworICAgICAgICAgICAgICAgICAgICBpZiAoayA+IDMxKQorICAgICAgICAgICAgICAgICAgICAgICAgayA9IDMxOworICAgICAgICAgICAgICAgICAgICBpZiAoayA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDY0OworICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9leHBfbnNwc3l0dW5lKGdmcCwgbGFtZV9nZXRfZXhwX25zcHN5dHVuZShnZnApIHwgKGsgPDwgMjApKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5zcHN5dHVuZTIiKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogc29tZSBtb3JlIEdOVS1pc2ggb3B0aW9ucyBjb3VsZCBiZSBhZGRlZAorICAgICAgICAgICAgICAgICAqIGJyaWVmICAgICAgICAgPT4gZmV3IG1lc3NhZ2VzIG9uIHNjcmVlbiAobmFtZSwgc3RhdHVzIHJlcG9ydCkKKyAgICAgICAgICAgICAgICAgKiBvL291dHB1dCBmaWxlID0+IHNwZWNpZmllcyBvdXRwdXQgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgKiBPICAgICAgICAgICAgID0+IHN0ZG91dAorICAgICAgICAgICAgICAgICAqIGkvaW5wdXQgZmlsZSAgPT4gc3BlY2lmaWVzIGlucHV0IGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICogSSAgICAgICAgICAgICA9PiBzdGRpbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFRfRUxJRjIoInF1aWV0IiwgInNpbGVudCIpCisgICAgICAgICAgICAgICAgICAgIHNpbGVudCA9IDEwOyAvKiBvbiBhIHNjYWxlIGZyb20gMSB0byAxMCBiZSB2ZXJ5IHNpbGVudCAqLworCisgICAgICAgICAgICAgICAgVF9FTElGKCJicmllZiIpCisgICAgICAgICAgICAgICAgICAgIHNpbGVudCA9IC01OyAvKiBwcmludCBmZXcgaW5mbyBvbiBzY3JlZW4gKi8KKworICAgICAgICAgICAgICAgIFRfRUxJRigidmVyYm9zZSIpCisgICAgICAgICAgICAgICAgICAgIHNpbGVudCA9IC0xMDsgLyogcHJpbnQgYSBsb3Qgb24gc2NyZWVuICovCisKKyAgICAgICAgICAgICAgICBUX0VMSUYyKCJ2ZXJzaW9uIiwgImxpY2Vuc2UiKQorICAgICAgICAgICAgICAgICAgICBwcmludF9saWNlbnNlKHN0ZG91dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworCisgICAgICAgICAgICAgICAgVF9FTElGMigiaGVscCIsICJ1c2FnZSIpCisgICAgICAgICAgICAgICAgICAgIHNob3J0X2hlbHAoZ2ZwLCBzdGRvdXQsIFByb2dyYW1OYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoImxvbmdoZWxwIikKKyAgICAgICAgICAgICAgICAgICAgbG9uZ19oZWxwKGdmcCwgc3Rkb3V0LCBQcm9ncmFtTmFtZSwgMCAvKiBsZXNzbW9kZT1OTyAqLyApOworICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKworICAgICAgICAgICAgICAgIFRfRUxJRigiPyIpCisjaWZkZWYgX191bml4X18KKyAgICAgICAgICAgICAgICBGSUxFICAgKmZwID0gcG9wZW4oImxlc3MgLU1xYyIsICJ3Iik7CisgICAgICAgICAgICAgICAgbG9uZ19oZWxwKGdmcCwgZnAsIFByb2dyYW1OYW1lLCAwIC8qIGxlc3Ntb2RlPU5PICovICk7CisgICAgICAgICAgICAgICAgcGNsb3NlKGZwKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGxvbmdfaGVscChnZnAsIHN0ZG91dCwgUHJvZ3JhbU5hbWUsIDEgLyogbGVzc21vZGU9WUVTICovICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYyKCJwcmVzZXQiLCAiYWx0LXByZXNldCIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICBmYXN0ID0gMCwgY2JyID0gMDsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHN0cmNtcChuZXh0QXJnLCAiZmFzdCIpID09IDApIHx8IChzdHJjbXAobmV4dEFyZywgImNiciIpID09IDApKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyY21wKG5leHRBcmcsICJmYXN0IikgPT0gMCkgJiYgKGZhc3QgPCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyY21wKG5leHRBcmcsICJjYnIiKSA9PSAwKSAmJiAoY2JyIDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JyID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEFyZyA9IGkgKyBhcmdVc2VkIDwgYXJnYyA/IGFyZ3ZbaSArIGFyZ1VzZWRdIDogIiI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2V0c19zZXQoZ2ZwLCBmYXN0LCBjYnIsIG5leHRBcmcsIFByb2dyYW1OYW1lKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVF9FTElGKCJkaXNwdGltZSIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIHVwZGF0ZV9pbnRlcnZhbCA9IChmbG9hdCkgYXRvZihuZXh0QXJnKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRigibm9nYXB0YWdzIikKKyAgICAgICAgICAgICAgICAgICAgbm9nYXBfdGFncyA9IDE7CisKKyAgICAgICAgICAgICAgICBUX0VMSUYoIm5vZ2Fwb3V0IikKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KG91dFBhdGgsIG5leHRBcmcpOworICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworCisgICAgICAgICAgICAgICAgVF9FTElGKCJub2dhcCIpCisgICAgICAgICAgICAgICAgICAgIG5vZ2FwID0gMTsKKworCisgICAgICAgICAgICAgICAgVF9FTElGX0lOVEVSTkFMKCJ0dW5lIikgLyp3aXRob3V0IGhlbHB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgbGFtZV9zZXRfdHVuZShsYW1lX3QsIGZsb2F0KTsKKyAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfdHVuZShnZnAsIChmbG9hdCkgYXRvZihuZXh0QXJnKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVF9FTElGX0lOVEVSTkFMKCJzaG9ydHRocmVzaG9sZCIpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgICB4LCB5OworICAgICAgICAgICAgICAgICAgICBpbnQgICAgIG4gPSBzc2NhbmYobmV4dEFyZywgIiVmLCVmIiwgJngsICZ5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9zaG9ydF90aHJlc2hvbGQoZ2ZwLCB4LCB5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUX0VMSUZfSU5URVJOQUwoIm1hc2tpbmdhZGp1c3QiKSAvKndpdGhvdXQgaGVscHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X21hc2tpbmdhZGp1c3QoZ2ZwLCAoZmxvYXQpIGF0b2YobmV4dEFyZykpOworCisgICAgICAgICAgICAgICAgVF9FTElGX0lOVEVSTkFMKCJtYXNraW5nYWRqdXN0c2hvcnQiKSAvKndpdGhvdXQgaGVscHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X21hc2tpbmdhZGp1c3Rfc2hvcnQoZ2ZwLCAoZmxvYXQpIGF0b2YobmV4dEFyZykpOworCisgICAgICAgICAgICAgICAgVF9FTElGX0lOVEVSTkFMKCJhdGhjdXJ2ZSIpIC8qd2l0aG91dCBoZWxwdGV4dCAqLworICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsKKyAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfQVRIY3VydmUoZ2ZwLCAoZmxvYXQpIGF0b2YobmV4dEFyZykpOworCisgICAgICAgICAgICAgICAgVF9FTElGX0lOVEVSTkFMKCJuby1wcmVzZXQtdHVuZSIpIC8qd2l0aG91dCBoZWxwdGV4dCAqLworICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfcHJlc2V0X25vdHVuZShnZnAsIDApOworCisgICAgICAgICAgICAgICAgVF9FTElGX0lOVEVSTkFMKCJzdWJzdGVwIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3N1YnN0ZXAoZ2ZwLCBhdG9pKG5leHRBcmcpKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRl9JTlRFUk5BTCgic2JnYWluIikgLyp3aXRob3V0IGhlbHB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9zdWJibG9ja19nYWluKGdmcCwgYXRvaShuZXh0QXJnKSk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUZfSU5URVJOQUwoInNmc2NhbGUiKSAvKndpdGhvdXQgaGVscHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3Nmc2NhbGUoZ2ZwLCAxKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRl9JTlRFUk5BTCgibm9hdGgiKQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfbm9BVEgoZ2ZwLCAxKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRl9JTlRFUk5BTCgiYXRob25seSIpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9BVEhvbmx5KGdmcCwgMSk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUZfSU5URVJOQUwoImF0aHNob3J0IikKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X0FUSHNob3J0KGdmcCwgMSk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUZfSU5URVJOQUwoImF0aGxvd2VyIikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X0FUSGxvd2VyKGdmcCwgKGZsb2F0KSBhdG9mKG5leHRBcmcpKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRl9JTlRFUk5BTCgiYXRodHlwZSIpCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9BVEh0eXBlKGdmcCwgYXRvaShuZXh0QXJnKSk7CisKKyAgICAgICAgICAgICAgICBUX0VMSUZfSU5URVJOQUwoImF0aGFhLXR5cGUiKSAvKiAgc3dpdGNoIGZvciBkZXZlbG9waW5nLCBubyBET0NVICovCisgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOyAvKiBvbmNlIHdhcyAxOkdhYnksIDI6Um9iZXJ0LCAzOkpvbiwgZWxzZTpvZmYgKi8KKyAgICAgICAgICAgICAgICBsYW1lX3NldF9hdGhhYV90eXBlKGdmcCwgYXRvaShuZXh0QXJnKSk7IC8qIG5vdzogMDpvZmYgZWxzZTpKb24gKi8KKworICAgICAgICAgICAgICAgIFRfRUxJRiAoImF0aGFhLXNlbnNpdGl2aXR5IikKKyAgICAgICAgICAgICAgICAgICAgYXJnVXNlZD0xOworICAgICAgICAgICAgICAgIGxhbWVfc2V0X2F0aGFhX3NlbnNpdGl2aXR5KGdmcCwgKGZsb2F0KSBhdG9mKG5leHRBcmcpKTsKKworICAgICAgICAgICAgICAgIFRfRUxJRl9JTlRFUk5BTCgiZGVidWctZmlsZSIpIC8qIHN3aXRjaCBmb3IgZGV2ZWxvcGluZywgbm8gRE9DVSAqLworICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMTsgLyogZmlsZSBuYW1lIHRvIHByaW50IGRlYnVnIGluZm8gaW50byAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0X2RlYnVnX2ZpbGUobmV4dEFyZyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVF9FTFNFIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCIlczogdW5yZWNvZ25pemVkIG9wdGlvbiAtLSVzXG4iLCBQcm9ncmFtTmFtZSwgdG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFRfRU5EICAgaSArPSBhcmdVc2VkOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGMgPSAqdG9rZW4rKykgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICBhcmcgPSAqdG9rZW4gPyB0b2tlbiA6IG5leHRBcmc7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCphcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9tb2RlKGdmcCwgU1RFUkVPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9tb2RlKGdmcCwgRFVBTF9DSEFOTkVMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X2ZvcmNlX21zKGdmcCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2onOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9tb2RlKGdmcCwgSk9JTlRfU1RFUkVPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9tb2RlKGdmcCwgTU9OTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfbW9kZShnZnAsIEpPSU5UX1NURVJFTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiJXM6IC1tIG1vZGUgbXVzdCBiZSBzL2Qvai9mL20gbm90ICVzXG4iLCBQcm9ncmFtTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdWJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLyogdG8gY2hhbmdlIFZCUiBkZWZhdWx0IGxvb2sgaW4gbGFtZS5oICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFtZV9nZXRfVkJSKGdmcCkgPT0gdmJyX29mZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfZGVmYXVsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlJfcXVhbGl0eShnZnAsIChmbG9hdClhdG9mKGFyZykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogdG8gY2hhbmdlIFZCUiBkZWZhdWx0IGxvb2sgaW4gbGFtZS5oICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFtZV9nZXRfVkJSKGdmcCkgPT0gdmJyX29mZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfZGVmYXVsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1VzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgdG1wX3F1YWxpdHkgPSBhdG9pKGFyZyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFggc2hvdWxkIHdlIG1vdmUgdGhpcyBpbnRvIGxhbWVfc2V0X3F1YWxpdHkoKT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wX3F1YWxpdHkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfcXVhbGl0eSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcF9xdWFsaXR5ID4gOSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX3F1YWxpdHkgPSA5OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3F1YWxpdHkoZ2ZwLCB0bXBfcXVhbGl0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfcXVhbGl0eShnZnAsIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3F1YWxpdHkoZ2ZwLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBhdG9mKGFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfaW5fc2FtcGxlcmF0ZShnZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAodmFsICogKHZhbCA8PSAxOTIgPyAxLmUzIDogMS5lMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9icmF0ZShnZnAsIGF0b2koYXJnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlJfbWluX2JpdHJhdGVfa2JwcyhnZnAsIGxhbWVfZ2V0X2JyYXRlKGdmcCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlJfbWF4X2JpdHJhdGVfa2JwcyhnZnAsIGF0b2koYXJnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9WQlJfaGFyZF9taW4oZ2ZwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzogLyogZG9udCB3cml0ZSBWQlIgdGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfYldyaXRlVmJyVGFnKGdmcCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX3dhdl9oZWFkZXIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOiAvKiBkbyB3cml0ZSBWQlIgdGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfYldyaXRlVmJyVGFnKGdmcCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBub2dhcF90YWdzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfd2F2X2hlYWRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAncic6IC8qIGZvcmNlIHJhdyBwY20gaW5wdXQgZmlsZSAqLworI2lmIGRlZmluZWQoTElCU05ERklMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiV0FSTklORzogbGlic25kZmlsZSBtYXkgaWdub3JlIC1yIGFuZCBwZXJmb3JtIGZzZWVrJ3Mgb24gdGhlIGlucHV0LlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGlsZSB3aXRob3V0IGxpYnNuZGZpbGUgaWYgdGhpcyBpcyBhIHByb2JsZW0uXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZm9ybWF0ID0gc2ZfcmF3OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOiAvKiBmb3JjZSBieXRlIHN3YXBwaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBzd2FwYnl0ZXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOiAvKiAoam8pIGVycm9yX3Byb3RlY3Rpb246IGFkZCBjcmMxNiBpbmZvcm1hdGlvbiB0byBzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X2Vycm9yX3Byb3RlY3Rpb24oZ2ZwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzogLyogYXV0b2NvbnZlcnQgaW5wdXQgZmlsZSBmcm9tIHN0ZXJlbyB0byBtb25vIC0gZm9yIG1vbm8gbXAzIGVuY29kaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29udmVydCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfbW9kZShnZnAsIE1PTk8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiAgIC8qKHZvaWQpIGxhbWVfc2V0X2FsbG93X2RpZmZfc2hvcnQoIGdmcCwgMSApOyAqLworICAgICAgICAgICAgICAgICAgICBjYXNlICdrJzogICAvKmxhbWVfc2V0X2xvd3Bhc3NmcmVxKGdmcCwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X2hpZ2hwYXNzZnJlcShnZnAsIC0xKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3ByaW50ZigiV0FSTklORzogLSVjIGlzIG9ic29sZXRlLlxuIiwgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzaWxlbnQgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICBleHBlcmltZW50YWwgc3dpdGNoIC1YOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaWZmZXJudCB0eXBlcyBvZiBxdWFudCBjb21wYXJlIGFyZSB0b3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvbW11bmljYXRlIHRvIGVuZHVzZXJzLCBzbyB0aGV5IHNob3VsZG4ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhlciB0byB0b3kgYXJvdW5kIHdpdGggdGhlbQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICB4LCB5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgbiA9IHNzY2FuZihhcmcsICIlZCwlZCIsICZ4LCAmeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElOVEVSTkFMX09QVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfcXVhbnRfY29tcChnZnAsIHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9xdWFudF9jb21wX3Nob3J0KGdmcCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1knOgorICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZXhwZXJpbWVudGFsWShnZnAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogIGV4cGVyaW1lbnRhbCBzd2l0Y2ggLVo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzd2l0Y2ggaXMgb2Jzb2xldGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IHNzY2FuZihhcmcsICIlZCIsICZuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU5URVJOQUxfT1BUUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9leHBlcmltZW50YWxaKGdmcCwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgICAgICAgICAgYXJnVXNlZCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmFyZykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfZW1waGFzaXMoZ2ZwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X2VtcGhhc2lzKGdmcCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX3NldF9lbXBoYXNpcyhnZnAsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIiVzOiAtZSBlbXAgbXVzdCBiZSBuLzUvYyBub3QgJXNcbiIsIFByb2dyYW1OYW1lLCBhcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfc2V0X2NvcHlyaWdodChnZnAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOgorICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9zZXRfb3JpZ2luYWwoZ2ZwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19oZWxwKGdmcCwgc3Rkb3V0LCBQcm9ncmFtTmFtZSwgMCAvKiBMRVNTTU9ERT1OTyAqLyApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIC0lY1xuIiwgUHJvZ3JhbU5hbWUsIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmdVc2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IHRva2VuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gIiI7IC8qIG5vIG1vcmUgZnJvbSB0b2tlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsgLyogc2tpcCBhcmcgd2UgdXNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdVc2VkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChub2dhcCkgeworICAgICAgICAgICAgICAgIGlmICgobnVtX25vZ2FwICE9IE5VTEwpICYmIChjb3VudF9ub2dhcCA8ICpudW1fbm9nYXApKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkobm9nYXBfaW5QYXRoW2NvdW50X25vZ2FwKytdLCBhcmd2W2ldLCBQQVRIX01BWCArIDEpOworICAgICAgICAgICAgICAgICAgICBpbnB1dF9maWxlID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNvcnJ5LCBjYWxsaW5nIHByb2dyYW0gZGlkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfcHJpbnRmCisgICAgICAgICAgICAgICAgICAgICAgICAoIkVycm9yOiAnbm9nYXAgb3B0aW9uJy4gIENhbGxpbmcgcHJvZ3JhbSBkb2VzIG5vdCBhbGxvdyBub2dhcCBvcHRpb24sIG9yXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBoYXZlIGV4Y2VlZGVkIG1heGltdW0gbnVtYmVyIG9mIGlucHV0IGZpbGVzIGZvciB0aGUgbm9nYXAgb3B0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgKm51bV9ub2dhcCA9IC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm9ybWFsIG9wdGlvbnM6ICAgaW5wdXRmaWxlICBbb3V0cHV0ZmlsZV0sIGFuZAorICAgICAgICAgICAgICAgICAgIGVpdGhlciBvbmUgY2FuIGJlIGEgJy0nIGZvciBzdGRpbi9zdGRvdXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5QYXRoWzBdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNweShpblBhdGgsIGFyZ3ZbaV0sIFBBVEhfTUFYICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0X2ZpbGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dFBhdGhbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkob3V0UGF0aCwgYXJndltpXSwgUEFUSF9NQVggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcmludGYoIiVzOiBleGNlc3MgYXJnICVzXG4iLCBQcm9ncmFtTmFtZSwgYXJndltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGxvb3Agb3ZlciBhcmdzICovCisKKyAgICBpZiAoIWlucHV0X2ZpbGUpIHsKKyAgICAgICAgdXNhZ2UoQ29uc29sZV9JTy5Db25zb2xlX2ZwLCBQcm9ncmFtTmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoaW5QYXRoWzBdID09ICctJykKKyAgICAgICAgc2lsZW50ID0gKHNpbGVudCA8PSAxID8gMSA6IHNpbGVudCk7CisjaWZkZWYgV0lOMzIKKyAgICBlbHNlCisgICAgICAgIGRvc1RvTG9uZ0ZpbGVOYW1lKGluUGF0aCk7CisjZW5kaWYKKworICAgIGlmIChvdXRQYXRoWzBdID09ICdcMCcgJiYgY291bnRfbm9nYXAgPT0gMCkgeworICAgICAgICBpZiAoaW5QYXRoWzBdID09ICctJykgeworICAgICAgICAgICAgLyogaWYgaW5wdXQgaXMgc3RkaW4sIGRlZmF1bHQgb3V0cHV0IGlzIHN0ZG91dCAqLworICAgICAgICAgICAgc3RyY3B5KG91dFBhdGgsICItIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJuY3B5KG91dFBhdGgsIGluUGF0aCwgUEFUSF9NQVggKyAxIC0gNCk7CisgICAgICAgICAgICBpZiAobGFtZV9nZXRfZGVjb2RlX29ubHkoZ2ZwKSkgeworICAgICAgICAgICAgICAgIHN0cm5jYXQob3V0UGF0aCwgIi53YXYiLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cm5jYXQob3V0UGF0aCwgIi5tcDMiLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJHIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCAqLworICAgIGlmICghbm9yZXBsYXlnYWluKQorICAgICAgICBsYW1lX3NldF9maW5kUmVwbGF5R2FpbihnZnAsIDEpOworCisgICAgLyogZGlzYWJsZSBWQlIgdGFncyB3aXRoIG5vZ2FwIHVubGVzcyB0aGUgVkJSIHRhZ3MgYXJlIGZvcmNlZCAqLworICAgIGlmIChub2dhcCAmJiBsYW1lX2dldF9iV3JpdGVWYnJUYWcoZ2ZwKSAmJiBub2dhcF90YWdzID09IDApIHsKKyAgICAgICAgY29uc29sZV9wcmludGYoIk5vdGU6IERpc2FibGluZyBWQlIgWGluZy9JbmZvIHRhZyBzaW5jZSBpdCBpbnRlcmZlcmVzIHdpdGggLS1ub2dhcFxuIik7CisgICAgICAgIGxhbWVfc2V0X2JXcml0ZVZiclRhZyhnZnAsIDApOworICAgIH0KKworICAgIC8qIHNvbWUgZmlsZSBvcHRpb25zIG5vdCBhbGxvd2VkIHdpdGggc3Rkb3V0ICovCisgICAgaWYgKG91dFBhdGhbMF0gPT0gJy0nKSB7CisgICAgICAgICh2b2lkKSBsYW1lX3NldF9iV3JpdGVWYnJUYWcoZ2ZwLCAwKTsgLyogdHVybiBvZmYgVkJSIHRhZyAqLworICAgIH0KKworICAgIC8qIGlmIHVzZXIgZGlkIG5vdCBleHBsaWNpdGx5IHNwZWNpZnkgaW5wdXQgaXMgbXAzLCBjaGVjayBmaWxlIG5hbWUgKi8KKyAgICBpZiAoaW5wdXRfZm9ybWF0ID09IHNmX3Vua25vd24pCisgICAgICAgIGlucHV0X2Zvcm1hdCA9IGZpbGVuYW1lX3RvX3R5cGUoaW5QYXRoKTsKKworI2lmICEoZGVmaW5lZCBIQVZFX01QR0xJQiB8fCBkZWZpbmVkIEFNSUdBX01QRUdBKQorICAgIGlmIChpc19tcGVnX2ZpbGVfZm9ybWF0KGlucHV0X2Zvcm1hdCkpIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJFcnJvcjogbGlibXAzbGFtZSBub3QgY29tcGlsZWQgd2l0aCBtcGcxMjMgKmRlY29kaW5nKiBzdXBwb3J0IFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZW5kaWYKKworCisgICAgaWYgKGlucHV0X2Zvcm1hdCA9PSBzZl9vZ2cpIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJzb3JyeSwgdm9yYmlzIHN1cHBvcnQgaW4gTEFNRSBpcyBkZXByZWNhdGVkLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogZGVmYXVsdCBndWVzcyBmb3IgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgaWYgKGF1dG9jb252ZXJ0KQorICAgICAgICAodm9pZCkgbGFtZV9zZXRfbnVtX2NoYW5uZWxzKGdmcCwgMik7CisgICAgZWxzZSBpZiAoTU9OTyA9PSBsYW1lX2dldF9tb2RlKGdmcCkpCisgICAgICAgICh2b2lkKSBsYW1lX3NldF9udW1fY2hhbm5lbHMoZ2ZwLCAxKTsKKyAgICBlbHNlCisgICAgICAgICh2b2lkKSBsYW1lX3NldF9udW1fY2hhbm5lbHMoZ2ZwLCAyKTsKKworICAgIGlmIChsYW1lX2dldF9mcmVlX2Zvcm1hdChnZnApKSB7CisgICAgICAgIGlmIChsYW1lX2dldF9icmF0ZShnZnApIDwgOCB8fCBsYW1lX2dldF9icmF0ZShnZnApID4gNjQwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIkZvciBmcmVlIGZvcm1hdCwgc3BlY2lmeSBhIGJpdHJhdGUgYmV0d2VlbiA4IGFuZCA2NDAga2Jwc1xuIik7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIndpdGggdGhlIC1iIDxiaXRyYXRlPiBvcHRpb25cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGlmIChudW1fbm9nYXAgIT0gTlVMTCkKKyAgICAgICAgKm51bV9ub2dhcCA9IGNvdW50X25vZ2FwOworICAgIHJldHVybiAwOworfQorCisKKy8qIGVuZCBvZiBwYXJzZS5jICovCmRpZmYgLS1naXQgYS9mcm9udGVuZC9wYXJzZS5oIGIvZnJvbnRlbmQvcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU0NTUzCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvcGFyc2UuaApAQCAtMCwwICsxLDEzIEBACisKK2ludCAgICAgdXNhZ2UoRklMRSAqIGNvbnN0IGZwLCBjb25zdCBjaGFyICpQcm9ncmFtTmFtZSk7CitpbnQgICAgIHNob3J0X2hlbHAoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIEZJTEUgKiBjb25zdCBmcCwgY29uc3QgY2hhciAqUHJvZ3JhbU5hbWUpOworaW50ICAgICBsb25nX2hlbHAoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIEZJTEUgKiBjb25zdCBmcCwgY29uc3QgY2hhciAqUHJvZ3JhbU5hbWUsCisgICAgICAgICAgICAgICAgICBpbnQgbGVzc21vZGUpOworaW50ICAgICBkaXNwbGF5X2JpdHJhdGVzKEZJTEUgKiBjb25zdCBmcCk7CisKK2ludCAgICAgcGFyc2VfYXJncyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICpjb25zdCBpblBhdGgsCisgICAgICAgICAgICAgICAgICAgY2hhciAqY29uc3Qgb3V0UGF0aCwgY2hhciAqKm5vZ2FwX2luUGF0aCwgaW50ICptYXhfbm9nYXApOworCit2b2lkICAgIHBhcnNlX2Nsb3NlKCk7CisKKy8qIGVuZCBvZiBwYXJzZS5oICovCmRpZmYgLS1naXQgYS9mcm9udGVuZC9wb3J0YWJsZWlvLmMgYi9mcm9udGVuZC9wb3J0YWJsZWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjMWQzMAotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3BvcnRhYmxlaW8uYwpAQCAtMCwwICsxLDQ5MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTg4LTE5OTEgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogV2FycmFudHkgSW5mb3JtYXRpb24KKyAqIEV2ZW4gdGhvdWdoIEFwcGxlIGhhcyByZXZpZXdlZCB0aGlzIHNvZnR3YXJlLCBBcHBsZSBtYWtlcyBubyB3YXJyYW50eQorICogb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIHdpdGggcmVzcGVjdCB0byB0aGlzCisgKiBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yIGZpdG5lc3MgZm9yIGEKKyAqIHBhcnRpY3VsYXIgcHVycG9zZS4gIEFzIGEgcmVzdWx0LCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiCisgKiBhbmQgeW91LCBpdHMgdXNlciwgYXJlIGFzc3VtaW5nIHRoZSBlbnRpcmUgcmlzayBhcyB0byBpdHMgcXVhbGl0eQorICogYW5kIGFjY3VyYWN5LgorICoKKyAqIFRoaXMgY29kZSBtYXkgYmUgdXNlZCBhbmQgZnJlZWx5IGRpc3RyaWJ1dGVkIGFzIGxvbmcgYXMgaXQgaW5jbHVkZXMKKyAqIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIHdhcnJhbnR5IGluZm9ybWF0aW9uLgorICoKKyAqCisgKiBNb3Rvcm9sYSBwcm9jZXNzb3JzIChNYWNpbnRvc2gsIFN1biwgU3BhcmMsIE1JUFMsIGV0YykKKyAqIHBhY2sgYnl0ZXMgZnJvbSBoaWdoIHRvIGxvdyAodGhleSBhcmUgYmlnLWVuZGlhbikuCisgKiBVc2UgdGhlIEhpZ2hMb3cgcm91dGluZXMgdG8gbWF0Y2ggdGhlIG5hdGl2ZSBmb3JtYXQKKyAqIG9mIHRoZXNlIG1hY2hpbmVzLgorICoKKyAqIEludGVsLWxpa2UgbWFjaGluZXMgKFBDcywgU2VxdWVudCkKKyAqIHBhY2sgYnl0ZXMgZnJvbSBsb3cgdG8gaGlnaCAodGhlIGFyZSBsaXR0bGUtZW5kaWFuKS4KKyAqIFVzZSB0aGUgTG93SGlnaCByb3V0aW5lcyB0byBtYXRjaCB0aGUgbmF0aXZlIGZvcm1hdAorICogb2YgdGhlc2UgbWFjaGluZXMuCisgKgorICogVGhlc2Ugcm91dGluZXMgaGF2ZSBiZWVuIHRlc3RlZCBvbiB0aGUgZm9sbG93aW5nIG1hY2hpbmVzOgorICoJQXBwbGUgTWFjaW50b3NoLCBNUFcgMy4xIEMgY29tcGlsZXIKKyAqCUFwcGxlIE1hY2ludG9zaCwgVEhJTksgQyBjb21waWxlcgorICoJU2lsaWNvbiBHcmFwaGljcyBJUklTLCBNSVBTIGNvbXBpbGVyCisgKglDcmF5IFgvTVAgYW5kIFkvTVAKKyAqCURpZ2l0YWwgRXF1aXBtZW50IFZBWAorICoKKyAqCisgKiBJbXBsZW1lbnRlZCBieSBNYWxjb2xtIFNsYW5leSBhbmQgS2VuIFR1cmtvd3NraS4KKyAqCisgKiBNYWxjb2xtIFNsYW5leSBjb250cmlidXRpb25zIGR1cmluZyAxOTg4LTE5OTAgaW5jbHVkZSBiaWctIGFuZCBsaXR0bGUtCisgKiBlbmRpYW4gZmlsZSBJL08sIGNvbnZlcnNpb24gdG8gYW5kIGZyb20gTW90b3JvbGEncyBleHRlbmRlZCA4MC1iaXQKKyAqIGZsb2F0aW5nLXBvaW50IGZvcm1hdCwgYW5kIGNvbnZlcnNpb25zIHRvIGFuZCBmcm9tIElFRUUgc2luZ2xlLQorICogcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4KKyAqCisgKiBJbiAxOTkxLCBLZW4gVHVya293c2tpIGltcGxlbWVudGVkIHRoZSBjb252ZXJzaW9ucyB0byBhbmQgZnJvbQorICogSUVFRSBkb3VibGUtcHJlY2lzaW9uIGZvcm1hdCwgYWRkZWQgbW9yZSBwcmVjaXNpb24gdG8gdGhlIGV4dGVuZGVkCisgKiBjb252ZXJzaW9ucywgYW5kIGFjY29tbW9kYXRlZCBjb252ZXJzaW9ucyBpbnZvbHZpbmcgKy8tIGluZmluaXR5LAorICogTmFOJ3MsIGFuZCBkZW5vcm1hbGl6ZWQgbnVtYmVycy4KKyAqCisgKiAkSWQ6IHBvcnRhYmxlaW8uYyx2IDEuMTMgMjAwNy8xMC8xNCAxOTo1NDozMiByb2JlcnQgRXhwICQKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZQk8c3RkaW8uaD4KKyNpZiBkZWZpbmVkKF9fcmlzY29zX18pICYmIGRlZmluZWQoRlBBMTApCisjaW5jbHVkZQkieW1hdGguaCIKKyNlbHNlCisjaW5jbHVkZQk8bWF0aC5oPgorI2VuZGlmCisjaW5jbHVkZQkicG9ydGFibGVpby5oIgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCaWcvbGl0dGxlLWVuZGlhbiBpbmRlcGVuZGVudCBJL08gcm91dGluZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEl0IGlzIGEgaG9heCB0byBjYWxsIHRoaXMgY29kZSBwb3J0YWJsZS1JTzoKKyAqIAorICogICAtIEl0IGRvZXNuJ3Qgd29yayBvbiBtYWNoaW5lcyB3aXRoIENIQVJfQklUICE9IDgKKyAqICAgLSBpdCBhbHNvIGRvbid0IHRlc3QgdGhpcyBlcnJvciBjb25kaXRpb24KKyAqICAgLSBvdGhlcndpc2UgaXQgdHJpZXMgdG8gaGFuZGxlIENIQVJfQklUICE9IDggYnkgdGhpbmdzIGxpa2UgCisgKiAgICAgbWFza2luZyAncHV0YyhpJjB4ZmYsZnApJworICogICAtIEl0IGRvZXNuJ3QgaGFuZGxlIEVPRiBpbiBhbnkgd2F5CisgKiAgIC0gaXQgb25seSB3b3JrcyB3aXRoIGludHMgd2l0aCAzMiBvciBtb3JlIGJpdHMKKyAqICAgLSBJdCBpcyBhIGNvbGxlY3Rpb24gb2YgaW5pdGlhbCBidWdneSBjb2RlIHdpdGggcGF0Y2hpbmcgdGhlIGtub3duIGVycm9ycworICogICAgIGluc3RlYWQgb2YgQ09SUkVDVElORyB0aGVtISAKKyAqICAgICBGb3IgdGhhdCBzZWUgY29tbWVudHMgb24gdGhlIG9sZCBSZWFkMTZCaXRzSGlnaExvdygpCisgKi8KKworI2lmZGVmIEtMRU1NXzM2CisKK3NpZ25lZCBpbnQKK1JlYWRCeXRlKEZJTEUgKiBmcCkKK3sKKyAgICBpbnQgICAgIHJlc3VsdCA9IGdldGMoZnApOworICAgIHJldHVybiByZXN1bHQgPT0gRU9GID8gMCA6IChzaWduZWQgY2hhcikgKHJlc3VsdCAmIDB4RkYpOworfQorCit1bnNpZ25lZCBpbnQKK1JlYWRCeXRlVW5zaWduZWQoRklMRSAqIGZwKQoreworICAgIGludCAgICAgcmVzdWx0ID0gZ2V0YyhmcCk7CisgICAgcmV0dXJuIHJlc3VsdCA9PSBFT0YgPyAwIDogKHVuc2lnbmVkIGNoYXIpIChyZXN1bHQgJiAweEZGKTsKK30KKworI2Vsc2UKKworaW50CitSZWFkQnl0ZShGSUxFICogZnApCit7CisgICAgaW50ICAgICByZXN1bHQ7CisKKyAgICByZXN1bHQgPSBnZXRjKGZwKSAmIDB4ZmY7CisgICAgaWYgKHJlc3VsdCAmIDB4ODApCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAtIDB4MTAwOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgS0xFTU1fMzYKKworaW50CitSZWFkMTZCaXRzTG93SGlnaChGSUxFICogZnApCit7CisgICAgaW50ICAgICBsb3cgPSBSZWFkQnl0ZVVuc2lnbmVkKGZwKTsKKyAgICBpbnQgICAgIGhpZ2ggPSBSZWFkQnl0ZShmcCk7CisKKyAgICByZXR1cm4gKGhpZ2ggPDwgOCkgfCBsb3c7Cit9CisKKyNlbHNlCitpbnQKK1JlYWQxNkJpdHNMb3dIaWdoKEZJTEUgKiBmcCkKK3sKKyAgICBpbnQgICAgIGZpcnN0LCBzZWNvbmQsIHJlc3VsdDsKKworICAgIGZpcnN0ID0gMHhmZiAmIGdldGMoZnApOworICAgIHNlY29uZCA9IDB4ZmYgJiBnZXRjKGZwKTsKKworICAgIHJlc3VsdCA9IChzZWNvbmQgPDwgOCkgKyBmaXJzdDsKKyNpZm5kZWYJVEhJTktfQzQyCisgICAgaWYgKHJlc3VsdCAmIDB4ODAwMCkKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0IC0gMHgxMDAwMDsKKyNlbmRpZiAvKiBUSElOS19DICovCisgICAgcmV0dXJuIChyZXN1bHQpOworfQorI2VuZGlmCisKKworI2lmZGVmIEtMRU1NXzM2CisKK2ludAorUmVhZDE2Qml0c0hpZ2hMb3coRklMRSAqIGZwKQoreworICAgIGludCAgICAgaGlnaCA9IFJlYWRCeXRlKGZwKTsKKyAgICBpbnQgICAgIGxvdyA9IFJlYWRCeXRlVW5zaWduZWQoZnApOworCisgICAgcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OworfQorCisjZWxzZQoraW50CitSZWFkMTZCaXRzSGlnaExvdyhGSUxFICogZnApCit7CisgICAgaW50ICAgICBmaXJzdCwgc2Vjb25kLCByZXN1bHQ7CisKKyAgICAvKiBSZWFkcyB0aGUgSGlnaCBiaXRzLCB0aGUgdmFsdWUgaXMgLTEyOC4uLjEyNyAKKyAgICAgKiAod2hpY2ggZ2F2ZSBhZnRlciB1cHNjYWxpbmcgdGhlIC0zMjc2OC4uLiszMjUxMgorICAgICAqIFdoeSB0aGlzIHZhbHVlIGlzIG5vdCBjb252ZXJ0ZWQgdG8gc2lnbmVkIGNoYXI/CisgICAgICovCisgICAgZmlyc3QgPSAweGZmICYgZ2V0YyhmcCk7CisgICAgLyogUmVhZHMgdGhlIExvd3MgYml0cywgdGhlIHZhbHVlIGlzIDAuLi4yNTUgCisgICAgICogVGhpcyBpcyBjb3JyZWN0LiBUaGlzIHZhbHVlIGdpdmVzIGFuIGFkZGl0aW9uYWwgb2Zmc2V0CisgICAgICogZm9yIHRoZSBIaWdoIGJpdHMKKyAgICAgKi8KKyAgICBzZWNvbmQgPSAweGZmICYgZ2V0YyhmcCk7CisKKyAgICAvKiBUaGlzIGlzIHJpZ2h0ICovCisgICAgcmVzdWx0ID0gKGZpcnN0IDw8IDgpICsgc2Vjb25kOworCisgICAgLyogTm93IHdlIGFyZSBzdGFydGluZyB0byBjb3JyZWN0IHRoZSBuYXN0eSBidWcgb2YgdGhlIGZpcnN0IGluc3RydWN0aW9uCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBoaWdoIGJpdHMgaXMgd3JvbmcuIEFsd2F5cy4gU28gd2UgbXVzdCBjb3JyZWN0IHRoaXMKKyAgICAgKiB2YWx1ZS4gVGhpcyBzZWVtcyB0byBiZSBub3QgbmVjZXNzYXJ5IGZvciBUSElOS19DNDIuIFRoaXMgaXMgZWl0aGVyCisgICAgICogYSAxNiBiaXQgY29tcGlsZXIgd2l0aCAxNiBiaXQgaW50cyAod2hlcmUgdGhpcyBidWcgaXMgaGlkZGVuIGFuZCAweDEwMDAwCisgICAgICogaXMgbm90IGluIHRoZSBzY29wZSBvZiBhbiBpbnQpIG9yIGl0IGlzIG5vdCBhIEMgY29tcGlsZXIsIGJ1dCBvbmx5IGEKKyAgICAgKiBDIGxpa2UgY29tcGlsZXIuIEluIHRoZSBmaXJzdCBjYXNlIHRoZSAnI2lmbmRlZiBUSElOS19DNDInIGlzIHdyb25nCisgICAgICogYmVjYXVzZSBpdCdzIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBUSElOS19DNDIgY29tcGlsZXIsIGJ1dCBvZiBhbGwgY29tcGlsZXJzCisgICAgICogd2l0aCBzaXplb2YoaW50KSpDSEFSX0JJVCA8IDE4LgorICAgICAqIEFub3RoZXIgbmFzdHkgdGhpbmcgaXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBkb2Vzbid0IHdvcmsgZm9yIDE2IGJpdCBpbnRzLAorICAgICAqIHNvIHRoaXMgcGF0Y2ggZG9uJ3Qgc29sdmUgdGhlIDE2IGJpdCBwcm9ibGVtLgorICAgICAqLworI2lmbmRlZglUSElOS19DNDIKKyAgICBpZiAocmVzdWx0ICYgMHg4MDAwKQorICAgICAgICByZXN1bHQgPSByZXN1bHQgLSAweDEwMDAwOworI2VuZGlmIC8qIFRISU5LX0MgKi8KKyAgICByZXR1cm4gKHJlc3VsdCk7Cit9CisjZW5kaWYKKwordm9pZAorV3JpdGU4Qml0cyhGSUxFICogZnAsIGludCBpKQoreworICAgIHB1dGMoaSAmIDB4ZmYsIGZwKTsKK30KKworCit2b2lkCitXcml0ZTE2Qml0c0xvd0hpZ2goRklMRSAqIGZwLCBpbnQgaSkKK3sKKyAgICBwdXRjKGkgJiAweGZmLCBmcCk7CisgICAgcHV0YygoaSA+PiA4KSAmIDB4ZmYsIGZwKTsKK30KKworCit2b2lkCitXcml0ZTE2Qml0c0hpZ2hMb3coRklMRSAqIGZwLCBpbnQgaSkKK3sKKyAgICBwdXRjKChpID4+IDgpICYgMHhmZiwgZnApOworICAgIHB1dGMoaSAmIDB4ZmYsIGZwKTsKK30KKworI2lmZGVmIEtMRU1NXzM2CisKK2ludAorUmVhZDI0Qml0c0hpZ2hMb3coRklMRSAqIGZwKQoreworICAgIGludCAgICAgaGlnaCA9IFJlYWRCeXRlKGZwKTsKKyAgICBpbnQgICAgIG1lZCA9IFJlYWRCeXRlVW5zaWduZWQoZnApOworICAgIGludCAgICAgbG93ID0gUmVhZEJ5dGVVbnNpZ25lZChmcCk7CisKKyAgICByZXR1cm4gKGhpZ2ggPDwgMTYpIHwgKG1lZCA8PCA4KSB8IGxvdzsKK30KKworI2Vsc2UKK2ludAorUmVhZDI0Qml0c0hpZ2hMb3coRklMRSAqIGZwKQoreworICAgIGludCAgICAgZmlyc3QsIHNlY29uZCwgdGhpcmQ7CisgICAgaW50ICAgICByZXN1bHQ7CisKKyAgICBmaXJzdCA9IDB4ZmYgJiBnZXRjKGZwKTsKKyAgICBzZWNvbmQgPSAweGZmICYgZ2V0YyhmcCk7CisgICAgdGhpcmQgPSAweGZmICYgZ2V0YyhmcCk7CisKKyAgICByZXN1bHQgPSAoZmlyc3QgPDwgMTYpICsgKHNlY29uZCA8PCA4KSArIHRoaXJkOworICAgIGlmIChyZXN1bHQgJiAweDgwMDAwMCkKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0IC0gMHgxMDAwMDAwOworICAgIHJldHVybiAocmVzdWx0KTsKK30KKyNlbmRpZgorCisjZGVmaW5lCVJlYWQzMkJpdHNMb3dIaWdoKGYpCVJlYWQzMkJpdHMoZikKKworI2lmZGVmIEtMRU1NXzM2CisKK2ludAorUmVhZDMyQml0cyhGSUxFICogZnApCit7CisgICAgaW50ICAgICBsb3cgPSBSZWFkQnl0ZVVuc2lnbmVkKGZwKTsKKyAgICBpbnQgICAgIG1lZGwgPSBSZWFkQnl0ZVVuc2lnbmVkKGZwKTsKKyAgICBpbnQgICAgIG1lZGggPSBSZWFkQnl0ZVVuc2lnbmVkKGZwKTsKKyAgICBpbnQgICAgIGhpZ2ggPSBSZWFkQnl0ZShmcCk7CisKKyAgICByZXR1cm4gKGhpZ2ggPDwgMjQpIHwgKG1lZGggPDwgMTYpIHwgKG1lZGwgPDwgOCkgfCBsb3c7Cit9CisKKyNlbHNlCisKK2ludAorUmVhZDMyQml0cyhGSUxFICogZnApCit7CisgICAgaW50ICAgICBmaXJzdCwgc2Vjb25kLCByZXN1bHQ7CisKKyAgICBmaXJzdCA9IDB4ZmZmZiAmIFJlYWQxNkJpdHNMb3dIaWdoKGZwKTsKKyAgICBzZWNvbmQgPSAweGZmZmYgJiBSZWFkMTZCaXRzTG93SGlnaChmcCk7CisKKyAgICByZXN1bHQgPSAoc2Vjb25kIDw8IDE2KSArIGZpcnN0OworI2lmZGVmCUNSQVkKKyAgICBpZiAocmVzdWx0ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0IC0gMHgxMDAwMDAwMDA7CisjZW5kaWYgLyogQ1JBWSAqLworICAgIHJldHVybiAocmVzdWx0KTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBLTEVNTV8zNgorCitpbnQKK1JlYWQzMkJpdHNIaWdoTG93KEZJTEUgKiBmcCkKK3sKKyAgICBpbnQgICAgIGhpZ2ggPSBSZWFkQnl0ZShmcCk7CisgICAgaW50ICAgICBtZWRoID0gUmVhZEJ5dGVVbnNpZ25lZChmcCk7CisgICAgaW50ICAgICBtZWRsID0gUmVhZEJ5dGVVbnNpZ25lZChmcCk7CisgICAgaW50ICAgICBsb3cgPSBSZWFkQnl0ZVVuc2lnbmVkKGZwKTsKKworICAgIHJldHVybiAoaGlnaCA8PCAyNCkgfCAobWVkaCA8PCAxNikgfCAobWVkbCA8PCA4KSB8IGxvdzsKK30KKworI2Vsc2UKKworaW50CitSZWFkMzJCaXRzSGlnaExvdyhGSUxFICogZnApCit7CisgICAgaW50ICAgICBmaXJzdCwgc2Vjb25kLCByZXN1bHQ7CisKKyAgICBmaXJzdCA9IDB4ZmZmZiAmIFJlYWQxNkJpdHNIaWdoTG93KGZwKTsKKyAgICBzZWNvbmQgPSAweGZmZmYgJiBSZWFkMTZCaXRzSGlnaExvdyhmcCk7CisKKyAgICByZXN1bHQgPSAoZmlyc3QgPDwgMTYpICsgc2Vjb25kOworI2lmZGVmCUNSQVkKKyAgICBpZiAocmVzdWx0ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0IC0gMHgxMDAwMDAwMDA7CisjZW5kaWYKKyAgICByZXR1cm4gKHJlc3VsdCk7Cit9CisKKyNlbmRpZgorCit2b2lkCitXcml0ZTMyQml0cyhGSUxFICogZnAsIGludCBpKQoreworICAgIFdyaXRlMTZCaXRzTG93SGlnaChmcCwgKGludCkgKGkgJiAweGZmZmZMKSk7CisgICAgV3JpdGUxNkJpdHNMb3dIaWdoKGZwLCAoaW50KSAoKGkgPj4gMTYpICYgMHhmZmZmTCkpOworfQorCisKK3ZvaWQKK1dyaXRlMzJCaXRzTG93SGlnaChGSUxFICogZnAsIGludCBpKQoreworICAgIFdyaXRlMTZCaXRzTG93SGlnaChmcCwgKGludCkgKGkgJiAweGZmZmZMKSk7CisgICAgV3JpdGUxNkJpdHNMb3dIaWdoKGZwLCAoaW50KSAoKGkgPj4gMTYpICYgMHhmZmZmTCkpOworfQorCisKK3ZvaWQKK1dyaXRlMzJCaXRzSGlnaExvdyhGSUxFICogZnAsIGludCBpKQoreworICAgIFdyaXRlMTZCaXRzSGlnaExvdyhmcCwgKGludCkgKChpID4+IDE2KSAmIDB4ZmZmZkwpKTsKKyAgICBXcml0ZTE2Qml0c0hpZ2hMb3coZnAsIChpbnQpIChpICYgMHhmZmZmTCkpOworfQorCisjaWZkZWYgS0xFTU1fMzYKK3ZvaWQKK1JlYWRCeXRlcyhGSUxFICogZnAsIGNoYXIgKnAsIGludCBuKQoreworICAgIG1lbXNldChwLCAwLCBuKTsKKyAgICBmcmVhZChwLCAxLCBuLCBmcCk7Cit9CisjZWxzZQordm9pZAorUmVhZEJ5dGVzKEZJTEUgKiBmcCwgY2hhciAqcCwgaW50IG4pCit7CisgICAgLyogV2hhdCBhYm91dCBmcmVhZD8gKi8KKworICAgIHdoaWxlICghZmVvZihmcCkgJiAobi0tID4gMCkpCisgICAgICAgICpwKysgPSBnZXRjKGZwKTsKK30KKyNlbmRpZgorCit2b2lkCitSZWFkQnl0ZXNTd2FwcGVkKEZJTEUgKiBmcCwgY2hhciAqcCwgaW50IG4pCit7CisgICAgcmVnaXN0ZXIgY2hhciAqcSA9IHA7CisKKyAgICAvKiBXaGF0IGFib3V0IGZyZWFkPyAqLworCisgICAgd2hpbGUgKCFmZW9mKGZwKSAmIChuLS0gPiAwKSkKKyAgICAgICAgKnErKyA9IGdldGMoZnApOworCisgICAgLyogSWYgbm90IGFsbCBieXRlcyBjb3VsZCBiZSByZWFkLCB0aGUgcmVzb3J0aW5nIGlzIGRpZmZlcmVudAorICAgICAqIGZyb20gdGhlIG5vcm1hbCByZXNvcnRpbmcuIElzIHRoaXMgaW50ZW50aW9uIG9yIGFub3RoZXIgYnVnPworICAgICAqLworICAgIGZvciAocS0tOyBwIDwgcTsgcCsrLCBxLS0pIHsKKyAgICAgICAgbiA9ICpwOworICAgICAgICAqcCA9ICpxOworICAgICAgICAqcSA9IG47CisgICAgfQorfQorCisjaWZkZWYgS0xFTU1fMzYKK3ZvaWQKK1dyaXRlQnl0ZXMoRklMRSAqIGZwLCBjaGFyICpwLCBpbnQgbikKK3sKKyAgICAvKiByZXR1cm4gbiA9PSAqLworICAgIGZ3cml0ZShwLCAxLCBuLCBmcCk7Cit9CisjZWxzZQordm9pZAorV3JpdGVCeXRlcyhGSUxFICogZnAsIGNoYXIgKnAsIGludCBuKQoreworICAgIC8qIE5vIGVycm9yIGNvbmRpdGlvbiBjaGVja2luZyAqLworICAgIHdoaWxlIChuLS0gPiAwKQorICAgICAgICBwdXRjKCpwKyssIGZwKTsKK30KKyNlbmRpZgorI2lmZGVmIEtMRU1NXzM2Cit2b2lkCitXcml0ZUJ5dGVzU3dhcHBlZChGSUxFICogZnAsIGNoYXIgKnAsIGludCBuKQoreworICAgIHAgKz0gbjsKKyAgICB3aGlsZSAobi0tID4gMCkKKyAgICAgICAgcHV0YygqLS1wLCBmcCk7Cit9CisjZWxzZQordm9pZAorV3JpdGVCeXRlc1N3YXBwZWQoRklMRSAqIGZwLCBjaGFyICpwLCBpbnQgbikKK3sKKyAgICBwICs9IG4gLSAxOworICAgIHdoaWxlIChuLS0gPiAwKQorICAgICAgICBwdXRjKCpwLS0sIGZwKTsKK30KKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIHJvdXRpbmVzIG1ha2UgdXAgZm9yIGRlZmljaWVuY2llcyBpbiBtYW55CisgKiBjb21waWxlcnMgdG8gY29udmVydCBwcm9wZXJseSBiZXR3ZWVuIHVuc2lnbmVkIGludGVnZXJzIGFuZAorICogZmxvYXRpbmctcG9pbnQuICBTb21lIGNvbXBpbGVycyB3aGljaCBoYXZlIHRoaXMgYnVnIGFyZSB0aGUKKyAqIFRISU5LX0MgY29tcGlsZXIgZm9yIHRoZSBNYWNpbnRvc2ggYW5kIHRoZSBDIGNvbXBpbGVyIGZvciB0aGUKKyAqIFNpbGljb24gR3JhcGhpY3MgTUlQUy1iYXNlZCBJcmlzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBhcHBsZWMgICAgICAgICAgIC8qIFRoZSBBcHBsZSBDIGNvbXBpbGVyIHdvcmtzICovCisjIGRlZmluZSBGbG9hdFRvVW5zaWduZWQoZikJKCh1bnNpZ25lZCBsb25nKShmKSkKKyMgZGVmaW5lIFVuc2lnbmVkVG9GbG9hdCh1KQkoKGRvdWJsZSkodSkpCisjZWxzZSAvKiBhcHBsZWMgKi8KKyMgZGVmaW5lIEZsb2F0VG9VbnNpZ25lZChmKQkoKHVuc2lnbmVkIGxvbmcpKCgobG9uZykoKGYpIC0gMjE0NzQ4MzY0OC4wKSkgKyAyMTQ3NDgzNjQ3TCArIDEpKQorIyBkZWZpbmUgVW5zaWduZWRUb0Zsb2F0KHUpCSgoKGRvdWJsZSkoKGxvbmcpKCh1KSAtIDIxNDc0ODM2NDdMIC0gMSkpKSArIDIxNDc0ODM2NDguMCkKKyNlbmRpZiAvKiBhcHBsZWMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeHRlbmRlZCBwcmVjaXNpb24gSUVFRSBmbG9hdGluZy1wb2ludCBjb252ZXJzaW9uIHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGRvdWJsZQorQ29udmVydEZyb21JZWVlRXh0ZW5kZWQoY2hhciAqYnl0ZXMpCit7CisgICAgZG91YmxlICBmOworICAgIGxvbmcgICAgZXhwb247CisgICAgdW5zaWduZWQgbG9uZyBoaU1hbnQsIGxvTWFudDsKKworI2lmZGVmCVRFU1QKKyAgICBwcmludGYoIkNvbnZlcnRGcm9tSUVFRUV4dGVuZGVkKCVseCwlbHgsJWx4LCVseCwlbHgsJWx4LCVseCwlbHgsJWx4LCVseFxyIiwKKyAgICAgICAgICAgKGxvbmcpIGJ5dGVzWzBdLCAobG9uZykgYnl0ZXNbMV0sIChsb25nKSBieXRlc1syXSwgKGxvbmcpIGJ5dGVzWzNdLAorICAgICAgICAgICAobG9uZykgYnl0ZXNbNF0sIChsb25nKSBieXRlc1s1XSwgKGxvbmcpIGJ5dGVzWzZdLAorICAgICAgICAgICAobG9uZykgYnl0ZXNbN10sIChsb25nKSBieXRlc1s4XSwgKGxvbmcpIGJ5dGVzWzldKTsKKyNlbmRpZgorCisgICAgZXhwb24gPSAoKGJ5dGVzWzBdICYgMHg3RikgPDwgOCkgfCAoYnl0ZXNbMV0gJiAweEZGKTsKKyAgICBoaU1hbnQgPSAoKHVuc2lnbmVkIGxvbmcpIChieXRlc1syXSAmIDB4RkYpIDw8IDI0KQorICAgICAgICB8ICgodW5zaWduZWQgbG9uZykgKGJ5dGVzWzNdICYgMHhGRikgPDwgMTYpCisgICAgICAgIHwgKCh1bnNpZ25lZCBsb25nKSAoYnl0ZXNbNF0gJiAweEZGKSA8PCA4KQorICAgICAgICB8ICgodW5zaWduZWQgbG9uZykgKGJ5dGVzWzVdICYgMHhGRikpOworICAgIGxvTWFudCA9ICgodW5zaWduZWQgbG9uZykgKGJ5dGVzWzZdICYgMHhGRikgPDwgMjQpCisgICAgICAgIHwgKCh1bnNpZ25lZCBsb25nKSAoYnl0ZXNbN10gJiAweEZGKSA8PCAxNikKKyAgICAgICAgfCAoKHVuc2lnbmVkIGxvbmcpIChieXRlc1s4XSAmIDB4RkYpIDw8IDgpCisgICAgICAgIHwgKCh1bnNpZ25lZCBsb25nKSAoYnl0ZXNbOV0gJiAweEZGKSk7CisKKyAgICAvKiBUaGlzIGNhc2Ugc2hvdWxkIGFsc28gYmUgY2FsbGVkIGlmIHRoZSBudW1iZXIgaXMgYmVsb3cgdGhlIHNtYWxsZXN0CisgICAgICogcG9zaXRpdmUgZG91YmxlIHZhcmlhYmxlICovCisgICAgaWYgKGV4cG9uID09IDAgJiYgaGlNYW50ID09IDAgJiYgbG9NYW50ID09IDApIHsKKyAgICAgICAgZiA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUaGlzIGNhc2Ugc2hvdWxkIGFsc28gYmUgY2FsbGVkIGlmIHRoZSBudW1iZXIgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIAorICAgICAgICAgKiBhIGRvdWJsZSB2YXJpYWJsZSAqLworCisgICAgICAgIGlmIChleHBvbiA9PSAweDdGRkYpIHsgLyogSW5maW5pdHkgb3IgTmFOICovCisgICAgICAgICAgICBmID0gSFVHRV9WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBleHBvbiAtPSAxNjM4MzsKKyAgICAgICAgICAgIGYgPSBsZGV4cChVbnNpZ25lZFRvRmxvYXQoaGlNYW50KSwgKGludCkgKGV4cG9uIC09IDMxKSk7CisgICAgICAgICAgICBmICs9IGxkZXhwKFVuc2lnbmVkVG9GbG9hdChsb01hbnQpLCAoaW50KSAoZXhwb24gLT0gMzIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChieXRlc1swXSAmIDB4ODApCisgICAgICAgIHJldHVybiAtZjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmOworfQorCisKKworCisKK2RvdWJsZQorUmVhZEllZWVFeHRlbmRlZEhpZ2hMb3coRklMRSAqIGZwKQoreworICAgIGNoYXIgICAgYnl0ZXNbMTBdOworCisgICAgUmVhZEJ5dGVzKGZwLCBieXRlcywgMTApOworICAgIHJldHVybiBDb252ZXJ0RnJvbUllZWVFeHRlbmRlZChieXRlcyk7Cit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC9wb3J0YWJsZWlvLmggYi9mcm9udGVuZC9wb3J0YWJsZWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0YWJjNgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3BvcnRhYmxlaW8uaApAQCAtMCwwICsxLDkxIEBACisjaWZuZGVmIExBTUVfUE9SVEFCTEVJT19ICisjZGVmaW5lIExBTUVfUE9SVEFCTEVJT19ICisvKiBDb3B5cmlnaHQgKEMpIDE5ODgtMTk5MSBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBXYXJyYW50eSBJbmZvcm1hdGlvbgorICogRXZlbiB0aG91Z2ggQXBwbGUgaGFzIHJldmlld2VkIHRoaXMgc29mdHdhcmUsIEFwcGxlIG1ha2VzIG5vIHdhcnJhbnR5CisgKiBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgd2l0aCByZXNwZWN0IHRvIHRoaXMKKyAqIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IgZml0bmVzcyBmb3IgYSAKKyAqIHBhcnRpY3VsYXIgcHVycG9zZS4gIEFzIGEgcmVzdWx0LCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiCisgKiBhbmQgeW91LCBpdHMgdXNlciwgYXJlIGFzc3VtaW5nIHRoZSBlbnRpcmUgcmlzayBhcyB0byBpdHMgcXVhbGl0eQorICogYW5kIGFjY3VyYWN5LgorICoKKyAqIFRoaXMgY29kZSBtYXkgYmUgdXNlZCBhbmQgZnJlZWx5IGRpc3RyaWJ1dGVkIGFzIGxvbmcgYXMgaXQgaW5jbHVkZXMKKyAqIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIHdhcnJhbnR5IGluZm9ybWF0aW9uLgorICoKKyAqIE1hY2hpbmUtaW5kZXBlbmRlbnQgSS9PIHJvdXRpbmVzIGZvciA4LSwgMTYtLCAyNC0sIGFuZCAzMi1iaXQgaW50ZWdlcnMuCisgKgorICogTW90b3JvbGEgcHJvY2Vzc29ycyAoTWFjaW50b3NoLCBTdW4sIFNwYXJjLCBNSVBTLCBldGMpCisgKiBwYWNrIGJ5dGVzIGZyb20gaGlnaCB0byBsb3cgKHRoZXkgYXJlIGJpZy1lbmRpYW4pLgorICogVXNlIHRoZSBIaWdoTG93IHJvdXRpbmVzIHRvIG1hdGNoIHRoZSBuYXRpdmUgZm9ybWF0CisgKiBvZiB0aGVzZSBtYWNoaW5lcy4KKyAqCisgKiBJbnRlbC1saWtlIG1hY2hpbmVzIChQQ3MsIFNlcXVlbnQpCisgKiBwYWNrIGJ5dGVzIGZyb20gbG93IHRvIGhpZ2ggKHRoZSBhcmUgbGl0dGxlLWVuZGlhbikuCisgKiBVc2UgdGhlIExvd0hpZ2ggcm91dGluZXMgdG8gbWF0Y2ggdGhlIG5hdGl2ZSBmb3JtYXQKKyAqIG9mIHRoZXNlIG1hY2hpbmVzLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIGhhdmUgYmVlbiB0ZXN0ZWQgb24gdGhlIGZvbGxvd2luZyBtYWNoaW5lczoKKyAqCUFwcGxlIE1hY2ludG9zaCwgTVBXIDMuMSBDIGNvbXBpbGVyCisgKglBcHBsZSBNYWNpbnRvc2gsIFRISU5LIEMgY29tcGlsZXIKKyAqCVNpbGljb24gR3JhcGhpY3MgSVJJUywgTUlQUyBjb21waWxlcgorICoJQ3JheSBYL01QIGFuZCBZL01QCisgKglEaWdpdGFsIEVxdWlwbWVudCBWQVgKKyAqCisgKgorICogSW1wbGVtZW50ZWQgYnkgTWFsY29sbSBTbGFuZXkgYW5kIEtlbiBUdXJrb3dza2kuCisgKgorICogTWFsY29sbSBTbGFuZXkgY29udHJpYnV0aW9ucyBkdXJpbmcgMTk4OC0xOTkwIGluY2x1ZGUgYmlnLSBhbmQgbGl0dGxlLQorICogZW5kaWFuIGZpbGUgSS9PLCBjb252ZXJzaW9uIHRvIGFuZCBmcm9tIE1vdG9yb2xhJ3MgZXh0ZW5kZWQgODAtYml0CisgKiBmbG9hdGluZy1wb2ludCBmb3JtYXQsIGFuZCBjb252ZXJzaW9ucyB0byBhbmQgZnJvbSBJRUVFIHNpbmdsZS0KKyAqIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuCisgKgorICogSW4gMTk5MSwgS2VuIFR1cmtvd3NraSBpbXBsZW1lbnRlZCB0aGUgY29udmVyc2lvbnMgdG8gYW5kIGZyb20KKyAqIElFRUUgZG91YmxlLXByZWNpc2lvbiBmb3JtYXQsIGFkZGVkIG1vcmUgcHJlY2lzaW9uIHRvIHRoZSBleHRlbmRlZAorICogY29udmVyc2lvbnMsIGFuZCBhY2NvbW1vZGF0ZWQgY29udmVyc2lvbnMgaW52b2x2aW5nICsvLSBpbmZpbml0eSwKKyAqIE5hTidzLCBhbmQgZGVub3JtYWxpemVkIG51bWJlcnMuCisgKgorICogJElkOiBwb3J0YWJsZWlvLmgsdiAxLjQgMjAwNS8xMS8wMSAxMzowMTo1NyByb2JlcnQgRXhwICQKKyAqLworCisjaW5jbHVkZQk8c3RkaW8uaD4KKworI2lmbmRlZglfX2NwbHVzcGx1cworIyBkZWZpbmUJQ0xJTksKKyNlbHNlCisjIGRlZmluZQlDTElOSyAiQyIKKyNlbmRpZgorCitleHRlcm4gQ0xJTksgaW50IFJlYWRCeXRlKEZJTEUgKiBmcCk7CitleHRlcm4gQ0xJTksgaW50IFJlYWQxNkJpdHNMb3dIaWdoKEZJTEUgKiBmcCk7CitleHRlcm4gQ0xJTksgaW50IFJlYWQxNkJpdHNIaWdoTG93KEZJTEUgKiBmcCk7CitleHRlcm4gQ0xJTksgdm9pZCBXcml0ZThCaXRzKEZJTEUgKiBmcCwgaW50IGkpOworZXh0ZXJuIENMSU5LIHZvaWQgV3JpdGUxNkJpdHNMb3dIaWdoKEZJTEUgKiBmcCwgaW50IGkpOworZXh0ZXJuIENMSU5LIHZvaWQgV3JpdGUxNkJpdHNIaWdoTG93KEZJTEUgKiBmcCwgaW50IGkpOworZXh0ZXJuIENMSU5LIGludCBSZWFkMjRCaXRzSGlnaExvdyhGSUxFICogZnApOworZXh0ZXJuIENMSU5LIGludCBSZWFkMzJCaXRzKEZJTEUgKiBmcCk7CitleHRlcm4gQ0xJTksgaW50IFJlYWQzMkJpdHNIaWdoTG93KEZJTEUgKiBmcCk7CitleHRlcm4gQ0xJTksgdm9pZCBXcml0ZTMyQml0cyhGSUxFICogZnAsIGludCBpKTsKK2V4dGVybiBDTElOSyB2b2lkIFdyaXRlMzJCaXRzTG93SGlnaChGSUxFICogZnAsIGludCBpKTsKK2V4dGVybiBDTElOSyB2b2lkIFdyaXRlMzJCaXRzSGlnaExvdyhGSUxFICogZnAsIGludCBpKTsKK2V4dGVybiBDTElOSyB2b2lkIFJlYWRCeXRlcyhGSUxFICogZnAsIGNoYXIgKnAsIGludCBuKTsKK2V4dGVybiBDTElOSyB2b2lkIFJlYWRCeXRlc1N3YXBwZWQoRklMRSAqIGZwLCBjaGFyICpwLCBpbnQgbik7CitleHRlcm4gQ0xJTksgdm9pZCBXcml0ZUJ5dGVzKEZJTEUgKiBmcCwgY2hhciAqcCwgaW50IG4pOworZXh0ZXJuIENMSU5LIHZvaWQgV3JpdGVCeXRlc1N3YXBwZWQoRklMRSAqIGZwLCBjaGFyICpwLCBpbnQgbik7CitleHRlcm4gQ0xJTksgZG91YmxlIFJlYWRJZWVlRmxvYXRIaWdoTG93KEZJTEUgKiBmcCk7CitleHRlcm4gQ0xJTksgZG91YmxlIFJlYWRJZWVlRmxvYXRMb3dIaWdoKEZJTEUgKiBmcCk7CitleHRlcm4gQ0xJTksgZG91YmxlIFJlYWRJZWVlRG91YmxlSGlnaExvdyhGSUxFICogZnApOworZXh0ZXJuIENMSU5LIGRvdWJsZSBSZWFkSWVlZURvdWJsZUxvd0hpZ2goRklMRSAqIGZwKTsKK2V4dGVybiBDTElOSyBkb3VibGUgUmVhZEllZWVFeHRlbmRlZEhpZ2hMb3coRklMRSAqIGZwKTsKK2V4dGVybiBDTElOSyBkb3VibGUgUmVhZEllZWVFeHRlbmRlZExvd0hpZ2goRklMRSAqIGZwKTsKK2V4dGVybiBDTElOSyB2b2lkIFdyaXRlSWVlZUZsb2F0TG93SGlnaChGSUxFICogZnAsIGRvdWJsZSBudW0pOworZXh0ZXJuIENMSU5LIHZvaWQgV3JpdGVJZWVlRmxvYXRIaWdoTG93KEZJTEUgKiBmcCwgZG91YmxlIG51bSk7CitleHRlcm4gQ0xJTksgdm9pZCBXcml0ZUllZWVEb3VibGVMb3dIaWdoKEZJTEUgKiBmcCwgZG91YmxlIG51bSk7CitleHRlcm4gQ0xJTksgdm9pZCBXcml0ZUllZWVEb3VibGVIaWdoTG93KEZJTEUgKiBmcCwgZG91YmxlIG51bSk7CitleHRlcm4gQ0xJTksgdm9pZCBXcml0ZUllZWVFeHRlbmRlZExvd0hpZ2goRklMRSAqIGZwLCBkb3VibGUgbnVtKTsKK2V4dGVybiBDTElOSyB2b2lkIFdyaXRlSWVlZUV4dGVuZGVkSGlnaExvdyhGSUxFICogZnAsIGRvdWJsZSBudW0pOworCisjZGVmaW5lCVJlYWQzMkJpdHNMb3dIaWdoKGYpCVJlYWQzMkJpdHMoZikKKyNkZWZpbmUgV3JpdGVTdHJpbmcoZixzKQlmd3JpdGUocyxzdHJsZW4ocyksc2l6ZW9mKGNoYXIpLGYpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3J0cC5jIGIvZnJvbnRlbmQvcnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxNGE2MwotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3J0cC5jCkBAIC0wLDAgKzEsMzg1IEBACisvKiAkSWQ6IHJ0cC5jLHYgMS4xNi44LjEgMjAwOC8wOC8wNSAxNDoxNjowNiByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfX0dOVUNfXworIyBpZiBIQVZFX0FMTE9DQV9ICisjICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgZWxzZQorIyAgaWZkZWYgX0FJWAorI3ByYWdtYSBhbGxvY2EKKyMgIGVsc2UKKyMgICBpZm5kZWYgYWxsb2NhICAgICAgIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAgICphbGxvY2EoKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpZm5kZWYgSEFWRV9TVFJDSFIKKyMgIGRlZmluZSBzdHJjaHIgaW5kZXgKKyMgIGRlZmluZSBzdHJyY2hyIHJpbmRleAorIyBlbmRpZgorY2hhciAgICpzdHJjaHIoKSwgKnN0cnJjaHIoKTsKKyMgaWZuZGVmIEhBVkVfTUVNQ1BZCisjICBkZWZpbmUgbWVtY3B5KGQsIHMsIG4pIGJjb3B5ICgocyksIChkKSwgKG4pKQorIyAgZGVmaW5lIG1lbW1vdmUoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlICJjb25zb2xlLmgiCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKworc3RydWN0IHJ0cGJpdHMgeworICAgIGludCAgICAgc2VxdWVuY2U6MTY7ICAgICAvKiBzZXF1ZW5jZSBudW1iZXI6IHJhbmRvbSAqLworICAgIGludCAgICAgcHQ6NzsgICAgICAgICAgICAvKiBwYXlsb2FkIHR5cGU6IDE0IGZvciBNUEVHIGF1ZGlvICovCisgICAgaW50ICAgICBtOjE7ICAgICAgICAgICAgIC8qIG1hcmtlcjogMCAqLworICAgIGludCAgICAgY2M6NDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgQ1NSQyBpZGVudGlmaWVyczogMCAqLworICAgIGludCAgICAgeDoxOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0ZW5zaW9uIGhlYWRlcnM6IDAgKi8KKyAgICBpbnQgICAgIHA6MTsgICAgICAgICAgICAgLyogaXMgdGhlcmUgcGFkZGluZyBhcHBlbmRlZDogMCAqLworICAgIGludCAgICAgdjoyOyAgICAgICAgICAgICAvKiB2ZXJzaW9uOiAyICovCit9OworCitzdHJ1Y3QgcnRwaGVhZGVyIHsgICAgICAgICAgIC8qIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworICAgIHN0cnVjdCBydHBiaXRzIGI7CisgICAgaW50ICAgICB0aW1lc3RhbXA7ICAgICAgIC8qIHN0YXJ0OiByYW5kb20gKi8KKyAgICBpbnQgICAgIHNzcmM7ICAgICAgICAgICAgLyogcmFuZG9tICovCisgICAgaW50ICAgICBpQXVkaW9IZWFkZXI7ICAgIC8qID0wPyEgKi8KK307CisKK3ZvaWQKK2luaXRydHAoc3RydWN0IHJ0cGhlYWRlciAqZm9vKQoreworICAgIGZvby0+Yi52ID0gMjsKKyAgICBmb28tPmIucCA9IDA7CisgICAgZm9vLT5iLnggPSAwOworICAgIGZvby0+Yi5jYyA9IDA7CisgICAgZm9vLT5iLm0gPSAwOworICAgIGZvby0+Yi5wdCA9IDE0OyAgICAgLyogTVBFRyBBdWRpbyAqLworI2lmZGVmIEZFRkUKKyAgICBmb28tPmIuc2VxdWVuY2UgPSA0MjsKKyAgICBmb28tPnRpbWVzdGFtcCA9IDA7CisjZWxzZQorICAgIGZvby0+Yi5zZXF1ZW5jZSA9IHJhbmQoKSAmIDY1NTM1OworICAgIGZvby0+dGltZXN0YW1wID0gcmFuZCgpOworI2VuZGlmCisgICAgZm9vLT5zc3JjID0gcmFuZCgpOworICAgIGZvby0+aUF1ZGlvSGVhZGVyID0gMDsKK30KKworaW50CitzZW5kcnRwKGludCBmZCwgc3RydWN0IHNvY2thZGRyX2luICpzU29ja0FkZHIsIHN0cnVjdCBydHBoZWFkZXIgKmZvbywgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKyAgICBjaGFyICAgKmJ1ZiA9IGFsbG9jYShsZW4gKyBzaXplb2Yoc3RydWN0IHJ0cGhlYWRlcikpOworICAgIGludCAgICAqY2FzdCA9IChpbnQgKikgZm9vOworICAgIGludCAgICAqb3V0Y2FzdCA9IChpbnQgKikgYnVmOworICAgIG91dGNhc3RbMF0gPSBodG9ubChjYXN0WzBdKTsKKyAgICBvdXRjYXN0WzFdID0gaHRvbmwoY2FzdFsxXSk7CisgICAgb3V0Y2FzdFsyXSA9IGh0b25sKGNhc3RbMl0pOworICAgIG91dGNhc3RbM10gPSBodG9ubChjYXN0WzNdKTsKKyAgICBtZW1tb3ZlKGJ1ZiArIHNpemVvZihzdHJ1Y3QgcnRwaGVhZGVyKSwgZGF0YSwgbGVuKTsKKyAgICByZXR1cm4gc2VuZHRvKGZkLCBidWYsIGxlbiArIHNpemVvZigqZm9vKSwgMCwKKyAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgc1NvY2tBZGRyLCBzaXplb2YoKnNTb2NrQWRkcikpOworLyogIHJldHVybiB3cml0ZShmZCxidWYsbGVuK3NpemVvZigqZm9vKSk9PWxlbitzaXplb2YoKmZvbyk7ICovCit9CisKKy8qIGNyZWF0ZSBhIHNlbmRlciBzb2NrZXQuICovCitpbnQKK21ha2Vzb2NrZXQoY2hhciAqc3pBZGRyLCB1bnNpZ25lZCBzaG9ydCBwb3J0LCB1bnNpZ25lZCBjaGFyIFRUTCwgc3RydWN0IHNvY2thZGRyX2luICpzU29ja0FkZHIpCit7CisgICAgaW50ICAgICBpUmV0LCBpTG9vcCA9IDE7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKyAgICB1bnNpZ25lZCBjaGFyIGNUdGwgPSBUVEw7CisgICAgY2hhciAgICBjTG9vcCA9IDA7CisgICAgdW5zaWduZWQgaW50IHRlbXBhZGRyOworCisgICAgaW50ICAgICBpU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChpU29ja2V0IDwgMCkgeworICAgICAgICBlcnJvcl9wcmludGYoInNvY2tldCgpIGZhaWxlZC5cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHRlbXBhZGRyID0gaW5ldF9hZGRyKHN6QWRkcik7CisgICAgc1NvY2tBZGRyLT5zaW5fZmFtaWx5ID0gc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHNTb2NrQWRkci0+c2luX3BvcnQgPSBzaW4uc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICBzU29ja0FkZHItPnNpbl9hZGRyLnNfYWRkciA9IHRlbXBhZGRyOworCisgICAgaVJldCA9IHNldHNvY2tvcHQoaVNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmaUxvb3AsIHNpemVvZihpbnQpKTsKKyAgICBpZiAoaVJldCA8IDApIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJzZXRzb2Nrb3B0IFNPX1JFVVNFQUREUiBmYWlsZWRcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlmICgobnRvaGwodGVtcGFkZHIpID4+IDI4KSA9PSAweGUpIHsKKyAgICAgICAgLyogb25seSBzZXQgbXVsdGljYXN0IHBhcmFtZXRlcnMgZm9yIG11bHRpY2FzdCBkZXN0aW5hdGlvbiBJUHMgKi8KKyAgICAgICAgaVJldCA9IHNldHNvY2tvcHQoaVNvY2tldCwgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX1RUTCwgJmNUdGwsIHNpemVvZihjaGFyKSk7CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCJzZXRzb2Nrb3B0IElQX01VTFRJQ0FTVF9UVEwgZmFpbGVkLiAgbXVsdGljYXN0IGluIGtlcm5lbD9cbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGNMb29wID0gMTsgICAgICAvKiAhPyAqLworICAgICAgICBpUmV0ID0gc2V0c29ja29wdChpU29ja2V0LCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfTE9PUCwgJmNMb29wLCBzaXplb2YoY2hhcikpOworICAgICAgICBpZiAoaVJldCA8IDApIHsKKyAgICAgICAgICAgIGVycm9yX3ByaW50Zigic2V0c29ja29wdCBJUF9NVUxUSUNBU1RfTE9PUCBmYWlsZWQuICBtdWx0aWNhc3QgaW4ga2VybmVsP1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlTb2NrZXQ7Cit9CisKKworCisKKyNpZiAwCisvKiAqLworLyogY29kZSBjb250cmlidXRlZCBieSBBbm9ueW1vdXMgc291cmNlLiAgU3VwcG9zZWQgdG8gYmUgbXVjaCBiZXR0ZXIgKi8KKy8qIHRoZW4gb3JpZ2luYWwgY29kZSwgYnV0IG9ubHkgc2VlbXMgdG8gcnVuIG9uIHdpbmRvd3Mgd2l0aCBNU1ZDLiAgICovCisvKiBhbmQgSSBjYW5ub3QgdGVzdCBpdCAqLworLyogKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKK3N0cnVjdCBydHBiaXRzIHsKKyAgICBpbnQgICAgIHNlcXVlbmNlOjE2OyAgICAgLyogc2VxdWVuY2UgbnVtYmVyOiByYW5kb20gKi8KKyAgICBpbnQgICAgIHB0Ojc7ICAgICAgICAgICAgLyogcGF5bG9hZCB0eXBlOiAxNCBmb3IgTVBFRyBhdWRpbyAqLworICAgIGludCAgICAgbToxOyAgICAgICAgICAgICAvKiBtYXJrZXI6IDAgKi8KKyAgICBpbnQgICAgIGNjOjQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIENTUkMgaWRlbnRpZmllcnM6IDAgKi8KKyAgICBpbnQgICAgIHg6MTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dGVuc2lvbiBoZWFkZXJzOiAwICovCisgICAgaW50ICAgICBwOjE7ICAgICAgICAgICAgIC8qIGlzIHRoZXJlIHBhZGRpbmcgYXBwZW5kZWQ6IDAgKi8KKyAgICBpbnQgICAgIHY6MjsgICAgICAgICAgICAgLyogdmVyc2lvbjogMiAqLworfTsKKworc3RydWN0IHJ0cGhlYWRlciB7ICAgICAgICAgICAvKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKyAgICBzdHJ1Y3QgcnRwYml0cyBiOworICAgIGludCAgICAgdGltZXN0YW1wOyAgICAgICAvKiBzdGFydDogcmFuZG9tICovCisgICAgaW50ICAgICBzc3JjOyAgICAgICAgICAgIC8qIHJhbmRvbSAqLworICAgIGludCAgICAgaUF1ZGlvSGVhZGVyOyAgICAvKiA9MD8hICovCit9OworCit2b2lkCitydHBfaW5pdGlhbGl6YXRpb24oc3RydWN0IHJ0cGhlYWRlciAqZm9vKQoreworICAgIGZvby0+Yi52ID0gMjsKKyAgICBmb28tPmIucCA9IDA7CisgICAgZm9vLT5iLnggPSAwOworICAgIGZvby0+Yi5jYyA9IDA7CisgICAgZm9vLT5iLm0gPSAwOworICAgIGZvby0+Yi5wdCA9IDE0OyAgICAgLyogTVBFRyBBdWRpbyAqLworI2lmZGVmIEZFRkUKKyAgICBmb28tPmIuc2VxdWVuY2UgPSA0MjsKKyAgICBmb28tPnRpbWVzdGFtcCA9IDA7CisjZWxzZQorICAgIGZvby0+Yi5zZXF1ZW5jZSA9IHJhbmQoKSAmIDY1NTM1OworICAgIGZvby0+dGltZXN0YW1wID0gcmFuZCgpOworI2VuZGlmCisgICAgZm9vLT5zc3JjID0gcmFuZCgpOworICAgIGZvby0+aUF1ZGlvSGVhZGVyID0gMDsKK30KKworaW50CitydHBfc2VuZChTT0NLRVQgcywgc3RydWN0IHJ0cGhlYWRlciAqZm9vLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworICAgIGNoYXIgICAqYnVmZmVyID0gbWFsbG9jKGxlbiArIHNpemVvZihzdHJ1Y3QgcnRwaGVhZGVyKSk7CisgICAgaW50ICAgICpjYXN0ID0gKGludCAqKSBmb287CisgICAgaW50ICAgICpvdXRjYXN0ID0gKGludCAqKSBidWZmZXI7CisgICAgaW50ICAgICBjb3VudCwgc2l6ZTsKKworICAgIG91dGNhc3RbMF0gPSBodG9ubChjYXN0WzBdKTsKKyAgICBvdXRjYXN0WzFdID0gaHRvbmwoY2FzdFsxXSk7CisgICAgb3V0Y2FzdFsyXSA9IGh0b25sKGNhc3RbMl0pOworICAgIG91dGNhc3RbM10gPSBodG9ubChjYXN0WzNdKTsKKyAgICBtZW1tb3ZlKGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgcnRwaGVhZGVyKSwgZGF0YSwgbGVuKTsKKy8qICAgIHJldHVybiBzZW5kdG8gKGZkLGJ1ZixsZW4rc2l6ZW9mKCpmb28pLDAsKHN0cnVjdCBzb2NrYWRkciAqKXNTb2NrQWRkcixzaXplb2YoKnNTb2NrQWRkcikpOyAqLworLyogIHJldHVybiB3cml0ZShmZCxidWYsbGVuK3NpemVvZigqZm9vKSk9PWxlbitzaXplb2YoKmZvbyk7ICovCisgICAgc2l6ZSA9IGxlbiArIHNpemVvZigqZm9vKTsKKyAgICBjb3VudCA9IHNlbmQocywgYnVmZmVyLCBzaXplLCAwKTsKKyAgICBmcmVlKGJ1ZmZlcik7CisKKyAgICByZXR1cm4gY291bnQgIT0gc2l6ZTsKK30KKworLyogY3JlYXRlIGEgc2VuZGVyIHNvY2tldC4gKi8KK2ludAorcnRwX3NvY2tldChTT0NLRVQgKiBwcywgY2hhciAqYWRkcmVzcywgdW5zaWduZWQgc2hvcnQgcG9ydCwgaW50IFRUTCkKK3sKKy8qICAgIGludCBpUmV0IDsgKi8KKyAgICBpbnQgICAgIGlMb29wID0gMTsKKy8qICAgIHN0cnVjdCAgc29ja2FkZHJfaW4gc2luIDsgKi8KKyAgICBjaGFyICAgIGNUVEwgPSAoY2hhcikgVFRMOworICAgIGNoYXIgICAgY0xvb3AgPSAwOworLyogICAgdW5zaWduZWQgaW50IHRlbXBhZGRyIDsgKi8KKyAgICBCT09MICAgIFRydWUgPSBUUlVFOworICAgIElOVCAgICAgZXJyb3I7CisgICAgY2hhciAgICpjID0gIiI7CisgICAgVUlOVCAgICBpcDsKKyAgICBQSE9TVEVOVCBob3N0OworICAgIFNPQ0tFVCAgczsKKyAgICBTT0NLQUREUl9JTiBzb3VyY2UsIGRlc3Q7CisjaWYgMAorICAgIGludCAgICAgcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgZXJyb3JfcHJpbnRmKCJzb2NrZXQoKSBmYWlsZWQuXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICB0ZW1wYWRkciA9IGluZXRfYWRkcihhZGRyZXNzKTsKKyAgICBzU29ja0FkZHItPnNpbl9mYW1pbHkgPSBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc1NvY2tBZGRyLT5zaW5fcG9ydCA9IHNpbi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIHNTb2NrQWRkci0+c2luX2FkZHIuc19hZGRyID0gdGVtcGFkZHI7CisKKyAgICBpUmV0ID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjb25zdCBjaGFyICopICZpTG9vcCwgc2l6ZW9mKGludCkpOworICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICBlcnJvcl9wcmludGYoInNldHNvY2tvcHQgU09fUkVVU0VBRERSIGZhaWxlZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaWYgKChudG9obCh0ZW1wYWRkcikgPj4gMjgpID09IDB4ZSkgeworICAgICAgICAvKiBvbmx5IHNldCBtdWx0aWNhc3QgcGFyYW1ldGVycyBmb3IgbXVsdGljYXN0IGRlc3RpbmF0aW9uIElQcyAqLworICAgICAgICBpUmV0ID0gc2V0c29ja29wdChzLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfVFRMLCAmY1RUTCwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoInNldHNvY2tvcHQgSVBfTVVMVElDQVNUX1RUTCBmYWlsZWQuICAgIG11bHRpY2FzdCBpbiBrZXJuZWw/XG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBjTG9vcCA9IDE7ICAgICAgLyogIT8gKi8KKyAgICAgICAgaVJldCA9IHNldHNvY2tvcHQocywgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0xPT1AsICZjTG9vcCwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoInNldHNvY2tvcHQgSVBfTVVMVElDQVNUX0xPT1AgZmFpbGVkLiAgICBtdWx0aWNhc3QgaW4ga2VybmVsP1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgc291cmNlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHNvdXJjZS5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKyAgICBzb3VyY2Uuc2luX3BvcnQgPSBodG9ucygwKTsKKworICAgIGRlc3Quc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgZGVzdC5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoYWRkcmVzcyk7CisKKyAgICBpZiAoIXN0cmNtcChhZGRyZXNzLCAiMjU1LjI1NS4yNTUuMjU1IikpIHsKKyAgICB9CisgICAgZWxzZSBpZiAoZGVzdC5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX05PTkUpIHsKKyAgICAgICAgaG9zdCA9IGdldGhvc3RieW5hbWUoYWRkcmVzcyk7CisKKyAgICAgICAgaWYgKGhvc3QpIHsKKyAgICAgICAgICAgIGRlc3Quc2luX2FkZHIgPSAqKFBJTl9BRERSKSBob3N0LT5oX2FkZHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIlVua25vd24gaG9zdCAlc1xyXG4iLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgZGVzdC5zaW5fcG9ydCA9IGh0b25zKCh1X3Nob3J0KSBwb3J0KTsKKworICAgIGlwID0gbnRvaGwoZGVzdC5zaW5fYWRkci5zX2FkZHIpOworCisgICAgaWYgKElOX0NMQVNTQShpcCkpCisgICAgICAgIGMgPSAiY2xhc3MgQSI7CisgICAgaWYgKElOX0NMQVNTQihpcCkpCisgICAgICAgIGMgPSAiY2xhc3MgQiI7CisgICAgaWYgKElOX0NMQVNTQyhpcCkpCisgICAgICAgIGMgPSAiY2xhc3MgQyI7CisgICAgaWYgKElOX0NMQVNTRChpcCkpCisgICAgICAgIGMgPSAiY2xhc3MgRCI7CisgICAgaWYgKGlwID09IElOQUREUl9MT09QQkFDSykKKyAgICAgICAgYyA9ICJsb29wYmFjayI7CisgICAgaWYgKGlwID09IElOQUREUl9CUk9BRENBU1QpCisgICAgICAgIGMgPSAiYnJvYWRjYXN0IjsKKworICAgIHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgUEZfVU5TUEVDKTsKKworICAgIGlmIChzID09IElOVkFMSURfU09DS0VUKSB7CisgICAgICAgIGVycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgIHByaW50Zigic29ja2V0ICgpIGVycm9yICVkXHJcbiIsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIGVycm9yID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjb25zdCBjaGFyICopICZUcnVlLCBzaXplb2YoQk9PTCkpOworCisgICAgZXJyb3IgPSBiaW5kKHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvdXJjZSwgc2l6ZW9mKHNvdXJjZSkpOworCisgICAgaWYgKGVycm9yID09IFNPQ0tFVF9FUlJPUikgeworICAgICAgICBlcnJvciA9IFdTQUdldExhc3RFcnJvcigpOworICAgICAgICBwcmludGYoImJpbmQgKCkgZXJyb3IgJWRcclxuIiwgZXJyb3IpOworICAgICAgICBjbG9zZXNvY2tldChzKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIGlmIChpcCA9PSBJTkFERFJfQlJPQURDQVNUKSB7CisgICAgICAgIHByaW50ZigiYnJvYWRjYXN0ICVzOiV1ICVzXHJcbiIsIGluZXRfbnRvYShkZXN0LnNpbl9hZGRyKSwgbnRvaHMoZGVzdC5zaW5fcG9ydCksIGMpOworCisgICAgICAgIGVycm9yID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsIChjb25zdCBjaGFyICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmVHJ1ZSwgc2l6ZW9mKEJPT0wpKTsKKworICAgICAgICBpZiAoZXJyb3IgPT0gU09DS0VUX0VSUk9SKSB7CisgICAgICAgICAgICBlcnJvciA9IFdTQUdldExhc3RFcnJvcigpOworICAgICAgICAgICAgcHJpbnRmKCJzZXRzb2Nrb3B0ICgldSwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAuLi4pIGVycm9yICVkXHJcbiIsIHMsIGVycm9yKTsKKyAgICAgICAgICAgIGNsb3Nlc29ja2V0KHMpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKElOX0NMQVNTRChpcCkpIHsKKyAgICAgICAgcHJpbnRmKCJtdWx0aWNhc3QgJXM6JXUgJXNcclxuIiwgaW5ldF9udG9hKGRlc3Quc2luX2FkZHIpLCBudG9ocyhkZXN0LnNpbl9wb3J0KSwgYyk7CisKKy8qICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQgKHMsIElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9UVEwsIChjb25zdCBjaGFyICopICZUVEwsIHNpemVvZiAoaW50KSkgOyAqLworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQocywgSVBQUk9UT19JUCwgMywgKGNvbnN0IGNoYXIgKikgJlRUTCwgc2l6ZW9mKGludCkpOworCisgICAgICAgIGlmIChlcnJvciA9PSBTT0NLRVRfRVJST1IpIHsKKyAgICAgICAgICAgIGVycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBwcmludGYoInNldHNvY2tvcHQgKCV1LCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfVFRMLCAuLi4pIGVycm9yICVkXHJcbiIsIHMsIGVycm9yKTsKKyAgICAgICAgICAgIGNsb3Nlc29ja2V0KHMpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyb3IgPSBjb25uZWN0KHMsIChQU09DS0FERFIpICYgZGVzdCwgc2l6ZW9mKFNPQ0tBRERSX0lOKSk7CisKKyAgICBpZiAoZXJyb3IgPT0gU09DS0VUX0VSUk9SKSB7CisgICAgICAgIHByaW50ZigiY29ubmVjdDogZXJyb3IgJWRcbiIsIFdTQUdldExhc3RFcnJvcigpKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQocyk7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICAqcHMgPSBzOworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3J0cC5oIGIvZnJvbnRlbmQvcnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2NDFiNwotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3J0cC5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgTEFNRV9SVFBfSAorI2RlZmluZSBMQU1FX1JUUF9ICisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCitzdHJ1Y3QgcnRwYml0cyB7CisgICAgaW50ICAgICBzZXF1ZW5jZToxNjsgICAgIC8qIHNlcXVlbmNlIG51bWJlcjogcmFuZG9tICovCisgICAgaW50ICAgICBwdDo3OyAgICAgICAgICAgIC8qIHBheWxvYWQgdHlwZTogMTQgZm9yIE1QRUcgYXVkaW8gKi8KKyAgICBpbnQgICAgIG06MTsgICAgICAgICAgICAgLyogbWFya2VyOiAwICovCisgICAgaW50ICAgICBjYzo0OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBDU1JDIGlkZW50aWZpZXJzOiAwICovCisgICAgaW50ICAgICB4OjE7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRlbnNpb24gaGVhZGVyczogMCAqLworICAgIGludCAgICAgcDoxOyAgICAgICAgICAgICAvKiBpcyB0aGVyZSBwYWRkaW5nIGFwcGVuZGVkOiAwICovCisgICAgaW50ICAgICB2OjI7ICAgICAgICAgICAgIC8qIHZlcnNpb246IDIgKi8KK307CisKK3N0cnVjdCBydHBoZWFkZXIgeyAgICAgICAgICAgLyogaW4gbmV0d29yayBieXRlIG9yZGVyICovCisgICAgc3RydWN0IHJ0cGJpdHMgYjsKKyAgICBpbnQgICAgIHRpbWVzdGFtcDsgICAgICAgLyogc3RhcnQ6IHJhbmRvbSAqLworICAgIGludCAgICAgc3NyYzsgICAgICAgICAgICAvKiByYW5kb20gKi8KKyAgICBpbnQgICAgIGlBdWRpb0hlYWRlcjsgICAgLyogPTA/ISAqLworfTsKKwordm9pZCAgICBpbml0cnRwKHN0cnVjdCBydHBoZWFkZXIgKmZvbyk7CitpbnQgICAgIHNlbmRydHAoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNTb2NrQWRkciwgc3RydWN0IHJ0cGhlYWRlciAqZm9vLCBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgIGludCBsZW4pOworaW50ICAgICBtYWtlc29ja2V0KGNoYXIgKnN6QWRkciwgdW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgY2hhciBUVEwsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICpzU29ja0FkZHIpOwordm9pZCAgICBydHBfb3V0cHV0KGNvbnN0IGNoYXIgKm1wM2J1ZmZlciwgaW50IG1wM3NpemUpOworCisjaWYgMAoraW50ICAgICBydHBfc2VuZChTT0NLRVQgcywgc3RydWN0IHJ0cGhlYWRlciAqZm9vLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKworaW50ICAgICBydHBfc29ja2V0KFNPQ0tFVCAqIHBzLCBjaGFyICpBZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCBwb3J0LCBpbnQgVFRMKTsKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvdGltZXN0YXR1cy5jIGIvZnJvbnRlbmQvdGltZXN0YXR1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTIzODEKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC90aW1lc3RhdHVzLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiAgICAgIHRpbWUgc3RhdHVzIHJlbGF0ZWQgZnVuY3Rpb24gc291cmNlIGZpbGUKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5OSBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IHRpbWVzdGF0dXMuYyx2IDEuNDYgMjAwOC8wNC8xMiAxODoxODowNiByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworCisvKiBIb3BlIGl0IHdvcmtzIG5vdywgb3RoZXJ3aXNlIGNvbXBsYWluIG9yIGZsYW1lIDstKQorICovCisKKworI2lmIDEKKyMgZGVmaW5lIFNQRUVEX0NIQVIgICAgICJ4IiAvKiBjaGFyYWN0ZXIgeCAqLworIyBkZWZpbmUgU1BFRURfTVVMVCAgICAgMS4KKyNlbHNlCisjIGRlZmluZSBTUEVFRF9DSEFSICAgICAiJSUiCisjIGRlZmluZSBTUEVFRF9NVUxUICAgICAxMDAuCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibGFtZXRpbWUuaCIKKyNpbmNsdWRlICJ0aW1lc3RhdHVzLmgiCisKKyNpZiBkZWZpbmVkKEJSSElTVCkKKyMgaW5jbHVkZSAiYnJoaXN0LmgiCisjZW5kaWYKKyNpbmNsdWRlICJjb25zb2xlLmgiCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRvdWJsZSAgbGFzdF90aW1lOyAgICAgICAvKiByZXN1bHQgb2YgbGFzdCBjYWxsIHRvIGNsb2NrICovCisgICAgZG91YmxlICBlbGFwc2VkX3RpbWU7ICAgIC8qIHRvdGFsIHRpbWUgKi8KKyAgICBkb3VibGUgIGVzdGltYXRlZF90aW1lOyAgLyogZXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIHRpbWUgW3NdICovCisgICAgZG91YmxlICBzcGVlZF9pbmRleDsgICAgIC8qIHNwZWVkIHJlbGF0aXZlIHRvIHJlYWx0aW1lIGNvZGluZyBbMTAwJV0gKi8KK30gdGltZXN0YXR1c190OworCisvKgorICogIENhbGN1bGF0ZXMgZnJvbSB0aGUgaW5wdXQgKHNlZSBiZWxvdykgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAtIHRvdGFsIGVzdGltYXRlZCB0aW1lCisgKiAgICAtIGEgc3BlZWQgaW5kZXgKKyAqLworCitzdGF0aWMgdm9pZAordHNfY2FsY190aW1lcyh0aW1lc3RhdHVzX3QgKiBjb25zdCB0c3RpbWUsIC8qIHRzdGltZS0+ZWxhcHNlZF90aW1lOiBlbGFwc2VkIHRpbWUgKi8KKyAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZV9mcmVxLCAvKiBzYW1wbGUgZnJlcXVlbmN5IFtIei9rSHpdICAqLworICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVOdW0sIC8qIE51bWJlciBvZiB0aGUgY3VycmVudCBGcmFtZSAqLworICAgICAgICAgICAgICBjb25zdCBpbnQgdG90YWxmcmFtZXMsIC8qIHRvdGFsIHVtYmVyIG9mIEZyYW1lcyAqLworICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVzaXplKQoreyAgICAgICAgICAgICAgICAgICAgICAgLyogU2l6ZSBvZiBhIGZyYW1lIFticHMva2Jwc10gKi8KKyAgICBhc3NlcnQoc2FtcGxlX2ZyZXEgPj0gODAwMCAmJiBzYW1wbGVfZnJlcSA8PSA0ODAwMCk7CisKKyAgICBpZiAoZnJhbWVOdW0gPiAwICYmIHRzdGltZS0+ZWxhcHNlZF90aW1lID4gMCkgeworICAgICAgICB0c3RpbWUtPmVzdGltYXRlZF90aW1lID0gdHN0aW1lLT5lbGFwc2VkX3RpbWUgKiB0b3RhbGZyYW1lcyAvIGZyYW1lTnVtOworICAgICAgICB0c3RpbWUtPnNwZWVkX2luZGV4ID0gZnJhbWVzaXplICogZnJhbWVOdW0gLyAoc2FtcGxlX2ZyZXEgKiB0c3RpbWUtPmVsYXBzZWRfdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0c3RpbWUtPmVzdGltYXRlZF90aW1lID0gMC47CisgICAgICAgIHRzdGltZS0+c3BlZWRfaW5kZXggPSAwLjsKKyAgICB9Cit9CisKKy8qIERlY29tcG9zZXMgYSBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcyBpbnRvIGEgZWFzeSB0byByZWFkIGhoOm1tOnNzIGZvcm1hdAorICogcGFkZGVkIHdpdGggYW4gYWRkaXRpb25hbCBjaGFyYWN0ZXIKKyAqLworCitzdGF0aWMgdm9pZAordHNfdGltZV9kZWNvbXBvc2UoY29uc3QgdW5zaWduZWQgbG9uZyB0aW1lX2luX3NlYywgY29uc3QgY2hhciBwYWRkZWRfY2hhcikKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIGhvdXIgPSB0aW1lX2luX3NlYyAvIDM2MDA7CisgICAgY29uc3QgdW5zaWduZWQgaW50IG1pbiA9IHRpbWVfaW5fc2VjIC8gNjAgJSA2MDsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2VjID0gdGltZV9pbl9zZWMgJSA2MDsKKworICAgIGlmIChob3VyID09IDApCisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIgICAlMnU6JTAydSVjIiwgbWluLCBzZWMsIHBhZGRlZF9jaGFyKTsKKyAgICBlbHNlIGlmIChob3VyIDwgMTAwKQorICAgICAgICBjb25zb2xlX3ByaW50ZigiJTJsdTolMDJ1OiUwMnUlYyIsIGhvdXIsIG1pbiwgc2VjLCBwYWRkZWRfY2hhcik7CisgICAgZWxzZQorICAgICAgICBjb25zb2xlX3ByaW50ZigiJTZsdSBoJWMiLCBob3VyLCBwYWRkZWRfY2hhcik7Cit9CisKK3N0YXRpYyB2b2lkCit0aW1lc3RhdHVzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogY29uc3QgZ2ZwKQoreworICAgIHN0YXRpYyB0aW1lc3RhdHVzX3QgcmVhbF90aW1lOworICAgIHN0YXRpYyB0aW1lc3RhdHVzX3QgcHJvY190aW1lOworICAgIGludCAgICAgcGVyY2VudDsKKyAgICBzdGF0aWMgaW50IGluaXQgPSAwOyAgICAgLyogV2hhdCBoYXBwZW5zIGhlcmU/IEEgd29yayBhcm91bmQgaW5zdGVhZCBvZiBhIGJ1ZyBmaXggPz8/ICovCisgICAgZG91YmxlICB0bXgsIGRlbHRhOworICAgIGludCBzYW1wX3JhdGUgICAgID0gbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoZ2ZwKQorICAgICAgLCBmcmFtZU51bSAgICAgID0gbGFtZV9nZXRfZnJhbWVOdW0oZ2ZwKQorICAgICAgLCB0b3RhbGZyYW1lcyAgID0gbGFtZV9nZXRfdG90YWxmcmFtZXMoZ2ZwKQorICAgICAgLCBmcmFtZXNpemUgICAgID0gbGFtZV9nZXRfZnJhbWVzaXplKGdmcCkKKyAgICAgIDsKKworICAgIGlmICh0b3RhbGZyYW1lcyA8IGZyYW1lTnVtKSB7CisgICAgICAgIHRvdGFsZnJhbWVzID0gZnJhbWVOdW07CisgICAgfQorICAgIGlmIChmcmFtZU51bSA9PSAwKSB7CisgICAgICAgIHJlYWxfdGltZS5sYXN0X3RpbWUgPSBHZXRSZWFsVGltZSgpOworICAgICAgICBwcm9jX3RpbWUubGFzdF90aW1lID0gR2V0Q1BVVGltZSgpOworICAgICAgICByZWFsX3RpbWUuZWxhcHNlZF90aW1lID0gMDsKKyAgICAgICAgcHJvY190aW1lLmVsYXBzZWRfdGltZSA9IDA7CisgICAgfQorCisgICAgLyogd2UgbmVlZCByb2xsb3ZlciBwcm90ZWN0aW9uIGZvciBHZXRDUFVUaW1lLCBhbmQgbWF5YmUgR2V0UmVhbFRpbWUoKTogKi8KKyAgICB0bXggPSBHZXRSZWFsVGltZSgpOworICAgIGRlbHRhID0gdG14IC0gcmVhbF90aW1lLmxhc3RfdGltZTsKKyAgICBpZiAoZGVsdGEgPCAwKQorICAgICAgICBkZWx0YSA9IDA7ICAgICAgLyogaWdub3JlLCBjbG9jayBoYXMgcm9sbGVkIG92ZXIgKi8KKyAgICByZWFsX3RpbWUuZWxhcHNlZF90aW1lICs9IGRlbHRhOworICAgIHJlYWxfdGltZS5sYXN0X3RpbWUgPSB0bXg7CisKKworICAgIHRteCA9IEdldENQVVRpbWUoKTsKKyAgICBkZWx0YSA9IHRteCAtIHByb2NfdGltZS5sYXN0X3RpbWU7CisgICAgaWYgKGRlbHRhIDwgMCkKKyAgICAgICAgZGVsdGEgPSAwOyAgICAgIC8qIGlnbm9yZSwgY2xvY2sgaGFzIHJvbGxlZCBvdmVyICovCisgICAgcHJvY190aW1lLmVsYXBzZWRfdGltZSArPSBkZWx0YTsKKyAgICBwcm9jX3RpbWUubGFzdF90aW1lID0gdG14OworCisgICAgaWYgKGZyYW1lTnVtID09IDAgJiYgaW5pdCA9PSAwKSB7CisgICAgICAgIGNvbnNvbGVfcHJpbnRmKCJcciIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICBGcmFtZSAgICAgICAgICB8ICBDUFUgdGltZS9lc3RpbSB8IFJFQUwgdGltZS9lc3RpbSB8IHBsYXkvQ1BVIHwgICAgRVRBIFxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAgICAwLyAgICAgICAoIDAlJSl8ICAgIDA6MDAvICAgICA6ICB8ICAgIDA6MDAvICAgICA6ICB8ICAgICAgICAgIgorICAgICAgICAgICAgICAgICAgICAgICBTUEVFRF9DSEFSICJ8ICAgICA6ICBcciIKKyAgICAgICAgICAgICAgICAgICAgICAgLyogLCBDb25zb2xlX0lPLnN0cl9jbHJlb2xuLCBDb25zb2xlX0lPLnN0cl9jbHJlb2xuICovICk7CisgICAgICAgIGluaXQgPSAxOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHJlc2V0IGluaXQgY291bnRlciBmb3IgbmV4dCB0aW1lIHdlIGFyZSBjYWxsZWQgd2l0aCBmcmFtZU51bT09MCAqLworICAgIGlmIChmcmFtZU51bSA+IDApCisgICAgICAgIGluaXQgPSAwOworCisgICAgdHNfY2FsY190aW1lcygmcmVhbF90aW1lLCBzYW1wX3JhdGUsIGZyYW1lTnVtLCB0b3RhbGZyYW1lcywgZnJhbWVzaXplKTsKKyAgICB0c19jYWxjX3RpbWVzKCZwcm9jX3RpbWUsIHNhbXBfcmF0ZSwgZnJhbWVOdW0sIHRvdGFsZnJhbWVzLCBmcmFtZXNpemUpOworCisgICAgaWYgKGZyYW1lTnVtIDwgdG90YWxmcmFtZXMpIHsKKyAgICAgICAgcGVyY2VudCA9IChpbnQpICgxMDAuICogZnJhbWVOdW0gLyB0b3RhbGZyYW1lcyArIDAuNSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwZXJjZW50ID0gMTAwOworICAgIH0KKworICAgIGNvbnNvbGVfcHJpbnRmKCJcciU2aS8lLTZpIiwgZnJhbWVOdW0sIHRvdGFsZnJhbWVzKTsKKyAgICBjb25zb2xlX3ByaW50ZihwZXJjZW50IDwgMTAwID8gIiAoJTJkJSUpfCIgOiAiKCUzLjNkJSUpfCIsIHBlcmNlbnQpOworICAgIHRzX3RpbWVfZGVjb21wb3NlKCh1bnNpZ25lZCBsb25nKSBwcm9jX3RpbWUuZWxhcHNlZF90aW1lLCAnLycpOworICAgIHRzX3RpbWVfZGVjb21wb3NlKCh1bnNpZ25lZCBsb25nKSBwcm9jX3RpbWUuZXN0aW1hdGVkX3RpbWUsICd8Jyk7CisgICAgdHNfdGltZV9kZWNvbXBvc2UoKHVuc2lnbmVkIGxvbmcpIHJlYWxfdGltZS5lbGFwc2VkX3RpbWUsICcvJyk7CisgICAgdHNfdGltZV9kZWNvbXBvc2UoKHVuc2lnbmVkIGxvbmcpIHJlYWxfdGltZS5lc3RpbWF0ZWRfdGltZSwgJ3wnKTsKKyAgICBjb25zb2xlX3ByaW50Zihwcm9jX3RpbWUuc3BlZWRfaW5kZXggPD0gMS4gPworICAgICAgICAgICAgICAgICAgICIlOS40ZiIgU1BFRURfQ0hBUiAifCIgOiAiJSM5LjVnIiBTUEVFRF9DSEFSICJ8IiwKKyAgICAgICAgICAgICAgICAgICBTUEVFRF9NVUxUICogcHJvY190aW1lLnNwZWVkX2luZGV4KTsKKyAgICB0c190aW1lX2RlY29tcG9zZSgodW5zaWduZWQgbG9uZykgKHJlYWxfdGltZS5lc3RpbWF0ZWRfdGltZSAtIHJlYWxfdGltZS5lbGFwc2VkX3RpbWUpLCAnICcpOworfQorCitzdGF0aWMgdm9pZAordGltZXN0YXR1c19maW5pc2godm9pZCkKK3sKKyAgICBjb25zb2xlX3ByaW50ZigiXG4iKTsKK30KKworCit2b2lkCitlbmNvZGVyX3Byb2dyZXNzX2JlZ2luKCBsYW1lX2dsb2JhbF9mbGFncyBjb25zdCogZ2YKKyAgICAgICAgICAgICAgICAgICAgICAsIGNoYXIgICAgICAgICAgICAgIGNvbnN0KiBpblBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAsIGNoYXIgICAgICAgICAgICAgIGNvbnN0KiBvdXRQYXRoCisgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIGlmIChzaWxlbnQgPCAxMCkgeworICAgICAgICBsYW1lX3ByaW50X2NvbmZpZyhnZik7IC8qIHByaW50IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25zIGJlaW5nIHVzZWQgKi8KKworICAgICAgICBjb25zb2xlX3ByaW50ZigiRW5jb2RpbmcgJXMlcyB0byAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGluUGF0aCwgIi0iKSA/IGluUGF0aCA6ICI8c3RkaW4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluUGF0aCkgKyBzdHJsZW4ob3V0UGF0aCkgPCA2NiA/ICIiIDogIlxuICAgICAiLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAob3V0UGF0aCwgIi0iKSA/IG91dFBhdGggOiAiPHN0ZG91dD4iKTsKKworICAgICAgICBjb25zb2xlX3ByaW50ZigiRW5jb2RpbmcgYXMgJWcga0h6ICIsIDEuZS0zICogbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoZ2YpKTsKKworICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbW9kZV9uYW1lc1syXVs0XSA9IHsKKyAgICAgICAgICAgICAgICB7InN0ZXJlbyIsICJqLXN0ZXJlbyIsICJkdWFsLWNoIiwgInNpbmdsZS1jaCJ9LAorICAgICAgICAgICAgICAgIHsic3RlcmVvIiwgImZvcmNlLW1zIiwgImR1YWwtY2giLCAic2luZ2xlLWNoIn0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzd2l0Y2ggKGxhbWVfZ2V0X1ZCUihnZikpIHsKKyAgICAgICAgICAgIGNhc2UgdmJyX3JoOgorICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlcyBNUEVHLSV1JXMgTGF5ZXIgSUlJIFZCUihxPSVnKSBxdmFsPSVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbmFtZXNbbGFtZV9nZXRfZm9yY2VfbXMoZ2YpXVtsYW1lX2dldF9tb2RlKGdmKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGxhbWVfZ2V0X3ZlcnNpb24oZ2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlKGdmKSA8IDE2MDAwID8gIi41IiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X1ZCUl9xdWFsaXR5KGdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX2dldF9xdWFsaXR5KGdmKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHZicl9tdDoKKyAgICAgICAgICAgIGNhc2UgdmJyX210cmg6CisgICAgICAgICAgICAgICAgY29uc29sZV9wcmludGYoIiVzIE1QRUctJXUlcyBMYXllciBJSUkgVkJSKHE9JWcpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfbmFtZXNbbGFtZV9nZXRfZm9yY2VfbXMoZ2YpXVtsYW1lX2dldF9tb2RlKGdmKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGxhbWVfZ2V0X3ZlcnNpb24oZ2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlKGdmKSA8IDE2MDAwID8gIi41IiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X1ZCUl9xdWFsaXR5KGdmKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHZicl9hYnI6CisgICAgICAgICAgICAgICAgY29uc29sZV9wcmludGYoIiVzIE1QRUctJXUlcyBMYXllciBJSUkgKCVneCkgYXZlcmFnZSAlZCBrYnBzIHF2YWw9JWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9uYW1lc1tsYW1lX2dldF9mb3JjZV9tcyhnZildW2xhbWVfZ2V0X21vZGUoZ2YpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gbGFtZV9nZXRfdmVyc2lvbihnZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoZ2YpIDwgMTYwMDAgPyAiLjUiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xICogKGludCkgKDEwLiAqIGxhbWVfZ2V0X2NvbXByZXNzaW9uX3JhdGlvKGdmKSArIDAuNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX2dldF9xdWFsaXR5KGdmKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNvbnNvbGVfcHJpbnRmKCIlcyBNUEVHLSV1JXMgTGF5ZXIgSUlJICglZ3gpICUzZCBrYnBzIHF2YWw9JWlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV9uYW1lc1tsYW1lX2dldF9mb3JjZV9tcyhnZildW2xhbWVfZ2V0X21vZGUoZ2YpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gbGFtZV9nZXRfdmVyc2lvbihnZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoZ2YpIDwgMTYwMDAgPyAiLjUiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xICogKGludCkgKDEwLiAqIGxhbWVfZ2V0X2NvbXByZXNzaW9uX3JhdGlvKGdmKSArIDAuNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9nZXRfYnJhdGUoZ2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWVfZ2V0X3F1YWxpdHkoZ2YpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaWxlbnQgPD0gLTEwKSB7CisgICAgICAgICAgICBsYW1lX3ByaW50X2ludGVybmFscyhnZik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK2VuY29kZXJfcHJvZ3Jlc3MoIGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0KiBnZiApCit7CisgICAgaWYgKHNpbGVudCA8PSAwKSB7CisgICAgICAgIGludCBjb25zdCBmcmFtZXMgPSBsYW1lX2dldF9mcmFtZU51bShnZik7CisgICAgICAgIGlmICh1cGRhdGVfaW50ZXJ2YWwgPD0gMCkgeyAgICAgLyogIG1vc3QgbGlrZWx5IC0tZGlzcHRpbWUgeCBub3QgdXNlZCAqLworICAgICAgICAgICAgaWYgKChmcmFtZXMgJSAxMDApICE9IDApIHsgIC8qICB0cnVlLCBtb3N0IG9mIHRoZSB0aW1lICovCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhdGljIGRvdWJsZSBsYXN0X3RpbWUgPSAwLjA7CisgICAgICAgICAgICBpZiAoZnJhbWVzICE9IDAgJiYgZnJhbWVzICE9IDkpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgY29uc3QgYWN0ID0gR2V0UmVhbFRpbWUoKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgY29uc3QgZGlmID0gYWN0IC0gbGFzdF90aW1lOworICAgICAgICAgICAgICAgIGlmIChkaWYgPj0gMCAmJiBkaWYgPCB1cGRhdGVfaW50ZXJ2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RfdGltZSA9IEdldFJlYWxUaW1lKCk7IC8qIGZyb20gbm93ISBkaXNwX3RpbWUgc2Vjb25kcyAqLworICAgICAgICB9CisjaWZkZWYgQlJISVNUCisgICAgICAgIGlmIChicmhpc3QpIHsKKyAgICAgICAgICAgIGJyaGlzdF9qdW1wX2JhY2soKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHRpbWVzdGF0dXMoZ2YpOworI2lmZGVmIEJSSElTVAorICAgICAgICBpZiAoYnJoaXN0KSB7CisgICAgICAgICAgICBicmhpc3RfZGlzcChnZik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBjb25zb2xlX2ZsdXNoKCk7CisgICAgfQorfQorCit2b2lkCitlbmNvZGVyX3Byb2dyZXNzX2VuZCggbGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QqIGdmICkKK3sKKyAgICBpZiAoc2lsZW50IDw9IDApIHsKKyNpZmRlZiBCUkhJU1QKKyAgICAgICAgaWYgKGJyaGlzdCkgeworICAgICAgICAgICAgYnJoaXN0X2p1bXBfYmFjaygpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdGltZXN0YXR1cyhnZik7CisjaWZkZWYgQlJISVNUCisgICAgICAgIGlmIChicmhpc3QpIHsKKyAgICAgICAgICAgIGJyaGlzdF9kaXNwKGdmKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHRpbWVzdGF0dXNfZmluaXNoKCk7CisgICAgfQorfQorCisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbiBnZXRfYXVkaW8uYyAqLworCit2b2lkCitkZWNvZGVyX3Byb2dyZXNzKGNvbnN0IG1wM2RhdGFfc3RydWN0ICogY29uc3QgbXAzZGF0YSkKK3sKKyAgICBzdGF0aWMgaW50IGxhc3Q7CisgICAgY29uc29sZV9wcmludGYoIlxyRnJhbWUjJTZpLyUtNmkgJTNpIGticHMiLAorICAgICAgICAgICAgICAgICAgIG1wM2RhdGEtPmZyYW1lbnVtLCBtcDNkYXRhLT50b3RhbGZyYW1lcywgbXAzZGF0YS0+Yml0cmF0ZSk7CisKKyAgICAvKiBQcm9ncmFtbWVkIHdpdGggYSBzaW5nbGUgZnJhbWUgaG9sZCBkZWxheSAqLworICAgIC8qIEF0dGVudGlvbjogc3RhdGljIGRhdGEgKi8KKworICAgIC8qIE1QMiBQbGF5YmFjayBpcyBzdGlsbCBidWdneS4gKi8KKyAgICAvKiAiJzAwJyBzdWJiYW5kcyA0LTMxIGluIGludGVuc2l0eV9zdGVyZW8sIGJvdW5kPT00IiAqLworICAgIC8qIGlzIHRoaXMgcmVhbGx5IGludGVuc2l0eV9zdGVyZW8gb3IgaXMgaXQgTVMgc3RlcmVvPyAqLworCisgICAgaWYgKG1wM2RhdGEtPm1vZGUgPT0gSk9JTlRfU1RFUkVPKSB7CisgICAgICAgIGludCAgICAgY3VyciA9IG1wM2RhdGEtPm1vZGVfZXh0OworICAgICAgICBjb25zb2xlX3ByaW50ZigiICAlcyAgJWMiLAorICAgICAgICAgICAgICAgICAgICAgICBjdXJyICYgMiA/IGxhc3QgJiAyID8gIiBNUyAiIDogIkxNU1IiIDogbGFzdCAmIDIgPyAiTE1TUiIgOiAiTCAgUiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgJiAxID8gbGFzdCAmIDEgPyAnSScgOiAnaScgOiBsYXN0ICYgMSA/ICdpJyA6ICcgJyk7CisgICAgICAgIGxhc3QgPSBjdXJyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29uc29sZV9wcmludGYoIiAgICAgICAgICIpOworICAgICAgICBsYXN0ID0gMDsKKyAgICB9CisvKiAgICBjb25zb2xlX3ByaW50ZiAoIiVzIiwgQ29uc29sZV9JTy5zdHJfY2xyZW9sbiApOyAqLworICAgIGNvbnNvbGVfcHJpbnRmKCIgICAgICAgIFxiXGJcYlxiXGJcYlxiXGIiKTsKK30KKwordm9pZAorZGVjb2Rlcl9wcm9ncmVzc19maW5pc2goKQoreworICAgIGNvbnNvbGVfcHJpbnRmKCJcbiIpOworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvdGltZXN0YXR1cy5oIGIvZnJvbnRlbmQvdGltZXN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwY2M1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC90aW1lc3RhdHVzLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqCXRpbWUgc3RhdHVzIHJlbGF0ZWQgZnVuY3Rpb24gaW5jbHVkZSBmaWxlCisgKgorICoJQ29weXJpZ2h0IChjKSAxOTk5IE1hcmsgVGF5bG9yCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTEFNRV9USU1FU1RBVFVTX0gKKyNkZWZpbmUgTEFNRV9USU1FU1RBVFVTX0gKKwordm9pZCAgICBlbmNvZGVyX3Byb2dyZXNzX2JlZ2luKCBsYW1lX2dsb2JhbF9mbGFncyBjb25zdCogICAgZ2ZwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNoYXIgY29uc3QqICAgICAgICAgICAgICAgICBpbnBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2hhciBjb25zdCogICAgICAgICAgICAgICAgIG91dHBhdGggKTsKK3ZvaWQgICAgZW5jb2Rlcl9wcm9ncmVzcyggbGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QqIGdmcCApOwordm9pZCAgICBlbmNvZGVyX3Byb2dyZXNzX2VuZChsYW1lX2dsb2JhbF9mbGFncyBjb25zdCogZ2ZwKTsKKwordm9pZCAgICBkZWNvZGVyX3Byb2dyZXNzKGNvbnN0IG1wM2RhdGFfc3RydWN0ICogY29uc3QpOwordm9pZCAgICBkZWNvZGVyX3Byb2dyZXNzX2ZpbmlzaCgpOworCisjZW5kaWYgLyogTEFNRV9USU1FU1RBVFVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi9pbmNsdWRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGE2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorIyMgJElkOiBNYWtlZmlsZS5hbSx2IDEuMi4xNi4xIDIwMTAvMDIvMjYgMDM6NDA6NTcgcm9iZXJ0IEV4cCAkCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKKworcGtnaW5jbHVkZV9IRUFERVJTID0gbGFtZS5oCisKK0VYVFJBX0RJU1QgPSBcCisJbGFtZS5kZWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvTWFrZWZpbGUuaW4gYi9pbmNsdWRlL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTAyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDMzIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBnbG9iYWwgc2VjdGlvbiBmb3IgZXZlcnkgTWFrZWZpbGUuYW0KKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChwa2dpbmNsdWRlX0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCisJJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCitzdWJkaXIgPSBpbmNsdWRlCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gYGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOworYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpIgorcGtnaW5jbHVkZUhFQURFUlNfSU5TVEFMTCA9ICQoSU5TVEFMTF9IRUFERVIpCitIRUFERVJTID0gJChwa2dpbmNsdWRlX0hFQURFUlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gMS45IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRVhUUkFfRElTVCA9IGxhbWUuZGVmCitwa2dpbmNsdWRlX0hFQURFUlMgPSBsYW1lLmgKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGluY2x1ZGUvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGluY2x1ZGUvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtcGtnaW5jbHVkZUhFQURFUlM6ICQocGtnaW5jbHVkZV9IRUFERVJTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQocGtnaW5jbHVkZWRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpIgorCUBsaXN0PSckKHBrZ2luY2x1ZGVfSEVBREVSUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBmPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiICQocGtnaW5jbHVkZUhFQURFUlNfSU5TVEFMTCkgJyQkZCQkcCcgJyQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpLyQkZiciOyBcCisJICAkKHBrZ2luY2x1ZGVIRUFERVJTX0lOU1RBTEwpICIkJGQkJHAiICIkKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKS8kJGYiOyBcCisJZG9uZQorCit1bmluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChwa2dpbmNsdWRlX0hFQURFUlMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBmPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChwa2dpbmNsdWRlZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpLyQkZiI7IFwKKwlkb25lCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoSEVBREVSUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUyBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTCisKKworIyBlbmQgZ2xvYmFsIHNlY3Rpb24KKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGFtZS5kZWYgYi9pbmNsdWRlL2xhbWUuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOWQ2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xhbWUuZGVmCkBAIC0wLDAgKzEsMjg2IEBACitMSUJSQVJZICBsaWJtcDNsYW1lLkRMTAorRVhQT1JUUworCitsYW1lX2luaXQJCUAxCisKK2xhbWVfc2V0X251bV9zYW1wbGVzCUAyCitsYW1lX2dldF9udW1fc2FtcGxlcwlAMworCitsYW1lX3NldF9pbl9zYW1wbGVyYXRlCUA0CitsYW1lX2dldF9pbl9zYW1wbGVyYXRlCUA1CisKK2xhbWVfc2V0X251bV9jaGFubmVscwlANgorbGFtZV9nZXRfbnVtX2NoYW5uZWxzCUA3CisKK2xhbWVfc2V0X3NjYWxlCQlAOAorbGFtZV9nZXRfc2NhbGUJCUA5CisKK2xhbWVfc2V0X3NjYWxlX2xlZnQJQDEwCitsYW1lX2dldF9zY2FsZV9sZWZ0CUAxMQorCitsYW1lX3NldF9zY2FsZV9yaWdodAlAMTIKK2xhbWVfZ2V0X3NjYWxlX3JpZ2h0CUAxMworCitsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZQlAMTQKK2xhbWVfZ2V0X291dF9zYW1wbGVyYXRlCUAxNQorCitsYW1lX3NldF9hbmFseXNpcwlAMTYKK2xhbWVfZ2V0X2FuYWx5c2lzCUAxNworCitsYW1lX3NldF9iV3JpdGVWYnJUYWcJQDE4CitsYW1lX2dldF9iV3JpdGVWYnJUYWcJQDE5CisKK2xhbWVfc2V0X2RlY29kZV9vbmx5CUAyMAorbGFtZV9nZXRfZGVjb2RlX29ubHkJQDIxCisKK2xhbWVfc2V0X3F1YWxpdHkJQDIyCitsYW1lX2dldF9xdWFsaXR5CUAyMworCitsYW1lX3NldF9tb2RlCQlAMjQKK2xhbWVfZ2V0X21vZGUJCUAyNQorCitsYW1lX3NldF9mb3JjZV9tcwlAMjYKK2xhbWVfZ2V0X2ZvcmNlX21zCUAyNworCitsYW1lX3NldF9mcmVlX2Zvcm1hdAlAMjgKK2xhbWVfZ2V0X2ZyZWVfZm9ybWF0CUAyOQorCisKK2xhbWVfc2V0X2ZpbmRSZXBsYXlHYWluCUAzMAorbGFtZV9nZXRfZmluZFJlcGxheUdhaW4JQDMxCisKK2xhbWVfc2V0X2RlY29kZV9vbl90aGVfZmx5CUAzMgorbGFtZV9nZXRfZGVjb2RlX29uX3RoZV9mbHkJQDMzCisKK2xhbWVfc2V0X25vZ2FwX3RvdGFsCUAzNAorbGFtZV9nZXRfbm9nYXBfdG90YWwJQDM1CisKK2xhbWVfc2V0X25vZ2FwX2N1cnJlbnRpbmRleAlAMzYKK2xhbWVfZ2V0X25vZ2FwX2N1cnJlbnRpbmRleAlAMzcKKworCitsYW1lX3NldF9lcnJvcmYJCUAzOAorbGFtZV9zZXRfZGVidWdmCQlAMzkKK2xhbWVfc2V0X21zZ2YJCUA0MAorCitsYW1lX3NldF9icmF0ZQkJQDQxCitsYW1lX2dldF9icmF0ZQkJQDQyCisgCitsYW1lX3NldF9jb21wcmVzc2lvbl9yYXRpbwlANDMKK2xhbWVfZ2V0X2NvbXByZXNzaW9uX3JhdGlvCUA0NAorCitsYW1lX3NldF9wcmVzZXQJCUA0NQorCitsYW1lX3NldF9hc21fb3B0aW1pemF0aW9ucwlANDYKKworCitsYW1lX3NldF9jb3B5cmlnaHQJQDQ3CitsYW1lX2dldF9jb3B5cmlnaHQJQDQ4CisKK2xhbWVfc2V0X29yaWdpbmFsCUA0OQorbGFtZV9nZXRfb3JpZ2luYWwJQDUwCisKK2xhbWVfc2V0X2Vycm9yX3Byb3RlY3Rpb24JQDUxCitsYW1lX2dldF9lcnJvcl9wcm90ZWN0aW9uCUA1MgorCitsYW1lX3NldF9wYWRkaW5nX3R5cGUJQDUzCitsYW1lX2dldF9wYWRkaW5nX3R5cGUJQDU0CisKK2xhbWVfc2V0X2V4dGVuc2lvbglANTUKK2xhbWVfZ2V0X2V4dGVuc2lvbglANTYKKworbGFtZV9zZXRfc3RyaWN0X0lTTwlANTcKK2xhbWVfZ2V0X3N0cmljdF9JU08JQDU4CisKK2xhbWVfc2V0X2Rpc2FibGVfcmVzZXJ2b2lyCUA1OQorbGFtZV9nZXRfZGlzYWJsZV9yZXNlcnZvaXIJQDYwCisKK2xhbWVfc2V0X3F1YW50X2NvbXAJQDYxCitsYW1lX2dldF9xdWFudF9jb21wCUA2MgorbGFtZV9zZXRfcXVhbnRfY29tcF9zaG9ydAlANjMKK2xhbWVfZ2V0X3F1YW50X2NvbXBfc2hvcnQJQDY0CisKK2xhbWVfc2V0X2V4cGVyaW1lbnRhbFgJQDY1CitsYW1lX2dldF9leHBlcmltZW50YWxYCUA2NgorCitsYW1lX3NldF9leHBlcmltZW50YWxZCUA2NworbGFtZV9nZXRfZXhwZXJpbWVudGFsWQlANjgKKworbGFtZV9zZXRfZXhwZXJpbWVudGFsWglANjkKK2xhbWVfZ2V0X2V4cGVyaW1lbnRhbFoJQDcwCisKK2xhbWVfc2V0X2V4cF9uc3BzeXR1bmUJQDcxCitsYW1lX2dldF9leHBfbnNwc3l0dW5lCUA3MgorCitsYW1lX3NldF9tc2ZpeAkJQDczCitsYW1lX2dldF9tc2ZpeAkJQDc0CisKK2xhbWVfc2V0X1ZCUgkJQDc1CitsYW1lX2dldF9WQlIJCUA3NgorCitsYW1lX3NldF9WQlJfcQkJQDc3CitsYW1lX2dldF9WQlJfcQkJQDc4CisKK2xhbWVfc2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcwlANzkKK2xhbWVfZ2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcwlAODAKKworbGFtZV9zZXRfVkJSX21pbl9iaXRyYXRlX2ticHMJQDgxCitsYW1lX2dldF9WQlJfbWluX2JpdHJhdGVfa2JwcwlAODIKKworbGFtZV9zZXRfVkJSX21heF9iaXRyYXRlX2ticHMJQDgzCitsYW1lX2dldF9WQlJfbWF4X2JpdHJhdGVfa2JwcwlAODQKKworbGFtZV9zZXRfVkJSX2hhcmRfbWluCUA4NQorbGFtZV9nZXRfVkJSX2hhcmRfbWluCUA4NgorCitsYW1lX3NldF9wcmVzZXRfZXhwb3B0cwlAODcKKworbGFtZV9zZXRfbG93cGFzc2ZyZXEJQDg4CitsYW1lX2dldF9sb3dwYXNzZnJlcQlAODkKKworbGFtZV9zZXRfbG93cGFzc3dpZHRoCUA5MAorbGFtZV9nZXRfbG93cGFzc3dpZHRoCUA5MQorCitsYW1lX3NldF9oaWdocGFzc2ZyZXEJQDkyCitsYW1lX2dldF9oaWdocGFzc2ZyZXEJQDkzCisKK2xhbWVfc2V0X2hpZ2hwYXNzd2lkdGgJQDk0CitsYW1lX2dldF9oaWdocGFzc3dpZHRoCUA5NQorCitsYW1lX3NldF9BVEhvbmx5CUA5NgorbGFtZV9nZXRfQVRIb25seQlAOTcKKworbGFtZV9zZXRfQVRIc2hvcnQJQDk4CitsYW1lX2dldF9BVEhzaG9ydAlAOTkKKworbGFtZV9zZXRfbm9BVEgJCUAxMDAKK2xhbWVfZ2V0X25vQVRICQlAMTAxCisKK2xhbWVfc2V0X0FUSHR5cGUJQDEwMgorbGFtZV9nZXRfQVRIdHlwZQlAMTAzCisKK2xhbWVfc2V0X0FUSGxvd2VyCUAxMDQKK2xhbWVfZ2V0X0FUSGxvd2VyCUAxMDUKKworbGFtZV9zZXRfYXRoYWFfdHlwZQlAMTA2CitsYW1lX2dldF9hdGhhYV90eXBlCUAxMDcKKworbGFtZV9zZXRfYXRoYWFfbG91ZGFwcHJveAlAMTA4CitsYW1lX2dldF9hdGhhYV9sb3VkYXBwcm94CUAxMDkKKworbGFtZV9zZXRfYXRoYWFfc2Vuc2l0aXZpdHkJQDExMAorbGFtZV9nZXRfYXRoYWFfc2Vuc2l0aXZpdHkJQDExMQorCitsYW1lX3NldF9jd2xpbWl0CUAxMTIKK2xhbWVfZ2V0X2N3bGltaXQJQDExMworCitsYW1lX3NldF91c2VUZW1wb3JhbAlAMTE0CitsYW1lX2dldF91c2VUZW1wb3JhbAlAMTE1CisKK2xhbWVfc2V0X2ludGVyQ2hSYXRpbwlAMTE2CitsYW1lX2dldF9pbnRlckNoUmF0aW8JQDExNworCitsYW1lX3NldF9ub19zaG9ydF9ibG9ja3MJQDExOAorbGFtZV9nZXRfbm9fc2hvcnRfYmxvY2tzCUAxMTkKK2xhbWVfc2V0X2ZvcmNlX3Nob3J0X2Jsb2NrcwlAMTIwCitsYW1lX2dldF9mb3JjZV9zaG9ydF9ibG9ja3MJQDEyMQorbGFtZV9zZXRfYWxsb3dfZGlmZl9zaG9ydAlAMTIyCitsYW1lX2dldF9hbGxvd19kaWZmX3Nob3J0CUAxMjMKKworbGFtZV9zZXRfZW1waGFzaXMJQDEyNAorbGFtZV9nZXRfZW1waGFzaXMJQDEyNQorCitsYW1lX2dldF92ZXJzaW9uCUAxMjYKK2xhbWVfZ2V0X2VuY29kZXJfZGVsYXkJQDEyNworbGFtZV9nZXRfZW5jb2Rlcl9wYWRkaW5nCUAxMjgKK2xhbWVfZ2V0X2ZyYW1lc2l6ZQlAMTI5CisKK2xhbWVfZ2V0X21mX3NhbXBsZXNfdG9fZW5jb2RlCUAxMzAKK2xhbWVfZ2V0X3NpemVfbXAzYnVmZmVyCUAxMzEKK2xhbWVfZ2V0X2ZyYW1lTnVtCUAxMzIKK2xhbWVfZ2V0X3RvdGFsZnJhbWVzCUAxMzMKKworbGFtZV9nZXRfUmFkaW9HYWluCUAxMzQKK2xhbWVfZ2V0X0F1ZGlvcGhpbGVHYWluCUAxMzUKK2xhbWVfZ2V0X1BlYWtTYW1wbGUJQDEzNgorbGFtZV9nZXRfbm9jbGlwR2FpbkNoYW5nZQlAMTM3CitsYW1lX2dldF9ub2NsaXBTY2FsZQlAMTM4CisKK2xhbWVfaW5pdF9wYXJhbXMJQDEzOQorCitnZXRfbGFtZV92ZXJzaW9uCUAxNDAKK2dldF9sYW1lX3Nob3J0X3ZlcnNpb24gQDE0MQorZ2V0X2xhbWVfdmVyeV9zaG9ydF92ZXJzaW9uCUAxNDIKK2dldF9wc3lfdmVyc2lvbgkJQDE0MyAgICAgICAgCitnZXRfbGFtZV91cmwJCUAxNDQgICAgICAgICAgIAorCitnZXRfbGFtZV92ZXJzaW9uX251bWVyaWNhbAlAMTQ1CisKK2xhbWVfcHJpbnRfY29uZmlnCUAxNDYKK2xhbWVfcHJpbnRfaW50ZXJuYWxzCUAxNDcKKworbGFtZV9lbmNvZGVfYnVmZmVyCUAxNDgKK2xhbWVfZW5jb2RlX2J1ZmZlcl9pbnRlcmxlYXZlZAlAMTQ5CitsYW1lX2VuY29kZV9idWZmZXJfZmxvYXQJQDE1MAorbGFtZV9lbmNvZGVfYnVmZmVyX2xvbmcJQDE1MQorbGFtZV9lbmNvZGVfYnVmZmVyX2xvbmcyCUAxNTIKK2xhbWVfZW5jb2RlX2J1ZmZlcl9pbnQJQDE1MworbGFtZV9lbmNvZGVfZmx1c2gJQDE1NAorbGFtZV9lbmNvZGVfZmx1c2hfbm9nYXAJQDE1NQorCitsYW1lX2luaXRfYml0c3RyZWFtCUAxNTYKKworbGFtZV9iaXRyYXRlX2hpc3QJQDE1NworbGFtZV9iaXRyYXRlX2ticHMJQDE1OAorbGFtZV9zdGVyZW9fbW9kZV9oaXN0CUAxNTkKK2xhbWVfYml0cmF0ZV9zdGVyZW9fbW9kZV9oaXN0CUAxNjAKK2xhbWVfYmxvY2tfdHlwZV9oaXN0CUAxNjEKK2xhbWVfYml0cmF0ZV9ibG9ja190eXBlX2hpc3QJQDE2MgorbGFtZV9tcDNfdGFnc19maWQJQDE2MworbGFtZV9jbG9zZQkJQDE2NAorbGFtZV9nZXRfbGFtZXRhZ19mcmFtZQlAMTY1CitnZXRfbGFtZV9vc19iaXRuZXNzCUAxNjYKK2xhbWVfc2V0X1ZCUl9xdWFsaXR5CUAxNjcKK2xhbWVfZ2V0X1ZCUl9xdWFsaXR5CUAxNjgKKworCitiaXRyYXRlX3RhYmxlCQlANTAwCitzYW1wbGVyYXRlX3RhYmxlCUA1MDEKKworbGFtZV9kZWNvZGVfaW5pdAlAMTAwMAorbGFtZV9kZWNvZGUJCUAxMDAxCitsYW1lX2RlY29kZV9oZWFkZXJzCUAxMDAyCitsYW1lX2RlY29kZTEJCUAxMDAzCitsYW1lX2RlY29kZTFfaGVhZGVycwlAMTAwNAorbGFtZV9kZWNvZGUxX2hlYWRlcnNCCUAxMDA1CitsYW1lX2RlY29kZV9leGl0CUAxMDA2CisKK2hpcF9kZWNvZGVfaW5pdAlAMTEwMAoraGlwX2RlY29kZV9leGl0CUAxMTAxCitoaXBfZGVjb2RlCQlAMTEwMgoraGlwX2RlY29kZV9oZWFkZXJzCUAxMTAzCitoaXBfZGVjb2RlMQkJQDExMDQKK2hpcF9kZWNvZGUxX2hlYWRlcnMJQDExMDUKK2hpcF9kZWNvZGUxX2hlYWRlcnNCCUAxMTA2CisKK2lkM3RhZ19nZW5yZV9saXN0CUAyMDAwCitpZDN0YWdfaW5pdCAgIAkJQDIwMDEKK2lkM3RhZ19hZGRfdjIgICAJQDIwMDIKK2lkM3RhZ192MV9vbmx5ICAJQDIwMDMKK2lkM3RhZ192Ml9vbmx5ICAJQDIwMDQKK2lkM3RhZ19zcGFjZV92MSAJQDIwMDUKK2lkM3RhZ19wYWRfdjIgICAJQDIwMDYKK2lkM3RhZ19zZXRfdGl0bGUJQDIwMDcKK2lkM3RhZ19zZXRfYXJ0aXN0CUAyMDA4CitpZDN0YWdfc2V0X2FsYnVtCUAyMDA5CitpZDN0YWdfc2V0X3llYXIJCUAyMDEwCitpZDN0YWdfc2V0X2NvbW1lbnQJQDIwMTEKK2lkM3RhZ19zZXRfdHJhY2sJQDIwMTIKK2lkM3RhZ19zZXRfZ2VucmUJQDIwMTMKK2lkM3RhZ19zZXRfZmllbGR2YWx1ZQlAMjAxNAoraWQzdGFnX3NldF9hbGJ1bWFydAlAMjAxNQorbGFtZV9nZXRfaWQzdjFfdGFnCUAyMDE2CitsYW1lX2dldF9pZDN2Ml90YWcJQDIwMTcKK2xhbWVfc2V0X3dyaXRlX2lkM3RhZ19hdXRvbWF0aWMJQDIwMTgKK2xhbWVfZ2V0X3dyaXRlX2lkM3RhZ19hdXRvbWF0aWMJQDIwMTkKK2lkM3RhZ19zZXRfcGFkCUAyMDIwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xhbWUuaCBiL2luY2x1ZGUvbGFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NTBiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xhbWUuaApAQCAtMCwwICsxLDEyNDMgQEAKKy8qCisgKglJbnRlcmZhY2UgdG8gTVAzIExBTUUgZW5jb2RpbmcgZW5naW5lCisgKgorICoJQ29weXJpZ2h0IChjKSAxOTk5IE1hcmsgVGF5bG9yCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qICRJZDogbGFtZS5oLHYgMS4xNzAuMi40IDIwMDkvMDEvMTggMTU6NDQ6Mjggcm9iZXJ0IEV4cCAkICovCisKKyNpZm5kZWYgTEFNRV9MQU1FX0gKKyNkZWZpbmUgTEFNRV9MQU1FX0gKKworLyogZm9yIHNpemVfdCB0eXBlZGVmICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisvKiBmb3IgdmFfbGlzdCB0eXBlZGVmICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisvKiBmb3IgRklMRSB0eXBlZGVmLCBUT0RPOiByZW1vdmUgd2hlbiByZW1vdmluZyBsYW1lX21wM190YWdzX2ZpZCAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorI3VuZGVmIENERUNMCisjZGVmaW5lIENERUNMIF9fY2RlY2wKKyNlbHNlCisjZGVmaW5lIENERUNMCisjZW5kaWYKKworCisjZGVmaW5lIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVEIDEKKworCit0eXBlZGVmIGVudW0gdmJyX21vZGVfZSB7CisgIHZicl9vZmY9MCwKKyAgdmJyX210LCAgICAgICAgICAgICAgIC8qIG9ic29sZXRlLCBzYW1lIGFzIHZicl9tdHJoICovCisgIHZicl9yaCwKKyAgdmJyX2FiciwKKyAgdmJyX210cmgsCisgIHZicl9tYXhfaW5kaWNhdG9yLCAgICAvKiBEb24ndCB1c2UgdGhpcyEgSXQncyB1c2VkIGZvciBzYW5pdHkgY2hlY2tzLiAgICAgICAqLworICB2YnJfZGVmYXVsdD12YnJfbXRyaCAgICAvKiBjaGFuZ2UgdGhpcyB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgVkJSIG1vZGUgb2YgTEFNRSAqLworfSB2YnJfbW9kZTsKKworCisvKiBNUEVHIG1vZGVzICovCit0eXBlZGVmIGVudW0gTVBFR19tb2RlX2UgeworICBTVEVSRU8gPSAwLAorICBKT0lOVF9TVEVSRU8sCisgIERVQUxfQ0hBTk5FTCwgICAvKiBMQU1FIGRvZXNuJ3Qgc3VwcG9ydHMgdGhpcyEgKi8KKyAgTU9OTywKKyAgTk9UX1NFVCwKKyAgTUFYX0lORElDQVRPUiAgIC8qIERvbid0IHVzZSB0aGlzISBJdCdzIHVzZWQgZm9yIHNhbml0eSBjaGVja3MuICovCit9IE1QRUdfbW9kZTsKKworLyogUGFkZGluZyB0eXBlcyAqLwordHlwZWRlZiBlbnVtIFBhZGRpbmdfdHlwZV9lIHsKKyAgUEFEX05PID0gMCwKKyAgUEFEX0FMTCwKKyAgUEFEX0FESlVTVCwKKyAgUEFEX01BWF9JTkRJQ0FUT1IgICAvKiBEb24ndCB1c2UgdGhpcyEgSXQncyB1c2VkIGZvciBzYW5pdHkgY2hlY2tzLiAqLworfSBQYWRkaW5nX3R5cGU7CisKKworCisvKnByZXNldHMqLwordHlwZWRlZiBlbnVtIHByZXNldF9tb2RlX2UgeworICAgIC8qdmFsdWVzIGZyb20gOCB0byAzMjAgc2hvdWxkIGJlIHJlc2VydmVkIGZvciBhYnIgYml0cmF0ZXMqLworICAgIC8qZm9yIGFiciBJJ2Qgc3VnZ2VzdCB0byBkaXJlY3RseSB1c2UgdGhlIHRhcmdldGVkIGJpdHJhdGUgYXMgYSB2YWx1ZSovCisgICAgQUJSXzggPSA4LAorICAgIEFCUl8zMjAgPSAzMjAsCisKKyAgICBWOSA9IDQxMCwgLypWeCB0byBtYXRjaCBMYW1lIGFuZCBWQlJfeHggdG8gbWF0Y2ggRmhHKi8KKyAgICBWQlJfMTAgPSA0MTAsCisgICAgVjggPSA0MjAsCisgICAgVkJSXzIwID0gNDIwLAorICAgIFY3ID0gNDMwLAorICAgIFZCUl8zMCA9IDQzMCwKKyAgICBWNiA9IDQ0MCwKKyAgICBWQlJfNDAgPSA0NDAsCisgICAgVjUgPSA0NTAsCisgICAgVkJSXzUwID0gNDUwLAorICAgIFY0ID0gNDYwLAorICAgIFZCUl82MCA9IDQ2MCwKKyAgICBWMyA9IDQ3MCwKKyAgICBWQlJfNzAgPSA0NzAsCisgICAgVjIgPSA0ODAsCisgICAgVkJSXzgwID0gNDgwLAorICAgIFYxID0gNDkwLAorICAgIFZCUl85MCA9IDQ5MCwKKyAgICBWMCA9IDUwMCwKKyAgICBWQlJfMTAwID0gNTAwLAorCisKKworICAgIC8qc3RpbGwgdGhlcmUgZm9yIGNvbXBhdGliaWxpdHkqLworICAgIFIzTUlYID0gMTAwMCwKKyAgICBTVEFOREFSRCA9IDEwMDEsCisgICAgRVhUUkVNRSA9IDEwMDIsCisgICAgSU5TQU5FID0gMTAwMywKKyAgICBTVEFOREFSRF9GQVNUID0gMTAwNCwKKyAgICBFWFRSRU1FX0ZBU1QgPSAxMDA1LAorICAgIE1FRElVTSA9IDEwMDYsCisgICAgTUVESVVNX0ZBU1QgPSAxMDA3Cit9IHByZXNldF9tb2RlOworCisKKy8qYXNtIG9wdGltaXphdGlvbnMqLwordHlwZWRlZiBlbnVtIGFzbV9vcHRpbWl6YXRpb25zX2UgeworICAgIE1NWCA9IDEsCisgICAgQU1EXzNETk9XID0gMiwKKyAgICBTU0UgPSAzCit9IGFzbV9vcHRpbWl6YXRpb25zOworCisKKy8qIHBzeWNob2Fjb3VzdGljIG1vZGVsICovCit0eXBlZGVmIGVudW0gUHN5X21vZGVsX2UgeworICAgIFBTWV9HUFNZQ0hPID0gMSwKKyAgICBQU1lfTlNQU1lUVU5FID0gMgorfSBQc3lfbW9kZWw7CisKKworc3RydWN0IGxhbWVfZ2xvYmFsX3N0cnVjdDsKK3R5cGVkZWYgc3RydWN0IGxhbWVfZ2xvYmFsX3N0cnVjdCBsYW1lX2dsb2JhbF9mbGFnczsKK3R5cGVkZWYgbGFtZV9nbG9iYWxfZmxhZ3MgKmxhbWVfdDsKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFRoZSBMQU1FIEFQSQorICogIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkLCBpbiB0aGlzIG9yZGVyLCBmb3IgZWFjaAorICogIE1QMyBmaWxlIHRvIGJlIGVuY29kZWQuICBTZWUgdGhlIGZpbGUgIkFQSSIgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICogUkVRVUlSRUQ6CisgKiBpbml0aWFsaXplIHRoZSBlbmNvZGVyLiAgc2V0cyBkZWZhdWx0IGZvciBhbGwgZW5jb2RlciBwYXJhbWV0ZXJzLAorICogcmV0dXJucyBOVUxMIGlmIHNvbWUgbWFsbG9jKCkncyBmYWlsZWQKKyAqIG90aGVyd2lzZSByZXR1cm5zIHBvaW50ZXIgdG8gc3RydWN0dXJlIG5lZWRlZCBmb3IgYWxsIGZ1dHVyZQorICogQVBJIGNhbGxzLgorICovCitsYW1lX2dsb2JhbF9mbGFncyAqIENERUNMIGxhbWVfaW5pdCh2b2lkKTsKKyNpZiBERVBSRUNBVEVEX09SX09CU09MRVRFX0NPREVfUkVNT1ZFRAorI2Vsc2UKKy8qIG9ic29sZXRlIHZlcnNpb24gKi8KK2ludCBDREVDTCBsYW1lX2luaXRfb2xkKGxhbWVfZ2xvYmFsX2ZsYWdzICopOworI2VuZGlmCisKKy8qCisgKiBPUFRJT05BTDoKKyAqIHNldCBhcyBuZWVkZWQgdG8gb3ZlcnJpZGUgZGVmYXVsdHMKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbnB1dCBzdHJlYW0gZGVzY3JpcHRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG51bWJlciBvZiBzYW1wbGVzLiAgZGVmYXVsdCA9IDJeMzItMSAgICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfbnVtX3NhbXBsZXMobGFtZV9nbG9iYWxfZmxhZ3MgKiwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIENERUNMIGxhbWVfZ2V0X251bV9zYW1wbGVzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBpbnB1dCBzYW1wbGUgcmF0ZSBpbiBIei4gIGRlZmF1bHQgPSA0NDEwMGh6ICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfaW5fc2FtcGxlcmF0ZShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2luX3NhbXBsZXJhdGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIG51bWJlciBvZiBjaGFubmVscyBpbiBpbnB1dCBzdHJlYW0uIGRlZmF1bHQ9MiAgKi8KK2ludCBDREVDTCBsYW1lX3NldF9udW1fY2hhbm5lbHMobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9udW1fY2hhbm5lbHMoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qCisgIHNjYWxlIHRoZSBpbnB1dCBieSB0aGlzIGFtb3VudCBiZWZvcmUgZW5jb2RpbmcuICBkZWZhdWx0PTAgKGRpc2FibGVkKQorICAobm90IHVzZWQgYnkgZGVjb2Rpbmcgcm91dGluZXMpCisqLworaW50IENERUNMIGxhbWVfc2V0X3NjYWxlKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGZsb2F0KTsKK2Zsb2F0IENERUNMIGxhbWVfZ2V0X3NjYWxlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKgorICBzY2FsZSB0aGUgY2hhbm5lbCAwIChsZWZ0KSBpbnB1dCBieSB0aGlzIGFtb3VudCBiZWZvcmUgZW5jb2RpbmcuCisgICAgZGVmYXVsdD0wIChkaXNhYmxlZCkKKyAgKG5vdCB1c2VkIGJ5IGRlY29kaW5nIHJvdXRpbmVzKQorKi8KK2ludCBDREVDTCBsYW1lX3NldF9zY2FsZV9sZWZ0KGxhbWVfZ2xvYmFsX2ZsYWdzICosIGZsb2F0KTsKK2Zsb2F0IENERUNMIGxhbWVfZ2V0X3NjYWxlX2xlZnQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qCisgIHNjYWxlIHRoZSBjaGFubmVsIDEgKHJpZ2h0KSBpbnB1dCBieSB0aGlzIGFtb3VudCBiZWZvcmUgZW5jb2RpbmcuCisgICAgZGVmYXVsdD0wIChkaXNhYmxlZCkKKyAgKG5vdCB1c2VkIGJ5IGRlY29kaW5nIHJvdXRpbmVzKQorKi8KK2ludCBDREVDTCBsYW1lX3NldF9zY2FsZV9yaWdodChsYW1lX2dsb2JhbF9mbGFncyAqLCBmbG9hdCk7CitmbG9hdCBDREVDTCBsYW1lX2dldF9zY2FsZV9yaWdodChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyoKKyAgb3V0cHV0IHNhbXBsZSByYXRlIGluIEh6LiAgZGVmYXVsdCA9IDAsIHdoaWNoIG1lYW5zIExBTUUgcGlja3MgYmVzdCB2YWx1ZQorICBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIGNvbXByZXNzaW9uLiAgTVBFRyBvbmx5IGFsbG93czoKKyAgTVBFRzEgICAgMzIsIDQ0LjEsICAgNDhraHoKKyAgTVBFRzIgICAgMTYsIDIyLjA1LCAgMjQKKyAgTVBFRzIuNSAgIDgsIDExLjAyNSwgMTIKKyAgKG5vdCB1c2VkIGJ5IGRlY29kaW5nIHJvdXRpbmVzKQorKi8KK2ludCBDREVDTCBsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdlbmVyYWwgY29udHJvbCBwYXJhbWV0ZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAxPWNhdXNlIExBTUUgdG8gY29sbGVjdCBkYXRhIGZvciBhbiBNUDMgZnJhbWUgYW5hbHl6ZXIuIGRlZmF1bHQ9MCAqLworaW50IENERUNMIGxhbWVfc2V0X2FuYWx5c2lzKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfYW5hbHlzaXMoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qCisgIDEgPSB3cml0ZSBhIFhpbmcgVkJSIGhlYWRlciBmcmFtZS4KKyAgZGVmYXVsdCA9IDEKKyAgdGhpcyB2YXJpYWJsZSBtdXN0IGhhdmUgYmVlbiBhZGRlZCBieSBhIEh1bmdhcmlhbiBub3RhdGlvbiBXaW5kb3dzIHByb2dyYW1tZXIgOi0pCisqLworaW50IENERUNMIGxhbWVfc2V0X2JXcml0ZVZiclRhZyhsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2JXcml0ZVZiclRhZyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogMT1kZWNvZGUgb25seS4gIHVzZSBsYW1lL21wZ2xpYiB0byBjb252ZXJ0IG1wMy9vZ2cgdG8gd2F2LiAgZGVmYXVsdD0wICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfZGVjb2RlX29ubHkobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9kZWNvZGVfb25seShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECisjZWxzZQorLyogMT1lbmNvZGUgYSBWb3JiaXMgLm9nZyBmaWxlLiAgZGVmYXVsdD0wICovCisvKiBERVBSRUNBVEVEICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfb2dnKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfb2dnKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworI2VuZGlmCisKKy8qCisgIGludGVybmFsIGFsZ29yaXRobSBzZWxlY3Rpb24uICBUcnVlIHF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYml0cmF0ZQorICBidXQgdGhpcyB2YXJpYWJsZSB3aWxsIGVmZmVjdCBxdWFsaXR5IGJ5IHNlbGVjdGluZyBleHBlbnNpdmUgb3IgY2hlYXAgYWxnb3JpdGhtcy4KKyAgcXVhbGl0eT0wLi45LiAgMD1iZXN0ICh2ZXJ5IHNsb3cpLiAgOT13b3JzdC4KKyAgcmVjb21tZW5kZWQ6ICAyICAgICBuZWFyLWJlc3QgcXVhbGl0eSwgbm90IHRvbyBzbG93CisgICAgICAgICAgICAgICAgNSAgICAgZ29vZCBxdWFsaXR5LCBmYXN0CisgICAgICAgICAgICAgICAgNyAgICAgb2sgcXVhbGl0eSwgcmVhbGx5IGZhc3QKKyovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfcXVhbGl0eShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X3F1YWxpdHkoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qCisgIG1vZGUgPSAwLDEsMiwzID0gc3RlcmVvLCBqc3RlcmVvLCBkdWFsIGNoYW5uZWwgKG5vdCBzdXBwb3J0ZWQpLCBtb25vCisgIGRlZmF1bHQ6IGxhbWUgcGlja3MgYmFzZWQgb24gY29tcHJlc3Npb24gcmF0aW9uIGFuZCBpbnB1dCBjaGFubmVscworKi8KK2ludCBDREVDTCBsYW1lX3NldF9tb2RlKGxhbWVfZ2xvYmFsX2ZsYWdzICosIE1QRUdfbW9kZSk7CitNUEVHX21vZGUgQ0RFQ0wgbGFtZV9nZXRfbW9kZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECisjZWxzZQorLyoKKyAgbW9kZV9hdXRvbXMuICBVc2UgYSBNL1MgbW9kZSB3aXRoIGEgc3dpdGNoaW5nIHRocmVzaG9sZCBiYXNlZCBvbgorICBjb21wcmVzc2lvbiByYXRpbworICBERVBSRUNBVEVECisqLworaW50IENERUNMIGxhbWVfc2V0X21vZGVfYXV0b21zKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfbW9kZV9hdXRvbXMoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisjZW5kaWYKKworLyoKKyAgZm9yY2VfbXMuICBGb3JjZSBNL1MgZm9yIGFsbCBmcmFtZXMuICBGb3IgdGVzdGluZyBvbmx5LgorICBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpCisqLworaW50IENERUNMIGxhbWVfc2V0X2ZvcmNlX21zKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfZm9yY2VfbXMoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIHVzZSBmcmVlX2Zvcm1hdD8gIGRlZmF1bHQgPSAwIChkaXNhYmxlZCkgKi8KK2ludCBDREVDTCBsYW1lX3NldF9mcmVlX2Zvcm1hdChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2ZyZWVfZm9ybWF0KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBwZXJmb3JtIFJlcGxheUdhaW4gYW5hbHlzaXM/ICBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfZmluZFJlcGxheUdhaW4obGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9maW5kUmVwbGF5R2Fpbihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogZGVjb2RlIG9uIHRoZSBmbHkuIFNlYXJjaCBmb3IgdGhlIHBlYWsgc2FtcGxlLiBJZiB0aGUgUmVwbGF5R2FpbgorICogYW5hbHlzaXMgaXMgZW5hYmxlZCB0aGVuIHBlcmZvcm0gdGhlIGFuYWx5c2lzIG9uIHRoZSBkZWNvZGVkIGRhdGEKKyAqIHN0cmVhbS4gZGVmYXVsdCA9IDAgKGRpc2FibGVkKQorICogTk9URTogaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRoZSBidWlsZC1pbiBkZWNvZGVyIHNob3VsZCBub3QgYmUgdXNlZCAqLworaW50IENERUNMIGxhbWVfc2V0X2RlY29kZV9vbl90aGVfZmx5KGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfZGVjb2RlX29uX3RoZV9mbHkoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKyNpZiBERVBSRUNBVEVEX09SX09CU09MRVRFX0NPREVfUkVNT1ZFRAorI2Vsc2UKKy8qIERFUFJFQ0FURUQ6IG5vdyBkb2VzIHRoZSBzYW1lIGFzIGxhbWVfc2V0X2ZpbmRSZXBsYXlHYWluKCkKKyAgIGRlZmF1bHQgPSAwIChkaXNhYmxlZCkgKi8KK2ludCBDREVDTCBsYW1lX3NldF9SZXBsYXlHYWluX2lucHV0KGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfUmVwbGF5R2Fpbl9pbnB1dChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogREVQUkVDQVRFRDogbm93IGRvZXMgdGhlIHNhbWUgYXMKKyAgIGxhbWVfc2V0X2RlY29kZV9vbl90aGVfZmx5KCkgJiYgbGFtZV9zZXRfZmluZFJlcGxheUdhaW4oKQorICAgZGVmYXVsdCA9IDAgKGRpc2FibGVkKSAqLworaW50IENERUNMIGxhbWVfc2V0X1JlcGxheUdhaW5fZGVjb2RlKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfUmVwbGF5R2Fpbl9kZWNvZGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIERFUFJFQ0FURUQ6IG5vdyBkb2VzIHRoZSBzYW1lIGFzIGxhbWVfc2V0X2RlY29kZV9vbl90aGVfZmx5KCkKKyAgIGRlZmF1bHQgPSAwIChkaXNhYmxlZCkgKi8KK2ludCBDREVDTCBsYW1lX3NldF9maW5kUGVha1NhbXBsZShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2ZpbmRQZWFrU2FtcGxlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworI2VuZGlmCisKKy8qIGNvdW50ZXJzIGZvciBnYXBsZXNzIGVuY29kaW5nICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfbm9nYXBfdG90YWwobGFtZV9nbG9iYWxfZmxhZ3MqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X25vZ2FwX3RvdGFsKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzKik7CisKK2ludCBDREVDTCBsYW1lX3NldF9ub2dhcF9jdXJyZW50aW5kZXgobGFtZV9nbG9iYWxfZmxhZ3MqICwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9ub2dhcF9jdXJyZW50aW5kZXgoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MqKTsKKworCisvKgorICogT1BUSU9OQUw6CisgKiBTZXQgcHJpbnRmIGxpa2UgZXJyb3IvZGVidWcvbWVzc2FnZSByZXBvcnRpbmcgZnVuY3Rpb25zLgorICogVGhlIHNlY29uZCBhcmd1bWVudCBoYXMgdG8gYmUgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gd2hpY2ggbG9va3MgbGlrZQorICogICB2b2lkIG15X2RlYnVnZihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCisgKiAgIHsKKyAqICAgICAgICh2b2lkKSB2ZnByaW50ZihzdGRvdXQsIGZvcm1hdCwgYXApOworICogICB9CisgKiBJZiB5b3UgdXNlIE5VTEwgYXMgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIGluIHRoZSBzZXQgZnVuY3Rpb24sIHRoZQorICogbGFtZSBidWlsZGluIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCAocHJpbnRzIHRvIHN0ZGVycikuCisgKiBUbyBxdWlldCBhbnkgb3V0cHV0IHlvdSBoYXZlIHRvIHJlcGxhY2UgdGhlIGJvZHkgb2YgdGhlIGV4YW1wbGUgZnVuY3Rpb24KKyAqIHdpdGgganVzdCAicmV0dXJuOyIgYW5kIHVzZSBpdCBpbiB0aGUgc2V0IGZ1bmN0aW9uLgorICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfZXJyb3JmKGxhbWVfZ2xvYmFsX2ZsYWdzICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmdW5jKShjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKK2ludCBDREVDTCBsYW1lX3NldF9kZWJ1Z2YobGFtZV9nbG9iYWxfZmxhZ3MgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZ1bmMpKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworaW50IENERUNMIGxhbWVfc2V0X21zZ2YgIChsYW1lX2dsb2JhbF9mbGFncyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuYykoY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisKKworCisvKiBzZXQgb25lIG9mIGJyYXRlIGNvbXByZXNzaW9uIHJhdGlvLiAgZGVmYXVsdCBpcyBjb21wcmVzc2lvbiByYXRpbyBvZiAxMS4gICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfYnJhdGUobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9icmF0ZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKK2ludCBDREVDTCBsYW1lX3NldF9jb21wcmVzc2lvbl9yYXRpbyhsYW1lX2dsb2JhbF9mbGFncyAqLCBmbG9hdCk7CitmbG9hdCBDREVDTCBsYW1lX2dldF9jb21wcmVzc2lvbl9yYXRpbyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworCitpbnQgQ0RFQ0wgbGFtZV9zZXRfcHJlc2V0KCBsYW1lX2dsb2JhbF9mbGFncyogIGdmcCwgaW50ICk7CitpbnQgQ0RFQ0wgbGFtZV9zZXRfYXNtX29wdGltaXphdGlvbnMoIGxhbWVfZ2xvYmFsX2ZsYWdzKiAgZ2ZwLCBpbnQsIGludCApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnJhbWUgcGFyYW1zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtYXJrIGFzIGNvcHlyaWdodC4gIGRlZmF1bHQ9MCAqLworaW50IENERUNMIGxhbWVfc2V0X2NvcHlyaWdodChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2NvcHlyaWdodChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogbWFyayBhcyBvcmlnaW5hbC4gIGRlZmF1bHQ9MSAqLworaW50IENERUNMIGxhbWVfc2V0X29yaWdpbmFsKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfb3JpZ2luYWwoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIGVycm9yX3Byb3RlY3Rpb24uICBVc2UgMiBieXRlcyBmcm9tIGVhY2ggZnJhbWUgZm9yIENSQyBjaGVja3N1bS4gZGVmYXVsdD0wICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfZXJyb3JfcHJvdGVjdGlvbihsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2Vycm9yX3Byb3RlY3Rpb24oY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKyNpZiBERVBSRUNBVEVEX09SX09CU09MRVRFX0NPREVfUkVNT1ZFRAorI2Vsc2UKKy8qIHBhZGRpbmdfdHlwZS4gMD1wYWQgbm8gZnJhbWVzICAxPXBhZCBhbGwgZnJhbWVzIDI9YWRqdXN0IHBhZGRpbmcoZGVmYXVsdCkgKi8KK2ludCBDREVDTCBsYW1lX3NldF9wYWRkaW5nX3R5cGUobGFtZV9nbG9iYWxfZmxhZ3MgKiwgUGFkZGluZ190eXBlKTsKK1BhZGRpbmdfdHlwZSBDREVDTCBsYW1lX2dldF9wYWRkaW5nX3R5cGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisjZW5kaWYKKworLyogTVAzICdwcml2YXRlIGV4dGVuc2lvbicgYml0ICBNZWFuaW5nbGVzcy4gIGRlZmF1bHQ9MCAqLworaW50IENERUNMIGxhbWVfc2V0X2V4dGVuc2lvbihsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2V4dGVuc2lvbihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogZW5mb3JjZSBzdHJpY3QgSVNPIGNvbXBsaWFuY2UuICBkZWZhdWx0PTAgKi8KK2ludCBDREVDTCBsYW1lX3NldF9zdHJpY3RfSVNPKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfc3RyaWN0X0lTTyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHF1YW50aXphdGlvbi9ub2lzZSBzaGFwaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRpc2FibGUgdGhlIGJpdCByZXNlcnZvaXIuIEZvciB0ZXN0aW5nIG9ubHkuIGRlZmF1bHQ9MCAqLworaW50IENERUNMIGxhbWVfc2V0X2Rpc2FibGVfcmVzZXJ2b2lyKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfZGlzYWJsZV9yZXNlcnZvaXIoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIHNlbGVjdCBhIGRpZmZlcmVudCAiYmVzdCBxdWFudGl6YXRpb24iIGZ1bmN0aW9uLiBkZWZhdWx0PTAgICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfcXVhbnRfY29tcChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X3F1YW50X2NvbXAoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CitpbnQgQ0RFQ0wgbGFtZV9zZXRfcXVhbnRfY29tcF9zaG9ydChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X3F1YW50X2NvbXBfc2hvcnQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKK2ludCBDREVDTCBsYW1lX3NldF9leHBlcmltZW50YWxYKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7IC8qIGNvbXBhdGliaWxpdHkqLworaW50IENERUNMIGxhbWVfZ2V0X2V4cGVyaW1lbnRhbFgoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIGFub3RoZXIgZXhwZXJpbWVudGFsIG9wdGlvbi4gIGZvciB0ZXN0aW5nIG9ubHkgKi8KK2ludCBDREVDTCBsYW1lX3NldF9leHBlcmltZW50YWxZKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfZXhwZXJpbWVudGFsWShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogYW5vdGhlciBleHBlcmltZW50YWwgb3B0aW9uLiAgZm9yIHRlc3Rpbmcgb25seSAqLworaW50IENERUNMIGxhbWVfc2V0X2V4cGVyaW1lbnRhbFoobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9leHBlcmltZW50YWxaKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBOYW9raSdzIHBzeWNobyBhY291c3RpYyBtb2RlbC4gIGRlZmF1bHQ9MCAqLworaW50IENERUNMIGxhbWVfc2V0X2V4cF9uc3BzeXR1bmUobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9leHBfbnNwc3l0dW5lKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCit2b2lkIENERUNMIGxhbWVfc2V0X21zZml4KGxhbWVfZ2xvYmFsX2ZsYWdzICosIGRvdWJsZSk7CitmbG9hdCBDREVDTCBsYW1lX2dldF9tc2ZpeChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZCUiBjb250cm9sCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUeXBlcyBvZiBWQlIuICBkZWZhdWx0ID0gdmJyX29mZiA9IENCUiAqLworaW50IENERUNMIGxhbWVfc2V0X1ZCUihsYW1lX2dsb2JhbF9mbGFncyAqLCB2YnJfbW9kZSk7Cit2YnJfbW9kZSBDREVDTCBsYW1lX2dldF9WQlIoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIFZCUiBxdWFsaXR5IGxldmVsLiAgMD1oaWdoZXN0ICA5PWxvd2VzdCAgKi8KK2ludCBDREVDTCBsYW1lX3NldF9WQlJfcShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X1ZCUl9xKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBWQlIgcXVhbGl0eSBsZXZlbC4gIDA9aGlnaGVzdCAgOT1sb3dlc3QsIFJhbmdlIFswLC4uLiwxMFsgICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfVkJSX3F1YWxpdHkobGFtZV9nbG9iYWxfZmxhZ3MgKiwgZmxvYXQpOworZmxvYXQgQ0RFQ0wgbGFtZV9nZXRfVkJSX3F1YWxpdHkoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIElnbm9yZWQgZXhjZXB0IGZvciBWQlI9dmJyX2FiciAoQUJSIG1vZGUpICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCitpbnQgQ0RFQ0wgbGFtZV9zZXRfVkJSX21pbl9iaXRyYXRlX2ticHMobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9WQlJfbWluX2JpdHJhdGVfa2Jwcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworaW50IENERUNMIGxhbWVfc2V0X1ZCUl9tYXhfYml0cmF0ZV9rYnBzKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfVkJSX21heF9iaXRyYXRlX2ticHMoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qCisgIDE9c3RyaWN0bHkgZW5mb3JjZSBWQlJfbWluX2JpdHJhdGUuICBOb3JtYWxseSBpdCB3aWxsIGJlIHZpb2xhdGVkIGZvcgorICBhbmFsb2cgc2lsZW5jZQorKi8KK2ludCBDREVDTCBsYW1lX3NldF9WQlJfaGFyZF9taW4obGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9WQlJfaGFyZF9taW4oY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIGZvciBwcmVzZXQgKi8KKyNpZiBERVBSRUNBVEVEX09SX09CU09MRVRFX0NPREVfUkVNT1ZFRAorI2Vsc2UKK2ludCBDREVDTCBsYW1lX3NldF9wcmVzZXRfZXhwb3B0cyhsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmlsdGVyaW5nIGNvbnRyb2wKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZyZXEgaW4gSHogdG8gYXBwbHkgbG93cGFzcy4gRGVmYXVsdCA9IDAgPSBsYW1lIGNob29zZXMuICAtMSA9IGRpc2FibGVkICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfbG93cGFzc2ZyZXEobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9sb3dwYXNzZnJlcShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKy8qIHdpZHRoIG9mIHRyYW5zaXRpb24gYmFuZCwgaW4gSHouICBEZWZhdWx0ID0gb25lIHBvbHlwaGFzZSBmaWx0ZXIgYmFuZCAqLworaW50IENERUNMIGxhbWVfc2V0X2xvd3Bhc3N3aWR0aChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2xvd3Bhc3N3aWR0aChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogZnJlcSBpbiBIeiB0byBhcHBseSBoaWdocGFzcy4gRGVmYXVsdCA9IDAgPSBsYW1lIGNob29zZXMuICAtMSA9IGRpc2FibGVkICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfaGlnaHBhc3NmcmVxKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfaGlnaHBhc3NmcmVxKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworLyogd2lkdGggb2YgdHJhbnNpdGlvbiBiYW5kLCBpbiBIei4gIERlZmF1bHQgPSBvbmUgcG9seXBoYXNlIGZpbHRlciBiYW5kICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfaGlnaHBhc3N3aWR0aChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2hpZ2hwYXNzd2lkdGgoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwc3ljaG8gYWNvdXN0aWNzIGFuZCBvdGhlciBhcmd1bWVudHMgd2hpY2ggeW91IHNob3VsZCBub3QgY2hhbmdlCisgKiB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG9ubHkgdXNlIEFUSCBmb3IgbWFza2luZyAqLworaW50IENERUNMIGxhbWVfc2V0X0FUSG9ubHkobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9BVEhvbmx5KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBvbmx5IHVzZSBBVEggZm9yIHNob3J0IGJsb2NrcyAqLworaW50IENERUNMIGxhbWVfc2V0X0FUSHNob3J0KGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfQVRIc2hvcnQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIGRpc2FibGUgQVRIICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfbm9BVEgobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9ub0FUSChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogc2VsZWN0IEFUSCBmb3JtdWxhICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfQVRIdHlwZShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X0FUSHR5cGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIGxvd2VyIEFUSCBieSB0aGlzIG1hbnkgZGIgKi8KK2ludCBDREVDTCBsYW1lX3NldF9BVEhsb3dlcihsYW1lX2dsb2JhbF9mbGFncyAqLCBmbG9hdCk7CitmbG9hdCBDREVDTCBsYW1lX2dldF9BVEhsb3dlcihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogc2VsZWN0IEFUSCBhZGFwdGl2ZSBhZGp1c3RtZW50IHR5cGUgKi8KK2ludCBDREVDTCBsYW1lX3NldF9hdGhhYV90eXBlKCBsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2F0aGFhX3R5cGUoIGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBzZWxlY3QgdGhlIGxvdWRuZXNzIGFwcHJveGltYXRpb24gdXNlZCBieSB0aGUgQVRIIGFkYXB0aXZlIGF1dG8tbGV2ZWxpbmcgICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfYXRoYWFfbG91ZGFwcHJveCggbGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9hdGhhYV9sb3VkYXBwcm94KCBjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogYWRqdXN0IChpbiBkQikgdGhlIHBvaW50IGJlbG93IHdoaWNoIGFkYXB0aXZlIEFUSCBsZXZlbCBhZGp1c3RtZW50IG9jY3VycyAqLworaW50IENERUNMIGxhbWVfc2V0X2F0aGFhX3NlbnNpdGl2aXR5KCBsYW1lX2dsb2JhbF9mbGFncyAqLCBmbG9hdCk7CitmbG9hdCBDREVDTCBsYW1lX2dldF9hdGhhYV9zZW5zaXRpdml0eSggY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MqICk7CisKKyNpZiBERVBSRUNBVEVEX09SX09CU09MRVRFX0NPREVfUkVNT1ZFRAorI2Vsc2UKKy8qIE9CU09MRVRFOiBwcmVkaWN0YWJpbGl0eSBsaW1pdCAoSVNPIHRvbmFsaXR5IGZvcm11bGEpICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfY3dsaW1pdChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2N3bGltaXQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisjZW5kaWYKKworLyoKKyAgYWxsb3cgYmxvY2t0eXBlcyB0byBkaWZmZXIgYmV0d2VlbiBjaGFubmVscz8KKyAgZGVmYXVsdDogMCBmb3IganN0ZXJlbywgMSBmb3Igc3RlcmVvCisqLworaW50IENERUNMIGxhbWVfc2V0X2FsbG93X2RpZmZfc2hvcnQobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9hbGxvd19kaWZmX3Nob3J0KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiB1c2UgdGVtcG9yYWwgbWFza2luZyBlZmZlY3QgKGRlZmF1bHQgPSAxKSAqLworaW50IENERUNMIGxhbWVfc2V0X3VzZVRlbXBvcmFsKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CitpbnQgQ0RFQ0wgbGFtZV9nZXRfdXNlVGVtcG9yYWwoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIHVzZSB0ZW1wb3JhbCBtYXNraW5nIGVmZmVjdCAoZGVmYXVsdCA9IDEpICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfaW50ZXJDaFJhdGlvKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGZsb2F0KTsKK2Zsb2F0IENERUNMIGxhbWVfZ2V0X2ludGVyQ2hSYXRpbyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogZGlzYWJsZSBzaG9ydCBibG9ja3MgKi8KK2ludCBDREVDTCBsYW1lX3NldF9ub19zaG9ydF9ibG9ja3MobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9ub19zaG9ydF9ibG9ja3MoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIGZvcmNlIHNob3J0IGJsb2NrcyAqLworaW50IENERUNMIGxhbWVfc2V0X2ZvcmNlX3Nob3J0X2Jsb2NrcyhsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X2ZvcmNlX3Nob3J0X2Jsb2Nrcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogSW5wdXQgUENNIGlzIGVtcGhhc2VkIFBDTSAoZm9yIGluc3RhbmNlIGZyb20gb25lIG9mIHRoZSByYXJlbHkKKyAgIGVtcGhhc2VkIENEcyksIGl0IGlzIFNUUk9OR0xZIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcywgYmVjYXVzZQorICAgcHN5Y2hvIGRvZXMgbm90IHRha2UgaXQgaW50byBhY2NvdW50LCBhbmQgbGFzdCBidXQgbm90IGxlYXN0IG1hbnkgZGVjb2RlcnMKKyAgIGlnbm9yZSB0aGVzZSBiaXRzICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfZW1waGFzaXMobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9lbXBoYXNpcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBpbnRlcm5hbCB2YXJpYWJsZXMsIGNhbm5vdCBiZSBzZXQuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcHJvdmlkZWQgYmVjYXVzZSB0aGV5IG1heSBiZSBvZiB1c2UgdG8gY2FsbGluZyBhcHBsaWNhdGlvbiAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB2ZXJzaW9uICAwPU1QRUctMiAgMT1NUEVHLTEgICgyPU1QRUctMi41KSAgICAgKi8KK2ludCBDREVDTCBsYW1lX2dldF92ZXJzaW9uKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBlbmNvZGVyIGRlbGF5ICAgKi8KK2ludCBDREVDTCBsYW1lX2dldF9lbmNvZGVyX2RlbGF5KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKgorICBwYWRkaW5nIGFwcGVuZGVkIHRvIHRoZSBpbnB1dCB0byBtYWtlIHN1cmUgZGVjb2RlciBjYW4gZnVsbHkgZGVjb2RlCisgIGFsbCBpbnB1dC4gIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgZHVyaW5nIHRoZQorICBjYWxsIHRvIGxhbWVfZW5jb2Rlcl9mbHVzaCgpLiAgQmVmb3JlIGxhbWVfZW5jb2Rlcl9mbHVzaCgpIGhhcworICBiZWVuIGNhbGxlZCwgdGhlIHZhbHVlIG9mIGVuY29kZXJfcGFkZGluZyA9IDAuCisqLworaW50IENERUNMIGxhbWVfZ2V0X2VuY29kZXJfcGFkZGluZyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworLyogc2l6ZSBvZiBNUEVHIGZyYW1lICovCitpbnQgQ0RFQ0wgbGFtZV9nZXRfZnJhbWVzaXplKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBudW1iZXIgb2YgUENNIHNhbXBsZXMgYnVmZmVyZWQsIGJ1dCBub3QgeWV0IGVuY29kZWQgdG8gbXAzIGRhdGEuICovCitpbnQgQ0RFQ0wgbGFtZV9nZXRfbWZfc2FtcGxlc190b19lbmNvZGUoIGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzKiAgZ2ZwICk7CisKKy8qCisgIHNpemUgKGJ5dGVzKSBvZiBtcDMgZGF0YSBidWZmZXJlZCwgYnV0IG5vdCB5ZXQgZW5jb2RlZC4KKyAgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdvdWxkIGJlIG91dHB1dCBieSBhIGNhbGwgdG8KKyAgbGFtZV9lbmNvZGVfZmx1c2hfbm9nYXAuICBOT1RFOiBsYW1lX2VuY29kZV9mbHVzaCgpIHdpbGwgcmV0dXJuCisgIG1vcmUgYnl0ZXMgdGhhbiB0aGlzIGJlY2F1c2UgaXQgd2lsbCBlbmNvZGUgdGhlIHJlYW1pbmluZyBidWZmZXJlZAorICBQQ00gc2FtcGxlcyBiZWZvcmUgZmx1c2hpbmcgdGhlIG1wMyBidWZmZXJzLgorKi8KK2ludCBDREVDTCBsYW1lX2dldF9zaXplX21wM2J1ZmZlciggY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MqICBnZnAgKTsKKworLyogbnVtYmVyIG9mIGZyYW1lcyBlbmNvZGVkIHNvIGZhciAqLworaW50IENERUNMIGxhbWVfZ2V0X2ZyYW1lTnVtKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKgorICBsYW1lJ3MgZXN0aW1hdGUgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgZW5jb2RlZAorICAgb25seSB2YWxpZCBpZiBjYWxsaW5nIHByb2dyYW0gc2V0IG51bV9zYW1wbGVzCisqLworaW50IENERUNMIGxhbWVfZ2V0X3RvdGFsZnJhbWVzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBSYWRpb0dhaW4gdmFsdWUuIE11bHRpcGxpZWQgYnkgMTAgYW5kIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QuICovCitpbnQgQ0RFQ0wgbGFtZV9nZXRfUmFkaW9HYWluKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBBdWRpb3BoaWxlR2FpbiB2YWx1ZS4gTXVsdGlwbGVkIGJ5IDEwIGFuZCByb3VuZGVkIHRvIHRoZSBuZWFyZXN0LiAqLworaW50IENERUNMIGxhbWVfZ2V0X0F1ZGlvcGhpbGVHYWluKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiB0aGUgcGVhayBzYW1wbGUgKi8KK2Zsb2F0IENERUNMIGxhbWVfZ2V0X1BlYWtTYW1wbGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIEdhaW4gY2hhbmdlIHJlcXVpcmVkIGZvciBwcmV2ZW50aW5nIGNsaXBwaW5nLiBUaGUgdmFsdWUgaXMgY29ycmVjdCBvbmx5IGlmCisgICBwZWFrIHNhbXBsZSBzZWFyY2hpbmcgd2FzIGVuYWJsZWQuIElmIG5lZ2F0aXZlIHRoZW4gdGhlIHdhdmVmb3JtCisgICBhbHJlYWR5IGRvZXMgbm90IGNsaXAuIFRoZSB2YWx1ZSBpcyBtdWx0aXBsaWVkIGJ5IDEwIGFuZCByb3VuZGVkIHVwLiAqLworaW50IENERUNMIGxhbWVfZ2V0X25vY2xpcEdhaW5DaGFuZ2UoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIHVzZXItc3BlY2lmaWVkIHNjYWxlIGZhY3RvciByZXF1aXJlZCBmb3IgcHJldmVudGluZyBjbGlwcGluZy4gVmFsdWUgaXMKKyAgIGNvcnJlY3Qgb25seSBpZiBwZWFrIHNhbXBsZSBzZWFyY2hpbmcgd2FzIGVuYWJsZWQgYW5kIG5vIHVzZXItc3BlY2lmaWVkCisgICBzY2FsaW5nIHdhcyBwZXJmb3JtZWQuIElmIG5lZ2F0aXZlIHRoZW4gZWl0aGVyIHRoZSB3YXZlZm9ybSBhbHJlYWR5IGRvZXMKKyAgIG5vdCBjbGlwIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAqLworZmxvYXQgQ0RFQ0wgbGFtZV9nZXRfbm9jbGlwU2NhbGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKworCisKKworCisKKy8qCisgKiBSRVFVSVJFRDoKKyAqIHNldHMgbW9yZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIGRhdGEgcHJvdmlkZWQgYWJvdmUuCisgKiByZXR1cm5zIC0xIGlmIHNvbWV0aGluZyBmYWlsZWQuCisgKi8KK2ludCBDREVDTCBsYW1lX2luaXRfcGFyYW1zKGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisKKy8qCisgKiBPUFRJT05BTDoKKyAqIGdldCB0aGUgdmVyc2lvbiBudW1iZXIsIGluIGEgc3RyaW5nLiBvZiB0aGUgZm9ybToKKyAqICIzLjYzIChiZXRhKSIgb3IganVzdCAiMy42MyIuCisgKi8KK2NvbnN0IGNoYXIqICBDREVDTCBnZXRfbGFtZV92ZXJzaW9uICAgICAgICggdm9pZCApOworY29uc3QgY2hhciogIENERUNMIGdldF9sYW1lX3Nob3J0X3ZlcnNpb24gKCB2b2lkICk7Citjb25zdCBjaGFyKiAgQ0RFQ0wgZ2V0X2xhbWVfdmVyeV9zaG9ydF92ZXJzaW9uICggdm9pZCApOworY29uc3QgY2hhciogIENERUNMIGdldF9wc3lfdmVyc2lvbiAgICAgICAgKCB2b2lkICk7Citjb25zdCBjaGFyKiAgQ0RFQ0wgZ2V0X2xhbWVfdXJsICAgICAgICAgICAoIHZvaWQgKTsKK2NvbnN0IGNoYXIqICBDREVDTCBnZXRfbGFtZV9vc19iaXRuZXNzICAgICggdm9pZCApOworCisvKgorICogT1BUSU9OQUw6CisgKiBnZXQgdGhlIHZlcnNpb24gbnVtYmVycyBpbiBudW1lcmljYWwgZm9ybS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIGdlbmVyaWMgTEFNRSB2ZXJzaW9uICovCisgICAgaW50IG1ham9yOworICAgIGludCBtaW5vcjsKKyAgICBpbnQgYWxwaGE7ICAgICAgICAgICAgICAgLyogMCBpZiBub3QgYW4gYWxwaGEgdmVyc2lvbiAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGJldGE7ICAgICAgICAgICAgICAgIC8qIDAgaWYgbm90IGEgYmV0YSB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLyogdmVyc2lvbiBvZiB0aGUgcHN5IG1vZGVsICovCisgICAgaW50IHBzeV9tYWpvcjsKKyAgICBpbnQgcHN5X21pbm9yOworICAgIGludCBwc3lfYWxwaGE7ICAgICAgICAgICAvKiAwIGlmIG5vdCBhbiBhbHBoYSB2ZXJzaW9uICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgcHN5X2JldGE7ICAgICAgICAgICAgLyogMCBpZiBub3QgYSBiZXRhIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvKiBjb21waWxlIHRpbWUgZmVhdHVyZXMgKi8KKyAgICBjb25zdCBjaGFyICpmZWF0dXJlczsgICAgLyogRG9uJ3QgbWFrZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY29udGVudHMhICovCit9IGxhbWVfdmVyc2lvbl90Owordm9pZCBDREVDTCBnZXRfbGFtZV92ZXJzaW9uX251bWVyaWNhbChsYW1lX3ZlcnNpb25fdCAqKTsKKworCisvKgorICogT1BUSU9OQUw6CisgKiBwcmludCBpbnRlcm5hbCBsYW1lIGNvbmZpZ3VyYXRpb24gdG8gbWVzc2FnZSBoYW5kbGVyCisgKi8KK3ZvaWQgQ0RFQ0wgbGFtZV9wcmludF9jb25maWcoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MqICBnZnApOworCit2b2lkIENERUNMIGxhbWVfcHJpbnRfaW50ZXJuYWxzKCBjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqZ2ZwKTsKKworCisvKgorICogaW5wdXQgcGNtIGRhdGEsIG91dHB1dCAobWF5YmUpIG1wMyBmcmFtZXMuCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBhbGwgYnVmZmVyaW5nLCByZXNhbXBsaW5nIGFuZCBmaWx0ZXJpbmcgZm9yIHlvdS4KKyAqCisgKiByZXR1cm4gY29kZSAgICAgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBpbiBtcDNidWYuIENhbiBiZSAwCisgKiAgICAgICAgICAgICAgICAgLTE6ICBtcDNidWYgd2FzIHRvbyBzbWFsbAorICogICAgICAgICAgICAgICAgIC0yOiAgbWFsbG9jKCkgcHJvYmxlbQorICogICAgICAgICAgICAgICAgIC0zOiAgbGFtZV9pbml0X3BhcmFtcygpIG5vdCBjYWxsZWQKKyAqICAgICAgICAgICAgICAgICAtNDogIHBzeWNobyBhY291c3RpYyBwcm9ibGVtcworICoKKyAqIFRoZSByZXF1aXJlZCBtcDNidWZfc2l6ZSBjYW4gYmUgY29tcHV0ZWQgZnJvbSBudW1fc2FtcGxlcywKKyAqIHNhbXBsZXJhdGUgYW5kIGVuY29kaW5nIHJhdGUsIGJ1dCBoZXJlIGlzIGEgd29yc3QgY2FzZSBlc3RpbWF0ZToKKyAqCisgKiBtcDNidWZfc2l6ZSBpbiBieXRlcyA9IDEuMjUqbnVtX3NhbXBsZXMgKyA3MjAwCisgKgorICogSSB0aGluayBhIHRpZ2h0ZXIgYm91bmQgY291bGQgYmU6ICAobXQsIE1hcmNoIDIwMDApCisgKiBNUEVHMToKKyAqICAgIG51bV9zYW1wbGVzKihiaXRyYXRlLzgpL3NhbXBsZXJhdGUgKyA0KjExNTIqKGJpdHJhdGUvOCkvc2FtcGxlcmF0ZSArIDUxMgorICogTVBFRzI6CisgKiAgICBudW1fc2FtcGxlcyooYml0cmF0ZS84KS9zYW1wbGVyYXRlICsgNCo1NzYqKGJpdHJhdGUvOCkvc2FtcGxlcmF0ZSArIDI1NgorICoKKyAqIGJ1dCB0ZXN0IGZpcnN0IGlmIHlvdSB1c2UgdGhhdCEKKyAqCisgKiBzZXQgbXAzYnVmX3NpemUgPSAwIGFuZCBMQU1FIHdpbGwgbm90IGNoZWNrIGlmIG1wM2J1Zl9zaXplIGlzCisgKiBsYXJnZSBlbm91Z2guCisgKgorICogTk9URToKKyAqIGlmIGdmcC0+bnVtX2NoYW5uZWxzPTIsIGJ1dCBnZnAtPm1vZGUgPSAzIChtb25vKSwgdGhlIEwgJiBSIGNoYW5uZWxzCisgKiB3aWxsIGJlIGF2ZXJhZ2VkIGludG8gdGhlIEwgY2hhbm5lbCBiZWZvcmUgZW5jb2Rpbmcgb25seSB0aGUgTCBjaGFubmVsCisgKiBUaGlzIHdpbGwgb3ZlcndyaXRlIHRoZSBkYXRhIGluIGJ1ZmZlcl9sW10gYW5kIGJ1ZmZlcl9yW10uCisgKgorKi8KK2ludCBDREVDTCBsYW1lX2VuY29kZV9idWZmZXIgKAorICAgICAgICBsYW1lX2dsb2JhbF9mbGFncyogIGdmcCwgICAgICAgICAgIC8qIGdsb2JhbCBjb250ZXh0IGhhbmRsZSAgICAgICAgICovCisgICAgICAgIGNvbnN0IHNob3J0IGludCAgICAgYnVmZmVyX2wgW10sICAgLyogUENNIGRhdGEgZm9yIGxlZnQgY2hhbm5lbCAgICAgKi8KKyAgICAgICAgY29uc3Qgc2hvcnQgaW50ICAgICBidWZmZXJfciBbXSwgICAvKiBQQ00gZGF0YSBmb3IgcmlnaHQgY2hhbm5lbCAgICAqLworICAgICAgICBjb25zdCBpbnQgICAgICAgICAgIG5zYW1wbGVzLCAgICAgIC8qIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIqICAgICAgbXAzYnVmLCAgICAgICAgLyogcG9pbnRlciB0byBlbmNvZGVkIE1QMyBzdHJlYW0gKi8KKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICBtcDNidWZfc2l6ZSApOyAvKiBudW1iZXIgb2YgdmFsaWQgb2N0ZXRzIGluIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKgorICogYXMgYWJvdmUsIGJ1dCBpbnB1dCBoYXMgTCAmIFIgY2hhbm5lbCBkYXRhIGludGVybGVhdmVkLgorICogTk9URToKKyAqIG51bV9zYW1wbGVzID0gbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIEwgKG9yIFIpCisgKiBjaGFubmVsLCBub3QgdGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGluIHBjbVtdCisgKi8KK2ludCBDREVDTCBsYW1lX2VuY29kZV9idWZmZXJfaW50ZXJsZWF2ZWQoCisgICAgICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKiAgZ2ZwLCAgICAgICAgICAgLyogZ2xvYmFsIGNvbnRleHQgaGFuZGxlaSAgICAgICAgKi8KKyAgICAgICAgc2hvcnQgaW50ICAgICAgICAgICBwY21bXSwgICAgICAgICAvKiBQQ00gZGF0YSBmb3IgbGVmdCBhbmQgcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBpbnRlcmxlYXZlZCAgICAgICAgICAqLworICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9zYW1wbGVzLCAgIC8qIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ub3RfIG51bWJlciBvZiBzYW1wbGVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtW10gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciogICAgICBtcDNidWYsICAgICAgICAvKiBwb2ludGVyIHRvIGVuY29kZWQgTVAzIHN0cmVhbSAqLworICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1wM2J1Zl9zaXplICk7IC8qIG51bWJlciBvZiB2YWxpZCBvY3RldHMgaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogYXMgbGFtZV9lbmNvZGVfYnVmZmVyLCBidXQgZm9yICdmbG9hdCdzLgorICogISEgTk9URTogISEgZGF0YSBtdXN0IHN0aWxsIGJlIHNjYWxlZCB0byBiZSBpbiB0aGUgc2FtZSByYW5nZSBhcworICogc2hvcnQgaW50LCArLy0gMzI3NjgKKyAqLworaW50IENERUNMIGxhbWVfZW5jb2RlX2J1ZmZlcl9mbG9hdCgKKyAgICAgICAgbGFtZV9nbG9iYWxfZmxhZ3MqICBnZnAsICAgICAgICAgICAvKiBnbG9iYWwgY29udGV4dCBoYW5kbGUgICAgICAgICAqLworICAgICAgICBjb25zdCBmbG9hdCAgICAgYnVmZmVyX2wgW10sICAgICAgIC8qIFBDTSBkYXRhIGZvciBsZWZ0IGNoYW5uZWwgICAgICovCisgICAgICAgIGNvbnN0IGZsb2F0ICAgICBidWZmZXJfciBbXSwgICAgICAgLyogUENNIGRhdGEgZm9yIHJpZ2h0IGNoYW5uZWwgICAgKi8KKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICBuc2FtcGxlcywgICAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgIG1wM2J1ZiwgICAgICAgIC8qIHBvaW50ZXIgdG8gZW5jb2RlZCBNUDMgc3RyZWFtICovCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgbXAzYnVmX3NpemUgKTsgLyogbnVtYmVyIG9mIHZhbGlkIG9jdGV0cyBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBhcyBsYW1lX2VuY29kZV9idWZmZXIsIGJ1dCBmb3IgbG9uZydzCisgKiAhISBOT1RFOiAhISBkYXRhIG11c3Qgc3RpbGwgYmUgc2NhbGVkIHRvIGJlIGluIHRoZSBzYW1lIHJhbmdlIGFzCisgKiBzaG9ydCBpbnQsICsvLSAzMjc2OAorICoKKyAqIFRoaXMgc2NhbGluZyB3YXMgYSBtaXN0YWtlIChkb2Vzbid0IGFsbG93IG9uZSB0byBleHBsb2l0IGZ1bGwKKyAqIHByZWNpc2lvbiBvZiB0eXBlICdsb25nJy4gIFVzZSBsYW1lX2VuY29kZV9idWZmZXJfbG9uZzIoKSBpbnN0ZWFkLgorICoKKyAqLworaW50IENERUNMIGxhbWVfZW5jb2RlX2J1ZmZlcl9sb25nKAorICAgICAgICBsYW1lX2dsb2JhbF9mbGFncyogIGdmcCwgICAgICAgICAgIC8qIGdsb2JhbCBjb250ZXh0IGhhbmRsZSAgICAgICAgICovCisgICAgICAgIGNvbnN0IGxvbmcgICAgIGJ1ZmZlcl9sIFtdLCAgICAgICAvKiBQQ00gZGF0YSBmb3IgbGVmdCBjaGFubmVsICAgICAqLworICAgICAgICBjb25zdCBsb25nICAgICBidWZmZXJfciBbXSwgICAgICAgLyogUENNIGRhdGEgZm9yIHJpZ2h0IGNoYW5uZWwgICAgKi8KKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICBuc2FtcGxlcywgICAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgIG1wM2J1ZiwgICAgICAgIC8qIHBvaW50ZXIgdG8gZW5jb2RlZCBNUDMgc3RyZWFtICovCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgbXAzYnVmX3NpemUgKTsgLyogbnVtYmVyIG9mIHZhbGlkIG9jdGV0cyBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogU2FtZSBhcyBsYW1lX2VuY29kZV9idWZmZXJfbG9uZygpLCBidXQgd2l0aCBjb3JyZWN0IHNjYWxpbmcuCisgKiAhISBOT1RFOiAhISBkYXRhIG11c3Qgc3RpbGwgYmUgc2NhbGVkIHRvIGJlIGluIHRoZSBzYW1lIHJhbmdlIGFzCisgKiB0eXBlICdsb25nJy4gICBEYXRhIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2U6ICArLy0gMl4oOCpzaXplKGxvbmcpLTEpCisgKgorICovCitpbnQgQ0RFQ0wgbGFtZV9lbmNvZGVfYnVmZmVyX2xvbmcyKAorICAgICAgICBsYW1lX2dsb2JhbF9mbGFncyogIGdmcCwgICAgICAgICAgIC8qIGdsb2JhbCBjb250ZXh0IGhhbmRsZSAgICAgICAgICovCisgICAgICAgIGNvbnN0IGxvbmcgICAgIGJ1ZmZlcl9sIFtdLCAgICAgICAvKiBQQ00gZGF0YSBmb3IgbGVmdCBjaGFubmVsICAgICAqLworICAgICAgICBjb25zdCBsb25nICAgICBidWZmZXJfciBbXSwgICAgICAgLyogUENNIGRhdGEgZm9yIHJpZ2h0IGNoYW5uZWwgICAgKi8KKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICBuc2FtcGxlcywgICAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgIG1wM2J1ZiwgICAgICAgIC8qIHBvaW50ZXIgdG8gZW5jb2RlZCBNUDMgc3RyZWFtICovCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgbXAzYnVmX3NpemUgKTsgLyogbnVtYmVyIG9mIHZhbGlkIG9jdGV0cyBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogYXMgbGFtZV9lbmNvZGVfYnVmZmVyLCBidXQgZm9yIGludCdzCisgKiAhISBOT1RFOiAhISBpbnB1dCBzaG91bGQgYmUgc2NhbGVkIHRvIHRoZSBtYXhpbXVtIHJhbmdlIG9mICdpbnQnCisgKiBJZiBpbnQgaXMgNCBieXRlcywgdGhlbiB0aGUgdmFsdWVzIHNob3VsZCByYW5nZSBmcm9tCisgKiArLy0gMjE0NzQ4MzY0OC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBub3QgKGFuZCBjYW5ub3QsIHdpdGhvdXQgbG9vc2luZyBwcmVjaXNpb24pIHVzZQorICogdGhlIHNhbWUgc2NhbGluZyBhcyB0aGUgcmVzdCBvZiB0aGUgbGFtZV9lbmNvZGVfYnVmZmVyKCkgcm91dGluZXMuCisgKgorICovCitpbnQgQ0RFQ0wgbGFtZV9lbmNvZGVfYnVmZmVyX2ludCgKKyAgICAgICAgbGFtZV9nbG9iYWxfZmxhZ3MqICBnZnAsICAgICAgICAgICAvKiBnbG9iYWwgY29udGV4dCBoYW5kbGUgICAgICAgICAqLworICAgICAgICBjb25zdCBpbnQgICAgICBidWZmZXJfbCBbXSwgICAgICAgLyogUENNIGRhdGEgZm9yIGxlZnQgY2hhbm5lbCAgICAgKi8KKyAgICAgICAgY29uc3QgaW50ICAgICAgYnVmZmVyX3IgW10sICAgICAgIC8qIFBDTSBkYXRhIGZvciByaWdodCBjaGFubmVsICAgICovCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgbnNhbXBsZXMsICAgICAgLyogbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciogICAgICBtcDNidWYsICAgICAgICAvKiBwb2ludGVyIHRvIGVuY29kZWQgTVAzIHN0cmVhbSAqLworICAgICAgICBjb25zdCBpbnQgICAgICAgICAgIG1wM2J1Zl9zaXplICk7IC8qIG51bWJlciBvZiB2YWxpZCBvY3RldHMgaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworCisKKworLyoKKyAqIFJFUVVJUkVEOgorICogbGFtZV9lbmNvZGVfZmx1c2ggd2lsbCBmbHVzaCB0aGUgaW50ZW5hbCBQQ00gYnVmZmVycywgcGFkZGluZyB3aXRoCisgKiAwJ3MgdG8gbWFrZSBzdXJlIHRoZSBmaW5hbCBmcmFtZSBpcyBjb21wbGV0ZSwgYW5kIHRoZW4gZmx1c2gKKyAqIHRoZSBpbnRlcm5hbCBNUDMgYnVmZmVycywgYW5kIHRodXMgbWF5IHJldHVybiBhCisgKiBmaW5hbCBmZXcgbXAzIGZyYW1lcy4gICdtcDNidWYnIHNob3VsZCBiZSBhdCBsZWFzdCA3MjAwIGJ5dGVzIGxvbmcKKyAqIHRvIGhvbGQgYWxsIHBvc3NpYmxlIGVtaXR0ZWQgZGF0YS4KKyAqCisgKiB3aWxsIGFsc28gd3JpdGUgaWQzdjEgdGFncyAoaWYgYW55KSBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiByZXR1cm4gY29kZSA9IG51bWJlciBvZiBieXRlcyBvdXRwdXQgdG8gbXAzYnVmLiBDYW4gYmUgMAorICovCitpbnQgQ0RFQ0wgbGFtZV9lbmNvZGVfZmx1c2goCisgICAgICAgIGxhbWVfZ2xvYmFsX2ZsYWdzICogIGdmcCwgICAgLyogZ2xvYmFsIGNvbnRleHQgaGFuZGxlICAgICAgICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgICBtcDNidWYsIC8qIHBvaW50ZXIgdG8gZW5jb2RlZCBNUDMgc3RyZWFtICAgICAgICAgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2l6ZSk7ICAvKiBudW1iZXIgb2YgdmFsaWQgb2N0ZXRzIGluIHRoaXMgc3RyZWFtICovCisKKy8qCisgKiBPUFRJT05BTDoKKyAqIGxhbWVfZW5jb2RlX2ZsdXNoX25vZ2FwIHdpbGwgZmx1c2ggdGhlIGludGVybmFsIG1wMyBidWZmZXJzIGFuZCBwYWQKKyAqIHRoZSBsYXN0IGZyYW1lIHdpdGggYW5jaWxsYXJ5IGRhdGEgc28gaXQgaXMgYSBjb21wbGV0ZSBtcDMgZnJhbWUuCisgKgorICogJ21wM2J1Zicgc2hvdWxkIGJlIGF0IGxlYXN0IDcyMDAgYnl0ZXMgbG9uZworICogdG8gaG9sZCBhbGwgcG9zc2libGUgZW1pdHRlZCBkYXRhLgorICoKKyAqIEFmdGVyIGEgY2FsbCB0byB0aGlzIHJvdXRpbmUsIHRoZSBvdXRwdXRlZCBtcDMgZGF0YSBpcyBjb21wbGV0ZSwgYnV0CisgKiB5b3UgbWF5IGNvbnRpbnVlIHRvIGVuY29kZSBuZXcgUENNIHNhbXBsZXMgYW5kIHdyaXRlIGZ1dHVyZSBtcDMgZGF0YQorICogdG8gYSBkaWZmZXJlbnQgZmlsZS4gIFRoZSB0d28gbXAzIGZpbGVzIHdpbGwgcGxheSBiYWNrIHdpdGggbm8gZ2FwcworICogaWYgdGhleSBhcmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIE5PVCB3cml0ZSBpZDN2MSB0YWdzIGludG8gdGhlIGJpdHN0cmVhbS4KKyAqCisgKiByZXR1cm4gY29kZSA9IG51bWJlciBvZiBieXRlcyBvdXRwdXQgdG8gbXAzYnVmLiBDYW4gYmUgMAorICovCitpbnQgQ0RFQ0wgbGFtZV9lbmNvZGVfZmx1c2hfbm9nYXAoCisgICAgICAgIGxhbWVfZ2xvYmFsX2ZsYWdzICogIGdmcCwgICAgLyogZ2xvYmFsIGNvbnRleHQgaGFuZGxlICAgICAgICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgICBtcDNidWYsIC8qIHBvaW50ZXIgdG8gZW5jb2RlZCBNUDMgc3RyZWFtICAgICAgICAgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2l6ZSk7ICAvKiBudW1iZXIgb2YgdmFsaWQgb2N0ZXRzIGluIHRoaXMgc3RyZWFtICovCisKKy8qCisgKiBPUFRJT05BTDoKKyAqIE5vcm1hbGx5LCB0aGlzIGlzIGNhbGxlZCBieSBsYW1lX2luaXRfcGFyYW1zKCkuICBJdCB3cml0ZXMgaWQzdjIgYW5kCisgKiBYaW5nIGhlYWRlcnMgaW50byB0aGUgZnJvbnQgb2YgdGhlIGJpdHN0cmVhbSwgYW5kIHNldHMgZnJhbWUgY291bnRlcnMKKyAqIGFuZCBiaXRyYXRlIGhpc3RvZ3JhbSBkYXRhIHRvIDAuICBZb3UgY2FuIGFsc28gY2FsbCB0aGlzIGFmdGVyCisgKiBsYW1lX2VuY29kZV9mbHVzaF9ub2dhcCgpLgorICovCitpbnQgQ0RFQ0wgbGFtZV9pbml0X2JpdHN0cmVhbSgKKyAgICAgICAgbGFtZV9nbG9iYWxfZmxhZ3MgKiAgZ2ZwKTsgICAgLyogZ2xvYmFsIGNvbnRleHQgaGFuZGxlICAgICAgICAgICAgICAgICAqLworCisKKworLyoKKyAqIE9QVElPTkFMOiAgICBzb21lIHNpbXBsZSBzdGF0aXN0aWNzCisgKiBhIGJpdHJhdGUgaGlzdG9ncmFtIHRvIHZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHVzZWQgZnJhbWUgc2l6ZXMKKyAqIGEgc3RlcmVvIG1vZGUgaGlzdG9ncmFtIHRvIHZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHVzZWQgc3RlcmVvCisgKiAgIG1vZGVzLCB1c2VmdWwgaW4gam9pbnQtc3RlcmVvIG1vZGUgb25seQorICogICAwOiBMUiAgICBsZWZ0LXJpZ2h0IGVuY29kZWQKKyAqICAgMTogTFItSSAgbGVmdC1yaWdodCBhbmQgaW50ZW5zaXR5IGVuY29kZWQgKGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkKQorICogICAyOiBNUyAgICBtaWQtc2lkZSBlbmNvZGVkCisgKiAgIDM6IE1TLUkgIG1pZC1zaWRlIGFuZCBpbnRlbnNpdHkgZW5jb2RlZCAoY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQpCisgKgorICogYXR0ZW50aW9uOiBkb24ndCBjYWxsIHRoZW0gYWZ0ZXIgbGFtZV9lbmNvZGVfZmluaXNoCisgKiBzdWdnZXN0ZWQ6IGxhbWVfZW5jb2RlX2ZsdXNoIC0+IGxhbWVfKl9oaXN0IC0+IGxhbWVfY2xvc2UKKyAqLworCit2b2lkIENERUNMIGxhbWVfYml0cmF0ZV9oaXN0KAorICAgICAgICBjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwKKyAgICAgICAgaW50IGJpdHJhdGVfY291bnRbMTRdICk7Cit2b2lkIENERUNMIGxhbWVfYml0cmF0ZV9rYnBzKAorICAgICAgICBjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwKKyAgICAgICAgaW50IGJpdHJhdGVfa2JwcyBbMTRdICk7Cit2b2lkIENERUNMIGxhbWVfc3RlcmVvX21vZGVfaGlzdCgKKyAgICAgICAgY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsCisgICAgICAgIGludCBzdGVyZW9fbW9kZV9jb3VudFs0XSApOworCit2b2lkIENERUNMIGxhbWVfYml0cmF0ZV9zdGVyZW9fbW9kZV9oaXN0ICgKKyAgICAgICAgY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsCisgICAgICAgIGludCBiaXRyYXRlX3N0bW9kZV9jb3VudFsxNF1bNF0gKTsKKwordm9pZCBDREVDTCBsYW1lX2Jsb2NrX3R5cGVfaGlzdCAoCisgICAgICAgIGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLAorICAgICAgICBpbnQgYnR5cGVfY291bnRbNl0gKTsKKwordm9pZCBDREVDTCBsYW1lX2JpdHJhdGVfYmxvY2tfdHlwZV9oaXN0ICgKKyAgICAgICAgY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsCisgICAgICAgIGludCBiaXRyYXRlX2J0eXBlX2NvdW50WzE0XVs2XSApOworCisjaWYgKERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVEICYmIDApCisjZWxzZQorLyoKKyAqIE9QVElPTkFMOgorICogbGFtZV9tcDNfdGFnc19maWQgd2lsbCByZXdyaXRlIGEgWGluZyBWQlIgdGFnIHRvIHRoZSBtcDMgZmlsZSB3aXRoIGZpbGUKKyAqIHBvaW50ZXIgZmlkLiAgVGhlc2UgY2FsbHMgcGVyZm9ybSBmb3J3YXJkIGFuZCBiYWNrd2FyZHMgc2Vla3MsIHNvIG1ha2UKKyAqIHN1cmUgZmlkIGlzIGEgcmVhbCBmaWxlLiAgTWFrZSBzdXJlIGxhbWVfZW5jb2RlX2ZsdXNoIGhhcyBiZWVuIGNhbGxlZCwKKyAqIGFuZCBhbGwgbXAzIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgZmlsZSBiZWZvcmUgY2FsbGluZyB0aGlzCisgKiBmdW5jdGlvbi4KKyAqIE5PVEU6CisgKiBpZiBWQlIgIHRhZ3MgYXJlIHR1cm5lZCBvZmYgYnkgdGhlIHVzZXIsIG9yIHR1cm5lZCBvZmYgYnkgTEFNRSBiZWNhdXNlCisgKiB0aGUgb3V0cHV0IGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSwgdGhpcyBjYWxsIGRvZXMgbm90aGluZworICogTk9URToKKyAqIExBTUUgd2FudHMgdG8gcmVhZCBmcm9tIHRoZSBmaWxlIHRvIHNraXAgYW4gb3B0aW9uYWwgSUQzdjIgdGFnLCBzbworICogbWFrZSBzdXJlIHlvdSBvcGVuZWQgdGhlIGZpbGUgZm9yIHdyaXRpbmcgYW5kIHJlYWRpbmcuCisgKiBOT1RFOgorICogWW91IGNhbiBjYWxsIGxhbWVfZ2V0X2xhbWV0YWdfZnJhbWUgaW5zdGVhZCwgaWYgeW91IHdhbnQgdG8gaW5zZXJ0CisgKiB0aGUgbGFtZXRhZyB5b3Vyc2VsZi4KKyovCit2b2lkIENERUNMIGxhbWVfbXAzX3RhZ3NfZmlkKGxhbWVfZ2xvYmFsX2ZsYWdzICosIEZJTEUqIGZpZCk7CisjZW5kaWYKKworLyoKKyAqIE9QVElPTkFMOgorICogbGFtZV9nZXRfbGFtZXRhZ19mcmFtZSBjb3BpZXMgdGhlIGZpbmFsIExBTUUtdGFnIGludG8gJ2J1ZmZlcicuCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIGJ1ZmZlciwgb3IKKyAqIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZSwgaWYgdGhlIHByb3ZpZGVkIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgKiBGdW5jdGlvbiBmYWlsZWQsIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgbGFyZ2VyIHRoYW4gJ3NpemUnIQorICogTWFrZSBzdXJlIGxhbWVfZW5jb2RlIGZsdXNoIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogTk9URToKKyAqIGlmIFZCUiAgdGFncyBhcmUgdHVybmVkIG9mZiBieSB0aGUgdXNlciwgb3IgdHVybmVkIG9mZiBieSBMQU1FLAorICogdGhpcyBjYWxsIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyAwLgorICogTk9URToKKyAqIExBTUUgaW5zZXJ0ZWQgYW4gZW1wdHkgZnJhbWUgaW4gdGhlIGJlZ2lubmluZyBvZiBtcDMgYXVkaW8gZGF0YSwKKyAqIHdoaWNoIHlvdSBoYXZlIHRvIHJlcGxhY2UgYnkgdGhlIGZpbmFsIExBTUUtdGFnIGZyYW1lIGFmdGVyIGVuY29kaW5nLgorICogSW4gY2FzZSB0aGVyZSBpcyBubyBJRDN2MiB0YWcsIHVzdWFsbHkgdGhpcyBmcmFtZSB3aWxsIGJlIHRoZSB2ZXJ5IGZpcnN0CisgKiBkYXRhIGluIHlvdXIgbXAzIGZpbGUuIElmIHlvdSBwdXQgc29tZSBvdGhlciBsZWFkaW5nIGRhdGEgaW50byB5b3VyCisgKiBmaWxlLCB5b3UnbGwgaGF2ZSB0byBkbyBzb21lIGJvb2trZWVwaW5nIGFib3V0IHdoZXJlIHRvIHdyaXRlIHRoaXMgYnVmZmVyLgorICovCitzaXplX3QgQ0RFQ0wgbGFtZV9nZXRfbGFtZXRhZ19mcmFtZSgKKyAgICAgICAgY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiwgdW5zaWduZWQgY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKy8qCisgKiBSRVFVSVJFRDoKKyAqIGZpbmFsIGNhbGwgdG8gZnJlZSBhbGwgcmVtYWluaW5nIGJ1ZmZlcnMKKyAqLworaW50ICBDREVDTCBsYW1lX2Nsb3NlIChsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECisjZWxzZQorLyoKKyAqIE9CU09MRVRFOgorICogbGFtZV9lbmNvZGVfZmluaXNoIGNvbWJpbmVzIGxhbWVfZW5jb2RlX2ZsdXNoKCkgYW5kIGxhbWVfY2xvc2UoKSBpbgorICogb25lIGNhbGwuICBIb3dldmVyLCBvbmNlIHRoaXMgY2FsbCBpcyBtYWRlLCB0aGUgc3RhdGlzdGljcyByb3V0aW5lcworICogd2lsbCBubyBsb25nZXIgd29yayBiZWNhdXNlIHRoZSBkYXRhIHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQsIGFuZAorICogbGFtZV9tcDNfdGFnc19maWQoKSBjYW5ub3QgYmUgY2FsbGVkIHRvIGFkZCBkYXRhIHRvIHRoZSBWQlIgaGVhZGVyCisgKi8KK2ludCBDREVDTCBsYW1lX2VuY29kZV9maW5pc2goCisgICAgICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKiAgZ2ZwLAorICAgICAgICB1bnNpZ25lZCBjaGFyKiAgICAgIG1wM2J1ZiwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICBzaXplICk7CisjZW5kaWYKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBkZWNvZGluZworICoKKyAqIGEgc2ltcGxlIGludGVyZmFjZSB0byBtcGdsaWIsIHBhcnQgb2YgbXBnMTIzLCBpcyBhbHNvIGluY2x1ZGVkIGlmCisgKiBsaWJtcDNsYW1lIGlzIGNvbXBpbGVkIHdpdGggSEFWRV9NUEdMSUIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgaGlwX2dsb2JhbF9zdHJ1Y3Q7Cit0eXBlZGVmIHN0cnVjdCBoaXBfZ2xvYmFsX3N0cnVjdCBoaXBfZ2xvYmFsX2ZsYWdzOwordHlwZWRlZiBoaXBfZ2xvYmFsX2ZsYWdzICpoaXBfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBoZWFkZXJfcGFyc2VkOyAgIC8qIDEgaWYgaGVhZGVyIHdhcyBwYXJzZWQgYW5kIGZvbGxvd2luZyBkYXRhIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBzdGVyZW87ICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IHNhbXBsZXJhdGU7ICAgICAgLyogc2FtcGxlIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgYml0cmF0ZTsgICAgICAgICAvKiBiaXRyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBtb2RlOyAgICAgICAgICAgIC8qIG1wMyBmcmFtZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG1vZGVfZXh0OyAgICAgICAgLyogbXAzIGZyYW1lIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgZnJhbWVzaXplOyAgICAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgbXAzIGZyYW1lICAgICAgICAgICAgICAgICovCisKKyAgLyogdGhpcyBkYXRhIGlzIG9ubHkgY29tcHV0ZWQgaWYgbXBnbGliIGRldGVjdHMgYSBYaW5nIFZCUiBoZWFkZXIgKi8KKyAgdW5zaWduZWQgbG9uZyBuc2FtcDsgLyogbnVtYmVyIG9mIHNhbXBsZXMgaW4gbXAzIGZpbGUuICAgICAgICAgICAgICAgICAqLworICBpbnQgdG90YWxmcmFtZXM7ICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGluIG1wMyBmaWxlICAgICAgICAgICAgICovCisKKyAgLyogdGhpcyBkYXRhIGlzIG5vdCBjdXJyZW50bHkgY29tcHV0ZWQgYnkgdGhlIG1wZ2xpYiByb3V0aW5lcyAqLworICBpbnQgZnJhbWVudW07ICAgICAgICAvKiBmcmFtZXMgZGVjb2RlZCBjb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IG1wM2RhdGFfc3RydWN0OworCisvKiByZXF1aXJlZCBjYWxsIHRvIGluaXRpYWxpemUgZGVjb2RlciAqLworaGlwX3QgQ0RFQ0wgaGlwX2RlY29kZV9pbml0KHZvaWQpOworCisvKiBjbGVhbnVwIGNhbGwgdG8gZXhpdCBkZWNvZGVyICAqLworaW50IENERUNMIGhpcF9kZWNvZGVfZXhpdChoaXBfdCBnZnApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbnB1dCAxIG1wMyBmcmFtZSwgb3V0cHV0IChtYXliZSkgcGNtIGRhdGEuCisgKgorICogIG5vdXQgPSBoaXBfZGVjb2RlKGhpcCwgbXAzYnVmLGxlbixwY21fbCxwY21fcik7CisgKgorICogaW5wdXQ6CisgKiAgICBsZW4gICAgICAgICAgOiAgbnVtYmVyIG9mIGJ5dGVzIG9mIG1wMyBkYXRhIGluIG1wM2J1ZgorICogICAgbXAzYnVmW2xlbl0gIDogIG1wMyBkYXRhIHRvIGJlIGRlY29kZWQKKyAqCisgKiBvdXRwdXQ6CisgKiAgICBub3V0OiAgLTEgICAgOiBkZWNvZGluZyBlcnJvcgorICogICAgICAgICAgICAwICAgIDogbmVlZCBtb3JlIGRhdGEgYmVmb3JlIHdlIGNhbiBjb21wbGV0ZSB0aGUgZGVjb2RlCisgKiAgICAgICAgICAgPjAgICAgOiByZXR1cm5lZCAnbm91dCcgc2FtcGxlcyB3b3J0aCBvZiBkYXRhIGluIHBjbV9sLHBjbV9yCisgKiAgICBwY21fbFtub3V0XSAgOiBsZWZ0IGNoYW5uZWwgZGF0YQorICogICAgcGNtX3Jbbm91dF0gIDogcmlnaHQgY2hhbm5lbCBkYXRhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBDREVDTCBoaXBfZGVjb2RlKCBoaXBfdCAgICAgICAgICAgZ2ZwCisgICAgICAgICAgICAgICAgICAgICwgdW5zaWduZWQgY2hhciAqIG1wM2J1ZgorICAgICAgICAgICAgICAgICAgICAsIHNpemVfdCAgICAgICAgICBsZW4KKyAgICAgICAgICAgICAgICAgICAgLCBzaG9ydCAgICAgICAgICAgcGNtX2xbXQorICAgICAgICAgICAgICAgICAgICAsIHNob3J0ICAgICAgICAgICBwY21fcltdCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qIHNhbWUgYXMgaGlwX2RlY29kZSwgYW5kIGFsc28gcmV0dXJucyBtcDMgaGVhZGVyIGRhdGEgKi8KK2ludCBDREVDTCBoaXBfZGVjb2RlX2hlYWRlcnMoIGhpcF90ICAgICAgICAgICBnZnAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHVuc2lnbmVkIGNoYXIqICBtcDNidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHNpemVfdCAgICAgICAgICBsZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHNob3J0ICAgICAgICAgICBwY21fbFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzaG9ydCAgICAgICAgICAgcGNtX3JbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbXAzZGF0YV9zdHJ1Y3QqIG1wM2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKiBzYW1lIGFzIGhpcF9kZWNvZGUsIGJ1dCByZXR1cm5zIGF0IG1vc3Qgb25lIGZyYW1lICovCitpbnQgQ0RFQ0wgaGlwX2RlY29kZTEoIGhpcF90ICAgICAgICAgIGdmcAorICAgICAgICAgICAgICAgICAgICAgLCB1bnNpZ25lZCBjaGFyKiBtcDNidWYKKyAgICAgICAgICAgICAgICAgICAgICwgc2l6ZV90ICAgICAgICAgbGVuCisgICAgICAgICAgICAgICAgICAgICAsIHNob3J0ICAgICAgICAgIHBjbV9sW10KKyAgICAgICAgICAgICAgICAgICAgICwgc2hvcnQgICAgICAgICAgcGNtX3JbXQorICAgICAgICAgICAgICAgICAgICAgKTsKKworLyogc2FtZSBhcyBoaXBfZGVjb2RlMSwgYnV0IHJldHVybnMgYXQgbW9zdCBvbmUgZnJhbWUgYW5kIG1wMyBoZWFkZXIgZGF0YSAqLworaW50IENERUNMIGhpcF9kZWNvZGUxX2hlYWRlcnMoIGhpcF90ICAgICAgICAgICBnZnAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB1bnNpZ25lZCBjaGFyKiAgbXAzYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc2l6ZV90ICAgICAgICAgIGxlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHNob3J0ICAgICAgICAgICBwY21fbFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc2hvcnQgICAgICAgICAgIHBjbV9yW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtcDNkYXRhX3N0cnVjdCogbXAzZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKiBzYW1lIGFzIGhpcF9kZWNvZGUxX2hlYWRlcnMsIGJ1dCBhbHNvIHJldHVybnMgZW5jX2RlbGF5IGFuZCBlbmNfcGFkZGluZworICAgZnJvbSBWQlIgSW5mbyB0YWcsICgtMSBpZiBubyBpbmZvIHRhZyB3YXMgZm91bmQpICovCitpbnQgQ0RFQ0wgaGlwX2RlY29kZTFfaGVhZGVyc0IoIGhpcF90IGdmcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB1bnNpZ25lZCBjaGFyKiAgIG1wM2J1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzaXplX3QgICAgICAgICAgIGxlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzaG9ydCAgICAgICAgICAgIHBjbV9sW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc2hvcnQgICAgICAgICAgICBwY21fcltdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1wM2RhdGFfc3RydWN0KiAgbXAzZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgICAgICAgICAgICAgKmVuY19kZWxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgICAgICAgICAgICAgKmVuY19wYWRkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisKKworLyogT0JTT0xFVEU6CisgKiBsYW1lX2RlY29kZS4uLiBmdW5jdGlvbnMgYXJlIHRoZXJlIHRvIGtlZXAgb2xkIGNvZGUgd29ya2luZworICogYnV0IGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHJlcGxhY2UgY2FsbHMgYnkgaGlwX2RlY29kZS4uLgorICogZnVuY3Rpb24gY2FsbHMsIHNlZSBhYm92ZS4KKyAqLworI2lmIDEKK2ludCBDREVDTCBsYW1lX2RlY29kZV9pbml0KHZvaWQpOworaW50IENERUNMIGxhbWVfZGVjb2RlKAorICAgICAgICB1bnNpZ25lZCBjaGFyICogIG1wM2J1ZiwKKyAgICAgICAgaW50ICAgICAgICAgICAgICBsZW4sCisgICAgICAgIHNob3J0ICAgICAgICAgICAgcGNtX2xbXSwKKyAgICAgICAgc2hvcnQgICAgICAgICAgICBwY21fcltdICk7CitpbnQgQ0RFQ0wgbGFtZV9kZWNvZGVfaGVhZGVycygKKyAgICAgICAgdW5zaWduZWQgY2hhciogICBtcDNidWYsCisgICAgICAgIGludCAgICAgICAgICAgICAgbGVuLAorICAgICAgICBzaG9ydCAgICAgICAgICAgIHBjbV9sW10sCisgICAgICAgIHNob3J0ICAgICAgICAgICAgcGNtX3JbXSwKKyAgICAgICAgbXAzZGF0YV9zdHJ1Y3QqICBtcDNkYXRhICk7CitpbnQgQ0RFQ0wgbGFtZV9kZWNvZGUxKAorICAgICAgICB1bnNpZ25lZCBjaGFyKiAgbXAzYnVmLAorICAgICAgICBpbnQgICAgICAgICAgICAgbGVuLAorICAgICAgICBzaG9ydCAgICAgICAgICAgcGNtX2xbXSwKKyAgICAgICAgc2hvcnQgICAgICAgICAgIHBjbV9yW10gKTsKK2ludCBDREVDTCBsYW1lX2RlY29kZTFfaGVhZGVycygKKyAgICAgICAgdW5zaWduZWQgY2hhciogICBtcDNidWYsCisgICAgICAgIGludCAgICAgICAgICAgICAgbGVuLAorICAgICAgICBzaG9ydCAgICAgICAgICAgIHBjbV9sW10sCisgICAgICAgIHNob3J0ICAgICAgICAgICAgcGNtX3JbXSwKKyAgICAgICAgbXAzZGF0YV9zdHJ1Y3QqICBtcDNkYXRhICk7CitpbnQgQ0RFQ0wgbGFtZV9kZWNvZGUxX2hlYWRlcnNCKAorICAgICAgICB1bnNpZ25lZCBjaGFyKiAgIG1wM2J1ZiwKKyAgICAgICAgaW50ICAgICAgICAgICAgICBsZW4sCisgICAgICAgIHNob3J0ICAgICAgICAgICAgcGNtX2xbXSwKKyAgICAgICAgc2hvcnQgICAgICAgICAgICBwY21fcltdLAorICAgICAgICBtcDNkYXRhX3N0cnVjdCogIG1wM2RhdGEsCisgICAgICAgIGludCAgICAgICAgICAgICAgKmVuY19kZWxheSwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5jX3BhZGRpbmcgKTsKK2ludCBDREVDTCBsYW1lX2RlY29kZV9leGl0KHZvaWQpOworCisjZW5kaWYgLyogb2Jzb2xldGUgbGFtZV9kZWNvZGUgQVBJIGNhbGxzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGlkM3RhZyBzdHVmZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBpZDN0YWcuaCAtLSBJbnRlcmZhY2UgdG8gd3JpdGUgSUQzIHZlcnNpb24gMSBhbmQgMiB0YWdzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEb24gTWVsdG9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiB1dGlsaXR5IHRvIG9idGFpbiBhbHBoYWJldGljYWxseSBzb3J0ZWQgbGlzdCBvZiBnZW5yZSBuYW1lcyB3aXRoIG51bWJlcnMgKi8KK3ZvaWQgQ0RFQ0wgaWQzdGFnX2dlbnJlX2xpc3QoCisgICAgICAgIHZvaWQgKCpoYW5kbGVyKShpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwKKyAgICAgICAgdm9pZCogIGNvb2tpZSk7CisKK3ZvaWQgQ0RFQ0wgaWQzdGFnX2luaXQgICAgIChsYW1lX3QgZ2ZwKTsKKworLyogZm9yY2UgYWRkaXRpb24gb2YgdmVyc2lvbiAyIHRhZyAqLwordm9pZCBDREVDTCBpZDN0YWdfYWRkX3YyICAgKGxhbWVfdCBnZnApOworCisvKiBhZGQgb25seSBhIHZlcnNpb24gMSB0YWcgKi8KK3ZvaWQgQ0RFQ0wgaWQzdGFnX3YxX29ubHkgIChsYW1lX3QgZ2ZwKTsKKworLyogYWRkIG9ubHkgYSB2ZXJzaW9uIDIgdGFnICovCit2b2lkIENERUNMIGlkM3RhZ192Ml9vbmx5ICAobGFtZV90IGdmcCk7CisKKy8qIHBhZCB2ZXJzaW9uIDEgdGFnIHdpdGggc3BhY2VzIGluc3RlYWQgb2YgbnVsbHMgKi8KK3ZvaWQgQ0RFQ0wgaWQzdGFnX3NwYWNlX3YxIChsYW1lX3QgZ2ZwKTsKKworLyogcGFkIHZlcnNpb24gMiB0YWcgd2l0aCBleHRyYSAxMjggYnl0ZXMgKi8KK3ZvaWQgQ0RFQ0wgaWQzdGFnX3BhZF92MiAgIChsYW1lX3QgZ2ZwKTsKKworLyogcGFkIHZlcnNpb24gMiB0YWcgd2l0aCBleHRyYSBuIGJ5dGVzICovCit2b2lkIENERUNMIGlkM3RhZ19zZXRfcGFkICAobGFtZV90IGdmcCwgc2l6ZV90IG4pOworCit2b2lkIENERUNMIGlkM3RhZ19zZXRfdGl0bGUobGFtZV90IGdmcCwgY29uc3QgY2hhciogdGl0bGUpOwordm9pZCBDREVDTCBpZDN0YWdfc2V0X2FydGlzdChsYW1lX3QgZ2ZwLCBjb25zdCBjaGFyKiBhcnRpc3QpOwordm9pZCBDREVDTCBpZDN0YWdfc2V0X2FsYnVtKGxhbWVfdCBnZnAsIGNvbnN0IGNoYXIqIGFsYnVtKTsKK3ZvaWQgQ0RFQ0wgaWQzdGFnX3NldF95ZWFyKGxhbWVfdCBnZnAsIGNvbnN0IGNoYXIqIHllYXIpOwordm9pZCBDREVDTCBpZDN0YWdfc2V0X2NvbW1lbnQobGFtZV90IGdmcCwgY29uc3QgY2hhciogY29tbWVudCk7CisgICAgICAgICAgICAKKy8qIHJldHVybiAtMSByZXN1bHQgaWYgdHJhY2sgbnVtYmVyIGlzIG91dCBvZiBJRDN2MSByYW5nZQorICAgICAgICAgICAgICAgICAgICBhbmQgaWdub3JlZCBmb3IgSUQzdjEgKi8KK2ludCBDREVDTCBpZDN0YWdfc2V0X3RyYWNrKGxhbWVfdCBnZnAsIGNvbnN0IGNoYXIqIHRyYWNrKTsKKworLyogcmV0dXJuIG5vbi16ZXJvIHJlc3VsdCBpZiBnZW5yZSBuYW1lIG9yIG51bWJlciBpcyBpbnZhbGlkCisgIHJlc3VsdCAwOiBPSworICByZXN1bHQgLTE6IGdlbnJlIG51bWJlciBvdXQgb2YgcmFuZ2UKKyAgcmVzdWx0IC0yOiBubyB2YWxpZCBJRDN2MSBnZW5yZSBuYW1lLCBtYXBwZWQgdG8gSUQzdjEgJ090aGVyJworICAgICAgICAgICAgIGJ1dCB0YWtlbiBhcy1pcyBmb3IgSUQzdjIgZ2VucmUgdGFnICovCitpbnQgQ0RFQ0wgaWQzdGFnX3NldF9nZW5yZShsYW1lX3QgZ2ZwLCBjb25zdCBjaGFyKiBnZW5yZSk7CisKKy8qIHJldHVybiBub24temVybyByZXN1bHQgaWYgZmllbGQgbmFtZSBpcyBpbnZhbGlkICovCitpbnQgQ0RFQ0wgaWQzdGFnX3NldF9maWVsZHZhbHVlKGxhbWVfdCBnZnAsIGNvbnN0IGNoYXIqIGZpZWxkdmFsdWUpOworCisvKiByZXR1cm4gbm9uLXplcm8gcmVzdWx0IGlmIGltYWdlIHR5cGUgaXMgaW52YWxpZCAqLworaW50IENERUNMIGlkM3RhZ19zZXRfYWxidW1hcnQobGFtZV90IGdmcCwgY29uc3QgY2hhciogaW1hZ2UsIHNpemVfdCBzaXplKTsKKworLyogbGFtZV9nZXRfaWQzdjFfdGFnIGNvcGllcyBJRDN2MSB0YWcgaW50byBidWZmZXIuCisgKiBGdW5jdGlvbiByZXR1cm5zIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50byBidWZmZXIsIG9yIG51bWJlcgorICogb2YgYnl0ZXMgcnF1aXJlZCBpZiBidWZmZXIgJ3NpemUnIGlzIHRvbyBzbWFsbC4KKyAqIEZ1bmN0aW9uIGZhaWxzLCBpZiByZXR1cm5lZCB2YWx1ZSBpcyBsYXJnZXIgdGhhbiAnc2l6ZScuCisgKiBOT1RFOgorICogVGhpcyBmdW5jdGlvbnMgZG9lcyBub3RoaW5nLCBpZiB1c2VyL0xBTUUgZGlzYWJsZWQgSUQzdjEgdGFnLgorICovCitzaXplX3QgQ0RFQ0wgbGFtZV9nZXRfaWQzdjFfdGFnKGxhbWVfdCBnZnAsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKiBsYW1lX2dldF9pZDN2Ml90YWcgY29waWVzIElEM3YyIHRhZyBpbnRvIGJ1ZmZlci4KKyAqIEZ1bmN0aW9uIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIGJ1ZmZlciwgb3IgbnVtYmVyCisgKiBvZiBieXRlcyBycXVpcmVkIGlmIGJ1ZmZlciAnc2l6ZScgaXMgdG9vIHNtYWxsLgorICogRnVuY3Rpb24gZmFpbHMsIGlmIHJldHVybmVkIHZhbHVlIGlzIGxhcmdlciB0aGFuICdzaXplJy4KKyAqIE5PVEU6CisgKiBUaGlzIGZ1bmN0aW9ucyBkb2VzIG5vdGhpbmcsIGlmIHVzZXIvTEFNRSBkaXNhYmxlZCBJRDN2MiB0YWcuCisgKi8KK3NpemVfdCBDREVDTCBsYW1lX2dldF9pZDN2Ml90YWcobGFtZV90IGdmcCwgdW5zaWduZWQgY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKy8qIG5vcm1hbHkgbGFtZV9pbml0X3BhcmFtIHdyaXRlcyBJRDN2MiB0YWdzIGludG8gdGhlIGF1ZGlvIHN0cmVhbQorICogQ2FsbCBsYW1lX3NldF93cml0ZV9pZDN0YWdfYXV0b21hdGljKGdmcCwgMCkgYmVmb3JlIGxhbWVfaW5pdF9wYXJhbQorICogdG8gdHVybiBvZmYgdGhpcyBiZWhhdmlvdXIgYW5kIGdldCBJRDN2MiB0YWcgd2l0aCBhYm92ZSBmdW5jdGlvbgorICogd3JpdGUgaXQgeW91cnNlbGYgaW50byB5b3VyIGZpbGUuCisgKi8KK3ZvaWQgQ0RFQ0wgbGFtZV9zZXRfd3JpdGVfaWQzdGFnX2F1dG9tYXRpYyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF93cml0ZV9pZDN0YWdfYXV0b21hdGljKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0KiBnZnApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogIGxpc3Qgb2YgdmFsaWQgYml0cmF0ZXMgW2ticHNdICYgc2FtcGxlIGZyZXF1ZW5jaWVzIFtIel0uCisqICBmaXJzdCBpbmRleDogMDogTVBFRy0yICAgdmFsdWVzICAoc2FtcGxlIGZyZXF1ZW5jaWVzIDE2Li4uMjQga0h6KQorKiAgICAgICAgICAgICAgIDE6IE1QRUctMSAgIHZhbHVlcyAgKHNhbXBsZSBmcmVxdWVuY2llcyAzMi4uLjQ4IGtIeikKKyogICAgICAgICAgICAgICAyOiBNUEVHLTIuNSB2YWx1ZXMgIChzYW1wbGUgZnJlcXVlbmNpZXMgIDguLi4xMiBrSHopCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBjb25zdCBpbnQgICAgICBiaXRyYXRlX3RhYmxlICAgIFszXSBbMTZdOworZXh0ZXJuIGNvbnN0IGludCAgICAgIHNhbXBsZXJhdGVfdGFibGUgWzNdIFsgNF07CisKKworCisvKiBtYXhpbXVtIHNpemUgb2YgYWxidW1hcnQgaW1hZ2UgKDEyOEtCKSwgd2hpY2ggYWZmZWN0cyBMQU1FX01BWE1QM0JVRkZFUgorICAgYXMgd2VsbCBzaW5jZSBsYW1lX2VuY29kZV9idWZmZXIoKSBhbHNvIHJldHVybnMgSUQzdjIgdGFnIGRhdGEgKi8KKyNkZWZpbmUgTEFNRV9NQVhBTEJVTUFSVCAgICAoMTI4ICogMTAyNCkKKworLyogbWF4aW11bSBzaXplIG9mIG1wM2J1ZmZlciBuZWVkZWQgaWYgeW91IGVuY29kZSBhdCBtb3N0IDExNTIgc2FtcGxlcyBmb3IKKyAgIGVhY2ggY2FsbCB0byBsYW1lX2VuY29kZV9idWZmZXIuICBzZWUgbGFtZV9lbmNvZGVfYnVmZmVyKCkgYmVsb3cgIAorICAgKExBTUVfTUFYTVAzQlVGRkVSIGlzIG5vdyBvYnNvbGV0ZSkgICovCisjZGVmaW5lIExBTUVfTUFYTVAzQlVGRkVSICAgKDE2Mzg0ICsgTEFNRV9NQVhBTEJVTUFSVCkKKworCit0eXBlZGVmIGVudW0geworICAgIExBTUVfT0tBWSAgICAgICAgICAgICA9ICAgMCwKKyAgICBMQU1FX05PRVJST1IgICAgICAgICAgPSAgIDAsCisgICAgTEFNRV9HRU5FUklDRVJST1IgICAgID0gIC0xLAorICAgIExBTUVfTk9NRU0gICAgICAgICAgICA9IC0xMCwKKyAgICBMQU1FX0JBREJJVFJBVEUgICAgICAgPSAtMTEsCisgICAgTEFNRV9CQURTQU1QRlJFUSAgICAgID0gLTEyLAorICAgIExBTUVfSU5URVJOQUxFUlJPUiAgICA9IC0xMywKKworICAgIEZST05URU5EX1JFQURFUlJPUiAgICA9IC04MCwKKyAgICBGUk9OVEVORF9XUklURUVSUk9SICAgPSAtODEsCisgICAgRlJPTlRFTkRfRklMRVRPT0xBUkdFID0gLTgyCisKK30gbGFtZV9lcnJvcmNvZGVzX3Q7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjZW5kaWYgLyogTEFNRV9MQU1FX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5zdGFsbC1zaCBiL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQ0YTk1MQotLS0gL2Rldi9udWxsCisrKyBiL2luc3RhbGwtc2gKQEAgLTAsMCArMSwzMjMgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDA1LTA1LTE0LjIyCisKKyMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcworIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKKyMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisjIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisjIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQorIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIworIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAorIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KKyMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQorIyB0aXVtLgorIworIworIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCisjIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgorCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKworY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKK2Nob3duY21kPQorY2hncnBjbWQ9CitzdHJpcGNtZD0KK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9Citkc3Q9CitkaXJfYXJnPQorZHN0YXJnPQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKy1jICAgICAgICAgKGlnbm9yZWQpCistZCAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCistZyBHUk9VUCAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgorLW0gTU9ERSAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorLW8gVVNFUiAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgorLXMgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KKy10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKy1UICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCistLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgorLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRyBSTVBST0cgU1RSSVBQUk9HCisiCisKK3doaWxlIHRlc3QgLW4gIiQxIjsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtZCkgZGlyX2FyZz10cnVlCisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZworICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtdCkgZHN0YXJnPSQyCisJc2hpZnQKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWUKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC0tdmVyc2lvbikgZWNobyAiJDAgJHNjcmlwdHZlcnNpb24iOyBleGl0ICQ/OzsKKworICAgICopICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKwkjIFdoZW4gLXQgaXMgdXNlZCwgdGhlIGRlc3RpbmF0aW9uIGlzIGFscmVhZHkgc3BlY2lmaWVkLgorCXRlc3QgLW4gIiRkaXJfYXJnJGRzdGFyZyIgJiYgYnJlYWsKKyAgICAgICAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorCWZvciBhcmcKKwlkbworICAgICAgICAgIGlmIHRlc3QgLW4gIiRkc3RhcmciOyB0aGVuCisJICAgICMgJEAgaXMgbm90IGVtcHR5OiBpdCBjb250YWlucyBhdCBsZWFzdCAkYXJnLgorCSAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdGFyZyIKKwkgICAgc2hpZnQgIyBmbm9yZAorCSAgZmkKKwkgIHNoaWZ0ICMgYXJnCisJICBkc3Rhcmc9JGFyZworCWRvbmUKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAteiAiJDEiOyB0aGVuCisgIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgorICAgIGV4aXQgMQorICBmaQorICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KKyAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KKyAgZXhpdCAwCitmaQorCitmb3Igc3JjCitkbworICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgIGNhc2UgJHNyYyBpbgorICAgIC0qKSBzcmM9Li8kc3JjIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIHNyYz0KKworICAgIGlmIHRlc3QgLWQgIiRkc3QiOyB0aGVuCisgICAgICBta2RpcmNtZD06CisgICAgICBjaG1vZGNtZD0KKyAgICBlbHNlCisgICAgICBta2RpcmNtZD0kbWtkaXJwcm9nCisgICAgZmkKKyAgZWxzZQorICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0YXJnIjsgdGhlbgorICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGRzdD0kZHN0YXJnCisgICAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICAgIGNhc2UgJGRzdCBpbgorICAgICAgLSopIGRzdD0uLyRkc3QgOzsKKyAgICBlc2FjCisKKyAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCisgICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KKyAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCisJZWNobyAiJDA6ICRkc3Rhcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgICBkc3Q9JGRzdC9gYmFzZW5hbWUgIiRzcmMiYAorICAgIGZpCisgIGZpCisKKyAgIyBUaGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQuCisgIGRzdGRpcj1gZWNobyAiJGRzdCIgfCBzZWQgLWUgJ3MsLyokLCw7cyxbXi9dKiQsLDtzLC8qJCwsO3MsXiQsLiwnYAorCisgICMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisKKyAgIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KKyAgaWYgdGVzdCAhIC1kICIkZHN0ZGlyIjsgdGhlbgorICAgIGRlZmF1bHRJRlM9JworCSAnCisgICAgSUZTPSIke0lGUy0kZGVmYXVsdElGU30iCisKKyAgICBvSUZTPSRJRlMKKyAgICAjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgorICAgIElGUz0nJScKKyAgICBzZXQgeCBgZWNobyAiJGRzdGRpciIgfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKKyAgICBzaGlmdAorICAgIElGUz0kb0lGUworCisgICAgcGF0aGNvbXA9CisKKyAgICB3aGlsZSB0ZXN0ICQjIC1uZSAwIDsgZG8KKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcCQxCisgICAgICBzaGlmdAorICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgICAgICAgICRta2RpcnByb2cgIiRwYXRoY29tcCIKKwkjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaW4gY2FzZSBzZXZlcmFsCisJIyBpbnN0YWxsLXNoIGFyZSBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGNvbmN1cnJlbnRseS4gIFRoaXMKKwkjIGlzIE9LLgorCXRlc3QgLWQgIiRwYXRoY29tcCIgfHwgZXhpdAorICAgICAgZmkKKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcC8KKyAgICBkb25lCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgJGRvaXQgJG1rZGlyY21kICIkZHN0IiBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICIkZHN0IjsgfQorCisgIGVsc2UKKyAgICBkc3RmaWxlPWBiYXNlbmFtZSAiJGRzdCJgCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKyAgICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQorCisgICAgIyBDb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZS4KKyAgICAkZG9pdCAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKyAgICAgIHx8IHsKKwkgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCisJICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKwkgICAjIHN1cHBvcnQgLWYuCisKKwkgICAjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJICAgIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkgICAjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJICAgIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJICAgIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwkgICB7CisJICAgICBpZiB0ZXN0IC1mICIkZHN0ZGlyLyRkc3RmaWxlIjsgdGhlbgorCSAgICAgICAkZG9pdCAkcm1jbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKwkgICAgICAgfHwgJGRvaXQgJG12Y21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAiJHJtdG1wIiAyPi9kZXYvbnVsbCBcCisJICAgICAgIHx8IHsKKwkJIGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0ZGlyLyRkc3RmaWxlIiA+JjIKKwkJIChleGl0IDEpOyBleGl0IDEKKwkgICAgICAgfQorCSAgICAgZWxzZQorCSAgICAgICA6CisJICAgICBmaQorCSAgIH0gJiYKKworCSAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKwkgICAkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0ZGlyLyRkc3RmaWxlIgorCSB9CisgICAgfQorICBmaSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK2RvbmUKKworIyBUaGUgZmluYWwgbGl0dGxlIHRyaWNrIHRvICJjb3JyZWN0bHkiIHBhc3MgdGhlIGV4aXQgc3RhdHVzIHRvIHRoZSBleGl0IHRyYXAuCit7CisgIChleGl0IDApOyBleGl0IDAKK30KKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9sYW1lLmJhdCBiL2xhbWUuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiMzE3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9sYW1lLmJhdApAQCAtMCwwICsxLDQxIEBACitAZWNobyBvZmYNCityZW0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3JlbSAgUFVSUE9TRToNCityZW0gIC0gcHV0IHRoaXMgQmF0Y2gtQ29tbWFuZCBvbiB5b3VyIERlc2t0b3AsIA0KK3JlbSAgICBzbyB5b3UgY2FuIGRyYWcgYW5kIGRyb3Agd2F2ZSBmaWxlcyBvbiBpdA0KK3JlbSAgICBhbmQgTEFNRSB3aWxsIGVuY29kZSB0aGVtIHRvIG1wMyBmb3JtYXQuDQorcmVtICAtIHB1dCB0aGlzIEJhdGNoLUNvbW1hbmQgaW4gYSBwbGFjZSBtZW50aW9uZWQNCityZW0gICAgaW4geW91ciBQQVRIIGVudmlyb25tZW50LCBzdGFydCB0aGUgRE9TLUJPWA0KK3JlbSAgICBhbmQgY2hhbmdlIHRvIGEgZGlyZWN0b3J5IHdoZXJlIHlvdXIgd2F2ZSANCityZW0gICAgZmlsZXMgYXJlIGxvY2F0ZWQuIHRoZSBmb2xsb3dpbmcgbGluZSB3aWxsDQorcmVtICAgIGVuY29kZSBhbGwgeW91ciB3YXZlIGZpbGVzIHRvIG1wMw0KK3JlbSAgICAgImxhbWUuYmF0ICoud2F2Ig0KK3JlbSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorcmVtICAgICAgICAgICAgICAgICAgICAgICAgIEMyMDAwICBSb2JlcnQgSGVnZW1hbm4NCityZW0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3JlbSAgcGxlYXNlIHNldCBMQU1FIGFuZCBMQU1FT1BUUw0KK3JlbSAgTEFNRSAtIHdoZXJlIHRoZSBleGVjdXRlYWJsZSBpcw0KK3JlbSAgT1BUUyAtIG9wdGlvbnMgeW91IGxpa2UgTEFNRSB0byB1c2UNCisNCisJc2V0IExBTUU9bGFtZS5leGUNCisJc2V0IE9QVFM9LS1wcmVzZXQgY2QNCisNCityZW0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKwlzZXQgdGhlY21kPSVMQU1FJSAlT1BUUyUNCisJbGZuZm9yIG9uDQorOnByb2Nlc3NBcmdzDQorCWlmICIlMSI9PSIiIGdvdG8gZW5kbWFyaw0KKwlmb3IgJSVmIGluICglMSkgZG8gJXRoZWNtZCUgIiUlZiINCisJaWYgZXJyb3JsZXZlbCAxIGdvdG8gZXJyb3JtYXJrDQorCXNoaWZ0DQorCWdvdG8gcHJvY2Vzc0FyZ3MNCis6ZXJyb3JtYXJrDQorCWVjaG8uDQorCWVjaG8uDQorCWVjaG8gRVJST1IgcHJvY2Vzc2luZyAlMQ0KKwllY2hvLiANCis6ZW5kbWFyaw0KK3JlbQ0KK3JlbQlmaW5pc2hlZA0KK3JlbQ0KZGlmZiAtLWdpdCBhL2xhbWUuc3BlYy5pbiBiL2xhbWUuc3BlYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTIxNTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGFtZS5zcGVjLmluCkBAIC0wLDAgKzEsMTg4IEBACislZGVmaW5lIG5hbWUgQFBBQ0tBR0VACislZGVmaW5lIHZlciBAVkVSU0lPTkAKKyVkZWZpbmUgcmVsIDEKKyVkZWZpbmUgcHJlZml4ICV7X3Vzcn0KKyVkZWZpbmUgZG9jZGlyICV7X2RlZmF1bHRkb2NkaXJ9CisKK1N1bW1hcnkgOiBMQU1FIEFpbid0IGFuIE1QMyBFbmNvZGVyLi4uIGJ1dCBpdCdzIHRoZSBiZXN0LgorU3VtbWFyeShmcikgOiBMQU1FIG4nZXN0IHBhcyB1biBlbmNvZGV1ciBNUDMgOy0+CitOYW1lOiAle25hbWV9CitWZXJzaW9uOiAle3Zlcn0KK1JlbGVhc2U6ICV7cmVsfQorTGljZW5zZTogTEdQTAorVmVuZG9yOiBUaGUgTEFNRSBQcm9qZWN0CitQYWNrYWdlcjogWW9zaSBNYXJrb3ZpY2ggPHlvc2ltQGJpZ2Zvb3QuY29tPgorVVJMOiBodHRwOi8vd3d3Lm1wM2Rldi5vcmcKK0dyb3VwOiBBcHBsaWNhdGlvbnMvTXVsdGltZWRpYQorU291cmNlOiAle25hbWV9LSV7dmVyc2lvbn0udGFyLmd6CitCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tcm9vdAorUmVxdWlyZXM6IG5jdXJzZXMgPj0gNS4wCitCdWlsZFJlcXVpcmVzOiBnY2MgPT4gMy4wLjEsIC91c3IvYmluL2ZpbmQsIG5jdXJzZXMtZGV2ZWwKKyVpZmFyY2ggJXtpeDg2fSB4ODZfNjQKK0J1aWxkUmVxdWlyZXM6IG5hc20KKyVlbmRpZgorUHJvdmlkZXM6IG1wM2VuY29kZXIKKworJWRlc2NyaXB0aW9uCitMQU1FIGlzIGFuIGVkdWNhdGlvbmFsIHRvb2wgdG8gYmUgdXNlZCBmb3IgbGVhcm5pbmcgYWJvdXQgTVAzIGVuY29kaW5nLiAgVGhlCitnb2FsIG9mIHRoZSBMQU1FIHByb2plY3QgaXMgdG8gdXNlIHRoZSBvcGVuIHNvdXJjZSBtb2RlbCB0byBpbXByb3ZlIHRoZQorcHN5Y2hvIGFjb3VzdGljcywgbm9pc2Ugc2hhcGluZyBhbmQgc3BlZWQgb2YgTVAzLiAKKworJWRlc2NyaXB0aW9uIC1sIGZyCitMQU1FIGVzdCB1biBvdXRpbCBkJ2Vuc2VpZ25lbWVudCBwb3VyIGwnYXBwcmVudGlzc2FnZSBkZSBsJ2VuY29kYWdlIE1QMy4KK0xlIGJ1dCBkdSBwcm9qZXQgTEFNRSBlc3QgZCd1dGlsaXNlciB1biBtb2Tvv71sZSAib3BlbiBzb3VyY2UiIGFmaW4KK2QnYW3vv71saW9yZXIgbGEgcXVhbGl077+9IGV0IGxhIHZpdGVzc2UgZHUgTVAzLiAKKworCisKKyVwYWNrYWdlIGRldmVsCitTdW1tYXJ5OiBTaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJpZXMgZm9yIExBTUUuCitHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCitSZXF1aXJlczogJXtuYW1lfSA9ICV7dmVyc2lvbn0KKworJWRlc2NyaXB0aW9uIGRldmVsCitMQU1FIGlzIGFuIGVkdWNhdGlvbmFsIHRvb2wgdG8gYmUgdXNlZCBmb3IgbGVhcm5pbmcgYWJvdXQgTVAzIGVuY29kaW5nLgorVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGJvdGggdGhlIHNoYXJlZCBhbmQgdGhlIHN0YXRpYyBsaWJyYXJpZXMgZnJvbSB0aGUKK0xBTUUgcHJvamVjdC4KKworWW91IHdpbGwgYWxzbyBuZWVkIHRvIGluc3RhbGwgdGhlIG1haW4gbGFtZSBwYWNrYWdlIGluIG9yZGVyIHRvIGluc3RhbGwKK3RoZXNlIGxpYnJhcmllcy4KKworJXByZXAKKyVzZXR1cAorCislYnVpbGQKKworIyBWb3JiaXMgbWFrZXMgdGhlIGJ1aWxkIGZhaWwgZm9yIG5vdy4gLiAuCitybSAtZiBjb25maWcuY2FjaGUKKyAKKyVjb25maWd1cmUgXAorJWlmYXJjaCAle2l4ODZ9IHg4Nl82NAorCS0tZW5hYmxlLW5hc20gXAorJWVuZGlmCisJLS1lbmFibGUtZGVjb2RlciBcCisJLS13aXRob3V0LXZvcmJpcyBcCisJLS1lbmFibGUtYW5hbHl6ZXI9bm8gXAorCS0tZW5hYmxlLWJyaGlzdCBcCisJLS1kaXNhYmxlLWRlYnVnCisle19fbWFrZX0gJXs/X3NtcF9tZmxhZ3N9IHRlc3QgQ0ZMQUdTPSIle29wdGZsYWdzfSIKKworJWluc3RhbGwKKyV7X19ybX0gLXJmICV7YnVpbGRyb290fQorJW1ha2VpbnN0YWxsCisKKyMjIyBTb21lIGFwcHMgc3RpbGwgZXhwZWN0IHRvIGZpbmQgPGxhbWUuaD4KKyV7X19sbl9zfSAtZiBsYW1lL2xhbWUuaCAle2J1aWxkcm9vdH0le19pbmNsdWRlZGlyfS9sYW1lLmgKKworCitmaW5kIGRvYy9odG1sIC1uYW1lICJNYWtlZmlsZSoiIHwgeGFyZ3Mgcm0gLWYKKyMjIyBtYWtlIGluc3RhbGwgcmVhbGx5IHNob3VsZG4ndCBpbnN0YWxsIHRoZXNlCisle19fcm19IC1yZiAle2J1aWxkcm9vdH0le19kb2NkaXJ9L2xhbWUvCisKKworJXBvc3QKKy9zYmluL2xkY29uZmlnIDI+L2Rldi9udWxsCisKKyVwb3N0dW4KKy9zYmluL2xkY29uZmlnIDI+L2Rldi9udWxsCisKKyVjbGVhbgorJXtfX3JtfSAtcmYgJXtidWlsZHJvb3R9CisKKyVmaWxlcworJWRlZmF0dHIgKC0scm9vdCxyb290KQorJWRvYyBDT1BZSU5HIENoYW5nZUxvZyBSRUFETUUgVE9ETyBVU0FHRSBkb2MvaHRtbAorJWRvYyBkb2MvaHRtbAorJXtfYmluZGlyfS9sYW1lCisle19saWJkaXJ9L2xpYm1wM2xhbWUuc28uKgorJXtfbWFuZGlyfS9tYW4xL2xhbWUuMSoKKworJWZpbGVzIGRldmVsCislZGVmYXR0ciAoLSwgcm9vdCwgcm9vdCkKKyVkb2MgQVBJIEhBQ0tJTkcgU1RZTEVHVUlERQorJXtfbGliZGlyfS9saWJtcDNsYW1lLmEKKyV7X2xpYmRpcn0vbGlibXAzbGFtZS5sYQorJXtfbGliZGlyfS9saWJtcDNsYW1lLnNvCisle19pbmNsdWRlZGlyfS8qCisKKyVjaGFuZ2Vsb2cKKworKiBTdW4gTWF5IDE0IDIwMDYgS3lsZSBWYW5kZXJCZWVrIDxreWxldkBreWxldi5jb20+CistIFJlbW92ZSByZXF1aXJlbWVudHMgZm9yIHNwZWNpZmljIGdjYyB2ZXJzaW9ucywgc2luY2UgbW9kZXJuIG9uZXMgImp1c3Qgd29yayIuCistIFJlbW92ZSBvdXQtZGF0ZWQgaHlwZXItb3B0aW1pemF0aW9ucyAoc29tZSBvZiB3aGljaCB3ZXJlbid0IHZhbGlkIGNvbXBpbGVyCisgIGZsYWdzIGFueW1vcmUpLgorLSBVcGRhdGUgdG8gY3VycmVudCBSUE0gdGVjaG5pcXVlcyBhbmQgbWFjcm9zIChpbnNwaXJlZCBieSBmcmVzaHJwbXMubmV0IHNwZWMpLgorCisqIFNhdCBNYXkgMTEgMjAwMiBZb3NpIE1hcmtvdmljaCA8eW9zaW1AYmlnZm9vdC5jb20+CistIEZpeGVzIHRvIHRoZSBzcGVjIGZpbGUgdGhhdCBpbmNsdWRlOgorLSBNYWtpbmcgc3VyZSB0aGUgY29tcGlsZXIgaXMgZ2NjIHZlcnNpb24gMy4wLjEuIExhbWUgY29tcGlsZWQgd2l0aCBhIHZlcnNpb24KKyAgZ3JlYXRlciB0aGFuIDMuMC4xIGlzIGJyb2tlbi4KKy0gT3B0aW1pemF0aW9uIGZsYWdzIGZvciBpNjg2IHdpbGwgdXNlIGk2ODYgZm9yIG1hcmNoIGFuZCBtY3B1LCBhbmQgbm90IAorICBhdGhsb24uCistIEZpeCB0aGUgZGF0ZXMgaW4gdGhpcyBDaGFuZ2Vsb2cgc2VjdGlvbi4KKy0gVmFyaW91cyBzbWFsbCBmaXhlcyBtZXJnZWQgZnJvbSBNYXR0aGlhcyBTYW91LgorLSBUaGFua3MgRnJlZCBNYWNpZWwgPGZyZWQtbUBjcmwuaGl0YWNoaS5jby5qcD4gZm9yIGhpcyB1c2VmdWwgY29tbWVudHMuCisKKy0gCisqIFR1ZSBKYW4gMjIgMjAwMiBNYXJrIFRheWxvciA8bXRAbXAzZGV2Lm9yZz4KKy0gcmVwbGFjZWQgbGFtZS5zcGVjLmluIHdpdGggWW9zaSdzIHZlcnNpb24uICBNZXJnZWQgc29tZSBzdHVmZiBmcm9tCisgIHRoZSBwcmV2b3VzIGxhbWUuc3BlYy5pbiBmaWxlLCBhbmQgYXBwZW5kZWQgY2hhbmdlbG9nIGJlbG93LgorCisqIFR1ZSBKYW4gMjIgMjAwMiBZb3NpIE1hcmtvdmljaCA8eW9zaW1AYmlnZm9vdC5jb20+CistIFJld3JvdGUgbGFtZS5zcGVjLmluIHRvIGNyZWF0ZSBhIGNvcnJlY3QgYW5kIG5pY2Ugc3BlYyBmaWxlLgorICBpbWhvLCB0aGlzIHNwZWMgZmlsZSBpcyBub3QgZ29vZCBmb3IgYW55b25lIHdobyB3YW50cyB0byBidWlsZAorICBkYWlseSBjdnMgc25hcHNob3RzLiBDbG9zZXMgYnVnICM0OTU5NzUKKworKiBUdWUgRGVjIDExIDIwMDEgWW9zaSBNYXJrb3ZpY2ggPHlvc2ltQGJpZ2Zvb3QuY29tPgorLSBTaGFtZWxlc3NseSBzdG9sZSBNYXR0aGlhcyBTYW91J3MgZXhjZWxsZW50IHNwZWMgZmlsZSB0byBjcmVhdGUgZGFpbHkKKyAgQ1ZTIHNuYXBzaG90cyBvZiBMYW1lLiBPdGhlciB0aGFuIHRoYXQsIG5vdGhpbmcgaXMgbmV3LgorCisqIFR1ZSBPY3QgMjMgMjAwMSBNYXR0aGlhcyBTYW91IDxtYXR0aGlhcy5zYW91QGVzdC51bmUubWFybW90dGUubmV0PgorLSBGaXhlZCB0aGUgJXByZSBhbmQgJXBvc3QgdGhhdCBzaG91bGQgaGF2ZSBiZWVuICVwb3N0IGFuZCAlcG9zdHVuLCBzaWxseSBtZSEKKy0gUmVtb3ZlZCAtbWFsaWduLWRvdWJsZSAoaXQncyBldmlsLCBZb3NpIHRvbGQgbWUgYW5kIEkgdGVzdGVkLCBicnJyIDstKSkuCistIE5vdyBidWlsZCB3aXRoIGdjYzMsIFZCUiBlbmNvZGluZyBnZXRzIGEgaGVsbCBvZiBhIGJvb3N0LCBpbXByZXNzaXZlIQorICBJIHJlY29tbWVuZCB5b3Ugbm93IHVzZSAibGFtZSAtLXIzbWl4IiwgaXQncyB0aGUgYmVzdC4KKy0gVHJpZWQgdG8gcmUtZW5hYmxlIHZvcmJpcywgYnV0IGl0J3MgYSBuby1nby4KKworKiBUaHUgSnVsIDI2IDIwMDEgTWF0dGhpYXMgU2FvdSA8bWF0dGhpYXMuc2FvdUBlc3QudW5lLm1hcm1vdHRlLm5ldD4KKy0gQnVpbGQgd2l0aCBrZ2NjIHRvIGhhdmUgVkJSIHdvcmtpbmcuCisKKyogV2VkIEp1bCAyNSAyMDAxIE1hdHRoaWFzIFNhb3UgPG1hdHRoaWFzLnNhb3VAZXN0LnVuZS5tYXJtb3R0ZS5uZXQ+CistIFVwZGF0ZSB0byAzLjg5YmV0YSA6IE11c3QgYmUgYnVpbHQgd2l0aCBhIG5vbi1wYXRjaGVkIHZlcnNpb24gb2YgbmFzbQorICB0byB3b3JrIQorCisqIE1vbiBNYXkgIDcgMjAwMSBNYXR0aGlhcyBTYW91IDxtYXR0aGlhcy5zYW91QGVzdC51bmUubWFybW90dGUubmV0PgorLSBSZWJ1aWx0IGZvciBSZWQgSGF0IDcuMS4KKy0gRGlzYWJsZWQgdGhlIHZvcmJpcyBzdXBwb3J0IHNpbmNlIGl0IGZhaWxzIHRvIGJ1aWxkIHdpdGggaXQuCistIEFkZGVkIGEgYmlnIG9wdGltaXNhdGlvbiBzZWN0aW9uLCB0aGFua3MgdG8gWW9zaSBNYXJrb3ZpY2gKKyAgPHNlbm5hQGNhbWVsb3QuY29tPiBmb3IgdGhpcyBhbmQgb3RoZXIgcG9pbnRlcnMuCisKKyogU3VuIEZlYiAxMSAyMDAxIE1hdHRoaWFzIFNhb3UgPG1hdHRoaWFzLnNhb3VAZXN0LnVuZS5tYXJtb3R0ZS5uZXQ+CistIFNwbGl0IHRoZSBwYWNrYWdlLCB0aGVyZSBpcyBub3cgYSAtZGV2ZWwKKworKiBUaHUgTm92IDI2IDIwMDAgTWF0dGhpYXMgU2FvdSA8bWF0dGhpYXMuc2FvdUBlc3QudW5lLm1hcm1vdHRlLm5ldD4KKy0gSW5pdGlhbCBSUE0gcmVsZWFzZSBmb3IgUmVkSGF0IDcuMCBmcm9tIHNjcmF0Y2gKKworKiBXZWQgTm92IDIxIDIwMDAgRXJpYyBMYXNzYXVnZSA8bGFzc2F1Z2VAbWFpbC5kb3Rjb20uZnI+CistIFVwZGF0ZWQgYW5kIGNvcnJlY3RlZCBSUE0gdG8gMy44OWJldGEuCistIEFkZGVkIGZyZW5jaCB0cmFuc2xhdGlvbnMKKworKiBTYXQgQXVnIDA0IDIwMDAgTWFya3VzIExpbm5hbGEg77+9bWFhZ2VAY3MudHV0LmZp77+9CistIEJ1aWxkIGFuZCBpbmNsdWRlIGRvY3MgYW5kIGxpYnMgY29ycmVjdGx5CistIEJ1aWxkIGV4dHJhIHByb2dyYW1zCisKKyogVHVlIEF1ZyAwMSAyMDAwIFN0dWFydCBZb3VuZyDvv71jZWZpYXIxQG9wdHVzaG9tZS5jb20uYXXvv70KKy0gVXBkYXRlZCBSUE0gdG8gMy44NWJldGEuCistIE1vZGlmaWVkIHNwZWMgZmlsZSAobWVyZ2VkIEdlb3JnZSBhbmQgS2VpdGFybydzIHNwZWNzKQorLSBBZGRlZCByZWFzb25hYmxlIGluZm8gdG8gdGhlIHNwZWNzIHRvIHJlZmxlY3QgdGhlIG1haW50YWluZXIKKy0gUmVuYW1lZCBsYW1lLnNwZWMgKHBsYWluIHNwZWMgaXMgYmFkLCBtbWtheT8pLgorCisqIEZyaSBKdW4gMzAgMjAwMCBLZWl0YXJvIFlvc2ltdXJhIO+/vXJhbXN5QGxpbnV4Lm9yLmpw77+9CistIFVwZGF0ZWQgUlBNIHRvIDMuODRhbHBoYS4KKy0gQmV0dGVyIGF0dGVtcHQgYXQgYW4gUlBNLCBpbmRlcGVuZGFudCBvZiAzLjgzIHJlbGVhc2UuCistIChUaGlzIGlzIGFsbCBzdXJtaXNlIGFzIHRoZXJlIHdhcyBubyBjaGFuZ2Vsb2cpLgorCisqIFRodSBNYXkgMzAgMjAwMCBHZW9yZ2VzIFNlZ3VpbiDvv71jcm93QHBsYW5ldGUubmV077+9IAorLSBGaXJzdCBSUE0gYnVpbGQgYXJvdW5kIDMuODNiZXRhCisKKwpkaWZmIC0tZ2l0IGEvbGFtZV9jbGllbnRzX3ZjNi5kc3cgYi9sYW1lX2NsaWVudHNfdmM2LmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjYxODA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGFtZV9jbGllbnRzX3ZjNi5kc3cKQEAgLTAsMCArMSw4MyBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjIFdBUk5VTkc6IERJRVNFIEFSQkVJVFNCRVJFSUNIU0RBVEVJIERBUkYgTklDSFQgQkVBUkJFSVRFVCBPREVSIEdFTNZTQ0hUIFdFUkRFTiENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIkFEYmciPS5cQUNNXEFEYmdcQURiZy5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIkxBTUUgRFNob3ciPS5cZHNob3dcZHNob3cuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJMYW1lTXAzRW5jRGxsIj0uXERsbFxMYW1lRGxsX3ZjNi5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImxhbWVBQ00iPS5cQUNNXGxhbWVBQ01fdmM2LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBBRGJnDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgdGlueXhtbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJ0aW55eG1sIj0uXEFDTVx0aW55eG1sXHRpbnl4bWwuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0dsb2JhbDoNCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDM+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KZGlmZiAtLWdpdCBhL2xhbWVfcHJvamVjdHNfdmM2LmRzcCBiL2xhbWVfcHJvamVjdHNfdmM2LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTA0ZGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGFtZV9wcm9qZWN0c192YzYuZHNwCkBAIC0wLDAgKzEsNzggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibGFtZV9wcm9qZWN0cyIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgR2VuZXJpYyBQcm9qZWN0IiAweDAxMGENCisNCitDRkc9bGFtZV9wcm9qZWN0cyAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJsYW1lX3Byb2plY3RzX3ZjNi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibGFtZV9wcm9qZWN0c192YzYubWFrIiBDRkc9ImxhbWVfcHJvamVjdHMgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAibGFtZV9wcm9qZWN0cyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgR2VuZXJpYyBQcm9qZWN0IikNCishTUVTU0FHRSAibGFtZV9wcm9qZWN0cyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEdlbmVyaWMgUHJvamVjdCIpDQorIU1FU1NBR0UgImxhbWVfcHJvamVjdHMgLSBXaW4zMiBSZWxlYXNlIE5BU00iIChiYXNlZCBvbiAiV2luMzIgKHg4NikgR2VuZXJpYyBQcm9qZWN0IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK01UTD1taWRsLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxhbWVfcHJvamVjdHMgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsYW1lX3Byb2plY3RzIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsYW1lX3Byb2plY3RzIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImxhbWVfcHJvamVjdHNfX19XaW4zMl9SZWxlYXNlX05BU00iDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGFtZV9wcm9qZWN0c19fX1dpbjMyX1JlbGVhc2VfTkFTTSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAibGFtZV9wcm9qZWN0c19fX1dpbjMyX1JlbGVhc2VfTkFTTSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAibGFtZV9wcm9qZWN0c19fX1dpbjMyX1JlbGVhc2VfTkFTTSINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAibGFtZV9wcm9qZWN0cyAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJsYW1lX3Byb2plY3RzIC0gV2luMzIgRGVidWciDQorIyBOYW1lICJsYW1lX3Byb2plY3RzIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9sYW1lX3ZjNi5kc3cgYi9sYW1lX3ZjNi5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNzExOAotLS0gL2Rldi9udWxsCisrKyBiL2xhbWVfdmM2LmRzdwpAQCAtMCwwICsxLDEyOCBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjIFdBUk5VTkc6IERJRVNFIEFSQkVJVFNCRVJFSUNIU0RBVEVJIERBUkYgTklDSFQgQkVBUkJFSVRFVCBPREVSIEdFTNZTQ0hUIFdFUkRFTiENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIk1QM3giPSIuXGZyb250ZW5kXG1wM3hfdmM2LmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbXBnbGliDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbGlibXAzbGFtZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxhbWUNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBsaWJtcDNsYW1lIERMTA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJsYW1lIj0iLlxmcm9udGVuZFxsYW1lX3ZjNi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxpYm1wM2xhbWUNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBtcGdsaWINCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBsaWJtcDNsYW1lIERMTA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJsYW1lX3Byb2plY3RzIj0iLlxsYW1lX3Byb2plY3RzX3ZjNi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxhbWUNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBNUDN4DQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbGlibXAzbGFtZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxpYm1wM2xhbWUgRExMDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbXBnbGliDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImxpYm1wM2xhbWUiPSIuXGxpYm1wM2xhbWVcbGlibXAzbGFtZV92YzYuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBtcGdsaWINCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAibGlibXAzbGFtZSBETEwiPSIuXGxpYm1wM2xhbWVcbGlibXAzbGFtZV9kbGxfdmM2LmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIm1wZ2xpYiI9Ii5cbXBnbGliXG1wZ2xpYl92YzYuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9sYW1lX3ZjOC5zbG4gYi9sYW1lX3ZjOC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4MmFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xhbWVfdmM4LnNsbgpAQCAtMCwwICsxLDEwNSBAQAor77u/DQorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDANCisjIFZpc3VhbCBTdHVkaW8gMjAwOA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGlibXAzbGFtZV92YzgiLCAibGlibXAzbGFtZVxsaWJtcDNsYW1lX3ZjOC52Y3Byb2oiLCAiezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibXBnbGliX3ZjOCIsICJtcGdsaWJcbXBnbGliX3ZjOC52Y3Byb2oiLCAiezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGFtZV92YzgiLCAiZnJvbnRlbmRcbGFtZV92YzgudmNwcm9qIiwgIntBNUJDNzNERi1FOEJCLTQ1RDUtOTg0RS1BMjA5MTcwRDQwQkJ9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7MEFCNDhFNUQtRkFBNS00MDJCLTg0RDYtMkY1MTY2RDkwREQ0fSA9IHswQUI0OEU1RC1GQUE1LTQwMkItODRENi0yRjUxNjZEOTBERDR9DQorCQl7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfSA9IHs0QjE1MjMxOS0wQUY2LTRFMUItQTI4NC04MDVENjQ4M0M1RjF9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiTGFtZURsbF92YzgiLCAiRGxsXExhbWVEbGxfdmM4LnZjcHJvaiIsICJ7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0gPSB7MEFCNDhFNUQtRkFBNS00MDJCLTg0RDYtMkY1MTY2RDkwREQ0fQ0KKwkJezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0gPSB7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm1wM3hfdmM4IiwgImZyb250ZW5kXG1wM3hfdmM4LnZjcHJvaiIsICJ7RjYxNDBGMjUtMDQ2MC00OUU1LUEyRUItMDZDRUQzM0JGMDhGfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0gPSB7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfQ0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0gPSB7MEFCNDhFNUQtRkFBNS00MDJCLTg0RDYtMkY1MTY2RDkwREQ0fQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnIEdUS3xXaW4zMiA9IERlYnVnIEdUS3xXaW4zMg0KKwkJRGVidWcgR1RLfHg2NCA9IERlYnVnIEdUS3x4NjQNCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NA0KKwkJUmVsZWFzZSBOQVNNfFdpbjMyID0gUmVsZWFzZSBOQVNNfFdpbjMyDQorCQlSZWxlYXNlIE5BU018eDY0ID0gUmVsZWFzZSBOQVNNfHg2NA0KKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0uRGVidWcgR1RLfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnIEdUS3xXaW4zMg0KKwkJezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0uRGVidWcgR1RLfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBHVEt8V2luMzINCisJCXs0QjE1MjMxOS0wQUY2LTRFMUItQTI4NC04MDVENjQ4M0M1RjF9LkRlYnVnIEdUS3x4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs0QjE1MjMxOS0wQUY2LTRFMUItQTI4NC04MDVENjQ4M0M1RjF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0QjE1MjMxOS0wQUY2LTRFMUItQTI4NC04MDVENjQ4M0M1RjF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs0QjE1MjMxOS0wQUY2LTRFMUItQTI4NC04MDVENjQ4M0M1RjF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfS5SZWxlYXNlIE5BU018V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBOQVNNfFdpbjMyDQorCQl7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfS5SZWxlYXNlIE5BU018V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgTkFTTXxXaW4zMg0KKwkJezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0uUmVsZWFzZSBOQVNNfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NEIxNTIzMTktMEFGNi00RTFCLUEyODQtODA1RDY0ODNDNUYxfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezRCMTUyMzE5LTBBRjYtNEUxQi1BMjg0LTgwNUQ2NDgzQzVGMX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7MEFCNDhFNUQtRkFBNS00MDJCLTg0RDYtMkY1MTY2RDkwREQ0fS5EZWJ1ZyBHVEt8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgR1RLfFdpbjMyDQorCQl7MEFCNDhFNUQtRkFBNS00MDJCLTg0RDYtMkY1MTY2RDkwREQ0fS5EZWJ1ZyBHVEt8V2luMzIuQnVpbGQuMCA9IERlYnVnIEdUS3xXaW4zMg0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0uRGVidWcgR1RLfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXswQUI0OEU1RC1GQUE1LTQwMkItODRENi0yRjUxNjZEOTBERDR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXswQUI0OEU1RC1GQUE1LTQwMkItODRENi0yRjUxNjZEOTBERDR9LlJlbGVhc2UgTkFTTXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7MEFCNDhFNUQtRkFBNS00MDJCLTg0RDYtMkY1MTY2RDkwREQ0fS5SZWxlYXNlIE5BU018V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXswQUI0OEU1RC1GQUE1LTQwMkItODRENi0yRjUxNjZEOTBERDR9LlJlbGVhc2UgTkFTTXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXswQUI0OEU1RC1GQUE1LTQwMkItODRENi0yRjUxNjZEOTBERDR9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXswQUI0OEU1RC1GQUE1LTQwMkItODRENi0yRjUxNjZEOTBERDR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0E1QkM3M0RGLUU4QkItNDVENS05ODRFLUEyMDkxNzBENDBCQn0uRGVidWcgR1RLfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QTVCQzczREYtRThCQi00NUQ1LTk4NEUtQTIwOTE3MEQ0MEJCfS5EZWJ1ZyBHVEt8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QTVCQzczREYtRThCQi00NUQ1LTk4NEUtQTIwOTE3MEQ0MEJCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0E1QkM3M0RGLUU4QkItNDVENS05ODRFLUEyMDkxNzBENDBCQn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QTVCQzczREYtRThCQi00NUQ1LTk4NEUtQTIwOTE3MEQ0MEJCfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7QTVCQzczREYtRThCQi00NUQ1LTk4NEUtQTIwOTE3MEQ0MEJCfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJe0E1QkM3M0RGLUU4QkItNDVENS05ODRFLUEyMDkxNzBENDBCQn0uUmVsZWFzZSBOQVNNfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtBNUJDNzNERi1FOEJCLTQ1RDUtOTg0RS1BMjA5MTcwRDQwQkJ9LlJlbGVhc2UgTkFTTXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0E1QkM3M0RGLUU4QkItNDVENS05ODRFLUEyMDkxNzBENDBCQn0uUmVsZWFzZSBOQVNNfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0E1QkM3M0RGLUU4QkItNDVENS05ODRFLUEyMDkxNzBENDBCQn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QTVCQzczREYtRThCQi00NUQ1LTk4NEUtQTIwOTE3MEQ0MEJCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QTVCQzczREYtRThCQi00NUQ1LTk4NEUtQTIwOTE3MEQ0MEJCfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0E1QkM3M0RGLUU4QkItNDVENS05ODRFLUEyMDkxNzBENDBCQn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fS5EZWJ1ZyBHVEt8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtGN0I5RDRDMC1ENUYyLTQzQjctOTUzMC1EQjJEQUYwRTEzNDl9LkRlYnVnIEdUS3x4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtGN0I5RDRDMC1ENUYyLTQzQjctOTUzMC1EQjJEQUYwRTEzNDl9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtGN0I5RDRDMC1ENUYyLTQzQjctOTUzMC1EQjJEQUYwRTEzNDl9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXtGN0I5RDRDMC1ENUYyLTQzQjctOTUzMC1EQjJEQUYwRTEzNDl9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fS5SZWxlYXNlIE5BU018V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0Y3QjlENEMwLUQ1RjItNDNCNy05NTMwLURCMkRBRjBFMTM0OX0uUmVsZWFzZSBOQVNNfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fS5SZWxlYXNlIE5BU018eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtGN0I5RDRDMC1ENUYyLTQzQjctOTUzMC1EQjJEQUYwRTEzNDl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtGN0I5RDRDMC1ENUYyLTQzQjctOTUzMC1EQjJEQUYwRTEzNDl9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7RjdCOUQ0QzAtRDVGMi00M0I3LTk1MzAtREIyREFGMEUxMzQ5fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtGNjE0MEYyNS0wNDYwLTQ5RTUtQTJFQi0wNkNFRDMzQkYwOEZ9LkRlYnVnIEdUS3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBHVEt8V2luMzINCisJCXtGNjE0MEYyNS0wNDYwLTQ5RTUtQTJFQi0wNkNFRDMzQkYwOEZ9LkRlYnVnIEdUS3xXaW4zMi5CdWlsZC4wID0gRGVidWcgR1RLfFdpbjMyDQorCQl7RjYxNDBGMjUtMDQ2MC00OUU1LUEyRUItMDZDRUQzM0JGMDhGfS5EZWJ1ZyBHVEt8eDY0LkFjdGl2ZUNmZyA9IERlYnVnIEdUS3xXaW4zMg0KKwkJe0Y2MTQwRjI1LTA0NjAtNDlFNS1BMkVCLTA2Q0VEMzNCRjA4Rn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgR1RLfFdpbjMyDQorCQl7RjYxNDBGMjUtMDQ2MC00OUU1LUEyRUItMDZDRUQzM0JGMDhGfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWcgR1RLfFdpbjMyDQorCQl7RjYxNDBGMjUtMDQ2MC00OUU1LUEyRUItMDZDRUQzM0JGMDhGfS5SZWxlYXNlIE5BU018V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgR1RLfFdpbjMyDQorCQl7RjYxNDBGMjUtMDQ2MC00OUU1LUEyRUItMDZDRUQzM0JGMDhGfS5SZWxlYXNlIE5BU018eDY0LkFjdGl2ZUNmZyA9IERlYnVnIEdUS3xXaW4zMg0KKwkJe0Y2MTQwRjI1LTA0NjAtNDlFNS1BMkVCLTA2Q0VEMzNCRjA4Rn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1ZyBHVEt8V2luMzINCisJCXtGNjE0MEYyNS0wNDYwLTQ5RTUtQTJFQi0wNkNFRDMzQkYwOEZ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IERlYnVnIEdUS3xXaW4zMg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvLmluZGVudC5wcm8gYi9saWJtcDNsYW1lLy5pbmRlbnQucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDRiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lLy5pbmRlbnQucHJvCkBAIC0wLDAgKzEsMzIgQEAKKy8vIElOREVOVCBzZXR1cCBmaWxlOgorLy8JYmFzaWNhbGx5IHRoZSBHTlUtc3R5bGUgb2YgY29kaW5nCisvLyAKKy0tbm8tYmxhbmstbGluZXMtYWZ0ZXItZGVjbGFyYXRpb25zCistLWJsYW5rLWxpbmVzLWFmdGVyLXByb2NlZHVyZXMKKy0tbm8tYmxhbmstbGluZXMtYWZ0ZXItY29tbWFzCistLWJyZWFrLWJlZm9yZS1ib29sZWFuLW9wZXJhdG9yCistLWJyYWNlcy1vbi1pZi1saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyCistLWJyYWNlLWluZGVudDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgPC0KKy0tYnJhY2VzLW9uLXN0cnVjdC1kZWNsLWxpbmUgICAgICAgICAgICAgICAgICAgICAgLy8KKy0tY29tbWVudC1pbmRlbnRhdGlvbjI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzIKKy0tZGVjbGFyYXRpb24tY29tbWVudC1jb2x1bW4zMCAgICAgICAgICAgICAgICAgICAgLy8gMT8KKy0tbm8tY29tbWVudC1kZWxpbWl0ZXJzLW9uLWJsYW5rLWxpbmVzCistLWRvbnQtY3VkZGxlLWVsc2UKKy0tZWxzZS1lbmRpZi1jb2x1bW4xCistLXNwYWNlLWFmdGVyLWNhc3QKKy0tZGVjbGFyYXRpb24taW5kZW50YXRpb244ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMgorLW5kaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IGRvZXMgdGhpcyBtZWFuPworLS1kb250LWZvcm1hdC1maXJzdC1jb2x1bW4tY29tbWVudHMKKy0tZG9udC1mb3JtYXQtY29tbWVudHMKKy0taG9ub3VyLW5ld2xpbmVzCistLWluZGVudC1sZXZlbDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKKy0tcGFyYW1ldGVyLWluZGVudGF0aW9uNiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNQorLS1jb250aW51ZS1hdC1wYXJlbnRoZXNlcworLS1zcGFjZS1hZnRlci1wcm9jZWR1cmUtY2FsbHMKKy0tcHJvY25hbWVzLXN0YXJ0LWxpbmVzCistLWRvbnQtc3Rhci1jb21tZW50cworLS1sZWF2ZS1vcHRpb25hbC1ibGFuay1saW5lcyAKKy0tbm8tc3BhY2UtYWZ0ZXItZnVuY3Rpb24tY2FsbC1uYW1lcworCistLXRhYi1zaXplMAorLS1saW5lLWxlbmd0aDEwMApkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9NYWtlZmlsZS5hbSBiL2xpYm1wM2xhbWUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyODUzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMDIgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjM3LjIuMiAyMDEwLzAyLzI2IDIyOjI0OjM1IHJvYmVydCBFeHAgJAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCisKK1NVQkRJUlMgPSBpMzg2IHZlY3RvcgorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJtcDNsYW1lLmxhCisKK2lmIEhBVkVfTkFTTQorY3B1X2xkYWRkID0gJCh0b3BfYnVpbGRkaXIpL2xpYm1wM2xhbWUvQENQVVRZUEVAL2xpYmxhbWVhc21yb3V0aW5lcy5sYQorZW5kaWYKK2lmIFdJVEhfVkVDVE9SCit2ZWN0b3JfbGRhZGQgPSAkKHRvcF9idWlsZGRpcikvbGlibXAzbGFtZS92ZWN0b3IvbGlibGFtZXZlY3RvcnJvdXRpbmVzLmxhCitlbmRpZgorCitpZiBMSUJfV0lUSF9ERUNPREVSCitkZWNvZGVyX2xkYWRkID0gJCh0b3BfYnVpbGRkaXIpL21wZ2xpYi9saWJtcGdkZWNvZGVyLmxhCitlbHNlCitkZWNvZGVyX2xkYWRkID0KK2VuZGlmCisKK2xpYm1wM2xhbWVfbGFfTElCQUREID0JJChjcHVfbGRhZGQpICQodmVjdG9yX2xkYWRkKSAkKGRlY29kZXJfbGRhZGQpIFwKKwkJCSQoQ09ORklHX01BVEhfTElCKQorbGlibXAzbGFtZV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyBATElCX01BSk9SX1ZFUlNJT05AOkBMSUJfTUlOT1JfVkVSU0lPTkAgXAorCQkJLW5vLXVuZGVmaW5lZAorCitJTkNMVURFUyA9IEBJTkNMVURFU0AgLUkkKHRvcF9zcmNkaXIpL21wZ2xpYiAtSSQodG9wX2J1aWxkZGlyKQorCitERUZTID0gQERFRlNAIEBDT05GSUdfREVGU0AKKworRVhUUkFfRElTVCA9IFwKKwlsaWJtcDNsYW1lX3ZjNi5kc3AgXAorCWxpYm1wM2xhbWVfZGxsX3ZjNi5kc3AgXAorCWxpYm1wM2xhbWVfdmM4LnZjcHJvaiBcCisJbGFtZS5yYyBcCisJbG9nb2UuaWNvCisKK2xpYm1wM2xhbWVfbGFfU09VUkNFUyA9IFwKKyAgICAgICAgVmJyVGFnLmMgXAorCWJpdHN0cmVhbS5jIFwKKwllbmNvZGVyLmMgXAorCWZmdC5jIFwKKwlnYWluX2FuYWx5c2lzLmMgXAorICAgICAgICBpZDN0YWcuYyBcCisgICAgICAgIGxhbWUuYyBcCisgICAgICAgIG5ld21kY3QuYyBcCisJcHJlc2V0cy5jIFwKKwlwc3ltb2RlbC5jIFwKKwlxdWFudGl6ZS5jIFwKKwlxdWFudGl6ZV9wdnQuYyBcCisJcmVzZXJ2b2lyLmMgXAorCXNldF9nZXQuYyBcCisJdGFibGVzLmMgXAorCXRha2VoaXJvLmMgXAorCXV0aWwuYyBcCisJdmJycXVhbnRpemUuYyBcCisJdmVyc2lvbi5jIFwKKwltcGdsaWJfaW50ZXJmYWNlLmMKKworbm9pbnN0X0hFQURFUlM9IFwKKwlWYnJUYWcuaCBcCisJYml0c3RyZWFtLmggXAorCWVuY29kZXIuaCBcCisJZmZ0LmggXAorCWdhaW5fYW5hbHlzaXMuaCBcCisJaWQzdGFnLmggXAorCWwzc2lkZS5oIFwKKwlsYW1lLWFuYWx5c2lzLmggXAorCWxhbWVfZ2xvYmFsX2ZsYWdzLmggXAorCW1hY2hpbmUuaCBcCisJbmV3bWRjdC5oIFwKKwlwc3ltb2RlbC5oIFwKKwlxdWFudGl6ZS5oICBcCisJcXVhbnRpemVfcHZ0LmggXAorCXJlc2Vydm9pci5oIFwKKwlzZXRfZ2V0LmggXAorCXRhYmxlcy5oIFwKKwl1dGlsLmggXAorCXZicnF1YW50aXplLmggXAorCXZlcnNpb24uaAorCitDTEVBTkZJTEVTID0gbGNsaW50LnR4dAorCitMQ0xJTlRGTEFHUz0gXAorCStwb3NpeGxpYiBcCisJK3Nob3dzdW1tYXJ5IFwKKwkrc2hvd2FsbHVzZXMgXAorCSt3aGljaGxpYiBcCisJK2ZvcmNlaGludHMgXAorCS1maXhlZGZvcm1hbGFycmF5IFwKKwkrbWF0Y2hhbnlpbnRlZ3JhbCBcCisJLURsaW50CisKK2xjbGludC50eHQ6ICR7bGlibXAzbGFtZV9sYV9TT1VSQ0VTfSAke25vaW5zdF9IRUFERVJTfQorCUBsY2xpbnQgJHtMQ0xJTlRGTEFHU30gJHtJTkNMVURFU30gJHtERUZTfSAke2xpYm1wM2xhbWVfbGFfU09VUkNFU30gMj4mMSA+bGNsaW50LnR4dCB8fCB0cnVlCisKK2xjbGludDogbGNsaW50LnR4dAorCW1vcmUgbGNsaW50LnR4dAorCisjJChPQkpFQ1RTKTogbGlidG9vbAorI2xpYnRvb2w6ICQoTElCVE9PTF9ERVBTKQorIwkkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvTWFrZWZpbGUuaW4gYi9saWJtcDNsYW1lL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZmEyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNzgxIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBnbG9iYWwgc2VjdGlvbiBmb3IgZXZlcnkgTWFrZWZpbGUuYW0KKworCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorQU5TSTJLTlIgPSAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCitESVNUX0NPTU1PTiA9ICQobm9pbnN0X0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCisJJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsIGRlcGNvbXAKK3N1YmRpciA9IGxpYm1wM2xhbWUKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBgZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobGliZGlyKSIKK2xpYkxUTElCUkFSSUVTX0lOU1RBTEwgPSAkKElOU1RBTEwpCitMVExJQlJBUklFUyA9ICQobGliX0xUTElCUkFSSUVTKQorQExJQl9XSVRIX0RFQ09ERVJfVFJVRUBhbV9fREVQRU5ERU5DSUVTXzEgPSAkKHRvcF9idWlsZGRpcikvbXBnbGliL2xpYm1wZ2RlY29kZXIubGEKK2FtX19ERVBFTkRFTkNJRVNfMiA9CitsaWJtcDNsYW1lX2xhX0RFUEVOREVOQ0lFUyA9ICQoY3B1X2xkYWRkKSAkKHZlY3Rvcl9sZGFkZCkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMikKK2FtX2xpYm1wM2xhbWVfbGFfT0JKRUNUUyA9IFZiclRhZyRVLmxvIGJpdHN0cmVhbSRVLmxvIGVuY29kZXIkVS5sbyBcCisJZmZ0JFUubG8gZ2Fpbl9hbmFseXNpcyRVLmxvIGlkM3RhZyRVLmxvIGxhbWUkVS5sbyBuZXdtZGN0JFUubG8gXAorCXByZXNldHMkVS5sbyBwc3ltb2RlbCRVLmxvIHF1YW50aXplJFUubG8gcXVhbnRpemVfcHZ0JFUubG8gXAorCXJlc2Vydm9pciRVLmxvIHNldF9nZXQkVS5sbyB0YWJsZXMkVS5sbyB0YWtlaGlybyRVLmxvIFwKKwl1dGlsJFUubG8gdmJycXVhbnRpemUkVS5sbyB2ZXJzaW9uJFUubG8gbXBnbGliX2ludGVyZmFjZSRVLmxvCitsaWJtcDNsYW1lX2xhX09CSkVDVFMgPSAkKGFtX2xpYm1wM2xhbWVfbGFfT0JKRUNUUykKK2xpYm1wM2xhbWVfbGFfTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKGxpYm1wM2xhbWVfbGFfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorREVGQVVMVF9JTkNMVURFUyA9IC1JLiAtSSQodG9wX2J1aWxkZGlyKUBhbV9faXNyY0AKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGlibXAzbGFtZV9sYV9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChsaWJtcDNsYW1lX2xhX1NPVVJDRVMpCitSRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAorCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCisJcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKK0hFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AgQENPTkZJR19ERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AgLUkkKHRvcF9zcmNkaXIpL21wZ2xpYiAtSSQodG9wX2J1aWxkZGlyKQorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREFERCA9IEBMREFEREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMSUJfTUFKT1JfVkVSU0lPTiA9IEBMSUJfTUFKT1JfVkVSU0lPTkAKK0xJQl9NSU5PUl9WRVJTSU9OID0gQExJQl9NSU5PUl9WRVJTSU9OQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRURFUCA9IEBNQUtFREVQQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOQVNNID0gQE5BU01ACitOQVNNX0ZPUk1BVCA9IEBOQVNNX0ZPUk1BVEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUk1fRiA9IEBSTV9GQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTTkRGSUxFX0NGTEFHUyA9IEBTTkRGSUxFX0NGTEFHU0AKK1NOREZJTEVfTElCUyA9IEBTTkRGSUxFX0xJQlNACitTVFJJUCA9IEBTVFJJUEAKK1UgPSBAVUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJVEhfRlJPTlRFTkQgPSBAV0lUSF9GUk9OVEVOREAKK1dJVEhfTVAzUlRQID0gQFdJVEhfTVAzUlRQQAorV0lUSF9NUDNYID0gQFdJVEhfTVAzWEAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FVVE9NQUtFX09QVElPTlMgPSAxLjkgZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCitTVUJESVJTID0gaTM4NiB2ZWN0b3IKK2xpYl9MVExJQlJBUklFUyA9IGxpYm1wM2xhbWUubGEKK0BIQVZFX05BU01fVFJVRUBjcHVfbGRhZGQgPSAkKHRvcF9idWlsZGRpcikvbGlibXAzbGFtZS9AQ1BVVFlQRUAvbGlibGFtZWFzbXJvdXRpbmVzLmxhCitAV0lUSF9WRUNUT1JfVFJVRUB2ZWN0b3JfbGRhZGQgPSAkKHRvcF9idWlsZGRpcikvbGlibXAzbGFtZS92ZWN0b3IvbGlibGFtZXZlY3RvcnJvdXRpbmVzLmxhCitATElCX1dJVEhfREVDT0RFUl9GQUxTRUBkZWNvZGVyX2xkYWRkID0gCitATElCX1dJVEhfREVDT0RFUl9UUlVFQGRlY29kZXJfbGRhZGQgPSAkKHRvcF9idWlsZGRpcikvbXBnbGliL2xpYm1wZ2RlY29kZXIubGEKK2xpYm1wM2xhbWVfbGFfTElCQUREID0gJChjcHVfbGRhZGQpICQodmVjdG9yX2xkYWRkKSAkKGRlY29kZXJfbGRhZGQpIFwKKwkJCSQoQ09ORklHX01BVEhfTElCKQorCitsaWJtcDNsYW1lX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvIEBMSUJfTUFKT1JfVkVSU0lPTkA6QExJQl9NSU5PUl9WRVJTSU9OQCBcCisJCQktbm8tdW5kZWZpbmVkCisKK0VYVFJBX0RJU1QgPSBcCisJbGlibXAzbGFtZV92YzYuZHNwIFwKKwlsaWJtcDNsYW1lX2RsbF92YzYuZHNwIFwKKwlsaWJtcDNsYW1lX3ZjOC52Y3Byb2ogXAorCWxhbWUucmMgXAorCWxvZ29lLmljbworCitsaWJtcDNsYW1lX2xhX1NPVVJDRVMgPSBcCisgICAgICAgIFZiclRhZy5jIFwKKwliaXRzdHJlYW0uYyBcCisJZW5jb2Rlci5jIFwKKwlmZnQuYyBcCisJZ2Fpbl9hbmFseXNpcy5jIFwKKyAgICAgICAgaWQzdGFnLmMgXAorICAgICAgICBsYW1lLmMgXAorICAgICAgICBuZXdtZGN0LmMgXAorCXByZXNldHMuYyBcCisJcHN5bW9kZWwuYyBcCisJcXVhbnRpemUuYyBcCisJcXVhbnRpemVfcHZ0LmMgXAorCXJlc2Vydm9pci5jIFwKKwlzZXRfZ2V0LmMgXAorCXRhYmxlcy5jIFwKKwl0YWtlaGlyby5jIFwKKwl1dGlsLmMgXAorCXZicnF1YW50aXplLmMgXAorCXZlcnNpb24uYyBcCisJbXBnbGliX2ludGVyZmFjZS5jCisKK25vaW5zdF9IRUFERVJTID0gXAorCVZiclRhZy5oIFwKKwliaXRzdHJlYW0uaCBcCisJZW5jb2Rlci5oIFwKKwlmZnQuaCBcCisJZ2Fpbl9hbmFseXNpcy5oIFwKKwlpZDN0YWcuaCBcCisJbDNzaWRlLmggXAorCWxhbWUtYW5hbHlzaXMuaCBcCisJbGFtZV9nbG9iYWxfZmxhZ3MuaCBcCisJbWFjaGluZS5oIFwKKwluZXdtZGN0LmggXAorCXBzeW1vZGVsLmggXAorCXF1YW50aXplLmggIFwKKwlxdWFudGl6ZV9wdnQuaCBcCisJcmVzZXJ2b2lyLmggXAorCXNldF9nZXQuaCBcCisJdGFibGVzLmggXAorCXV0aWwuaCBcCisJdmJycXVhbnRpemUuaCBcCisJdmVyc2lvbi5oCisKK0NMRUFORklMRVMgPSBsY2xpbnQudHh0CitMQ0xJTlRGTEFHUyA9IFwKKwkrcG9zaXhsaWIgXAorCStzaG93c3VtbWFyeSBcCisJK3Nob3dhbGx1c2VzIFwKKwkrd2hpY2hsaWIgXAorCStmb3JjZWhpbnRzIFwKKwktZml4ZWRmb3JtYWxhcnJheSBcCisJK21hdGNoYW55aW50ZWdyYWwgXAorCS1EbGludAorCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbGlibXAzbGFtZS9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbGlibXAzbGFtZS9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAoraW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChsaWJkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChsaWJkaXIpIgorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgICAgZWNobyAiICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChsaWJMVExJQlJBUklFU19JTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJyQkcCcgJyQoREVTVERJUikkKGxpYmRpcikvJCRmJyI7IFwKKwkgICAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKGxpYkxUTElCUkFSSUVTX0lOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAiJCRwIiAiJChERVNURElSKSQobGliZGlyKS8kJGYiOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBwPSQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQobGliZGlyKS8kJHAnIjsgXAorCSAgJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICIkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKKwlkb25lCisKK2NsZWFuLWxpYkxUTElCUkFSSUVTOgorCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGRpcj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfC9bXi9dKiQkfHwnYCI7IFwKKwkgIHRlc3QgIiQkZGlyIiAhPSAiJCRwIiB8fCBkaXI9LjsgXAorCSAgZWNobyAicm0gLWYgXCIkJHtkaXJ9L3NvX2xvY2F0aW9uc1wiIjsgXAorCSAgcm0gLWYgIiQke2Rpcn0vc29fbG9jYXRpb25zIjsgXAorCWRvbmUKK2xpYm1wM2xhbWUubGE6ICQobGlibXAzbGFtZV9sYV9PQkpFQ1RTKSAkKGxpYm1wM2xhbWVfbGFfREVQRU5ERU5DSUVTKSAKKwkkKGxpYm1wM2xhbWVfbGFfTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYm1wM2xhbWVfbGFfT0JKRUNUUykgJChsaWJtcDNsYW1lX2xhX0xJQkFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworJCh0b3Bfc3JjZGlyKS9hbnNpMmtucjoKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIC4vYW5zaTJrbnIKKworbW9zdGx5Y2xlYW4ta3I6CisJLXRlc3QgIiRVIiA9ICIiIHx8IHJtIC1mICpfLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL1ZiclRhZyRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYml0c3RyZWFtJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9lbmNvZGVyJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9mZnQkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dhaW5fYW5hbHlzaXMkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2lkM3RhZyRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGFtZSRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbXBnbGliX2ludGVyZmFjZSRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbmV3bWRjdCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlc2V0cyRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHN5bW9kZWwkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3F1YW50aXplJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9xdWFudGl6ZV9wdnQkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Jlc2Vydm9pciRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2V0X2dldCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGFibGVzJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90YWtlaGlybyRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdXRpbCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdmJycXVhbnRpemUkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ZlcnNpb24kVS5QbG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKK1ZiclRhZ18uYzogVmJyVGFnLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9WYnJUYWcuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9WYnJUYWcuYzsgZWxzZSBlY2hvIFZiclRhZy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitiaXRzdHJlYW1fLmM6IGJpdHN0cmVhbS5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvYml0c3RyZWFtLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvYml0c3RyZWFtLmM7IGVsc2UgZWNobyBiaXRzdHJlYW0uYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorZW5jb2Rlcl8uYzogZW5jb2Rlci5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvZW5jb2Rlci5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2VuY29kZXIuYzsgZWxzZSBlY2hvIGVuY29kZXIuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorZmZ0Xy5jOiBmZnQuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2ZmdC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2ZmdC5jOyBlbHNlIGVjaG8gZmZ0LmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2dhaW5fYW5hbHlzaXNfLmM6IGdhaW5fYW5hbHlzaXMuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2dhaW5fYW5hbHlzaXMuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9nYWluX2FuYWx5c2lzLmM7IGVsc2UgZWNobyBnYWluX2FuYWx5c2lzLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2lkM3RhZ18uYzogaWQzdGFnLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9pZDN0YWcuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9pZDN0YWcuYzsgZWxzZSBlY2hvIGlkM3RhZy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitsYW1lXy5jOiBsYW1lLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9sYW1lLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvbGFtZS5jOyBlbHNlIGVjaG8gbGFtZS5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACittcGdsaWJfaW50ZXJmYWNlXy5jOiBtcGdsaWJfaW50ZXJmYWNlLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9tcGdsaWJfaW50ZXJmYWNlLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvbXBnbGliX2ludGVyZmFjZS5jOyBlbHNlIGVjaG8gbXBnbGliX2ludGVyZmFjZS5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACituZXdtZGN0Xy5jOiBuZXdtZGN0LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9uZXdtZGN0LmM7IHRoZW4gZWNobyAkKHNyY2RpcikvbmV3bWRjdC5jOyBlbHNlIGVjaG8gbmV3bWRjdC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitwcmVzZXRzXy5jOiBwcmVzZXRzLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9wcmVzZXRzLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvcHJlc2V0cy5jOyBlbHNlIGVjaG8gcHJlc2V0cy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitwc3ltb2RlbF8uYzogcHN5bW9kZWwuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3BzeW1vZGVsLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvcHN5bW9kZWwuYzsgZWxzZSBlY2hvIHBzeW1vZGVsLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3F1YW50aXplXy5jOiBxdWFudGl6ZS5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvcXVhbnRpemUuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9xdWFudGl6ZS5jOyBlbHNlIGVjaG8gcXVhbnRpemUuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorcXVhbnRpemVfcHZ0Xy5jOiBxdWFudGl6ZV9wdnQuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3F1YW50aXplX3B2dC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3F1YW50aXplX3B2dC5jOyBlbHNlIGVjaG8gcXVhbnRpemVfcHZ0LmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3Jlc2Vydm9pcl8uYzogcmVzZXJ2b2lyLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9yZXNlcnZvaXIuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9yZXNlcnZvaXIuYzsgZWxzZSBlY2hvIHJlc2Vydm9pci5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitzZXRfZ2V0Xy5jOiBzZXRfZ2V0LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9zZXRfZ2V0LmM7IHRoZW4gZWNobyAkKHNyY2Rpcikvc2V0X2dldC5jOyBlbHNlIGVjaG8gc2V0X2dldC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACit0YWJsZXNfLmM6IHRhYmxlcy5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvdGFibGVzLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvdGFibGVzLmM7IGVsc2UgZWNobyB0YWJsZXMuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAordGFrZWhpcm9fLmM6IHRha2VoaXJvLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS90YWtlaGlyby5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3Rha2VoaXJvLmM7IGVsc2UgZWNobyB0YWtlaGlyby5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACit1dGlsXy5jOiB1dGlsLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS91dGlsLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvdXRpbC5jOyBlbHNlIGVjaG8gdXRpbC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACit2YnJxdWFudGl6ZV8uYzogdmJycXVhbnRpemUuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3ZicnF1YW50aXplLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvdmJycXVhbnRpemUuYzsgZWxzZSBlY2hvIHZicnF1YW50aXplLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3ZlcnNpb25fLmM6IHZlcnNpb24uYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3ZlcnNpb24uYzsgdGhlbiBlY2hvICQoc3JjZGlyKS92ZXJzaW9uLmM7IGVsc2UgZWNobyB2ZXJzaW9uLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK1ZiclRhZ18uJChPQkpFWFQpIFZiclRhZ18ubG8gYml0c3RyZWFtXy4kKE9CSkVYVCkgYml0c3RyZWFtXy5sbyBcCitlbmNvZGVyXy4kKE9CSkVYVCkgZW5jb2Rlcl8ubG8gZmZ0Xy4kKE9CSkVYVCkgZmZ0Xy5sbyBcCitnYWluX2FuYWx5c2lzXy4kKE9CSkVYVCkgZ2Fpbl9hbmFseXNpc18ubG8gaWQzdGFnXy4kKE9CSkVYVCkgXAoraWQzdGFnXy5sbyBsYW1lXy4kKE9CSkVYVCkgbGFtZV8ubG8gbXBnbGliX2ludGVyZmFjZV8uJChPQkpFWFQpIFwKK21wZ2xpYl9pbnRlcmZhY2VfLmxvIG5ld21kY3RfLiQoT0JKRVhUKSBuZXdtZGN0Xy5sbyBwcmVzZXRzXy4kKE9CSkVYVCkgXAorcHJlc2V0c18ubG8gcHN5bW9kZWxfLiQoT0JKRVhUKSBwc3ltb2RlbF8ubG8gcXVhbnRpemVfLiQoT0JKRVhUKSBcCitxdWFudGl6ZV8ubG8gcXVhbnRpemVfcHZ0Xy4kKE9CSkVYVCkgcXVhbnRpemVfcHZ0Xy5sbyBcCityZXNlcnZvaXJfLiQoT0JKRVhUKSByZXNlcnZvaXJfLmxvIHNldF9nZXRfLiQoT0JKRVhUKSBzZXRfZ2V0Xy5sbyBcCit0YWJsZXNfLiQoT0JKRVhUKSB0YWJsZXNfLmxvIHRha2VoaXJvXy4kKE9CSkVYVCkgdGFrZWhpcm9fLmxvIFwKK3V0aWxfLiQoT0JKRVhUKSB1dGlsXy5sbyB2YnJxdWFudGl6ZV8uJChPQkpFWFQpIHZicnF1YW50aXplXy5sbyBcCit2ZXJzaW9uXy4kKE9CSkVYVCkgdmVyc2lvbl8ubG8gOiAkKEFOU0kyS05SKQorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6CisJQGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PS47IFwKKwllbHNlIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PTsgXAorCWZpOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCisJICAgICAgdGFncz0iJCR0YWdzICQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCWxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICAgIGRpc3RkaXI9YCQoYW1fX2NkKSAkKGRpc3RkaXIpICYmIHB3ZGA7IFwKKwkgICAgdG9wX2Rpc3RkaXI9YCQoYW1fX2NkKSAkKHRvcF9kaXN0ZGlyKSAmJiBwd2RgOyBcCisJICAgIChjZCAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkdG9wX2Rpc3RkaXIiIFwKKwkgICAgICAgIGRpc3RkaXI9IiQkZGlzdGRpci8kJHN1YmRpciIgXAorCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCisJCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKEhFQURFUlMpCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChsaWJkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06CisKK3BzOiBwcy1yZWN1cnNpdmUKKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKKy5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAorCWFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBjdGFncyBjdGFncy1yZWN1cnNpdmUgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworCisjIGVuZCBnbG9iYWwgc2VjdGlvbgorCitsY2xpbnQudHh0OiAke2xpYm1wM2xhbWVfbGFfU09VUkNFU30gJHtub2luc3RfSEVBREVSU30KKwlAbGNsaW50ICR7TENMSU5URkxBR1N9ICR7SU5DTFVERVN9ICR7REVGU30gJHtsaWJtcDNsYW1lX2xhX1NPVVJDRVN9IDI+JjEgPmxjbGludC50eHQgfHwgdHJ1ZQorCitsY2xpbnQ6IGxjbGludC50eHQKKwltb3JlIGxjbGludC50eHQKKworIyQoT0JKRUNUUyk6IGxpYnRvb2wKKyNsaWJ0b29sOiAkKExJQlRPT0xfREVQUykKKyMJJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL1ZiclRhZy5jIGIvbGlibXAzbGFtZS9WYnJUYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWFmOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9WYnJUYWcuYwpAQCAtMCwwICsxLDEwNTggQEAKKy8qCisgKiAgICAgIFhpbmcgVkJSIHRhZ2dpbmcgZm9yIExBTUUuCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgQS5MLiBGYWJlcgorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgSm9uYXRoYW4gRGVlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qICRJZDogVmJyVGFnLmMsdiAxLjk0LjIuMiAyMDEwLzAyLzIwIDIxOjAxOjQ5IHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGFtZS5oIgorI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNpbmNsdWRlICJlbmNvZGVyLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImJpdHN0cmVhbS5oIgorI2luY2x1ZGUgIlZiclRhZy5oIgorI2luY2x1ZGUgImxhbWVfZ2xvYmFsX2ZsYWdzLmgiCisKKyNpZmRlZiBfX3N1bl9fCisvKiB3b3Jhcm91bmQgZm9yIFN1bk9TIDQueCwgaXQgaGFzIFNFRUtfKiBkZWZpbmVkIGhlcmUgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisKKyNpZmRlZiBfREVCVUcKKy8qICAjZGVmaW5lIERFQlVHX1ZCUlRBRyAqLworI2VuZGlmCisKKy8qCisgKiAgICA0IGJ5dGVzIGZvciBIZWFkZXIgVGFnCisgKiAgICA0IGJ5dGVzIGZvciBIZWFkZXIgRmxhZ3MKKyAqICAxMDAgYnl0ZXMgZm9yIGVudHJ5IChOVU1UT0NFTlRSSUVTKQorICogICAgNCBieXRlcyBmb3IgRlJBTUUgU0laRQorICogICAgNCBieXRlcyBmb3IgU1RSRUFNX1NJWkUKKyAqICAgIDQgYnl0ZXMgZm9yIFZCUiBTQ0FMRS4gYSBWQlIgcXVhbGl0eSBpbmRpY2F0b3I6IDA9YmVzdCAxMDA9d29yc3QKKyAqICAgMjAgYnl0ZXMgZm9yIExBTUUgdGFnLiAgZm9yIGV4YW1wbGUsICJMQU1FMy4xMiAoYmV0YSA2KSIKKyAqIF9fX19fX19fX19fCisgKiAgMTQwIGJ5dGVzCisqLworI2RlZmluZSBWQlJIRUFERVJTSVpFIChOVU1UT0NFTlRSSUVTKzQrNCs0KzQrNCkKKworI2RlZmluZSBMQU1FSEVBREVSU0laRSAoVkJSSEVBREVSU0laRSArIDkgKyAxICsgMSArIDggKyAxICsgMSArIDMgKyAxICsgMSArIDIgKyA0ICsgMiArIDIpCisKKy8qIHRoZSBzaXplIG9mIHRoZSBYaW5nIGhlYWRlciAoTVBFRzEgYW5kIE1QRUcyKSBpbiBrYnBzICovCisjZGVmaW5lIFhJTkdfQklUUkFURTEgMTI4CisjZGVmaW5lIFhJTkdfQklUUkFURTIgIDY0CisjZGVmaW5lIFhJTkdfQklUUkFURTI1IDMyCisKKworCitzdGF0aWMgY29uc3QgY2hhciBWQlJUYWcwW10gPSB7ICJYaW5nIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgVkJSVGFnMVtdID0geyAiSW5mbyIgfTsKKworCisKKworLyogTG9va3VwIHRhYmxlIGZvciBmYXN0IENSQyBjb21wdXRhdGlvbgorICogU2VlICdDUkNfdXBkYXRlX2xvb2t1cCcKKyAqIFVzZXMgdGhlIHBvbHlub21pYWwgeF4xNit4XjE1K3heMisxICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3JjMTZfbG9va3VwWzI1Nl0gPSB7CisgICAgMHgwMDAwLCAweEMwQzEsIDB4QzE4MSwgMHgwMTQwLCAweEMzMDEsIDB4MDNDMCwgMHgwMjgwLCAweEMyNDEsCisgICAgMHhDNjAxLCAweDA2QzAsIDB4MDc4MCwgMHhDNzQxLCAweDA1MDAsIDB4QzVDMSwgMHhDNDgxLCAweDA0NDAsCisgICAgMHhDQzAxLCAweDBDQzAsIDB4MEQ4MCwgMHhDRDQxLCAweDBGMDAsIDB4Q0ZDMSwgMHhDRTgxLCAweDBFNDAsCisgICAgMHgwQTAwLCAweENBQzEsIDB4Q0I4MSwgMHgwQjQwLCAweEM5MDEsIDB4MDlDMCwgMHgwODgwLCAweEM4NDEsCisgICAgMHhEODAxLCAweDE4QzAsIDB4MTk4MCwgMHhEOTQxLCAweDFCMDAsIDB4REJDMSwgMHhEQTgxLCAweDFBNDAsCisgICAgMHgxRTAwLCAweERFQzEsIDB4REY4MSwgMHgxRjQwLCAweEREMDEsIDB4MURDMCwgMHgxQzgwLCAweERDNDEsCisgICAgMHgxNDAwLCAweEQ0QzEsIDB4RDU4MSwgMHgxNTQwLCAweEQ3MDEsIDB4MTdDMCwgMHgxNjgwLCAweEQ2NDEsCisgICAgMHhEMjAxLCAweDEyQzAsIDB4MTM4MCwgMHhEMzQxLCAweDExMDAsIDB4RDFDMSwgMHhEMDgxLCAweDEwNDAsCisgICAgMHhGMDAxLCAweDMwQzAsIDB4MzE4MCwgMHhGMTQxLCAweDMzMDAsIDB4RjNDMSwgMHhGMjgxLCAweDMyNDAsCisgICAgMHgzNjAwLCAweEY2QzEsIDB4Rjc4MSwgMHgzNzQwLCAweEY1MDEsIDB4MzVDMCwgMHgzNDgwLCAweEY0NDEsCisgICAgMHgzQzAwLCAweEZDQzEsIDB4RkQ4MSwgMHgzRDQwLCAweEZGMDEsIDB4M0ZDMCwgMHgzRTgwLCAweEZFNDEsCisgICAgMHhGQTAxLCAweDNBQzAsIDB4M0I4MCwgMHhGQjQxLCAweDM5MDAsIDB4RjlDMSwgMHhGODgxLCAweDM4NDAsCisgICAgMHgyODAwLCAweEU4QzEsIDB4RTk4MSwgMHgyOTQwLCAweEVCMDEsIDB4MkJDMCwgMHgyQTgwLCAweEVBNDEsCisgICAgMHhFRTAxLCAweDJFQzAsIDB4MkY4MCwgMHhFRjQxLCAweDJEMDAsIDB4RURDMSwgMHhFQzgxLCAweDJDNDAsCisgICAgMHhFNDAxLCAweDI0QzAsIDB4MjU4MCwgMHhFNTQxLCAweDI3MDAsIDB4RTdDMSwgMHhFNjgxLCAweDI2NDAsCisgICAgMHgyMjAwLCAweEUyQzEsIDB4RTM4MSwgMHgyMzQwLCAweEUxMDEsIDB4MjFDMCwgMHgyMDgwLCAweEUwNDEsCisgICAgMHhBMDAxLCAweDYwQzAsIDB4NjE4MCwgMHhBMTQxLCAweDYzMDAsIDB4QTNDMSwgMHhBMjgxLCAweDYyNDAsCisgICAgMHg2NjAwLCAweEE2QzEsIDB4QTc4MSwgMHg2NzQwLCAweEE1MDEsIDB4NjVDMCwgMHg2NDgwLCAweEE0NDEsCisgICAgMHg2QzAwLCAweEFDQzEsIDB4QUQ4MSwgMHg2RDQwLCAweEFGMDEsIDB4NkZDMCwgMHg2RTgwLCAweEFFNDEsCisgICAgMHhBQTAxLCAweDZBQzAsIDB4NkI4MCwgMHhBQjQxLCAweDY5MDAsIDB4QTlDMSwgMHhBODgxLCAweDY4NDAsCisgICAgMHg3ODAwLCAweEI4QzEsIDB4Qjk4MSwgMHg3OTQwLCAweEJCMDEsIDB4N0JDMCwgMHg3QTgwLCAweEJBNDEsCisgICAgMHhCRTAxLCAweDdFQzAsIDB4N0Y4MCwgMHhCRjQxLCAweDdEMDAsIDB4QkRDMSwgMHhCQzgxLCAweDdDNDAsCisgICAgMHhCNDAxLCAweDc0QzAsIDB4NzU4MCwgMHhCNTQxLCAweDc3MDAsIDB4QjdDMSwgMHhCNjgxLCAweDc2NDAsCisgICAgMHg3MjAwLCAweEIyQzEsIDB4QjM4MSwgMHg3MzQwLCAweEIxMDEsIDB4NzFDMCwgMHg3MDgwLCAweEIwNDEsCisgICAgMHg1MDAwLCAweDkwQzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNDMCwgMHg1MjgwLCAweDkyNDEsCisgICAgMHg5NjAxLCAweDU2QzAsIDB4NTc4MCwgMHg5NzQxLCAweDU1MDAsIDB4OTVDMSwgMHg5NDgxLCAweDU0NDAsCisgICAgMHg5QzAxLCAweDVDQzAsIDB4NUQ4MCwgMHg5RDQxLCAweDVGMDAsIDB4OUZDMSwgMHg5RTgxLCAweDVFNDAsCisgICAgMHg1QTAwLCAweDlBQzEsIDB4OUI4MSwgMHg1QjQwLCAweDk5MDEsIDB4NTlDMCwgMHg1ODgwLCAweDk4NDEsCisgICAgMHg4ODAxLCAweDQ4QzAsIDB4NDk4MCwgMHg4OTQxLCAweDRCMDAsIDB4OEJDMSwgMHg4QTgxLCAweDRBNDAsCisgICAgMHg0RTAwLCAweDhFQzEsIDB4OEY4MSwgMHg0RjQwLCAweDhEMDEsIDB4NERDMCwgMHg0QzgwLCAweDhDNDEsCisgICAgMHg0NDAwLCAweDg0QzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdDMCwgMHg0NjgwLCAweDg2NDEsCisgICAgMHg4MjAxLCAweDQyQzAsIDB4NDM4MCwgMHg4MzQxLCAweDQxMDAsIDB4ODFDMSwgMHg4MDgxLCAweDQwNDAKK307CisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgUm9iZXJ0IEhlZ2VtYW5uIDIwMDEtMDEtMTcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2FkZFZicihWQlJfc2Vla19pbmZvX3QgKiB2LCBpbnQgYml0cmF0ZSkKK3sKKyAgICBpbnQgICAgIGk7CisKKyAgICB2LT5uVmJyTnVtRnJhbWVzKys7CisgICAgdi0+c3VtICs9IGJpdHJhdGU7CisgICAgdi0+c2VlbisrOworCisgICAgaWYgKHYtPnNlZW4gPCB2LT53YW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodi0+cG9zIDwgdi0+c2l6ZSkgeworICAgICAgICB2LT5iYWdbdi0+cG9zXSA9IHYtPnN1bTsKKyAgICAgICAgdi0+cG9zKys7CisgICAgICAgIHYtPnNlZW4gPSAwOworICAgIH0KKyAgICBpZiAodi0+cG9zID09IHYtPnNpemUpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHYtPnNpemU7IGkgKz0gMikgeworICAgICAgICAgICAgdi0+YmFnW2kgLyAyXSA9IHYtPmJhZ1tpXTsKKyAgICAgICAgfQorICAgICAgICB2LT53YW50ICo9IDI7CisgICAgICAgIHYtPnBvcyAvPSAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK1hpbmdfc2Vla190YWJsZShWQlJfc2Vla19pbmZvX3QgKiB2LCB1bnNpZ25lZCBjaGFyICp0KQoreworICAgIGludCAgICAgaSwgaW5keDsKKyAgICBpbnQgICAgIHNlZWtfcG9pbnQ7CisKKyAgICBpZiAodi0+cG9zIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDE7IGkgPCBOVU1UT0NFTlRSSUVTOyArK2kpIHsKKyAgICAgICAgZmxvYXQgICBqID0gaSAvIChmbG9hdCkgTlVNVE9DRU5UUklFUywgYWN0LCBzdW07CisgICAgICAgIGluZHggPSAoaW50KSAoZmxvb3IoaiAqIHYtPnBvcykpOworICAgICAgICBpZiAoaW5keCA+IHYtPnBvcyAtIDEpCisgICAgICAgICAgICBpbmR4ID0gdi0+cG9zIC0gMTsKKyAgICAgICAgYWN0ID0gdi0+YmFnW2luZHhdOworICAgICAgICBzdW0gPSB2LT5zdW07CisgICAgICAgIHNlZWtfcG9pbnQgPSAoaW50KSAoMjU2LiAqIGFjdCAvIHN1bSk7CisgICAgICAgIGlmIChzZWVrX3BvaW50ID4gMjU1KQorICAgICAgICAgICAgc2Vla19wb2ludCA9IDI1NTsKKyAgICAgICAgdFtpXSA9IHNlZWtfcG9pbnQ7CisgICAgfQorfQorCisjaWZkZWYgREVCVUdfVkJSX1NFRUtJTkdfVEFCTEUKK3N0YXRpYyB2b2lkCitwcmludF9zZWVraW5nKHVuc2lnbmVkIGNoYXIgKnQpCit7CisgICAgaW50ICAgICBpOworCisgICAgcHJpbnRmKCJzZWVraW5nIHRhYmxlICIpOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1UT0NFTlRSSUVTOyArK2kpIHsKKyAgICAgICAgcHJpbnRmKCIgJWQgIiwgdFtpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGRWYnJGcmFtZTogQWRkIFZCUiBlbnRyeSwgdXNlZCB0byBmaWxsIHRoZSBWQlIgdGhlIFRPQyBlbnRyaWVzCisgKiBQYXJhbXRlcnM6CisgKiAgICAgIG5TdHJlYW1Qb3M6IGhvdyBtYW55IGJ5dGVzIGRpZCB3ZSB3cml0ZSB0byB0aGUgYml0c3RyZWFtIHNvIGZhcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gQnl0ZXMgTk9UIEJpdHMpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQKK0FkZFZickZyYW1lKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisKKyAgICBpbnQgICAgIGticHMgPSBiaXRyYXRlX3RhYmxlW2dmcC0+dmVyc2lvbl1bZ2ZjLT5iaXRyYXRlX2luZGV4XTsKKyAgICBhc3NlcnQoZ2ZjLT5WQlJfc2Vla190YWJsZS5iYWcpOworICAgIGFkZFZicigmZ2ZjLT5WQlJfc2Vla190YWJsZSwga2Jwcyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQKK0V4dHJhY3RJNCh1bnNpZ25lZCBjaGFyICpidWYpCit7CisgICAgaW50ICAgICB4OworICAgIC8qIGJpZyBlbmRpYW4gZXh0cmFjdCAqLworICAgIHggPSBidWZbMF07CisgICAgeCA8PD0gODsKKyAgICB4IHw9IGJ1ZlsxXTsKKyAgICB4IDw8PSA4OworICAgIHggfD0gYnVmWzJdOworICAgIHggPDw9IDg7CisgICAgeCB8PSBidWZbM107CisgICAgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB2b2lkCitDcmVhdGVJNCh1bnNpZ25lZCBjaGFyICpidWYsIGludCBuVmFsdWUpCit7CisgICAgLyogYmlnIGVuZGlhbiBjcmVhdGUgKi8KKyAgICBidWZbMF0gPSAoblZhbHVlID4+IDI0KSAmIDB4ZmY7CisgICAgYnVmWzFdID0gKG5WYWx1ZSA+PiAxNikgJiAweGZmOworICAgIGJ1ZlsyXSA9IChuVmFsdWUgPj4gOCkgJiAweGZmOworICAgIGJ1ZlszXSA9IChuVmFsdWUpICYgMHhmZjsKK30KKworCisKK3N0YXRpYyB2b2lkCitDcmVhdGVJMih1bnNpZ25lZCBjaGFyICpidWYsIGludCBuVmFsdWUpCit7CisgICAgLyogYmlnIGVuZGlhbiBjcmVhdGUgKi8KKyAgICBidWZbMF0gPSAoblZhbHVlID4+IDgpICYgMHhmZjsKKyAgICBidWZbMV0gPSAoblZhbHVlKSAmIDB4ZmY7Cit9CisKKy8qIGNoZWNrIGZvciBtYWdpYyBzdHJpbmdzKi8KK3N0YXRpYyBpbnQKK0lzVmJyVGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKyAgICBpbnQgICAgIGlzVGFnMCwgaXNUYWcxOworCisgICAgaXNUYWcwID0gKChidWZbMF0gPT0gVkJSVGFnMFswXSkgJiYgKGJ1ZlsxXSA9PSBWQlJUYWcwWzFdKSAmJiAoYnVmWzJdID09IFZCUlRhZzBbMl0pCisgICAgICAgICAgICAgICYmIChidWZbM10gPT0gVkJSVGFnMFszXSkpOworICAgIGlzVGFnMSA9ICgoYnVmWzBdID09IFZCUlRhZzFbMF0pICYmIChidWZbMV0gPT0gVkJSVGFnMVsxXSkgJiYgKGJ1ZlsyXSA9PSBWQlJUYWcxWzJdKQorICAgICAgICAgICAgICAmJiAoYnVmWzNdID09IFZCUlRhZzFbM10pKTsKKworICAgIHJldHVybiAoaXNUYWcwIHx8IGlzVGFnMSk7Cit9CisKKyNkZWZpbmUgU0hJRlRfSU5fQklUU19WQUxVRSh4LG4sdikgKCB4ID0gKHggPDwgKG4pKSB8ICggKHYpICYgfigtMSA8PCAobikpICkgKQorCitzdGF0aWMgdm9pZAorc2V0TGFtZVRhZ0ZyYW1lSGVhZGVyKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGNoYXIgICAgYWJ5dGUsIGJieXRlOworCisgICAgU0hJRlRfSU5fQklUU19WQUxVRShidWZmZXJbMF0sIDh1LCAweGZmdSk7CisKKyAgICBTSElGVF9JTl9CSVRTX1ZBTFVFKGJ1ZmZlclsxXSwgM3UsIDcpOworICAgIFNISUZUX0lOX0JJVFNfVkFMVUUoYnVmZmVyWzFdLCAxdSwgKGdmcC0+b3V0X3NhbXBsZXJhdGUgPCAxNjAwMCkgPyAwIDogMSk7CisgICAgU0hJRlRfSU5fQklUU19WQUxVRShidWZmZXJbMV0sIDF1LCBnZnAtPnZlcnNpb24pOworICAgIFNISUZUX0lOX0JJVFNfVkFMVUUoYnVmZmVyWzFdLCAydSwgNCAtIDMpOworICAgIFNISUZUX0lOX0JJVFNfVkFMVUUoYnVmZmVyWzFdLCAxdSwgKCFnZnAtPmVycm9yX3Byb3RlY3Rpb24pID8gMSA6IDApOworCisgICAgU0hJRlRfSU5fQklUU19WQUxVRShidWZmZXJbMl0sIDR1LCBnZmMtPmJpdHJhdGVfaW5kZXgpOworICAgIFNISUZUX0lOX0JJVFNfVkFMVUUoYnVmZmVyWzJdLCAydSwgZ2ZjLT5zYW1wbGVyYXRlX2luZGV4KTsKKyAgICBTSElGVF9JTl9CSVRTX1ZBTFVFKGJ1ZmZlclsyXSwgMXUsIDApOworICAgIFNISUZUX0lOX0JJVFNfVkFMVUUoYnVmZmVyWzJdLCAxdSwgZ2ZwLT5leHRlbnNpb24pOworCisgICAgU0hJRlRfSU5fQklUU19WQUxVRShidWZmZXJbM10sIDJ1LCBnZnAtPm1vZGUpOworICAgIFNISUZUX0lOX0JJVFNfVkFMVUUoYnVmZmVyWzNdLCAydSwgZ2ZjLT5tb2RlX2V4dCk7CisgICAgU0hJRlRfSU5fQklUU19WQUxVRShidWZmZXJbM10sIDF1LCBnZnAtPmNvcHlyaWdodCk7CisgICAgU0hJRlRfSU5fQklUU19WQUxVRShidWZmZXJbM10sIDF1LCBnZnAtPm9yaWdpbmFsKTsKKyAgICBTSElGVF9JTl9CSVRTX1ZBTFVFKGJ1ZmZlclszXSwgMnUsIGdmcC0+ZW1waGFzaXMpOworCisgICAgLyogdGhlIGRlZmF1bHQgVkJSIGhlYWRlci4gNDgga2JwcyBsYXllciBJSUksIG5vIHBhZGRpbmcsIG5vIGNyYyAqLworICAgIC8qIGJ1dCBzYW1wbGluZyBmcmVxLCBtb2RlIGFuZHkgY29weXJpZ2h0L2NvcHkgcHJvdGVjdGlvbiB0YWtlbiAqLworICAgIC8qIGZyb20gZmlyc3QgdmFsaWQgZnJhbWUgKi8KKyAgICBidWZmZXJbMF0gPSAodWludDhfdCkgMHhmZjsKKyAgICBhYnl0ZSA9IChidWZmZXJbMV0gJiAodW5zaWduZWQgY2hhcikgMHhmMSk7CisgICAgeworICAgICAgICBpbnQgICAgIGJpdHJhdGU7CisgICAgICAgIGlmICgxID09IGdmcC0+dmVyc2lvbikgeworICAgICAgICAgICAgYml0cmF0ZSA9IFhJTkdfQklUUkFURTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSA8IDE2MDAwKQorICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBYSU5HX0JJVFJBVEUyNTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiaXRyYXRlID0gWElOR19CSVRSQVRFMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZnAtPlZCUiA9PSB2YnJfb2ZmKQorICAgICAgICAgICAgYml0cmF0ZSA9IGdmcC0+YnJhdGU7CisKKyAgICAgICAgaWYgKGdmcC0+ZnJlZV9mb3JtYXQpCisgICAgICAgICAgICBiYnl0ZSA9IDB4MDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJieXRlID0gMTYgKiBCaXRyYXRlSW5kZXgoYml0cmF0ZSwgZ2ZwLT52ZXJzaW9uLCBnZnAtPm91dF9zYW1wbGVyYXRlKTsKKyAgICB9CisKKyAgICAvKiBVc2UgYXMgbXVjaCBvZiB0aGUgaW5mbyBmcm9tIHRoZSByZWFsIGZyYW1lcyBpbiB0aGUKKyAgICAgKiBYaW5nIGhlYWRlcjogIHNhbXBsZXJhdGUsIGNoYW5uZWxzLCBjcmMsIGV0Yy4uLgorICAgICAqLworICAgIGlmIChnZnAtPnZlcnNpb24gPT0gMSkgeworICAgICAgICAvKiBNUEVHMSAqLworICAgICAgICBidWZmZXJbMV0gPSBhYnl0ZSB8IChjaGFyKSAweDBhOyAvKiB3YXMgMHgwYjsgKi8KKyAgICAgICAgYWJ5dGUgPSBidWZmZXJbMl0gJiAoY2hhcikgMHgwZDsgLyogQUYga2VlcCBhbHNvIHByaXZhdGUgYml0ICovCisgICAgICAgIGJ1ZmZlclsyXSA9IChjaGFyKSBiYnl0ZSB8IGFieXRlOyAvKiA2NGticyBNUEVHMSBmcmFtZSAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogTVBFRzIgKi8KKyAgICAgICAgYnVmZmVyWzFdID0gYWJ5dGUgfCAoY2hhcikgMHgwMjsgLyogd2FzIDB4MDM7ICovCisgICAgICAgIGFieXRlID0gYnVmZmVyWzJdICYgKGNoYXIpIDB4MGQ7IC8qIEFGIGtlZXAgYWxzbyBwcml2YXRlIGJpdCAqLworICAgICAgICBidWZmZXJbMl0gPSAoY2hhcikgYmJ5dGUgfCBhYnl0ZTsgLyogNjRrYnMgTVBFRzIgZnJhbWUgKi8KKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTYW1lIGFzIEdldFZiclRhZyBiZWxvdywgYnV0IG9ubHkgY2hlY2tzIGZvciB0aGUgWGluZyB0YWcuCisgICByZXF1aXJlcyBidWYgdG8gY29udGFpbiBvbmx5IDQwIGJ5dGVzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CitDaGVja1ZiclRhZyh1bnNpZ25lZCBjaGFyICpidWYpCit7CisgICAgaW50ICAgICBoX2lkLCBoX21vZGU7CisKKyAgICAvKiBnZXQgc2VsZWN0ZWQgTVBFRyBoZWFkZXIgZGF0YSAqLworICAgIGhfaWQgPSAoYnVmWzFdID4+IDMpICYgMTsKKyAgICBoX21vZGUgPSAoYnVmWzNdID4+IDYpICYgMzsKKworICAgIC8qICBkZXRlcm1pbmUgb2Zmc2V0IG9mIGhlYWRlciAqLworICAgIGlmIChoX2lkKSB7CisgICAgICAgIC8qIG1wZWcxICovCisgICAgICAgIGlmIChoX21vZGUgIT0gMykKKyAgICAgICAgICAgIGJ1ZiArPSAoMzIgKyA0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmICs9ICgxNyArIDQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogbXBlZzIgKi8KKyAgICAgICAgaWYgKGhfbW9kZSAhPSAzKQorICAgICAgICAgICAgYnVmICs9ICgxNyArIDQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYgKz0gKDkgKyA0KTsKKyAgICB9CisKKyAgICByZXR1cm4gSXNWYnJUYWcoYnVmKTsKK30KKworaW50CitHZXRWYnJUYWcoVkJSVEFHREFUQSAqIHBUYWdEYXRhLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisgICAgaW50ICAgICBpLCBoZWFkX2ZsYWdzOworICAgIGludCAgICAgaF9iaXRyYXRlLCBoX2lkLCBoX21vZGUsIGhfc3JfaW5kZXg7CisgICAgaW50ICAgICBlbmNfZGVsYXksIGVuY19wYWRkaW5nOworCisgICAgLyogZ2V0IFZiciBoZWFkZXIgZGF0YSAqLworICAgIHBUYWdEYXRhLT5mbGFncyA9IDA7CisKKyAgICAvKiBnZXQgc2VsZWN0ZWQgTVBFRyBoZWFkZXIgZGF0YSAqLworICAgIGhfaWQgPSAoYnVmWzFdID4+IDMpICYgMTsKKyAgICBoX3NyX2luZGV4ID0gKGJ1ZlsyXSA+PiAyKSAmIDM7CisgICAgaF9tb2RlID0gKGJ1ZlszXSA+PiA2KSAmIDM7CisgICAgaF9iaXRyYXRlID0gKChidWZbMl0gPj4gNCkgJiAweGYpOworICAgIGhfYml0cmF0ZSA9IGJpdHJhdGVfdGFibGVbaF9pZF1baF9iaXRyYXRlXTsKKworICAgIC8qIGNoZWNrIGZvciBGRkUgc3luY3dvcmQgKi8KKyAgICBpZiAoKGJ1ZlsxXSA+PiA0KSA9PSAweEUpCisgICAgICAgIHBUYWdEYXRhLT5zYW1wcmF0ZSA9IHNhbXBsZXJhdGVfdGFibGVbMl1baF9zcl9pbmRleF07CisgICAgZWxzZQorICAgICAgICBwVGFnRGF0YS0+c2FtcHJhdGUgPSBzYW1wbGVyYXRlX3RhYmxlW2hfaWRdW2hfc3JfaW5kZXhdOworICAgIC8qIGlmKCBoX2lkID09IDAgKSAqLworICAgIC8qICBwVGFnRGF0YS0+c2FtcHJhdGUgPj49IDE7ICovCisKKworCisgICAgLyogIGRldGVybWluZSBvZmZzZXQgb2YgaGVhZGVyICovCisgICAgaWYgKGhfaWQpIHsKKyAgICAgICAgLyogbXBlZzEgKi8KKyAgICAgICAgaWYgKGhfbW9kZSAhPSAzKQorICAgICAgICAgICAgYnVmICs9ICgzMiArIDQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYgKz0gKDE3ICsgNCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBtcGVnMiAqLworICAgICAgICBpZiAoaF9tb2RlICE9IDMpCisgICAgICAgICAgICBidWYgKz0gKDE3ICsgNCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZiArPSAoOSArIDQpOworICAgIH0KKworICAgIGlmICghSXNWYnJUYWcoYnVmKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBidWYgKz0gNDsKKworICAgIHBUYWdEYXRhLT5oX2lkID0gaF9pZDsKKworICAgIGhlYWRfZmxhZ3MgPSBwVGFnRGF0YS0+ZmxhZ3MgPSBFeHRyYWN0STQoYnVmKTsKKyAgICBidWYgKz0gNDsgICAgICAgICAgIC8qIGdldCBmbGFncyAqLworCisgICAgaWYgKGhlYWRfZmxhZ3MgJiBGUkFNRVNfRkxBRykgeworICAgICAgICBwVGFnRGF0YS0+ZnJhbWVzID0gRXh0cmFjdEk0KGJ1Zik7CisgICAgICAgIGJ1ZiArPSA0OworICAgIH0KKworICAgIGlmIChoZWFkX2ZsYWdzICYgQllURVNfRkxBRykgeworICAgICAgICBwVGFnRGF0YS0+Ynl0ZXMgPSBFeHRyYWN0STQoYnVmKTsKKyAgICAgICAgYnVmICs9IDQ7CisgICAgfQorCisgICAgaWYgKGhlYWRfZmxhZ3MgJiBUT0NfRkxBRykgeworICAgICAgICBpZiAocFRhZ0RhdGEtPnRvYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNVE9DRU5UUklFUzsgaSsrKQorICAgICAgICAgICAgICAgIHBUYWdEYXRhLT50b2NbaV0gPSBidWZbaV07CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IE5VTVRPQ0VOVFJJRVM7CisgICAgfQorCisgICAgcFRhZ0RhdGEtPnZicl9zY2FsZSA9IC0xOworCisgICAgaWYgKGhlYWRfZmxhZ3MgJiBWQlJfU0NBTEVfRkxBRykgeworICAgICAgICBwVGFnRGF0YS0+dmJyX3NjYWxlID0gRXh0cmFjdEk0KGJ1Zik7CisgICAgICAgIGJ1ZiArPSA0OworICAgIH0KKworICAgIHBUYWdEYXRhLT5oZWFkZXJzaXplID0gKChoX2lkICsgMSkgKiA3MjAwMCAqIGhfYml0cmF0ZSkgLyBwVGFnRGF0YS0+c2FtcHJhdGU7CisKKyAgICBidWYgKz0gMjE7CisgICAgZW5jX2RlbGF5ID0gYnVmWzBdIDw8IDQ7CisgICAgZW5jX2RlbGF5ICs9IGJ1ZlsxXSA+PiA0OworICAgIGVuY19wYWRkaW5nID0gKGJ1ZlsxXSAmIDB4MEYpIDw8IDg7CisgICAgZW5jX3BhZGRpbmcgKz0gYnVmWzJdOworICAgIC8qIGNoZWNrIGZvciByZWFzb25hYmxlIHZhbHVlcyAodGhpcyBtYXkgYmUgYW4gb2xkIFhpbmcgaGVhZGVyLCAqLworICAgIC8qIG5vdCBhIElORk8gdGFnKSAqLworICAgIGlmIChlbmNfZGVsYXkgPCAwIHx8IGVuY19kZWxheSA+IDMwMDApCisgICAgICAgIGVuY19kZWxheSA9IC0xOworICAgIGlmIChlbmNfcGFkZGluZyA8IDAgfHwgZW5jX3BhZGRpbmcgPiAzMDAwKQorICAgICAgICBlbmNfcGFkZGluZyA9IC0xOworCisgICAgcFRhZ0RhdGEtPmVuY19kZWxheSA9IGVuY19kZWxheTsKKyAgICBwVGFnRGF0YS0+ZW5jX3BhZGRpbmcgPSBlbmNfcGFkZGluZzsKKworI2lmZGVmIERFQlVHX1ZCUlRBRworICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbioqKioqKioqKioqKioqKioqKioqKiBWQlIgVEFHIElORk8gKioqKioqKioqKioqKioqKipcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAidGFnICAgICAgICAgOiVzXG4iLCBWQlJUYWcpOworICAgIGZwcmludGYoc3RkZXJyLCAiaGVhZF9mbGFncyAgOiVkXG4iLCBoZWFkX2ZsYWdzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImJ5dGVzICAgICAgIDolZFxuIiwgcFRhZ0RhdGEtPmJ5dGVzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZyYW1lcyAgICAgIDolZFxuIiwgcFRhZ0RhdGEtPmZyYW1lcyk7CisgICAgZnByaW50ZihzdGRlcnIsICJWQlIgU2NhbGUgICA6JWRcbiIsIHBUYWdEYXRhLT52YnJfc2NhbGUpOworICAgIGZwcmludGYoc3RkZXJyLCAiZW5jX2RlbGF5ICA9ICVpIFxuIiwgZW5jX2RlbGF5KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVuY19wYWRkaW5nPSAlaSBcbiIsIGVuY19wYWRkaW5nKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInRvYzpcbiIpOworICAgIGlmIChwVGFnRGF0YS0+dG9jICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTVRPQ0VOVFJJRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKChpICUgMTApID09IDApCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgJTNkIiwgKGludCkgKHBUYWdEYXRhLT50b2NbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuKioqKioqKioqKioqKioqKiogRU5EIE9GIFZCUiBUQUcgSU5GTyAqKioqKioqKioqKioqKipcbiIpOworI2VuZGlmCisgICAgcmV0dXJuIDE7ICAgICAgICAgICAvKiBzdWNjZXNzICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRWYnJUYWc6IEluaXRpYWxpemVzIHRoZSBoZWFkZXIsIGFuZCB3cml0ZSBlbXB0eSBmcmFtZSB0byBzdHJlYW0KKyAqIFBhcmFtdGVyczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBTdHJlYW06IHBvaW50ZXIgdG8gb3V0cHV0IGZpbGUgc3RyZWFtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb2RlICAgOiBDaGFubmVsIE1vZGU6IDA9U1RFUkVPIDE9SlMgMj1EUyAzPU1PTk8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworaW50CitJbml0VmJyVGFnKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGludCAgICAga2Jwc19oZWFkZXI7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyNkZWZpbmUgTUFYRlJBTUVTSVpFIDI4ODAgLyogb3IgMHhCNDAsIHRoZSBtYXggZnJlZWZvcm1hdCA2NDAgMzJrSHogZnJhbWVzaXplICovCisKKyAgICAvKgorICAgICAqIFhpbmcgVkJSIHByZXRlbmRzIHRvIGJlIGEgNDhrYnMgbGF5ZXIgSUlJIGZyYW1lLiAgKGF0IDQ0LjFrSHopLgorICAgICAqIChhdCA0OGtIeiB0aGV5IHVzZSA1NmticyBzaW5jZSA0OGticyBmcmFtZSBub3QgYmlnIGVub3VnaCBmb3IKKyAgICAgKiB0YWJsZSBvZiBjb250ZW50cykKKyAgICAgKiBsZXQncyBhbHdheXMgZW1iZWQgWGluZyBoZWFkZXIgaW5zaWRlIGEgNjRrYnMgbGF5ZXIgSUlJIGZyYW1lLgorICAgICAqIHRoaXMgZ2l2ZXMgdXMgZW5vdWdoIHJvb20gZm9yIGEgTEFNRSB2ZXJzaW9uIHN0cmluZyB0b28uCisgICAgICogc2l6ZSBkZXRlcm1pbmVkIGJ5IHNhbXBsaW5nIGZyZXF1ZW5jeSAoTVBFRzEpCisgICAgICogMzJrSHo6ICAgIDIxNiBieXRlc0A0OGticyAgICAyODhieXRlc0AgNjRrYnMKKyAgICAgKiA0NC4xa0h6OiAgMTU2IGJ5dGVzICAgICAgICAgIDIwOGJ5dGVzQDY0a2JzICAgICAoKzEgaWYgcGFkZGluZyA9IDEpCisgICAgICogNDhrSHo6ICAgIDE0NCBieXRlcyAgICAgICAgICAxOTIKKyAgICAgKgorICAgICAqIE1QRUcgMiB2YWx1ZXMgYXJlIHRoZSBzYW1lIHNpbmNlIHRoZSBmcmFtZXNpemUgYW5kIHNhbXBsZXJhdGUKKyAgICAgKiBhcmUgZWFjaCByZWR1Y2VkIGJ5IGEgZmFjdG9yIG9mIDIuCisgICAgICovCisKKworICAgIGlmICgxID09IGdmcC0+dmVyc2lvbikgeworICAgICAgICBrYnBzX2hlYWRlciA9IFhJTkdfQklUUkFURTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSA8IDE2MDAwKQorICAgICAgICAgICAga2Jwc19oZWFkZXIgPSBYSU5HX0JJVFJBVEUyNTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAga2Jwc19oZWFkZXIgPSBYSU5HX0JJVFJBVEUyOworICAgIH0KKworICAgIGlmIChnZnAtPlZCUiA9PSB2YnJfb2ZmKQorICAgICAgICBrYnBzX2hlYWRlciA9IGdmcC0+YnJhdGU7CisKKyAgICAvKiogbWFrZSBzdXJlIExBTUUgSGVhZGVyIGZpdHMgaW50byBGcmFtZQorICAgICAqLworICAgIHsKKyAgICAgICAgaW50ICAgICB0b3RhbF9mcmFtZV9zaXplID0gKChnZnAtPnZlcnNpb24gKyAxKSAqIDcyMDAwICoga2Jwc19oZWFkZXIpIC8gZ2ZwLT5vdXRfc2FtcGxlcmF0ZTsKKyAgICAgICAgaW50ICAgICBoZWFkZXJfc2l6ZSA9IChnZmMtPnNpZGVpbmZvX2xlbiArIExBTUVIRUFERVJTSVpFKTsKKyAgICAgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5Ub3RhbEZyYW1lU2l6ZSA9IHRvdGFsX2ZyYW1lX3NpemU7CisgICAgICAgIGlmICh0b3RhbF9mcmFtZV9zaXplIDwgaGVhZGVyX3NpemUgfHwgdG90YWxfZnJhbWVfc2l6ZSA+IE1BWEZSQU1FU0laRSkgeworICAgICAgICAgICAgLyogZGlzYWJsZSB0YWcsIGl0IHdvbnQgZml0ICovCisgICAgICAgICAgICBnZnAtPmJXcml0ZVZiclRhZyA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdmYy0+VkJSX3NlZWtfdGFibGUublZick51bUZyYW1lcyA9IDA7CisgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5uQnl0ZXNXcml0dGVuID0gMDsKKyAgICBnZmMtPlZCUl9zZWVrX3RhYmxlLnN1bSA9IDA7CisKKyAgICBnZmMtPlZCUl9zZWVrX3RhYmxlLnNlZW4gPSAwOworICAgIGdmYy0+VkJSX3NlZWtfdGFibGUud2FudCA9IDE7CisgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5wb3MgPSAwOworCisgICAgaWYgKGdmYy0+VkJSX3NlZWtfdGFibGUuYmFnID09IE5VTEwpIHsKKyAgICAgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5iYWcgPSBtYWxsb2MoNDAwICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAoZ2ZjLT5WQlJfc2Vla190YWJsZS5iYWcgIT0gTlVMTCkgeworICAgICAgICAgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5zaXplID0gNDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5zaXplID0gMDsKKyAgICAgICAgICAgIEVSUk9SRihnZmMsICJFcnJvcjogY2FuJ3QgYWxsb2NhdGUgVmJyRnJhbWVzIGJ1ZmZlclxuIik7CisgICAgICAgICAgICBnZnAtPmJXcml0ZVZiclRhZyA9IDA7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3cml0ZSBkdW1teSBWQlIgdGFnIG9mIGFsbCAwJ3MgaW50byBiaXRzdHJlYW0gKi8KKyAgICB7CisgICAgICAgIHVpbnQ4X3QgYnVmZmVyW01BWEZSQU1FU0laRV07CisgICAgICAgIHNpemVfdCAgaSwgbjsKKworICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgIHNldExhbWVUYWdGcmFtZUhlYWRlcihnZnAsIGJ1ZmZlcik7CisgICAgICAgIG4gPSBnZmMtPlZCUl9zZWVrX3RhYmxlLlRvdGFsRnJhbWVTaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBhZGRfZHVtbXlfYnl0ZShnZnAsIGJ1ZmZlcltpXSwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogU3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCisKKworLyogZmFzdCBDUkMtMTYgY29tcHV0YXRpb24gLSB1c2VzIHRhYmxlIGNyYzE2X2xvb2t1cCA4Ki8KK3N0YXRpYyBpbnQKK0NSQ191cGRhdGVfbG9va3VwKGludCB2YWx1ZSwgaW50IGNyYykKK3sKKyAgICBpbnQgICAgIHRtcDsKKyAgICB0bXAgPSBjcmMgXiB2YWx1ZTsKKyAgICBjcmMgPSAoY3JjID4+IDgpIF4gY3JjMTZfbG9va3VwW3RtcCAmIDB4ZmZdOworICAgIHJldHVybiBjcmM7Cit9CisKK3ZvaWQKK1VwZGF0ZU11c2ljQ1JDKHVpbnQxNl90ICogY3JjLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKQoreworICAgIGludCAgICAgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICAqY3JjID0gQ1JDX3VwZGF0ZV9sb29rdXAoYnVmZmVyW2ldLCAqY3JjKTsKK30KKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSm9uYXRoYW4gRGVlIDIwMDEvMDgvMzEKKyAqCisgKiBQdXRMYW1lVkJSOiBXcml0ZSBMQU1FIGluZm86IG1pbmkgdmVyc2lvbiArIGluZm8gb24gdmFyaW91cyBzd2l0Y2hlcyB1c2VkCisgKiBQYXJhbXRlcnM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBidFN0cmVhbUJ1ZmZlciA6IHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDN2MnNpemUgICAgICAgICAgICAgICA6IHNpemUgb2YgaWQzdjIgdGFnIGluIGJ5dGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb21wdXRhdGlvbiBvZiBjcmMtMTYgb2YgTGFtZSBUYWcgc28gZmFyIChzdGFydGluZyBhdCBmcmFtZSBzeW5jKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworc3RhdGljIGludAorUHV0TGFtZVZCUihsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBzaXplX3Qgbk11c2ljTGVuZ3RoLCB1aW50OF90ICogcGJ0U3RyZWFtQnVmZmVyLCB1aW50MTZfdCBjcmMpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIGludCAgICAgbkJ5dGVzV3JpdHRlbiA9IDA7CisgICAgaW50ICAgICBpOworCisgICAgaW50ICAgICBlbmNfZGVsYXkgPSBsYW1lX2dldF9lbmNvZGVyX2RlbGF5KGdmcCk7IC8qIGVuY29kZXIgZGVsYXkgKi8KKyAgICBpbnQgICAgIGVuY19wYWRkaW5nID0gbGFtZV9nZXRfZW5jb2Rlcl9wYWRkaW5nKGdmcCk7IC8qIGVuY29kZXIgcGFkZGluZyAgKi8KKworICAgIC8qcmVjYWxsOiBnZnAtPlZCUl9xIGlzIGZvciBleGFtcGxlIHNldCBieSB0aGUgc3dpdGNoIC1WICAqLworICAgIC8qICAgZ2ZwLT5xdWFsaXR5IGJ5IC1xLCAtaCwgLWYsIGV0YyAqLworCisgICAgaW50ICAgICBuUXVhbGl0eSA9ICgxMDAgLSAxMCAqIGdmcC0+VkJSX3EgLSBnZnAtPnF1YWxpdHkpOworCisKKyAgICBjb25zdCBjaGFyICpzelZlcnNpb24gPSBnZXRfbGFtZV92ZXJ5X3Nob3J0X3ZlcnNpb24oKTsKKyAgICB1aW50OF90IG5WQlI7CisgICAgdWludDhfdCBuUmV2aXNpb24gPSAweDAwOworICAgIHVpbnQ4X3QgblJldk1ldGhvZDsKKyAgICB1aW50OF90IHZicl90eXBlX3RyYW5zbGF0b3JbXSA9IHsgMSwgNSwgMywgMiwgNCwgMCwgMyB9OyAvKm51bWJlcmluZyBkaWZmZXJlbnQgaW4gdmJyX21vZGUgdnMuIExhbWUgdGFnICovCisKKyAgICB1aW50OF90IG5Mb3dwYXNzID0KKyAgICAgICAgKCgoZ2ZwLT5sb3dwYXNzZnJlcSAvIDEwMC4wKSArIC41KSA+IDI1NSA/IDI1NSA6IChnZnAtPmxvd3Bhc3NmcmVxIC8gMTAwLjApICsgLjUpOworCisgICAgdWludDMyX3QgblBlYWtTaWduYWxBbXBsaXR1ZGUgPSAwOworCisgICAgdWludDE2X3QgblJhZGlvUmVwbGF5R2FpbiA9IDA7CisgICAgdWludDE2X3QgbkF1ZGlvcGhpbGVSZXBsYXlHYWluID0gMDsKKworICAgIHVpbnQ4X3Qgbk5vaXNlU2hhcGluZyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3MtPm5vaXNlX3NoYXBpbmc7CisgICAgdWludDhfdCBuU3RlcmVvTW9kZSA9IDA7CisgICAgaW50ICAgICBiTm9uT3B0aW1hbCA9IDA7CisgICAgdWludDhfdCBuU291cmNlRnJlcSA9IDA7CisgICAgdWludDhfdCBuTWlzYyA9IDA7CisgICAgdWludDE2X3Qgbk11c2ljQ1JDID0gMDsKKworICAgIC8qcHN5IG1vZGVsIHR5cGU6IEdwc3ljaG8gb3IgTnNQc3l0dW5lICovCisgICAgdW5zaWduZWQgY2hhciBiRXhwTlBzeVR1bmUgPSBnZnAtPmV4cF9uc3BzeXR1bmUgJiAxOworICAgIHVuc2lnbmVkIGNoYXIgYlNhZmVKb2ludCA9IChnZnAtPmV4cF9uc3BzeXR1bmUgJiAyKSAhPSAwOworCisgICAgdW5zaWduZWQgY2hhciBiTm9HYXBNb3JlID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJOb0dhcFByZXZpb3VzID0gMDsKKworICAgIGludCAgICAgbk5vR2FwQ291bnQgPSBnZnAtPmludGVybmFsX2ZsYWdzLT5ub2dhcF90b3RhbDsKKyAgICBpbnQgICAgIG5Ob0dhcEN1cnIgPSBnZnAtPmludGVybmFsX2ZsYWdzLT5ub2dhcF9jdXJyZW50OworCisKKyAgICB1aW50OF90IG5BdGhUeXBlID0gZ2ZwLT5BVEh0eXBlOyAvKjQgYml0cy4gKi8KKworICAgIHVpbnQ4X3QgbkZsYWdzID0gMDsKKworICAgIC8qIGlmIEFCUiwge3N0b3JlIGJpdHJhdGUgPD0yNTV9IGVsc2UgeyBzdG9yZSAiLWIifSAqLworICAgIGludCAgICAgbkFCUkJpdHJhdGU7CisgICAgc3dpdGNoIChnZnAtPlZCUikgeworICAgIGNhc2UgdmJyX2Ficjp7CisgICAgICAgICAgICBuQUJSQml0cmF0ZSA9IGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIHZicl9vZmY6eworICAgICAgICAgICAgbkFCUkJpdHJhdGUgPSBnZnAtPmJyYXRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OnsgICAgICAgICAgLyp2YnIgbW9kZXMgKi8KKyAgICAgICAgICAgIG5BQlJCaXRyYXRlID0gZ2ZwLT5WQlJfbWluX2JpdHJhdGVfa2JwczsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLypyZXZpc2lvbiBhbmQgdmJyIG1ldGhvZCAqLworICAgIGlmIChnZnAtPlZCUiA8IHNpemVvZih2YnJfdHlwZV90cmFuc2xhdG9yKSkKKyAgICAgICAgblZCUiA9IHZicl90eXBlX3RyYW5zbGF0b3JbZ2ZwLT5WQlJdOworICAgIGVsc2UKKyAgICAgICAgblZCUiA9IDB4MDA7ICAgIC8qdW5rbm93bi4gKi8KKworICAgIG5SZXZNZXRob2QgPSAweDEwICogblJldmlzaW9uICsgblZCUjsKKworCisgICAgLyogUmVwbGF5R2FpbiAqLworICAgIGlmIChnZmMtPmZpbmRSZXBsYXlHYWluKSB7CisgICAgICAgIGlmIChnZmMtPlJhZGlvR2FpbiA+IDB4MUZFKQorICAgICAgICAgICAgZ2ZjLT5SYWRpb0dhaW4gPSAweDFGRTsKKyAgICAgICAgaWYgKGdmYy0+UmFkaW9HYWluIDwgLTB4MUZFKQorICAgICAgICAgICAgZ2ZjLT5SYWRpb0dhaW4gPSAtMHgxRkU7CisKKyAgICAgICAgblJhZGlvUmVwbGF5R2FpbiA9IDB4MjAwMDsgLyogc2V0IG5hbWUgY29kZSAqLworICAgICAgICBuUmFkaW9SZXBsYXlHYWluIHw9IDB4QzAwOyAvKiBzZXQgb3JpZ2luYXRvciBjb2RlIHRvIGBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHknICovCisKKyAgICAgICAgaWYgKGdmYy0+UmFkaW9HYWluID49IDApCisgICAgICAgICAgICBuUmFkaW9SZXBsYXlHYWluIHw9IGdmYy0+UmFkaW9HYWluOyAvKiBzZXQgZ2FpbiBhZGp1c3RtZW50ICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgblJhZGlvUmVwbGF5R2FpbiB8PSAweDIwMDsgLyogc2V0IHRoZSBzaWduIGJpdCAqLworICAgICAgICAgICAgblJhZGlvUmVwbGF5R2FpbiB8PSAtZ2ZjLT5SYWRpb0dhaW47IC8qIHNldCBnYWluIGFkanVzdG1lbnQgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBlYWsgc2FtcGxlICovCisgICAgaWYgKGdmYy0+ZmluZFBlYWtTYW1wbGUpCisgICAgICAgIG5QZWFrU2lnbmFsQW1wbGl0dWRlID0gYWJzKChpbnQpICgoKChGTE9BVCkgZ2ZjLT5QZWFrU2FtcGxlKSAvIDMyNzY3LjApICogcG93KDIsIDIzKSArIC41KSk7CisKKyAgICAvKm5vZ2FwICovCisgICAgaWYgKG5Ob0dhcENvdW50ICE9IC0xKSB7CisgICAgICAgIGlmIChuTm9HYXBDdXJyID4gMCkKKyAgICAgICAgICAgIGJOb0dhcFByZXZpb3VzID0gMTsKKworICAgICAgICBpZiAobk5vR2FwQ3VyciA8IG5Ob0dhcENvdW50IC0gMSkKKyAgICAgICAgICAgIGJOb0dhcE1vcmUgPSAxOworICAgIH0KKworICAgIC8qZmxhZ3MgKi8KKworICAgIG5GbGFncyA9IG5BdGhUeXBlICsgKGJFeHBOUHN5VHVuZSA8PCA0KQorICAgICAgICArIChiU2FmZUpvaW50IDw8IDUpCisgICAgICAgICsgKGJOb0dhcE1vcmUgPDwgNikKKyAgICAgICAgKyAoYk5vR2FwUHJldmlvdXMgPDwgNyk7CisKKworICAgIGlmIChuUXVhbGl0eSA8IDApCisgICAgICAgIG5RdWFsaXR5ID0gMDsKKworICAgIC8qc3RlcmVvIG1vZGUgZmllbGQuLi4gYSBiaXQgdWdseS4gKi8KKworICAgIHN3aXRjaCAoZ2ZwLT5tb2RlKSB7CisgICAgY2FzZSBNT05POgorICAgICAgICBuU3RlcmVvTW9kZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RFUkVPOgorICAgICAgICBuU3RlcmVvTW9kZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFVBTF9DSEFOTkVMOgorICAgICAgICBuU3RlcmVvTW9kZSA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSk9JTlRfU1RFUkVPOgorICAgICAgICBpZiAoZ2ZwLT5mb3JjZV9tcykKKyAgICAgICAgICAgIG5TdGVyZW9Nb2RlID0gNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgblN0ZXJlb01vZGUgPSAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5PVF9TRVQ6CisgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgblN0ZXJlb01vZGUgPSA3OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKkludGVuc2l0eSBzdGVyZW8gOiBuU3RlcmVvTW9kZSA9IDYuIElTIGlzIG5vdCBpbXBsZW1lbnRlZCAqLworCisgICAgaWYgKGdmcC0+aW5fc2FtcGxlcmF0ZSA8PSAzMjAwMCkKKyAgICAgICAgblNvdXJjZUZyZXEgPSAweDAwOworICAgIGVsc2UgaWYgKGdmcC0+aW5fc2FtcGxlcmF0ZSA9PSA0ODAwMCkKKyAgICAgICAgblNvdXJjZUZyZXEgPSAweDAyOworICAgIGVsc2UgaWYgKGdmcC0+aW5fc2FtcGxlcmF0ZSA+IDQ4MDAwKQorICAgICAgICBuU291cmNlRnJlcSA9IDB4MDM7CisgICAgZWxzZQorICAgICAgICBuU291cmNlRnJlcSA9IDB4MDE7IC8qZGVmYXVsdCBpcyA0NDEwMEh6LiAqLworCisKKyAgICAvKkNoZWNrIGlmIHRoZSB1c2VyIG92ZXJyaWRlZCB0aGUgZGVmYXVsdCBMQU1FIGJlaGF2aW91ciB3aXRoIHNvbWUgbmFzdHkgb3B0aW9ucyAqLworCisgICAgaWYgKGdmcC0+c2hvcnRfYmxvY2tzID09IHNob3J0X2Jsb2NrX2ZvcmNlZCB8fCBnZnAtPnNob3J0X2Jsb2NrcyA9PSBzaG9ydF9ibG9ja19kaXNwZW5zZWQgfHwgKChnZnAtPmxvd3Bhc3NmcmVxID09IC0xKSAmJiAoZ2ZwLT5oaWdocGFzc2ZyZXEgPT0gLTEpKSB8fCAvKiAiLWsiICovCisgICAgICAgIChnZnAtPnNjYWxlX2xlZnQgPCBnZnAtPnNjYWxlX3JpZ2h0KSB8fAorICAgICAgICAoZ2ZwLT5zY2FsZV9sZWZ0ID4gZ2ZwLT5zY2FsZV9yaWdodCkgfHwKKyAgICAgICAgKGdmcC0+ZGlzYWJsZV9yZXNlcnZvaXIgJiYgZ2ZwLT5icmF0ZSA8IDMyMCkgfHwKKyAgICAgICAgZ2ZwLT5ub0FUSCB8fCBnZnAtPkFUSG9ubHkgfHwgKG5BdGhUeXBlID09IDApIHx8IGdmcC0+aW5fc2FtcGxlcmF0ZSA8PSAzMjAwMCkKKyAgICAgICAgYk5vbk9wdGltYWwgPSAxOworCisgICAgbk1pc2MgPSBuTm9pc2VTaGFwaW5nICsgKG5TdGVyZW9Nb2RlIDw8IDIpCisgICAgICAgICsgKGJOb25PcHRpbWFsIDw8IDUpCisgICAgICAgICsgKG5Tb3VyY2VGcmVxIDw8IDYpOworCisKKyAgICBuTXVzaWNDUkMgPSBnZmMtPm5NdXNpY0NSQzsKKworCisgICAgLypXcml0ZSBhbGwgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBzdHJlYW0gKi8KKyAgICBDcmVhdGVJNCgmcGJ0U3RyZWFtQnVmZmVyW25CeXRlc1dyaXR0ZW5dLCBuUXVhbGl0eSk7CisgICAgbkJ5dGVzV3JpdHRlbiArPSA0OworCisgICAgc3RybmNweSgoY2hhciAqKSAmcGJ0U3RyZWFtQnVmZmVyW25CeXRlc1dyaXR0ZW5dLCBzelZlcnNpb24sIDkpOworICAgIG5CeXRlc1dyaXR0ZW4gKz0gOTsKKworICAgIHBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuXSA9IG5SZXZNZXRob2Q7CisgICAgbkJ5dGVzV3JpdHRlbisrOworCisgICAgcGJ0U3RyZWFtQnVmZmVyW25CeXRlc1dyaXR0ZW5dID0gbkxvd3Bhc3M7CisgICAgbkJ5dGVzV3JpdHRlbisrOworCisgICAgQ3JlYXRlSTQoJnBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuXSwgblBlYWtTaWduYWxBbXBsaXR1ZGUpOworICAgIG5CeXRlc1dyaXR0ZW4gKz0gNDsKKworICAgIENyZWF0ZUkyKCZwYnRTdHJlYW1CdWZmZXJbbkJ5dGVzV3JpdHRlbl0sIG5SYWRpb1JlcGxheUdhaW4pOworICAgIG5CeXRlc1dyaXR0ZW4gKz0gMjsKKworICAgIENyZWF0ZUkyKCZwYnRTdHJlYW1CdWZmZXJbbkJ5dGVzV3JpdHRlbl0sIG5BdWRpb3BoaWxlUmVwbGF5R2Fpbik7CisgICAgbkJ5dGVzV3JpdHRlbiArPSAyOworCisgICAgcGJ0U3RyZWFtQnVmZmVyW25CeXRlc1dyaXR0ZW5dID0gbkZsYWdzOworICAgIG5CeXRlc1dyaXR0ZW4rKzsKKworICAgIGlmIChuQUJSQml0cmF0ZSA+PSAyNTUpCisgICAgICAgIHBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuXSA9IDB4RkY7CisgICAgZWxzZQorICAgICAgICBwYnRTdHJlYW1CdWZmZXJbbkJ5dGVzV3JpdHRlbl0gPSBuQUJSQml0cmF0ZTsKKyAgICBuQnl0ZXNXcml0dGVuKys7CisKKyAgICBwYnRTdHJlYW1CdWZmZXJbbkJ5dGVzV3JpdHRlbl0gPSBlbmNfZGVsYXkgPj4gNDsgLyogd29ya3MgZm9yIHdpbjMyLCBkb2VzIGl0IGZvciB1bml4PyAqLworICAgIHBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuICsgMV0gPSAoZW5jX2RlbGF5IDw8IDQpICsgKGVuY19wYWRkaW5nID4+IDgpOworICAgIHBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuICsgMl0gPSBlbmNfcGFkZGluZzsKKworICAgIG5CeXRlc1dyaXR0ZW4gKz0gMzsKKworICAgIHBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuXSA9IG5NaXNjOworICAgIG5CeXRlc1dyaXR0ZW4rKzsKKworCisgICAgcGJ0U3RyZWFtQnVmZmVyW25CeXRlc1dyaXR0ZW4rK10gPSAwOyAvKnVudXNlZCBpbiByZXYwICovCisKKyAgICBDcmVhdGVJMigmcGJ0U3RyZWFtQnVmZmVyW25CeXRlc1dyaXR0ZW5dLCBnZnAtPnByZXNldCk7CisgICAgbkJ5dGVzV3JpdHRlbiArPSAyOworCisgICAgQ3JlYXRlSTQoJnBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuXSwgKGludCkgbk11c2ljTGVuZ3RoKTsKKyAgICBuQnl0ZXNXcml0dGVuICs9IDQ7CisKKyAgICBDcmVhdGVJMigmcGJ0U3RyZWFtQnVmZmVyW25CeXRlc1dyaXR0ZW5dLCBuTXVzaWNDUkMpOworICAgIG5CeXRlc1dyaXR0ZW4gKz0gMjsKKworICAgIC8qQ2FsY3VsYXRlIHRhZyBDUkMuLi4uIG11c3QgYmUgZG9uZSBoZXJlLCBzaW5jZSBpdCBpbmNsdWRlcworICAgICAqcHJldmlvdXMgaW5mb3JtYXRpb24qLworCisgICAgZm9yIChpID0gMDsgaSA8IG5CeXRlc1dyaXR0ZW47IGkrKykKKyAgICAgICAgY3JjID0gQ1JDX3VwZGF0ZV9sb29rdXAocGJ0U3RyZWFtQnVmZmVyW2ldLCBjcmMpOworCisgICAgQ3JlYXRlSTIoJnBidFN0cmVhbUJ1ZmZlcltuQnl0ZXNXcml0dGVuXSwgY3JjKTsKKyAgICBuQnl0ZXNXcml0dGVuICs9IDI7CisKKyAgICByZXR1cm4gbkJ5dGVzV3JpdHRlbjsKK30KKworc3RhdGljIGxvbmcKK3NraXBJZDN2MihGSUxFICogZnBTdHJlYW0pCit7CisgICAgc2l6ZV90ICBuYnl0ZXM7CisgICAgbG9uZyAgICBpZDN2MlRhZ1NpemU7CisgICAgdW5zaWduZWQgY2hhciBpZDN2MkhlYWRlclsxMF07CisKKyAgICAvKiBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSAqLworICAgIGlmIChmc2VlayhmcFN0cmVhbSwgMCwgU0VFS19TRVQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC0yOyAgICAgIC8qIG5vdCBzZWVrYWJsZSwgYWJvcnQgKi8KKyAgICB9CisgICAgLyogcmVhZCAxMCBieXRlcyBpbiBjYXNlIHRoZXJlJ3MgYW4gSUQzIHZlcnNpb24gMiBoZWFkZXIgaGVyZSAqLworICAgIG5ieXRlcyA9IGZyZWFkKGlkM3YySGVhZGVyLCAxLCBzaXplb2YoaWQzdjJIZWFkZXIpLCBmcFN0cmVhbSk7CisgICAgaWYgKG5ieXRlcyAhPSBzaXplb2YoaWQzdjJIZWFkZXIpKSB7CisgICAgICAgIHJldHVybiAtMzsgICAgICAvKiBub3QgcmVhZGFibGUsIG1heWJlIG9wZW5lZCBXcml0ZS1Pbmx5ICovCisgICAgfQorICAgIC8qIGRvZXMgdGhlIHN0cmVhbSBiZWdpbiB3aXRoIHRoZSBJRDMgdmVyc2lvbiAyIGZpbGUgaWRlbnRpZmllcj8gKi8KKyAgICBpZiAoIXN0cm5jbXAoKGNoYXIgKikgaWQzdjJIZWFkZXIsICJJRDMiLCAzKSkgeworICAgICAgICAvKiB0aGUgdGFnIHNpemUgKG1pbnVzIHRoZSAxMC1ieXRlIGhlYWRlcikgaXMgZW5jb2RlZCBpbnRvIGZvdXIKKyAgICAgICAgICogYnl0ZXMgd2hlcmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIGNsZWFyIGluIGVhY2ggYnl0ZSAqLworICAgICAgICBpZDN2MlRhZ1NpemUgPSAoKChpZDN2MkhlYWRlcls2XSAmIDB4N2YpIDw8IDIxKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGlkM3YySGVhZGVyWzddICYgMHg3ZikgPDwgMTQpCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgoaWQzdjJIZWFkZXJbOF0gJiAweDdmKSA8PCA3KQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoaWQzdjJIZWFkZXJbOV0gJiAweDdmKSkKKyAgICAgICAgICAgICsgc2l6ZW9mIGlkM3YySGVhZGVyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogbm8gSUQzIHZlcnNpb24gMiB0YWcgaW4gdGhpcyBzdHJlYW0gKi8KKyAgICAgICAgaWQzdjJUYWdTaXplID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGlkM3YyVGFnU2l6ZTsKK30KKworCisKK3NpemVfdAorbGFtZV9nZXRfbGFtZXRhZ19mcmFtZShsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYzsKKyAgICBpbnQgICAgIHN0cmVhbV9zaXplOworICAgIGludCAgICAgblN0cmVhbUluZGV4OworICAgIHVpbnQ4X3QgYnRUb2NbTlVNVE9DRU5UUklFU107CisKKyAgICBpZiAoZ2ZwID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChnZnAtPmJXcml0ZVZiclRhZyA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmIChnZmMgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGdmYy0+Q2xhc3NfSUQgIT0gTEFNRV9JRCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGdmYy0+VkJSX3NlZWtfdGFibGUucG9zIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzaXplIDwgZ2ZjLT5WQlJfc2Vla190YWJsZS5Ub3RhbEZyYW1lU2l6ZSkgeworICAgICAgICByZXR1cm4gZ2ZjLT5WQlJfc2Vla190YWJsZS5Ub3RhbEZyYW1lU2l6ZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlciA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG1lbXNldChidWZmZXIsIDAsIGdmYy0+VkJSX3NlZWtfdGFibGUuVG90YWxGcmFtZVNpemUpOworCisgICAgLyogNCBieXRlcyBmcmFtZSBoZWFkZXIgKi8KKworICAgIHNldExhbWVUYWdGcmFtZUhlYWRlcihnZnAsIGJ1ZmZlcik7CisKKyAgICAvKiBDbGVhciBhbGwgVE9DIGVudHJpZXMgKi8KKyAgICBtZW1zZXQoYnRUb2MsIDAsIHNpemVvZihidFRvYykpOworCisgICAgaWYgKGdmcC0+ZnJlZV9mb3JtYXQpIHsKKyAgICAgICAgaW50ICAgICBpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTlVNVE9DRU5UUklFUzsgKytpKQorICAgICAgICAgICAgYnRUb2NbaV0gPSAyNTUgKiBpIC8gMTAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgWGluZ19zZWVrX3RhYmxlKCZnZmMtPlZCUl9zZWVrX3RhYmxlLCBidFRvYyk7CisgICAgfQorI2lmZGVmIERFQlVHX1ZCUl9TRUVLSU5HX1RBQkxFCisgICAgcHJpbnRfc2Vla2luZyhidFRvYyk7CisjZW5kaWYKKworICAgIC8qIFN0YXJ0IHdyaXRpbmcgdGhlIHRhZyBhZnRlciB0aGUgemVybyBmcmFtZSAqLworICAgIG5TdHJlYW1JbmRleCA9IGdmYy0+c2lkZWluZm9fbGVuOworICAgIC8qIG5vdGUhIFhpbmcgaGVhZGVyIHNwZWNpZmllcyB0aGF0IFhpbmcgZGF0YSBnb2VzIGluIHRoZQorICAgICAqIGFuY2lsbGFyeSBkYXRhIHdpdGggTk8gRVJST1IgUFJPVEVDVElPTi4gIElmIGVycm9yIHByb3RlY3RvbgorICAgICAqIGluIGVuYWJsZWQsIHRoZSBYaW5nIGRhdGEgc3RpbGwgc3RhcnRzIGF0IHRoZSBzYW1lIG9mZnNldCwKKyAgICAgKiBhbmQgbm93IGl0IGlzIGluIHNpZGVpbmZvIGRhdGEgYmxvY2ssIGFuZCB0aHVzIHdpbGwgbm90CisgICAgICogZGVjb2RlIGNvcnJlY3RseSBieSBub24tWGluZyB0YWcgYXdhcmUgcGxheWVycyAqLworICAgIGlmIChnZnAtPmVycm9yX3Byb3RlY3Rpb24pCisgICAgICAgIG5TdHJlYW1JbmRleCAtPSAyOworCisgICAgLyogUHV0IFZiciB0YWcgKi8KKyAgICBpZiAoZ2ZwLT5WQlIgPT0gdmJyX29mZikgeworICAgICAgICBidWZmZXJbblN0cmVhbUluZGV4KytdID0gVkJSVGFnMVswXTsKKyAgICAgICAgYnVmZmVyW25TdHJlYW1JbmRleCsrXSA9IFZCUlRhZzFbMV07CisgICAgICAgIGJ1ZmZlcltuU3RyZWFtSW5kZXgrK10gPSBWQlJUYWcxWzJdOworICAgICAgICBidWZmZXJbblN0cmVhbUluZGV4KytdID0gVkJSVGFnMVszXTsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYnVmZmVyW25TdHJlYW1JbmRleCsrXSA9IFZCUlRhZzBbMF07CisgICAgICAgIGJ1ZmZlcltuU3RyZWFtSW5kZXgrK10gPSBWQlJUYWcwWzFdOworICAgICAgICBidWZmZXJbblN0cmVhbUluZGV4KytdID0gVkJSVGFnMFsyXTsKKyAgICAgICAgYnVmZmVyW25TdHJlYW1JbmRleCsrXSA9IFZCUlRhZzBbM107CisgICAgfQorCisgICAgLyogUHV0IGhlYWRlciBmbGFncyAqLworICAgIENyZWF0ZUk0KCZidWZmZXJbblN0cmVhbUluZGV4XSwgRlJBTUVTX0ZMQUcgKyBCWVRFU19GTEFHICsgVE9DX0ZMQUcgKyBWQlJfU0NBTEVfRkxBRyk7CisgICAgblN0cmVhbUluZGV4ICs9IDQ7CisKKyAgICAvKiBQdXQgVG90YWwgTnVtYmVyIG9mIGZyYW1lcyAqLworICAgIENyZWF0ZUk0KCZidWZmZXJbblN0cmVhbUluZGV4XSwgZ2ZjLT5WQlJfc2Vla190YWJsZS5uVmJyTnVtRnJhbWVzKTsKKyAgICBuU3RyZWFtSW5kZXggKz0gNDsKKworICAgIC8qIFB1dCB0b3RhbCBhdWRpbyBzdHJlYW0gc2l6ZSwgaW5jbHVkaW5nIFhpbmcvTEFNRSBIZWFkZXIgKi8KKyAgICBzdHJlYW1fc2l6ZSA9IGdmYy0+VkJSX3NlZWtfdGFibGUubkJ5dGVzV3JpdHRlbiArIGdmYy0+VkJSX3NlZWtfdGFibGUuVG90YWxGcmFtZVNpemU7CisgICAgQ3JlYXRlSTQoJmJ1ZmZlcltuU3RyZWFtSW5kZXhdLCBzdHJlYW1fc2l6ZSk7CisgICAgblN0cmVhbUluZGV4ICs9IDQ7CisKKyAgICAvKiBQdXQgVE9DICovCisgICAgbWVtY3B5KCZidWZmZXJbblN0cmVhbUluZGV4XSwgYnRUb2MsIHNpemVvZihidFRvYykpOworICAgIG5TdHJlYW1JbmRleCArPSBzaXplb2YoYnRUb2MpOworCisKKyAgICBpZiAoZ2ZwLT5lcnJvcl9wcm90ZWN0aW9uKSB7CisgICAgICAgIC8qIChqbykgZXJyb3JfcHJvdGVjdGlvbjogYWRkIGNyYzE2IGluZm9ybWF0aW9uIHRvIGhlYWRlciAqLworICAgICAgICBDUkNfd3JpdGVoZWFkZXIoZ2ZjLCAoY2hhciAqKSBidWZmZXIpOworICAgIH0KKyAgICB7CisgICAgICAgIC8qd29yayBvdXQgQ1JDIHNvIGZhcjogaW5pdGlhbGx5IGNyYyA9IDAgKi8KKyAgICAgICAgdWludDE2X3QgY3JjID0gMHgwMDsKKyAgICAgICAgaW50ICAgICBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgblN0cmVhbUluZGV4OyBpKyspCisgICAgICAgICAgICBjcmMgPSBDUkNfdXBkYXRlX2xvb2t1cChidWZmZXJbaV0sIGNyYyk7CisgICAgICAgIC8qUHV0IExBTUUgVkJSIGluZm8gKi8KKyAgICAgICAgblN0cmVhbUluZGV4ICs9IFB1dExhbWVWQlIoZ2ZwLCBzdHJlYW1fc2l6ZSwgYnVmZmVyICsgblN0cmVhbUluZGV4LCBjcmMpOworICAgIH0KKworI2lmZGVmIERFQlVHX1ZCUlRBRworICAgIHsKKyAgICAgICAgVkJSVEFHREFUQSBUZXN0SGVhZGVyOworICAgICAgICBHZXRWYnJUYWcoJlRlc3RIZWFkZXIsIGJ1ZmZlcik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gZ2ZjLT5WQlJfc2Vla190YWJsZS5Ub3RhbEZyYW1lU2l6ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHV0VmJyVGFnOiBXcml0ZSBmaW5hbCBWQlIgdGFnIHRvIHRoZSBmaWxlCisgKiBQYXJhbXRlcnM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwc3pGaWxlTmFtZTogZmlsZW5hbWUgb2YgTVAzIGJpdCBzdHJlYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZiclNjYWxlICAgICAgIDogZW5jb2RlciBxdWFsaXR5IGluZGljYXRvciAoMC4uMTAwKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitpbnQKK1B1dFZiclRhZyhsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBGSUxFICogZnBTdHJlYW0pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIGxvbmcgICAgbEZpbGVTaXplOworICAgIGxvbmcgICAgaWQzdjJUYWdTaXplOworICAgIHNpemVfdCAgbmJ5dGVzOworICAgIHVpbnQ4X3QgYnVmZmVyW01BWEZSQU1FU0laRV07CisKKyAgICBpZiAoZ2ZjLT5WQlJfc2Vla190YWJsZS5wb3MgPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogU2VlayB0byBlbmQgb2YgZmlsZSAqLworICAgIGZzZWVrKGZwU3RyZWFtLCAwLCBTRUVLX0VORCk7CisKKyAgICAvKiBHZXQgZmlsZSBzaXplICovCisgICAgbEZpbGVTaXplID0gZnRlbGwoZnBTdHJlYW0pOworCisgICAgLyogQWJvcnQgaWYgZmlsZSBoYXMgemVybyBsZW5ndGguIFllcywgaXQgY2FuIGhhcHBlbiA6KSAqLworICAgIGlmIChsRmlsZVNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiBUaGUgVkJSIHRhZyBtYXkgTk9UIGJlIGxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLgorICAgICAqIElmIGFuIElEMyB2ZXJzaW9uIDIgdGFnIHdhcyBhZGRlZCwgdGhlbiBpdCBtdXN0IGJlIHNraXBwZWQgdG8gd3JpdGUKKyAgICAgKiB0aGUgVkJSIHRhZyBkYXRhLgorICAgICAqLworCisgICAgaWQzdjJUYWdTaXplID0gc2tpcElkM3YyKGZwU3RyZWFtKTsKKworICAgIGlmIChpZDN2MlRhZ1NpemUgPCAwKSB7CisgICAgICAgIHJldHVybiBpZDN2MlRhZ1NpemU7CisgICAgfQorCisgICAgLypTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSAqLworICAgIGZzZWVrKGZwU3RyZWFtLCBpZDN2MlRhZ1NpemUsIFNFRUtfU0VUKTsKKworICAgIG5ieXRlcyA9IGxhbWVfZ2V0X2xhbWV0YWdfZnJhbWUoZ2ZwLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICBpZiAobmJ5dGVzID4gc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChuYnl0ZXMgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFB1dCBpdCBhbGwgdG8gZGlzayBhZ2FpbiAqLworICAgIGlmIChmd3JpdGUoYnVmZmVyLCBuYnl0ZXMsIDEsIGZwU3RyZWFtKSAhPSAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KK30KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvVmJyVGFnLmggYi9saWJtcDNsYW1lL1ZiclRhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWE2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL1ZiclRhZy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgICAgIFhpbmcgVkJSIHRhZ2dpbmcgZm9yIExBTUUuCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgQS5MLiBGYWJlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfVlJCVEFHX0gKKyNkZWZpbmUgTEFNRV9WUkJUQUdfSAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBIFZiciBoZWFkZXIgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGFuY2lsbGFyeQorICogZGF0YSBmaWVsZCBvZiB0aGUgZmlyc3QgZnJhbWUgb2YgYW4gbXAzIGJpdHN0cmVhbQorICogVGhlIFZiciBoZWFkZXIgKG9wdGlvbmFsbHkpIGNvbnRhaW5zCisgKiAgICAgIGZyYW1lcyAgICAgIHRvdGFsIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgaW4gdGhlIGJpdHN0cmVhbQorICogICAgICBieXRlcyAgICAgICB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJpdHN0cmVhbQorICogICAgICB0b2MgICAgICAgICB0YWJsZSBvZiBjb250ZW50cworCisgKiB0b2MgKHRhYmxlIG9mIGNvbnRlbnRzKSBnaXZlcyBzZWVrIHBvaW50cworICogZm9yIHJhbmRvbSBhY2Nlc3MKKyAqIHRoZSBpdGggZW50cnkgZGV0ZXJtaW5lcyB0aGUgc2VlayBwb2ludCBmb3IKKyAqIGktcGVyY2VudCBkdXJhdGlvbgorICogc2VlayBwb2ludCBpbiBieXRlcyA9ICh0b2NbaV0vMjU2LjApICogdG90YWxfYml0c3RyZWFtX2J5dGVzCisgKiBlLmcuIGhhbGYgZHVyYXRpb24gc2VlayBwb2ludCA9ICh0b2NbNTBdLzI1Ni4wKSAqIHRvdGFsX2JpdHN0cmVhbV9ieXRlcworICovCisKKworI2RlZmluZSBGUkFNRVNfRkxBRyAgICAgMHgwMDAxCisjZGVmaW5lIEJZVEVTX0ZMQUcgICAgICAweDAwMDIKKyNkZWZpbmUgVE9DX0ZMQUcgICAgICAgIDB4MDAwNAorI2RlZmluZSBWQlJfU0NBTEVfRkxBRyAgMHgwMDA4CisKKyNkZWZpbmUgTlVNVE9DRU5UUklFUyAxMDAKKworI2RlZmluZSBGUkFNRVNfQU5EX0JZVEVTIChGUkFNRVNfRkxBRyB8IEJZVEVTX0ZMQUcpCisKKworCisvKnN0cnVjdHVyZSB0byByZWNlaXZlIGV4dHJhY3RlZCBoZWFkZXIgKi8KKy8qIHRvYyBtYXkgYmUgTlVMTCovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICBoX2lkOyAgICAgICAgICAgIC8qIGZyb20gTVBFRyBoZWFkZXIsIDA9TVBFRzIsIDE9TVBFRzEgKi8KKyAgICBpbnQgICAgIHNhbXByYXRlOyAgICAgICAgLyogZGV0ZXJtaW5lZCBmcm9tIE1QRUcgaGVhZGVyICovCisgICAgaW50ICAgICBmbGFnczsgICAgICAgICAgIC8qIGZyb20gVmJyIGhlYWRlciBkYXRhICovCisgICAgaW50ICAgICBmcmFtZXM7ICAgICAgICAgIC8qIHRvdGFsIGJpdCBzdHJlYW0gZnJhbWVzIGZyb20gVmJyIGhlYWRlciBkYXRhICovCisgICAgaW50ICAgICBieXRlczsgICAgICAgICAgIC8qIHRvdGFsIGJpdCBzdHJlYW0gYnl0ZXMgZnJvbSBWYnIgaGVhZGVyIGRhdGEgKi8KKyAgICBpbnQgICAgIHZicl9zY2FsZTsgICAgICAgLyogZW5jb2RlZCB2YnIgc2NhbGUgZnJvbSBWYnIgaGVhZGVyIGRhdGEgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHRvY1tOVU1UT0NFTlRSSUVTXTsgLyogbWF5IGJlIE5VTEwgaWYgdG9jIG5vdCBkZXNpcmVkICovCisgICAgaW50ICAgICBoZWFkZXJzaXplOyAgICAgIC8qIHNpemUgb2YgVkJSIGhlYWRlciwgaW4gYnl0ZXMgKi8KKyAgICBpbnQgICAgIGVuY19kZWxheTsgICAgICAgLyogZW5jb2RlciBkZWxheSAqLworICAgIGludCAgICAgZW5jX3BhZGRpbmc7ICAgICAvKiBlbmNvZGVyIHBhZGRpZ24gYWRkZWQgYXQgZW5kIG9mIHN0cmVhbSAqLworfSBWQlJUQUdEQVRBOworCitpbnQgICAgIENoZWNrVmJyVGFnKHVuc2lnbmVkIGNoYXIgKmJ1Zik7CitpbnQgICAgIEdldFZiclRhZyhWQlJUQUdEQVRBICogcFRhZ0RhdGEsIHVuc2lnbmVkIGNoYXIgKmJ1Zik7CisKK2ludCAgICAgU2Vla1BvaW50KHVuc2lnbmVkIGNoYXIgVE9DW05VTVRPQ0VOVFJJRVNdLCBpbnQgZmlsZV9ieXRlcywgZmxvYXQgcGVyY2VudCk7CitpbnQgICAgIEluaXRWYnJUYWcobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApOworaW50ICAgICBQdXRWYnJUYWcobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QqIGdmcCwgRklMRSAqIGZpZCk7Cit2b2lkICAgIEFkZFZickZyYW1lKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKTsKK3ZvaWQgICAgVXBkYXRlTXVzaWNDUkModWludDE2X3QgKiBjcmMsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvYml0c3RyZWFtLmMgYi9saWJtcDNsYW1lL2JpdHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGE2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2JpdHN0cmVhbS5jCkBAIC0wLDAgKzEsMTA2NiBAQAorLyoKKyAqICAgICAgTVAzIGJpdHN0cmVhbSBPdXRwdXQgaW50ZXJmYWNlIGZvciBMQU1FCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBNYXJrIFRheWxvcgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBUYWtlaGlybyBUb21pbmFnYQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAkSWQ6IGJpdHN0cmVhbS5jLHYgMS44Mi4yLjMgMjAwOS8wMS8xOCAxNTo0NDoyNyByb2JlcnQgRXhwICQKKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImVuY29kZXIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAidGFibGVzLmgiCisjaW5jbHVkZSAicXVhbnRpemVfcHZ0LmgiCisjaW5jbHVkZSAibGFtZV9nbG9iYWxfZmxhZ3MuaCIKKyNpbmNsdWRlICJnYWluX2FuYWx5c2lzLmgiCisjaW5jbHVkZSAiVmJyVGFnLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtLmgiCisKKworCisvKiB1bnNpZ25lZCBpbnQgaXMgYXQgbGVhc3QgdGhpcyBsYXJnZTogICovCisvKiB3ZSB3b3JrIHdpdGggaW50cywgc28gd2hlbiBkb2luZyBiaXQgbWFuaXB1bGF0aW9uLCB3ZSBsaW1pdAorICogb3Vyc2VsdmVzIHRvIE1BWF9MRU5HVEgtMiBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgKi8KKyNkZWZpbmUgTUFYX0xFTkdUSCAgICAgIDMyCisKKworCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbnQgaG9nZWdlOworI2VuZGlmCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb21wdXRlIGJpdHNwZXJmcmFtZSBhbmQgbWVhbl9iaXRzIGZvciBhIGxheWVyIElJSSBmcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2dldGZyYW1lYml0cyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgYml0X3JhdGU7CisKKyAgICAvKiBnZXQgYml0cmF0ZSBpbiBrYnBzIFs/XSAqLworICAgIGlmIChnZmMtPmJpdHJhdGVfaW5kZXgpCisgICAgICAgIGJpdF9yYXRlID0gYml0cmF0ZV90YWJsZVtnZnAtPnZlcnNpb25dW2dmYy0+Yml0cmF0ZV9pbmRleF07CisgICAgZWxzZQorICAgICAgICBiaXRfcmF0ZSA9IGdmcC0+YnJhdGU7CisgICAgLyphc3NlcnQoYml0X3JhdGUgPD0gNTUwKTsgKi8KKyAgICBhc3NlcnQoOCA8PSBiaXRfcmF0ZSAmJiBiaXRfcmF0ZSA8PSA2NDApOworCisgICAgLyogbWFpbiBlbmNvZGluZyByb3V0aW5lIHRvZ2dsZXMgcGFkZGluZyBvbiBhbmQgb2ZmICovCisgICAgLyogb25lIExheWVyMyBTbG90IGNvbnNpc3RzIG9mIDggYml0cyAqLworICAgIHJldHVybiA4ICogKChnZnAtPnZlcnNpb24gKyAxKSAqIDcyMDAwICogYml0X3JhdGUgLyBnZnAtPm91dF9zYW1wbGVyYXRlICsgZ2ZjLT5wYWRkaW5nKTsKK30KKworCisKKworc3RhdGljIHZvaWQKK3B1dGhlYWRlcl9iaXRzKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMpCit7CisgICAgQml0X3N0cmVhbV9zdHJ1YyAqYnM7CisgICAgYnMgPSAmZ2ZjLT5iczsKKyNpZmRlZiBERUJVRworICAgIGhvZ2VnZSArPSBnZmMtPnNpZGVpbmZvX2xlbiAqIDg7CisjZW5kaWYKKyAgICBtZW1jcHkoJmJzLT5idWZbYnMtPmJ1Zl9ieXRlX2lkeF0sIGdmYy0+aGVhZGVyW2dmYy0+d19wdHJdLmJ1ZiwgZ2ZjLT5zaWRlaW5mb19sZW4pOworICAgIGJzLT5idWZfYnl0ZV9pZHggKz0gZ2ZjLT5zaWRlaW5mb19sZW47CisgICAgYnMtPnRvdGJpdCArPSBnZmMtPnNpZGVpbmZvX2xlbiAqIDg7CisgICAgZ2ZjLT53X3B0ciA9IChnZmMtPndfcHRyICsgMSkgJiAoTUFYX0hFQURFUl9CVUYgLSAxKTsKK30KKworCisKKworLyp3cml0ZSBqIGJpdHMgaW50byB0aGUgYml0IHN0cmVhbSAqLworaW5saW5lIHN0YXRpYyB2b2lkCitwdXRiaXRzMihsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBpbnQgdmFsLCBpbnQgaikKK3sKKyAgICBCaXRfc3RyZWFtX3N0cnVjICpiczsKKyAgICBicyA9ICZnZmMtPmJzOworCisgICAgYXNzZXJ0KGogPCBNQVhfTEVOR1RIIC0gMik7CisKKyAgICB3aGlsZSAoaiA+IDApIHsKKyAgICAgICAgaW50ICAgICBrOworICAgICAgICBpZiAoYnMtPmJ1Zl9iaXRfaWR4ID09IDApIHsKKyAgICAgICAgICAgIGJzLT5idWZfYml0X2lkeCA9IDg7CisgICAgICAgICAgICBicy0+YnVmX2J5dGVfaWR4Kys7CisgICAgICAgICAgICBhc3NlcnQoYnMtPmJ1Zl9ieXRlX2lkeCA8IEJVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgIGFzc2VydChnZmMtPmhlYWRlcltnZmMtPndfcHRyXS53cml0ZV90aW1pbmcgPj0gYnMtPnRvdGJpdCk7CisgICAgICAgICAgICBpZiAoZ2ZjLT5oZWFkZXJbZ2ZjLT53X3B0cl0ud3JpdGVfdGltaW5nID09IGJzLT50b3RiaXQpIHsKKyAgICAgICAgICAgICAgICBwdXRoZWFkZXJfYml0cyhnZmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnMtPmJ1Zlticy0+YnVmX2J5dGVfaWR4XSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBrID0gTWluKGosIGJzLT5idWZfYml0X2lkeCk7CisgICAgICAgIGogLT0gazsKKworICAgICAgICBicy0+YnVmX2JpdF9pZHggLT0gazsKKworICAgICAgICBhc3NlcnQoaiA8IE1BWF9MRU5HVEgpOyAvKiAzMiB0b28gbGFyZ2Ugb24gMzIgYml0IG1hY2hpbmVzICovCisgICAgICAgIGFzc2VydChicy0+YnVmX2JpdF9pZHggPCBNQVhfTEVOR1RIKTsKKworICAgICAgICBicy0+YnVmW2JzLT5idWZfYnl0ZV9pZHhdIHw9ICgodmFsID4+IGopIDw8IGJzLT5idWZfYml0X2lkeCk7CisgICAgICAgIGJzLT50b3RiaXQgKz0gazsKKyAgICB9Cit9CisKKy8qd3JpdGUgaiBiaXRzIGludG8gdGhlIGJpdCBzdHJlYW0sIGlnbm9yaW5nIGZyYW1lIGhlYWRlcnMgKi8KK2lubGluZSBzdGF0aWMgdm9pZAorcHV0Yml0c19ub2hlYWRlcnMobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgaW50IHZhbCwgaW50IGopCit7CisgICAgQml0X3N0cmVhbV9zdHJ1YyAqYnM7CisgICAgYnMgPSAmZ2ZjLT5iczsKKworICAgIGFzc2VydChqIDwgTUFYX0xFTkdUSCAtIDIpOworCisgICAgd2hpbGUgKGogPiAwKSB7CisgICAgICAgIGludCAgICAgazsKKyAgICAgICAgaWYgKGJzLT5idWZfYml0X2lkeCA9PSAwKSB7CisgICAgICAgICAgICBicy0+YnVmX2JpdF9pZHggPSA4OworICAgICAgICAgICAgYnMtPmJ1Zl9ieXRlX2lkeCsrOworICAgICAgICAgICAgYXNzZXJ0KGJzLT5idWZfYnl0ZV9pZHggPCBCVUZGRVJfU0laRSk7CisgICAgICAgICAgICBicy0+YnVmW2JzLT5idWZfYnl0ZV9pZHhdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGsgPSBNaW4oaiwgYnMtPmJ1Zl9iaXRfaWR4KTsKKyAgICAgICAgaiAtPSBrOworCisgICAgICAgIGJzLT5idWZfYml0X2lkeCAtPSBrOworCisgICAgICAgIGFzc2VydChqIDwgTUFYX0xFTkdUSCk7IC8qIDMyIHRvbyBsYXJnZSBvbiAzMiBiaXQgbWFjaGluZXMgKi8KKyAgICAgICAgYXNzZXJ0KGJzLT5idWZfYml0X2lkeCA8IE1BWF9MRU5HVEgpOworCisgICAgICAgIGJzLT5idWZbYnMtPmJ1Zl9ieXRlX2lkeF0gfD0gKCh2YWwgPj4gaikgPDwgYnMtPmJ1Zl9iaXRfaWR4KTsKKyAgICAgICAgYnMtPnRvdGJpdCArPSBrOworICAgIH0KK30KKworCisvKgorICBTb21lIGNvbWJpbmF0aW9ucyBvZiBiaXRyYXRlLCBGcywgYW5kIHN0ZXJlbyBtYWtlIGl0IGltcG9zc2libGUgdG8gc3R1ZmYKKyAgb3V0IGEgZnJhbWUgdXNpbmcganVzdCBtYWluX2RhdGEsIGR1ZSB0byB0aGUgbGltaXRlZCBudW1iZXIgb2YgYml0cyB0bworICBpbmRpY2F0ZSBtYWluX2RhdGFfbGVuZ3RoLiBJbiB0aGVzZSBzaXR1YXRpb25zLCB3ZSBwdXQgc3R1ZmZpbmcgYml0cyBpbnRvCisgIHRoZSBhbmNpbGxhcnkgZGF0YS4uLgorKi8KKworaW5saW5lIHN0YXRpYyB2b2lkCitkcmFpbl9pbnRvX2FuY2lsbGFyeShsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBpbnQgcmVtYWluaW5nQml0cykKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgaTsKKyAgICBhc3NlcnQocmVtYWluaW5nQml0cyA+PSAwKTsKKworICAgIGlmIChyZW1haW5pbmdCaXRzID49IDgpIHsKKyAgICAgICAgcHV0Yml0czIoZ2ZjLCAweDRjLCA4KTsKKyAgICAgICAgcmVtYWluaW5nQml0cyAtPSA4OworICAgIH0KKyAgICBpZiAocmVtYWluaW5nQml0cyA+PSA4KSB7CisgICAgICAgIHB1dGJpdHMyKGdmYywgMHg0MSwgOCk7CisgICAgICAgIHJlbWFpbmluZ0JpdHMgLT0gODsKKyAgICB9CisgICAgaWYgKHJlbWFpbmluZ0JpdHMgPj0gOCkgeworICAgICAgICBwdXRiaXRzMihnZmMsIDB4NGQsIDgpOworICAgICAgICByZW1haW5pbmdCaXRzIC09IDg7CisgICAgfQorICAgIGlmIChyZW1haW5pbmdCaXRzID49IDgpIHsKKyAgICAgICAgcHV0Yml0czIoZ2ZjLCAweDQ1LCA4KTsKKyAgICAgICAgcmVtYWluaW5nQml0cyAtPSA4OworICAgIH0KKworICAgIGlmIChyZW1haW5pbmdCaXRzID49IDMyKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHZlcnNpb24gPSBnZXRfbGFtZV9zaG9ydF92ZXJzaW9uKCk7CisgICAgICAgIGlmIChyZW1haW5pbmdCaXRzID49IDMyKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHN0cmxlbih2ZXJzaW9uKSAmJiByZW1haW5pbmdCaXRzID49IDg7ICsraSkgeworICAgICAgICAgICAgICAgIHJlbWFpbmluZ0JpdHMgLT0gODsKKyAgICAgICAgICAgICAgICBwdXRiaXRzMihnZmMsIHZlcnNpb25baV0sIDgpOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoOyByZW1haW5pbmdCaXRzID49IDE7IHJlbWFpbmluZ0JpdHMgLT0gMSkgeworICAgICAgICBwdXRiaXRzMihnZmMsIGdmYy0+YW5jaWxsYXJ5X2ZsYWcsIDEpOworICAgICAgICBnZmMtPmFuY2lsbGFyeV9mbGFnIF49ICFnZnAtPmRpc2FibGVfcmVzZXJ2b2lyOworICAgIH0KKworICAgIGFzc2VydChyZW1haW5pbmdCaXRzID09IDApOworCit9CisKKy8qd3JpdGUgTiBiaXRzIGludG8gdGhlIGhlYWRlciAqLworaW5saW5lIHN0YXRpYyB2b2lkCit3cml0ZWhlYWRlcihsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBpbnQgdmFsLCBpbnQgaikKK3sKKyAgICBpbnQgICAgIHB0ciA9IGdmYy0+aGVhZGVyW2dmYy0+aF9wdHJdLnB0cjsKKworICAgIHdoaWxlIChqID4gMCkgeworICAgICAgICBpbnQgY29uc3QgayA9IE1pbihqLCA4IC0gKHB0ciAmIDcpKTsKKyAgICAgICAgaiAtPSBrOworICAgICAgICBhc3NlcnQoaiA8IE1BWF9MRU5HVEgpOyAvKiA+PiAzMiAgdG9vIGxhcmdlIGZvciAzMiBiaXQgbWFjaGluZXMgKi8KKyAgICAgICAgZ2ZjLT5oZWFkZXJbZ2ZjLT5oX3B0cl0uYnVmW3B0ciA+PiAzXQorICAgICAgICAgICAgfD0gKCh2YWwgPj4gaikpIDw8ICg4IC0gKHB0ciAmIDcpIC0gayk7CisgICAgICAgIHB0ciArPSBrOworICAgIH0KKyAgICBnZmMtPmhlYWRlcltnZmMtPmhfcHRyXS5wdHIgPSBwdHI7Cit9CisKKworc3RhdGljIGludAorQ1JDX3VwZGF0ZShpbnQgdmFsdWUsIGludCBjcmMpCit7CisgICAgaW50ICAgICBpOworICAgIHZhbHVlIDw8PSA4OworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgdmFsdWUgPDw9IDE7CisgICAgICAgIGNyYyA8PD0gMTsKKworICAgICAgICBpZiAoKChjcmMgXiB2YWx1ZSkgJiAweDEwMDAwKSkKKyAgICAgICAgICAgIGNyYyBePSBDUkMxNl9QT0xZTk9NSUFMOworICAgIH0KKyAgICByZXR1cm4gY3JjOworfQorCisKK3ZvaWQKK0NSQ193cml0ZWhlYWRlcihsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMsIGNoYXIgKmhlYWRlcikKK3sKKyAgICBpbnQgICAgIGNyYyA9IDB4ZmZmZjsgICAgLyogKGpvKSBpbml0IGNyYzE2IGZvciBlcnJvcl9wcm90ZWN0aW9uICovCisgICAgaW50ICAgICBpOworCisgICAgY3JjID0gQ1JDX3VwZGF0ZSgoKHVuc2lnbmVkIGNoYXIgKikgaGVhZGVyKVsyXSwgY3JjKTsKKyAgICBjcmMgPSBDUkNfdXBkYXRlKCgodW5zaWduZWQgY2hhciAqKSBoZWFkZXIpWzNdLCBjcmMpOworICAgIGZvciAoaSA9IDY7IGkgPCBnZmMtPnNpZGVpbmZvX2xlbjsgaSsrKSB7CisgICAgICAgIGNyYyA9IENSQ191cGRhdGUoKCh1bnNpZ25lZCBjaGFyICopIGhlYWRlcilbaV0sIGNyYyk7CisgICAgfQorCisgICAgaGVhZGVyWzRdID0gY3JjID4+IDg7CisgICAgaGVhZGVyWzVdID0gY3JjICYgMjU1OworfQorCitpbmxpbmUgc3RhdGljIHZvaWQKK2VuY29kZVNpZGVJbmZvMihsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBpbnQgYml0c1BlckZyYW1lKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgSUlJX3NpZGVfaW5mb190ICpsM19zaWRlOworICAgIGludCAgICAgZ3IsIGNoOworCisgICAgbDNfc2lkZSA9ICZnZmMtPmwzX3NpZGU7CisgICAgZ2ZjLT5oZWFkZXJbZ2ZjLT5oX3B0cl0ucHRyID0gMDsKKyAgICBtZW1zZXQoZ2ZjLT5oZWFkZXJbZ2ZjLT5oX3B0cl0uYnVmLCAwLCBnZmMtPnNpZGVpbmZvX2xlbik7CisgICAgaWYgKGdmcC0+b3V0X3NhbXBsZXJhdGUgPCAxNjAwMCkKKyAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCAweGZmZSwgMTIpOworICAgIGVsc2UKKyAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCAweGZmZiwgMTIpOworICAgIHdyaXRlaGVhZGVyKGdmYywgKGdmcC0+dmVyc2lvbiksIDEpOworICAgIHdyaXRlaGVhZGVyKGdmYywgNCAtIDMsIDIpOworICAgIHdyaXRlaGVhZGVyKGdmYywgKCFnZnAtPmVycm9yX3Byb3RlY3Rpb24pLCAxKTsKKyAgICB3cml0ZWhlYWRlcihnZmMsIChnZmMtPmJpdHJhdGVfaW5kZXgpLCA0KTsKKyAgICB3cml0ZWhlYWRlcihnZmMsIChnZmMtPnNhbXBsZXJhdGVfaW5kZXgpLCAyKTsKKyAgICB3cml0ZWhlYWRlcihnZmMsIChnZmMtPnBhZGRpbmcpLCAxKTsKKyAgICB3cml0ZWhlYWRlcihnZmMsIChnZnAtPmV4dGVuc2lvbiksIDEpOworICAgIHdyaXRlaGVhZGVyKGdmYywgKGdmcC0+bW9kZSksIDIpOworICAgIHdyaXRlaGVhZGVyKGdmYywgKGdmYy0+bW9kZV9leHQpLCAyKTsKKyAgICB3cml0ZWhlYWRlcihnZmMsIChnZnAtPmNvcHlyaWdodCksIDEpOworICAgIHdyaXRlaGVhZGVyKGdmYywgKGdmcC0+b3JpZ2luYWwpLCAxKTsKKyAgICB3cml0ZWhlYWRlcihnZmMsIChnZnAtPmVtcGhhc2lzKSwgMik7CisgICAgaWYgKGdmcC0+ZXJyb3JfcHJvdGVjdGlvbikgeworICAgICAgICB3cml0ZWhlYWRlcihnZmMsIDAsIDE2KTsgLyogZHVtbXkgKi8KKyAgICB9CisKKyAgICBpZiAoZ2ZwLT52ZXJzaW9uID09IDEpIHsKKyAgICAgICAgLyogTVBFRzEgKi8KKyAgICAgICAgYXNzZXJ0KGwzX3NpZGUtPm1haW5fZGF0YV9iZWdpbiA+PSAwKTsKKyAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCAobDNfc2lkZS0+bWFpbl9kYXRhX2JlZ2luKSwgOSk7CisKKyAgICAgICAgaWYgKGdmYy0+Y2hhbm5lbHNfb3V0ID09IDIpCisgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGwzX3NpZGUtPnByaXZhdGVfYml0cywgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgbDNfc2lkZS0+cHJpdmF0ZV9iaXRzLCA1KTsKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgaW50ICAgICBiYW5kOworICAgICAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDQ7IGJhbmQrKykgeworICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgbDNfc2lkZS0+c2Nmc2lbY2hdW2JhbmRdLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IDI7IGdyKyspIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICAgICAgZ3JfaW5mbyAqY29uc3QgZ2kgPSAmbDNfc2lkZS0+dHRbZ3JdW2NoXTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5wYXJ0Ml8zX2xlbmd0aCArIGdpLT5wYXJ0Ml9sZW5ndGgsIDEyKTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5iaWdfdmFsdWVzIC8gMiwgOSk7CisgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+Z2xvYmFsX2dhaW4sIDgpOworICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnNjYWxlZmFjX2NvbXByZXNzLCA0KTsKKworICAgICAgICAgICAgICAgIGlmIChnaS0+YmxvY2tfdHlwZSAhPSBOT1JNX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCAxLCAxKTsgLyogd2luZG93X3N3aXRjaGluZ19mbGFnICovCisgICAgICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPmJsb2NrX3R5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5taXhlZF9ibG9ja19mbGFnLCAxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZ2ktPnRhYmxlX3NlbGVjdFswXSA9PSAxNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdpLT50YWJsZV9zZWxlY3RbMF0gPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+dGFibGVfc2VsZWN0WzBdLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdpLT50YWJsZV9zZWxlY3RbMV0gPT0gMTQpCisgICAgICAgICAgICAgICAgICAgICAgICBnaS0+dGFibGVfc2VsZWN0WzFdID0gMTY7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnRhYmxlX3NlbGVjdFsxXSwgNSk7CisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+c3ViYmxvY2tfZ2FpblswXSwgMyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnN1YmJsb2NrX2dhaW5bMV0sIDMpOworICAgICAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5zdWJibG9ja19nYWluWzJdLCAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgMCwgMSk7IC8qIHdpbmRvd19zd2l0Y2hpbmdfZmxhZyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2ktPnRhYmxlX3NlbGVjdFswXSA9PSAxNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdpLT50YWJsZV9zZWxlY3RbMF0gPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+dGFibGVfc2VsZWN0WzBdLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdpLT50YWJsZV9zZWxlY3RbMV0gPT0gMTQpCisgICAgICAgICAgICAgICAgICAgICAgICBnaS0+dGFibGVfc2VsZWN0WzFdID0gMTY7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnRhYmxlX3NlbGVjdFsxXSwgNSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChnaS0+dGFibGVfc2VsZWN0WzJdID09IDE0KQorICAgICAgICAgICAgICAgICAgICAgICAgZ2ktPnRhYmxlX3NlbGVjdFsyXSA9IDE2OworICAgICAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT50YWJsZV9zZWxlY3RbMl0sIDUpOworCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwIDw9IGdpLT5yZWdpb24wX2NvdW50ICYmIGdpLT5yZWdpb24wX2NvdW50IDwgMTYpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCA8PSBnaS0+cmVnaW9uMV9jb3VudCAmJiBnaS0+cmVnaW9uMV9jb3VudCA8IDgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5yZWdpb24wX2NvdW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+cmVnaW9uMV9jb3VudCwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnByZWZsYWcsIDEpOworICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnNjYWxlZmFjX3NjYWxlLCAxKTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5jb3VudDF0YWJsZV9zZWxlY3QsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBNUEVHMiAqLworICAgICAgICBhc3NlcnQobDNfc2lkZS0+bWFpbl9kYXRhX2JlZ2luID49IDApOworICAgICAgICB3cml0ZWhlYWRlcihnZmMsIChsM19zaWRlLT5tYWluX2RhdGFfYmVnaW4pLCA4KTsKKyAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBsM19zaWRlLT5wcml2YXRlX2JpdHMsIGdmYy0+Y2hhbm5lbHNfb3V0KTsKKworICAgICAgICBnciA9IDA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICBncl9pbmZvICpjb25zdCBnaSA9ICZsM19zaWRlLT50dFtncl1bY2hdOworICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+cGFydDJfM19sZW5ndGggKyBnaS0+cGFydDJfbGVuZ3RoLCAxMik7CisgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5iaWdfdmFsdWVzIC8gMiwgOSk7CisgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5nbG9iYWxfZ2FpbiwgOCk7CisgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5zY2FsZWZhY19jb21wcmVzcywgOSk7CisKKyAgICAgICAgICAgIGlmIChnaS0+YmxvY2tfdHlwZSAhPSBOT1JNX1RZUEUpIHsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIDEsIDEpOyAvKiB3aW5kb3dfc3dpdGNoaW5nX2ZsYWcgKi8KKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5ibG9ja190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5taXhlZF9ibG9ja19mbGFnLCAxKTsKKworICAgICAgICAgICAgICAgIGlmIChnaS0+dGFibGVfc2VsZWN0WzBdID09IDE0KQorICAgICAgICAgICAgICAgICAgICBnaS0+dGFibGVfc2VsZWN0WzBdID0gMTY7CisgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+dGFibGVfc2VsZWN0WzBdLCA1KTsKKyAgICAgICAgICAgICAgICBpZiAoZ2ktPnRhYmxlX3NlbGVjdFsxXSA9PSAxNCkKKyAgICAgICAgICAgICAgICAgICAgZ2ktPnRhYmxlX3NlbGVjdFsxXSA9IDE2OworICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnRhYmxlX3NlbGVjdFsxXSwgNSk7CisKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5zdWJibG9ja19nYWluWzBdLCAzKTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5zdWJibG9ja19nYWluWzFdLCAzKTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5zdWJibG9ja19nYWluWzJdLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgMCwgMSk7IC8qIHdpbmRvd19zd2l0Y2hpbmdfZmxhZyAqLworICAgICAgICAgICAgICAgIGlmIChnaS0+dGFibGVfc2VsZWN0WzBdID09IDE0KQorICAgICAgICAgICAgICAgICAgICBnaS0+dGFibGVfc2VsZWN0WzBdID0gMTY7CisgICAgICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+dGFibGVfc2VsZWN0WzBdLCA1KTsKKyAgICAgICAgICAgICAgICBpZiAoZ2ktPnRhYmxlX3NlbGVjdFsxXSA9PSAxNCkKKyAgICAgICAgICAgICAgICAgICAgZ2ktPnRhYmxlX3NlbGVjdFsxXSA9IDE2OworICAgICAgICAgICAgICAgIHdyaXRlaGVhZGVyKGdmYywgZ2ktPnRhYmxlX3NlbGVjdFsxXSwgNSk7CisgICAgICAgICAgICAgICAgaWYgKGdpLT50YWJsZV9zZWxlY3RbMl0gPT0gMTQpCisgICAgICAgICAgICAgICAgICAgIGdpLT50YWJsZV9zZWxlY3RbMl0gPSAxNjsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT50YWJsZV9zZWxlY3RbMl0sIDUpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0KDAgPD0gZ2ktPnJlZ2lvbjBfY291bnQgJiYgZ2ktPnJlZ2lvbjBfY291bnQgPCAxNik7CisgICAgICAgICAgICAgICAgYXNzZXJ0KDAgPD0gZ2ktPnJlZ2lvbjFfY291bnQgJiYgZ2ktPnJlZ2lvbjFfY291bnQgPCA4KTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5yZWdpb24wX2NvdW50LCA0KTsKKyAgICAgICAgICAgICAgICB3cml0ZWhlYWRlcihnZmMsIGdpLT5yZWdpb24xX2NvdW50LCAzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+c2NhbGVmYWNfc2NhbGUsIDEpOworICAgICAgICAgICAgd3JpdGVoZWFkZXIoZ2ZjLCBnaS0+Y291bnQxdGFibGVfc2VsZWN0LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZnAtPmVycm9yX3Byb3RlY3Rpb24pIHsKKyAgICAgICAgLyogKGpvKSBlcnJvcl9wcm90ZWN0aW9uOiBhZGQgY3JjMTYgaW5mb3JtYXRpb24gdG8gaGVhZGVyICovCisgICAgICAgIENSQ193cml0ZWhlYWRlcihnZmMsIGdmYy0+aGVhZGVyW2dmYy0+aF9wdHJdLmJ1Zik7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQgY29uc3Qgb2xkID0gZ2ZjLT5oX3B0cjsKKyAgICAgICAgYXNzZXJ0KGdmYy0+aGVhZGVyW29sZF0ucHRyID09IGdmYy0+c2lkZWluZm9fbGVuICogOCk7CisKKyAgICAgICAgZ2ZjLT5oX3B0ciA9IChvbGQgKyAxKSAmIChNQVhfSEVBREVSX0JVRiAtIDEpOworICAgICAgICBnZmMtPmhlYWRlcltnZmMtPmhfcHRyXS53cml0ZV90aW1pbmcgPSBnZmMtPmhlYWRlcltvbGRdLndyaXRlX3RpbWluZyArIGJpdHNQZXJGcmFtZTsKKworICAgICAgICBpZiAoZ2ZjLT5oX3B0ciA9PSBnZmMtPndfcHRyKSB7CisgICAgICAgICAgICAvKiB5aWtlcyEgd2UgYXJlIG91dCBvZiBoZWFkZXIgYnVmZmVyIHNwYWNlICovCisgICAgICAgICAgICBFUlJPUkYoZ2ZjLCAiRXJyb3I6IE1BWF9IRUFERVJfQlVGIHRvbyBzbWFsbCBpbiBiaXRzdHJlYW0uYyBcbiIpOworICAgICAgICB9CisKKyAgICB9Cit9CisKKworaW5saW5lIHN0YXRpYyBpbnQKK2h1ZmZtYW5fY29kZXJfY291bnQxKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGdyX2luZm8gY29uc3QgKmdpKQoreworICAgIC8qIFdyaXRlIGNvdW50MSBhcmVhICovCisgICAgc3RydWN0IGh1ZmZjb2RldGFiIGNvbnN0ICpjb25zdCBoID0gJmh0W2dpLT5jb3VudDF0YWJsZV9zZWxlY3QgKyAzMl07CisgICAgaW50ICAgICBpLCBiaXRzID0gMDsKKyNpZmRlZiBERUJVRworICAgIGludCAgICAgZ2VnZWJvID0gZ2ZjLT5icy50b3RiaXQ7CisjZW5kaWYKKworICAgIGludCBjb25zdCAqaXggPSAmZ2ktPmwzX2VuY1tnaS0+YmlnX3ZhbHVlc107CisgICAgRkxPQVQgY29uc3QgKnhyID0gJmdpLT54cltnaS0+YmlnX3ZhbHVlc107CisgICAgYXNzZXJ0KGdpLT5jb3VudDF0YWJsZV9zZWxlY3QgPCAyKTsKKworICAgIGZvciAoaSA9IChnaS0+Y291bnQxIC0gZ2ktPmJpZ192YWx1ZXMpIC8gNDsgaSA+IDA7IC0taSkgeworICAgICAgICBpbnQgICAgIGh1ZmZiaXRzID0gMDsKKyAgICAgICAgaW50ICAgICBwID0gMCwgdjsKKworICAgICAgICB2ID0gaXhbMF07CisgICAgICAgIGlmICh2KSB7CisgICAgICAgICAgICBwICs9IDg7CisgICAgICAgICAgICBpZiAoeHJbMF0gPCAwKQorICAgICAgICAgICAgICAgIGh1ZmZiaXRzKys7CisgICAgICAgICAgICBhc3NlcnQodiA8PSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHYgPSBpeFsxXTsKKyAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgIHAgKz0gNDsKKyAgICAgICAgICAgIGh1ZmZiaXRzICo9IDI7CisgICAgICAgICAgICBpZiAoeHJbMV0gPCAwKQorICAgICAgICAgICAgICAgIGh1ZmZiaXRzKys7CisgICAgICAgICAgICBhc3NlcnQodiA8PSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHYgPSBpeFsyXTsKKyAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIGh1ZmZiaXRzICo9IDI7CisgICAgICAgICAgICBpZiAoeHJbMl0gPCAwKQorICAgICAgICAgICAgICAgIGh1ZmZiaXRzKys7CisgICAgICAgICAgICBhc3NlcnQodiA8PSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHYgPSBpeFszXTsKKyAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGh1ZmZiaXRzICo9IDI7CisgICAgICAgICAgICBpZiAoeHJbM10gPCAwKQorICAgICAgICAgICAgICAgIGh1ZmZiaXRzKys7CisgICAgICAgICAgICBhc3NlcnQodiA8PSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGl4ICs9IDQ7CisgICAgICAgIHhyICs9IDQ7CisgICAgICAgIHB1dGJpdHMyKGdmYywgaHVmZmJpdHMgKyBoLT50YWJsZVtwXSwgaC0+aGxlbltwXSk7CisgICAgICAgIGJpdHMgKz0gaC0+aGxlbltwXTsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBERUJVR0YoZ2ZjLCAiY291bnQxOiByZWFsOiAlbGQgY291bnRlZDolZCAoYmlndiAlZCBjb3VudDFsZW4gJWQpXG4iLAorICAgICAgICAgICBnZmMtPmJzLnRvdGJpdCAtIGdlZ2VibywgZ2ktPmNvdW50MWJpdHMsIGdpLT5iaWdfdmFsdWVzLCBnaS0+Y291bnQxKTsKKyNlbmRpZgorICAgIHJldHVybiBiaXRzOworfQorCisKKworLyoKKyAgSW1wbGVtZW50cyB0aGUgcHNldWRvY29kZSBvZiBwYWdlIDk4IG9mIHRoZSBJUworICAqLworaW5saW5lIHN0YXRpYyBpbnQKK0h1ZmZtYW5jb2RlKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMsIGNvbnN0IHVuc2lnbmVkIGludCB0YWJsZWluZGV4LAorICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBncl9pbmZvIGNvbnN0ICpnaSkKK3sKKyAgICBzdHJ1Y3QgaHVmZmNvZGV0YWIgY29uc3QgKmNvbnN0IGggPSAmaHRbdGFibGVpbmRleF07CisgICAgaW50ICAgICBpLCBiaXRzID0gMDsKKworICAgIGFzc2VydCh0YWJsZWluZGV4IDwgMzJ1KTsKKyAgICBpZiAoIXRhYmxlaW5kZXgpCisgICAgICAgIHJldHVybiBiaXRzOworCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMikgeworICAgICAgICBpbnQgICAgIGNiaXRzID0gMDsKKyAgICAgICAgaW50ICAgICB4Yml0cyA9IDA7CisgICAgICAgIGludCBjb25zdCBsaW5iaXRzID0gaC0+eGxlbjsKKyAgICAgICAgaW50ICAgICB4bGVuID0gaC0+eGxlbjsKKyAgICAgICAgaW50ICAgICBleHQgPSAwOworICAgICAgICBpbnQgICAgIHgxID0gZ2ktPmwzX2VuY1tpXTsKKyAgICAgICAgaW50ICAgICB4MiA9IGdpLT5sM19lbmNbaSArIDFdOworCisgICAgICAgIGlmICh4MSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZ2ktPnhyW2ldIDwgMCkKKyAgICAgICAgICAgICAgICBleHQrKzsKKyAgICAgICAgICAgIGNiaXRzLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFibGVpbmRleCA+IDE1KSB7CisgICAgICAgICAgICAvKiB1c2UgRVNDLXdvcmRzICovCisgICAgICAgICAgICBpZiAoeDEgPiAxNCkgeworICAgICAgICAgICAgICAgIGludCBjb25zdCBsaW5iaXRzX3gxID0geDEgLSAxNTsKKyAgICAgICAgICAgICAgICBhc3NlcnQobGluYml0c194MSA8PSBoLT5saW5tYXgpOworICAgICAgICAgICAgICAgIGV4dCB8PSBsaW5iaXRzX3gxIDw8IDE7CisgICAgICAgICAgICAgICAgeGJpdHMgPSBsaW5iaXRzOworICAgICAgICAgICAgICAgIHgxID0gMTU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh4MiA+IDE0KSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IGxpbmJpdHNfeDIgPSB4MiAtIDE1OworICAgICAgICAgICAgICAgIGFzc2VydChsaW5iaXRzX3gyIDw9IGgtPmxpbm1heCk7CisgICAgICAgICAgICAgICAgZXh0IDw8PSBsaW5iaXRzOworICAgICAgICAgICAgICAgIGV4dCB8PSBsaW5iaXRzX3gyOworICAgICAgICAgICAgICAgIHhiaXRzICs9IGxpbmJpdHM7CisgICAgICAgICAgICAgICAgeDIgPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhsZW4gPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4MiAhPSAwKSB7CisgICAgICAgICAgICBleHQgPDw9IDE7CisgICAgICAgICAgICBpZiAoZ2ktPnhyW2kgKyAxXSA8IDApCisgICAgICAgICAgICAgICAgZXh0Kys7CisgICAgICAgICAgICBjYml0cy0tOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KCh4MSB8IHgyKSA8IDE2KTsKKworICAgICAgICB4MSA9IHgxICogeGxlbiArIHgyOworICAgICAgICB4Yml0cyAtPSBjYml0czsKKyAgICAgICAgY2JpdHMgKz0gaC0+aGxlblt4MV07CisKKyAgICAgICAgYXNzZXJ0KGNiaXRzIDw9IE1BWF9MRU5HVEgpOworICAgICAgICBhc3NlcnQoeGJpdHMgPD0gTUFYX0xFTkdUSCk7CisKKyAgICAgICAgcHV0Yml0czIoZ2ZjLCBoLT50YWJsZVt4MV0sIGNiaXRzKTsKKyAgICAgICAgcHV0Yml0czIoZ2ZjLCBleHQsIHhiaXRzKTsKKyAgICAgICAgYml0cyArPSBjYml0cyArIHhiaXRzOworICAgIH0KKyAgICByZXR1cm4gYml0czsKK30KKworLyoKKyAgTm90ZSB0aGUgZGlzY3Vzc2lvbiBvZiBodWZmbWFuY29kZWJpdHMoKSBvbiBwYWdlcyAyOAorICBhbmQgMjkgb2YgdGhlIElTLCBhcyB3ZWxsIGFzIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgc2lkZQorICBpbmZvcm1hdGlvbiBvbiBwYWdlcyAyNiBhbmQgMjcuCisgICovCitzdGF0aWMgaW50CitTaG9ydEh1ZmZtYW5jb2RlYml0cyhsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBncl9pbmZvIGNvbnN0ICpnaSkKK3sKKyAgICBpbnQgICAgIGJpdHM7CisgICAgaW50ICAgICByZWdpb24xU3RhcnQ7CisKKyAgICByZWdpb24xU3RhcnQgPSAzICogZ2ZjLT5zY2FsZWZhY19iYW5kLnNbM107CisgICAgaWYgKHJlZ2lvbjFTdGFydCA+IGdpLT5iaWdfdmFsdWVzKQorICAgICAgICByZWdpb24xU3RhcnQgPSBnaS0+YmlnX3ZhbHVlczsKKworICAgIC8qIHNob3J0IGJsb2NrcyBkbyBub3QgaGF2ZSBhIHJlZ2lvbjIgKi8KKyAgICBiaXRzID0gSHVmZm1hbmNvZGUoZ2ZjLCBnaS0+dGFibGVfc2VsZWN0WzBdLCAwLCByZWdpb24xU3RhcnQsIGdpKTsKKyAgICBiaXRzICs9IEh1ZmZtYW5jb2RlKGdmYywgZ2ktPnRhYmxlX3NlbGVjdFsxXSwgcmVnaW9uMVN0YXJ0LCBnaS0+YmlnX3ZhbHVlcywgZ2kpOworICAgIHJldHVybiBiaXRzOworfQorCitzdGF0aWMgaW50CitMb25nSHVmZm1hbmNvZGViaXRzKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGdyX2luZm8gY29uc3QgKmdpKQoreworICAgIGludCAgICAgaSwgYmlndmFsdWVzLCBiaXRzOworICAgIGludCAgICAgcmVnaW9uMVN0YXJ0LCByZWdpb24yU3RhcnQ7CisKKyAgICBiaWd2YWx1ZXMgPSBnaS0+YmlnX3ZhbHVlczsKKyAgICBhc3NlcnQoMCA8PSBiaWd2YWx1ZXMgJiYgYmlndmFsdWVzIDw9IDU3Nik7CisKKyAgICBpID0gZ2ktPnJlZ2lvbjBfY291bnQgKyAxOworICAgIGFzc2VydCgwIDw9IGkpOworICAgIGFzc2VydCgoc2l6ZV90KSBpIDwgZGltZW5zaW9uX29mKGdmYy0+c2NhbGVmYWNfYmFuZC5sKSk7CisgICAgcmVnaW9uMVN0YXJ0ID0gZ2ZjLT5zY2FsZWZhY19iYW5kLmxbaV07CisgICAgaSArPSBnaS0+cmVnaW9uMV9jb3VudCArIDE7CisgICAgYXNzZXJ0KDAgPD0gaSk7CisgICAgYXNzZXJ0KChzaXplX3QpIGkgPCBkaW1lbnNpb25fb2YoZ2ZjLT5zY2FsZWZhY19iYW5kLmwpKTsKKyAgICByZWdpb24yU3RhcnQgPSBnZmMtPnNjYWxlZmFjX2JhbmQubFtpXTsKKworICAgIGlmIChyZWdpb24xU3RhcnQgPiBiaWd2YWx1ZXMpCisgICAgICAgIHJlZ2lvbjFTdGFydCA9IGJpZ3ZhbHVlczsKKworICAgIGlmIChyZWdpb24yU3RhcnQgPiBiaWd2YWx1ZXMpCisgICAgICAgIHJlZ2lvbjJTdGFydCA9IGJpZ3ZhbHVlczsKKworICAgIGJpdHMgPSBIdWZmbWFuY29kZShnZmMsIGdpLT50YWJsZV9zZWxlY3RbMF0sIDAsIHJlZ2lvbjFTdGFydCwgZ2kpOworICAgIGJpdHMgKz0gSHVmZm1hbmNvZGUoZ2ZjLCBnaS0+dGFibGVfc2VsZWN0WzFdLCByZWdpb24xU3RhcnQsIHJlZ2lvbjJTdGFydCwgZ2kpOworICAgIGJpdHMgKz0gSHVmZm1hbmNvZGUoZ2ZjLCBnaS0+dGFibGVfc2VsZWN0WzJdLCByZWdpb24yU3RhcnQsIGJpZ3ZhbHVlcywgZ2kpOworICAgIHJldHVybiBiaXRzOworfQorCitpbmxpbmUgc3RhdGljIGludAord3JpdGVNYWluRGF0YShsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZwKQoreworICAgIGludCAgICAgZ3IsIGNoLCBzZmIsIGRhdGFfYml0cywgdG90X2JpdHMgPSAwOworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgSUlJX3NpZGVfaW5mb190IGNvbnN0ICpjb25zdCBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKworICAgIGlmIChnZnAtPnZlcnNpb24gPT0gMSkgeworICAgICAgICAvKiBNUEVHIDEgKi8KKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgMjsgZ3IrKykgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLT5jaGFubmVsc19vdXQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBncl9pbmZvIGNvbnN0ICpjb25zdCBnaSA9ICZsM19zaWRlLT50dFtncl1bY2hdOworICAgICAgICAgICAgICAgIGludCBjb25zdCBzbGVuMSA9IHNsZW4xX3RhYltnaS0+c2NhbGVmYWNfY29tcHJlc3NdOworICAgICAgICAgICAgICAgIGludCBjb25zdCBzbGVuMiA9IHNsZW4yX3RhYltnaS0+c2NhbGVmYWNfY29tcHJlc3NdOworICAgICAgICAgICAgICAgIGRhdGFfYml0cyA9IDA7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICBob2dlZ2UgPSBnZmMtPmJzLnRvdGJpdDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgZ2ktPnNmYmRpdmlkZTsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdpLT5zY2FsZWZhY1tzZmJdID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIHNjZnNpIGlzIHVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcHV0Yml0czIoZ2ZjLCBnaS0+c2NhbGVmYWNbc2ZiXSwgc2xlbjEpOworICAgICAgICAgICAgICAgICAgICBkYXRhX2JpdHMgKz0gc2xlbjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoOyBzZmIgPCBnaS0+c2ZibWF4OyBzZmIrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2ktPnNjYWxlZmFjW3NmYl0gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogc2Nmc2kgaXMgdXNlZCAqLworICAgICAgICAgICAgICAgICAgICBwdXRiaXRzMihnZmMsIGdpLT5zY2FsZWZhY1tzZmJdLCBzbGVuMik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFfYml0cyArPSBzbGVuMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0KGRhdGFfYml0cyA9PSBnaS0+cGFydDJfbGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIGlmIChnaS0+YmxvY2tfdHlwZSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFfYml0cyArPSBTaG9ydEh1ZmZtYW5jb2RlYml0cyhnZmMsIGdpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFfYml0cyArPSBMb25nSHVmZm1hbmNvZGViaXRzKGdmYywgZ2kpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXRhX2JpdHMgKz0gaHVmZm1hbl9jb2Rlcl9jb3VudDEoZ2ZjLCBnaSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICBERUJVR0YoZ2ZjLCAiPCVsZD4gIiwgZ2ZjLT5icy50b3RiaXQgLSBob2dlZ2UpOworI2VuZGlmCisgICAgICAgICAgICAgICAgLyogZG9lcyBiaXRjb3VudCBpbiBxdWFudGl6ZS5jIGFncmVlIHdpdGggYWN0dWFsIGJpdCBjb3VudD8gKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQoZGF0YV9iaXRzID09IGdpLT5wYXJ0Ml8zX2xlbmd0aCArIGdpLT5wYXJ0Ml9sZW5ndGgpOworICAgICAgICAgICAgICAgIHRvdF9iaXRzICs9IGRhdGFfYml0czsKKyAgICAgICAgICAgIH0gICAgICAgICAgIC8qIGZvciBjaCAqLworICAgICAgICB9ICAgICAgICAgICAgICAgLyogZm9yIGdyICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBNUEVHIDIgKi8KKyAgICAgICAgZ3IgPSAwOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgZ3JfaW5mbyBjb25zdCAqY29uc3QgZ2kgPSAmbDNfc2lkZS0+dHRbZ3JdW2NoXTsKKyAgICAgICAgICAgIGludCAgICAgaSwgc2ZiX3BhcnRpdGlvbiwgc2NhbGVfYml0cyA9IDA7CisgICAgICAgICAgICBhc3NlcnQoZ2ktPnNmYl9wYXJ0aXRpb25fdGFibGUpOworICAgICAgICAgICAgZGF0YV9iaXRzID0gMDsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaG9nZWdlID0gZ2ZjLT5icy50b3RiaXQ7CisjZW5kaWYKKyAgICAgICAgICAgIHNmYiA9IDA7CisgICAgICAgICAgICBzZmJfcGFydGl0aW9uID0gMDsKKworICAgICAgICAgICAgaWYgKGdpLT5ibG9ja190eXBlID09IFNIT1JUX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDsgc2ZiX3BhcnRpdGlvbiA8IDQ7IHNmYl9wYXJ0aXRpb24rKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29uc3Qgc2ZicyA9IGdpLT5zZmJfcGFydGl0aW9uX3RhYmxlW3NmYl9wYXJ0aXRpb25dIC8gMzsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0IHNsZW4gPSBnaS0+c2xlbltzZmJfcGFydGl0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNmYnM7IGkrKywgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dGJpdHMyKGdmYywgTWF4KGdpLT5zY2FsZWZhY1tzZmIgKiAzICsgMF0sIDApLCBzbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dGJpdHMyKGdmYywgTWF4KGdpLT5zY2FsZWZhY1tzZmIgKiAzICsgMV0sIDApLCBzbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dGJpdHMyKGdmYywgTWF4KGdpLT5zY2FsZWZhY1tzZmIgKiAzICsgMl0sIDApLCBzbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2JpdHMgKz0gMyAqIHNsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YV9iaXRzICs9IFNob3J0SHVmZm1hbmNvZGViaXRzKGdmYywgZ2kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICg7IHNmYl9wYXJ0aXRpb24gPCA0OyBzZmJfcGFydGl0aW9uKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0IHNmYnMgPSBnaS0+c2ZiX3BhcnRpdGlvbl90YWJsZVtzZmJfcGFydGl0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0IHNsZW4gPSBnaS0+c2xlbltzZmJfcGFydGl0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNmYnM7IGkrKywgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dGJpdHMyKGdmYywgTWF4KGdpLT5zY2FsZWZhY1tzZmJdLCAwKSwgc2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9iaXRzICs9IHNsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YV9iaXRzICs9IExvbmdIdWZmbWFuY29kZWJpdHMoZ2ZjLCBnaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhX2JpdHMgKz0gaHVmZm1hbl9jb2Rlcl9jb3VudDEoZ2ZjLCBnaSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIERFQlVHRihnZmMsICI8JWxkPiAiLCBnZmMtPmJzLnRvdGJpdCAtIGhvZ2VnZSk7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIGRvZXMgYml0Y291bnQgaW4gcXVhbnRpemUuYyBhZ3JlZSB3aXRoIGFjdHVhbCBiaXQgY291bnQ/ICovCisgICAgICAgICAgICBhc3NlcnQoZGF0YV9iaXRzID09IGdpLT5wYXJ0Ml8zX2xlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnQoc2NhbGVfYml0cyA9PSBnaS0+cGFydDJfbGVuZ3RoKTsKKyAgICAgICAgICAgIHRvdF9iaXRzICs9IHNjYWxlX2JpdHMgKyBkYXRhX2JpdHM7CisgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgY2ggKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciBnZiAqLworICAgIHJldHVybiB0b3RfYml0czsKK30gICAgICAgICAgICAgICAgICAgICAgIC8qIG1haW5fZGF0YSAqLworCisKKworLyogY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gZmx1c2ggYWxsIG1wMyBmcmFtZXMKKyAgIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLiAgVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlCisgICByZXNlcnZvaXIgc2l6ZS4gIE9ubHkgY2FsbCB0aGlzIHJvdXRpbmUgYmV0d2VlbiBmcmFtZXMgLSBpLmUuCisgICBvbmx5IGFmdGVyIGFsbCBoZWFkZXJzIGFuZCBkYXRhIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgYnVmZmVyCisgICBieSBmb3JtYXRfYml0c3RyZWFtKCkuCisKKyAgIEFsc28gY29tcHV0ZSB0b3RhbF9iaXRzX291dHB1dCA9CisgICAgICAgc2l6ZSBvZiBtcDMgYnVmZmVyIChpbmNsdWRpbmcgZnJhbWUgaGVhZGVycyB3aGljaCBtYXkgbm90CisgICAgICAgaGF2ZSB5ZXQgYmVlbiBzZW5kIHRvIHRoZSBtcDMgYnVmZmVyKSArCisgICAgICAgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIGZsdXNoIGFsbCBtcDMgZnJhbWVzLgorCisgICB0b3RhbF9ieXRlc19vdXRwdXQgaXMgdGhlIHNpemUgb2YgdGhlIG1wMyBvdXRwdXQgYnVmZmVyIGlmCisgICBsYW1lX2VuY29kZV9mbHVzaF9ub2dhcCgpIHdhcyBjYWxsZWQgcmlnaHQgbm93LgorCisgKi8KK2ludAorY29tcHV0ZV9mbHVzaGJpdHMoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCAqdG90YWxfYnl0ZXNfb3V0cHV0KQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgY29uc3QgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBmbHVzaGJpdHMsIHJlbWFpbmluZ19oZWFkZXJzOworICAgIGludCAgICAgYml0c1BlckZyYW1lOworICAgIGludCAgICAgbGFzdF9wdHIsIGZpcnN0X3B0cjsKKyAgICBmaXJzdF9wdHIgPSBnZmMtPndfcHRyOyAvKiBmaXJzdCBoZWFkZXIgdG8gYWRkIHRvIGJpdHN0cmVhbSAqLworICAgIGxhc3RfcHRyID0gZ2ZjLT5oX3B0ciAtIDE7IC8qIGxhc3QgaGVhZGVyIHRvIGFkZCB0byBiaXRzdHJlYW0gKi8KKyAgICBpZiAobGFzdF9wdHIgPT0gLTEpCisgICAgICAgIGxhc3RfcHRyID0gTUFYX0hFQURFUl9CVUYgLSAxOworCisgICAgLyogYWRkIHRoaXMgbWFueSBiaXRzIHRvIGJpdHN0cmVhbSBzbyB3ZSBjYW4gZmx1c2ggYWxsIGhlYWRlcnMgKi8KKyAgICBmbHVzaGJpdHMgPSBnZmMtPmhlYWRlcltsYXN0X3B0cl0ud3JpdGVfdGltaW5nIC0gZ2ZjLT5icy50b3RiaXQ7CisgICAgKnRvdGFsX2J5dGVzX291dHB1dCA9IGZsdXNoYml0czsKKworICAgIGlmIChmbHVzaGJpdHMgPj0gMCkgeworICAgICAgICAvKiBpZiBmbHVzaGJpdHMgPj0gMCwgc29tZSBoZWFkZXJzIGhhdmUgbm90IHlldCBiZWVuIHdyaXR0ZW4gKi8KKyAgICAgICAgLyogcmVkdWNlIGZsdXNoYml0cyBieSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycyAqLworICAgICAgICByZW1haW5pbmdfaGVhZGVycyA9IDEgKyBsYXN0X3B0ciAtIGZpcnN0X3B0cjsKKyAgICAgICAgaWYgKGxhc3RfcHRyIDwgZmlyc3RfcHRyKQorICAgICAgICAgICAgcmVtYWluaW5nX2hlYWRlcnMgPSAxICsgbGFzdF9wdHIgLSBmaXJzdF9wdHIgKyBNQVhfSEVBREVSX0JVRjsKKyAgICAgICAgZmx1c2hiaXRzIC09IHJlbWFpbmluZ19oZWFkZXJzICogOCAqIGdmYy0+c2lkZWluZm9fbGVuOworICAgIH0KKworCisgICAgLyogZmluYWxseSwgYWRkIHNvbWUgYml0cyBzbyB0aGF0IHRoZSBsYXN0IGZyYW1lIGlzIGNvbXBsZXRlCisgICAgICogdGhlc2UgYml0cyBhcmUgbm90IG5lY2Vzc2FyeSB0byBkZWNvZGUgdGhlIGxhc3QgZnJhbWUsIGJ1dAorICAgICAqIHNvbWUgZGVjb2RlcnMgd2lsbCBpZ25vcmUgbGFzdCBmcmFtZSBpZiB0aGVzZSBiaXRzIGFyZSBtaXNzaW5nCisgICAgICovCisgICAgYml0c1BlckZyYW1lID0gZ2V0ZnJhbWViaXRzKGdmcCk7CisgICAgZmx1c2hiaXRzICs9IGJpdHNQZXJGcmFtZTsKKyAgICAqdG90YWxfYnl0ZXNfb3V0cHV0ICs9IGJpdHNQZXJGcmFtZTsKKyAgICAvKiByb3VuZCB1cDogICAqLworICAgIGlmICgqdG90YWxfYnl0ZXNfb3V0cHV0ICUgOCkKKyAgICAgICAgKnRvdGFsX2J5dGVzX291dHB1dCA9IDEgKyAoKnRvdGFsX2J5dGVzX291dHB1dCAvIDgpOworICAgIGVsc2UKKyAgICAgICAgKnRvdGFsX2J5dGVzX291dHB1dCA9ICgqdG90YWxfYnl0ZXNfb3V0cHV0IC8gOCk7CisgICAgKnRvdGFsX2J5dGVzX291dHB1dCArPSBnZmMtPmJzLmJ1Zl9ieXRlX2lkeCArIDE7CisKKworICAgIGlmIChmbHVzaGJpdHMgPCAwKSB7CisjaWYgMAorICAgICAgICAvKiBpZiBmbHVzaGJpdHMgPCAwLCB0aGlzIHdvdWxkIG1lYW4gdGhhdCB0aGUgYnVmZmVyIGxvb2tzIGxpa2U6CisgICAgICAgICAqIChkYXRhLi4uKSAgbGFzdF9oZWFkZXIgIChkYXRhLi4uKSAgKGV4dHJhIGRhdGEgdGhhdCBzaG91bGQgbm90IGJlIGhlcmUuLi4pCisgICAgICAgICAqLworICAgICAgICBERUJVR0YoZ2ZjLCAibGFzdCBoZWFkZXIgd3JpdGVfdGltaW5nID0gJWkgXG4iLCBnZmMtPmhlYWRlcltsYXN0X3B0cl0ud3JpdGVfdGltaW5nKTsKKyAgICAgICAgREVCVUdGKGdmYywgImZpcnN0IGhlYWRlciB3cml0ZV90aW1pbmcgPSAlaSBcbiIsIGdmYy0+aGVhZGVyW2ZpcnN0X3B0cl0ud3JpdGVfdGltaW5nKTsKKyAgICAgICAgREVCVUdGKGdmYywgImJzLnRvdGJpdDogICAgICAgICAgICAgICAgICVpIFxuIiwgZ2ZjLT5icy50b3RiaXQpOworICAgICAgICBERUJVR0YoZ2ZjLCAiZmlyc3RfcHRyLCBsYXN0X3B0ciAgICAgICAgJWkgJWkgXG4iLCBmaXJzdF9wdHIsIGxhc3RfcHRyKTsKKyAgICAgICAgREVCVUdGKGdmYywgInJlbWFpbmluZ19oZWFkZXJzID0gICAgICAgICVpIFxuIiwgcmVtYWluaW5nX2hlYWRlcnMpOworICAgICAgICBERUJVR0YoZ2ZjLCAiYml0c3BlcmZyYW1lOiAgICAgICAgICAgICAgJWkgXG4iLCBiaXRzUGVyRnJhbWUpOworICAgICAgICBERUJVR0YoZ2ZjLCAic2lkZWxlbjogICAgICAgICAgICAgICAgICAgJWkgXG4iLCBnZmMtPnNpZGVpbmZvX2xlbik7CisjZW5kaWYKKyAgICAgICAgRVJST1JGKGdmYywgInN0cmFuZ2UgZXJyb3IgZmx1c2hpbmcgYnVmZmVyIC4uLiBcbiIpOworICAgIH0KKyAgICByZXR1cm4gZmx1c2hiaXRzOworfQorCisKKwordm9pZAorZmx1c2hfYml0c3RyZWFtKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBJSUlfc2lkZV9pbmZvX3QgKmwzX3NpZGU7CisgICAgaW50ICAgICBuYnl0ZXM7CisgICAgaW50ICAgICBmbHVzaGJpdHM7CisgICAgaW50ICAgICBsYXN0X3B0ciA9IGdmYy0+aF9wdHIgLSAxOyAvKiBsYXN0IGhlYWRlciB0byBhZGQgdG8gYml0c3RyZWFtICovCisgICAgaWYgKGxhc3RfcHRyID09IC0xKQorICAgICAgICBsYXN0X3B0ciA9IE1BWF9IRUFERVJfQlVGIC0gMTsKKyAgICBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKworCisgICAgaWYgKChmbHVzaGJpdHMgPSBjb21wdXRlX2ZsdXNoYml0cyhnZnAsICZuYnl0ZXMpKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBkcmFpbl9pbnRvX2FuY2lsbGFyeShnZnAsIGZsdXNoYml0cyk7CisKKyAgICAvKiBjaGVjayB0aGF0IHRoZSAxMDAlIG9mIHRoZSBsYXN0IGZyYW1lIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYml0c3RyZWFtICovCisgICAgYXNzZXJ0KGdmYy0+aGVhZGVyW2xhc3RfcHRyXS53cml0ZV90aW1pbmcgKyBnZXRmcmFtZWJpdHMoZ2ZwKQorICAgICAgICAgICA9PSBnZmMtPmJzLnRvdGJpdCk7CisKKyAgICAvKiB3ZSBoYXZlIHBhZGRlZCBvdXQgYWxsIGZyYW1lcyB3aXRoIGFuY2lsbGFyeSBkYXRhLCB3aGljaCBpcyB0aGUKKyAgICAgICBzYW1lIGFzIGZpbGxpbmcgdGhlIGJpdHJlc2Vydm9pciB3aXRoIGFuY2lsbGFyeSBkYXRhLCBzbyA6ICovCisgICAgZ2ZjLT5SZXN2U2l6ZSA9IDA7CisgICAgbDNfc2lkZS0+bWFpbl9kYXRhX2JlZ2luID0gMDsKKworCisgICAgLyogc2F2ZSB0aGUgUmVwbGF5R2FpbiB2YWx1ZSAqLworICAgIGlmIChnZmMtPmZpbmRSZXBsYXlHYWluKSB7CisgICAgICAgIEZMT0FUIGNvbnN0IFJhZGlvR2FpbiA9IChGTE9BVCkgR2V0VGl0bGVHYWluKGdmYy0+cmdkYXRhKTsKKyAgICAgICAgYXNzZXJ0KE5FUShSYWRpb0dhaW4sIEdBSU5fTk9UX0VOT1VHSF9TQU1QTEVTKSk7CisgICAgICAgIGdmYy0+UmFkaW9HYWluID0gKGludCkgZmxvb3IoUmFkaW9HYWluICogMTAuMCArIDAuNSk7IC8qIHJvdW5kIHRvIG5lYXJlc3QgKi8KKyAgICB9CisKKyAgICAvKiBmaW5kIHRoZSBnYWluIGFuZCBzY2FsZSBjaGFuZ2UgcmVxdWlyZWQgZm9yIG5vIGNsaXBwaW5nICovCisgICAgaWYgKGdmYy0+ZmluZFBlYWtTYW1wbGUpIHsKKyAgICAgICAgZ2ZjLT5ub2NsaXBHYWluQ2hhbmdlID0gKGludCkgY2VpbChsb2cxMChnZmMtPlBlYWtTYW1wbGUgLyAzMjc2Ny4wKSAqIDIwLjAgKiAxMC4wKTsgLyogcm91bmQgdXAgKi8KKworICAgICAgICBpZiAoZ2ZjLT5ub2NsaXBHYWluQ2hhbmdlID4gMCkgeyAvKiBjbGlwcGluZyBvY2N1cnMgKi8KKyAgICAgICAgICAgIGlmIChFUShnZnAtPnNjYWxlLCAxLjApIHx8IEVRKGdmcC0+c2NhbGUsIDAuMCkpCisgICAgICAgICAgICAgICAgZ2ZjLT5ub2NsaXBTY2FsZSA9IGZsb29yKCgzMjc2Ny4wIC8gZ2ZjLT5QZWFrU2FtcGxlKSAqIDEwMC4wKSAvIDEwMC4wOyAvKiByb3VuZCBkb3duICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLyogdGhlIHVzZXIgc3BlY2lmaWVkIGhpcyBvd24gc2NhbGluZyBmYWN0b3IuIFdlIGNvdWxkIHN1Z2dlc3QKKyAgICAgICAgICAgICAgICAgKiB0aGUgc2NhbGluZyBmYWN0b3Igb2YgKDMyNzY3LjAvZ2ZwLT5QZWFrU2FtcGxlKSooZ2ZwLT5zY2FsZSkKKyAgICAgICAgICAgICAgICAgKiBidXQgaXQncyB1c3VhbGx5IHZlcnkgaW5hY2N1cmF0ZS4gU28gd2UnZCByYXRoZXIgbm90IGFkdmljZSBoaW0KKyAgICAgICAgICAgICAgICAgKiBvbiB0aGUgc2NhbGluZyBmYWN0b3IuICovCisgICAgICAgICAgICAgICAgZ2ZjLT5ub2NsaXBTY2FsZSA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAvKiBubyBjbGlwcGluZyAqLworICAgICAgICAgICAgZ2ZjLT5ub2NsaXBTY2FsZSA9IC0xOworICAgIH0KK30KKworCisKKwordm9pZAorYWRkX2R1bW15X2J5dGUobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmNvbnN0IGdmcCwgdW5zaWduZWQgY2hhciB2YWwsIHVuc2lnbmVkIGludCBuKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBpOworCisgICAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICAgICAgcHV0Yml0c19ub2hlYWRlcnMoZ2ZjLCB2YWwsIDgpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfSEVBREVSX0JVRjsgKytpKQorICAgICAgICAgICAgZ2ZjLT5oZWFkZXJbaV0ud3JpdGVfdGltaW5nICs9IDg7CisgICAgfQorfQorCisKKy8qCisgIGZvcm1hdF9iaXRzdHJlYW0oKQorCisgIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGEgZnJhbWUgb2YgYXVkaW8gaGFzIGJlZW4gcXVhbnRpemVkIGFuZCBjb2RlZC4KKyAgSXQgd2lsbCB3cml0ZSB0aGUgZW5jb2RlZCBhdWRpbyB0byB0aGUgYml0c3RyZWFtLiBOb3RlIHRoYXQKKyAgZnJvbSBhIGxheWVyMyBlbmNvZGVyJ3MgcGVyc3BlY3RpdmUgdGhlIGJpdCBzdHJlYW0gaXMgcHJpbWFyaWx5CisgIGEgc2VyaWVzIG9mIG1haW5fZGF0YSgpIGJsb2Nrcywgd2l0aCBoZWFkZXIgYW5kIHNpZGUgaW5mb3JtYXRpb24KKyAgaW5zZXJ0ZWQgYXQgdGhlIHByb3BlciBsb2NhdGlvbnMgdG8gbWFpbnRhaW4gZnJhbWluZy4gKFNlZSBGaWd1cmUgQS43CisgIGluIHRoZSBJUykuCisgICovCitpbnQKK2Zvcm1hdF9iaXRzdHJlYW0obGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgYml0cywgbmJ5dGVzOworICAgIElJSV9zaWRlX2luZm9fdCAqbDNfc2lkZTsKKyAgICBpbnQgICAgIGJpdHNQZXJGcmFtZTsKKyAgICBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKworICAgIGJpdHNQZXJGcmFtZSA9IGdldGZyYW1lYml0cyhnZnApOworICAgIGRyYWluX2ludG9fYW5jaWxsYXJ5KGdmcCwgbDNfc2lkZS0+cmVzdkRyYWluX3ByZSk7CisKKyAgICBlbmNvZGVTaWRlSW5mbzIoZ2ZwLCBiaXRzUGVyRnJhbWUpOworICAgIGJpdHMgPSA4ICogZ2ZjLT5zaWRlaW5mb19sZW47CisgICAgYml0cyArPSB3cml0ZU1haW5EYXRhKGdmcCk7CisgICAgZHJhaW5faW50b19hbmNpbGxhcnkoZ2ZwLCBsM19zaWRlLT5yZXN2RHJhaW5fcG9zdCk7CisgICAgYml0cyArPSBsM19zaWRlLT5yZXN2RHJhaW5fcG9zdDsKKworICAgIGwzX3NpZGUtPm1haW5fZGF0YV9iZWdpbiArPSAoYml0c1BlckZyYW1lIC0gYml0cykgLyA4OworCisgICAgLyogY29tcGFyZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gY2xlYXIgYWxsIGJ1ZmZlcmVkIG1wMyBmcmFtZXMKKyAgICAgKiB3aXRoIHdoYXQgd2UgdGhpbmsgdGhlIHJlc3ZzaXplIGlzOiAqLworICAgIGlmIChjb21wdXRlX2ZsdXNoYml0cyhnZnAsICZuYnl0ZXMpICE9IGdmYy0+UmVzdlNpemUpIHsKKyAgICAgICAgRVJST1JGKGdmYywgIkludGVybmFsIGJ1ZmZlciBpbmNvbnNpc3RlbmN5LiBmbHVzaGJpdHMgPD4gUmVzdlNpemUiKTsKKyAgICB9CisKKworICAgIC8qIGNvbXBhcmUgbWFpbl9kYXRhX2JlZ2luIGZvciB0aGUgbmV4dCBmcmFtZSB3aXRoIHdoYXQgd2UKKyAgICAgKiB0aGluayB0aGUgcmVzdnNpemUgaXM6ICovCisgICAgaWYgKChsM19zaWRlLT5tYWluX2RhdGFfYmVnaW4gKiA4KSAhPSBnZmMtPlJlc3ZTaXplKSB7CisgICAgICAgIEVSUk9SRihnZmMsICJiaXQgcmVzZXJ2b2lyIGVycm9yOiBcbiIKKyAgICAgICAgICAgICAgICJsM19zaWRlLT5tYWluX2RhdGFfYmVnaW46ICVpIFxuIgorICAgICAgICAgICAgICAgIlJlc3ZvaXIgc2l6ZTogICAgICAgICAgICAgJWkgXG4iCisgICAgICAgICAgICAgICAicmVzdiBkcmFpbiAocG9zdCkgICAgICAgICAlaSBcbiIKKyAgICAgICAgICAgICAgICJyZXN2IGRyYWluIChwcmUpICAgICAgICAgICVpIFxuIgorICAgICAgICAgICAgICAgImhlYWRlciBhbmQgc2lkZWluZm86ICAgICAgJWkgXG4iCisgICAgICAgICAgICAgICAiZGF0YSBiaXRzOiAgICAgICAgICAgICAgICAlaSBcbiIKKyAgICAgICAgICAgICAgICJ0b3RhbCBiaXRzOiAgICAgICAgICAgICAgICVpIChyZW1haW5kZXI6ICVpKSBcbiIKKyAgICAgICAgICAgICAgICJiaXRzcGVyZnJhbWU6ICAgICAgICAgICAgICVpIFxuIiwKKyAgICAgICAgICAgICAgIDggKiBsM19zaWRlLT5tYWluX2RhdGFfYmVnaW4sCisgICAgICAgICAgICAgICBnZmMtPlJlc3ZTaXplLAorICAgICAgICAgICAgICAgbDNfc2lkZS0+cmVzdkRyYWluX3Bvc3QsCisgICAgICAgICAgICAgICBsM19zaWRlLT5yZXN2RHJhaW5fcHJlLAorICAgICAgICAgICAgICAgOCAqIGdmYy0+c2lkZWluZm9fbGVuLAorICAgICAgICAgICAgICAgYml0cyAtIGwzX3NpZGUtPnJlc3ZEcmFpbl9wb3N0IC0gOCAqIGdmYy0+c2lkZWluZm9fbGVuLAorICAgICAgICAgICAgICAgYml0cywgYml0cyAlIDgsIGJpdHNQZXJGcmFtZSk7CisKKyAgICAgICAgRVJST1JGKGdmYywgIlRoaXMgaXMgYSBmYXRhbCBlcnJvci4gIEl0IGhhcyBzZXZlcmFsIHBvc3NpYmxlIGNhdXNlczoiKTsKKyAgICAgICAgRVJST1JGKGdmYywgIjkwJSUgIExBTUUgY29tcGlsZWQgd2l0aCBidWdneSB2ZXJzaW9uIG9mIGdjYyB1c2luZyBhZHZhbmNlZCBvcHRpbWl6YXRpb25zIik7CisgICAgICAgIEVSUk9SRihnZmMsICIgOSUlICBZb3VyIHN5c3RlbSBpcyBvdmVyY2xvY2tlZCIpOworICAgICAgICBFUlJPUkYoZ2ZjLCAiIDElJSAgYnVnIGluIExBTUUgZW5jb2RpbmcgbGlicmFyeSIpOworCisgICAgICAgIGdmYy0+UmVzdlNpemUgPSBsM19zaWRlLT5tYWluX2RhdGFfYmVnaW4gKiA4OworICAgIH07CisgICAgYXNzZXJ0KGdmYy0+YnMudG90Yml0ICUgOCA9PSAwKTsKKworICAgIGlmIChnZmMtPmJzLnRvdGJpdCA+IDEwMDAwMDAwMDApIHsKKyAgICAgICAgLyogdG8gYXZvaWQgdG90Yml0IG92ZXJmbG93LCAoYXQgOGggZW5jb2RpbmcgYXQgMTI4a2JzKSBsZXRzIHJlc2V0IGJpdCBjb3VudGVyICovCisgICAgICAgIGludCAgICAgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9IRUFERVJfQlVGOyArK2kpCisgICAgICAgICAgICBnZmMtPmhlYWRlcltpXS53cml0ZV90aW1pbmcgLT0gZ2ZjLT5icy50b3RiaXQ7CisgICAgICAgIGdmYy0+YnMudG90Yml0ID0gMDsKKyAgICB9CisKKworICAgIHJldHVybiAwOworfQorCisKKworCisKKy8qIGNvcHkgZGF0YSBvdXQgb2YgdGhlIGludGVybmFsIE1QMyBiaXQgYnVmZmVyIGludG8gYSB1c2VyIHN1cHBsaWVkCisgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlci4KKworICAgbXAzZGF0YT0wICAgICAgaW5kaWNhdGVzIGRhdGEgaW4gYnVmZmVyIGlzIGFuIGlkM3RhZ3MgYW5kIFZCUiB0YWdzCisgICBtcDNkYXRhPTEgICAgICBkYXRhIGlzIHJlYWwgbXAzIGZyYW1lIGRhdGEuCisKKworKi8KK2ludAorY29weV9idWZmZXIobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSwgaW50IG1wM2RhdGEpCit7CisgICAgQml0X3N0cmVhbV9zdHJ1YyAqY29uc3QgYnMgPSAmZ2ZjLT5iczsKKyAgICBpbnQgY29uc3QgbWluaW11bSA9IGJzLT5idWZfYnl0ZV9pZHggKyAxOworICAgIGlmIChtaW5pbXVtIDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzaXplICE9IDAgJiYgbWluaW11bSA+IHNpemUpCisgICAgICAgIHJldHVybiAtMTsgICAgICAvKiBidWZmZXIgaXMgdG9vIHNtYWxsICovCisgICAgbWVtY3B5KGJ1ZmZlciwgYnMtPmJ1ZiwgbWluaW11bSk7CisgICAgYnMtPmJ1Zl9ieXRlX2lkeCA9IC0xOworICAgIGJzLT5idWZfYml0X2lkeCA9IDA7CisKKyAgICBpZiAobXAzZGF0YSkgeworICAgICAgICBVcGRhdGVNdXNpY0NSQygmZ2ZjLT5uTXVzaWNDUkMsIGJ1ZmZlciwgbWluaW11bSk7CisKKyAgICAgICAgLyoqIHN1bSBudW1iZXIgb2YgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBtcDMgc3RyZWFtCisgICAgICAgICAqICB0aGlzIGluZm8gd2lsbCBiZSB3cml0dGVuIGludG8gdGhlIFhpbmcvTEFNRSBoZWFkZXIgZm9yIHNlZWtpbmcKKyAgICAgICAgICovCisgICAgICAgIGlmIChtaW5pbXVtID4gMCkgeworICAgICAgICAgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5uQnl0ZXNXcml0dGVuICs9IG1pbmltdW07CisgICAgICAgIH0KKworI2lmZGVmIERFQ09ERV9PTl9USEVfRkxZCisgICAgICAgIGlmIChnZmMtPmRlY29kZV9vbl90aGVfZmx5KSB7IC8qIGRlY29kZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgICAgIHNhbXBsZV90IHBjbV9idWZbMl1bMTE1Ml07CisgICAgICAgICAgICBpbnQgICAgIG1wM19pbiA9IG1pbmltdW07CisgICAgICAgICAgICBpbnQgICAgIHNhbXBsZXNfb3V0ID0gLTE7CisgICAgICAgICAgICBpbnQgICAgIGk7CisKKyAgICAgICAgICAgIC8qIHJlLXN5bnRoZXNpcyB0byBwY20uICBSZXBlYXQgdW50aWwgd2UgZ2V0IGEgc2FtcGxlc19vdXQ9MCAqLworICAgICAgICAgICAgd2hpbGUgKHNhbXBsZXNfb3V0ICE9IDApIHsKKworICAgICAgICAgICAgICAgIHNhbXBsZXNfb3V0ID0gaGlwX2RlY29kZTFfdW5jbGlwcGVkKGdmYy0+aGlwLCBidWZmZXIsIG1wM19pbiwgcGNtX2J1ZlswXSwgcGNtX2J1ZlsxXSk7CisgICAgICAgICAgICAgICAgLyogc2FtcGxlc19vdXQgPSAwOiAgbmVlZCBtb3JlIGRhdGEgdG8gZGVjb2RlCisgICAgICAgICAgICAgICAgICogc2FtcGxlc19vdXQgPSAtMTogIGVycm9yLiAgTGV0cyBhc3N1bWUgMCBwY20gb3V0cHV0CisgICAgICAgICAgICAgICAgICogc2FtcGxlc19vdXQgPSBudW1iZXIgb2Ygc2FtcGxlcyBvdXRwdXQgKi8KKworICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgbGVuZ2h0IG9mIHRoZSBtcDMgaW5wdXQgYnVmZmVyIHRvIHplcm8sIHNvIHRoYXQgaW4gdGhlCisgICAgICAgICAgICAgICAgICogbmV4dCBpdGVyYXRpb24gb2YgdGhlIGxvb3Agd2Ugd2lsbCBiZSBxdWVyeWluZyBtcGdsaWIgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiBidWZmZXJlZCBkYXRhICovCisgICAgICAgICAgICAgICAgbXAzX2luID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChzYW1wbGVzX291dCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBkZWNvZGluZy4gTm90IGZhdGFsLCBidXQgbWlnaHQgc2NyZXcgdXAKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIFJlcGxheUdhaW4gdGFnLiBXaGF0IHNob3VsZCB3ZSBkbz8gSWdub3JlIGZvciBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19vdXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlc19vdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIFBDTSBkYXRhICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBzaG91bGQgbm90IGJlIHBvc3NpYmxlLCBhbmQgaW5kaWNhdGVzIHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICogb3ZlcmZsb3duIHRoZSBwY21fYnVmIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc2FtcGxlc19vdXQgPD0gMTE1Mik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdmYy0+ZmluZFBlYWtTYW1wbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzX291dDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjbV9idWZbMF1baV0gPiBnZmMtPlBlYWtTYW1wbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdmYy0+UGVha1NhbXBsZSA9IHBjbV9idWZbMF1baV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoLXBjbV9idWZbMF1baV0gPiBnZmMtPlBlYWtTYW1wbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdmYy0+UGVha1NhbXBsZSA9IC1wY21fYnVmWzBdW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdmYy0+Y2hhbm5lbHNfb3V0ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc19vdXQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNtX2J1ZlsxXVtpXSA+IGdmYy0+UGVha1NhbXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdmYy0+UGVha1NhbXBsZSA9IHBjbV9idWZbMV1baV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKC1wY21fYnVmWzFdW2ldID4gZ2ZjLT5QZWFrU2FtcGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ZjLT5QZWFrU2FtcGxlID0gLXBjbV9idWZbMV1baV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdmYy0+ZmluZFJlcGxheUdhaW4pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5hbHl6ZVNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ZjLT5yZ2RhdGEsIHBjbV9idWZbMF0sIHBjbV9idWZbMV0sIHNhbXBsZXNfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZmMtPmNoYW5uZWxzX291dCkgPT0gR0FJTl9BTkFMWVNJU19FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTY7CisKKyAgICAgICAgICAgICAgICB9ICAgICAgIC8qIGlmIChzYW1wbGVzX291dD4wKSAqLworICAgICAgICAgICAgfSAgICAgICAgICAgLyogd2hpbGUgKHNhbXBsZXNfb3V0IT0wKSAqLworICAgICAgICB9ICAgICAgICAgICAgICAgLyogaWYgKGdmYy0+ZGVjb2RlX29uX3RoZV9mbHkpICovCisjZW5kaWYKKworICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgKG1wM2RhdGEpICovCisgICAgcmV0dXJuIG1pbmltdW07Cit9CisKKwordm9pZAoraW5pdF9iaXRfc3RyZWFtX3cobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYykKK3sKKyAgICBnZmMtPmJzLmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyhCVUZGRVJfU0laRSk7CisgICAgZ2ZjLT5icy5idWZfc2l6ZSA9IEJVRkZFUl9TSVpFOworCisgICAgZ2ZjLT5oX3B0ciA9IGdmYy0+d19wdHIgPSAwOworICAgIGdmYy0+aGVhZGVyW2dmYy0+aF9wdHJdLndyaXRlX3RpbWluZyA9IDA7CisgICAgZ2ZjLT5icy5idWZfYnl0ZV9pZHggPSAtMTsKKyAgICBnZmMtPmJzLmJ1Zl9iaXRfaWR4ID0gMDsKKyAgICBnZmMtPmJzLnRvdGJpdCA9IDA7Cit9CisKKy8qIGVuZCBvZiBiaXRzdHJlYW0uYyAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9iaXRzdHJlYW0uaCBiL2xpYm1wM2xhbWUvYml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjMTYzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvYml0c3RyZWFtLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqCU1QMyBiaXRzdHJlYW0gT3V0cHV0IGludGVyZmFjZSBmb3IgTEFNRQorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OSBUYWtlaGlybyBUT01JTkFHQQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfQklUU1RSRUFNX0gKKyNkZWZpbmUgTEFNRV9CSVRTVFJFQU1fSAorCitpbnQgICAgIGdldGZyYW1lYml0cyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCk7CisKK2ludCAgICAgZm9ybWF0X2JpdHN0cmVhbShsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwKTsKKwordm9pZCAgICBmbHVzaF9iaXRzdHJlYW0obGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCk7Cit2b2lkICAgIGFkZF9kdW1teV9ieXRlKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZnAsIHVuc2lnbmVkIGNoYXIgdmFsLCB1bnNpZ25lZCBpbnQgbik7CisKK2ludCAgICAgY29weV9idWZmZXIobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGludCB1cGRhdGVfY3JjKTsKK3ZvaWQgICAgaW5pdF9iaXRfc3RyZWFtX3cobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYyk7Cit2b2lkICAgIENSQ193cml0ZWhlYWRlcihsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMsIGNoYXIgKmJ1ZmZlcik7CitpbnQgICAgIGNvbXB1dGVfZmx1c2hiaXRzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgKm5ieXRlcyk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2RlcGNvbXAgYi9saWJtcDNsYW1lL2RlcGNvbXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ3MDFkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvZGVwY29tcApAQCAtMCwwICsxLDUzMCBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAwNS0wNy0wOS4xMQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPi4KKworY2FzZSAkMSBpbgorICAnJykKKyAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICBleGl0IDE7CisgICAgIDs7CisgIC1oIHwgLS1oKikKKyAgICBjYXQgPDxcRU9GCitVc2FnZTogZGVwY29tcCBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQorCitSdW4gUFJPR1JBTVMgQVJHUyB0byBjb21waWxlIGEgZmlsZSwgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMKK2FzIHNpZGUtZWZmZWN0cy4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBkZXBtb2RlICAgICBEZXBlbmRlbmN5IHRyYWNraW5nIG1vZGUuCisgIHNvdXJjZSAgICAgIFNvdXJjZSBmaWxlIHJlYWQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBvYmplY3QgICAgICBPYmplY3QgZmlsZSBvdXRwdXQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBERVBESVIgICAgICBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgZGVwZW5kZW5jaWVzLgorICBkZXBmaWxlICAgICBEZXBlbmRlbmN5IGZpbGUgdG8gb3V0cHV0LgorICB0bXBkZXBmaWxlICBUZW1wb3JhcnkgZmlsZSB0byB1c2Ugd2hlbiBvdXRwdXRpbmcgZGVwZW5kZW5jaWVzLgorICBsaWJ0b29sICAgICBXaGV0aGVyIGxpYnRvb2wgaXMgdXNlZCAoeWVzL25vKS4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgIGV4aXQgJD8KKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRlcG1vZGUiIHx8IHRlc3QgLXogIiRzb3VyY2UiIHx8IHRlc3QgLXogIiRvYmplY3QiOyB0aGVuCisgIGVjaG8gImRlcGNvbXA6IFZhcmlhYmxlcyBzb3VyY2UsIG9iamVjdCBhbmQgZGVwbW9kZSBtdXN0IGJlIHNldCIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgRGVwZW5kZW5jaWVzIGZvciBzdWIvYmFyLm8gb3Igc3ViL2Jhci5vYmogZ28gaW50byBzdWIvLmRlcHMvYmFyLlBvLgorZGVwZmlsZT0ke2RlcGZpbGUtYGVjaG8gIiRvYmplY3QiIHwKKyAgc2VkICdzfFteXFwvXSokfCcke0RFUERJUi0uZGVwc30nLyZ8O3N8XC5cKFteLl0qXCkkfC5QXDF8O3N8UG9iaiR8UG98J2B9Cit0bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQorCitybSAtZiAiJHRtcGRlcGZpbGUiCisKKyMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQorIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKKyMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKKyMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgorICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KKyAgZ2NjZmxhZz0tTQorICBkZXBtb2RlPWdjYworZmkKKworaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCisgICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCisgICBkYXNobWZsYWc9LXhNCisgICBkZXBtb2RlPWRhc2htc3Rkb3V0CitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyAgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIG12ICIkdG1wZGVwZmlsZSIgIiRkZXBmaWxlIgorICA7OworCitnY2MpCisjIyBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGdldCBkZXBlbmRlbmN5IG91dHB1dCBmcm9tIGdjYy4gIEhlcmUncworIyMgd2h5IHdlIHBpY2sgdGhpcyByYXRoZXIgb2JzY3VyZSBtZXRob2Q6CisjIyAtIERvbid0IHdhbnQgdG8gdXNlIC1NRCBiZWNhdXNlIHdlJ2QgbGlrZSB0aGUgZGVwZW5kZW5jaWVzIHRvIGVuZAorIyMgICB1cCBpbiBhIHN1YmRpci4gIEhhdmluZyB0byByZW5hbWUgYnkgaGFuZCBpcyB1Z2x5LgorIyMgICAoV2UgbWlnaHQgZW5kIHVwIGRvaW5nIHRoaXMgYW55d2F5IHRvIHN1cHBvcnQgb3RoZXIgY29tcGlsZXJzLikKKyMjIC0gVGhlIERFUEVOREVOQ0lFU19PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFrZXMgZ2NjIGFjdCBsaWtlCisjIyAgIC1NTSwgbm90IC1NIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4KKyMjIC0gVXNpbmcgLU0gZGlyZWN0bHkgbWVhbnMgcnVubmluZyB0aGUgY29tcGlsZXIgdHdpY2UgKGV2ZW4gd29yc2UKKyMjICAgdGhhbiByZW5hbWluZykuCisgIGlmIHRlc3QgLXogIiRnY2NmbGFnIjsgdGhlbgorICAgIGdjY2ZsYWc9LU1ELAorICBmaQorICAiJEAiIC1XcCwiJGdjY2ZsYWckdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgYWxwaGE9QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorIyMgVGhlIHNlY29uZCAtZSBleHByZXNzaW9uIGhhbmRsZXMgRE9TLXN0eWxlIGZpbGUgbmFtZXMgd2l0aCBkcml2ZSBsZXR0ZXJzLgorICBzZWQgLWUgJ3MvXlteOl0qOiAvIC8nIFwKKyAgICAgIC1lICdzL15bJyRhbHBoYSddOlwvW146XSo6IC8gLycgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyMjIFRoaXMgbmV4dCBwaWVjZSBvZiBtYWdpYyBhdm9pZHMgdGhlIGBkZWxldGVkIGhlYWRlciBmaWxlJyBwcm9ibGVtLgorIyMgVGhlIHByb2JsZW0gaXMgdGhhdCB3aGVuIGEgaGVhZGVyIGZpbGUgd2hpY2ggYXBwZWFycyBpbiBhIC5QIGZpbGUKKyMjIGlzIGRlbGV0ZWQsIHRoZSBkZXBlbmRlbmN5IGNhdXNlcyBtYWtlIHRvIGRpZSAoYmVjYXVzZSB0aGVyZSBpcworIyMgdHlwaWNhbGx5IG5vIHdheSB0byByZWJ1aWxkIHRoZSBoZWFkZXIpLiAgV2UgYXZvaWQgdGhpcyBieSBhZGRpbmcKKyMjIGR1bW15IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBoZWFkZXIgZmlsZS4gIFRvbyBiYWQgZ2NjIGRvZXNuJ3QgZG8KKyMjIHRoaXMgZm9yIHVzIGRpcmVjdGx5LgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfAorIyMgU29tZSB2ZXJzaW9ucyBvZiBnY2MgcHV0IGEgc3BhY2UgYmVmb3JlIHRoZSBgOicuICBPbiB0aGUgdGhlb3J5CisjIyB0aGF0IHRoZSBzcGFjZSBtZWFucyBzb21ldGhpbmcsIHdlIGFkZCBhIHNwYWNlIHRvIHRoZSBvdXRwdXQgYXMKKyMjIHdlbGwuCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitocCkKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK3NnaSkKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIiRAIiAiLVdwLC1NRHVwZGF0ZSwkdG1wZGVwZmlsZSIKKyAgZWxzZQorICAgICIkQCIgLU1EdXBkYXRlICIkdG1wZGVwZmlsZSIKKyAgZmkKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gICMgeWVzLCB0aGUgc291cmNlZmlsZSBkZXBlbmQgb24gb3RoZXIgZmlsZXMKKyAgICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorCisgICAgIyBDbGlwIG9mZiB0aGUgaW5pdGlhbCBlbGVtZW50ICh0aGUgZGVwZW5kZW50KS4gIERvbid0IHRyeSB0byBiZQorICAgICMgY2xldmVyIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBzZWQgY29kZSwgYXMgSVJJWCBzZWQgd29uJ3QgaGFuZGxlCisgICAgIyBsaW5lcyB3aXRoIG1vcmUgdGhhbiBhIGZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzICg0MDk2IGluCisgICAgIyBJUklYIDYuMiBzZWQsIDgxOTIgaW4gSVJJWCA2LjUpLiAgV2UgYWxzbyByZW1vdmUgY29tbWVudCBsaW5lczsKKyAgICAjIHRoZSBJUklYIGNjIGFkZHMgY29tbWVudHMgbGlrZSBgIzpmZWMnIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgIyBkZXBlbmRlbmN5IGxpbmUuCisgICAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCisgICAgdHIgJworJyAnICcgPj4gJGRlcGZpbGUKKyAgICBlY2hvID4+ICRkZXBmaWxlCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICRkZXBmaWxlCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCithaXgpCisgICMgVGhlIEMgZm9yIEFJWCBDb21waWxlciB1c2VzIC1NIGFuZCBvdXRwdXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgIyBpbiBhIC51IGZpbGUuICBJbiBvbGRlciB2ZXJzaW9ucywgdGhpcyBmaWxlIGFsd2F5cyBsaXZlcyBpbiB0aGUKKyAgIyBjdXJyZW50IGRpcmVjdG9yeS4gIEFsc28sIHRoZSBBSVggY29tcGlsZXIgcHV0cyBgJG9iamVjdDonIGF0IHRoZQorICAjIHN0YXJ0IG9mIGVhY2ggbGluZTsgJG9iamVjdCBkb2Vzbid0IGhhdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgorICAjIFZlcnNpb24gNiB1c2VzIHRoZSBkaXJlY3RvcnkgaW4gYm90aCBjYXNlcy4KKyAgc3RyaXBwZWQ9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL1woLipcKVwuLiokL1wxLydgCisgIHRtcGRlcGZpbGU9IiRzdHJpcHBlZC51IgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiIC1XYywtTQorICBlbHNlCisgICAgIiRAIiAtTQorICBmaQorICBzdGF0PSQ/CisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuIDoKKyAgZWxzZQorICAgIHN0cmlwcGVkPWBlY2hvICIkc3RyaXBwZWQiIHwgc2VkICdzLF4uKi8sLCdgCisgICAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIGZpCisKKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgIG91dG5hbWU9IiRzdHJpcHBlZC5vIgorICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLgorICAgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiBcKC4qXCkkLFwxOiwiIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitpY2MpCisgICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgorICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKKyAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCisgICMgICAgZm9vLm86IHN1Yi9mb28uYworICAjICAgIGZvby5vOiBzdWIvZm9vLmgKKyAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6CisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAorICAjICAgIHN1Yi9mb28uYzoKKyAgIyAgICBzdWIvZm9vLmg6CisgICMgSUNDIDcuMSB3aWxsIG91dHB1dAorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCisgICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKKyAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCisgICMgICAgIC4uLgorCisgICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAorICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgorICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAorICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK3RydTY0KQorICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQorICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgorICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisKKyAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQorICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjYW5pc20gaXMgdXNlZCBpbiBsaWJ0b29sIDEuNCBzZXJpZXMgdG8KKyAgICAgICMgaGFuZGxlIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uLgorICAgICAgIyBXaXRoIGxpYnRvb2wgMS40LCBkZXBlbmRlbmNpZXMgd2VyZSBvdXRwdXQgaW4gJGRpci5saWJzLyRiYXNlLmxvLmQuCisgICAgICAjCisgICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhpcyBleGNlcHRpb24gd2FzIHJlbW92ZWQsIGFuZCBsaWJ0b29sIG5vdworICAgICAgIyBnZW5lcmF0ZXMgMiBzZXBhcmF0ZSBvYmplY3RzIGZvciB0aGUgMiBsaWJyYXJpZXMuICBUaGVzZSB0d28KKyAgICAgICMgY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKKyAgICAgICMgaW4gJGRpciRiYXNlLm8uZC4gIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGJvdGggZmlsZXMsIGJlY2F1c2UKKyAgICAgICMgb25lIG9mIHRoZSB0d28gY29tcGlsYXRpb25zIGNhbiBiZSBkaXNhYmxlZC4gIFdlIHNob3VsZCBwcmVmZXIKKyAgICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCisgICAgICAjIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB3aGVuIC5saWJzLyBpcyBkZWxldGVkLCB3aGlsZSBpZ25vcmluZworICAgICAgIyB0aGUgZm9ybWVyIHdvdWxkIGNhdXNlIGEgZGlzdGNsZWFuY2hlY2sgcGFuaWMuCisgICAgICB0bXBkZXBmaWxlMT0kZGlyLmxpYnMvJGJhc2UubG8uZCAgICMgbGlidG9vbCAxLjQKKyAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5vLmQgICAgICAgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLm8uZCAgICAjIGxpYnRvb2wgMS41CisgICAgICB0bXBkZXBmaWxlND0kZGlyLmxpYnMvJGJhc2UuZCAgICAgICMgQ29tcGFxIENDQyBWNi4yLTUwNAorICAgICAgIiRAIiAtV2MsLU1ECisgICBlbHNlCisgICAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kCisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGU0PSRkaXIkYmFzZS5kCisgICAgICAiJEAiIC1NRAorICAgZmkKKworICAgc3RhdD0kPworICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgICBlbHNlCisgICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgorICAgICAgZXhpdCAkc3RhdAorICAgZmkKKworICAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgIGRvCisgICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhaworICAgZG9uZQorICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgorICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICBlbHNlCisgICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICAgZmkKKyAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgIDs7CisKKyNub3NpZGVlZmZlY3QpCisgICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAorICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgorCitkYXNobXN0ZG91dCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKKyAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgorICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgorICAiJEAiICRkYXNobWZsYWcgfAorICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2Rhc2hYbXN0ZG91dCkKKyAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQorICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KKyAgZXhpdCAxCisgIDs7CisKK21ha2VkZXBlbmQpCisgICIkQCIgfHwgZXhpdCAkPworICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisgICMgWCBtYWtlZGVwZW5kCisgIHNoaWZ0CisgIGNsZWFyZWQ9bm8KKyAgZm9yIGFyZyBpbiAiJEAiOyBkbworICAgIGNhc2UgJGNsZWFyZWQgaW4KKyAgICBubykKKyAgICAgIHNldCAiIjsgc2hpZnQKKyAgICAgIGNsZWFyZWQ9eWVzIDs7CisgICAgZXNhYworICAgIGNhc2UgIiRhcmciIGluCisgICAgLUQqfC1JKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQorICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KKyAgICAtKnwkb2JqZWN0KQorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgIGVzYWMKKyAgZG9uZQorICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCisgIHRvdWNoICIkdG1wZGVwZmlsZSIKKyAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCisnIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKKyAgOzsKKworY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAiJEAiIC1FIHwKKyAgICBzZWQgLW4gLWUgJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgXAorICAgICAgIC1lICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyB8CisgICAgc2VkICckIHM6IFxcJDo6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3Zpc3VhbGNwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCisgICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgIiRAIiB8fCBleGl0ICQ/CisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgIiRhcmciIGluCisgICAgIi1HbSJ8Ii9HbSJ8Ii1HaSJ8Ii9HaSJ8Ii1aSSJ8Ii9aSSIpCisJc2V0IGZub3JkICIkQCIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICAqKQorCXNldCBmbm9yZCAiJEAiICIkYXJnIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgIGVzYWMKKyAgZG9uZQorICAiJEAiIC1FIHwKKyAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjplY2hvICJgY3lncGF0aCAtdSBcXCJcMVxcImAiOnAnIHwgc29ydCB8IHVuaXEgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2VuY29kZXIuYyBiL2xpYm1wM2xhbWUvZW5jb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTQ5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2VuY29kZXIuYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICAgICAgTEFNRSBNUDMgZW5jb2RpbmcgZW5naW5lCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgTWFyayBUYXlsb3IKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGFrZWhpcm8gVG9taW5hZ2EKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgUm9iZXJ0IEhlZ2VtYW5uCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMSBHYWJyaWVsIEJvdXZpZ25lCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMSBKb2huIERhaGxzdHJvbQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IGVuY29kZXIuYyx2IDEuMTAzLjIuMSAyMDA4LzA4LzA1IDE0OjE2OjA2IHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJsYW1lX2dsb2JhbF9mbGFncy5oIgorI2luY2x1ZGUgIm5ld21kY3QuaCIKKyNpbmNsdWRlICJwc3ltb2RlbC5oIgorI2luY2x1ZGUgImxhbWUtYW5hbHlzaXMuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJWYnJUYWcuaCIKKyNpbmNsdWRlICJxdWFudGl6ZV9wdnQuaCIKKworCisKKy8qCisgKiBhdXRvLWFkanVzdCBvZiBBVEgsIHVzZWZ1bCBmb3IgbG93IHZvbHVtZQorICogR2FicmllbCBCb3V2aWduZSAzIGZlYiAyMDAxCisgKgorICogbW9kaWZpZXMgc29tZSB2YWx1ZXMgaW4KKyAqICAgZ2ZwLT5pbnRlcm5hbF9mbGFncy0+QVRICisgKiAgIChnZmMtPkFUSCkKKyAqLworc3RhdGljIHZvaWQKK2FkanVzdF9BVEgobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjKQoreworICAgIEZMT0FUICAgZ3IyX21heCwgbWF4X3BvdzsKKworICAgIGlmIChnZmMtPkFUSC0+dXNlX2FkanVzdCA9PSAwKSB7CisgICAgICAgIGdmYy0+QVRILT5hZGp1c3QgPSAxLjA7IC8qIG5vIGFkanVzdG1lbnQgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGpkIC0gMjAwMSBtYXIgMTIsIDI3LCBqdW4gMzAgKi8KKyAgICAvKiBsb3VkbmVzcyBiYXNlZCBvbiBlcXVhbCBsb3VkbmVzcyBjdXJ2ZTsgKi8KKyAgICAvKiB1c2UgZ3JhbnVsZSB3aXRoIG1heGltdW0gY29tYmluZWQgbG91ZG5lc3MgKi8KKyAgICBtYXhfcG93ID0gZ2ZjLT5sb3VkbmVzc19zcVswXVswXTsKKyAgICBncjJfbWF4ID0gZ2ZjLT5sb3VkbmVzc19zcVsxXVswXTsKKyAgICBpZiAoZ2ZjLT5jaGFubmVsc19vdXQgPT0gMikgeworICAgICAgICBtYXhfcG93ICs9IGdmYy0+bG91ZG5lc3Nfc3FbMF1bMV07CisgICAgICAgIGdyMl9tYXggKz0gZ2ZjLT5sb3VkbmVzc19zcVsxXVsxXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1heF9wb3cgKz0gbWF4X3BvdzsKKyAgICAgICAgZ3IyX21heCArPSBncjJfbWF4OworICAgIH0KKyAgICBpZiAoZ2ZjLT5tb2RlX2dyID09IDIpIHsKKyAgICAgICAgbWF4X3BvdyA9IE1heChtYXhfcG93LCBncjJfbWF4KTsKKyAgICB9CisgICAgbWF4X3BvdyAqPSAwLjU7ICAgICAvKiBtYXhfcG93IGFwcHJvYWNoZXMgMS4wIGZvciBmdWxsIGJhbmQgbm9pc2UgKi8KKworICAgIC8qIGpkIC0gMjAwMSBtYXIgMzEsIGp1biAzMCAqLworICAgIC8qIHVzZXIgdHVuaW5nIG9mIEFUSCBhZGp1c3RtZW50IHJlZ2lvbiAqLworICAgIG1heF9wb3cgKj0gZ2ZjLT5BVEgtPmFhX3NlbnNpdGl2aXR5X3A7CisKKyAgICAvKiAgYWRqdXN0IEFUSCBkZXBlbmRpbmcgb24gcmFuZ2Ugb2YgbWF4aW11bSB2YWx1ZQorICAgICAqLworCisgICAgLyogamQgLSAyMDAxIGZlYjI3LCBtYXIxMiwyMCwganVuMzAsIGp1bDIyICovCisgICAgLyogY29udGludW91cyBjdXJ2ZXMgYmFzZWQgb24gYXBwcm94aW1hdGlvbiAqLworICAgIC8qIHRvIEdCJ3Mgb3JpZ2luYWwgdmFsdWVzLiAqLworICAgIC8qIEZvciBhbiBpbmNyZWFzZSBpbiBhcHByb3hpbWF0ZSBsb3VkbmVzcywgKi8KKyAgICAvKiBzZXQgQVRIIGFkanVzdCB0byBhZGp1c3RfbGltaXQgaW1tZWRpYXRlbHkgKi8KKyAgICAvKiBhZnRlciBhIGRlbGF5IG9mIG9uZSBmcmFtZS4gKi8KKyAgICAvKiBGb3IgYSBsb3VkbmVzcyBkZWNyZWFzZSwgcmVkdWNlIEFUSCBhZGp1c3QgKi8KKyAgICAvKiB0b3dhcmRzIGFkanVzdF9saW1pdCBncmFkdWFsbHkuICovCisgICAgLyogbWF4X3BvdyBpcyBhIGxvdWRuZXNzIHNxdWFyZWQgb3IgYSBwb3dlci4gKi8KKyAgICBpZiAobWF4X3BvdyA+IDAuMDMxMjUpIHsgLyogKCgxIC0gMC4wMDA2MjUpLyAzMS45OCkgZnJvbSBjdXJ2ZSBiZWxvdyAqLworICAgICAgICBpZiAoZ2ZjLT5BVEgtPmFkanVzdCA+PSAxLjApIHsKKyAgICAgICAgICAgIGdmYy0+QVRILT5hZGp1c3QgPSAxLjA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBwcmVjZWRpbmcgZnJhbWUgaGFzIGxvd2VyIEFUSCBhZGp1c3Q7ICovCisgICAgICAgICAgICAvKiBhc2NlbmQgb25seSB0byB0aGUgcHJlY2VkaW5nIGFkanVzdF9saW1pdCAqLworICAgICAgICAgICAgLyogaW4gY2FzZSB0aGVyZSBpcyBsZWFkaW5nIGxvdyB2b2x1bWUgKi8KKyAgICAgICAgICAgIGlmIChnZmMtPkFUSC0+YWRqdXN0IDwgZ2ZjLT5BVEgtPmFkanVzdF9saW1pdCkgeworICAgICAgICAgICAgICAgIGdmYy0+QVRILT5hZGp1c3QgPSBnZmMtPkFUSC0+YWRqdXN0X2xpbWl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdmYy0+QVRILT5hZGp1c3RfbGltaXQgPSAxLjA7CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAgICAgLyogYWRqdXN0bWVudCBjdXJ2ZSAqLworICAgICAgICAvKiBhYm91dCAzMiBkQiBtYXhpbXVtIGFkanVzdCAoMC4wMDA2MjUpICovCisgICAgICAgIEZMT0FUIGNvbnN0IGFkal9saW1fbmV3ID0gMzEuOTggKiBtYXhfcG93ICsgMC4wMDA2MjU7CisgICAgICAgIGlmIChnZmMtPkFUSC0+YWRqdXN0ID49IGFkal9saW1fbmV3KSB7IC8qIGRlc2NlbmQgZ3JhZHVhbGx5ICovCisgICAgICAgICAgICBnZmMtPkFUSC0+YWRqdXN0ICo9IGFkal9saW1fbmV3ICogMC4wNzUgKyAwLjkyNTsKKyAgICAgICAgICAgIGlmIChnZmMtPkFUSC0+YWRqdXN0IDwgYWRqX2xpbV9uZXcpIHsgLyogc3RvcCBkZXNjZW50ICovCisgICAgICAgICAgICAgICAgZ2ZjLT5BVEgtPmFkanVzdCA9IGFkal9saW1fbmV3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgICAgICAgICAvKiBhc2NlbmQgKi8KKyAgICAgICAgICAgIGlmIChnZmMtPkFUSC0+YWRqdXN0X2xpbWl0ID49IGFkal9saW1fbmV3KSB7CisgICAgICAgICAgICAgICAgZ2ZjLT5BVEgtPmFkanVzdCA9IGFkal9saW1fbmV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7ICAgICAgLyogcHJlY2VkaW5nIGZyYW1lIGhhcyBsb3dlciBBVEggYWRqdXN0OyAqLworICAgICAgICAgICAgICAgIC8qIGFzY2VuZCBvbmx5IHRvIHRoZSBwcmVjZWRpbmcgYWRqdXN0X2xpbWl0ICovCisgICAgICAgICAgICAgICAgaWYgKGdmYy0+QVRILT5hZGp1c3QgPCBnZmMtPkFUSC0+YWRqdXN0X2xpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGdmYy0+QVRILT5hZGp1c3QgPSBnZmMtPkFUSC0+YWRqdXN0X2xpbWl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnZmMtPkFUSC0+YWRqdXN0X2xpbWl0ID0gYWRqX2xpbV9uZXc7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgc29tZSBzaW1wbGUgc3RhdGlzdGljcworICoKKyAqICBiaXRyYXRlIGluZGV4IDA6IGZyZWUgYml0cmF0ZSAtPiBub3QgYWxsb3dlZCBpbiBWQlIgbW9kZQorICogIDogYml0cmF0ZXMsIGticHMgZGVwZW5kaW5nIG9uIE1QRUcgdmVyc2lvbgorICogIGJpdHJhdGUgaW5kZXggMTU6IGZvcmJpZGRlbgorICoKKyAqICBtb2RlX2V4dDoKKyAqICAwOiAgTFIKKyAqICAxOiAgTFItaQorICogIDI6ICBNUworICogIDM6ICBNUy1pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAordXBkYXRlU3RhdHMobGFtZV9pbnRlcm5hbF9mbGFncyAqIGNvbnN0IGdmYykKK3sKKyAgICBpbnQgICAgIGdyLCBjaDsKKyAgICBhc3NlcnQoMCA8PSBnZmMtPmJpdHJhdGVfaW5kZXggJiYgZ2ZjLT5iaXRyYXRlX2luZGV4IDwgMTYpOworICAgIGFzc2VydCgwIDw9IGdmYy0+bW9kZV9leHQgJiYgZ2ZjLT5tb2RlX2V4dCA8IDQpOworCisgICAgLyogY291bnQgYml0cmF0ZSBpbmRpY2VzICovCisgICAgZ2ZjLT5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFtnZmMtPmJpdHJhdGVfaW5kZXhdWzRdKys7CisgICAgZ2ZjLT5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFsxNV1bNF0rKzsKKworICAgIC8qIGNvdW50ICdlbSBmb3IgZXZlcnkgbW9kZSBleHRlbnNpb24gaW4gY2FzZSBvZiAyIGNoYW5uZWwgZW5jb2RpbmcgKi8KKyAgICBpZiAoZ2ZjLT5jaGFubmVsc19vdXQgPT0gMikgeworICAgICAgICBnZmMtPmJpdHJhdGVfc3RlcmVvTW9kZV9IaXN0W2dmYy0+Yml0cmF0ZV9pbmRleF1bZ2ZjLT5tb2RlX2V4dF0rKzsKKyAgICAgICAgZ2ZjLT5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFsxNV1bZ2ZjLT5tb2RlX2V4dF0rKzsKKyAgICB9CisgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyArK2dyKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyArK2NoKSB7CisgICAgICAgICAgICBpbnQgICAgIGJ0ID0gZ2ZjLT5sM19zaWRlLnR0W2dyXVtjaF0uYmxvY2tfdHlwZTsKKyAgICAgICAgICAgIGlmIChnZmMtPmwzX3NpZGUudHRbZ3JdW2NoXS5taXhlZF9ibG9ja19mbGFnKQorICAgICAgICAgICAgICAgIGJ0ID0gNDsKKyAgICAgICAgICAgIGdmYy0+Yml0cmF0ZV9ibG9ja1R5cGVfSGlzdFtnZmMtPmJpdHJhdGVfaW5kZXhdW2J0XSsrOworICAgICAgICAgICAgZ2ZjLT5iaXRyYXRlX2Jsb2NrVHlwZV9IaXN0W2dmYy0+Yml0cmF0ZV9pbmRleF1bNV0rKzsKKyAgICAgICAgICAgIGdmYy0+Yml0cmF0ZV9ibG9ja1R5cGVfSGlzdFsxNV1bYnRdKys7CisgICAgICAgICAgICBnZmMtPmJpdHJhdGVfYmxvY2tUeXBlX0hpc3RbMTVdWzVdKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCisKK3N0YXRpYyB2b2lkCitsYW1lX2VuY29kZV9mcmFtZV9pbml0KGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZnAsIGNvbnN0IHNhbXBsZV90ICogaW5idWZbMl0pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIGludCAgICAgY2gsIGdyOworCisgICAgaWYgKGdmYy0+bGFtZV9lbmNvZGVfZnJhbWVfaW5pdCA9PSAwKSB7CisgICAgICAgIC8qIHByaW1lIHRoZSBNRENUL3BvbHlwaGFzZSBmaWx0ZXJiYW5rIHdpdGggYSBzaG9ydCBibG9jayAqLworICAgICAgICBpbnQgICAgIGksIGo7CisgICAgICAgIHNhbXBsZV90IHByaW1lYnVmZjBbMjg2ICsgMTE1MiArIDU3Nl07CisgICAgICAgIHNhbXBsZV90IHByaW1lYnVmZjFbMjg2ICsgMTE1MiArIDU3Nl07CisgICAgICAgIGdmYy0+bGFtZV9lbmNvZGVfZnJhbWVfaW5pdCA9IDE7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMjg2ICsgNTc2ICogKDEgKyBnZmMtPm1vZGVfZ3IpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpIDwgNTc2ICogZ2ZjLT5tb2RlX2dyKSB7CisgICAgICAgICAgICAgICAgcHJpbWVidWZmMFtpXSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGdmYy0+Y2hhbm5lbHNfb3V0ID09IDIpCisgICAgICAgICAgICAgICAgICAgIHByaW1lYnVmZjFbaV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbWVidWZmMFtpXSA9IGluYnVmWzBdW2pdOworICAgICAgICAgICAgICAgIGlmIChnZmMtPmNoYW5uZWxzX291dCA9PSAyKQorICAgICAgICAgICAgICAgICAgICBwcmltZWJ1ZmYxW2ldID0gaW5idWZbMV1bal07CisgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHBvbHlwaGFzZSBmaWx0ZXJpbmcgLyBtZGN0ICovCisgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IGdmYy0+bW9kZV9ncjsgZ3IrKykgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLT5jaGFubmVsc19vdXQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBnZmMtPmwzX3NpZGUudHRbZ3JdW2NoXS5ibG9ja190eXBlID0gU0hPUlRfVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZGN0X3N1YjQ4KGdmYywgcHJpbWVidWZmMCwgcHJpbWVidWZmMSk7CisKKyAgICAgICAgLyogY2hlY2sgRkZUIHdpbGwgbm90IHVzZSBhIG5lZ2F0aXZlIHN0YXJ0aW5nIG9mZnNldCAqLworI2lmIDU3NiA8IEZGVE9GRlNFVAorIyBlcnJvciBGRlRPRkZTRVQgZ3JlYXRlciB0aGFuIDU3NjogRkZUIHVzZXMgYSBuZWdhdGl2ZSBvZmZzZXQKKyNlbmRpZgorICAgICAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIGZvciBGRlQgKi8KKyAgICAgICAgYXNzZXJ0KGdmYy0+bWZfc2l6ZSA+PSAoQkxLU0laRSArIGdmcC0+ZnJhbWVzaXplIC0gRkZUT0ZGU0VUKSk7CisgICAgICAgIC8qIGNoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIHBvbHlwaGFzZSBmaWx0ZXJiYW5rICovCisgICAgICAgIGFzc2VydChnZmMtPm1mX3NpemUgPj0gKDUxMiArIGdmcC0+ZnJhbWVzaXplIC0gMzIpKTsKKyAgICB9CisKK30KKworCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBlbmNvZGVmcmFtZSgpICAgICAgICAgICBMYXllciAzCisqCisqIGVuY29kZSBhIHNpbmdsZSBmcmFtZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitsYW1lX2VuY29kZV9mcmFtZSgpCisKKworICAgICAgICAgICAgICAgICAgICAgICBnciAwICAgICAgICAgICAgZ3IgMQoraW5idWY6ICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18CisKKworUG9seXBoYXNlICgxOCB3aW5kb3dzLCBlYWNoIHNoaWZ0ZWQgMzIpCitnciAwOgord2luZG93MSAgICAgICAgICA8LS0tLTUxMi0tLS0+Cit3aW5kb3cxOCAgICAgICAgICAgICAgICAgPC0tLS01MTItLS0tPgorCitnciAxOgord2luZG93MSAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLTUxMi0tLS0+Cit3aW5kb3cxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS01MTItLS0tPgorCisKKworTURDVCBvdXRwdXQ6ICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18CisKK0ZGVCdzICAgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0tMTAyNC0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0xMDI0LS0tLS0tLS0+CisKKworCisgICAgaW5idWYgPSBidWZmZXIgb2YgUENNIGRhdGEgc2l6ZT1NUDMgZnJhbWVzaXplCisgICAgZW5jb2RlciBhY3RzIG9uIGluYnVmW2NoXVswXSwgYnV0IG91dHB1dCBpcyBkZWxheWVkIGJ5IE1EQ1RERUxBWQorICAgIHNvIHRoZSBNRENUIGNvZWZmaWNpbnRzIGFyZSBmcm9tIGluYnVmW2NoXVstTURDVERFTEFZXQorCisgICAgcHN5LW1vZGVsIEZGVCBoYXMgYSAxIGdyYW51bGUgZGVsYXksIHNvIHdlIGZlZWQgaXQgZGF0YSBmb3IgdGhlIAorICAgIG5leHQgZ3JhbnVsZS4KKyAgICBGRlQgaXMgY2VudGVyZWQgb3ZlciBncmFudWxlOiAgMjI0KzU3NisyMjQKKyAgICBTbyBGRlQgc3RhcnRzIGF0OiAgIDU3Ni0yMjQtTURDVERFTEFZCisKKyAgICBNUEVHMjogIEZGVCBlbmRzIGF0OiAgQkxLU0laRSs1NzYtMjI0LU1EQ1RERUxBWSAgICAgICgxMzI4KQorICAgIE1QRUcxOiAgRkZUIGVuZHMgYXQ6ICBCTEtTSVpFKzIqNTc2LTIyNC1NRENUREVMQVkgICAgKDE5MDQpCisKKyAgICBNUEVHMjogIHBvbHlwaGFzZSBmaXJzdCB3aW5kb3c6ICBbMC4uNTExXQorICAgICAgICAgICAgICAgICAgICAgIDE4dGggd2luZG93OiAgIFs1NDQuLjEwNTVdICAgICAgICAgICgxMDU2KQorICAgIE1QRUcxOiAgICAgICAgICAgIDM2dGggd2luZG93OiAgIFsxMTIwLi4xNjMxXSAgICAgICAgICgxNjMyKQorICAgICAgICAgICAgZGF0YSBuZWVkZWQ6ICA1MTIrZnJhbWVzaXplLTMyCisKKyAgICBBIGNsb3NlIGxvb2sgbmV3bWRjdC5jIHNob3dzIHRoYXQgdGhlIHBvbHlwaGFzZSBmaWx0ZXJiYW5rCisgICAgb25seSB1c2VzIGRhdGEgZnJvbSBbMC4uNTEwXSBmb3IgZWFjaCB3aW5kb3cuICBQZXJoYXBzIGJlY2F1c2UgdGhlIHdpbmRvdworICAgIHVzZWQgYnkgdGhlIGZpbHRlcmJhbmsgaXMgemVybyBmb3IgdGhlIGxhc3QgcG9pbnQsIHNvIFRha2VoaXJvJ3MKKyAgICBjb2RlIGRvZXNuJ3QgYm90aGVyIHRvIGNvbXB1dGUgd2l0aCBpdC4KKworICAgIEZGVCBzdGFydHMgYXQgNTc2LTIyNC1NRENUREVMQVkgKDMwNCkgID0gNTc2LUZGVE9GRlNFVAorCisqLworCit0eXBlZGVmIEZMT0FUIGNoZ3JkYXRhWzJdWzJdOworCisKK2ludAorbGFtZV9lbmNvZGVfbXAzX2ZyYW1lKCAgICAgICAvKiBPdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX2dsb2JhbF9mbGFncyAqIGNvbnN0IGdmcCwgLyogQ29udGV4dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV90IGNvbnN0ICppbmJ1Zl9sLCAvKiBJbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV90IGNvbnN0ICppbmJ1Zl9yLCAvKiBJbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1wM2J1ZiwgLyogT3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1wM2J1Zl9zaXplKQoreyAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0ICovCisgICAgaW50ICAgICBtcDNjb3VudDsKKyAgICBJSUlfcHN5X3JhdGlvIG1hc2tpbmdfTFJbMl1bMl07IC8qTFIgbWFza2luZyAmIGVuZXJneSAqLworICAgIElJSV9wc3lfcmF0aW8gbWFza2luZ19NU1syXVsyXTsgLypNUyBtYXNraW5nICYgZW5lcmd5ICovCisgICAgSUlJX3BzeV9yYXRpbygqbWFza2luZylbMl1bMl07IC8qcG9pbnRlciB0byBzZWxlY3RlZCBtYXNraW5ncyAqLworICAgIGNvbnN0IHNhbXBsZV90ICppbmJ1ZlsyXTsKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworCisgICAgRkxPQVQgICB0b3RfZW5lclsyXVs0XTsKKyAgICBGTE9BVCAgIG1zX2VuZXJfcmF0aW9bMl0gPSB7IC41LCAuNSB9OworICAgIGNoZ3JkYXRhIHBlID0geyB7MC4sIDAufSwgezAuLCAwLn0gfSwgcGVfTVMgPSB7IHsKKyAgICAwLiwgMC59LCB7CisgICAgMC4sIDAufX07CisgICAgY2hncmRhdGEgKnBlX3VzZTsKKworICAgIGludCAgICAgY2gsIGdyOworCisgICAgaW5idWZbMF0gPSBpbmJ1Zl9sOworICAgIGluYnVmWzFdID0gaW5idWZfcjsKKworICAgIGlmIChnZmMtPmxhbWVfZW5jb2RlX2ZyYW1lX2luaXQgPT0gMCkgeworICAgICAgICAvKmZpcnN0IHJ1bj8gKi8KKyAgICAgICAgbGFtZV9lbmNvZGVfZnJhbWVfaW5pdChnZnAsIGluYnVmKTsKKworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKiogcGFkZGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBwYWRkaW5nIG1ldGhvZCBhcyBkZXNjcmliZWQgaW4gCisgICAgICogIk1QRUctTGF5ZXIzIC8gQml0c3RyZWFtIFN5bnRheCBhbmQgRGVjb2RpbmciCisgICAgICogYnkgTWFydGluIFNpZWxlciwgUmFscGggU3BlcnNjaG5laWRlcgorICAgICAqCisgICAgICogbm90ZTogdGhlcmUgaXMgbm8gcGFkZGluZyBmb3IgdGhlIHZlcnkgZmlyc3QgZnJhbWUKKyAgICAgKgorICAgICAqIFJvYmVydCBIZWdlbWFubiAyMDAwLTA2LTIyCisgICAgICovCisgICAgZ2ZjLT5wYWRkaW5nID0gRkFMU0U7CisgICAgaWYgKChnZmMtPnNsb3RfbGFnIC09IGdmYy0+ZnJhY19TcEYpIDwgMCkgeworICAgICAgICBnZmMtPnNsb3RfbGFnICs9IGdmcC0+b3V0X3NhbXBsZXJhdGU7CisgICAgICAgIGdmYy0+cGFkZGluZyA9IFRSVUU7CisgICAgfQorCisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgIFN0YWdlIDE6IHBzeWNob2Fjb3VzdGljIG1vZGVsICAgICAgICoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKGdmYy0+cHN5bW9kZWwpIHsKKyAgICAgICAgLyogcHN5Y2hvYWNvdXN0aWMgbW9kZWwKKyAgICAgICAgICogcHN5IG1vZGVsIGhhcyBhIDEgZ3JhbnVsZSAoNTc2KSBkZWxheSB0aGF0IHdlIG11c3QgY29tcGVuc2F0ZSBmb3IKKyAgICAgICAgICogKG10IDYvOTkpLgorICAgICAgICAgKi8KKyAgICAgICAgaW50ICAgICByZXQ7CisgICAgICAgIGNvbnN0IHNhbXBsZV90ICpidWZwWzJdOyAvKiBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBsZWZ0ICYgcmlnaHQgZ3JhbnVsZSAqLworICAgICAgICBpbnQgICAgIGJsb2NrdHlwZVsyXTsKKworICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLT5jaGFubmVsc19vdXQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBidWZwW2NoXSA9ICZpbmJ1ZltjaF1bNTc2ICsgZ3IgKiA1NzYgLSBGRlRPRkZTRVRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdmcC0+VkJSID09IHZicl9tdHJoIHx8IGdmcC0+VkJSID09IHZicl9tdCkgeworICAgICAgICAgICAgICAgIHJldCA9IEwzcHN5Y2hvX2FuYWxfdmJyKGdmcCwgYnVmcCwgZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2luZ19MUiwgbWFza2luZ19NUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZVtncl0sIHBlX01TW2dyXSwgdG90X2VuZXJbZ3JdLCBibG9ja3R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gTDNwc3ljaG9fYW5hbF9ucyhnZnAsIGJ1ZnAsIGdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2luZ19MUiwgbWFza2luZ19NUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlW2dyXSwgcGVfTVNbZ3JdLCB0b3RfZW5lcltncl0sIGJsb2NrdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC00OworCisgICAgICAgICAgICBpZiAoZ2ZwLT5tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICAgICAgICAgIG1zX2VuZXJfcmF0aW9bZ3JdID0gdG90X2VuZXJbZ3JdWzJdICsgdG90X2VuZXJbZ3JdWzNdOworICAgICAgICAgICAgICAgIGlmIChtc19lbmVyX3JhdGlvW2dyXSA+IDApCisgICAgICAgICAgICAgICAgICAgIG1zX2VuZXJfcmF0aW9bZ3JdID0gdG90X2VuZXJbZ3JdWzNdIC8gbXNfZW5lcl9yYXRpb1tncl07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGJsb2NrIHR5cGUgZmxhZ3MgKi8KKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICAgICAgZ3JfaW5mbyAqY29uc3QgY29kX2luZm8gPSAmZ2ZjLT5sM19zaWRlLnR0W2dyXVtjaF07CisgICAgICAgICAgICAgICAgY29kX2luZm8tPmJsb2NrX3R5cGUgPSBibG9ja3R5cGVbY2hdOworICAgICAgICAgICAgICAgIGNvZF9pbmZvLT5taXhlZF9ibG9ja19mbGFnID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLypubyBwc3kgbW9kZWwgKi8KKyAgICAgICAgbWVtc2V0KChjaGFyICopIG1hc2tpbmdfTFIsIDAsIHNpemVvZihtYXNraW5nX0xSKSk7CisgICAgICAgIG1lbXNldCgoY2hhciAqKSBtYXNraW5nX01TLCAwLCBzaXplb2YobWFza2luZ19NUykpOworICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgICAgIGdmYy0+bDNfc2lkZS50dFtncl1bY2hdLmJsb2NrX3R5cGUgPSBOT1JNX1RZUEU7CisgICAgICAgICAgICAgICAgZ2ZjLT5sM19zaWRlLnR0W2dyXVtjaF0ubWl4ZWRfYmxvY2tfZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgcGVfTVNbZ3JdW2NoXSA9IHBlW2dyXVtjaF0gPSA3MDA7CisgICAgICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qIGF1dG8tYWRqdXN0IG9mIEFUSCwgdXNlZnVsIGZvciBsb3cgdm9sdW1lICovCisgICAgYWRqdXN0X0FUSChnZmMpOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogICBTdGFnZSAyOiBNRENUICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIHBvbHlwaGFzZSBmaWx0ZXJpbmcgLyBtZGN0ICovCisgICAgbWRjdF9zdWI0OChnZmMsIGluYnVmWzBdLCBpbmJ1ZlsxXSk7CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgIFN0YWdlIDM6IE1TL0xSIGRlY2lzaW9uICAgICAgICAgICAgICoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogSGVyZSB3aWxsIGJlIHNlbGVjdGVkIE1TIG9yIExSIGNvZGluZyBvZiB0aGUgMiBzdGVyZW8gY2hhbm5lbHMgKi8KKyAgICBnZmMtPm1vZGVfZXh0ID0gTVBHX01EX0xSX0xSOworCisgICAgaWYgKGdmcC0+Zm9yY2VfbXMpIHsKKyAgICAgICAgZ2ZjLT5tb2RlX2V4dCA9IE1QR19NRF9NU19MUjsKKyAgICB9CisgICAgZWxzZSBpZiAoZ2ZwLT5tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICAvKiBtc19yYXRpbyA9IGlzIHNjYWxlZCwgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgdG8gbG9vayBsaWtlCisgICAgICAgICAgIGEgcmF0aW8gb2Ygc2lkZV9jaGFubmVsIC8gdG90YWwuCisgICAgICAgICAgIDAgPSBzaWduYWwgaXMgMTAwJSBtb25vCisgICAgICAgICAgIC41ID0gTCAmIFIgdW5jb3JyZWxhdGVkCisgICAgICAgICAqLworCisgICAgICAgIC8qIFswXSBhbmQgWzFdIGFyZSB0aGUgcmVzdWx0cyBmb3IgdGhlIHR3byBncmFudWxlcyBpbiBNUEVHLTEsCisgICAgICAgICAqIGluIE1QRUctMiBpdCdzIG9ubHkgYSBmYWtlZCBhdmVyYWdpbmcgb2YgdGhlIHNhbWUgdmFsdWUKKyAgICAgICAgICogX3ByZXYgaXMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IGdyYW51bGUgb2YgdGhlIHByZXZpb3VzIGZyYW1lCisgICAgICAgICAqIF9uZXh0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBvZiB0aGUgbmV4dCBmcmFtZQorICAgICAgICAgKi8KKworICAgICAgICBGTE9BVCAgIHN1bV9wZV9NUyA9IDA7CisgICAgICAgIEZMT0FUICAgc3VtX3BlX0xSID0gMDsKKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgICAgIHN1bV9wZV9NUyArPSBwZV9NU1tncl1bY2hdOworICAgICAgICAgICAgICAgIHN1bV9wZV9MUiArPSBwZVtncl1bY2hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYmFzZWQgb24gUEU6IE0vUyBjb2Rpbmcgd291bGQgbm90IHVzZSBtdWNoIG1vcmUgYml0cyB0aGFuIEwvUiAqLworICAgICAgICBpZiAoc3VtX3BlX01TIDw9IDEuMDAgKiBzdW1fcGVfTFIpIHsKKworICAgICAgICAgICAgZ3JfaW5mbyBjb25zdCAqY29uc3QgZ2kwID0gJmdmYy0+bDNfc2lkZS50dFswXVswXTsKKyAgICAgICAgICAgIGdyX2luZm8gY29uc3QgKmNvbnN0IGdpMSA9ICZnZmMtPmwzX3NpZGUudHRbZ2ZjLT5tb2RlX2dyIC0gMV1bMF07CisKKyAgICAgICAgICAgIGlmIChnaTBbMF0uYmxvY2tfdHlwZSA9PSBnaTBbMV0uYmxvY2tfdHlwZSAmJiBnaTFbMF0uYmxvY2tfdHlwZSA9PSBnaTFbMV0uYmxvY2tfdHlwZSkgeworCisgICAgICAgICAgICAgICAgZ2ZjLT5tb2RlX2V4dCA9IE1QR19NRF9NU19MUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJpdCBhbmQgbm9pc2UgYWxsb2NhdGlvbiAqLworICAgIGlmIChnZmMtPm1vZGVfZXh0ID09IE1QR19NRF9NU19MUikgeworICAgICAgICBtYXNraW5nID0gJm1hc2tpbmdfTVM7IC8qIHVzZSBNUyBtYXNraW5nICovCisgICAgICAgIHBlX3VzZSA9ICZwZV9NUzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1hc2tpbmcgPSAmbWFza2luZ19MUjsgLyogdXNlIExSIG1hc2tpbmcgKi8KKyAgICAgICAgcGVfdXNlID0gJnBlOworICAgIH0KKworCisgICAgLyogY29weSBkYXRhIGZvciBNUDMgZnJhbWUgYW5hbHl6ZXIgKi8KKyAgICBpZiAoZ2ZwLT5hbmFseXNpcyAmJiBnZmMtPnBpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgICAgIGdmYy0+cGluZm8tPm1zX3JhdGlvW2dyXSA9IGdmYy0+bXNfcmF0aW9bZ3JdOworICAgICAgICAgICAgICAgIGdmYy0+cGluZm8tPm1zX2VuZXJfcmF0aW9bZ3JdID0gbXNfZW5lcl9yYXRpb1tncl07CisgICAgICAgICAgICAgICAgZ2ZjLT5waW5mby0+YmxvY2t0eXBlW2dyXVtjaF0gPSBnZmMtPmwzX3NpZGUudHRbZ3JdW2NoXS5ibG9ja190eXBlOworICAgICAgICAgICAgICAgIGdmYy0+cGluZm8tPnBlW2dyXVtjaF0gPSAoKnBlX3VzZSlbZ3JdW2NoXTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZ2ZjLT5waW5mby0+eHJbZ3JdW2NoXSwgJmdmYy0+bDNfc2lkZS50dFtncl1bY2hdLnhyWzBdLCBzaXplb2YoRkxPQVQpICogNTc2KTsKKyAgICAgICAgICAgICAgICAvKiBpbiBwc3ltb2RlbCwgTFIgYW5kIE1TIGRhdGEgd2FzIHN0b3JlZCBpbiBwaW5mby4gIAorICAgICAgICAgICAgICAgICAgIHN3aXRjaCB0byBNUyBkYXRhOiAqLworICAgICAgICAgICAgICAgIGlmIChnZmMtPm1vZGVfZXh0ID09IE1QR19NRF9NU19MUikgeworICAgICAgICAgICAgICAgICAgICBnZmMtPnBpbmZvLT5lcnNbZ3JdW2NoXSA9IGdmYy0+cGluZm8tPmVyc1tncl1bY2ggKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGdmYy0+cGluZm8tPmVuZXJneVtncl1bY2hdLCBnZmMtPnBpbmZvLT5lbmVyZ3lbZ3JdW2NoICsgMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2ZjLT5waW5mby0+ZW5lcmd5W2dyXVtjaF0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgIFN0YWdlIDQ6IHF1YW50aXphdGlvbiBsb29wICAgICAgICAgICoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKGdmcC0+VkJSID09IHZicl9vZmYgfHwgZ2ZwLT5WQlIgPT0gdmJyX2FicikgeworICAgICAgICBzdGF0aWMgRkxPQVQgY29uc3QgZmlyY29lZls5XSA9IHsKKyAgICAgICAgICAgIC0wLjAyMDc4ODcgKiA1LCAtMC4wMzc4NDEzICogNSwgLTAuMDQzMjQ3MiAqIDUsIC0wLjAzMTE4MyAqIDUsCisgICAgICAgICAgICA3Ljc5NjA5ZS0xOCAqIDUsIDAuMDQ2Nzc0NSAqIDUsIDAuMTAwOTEgKiA1LCAwLjE1MTM2NSAqIDUsCisgICAgICAgICAgICAwLjE4NzA5OCAqIDUKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgICAgIGk7CisgICAgICAgIEZMT0FUICAgZjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTg7IGkrKykKKyAgICAgICAgICAgIGdmYy0+bnNQc3kucGVmaXJidWZbaV0gPSBnZmMtPm5zUHN5LnBlZmlyYnVmW2kgKyAxXTsKKworICAgICAgICBmID0gMC4wOworICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykKKyAgICAgICAgICAgICAgICBmICs9ICgqcGVfdXNlKVtncl1bY2hdOworICAgICAgICBnZmMtPm5zUHN5LnBlZmlyYnVmWzE4XSA9IGY7CisKKyAgICAgICAgZiA9IGdmYy0+bnNQc3kucGVmaXJidWZbOV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgICAgICAgICAgICBmICs9IChnZmMtPm5zUHN5LnBlZmlyYnVmW2ldICsgZ2ZjLT5uc1BzeS5wZWZpcmJ1ZlsxOCAtIGldKSAqIGZpcmNvZWZbaV07CisKKyAgICAgICAgZiA9ICg2NzAgKiA1ICogZ2ZjLT5tb2RlX2dyICogZ2ZjLT5jaGFubmVsc19vdXQpIC8gZjsKKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgICAgICgqcGVfdXNlKVtncl1bY2hdICo9IGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZ2ZjLT5pdGVyYXRpb25fbG9vcChnZnAsICpwZV91c2UsIG1zX2VuZXJfcmF0aW8sICptYXNraW5nKTsKKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICAgU3RhZ2UgNTogYml0c3RyZWFtIGZvcm1hdHRpbmcgICAgICAgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAgIC8qICB3cml0ZSB0aGUgZnJhbWUgdG8gdGhlIGJpdHN0cmVhbSAgKi8KKyAgICAodm9pZCkgZm9ybWF0X2JpdHN0cmVhbShnZnApOworCisgICAgLyogY29weSBtcDMgYml0IGJ1ZmZlciBpbnRvIGFycmF5ICovCisgICAgbXAzY291bnQgPSBjb3B5X2J1ZmZlcihnZmMsIG1wM2J1ZiwgbXAzYnVmX3NpemUsIDEpOworCisKKyAgICBpZiAoZ2ZwLT5iV3JpdGVWYnJUYWcpCisgICAgICAgIEFkZFZickZyYW1lKGdmcCk7CisKKworICAgIGlmIChnZnAtPmFuYWx5c2lzICYmIGdmYy0+cGluZm8gIT0gTlVMTCkgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgaW50ICAgICBqOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IEZGVE9GRlNFVDsgaisrKQorICAgICAgICAgICAgICAgIGdmYy0+cGluZm8tPnBjbWRhdGFbY2hdW2pdID0gZ2ZjLT5waW5mby0+cGNtZGF0YVtjaF1baiArIGdmcC0+ZnJhbWVzaXplXTsKKyAgICAgICAgICAgIGZvciAoaiA9IEZGVE9GRlNFVDsgaiA8IDE2MDA7IGorKykgeworICAgICAgICAgICAgICAgIGdmYy0+cGluZm8tPnBjbWRhdGFbY2hdW2pdID0gaW5idWZbY2hdW2ogLSBGRlRPRkZTRVRdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldF9mcmFtZV9waW5mbyhnZnAsICptYXNraW5nKTsKKyAgICB9CisKKyAgICB1cGRhdGVTdGF0cyhnZmMpOworCisgICAgcmV0dXJuIG1wM2NvdW50OworfQpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9lbmNvZGVyLmggYi9saWJtcDNsYW1lL2VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTJjYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9lbmNvZGVyLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiAgICAgIGVuY29kZXIuaCBpbmNsdWRlIGZpbGUKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMCBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgTEFNRV9FTkNPREVSX0gKKyNkZWZpbmUgTEFNRV9FTkNPREVSX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBlbmNvZGVyIGFuZCBkZWNvZGVyIGRlbGF5cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogbGF5ZXIgSUlJIGVuYy0+ZGVjIGRlbGF5OiAgMTA1NiAoMTA1Nz8pICAgKG9ic2VydmVkKQorICogbGF5ZXIgIElJIGVuYy0+ZGVjIGRlbGF5OiAgIDQ4MCAgKDQ4MT8pICAgKG9ic2VydmVkKQorICoKKyAqIHBvbHlwaGFzZSAyNTYtMTYgICAgICAgICAgICAgKGRlYyBvciBlbmMpICAgICAgICA9IDI0MAorICogbWRjdCAgICAgIDI1NiszMiAgKDkqMzIpICAgICAoZGVjIG9yIGVuYykgICAgICAgID0gMjg4CisgKiB0b3RhbDogICAgNTEyKzE2CisgKgorICogTXkgZ3Vlc3MgaXMgdGhhdCBkZWxheSBvZiBwb2x5cGhhc2UgZmlsdGVyYmFuayBpcyBhY3R1YWx5IDI0MC41CisgKiAodGhlcmUgYXJlIHRlY2huaWNhbCByZWFzb25zIGZvciB0aGlzLCBzZWUgcG9zdGluZ3MgaW4gbXAzZW5jb2RlcikuCisgKiBTbyB0b3RhbCBFbmNvZGUrRGVjb2RlIGRlbGF5ID0gRU5DREVMQVkgKyA1MjggKyAxCisgKi8KKworLyogCisgKiBFTkNERUxBWSAgVGhlIGVuY29kZXIgZGVsYXkuICAKKyAqCisgKiBNaW5pbXVtIGFsbG93ZWQgaXMgTURDVERFTEFZIChzZWUgYmVsb3cpCisgKiAgCisgKiBUaGUgZmlyc3QgOTYgc2FtcGxlcyB3aWxsIGJlIGF0dGVudWF0ZWQsIHNvIHVzaW5nIGEgdmFsdWUgbGVzcyB0aGFuIDk2CisgKiB3aWxsIHJlc3VsdCBpbiBjb3JydXB0IGRhdGEgZm9yIHRoZSBmaXJzdCA5Ni1FTkNERUxBWSBzYW1wbGVzLgorICoKKyAqIHN1Z2dlc3RlZDogNTc2CisgKiBzZXQgdG8gMTE2MCB0byBzeW5jIHdpdGggRmhHLgorICovCisKKyNkZWZpbmUgRU5DREVMQVkgICAgICA1NzYKKworCisKKy8qCisgKiBtYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbXBsZXRlIGZyYW1lIGFmdGVyIHRoZQorICogbGFzdCBmcmFtZSBjb250YWluaW5nIHJlYWwgZGF0YQorICoKKyAqIFVzaW5nIGEgdmFsdWUgb2YgMjg4IHdvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIGEgCisgKiBhIHZlcnkgc29waGlzdGljYXRlZCBkZWNvZGVyIHRoYXQgY2FuIGRlY29kZSBncmFudWxlLWJ5LWdyYW51bGUgaW5zdGVhZAorICogb2YgZnJhbWUgYnkgZnJhbWUuICBCdXQgbGV0cyBub3QgYXNzdW1lIHRoaXMsIGFuZCBhc3N1bWUgdGhlIGRlY29kZXIgIAorICogd2lsbCBub3QgZGVjb2RlIGZyYW1lIE4gdW5sZXNzIGl0IGFsc28gaGFzIGRhdGEgZm9yIGZyYW1lIE4rMQorICoKKyAqLworLyojZGVmaW5lIFBPU1RERUxBWSAgIDI4OCovCisjZGVmaW5lIFBPU1RERUxBWSAgIDExNTIKKworCisKKy8qIAorICogZGVsYXkgb2YgdGhlIE1EQ1QgdXNlZCBpbiBtZGN0LmMKKyAqIG9yaWdpbmFsIElTTyByb3V0aW5lcyBoYWQgYSBkZWxheSBvZiA1MjghICAKKyAqIFRha2VoaXJvJ3Mgcm91dGluZXM6IAorICovCisKKyNkZWZpbmUgTURDVERFTEFZICAgICA0OAorI2RlZmluZSBGRlRPRkZTRVQgICAgICgyMjQrTURDVERFTEFZKQorCisvKgorICogTW9zdCBkZWNvZGVycywgaW5jbHVkaW5nIHRoZSBvbmUgd2UgdXNlLCBoYXZlIGEgZGVsYXkgb2YgNTI4IHNhbXBsZXMuICAKKyAqLworCisjZGVmaW5lIERFQ0RFTEFZICAgICAgNTI4CisKKworLyogbnVtYmVyIG9mIHN1YmJhbmRzICovCisjZGVmaW5lIFNCTElNSVQgICAgICAgMzIKKworLyogcGFyaXRpb24gYmFuZHMgYmFuZHMgKi8KKyNkZWZpbmUgQ0JBTkRTICAgICAgICA2NAorCisvKiBudW1iZXIgb2YgY3JpdGljYWwgYmFuZHMvc2NhbGUgZmFjdG9yIGJhbmRzIHdoZXJlIG1hc2tpbmcgaXMgY29tcHV0ZWQqLworI2RlZmluZSBTQlBTWV9sICAgICAgIDIxCisjZGVmaW5lIFNCUFNZX3MgICAgICAgMTIKKworLyogdG90YWwgbnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIGVuY29kZWQgKi8KKyNkZWZpbmUgU0JNQVhfbCAgICAgICAyMgorI2RlZmluZSBTQk1BWF9zICAgICAgIDEzCisjZGVmaW5lIFBTRkIyMSAgICAgICAgIDYKKyNkZWZpbmUgUFNGQjEyICAgICAgICAgNgorCisKKworLyogRkZUIHNpemVzICovCisjZGVmaW5lIEJMS1NJWkUgICAgICAgMTAyNAorI2RlZmluZSBIQkxLU0laRSAgICAgIChCTEtTSVpFLzIgKyAxKQorI2RlZmluZSBCTEtTSVpFX3MgICAgIDI1NgorI2RlZmluZSBIQkxLU0laRV9zICAgIChCTEtTSVpFX3MvMiArIDEpCisKKworLyogI2RlZmluZSBzd2l0Y2hfcGUgICAgICAgIDE4MDAgKi8KKyNkZWZpbmUgTk9STV9UWVBFICAgICAwCisjZGVmaW5lIFNUQVJUX1RZUEUgICAgMQorI2RlZmluZSBTSE9SVF9UWVBFICAgIDIKKyNkZWZpbmUgU1RPUF9UWVBFICAgICAzCisKKy8qIAorICogTW9kZSBFeHRlbnRpb246CisgKiBXaGVuIHdlIGFyZSBpbiBzdGVyZW8gbW9kZSwgdGhlcmUgYXJlIDQgcG9zc2libGUgbWV0aG9kcyB0byBzdG9yZSB0aGVzZQorICogdHdvIGNoYW5uZWxzLiBUaGUgc3RlcmVvIG1vZGVzIC1tPyBhcmUgdXNpbmcgYSBzdWJzZXQgb2YgdGhlbS4KKyAqCisgKiAgLW1zOiBNUEdfTURfTFJfTFIKKyAqICAtbWo6IE1QR19NRF9MUl9MUiBhbmQgTVBHX01EX01TX0xSCisgKiAgLW1mOiBNUEdfTURfTVNfTFIKKyAqICAtbWk6IGFsbAorICovCisKKyNkZWZpbmUgTVBHX01EX0xSX0xSICAwCisjZGVmaW5lIE1QR19NRF9MUl9JICAgMQorI2RlZmluZSBNUEdfTURfTVNfTFIgIDIKKyNkZWZpbmUgTVBHX01EX01TX0kgICAzCisKKworaW50ICAgICBsYW1lX2VuY29kZV9tcDNfZnJhbWUobGFtZV9nbG9iYWxfZmxhZ3MgKiBjb25zdCBnZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfdCBjb25zdCAqaW5idWZfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV90IGNvbnN0ICppbmJ1Zl9yLCB1bnNpZ25lZCBjaGFyICptcDNidWYsIGludCBtcDNidWZfc2l6ZSk7CisKKyNlbmRpZiAvKiBMQU1FX0VOQ09ERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9mZnQuYyBiL2xpYm1wM2xhbWUvZmZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwMzZiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvZmZ0LmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisqKiBGRlQgYW5kIEZIVCByb3V0aW5lcworKiogIENvcHlyaWdodCAxOTg4LCAxOTkzOyBSb24gTWF5ZXIKKyoqICAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgVGFrZWhpcm8gVG9taW5hZ2EKKyoqCisqKiAgZmh0KGZ6LG4pOworKiogICAgICBEb2VzIGEgaGFydGxleSB0cmFuc2Zvcm0gb2YgIm4iIHBvaW50cyBpbiB0aGUgYXJyYXkgImZ6Ii4KKyoqCisqKiBOT1RFOiBUaGlzIHJvdXRpbmUgdXNlcyBhdCBsZWFzdCAyIHBhdGVudGVkIGFsZ29yaXRobXMsIGFuZCBtYXkgYmUKKyoqICAgICAgIHVuZGVyIHRoZSByZXN0cmljdGlvbnMgb2YgYSBidW5jaCBvZiBkaWZmZXJlbnQgb3JnYW5pemF0aW9ucy4KKyoqICAgICAgIEFsdGhvdWdoIEkgd3JvdGUgaXQgY29tcGxldGVseSBteXNlbGY7IGl0IGlzIGtpbmQgb2YgYSBkZXJpdmF0aXZlCisqKiAgICAgICBvZiBhIHJvdXRpbmUgSSBvbmNlIGF1dGhvcmVkIGFuZCByZWxlYXNlZCB1bmRlciB0aGUgR1BMLCBzbyBpdAorKiogICAgICAgbWF5IGZhbGwgdW5kZXIgdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbidzIHJlc3RyaWN0aW9uczsKKyoqICAgICAgIGl0IHdhcyB3b3JrZWQgb24gYXMgYSBTdGFuZm9yZCBVbml2IHByb2plY3QsIHNvIHRoZXkgY2xhaW0KKyoqICAgICAgIHNvbWUgcmlnaHRzIHRvIGl0OyBpdCB3YXMgZnVydGhlciBvcHRpbWl6ZWQgYXQgd29yayBoZXJlLCBzbworKiogICAgICAgSSB0aGluayB0aGlzIGNvbXBhbnkgY2xhaW1zIHBhcnRzIG9mIGl0LiAgVGhlIHBhdGVudHMgYXJlCisqKiAgICAgICBoZWxkIGJ5IFIuIEJyYWNld2VsbCAodGhlIEZIVCBhbGdvcml0aG0pIGFuZCBPLiBCdW5lbWFuICh0aGUKKyoqICAgICAgIHRyaWcgZ2VuZXJhdG9yKSwgYm90aCBhdCBTdGFuZm9yZCBVbml2LgorKiogICAgICAgSWYgaXQgd2VyZSB1cCB0byBtZSwgSSdkIHNheSBnbyBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIGl0OworKiogICAgICAgYnV0IGl0IHdvdWxkIGJlIHBvbGl0ZSB0byBnaXZlIGNyZWRpdCB0byB0aGUgZm9sbG93aW5nIHBlb3BsZQorKiogICAgICAgaWYgeW91IHVzZSB0aGlzIGFueXdoZXJlOgorKiogICAgICAgICAgIEV1bGVyICAgICAtIHByb2JhYmxlIGludmVudG9yIG9mIHRoZSBmb3VyaWVyIHRyYW5zZm9ybS4KKyoqICAgICAgICAgICBHYXVzcyAgICAgLSBwcm9iYWJsZSBpbnZlbnRvciBvZiB0aGUgRkZULgorKiogICAgICAgICAgIEhhcnRsZXkgICAtIHByb2JhYmxlIGludmVudG9yIG9mIHRoZSBoYXJ0bGV5IHRyYW5zZm9ybS4KKyoqICAgICAgICAgICBCdW5lbWFuICAgLSBmb3IgYSByZWFsbHkgY29vbCB0cmlnIGdlbmVyYXRvcgorKiogICAgICAgICAgIE1heWVyKG1lKSAtIGZvciBhdXRob3JpbmcgdGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24gYW5kCisqKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIGFsbCB0aGUgb3B0aW1pemF0aW9ucyBpbiBvbmUgcGFja2FnZS4KKyoqICAgICAgIFRoYW5rcywKKyoqICAgICAgIFJvbiBNYXllcjsgbWF5ZXJAYWN1c29uLmNvbQorKiogYW5kIGFkZGVkIHNvbWUgb3B0aW1pemF0aW9uIGJ5CisqKiAgICAgICAgICAgTWF0aGVyICAgIC0gaWRlYSBvZiB1c2luZyBsb29rdXAgdGFibGUKKyoqICAgICAgICAgICBUYWtlaGlybyAgLSBzb21lIGRpcnR5IGhhY2sgZm9yIHNwZWVkIHVwCisqLworCisvKiAkSWQ6IGZmdC5jLHYgMS4zMyAyMDA4LzA0LzEyIDE4OjE4OjA2IHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGFtZS5oIgorI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNpbmNsdWRlICJlbmNvZGVyLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImZmdC5oIgorCisKKworCisKKyNkZWZpbmUgVFJJX1NJWkUgKDUtMSkgIC8qIDEwMjQgPSAgNCoqNSAqLworCisvKiBmZnQuYyAgICAqLworc3RhdGljIEZMT0FUIHdpbmRvd1tCTEtTSVpFXSwgd2luZG93X3NbQkxLU0laRV9zIC8gMl07CisKK3N0YXRpYyBjb25zdCBGTE9BVCBjb3N0YWJbVFJJX1NJWkUgKiAyXSA9IHsKKyAgICA5LjIzODc5NTMyNTExMjg2N2UtMDEsIDMuODI2ODM0MzIzNjUwODk4ZS0wMSwKKyAgICA5Ljk1MTg0NzI2NjcyMTk2OWUtMDEsIDkuODAxNzE0MDMyOTU2MDYwZS0wMiwKKyAgICA5Ljk5Njk4ODE4Njk2MjA0MmUtMDEsIDIuNDU0MTIyODUyMjkxMjI5ZS0wMiwKKyAgICA5Ljk5OTgxMTc1MjgyNjAxMWUtMDEsIDYuMTM1ODg0NjQ5MTU0NDc1ZS0wMworfTsKKworc3RhdGljIHZvaWQKK2ZodChGTE9BVCAqIGZ6LCBpbnQgbikKK3sKKyAgICBjb25zdCBGTE9BVCAqdHJpID0gY29zdGFiOworICAgIGludCAgICAgazQ7CisgICAgRkxPQVQgICpmaSwgKmdpOworICAgIEZMT0FUIGNvbnN0ICpmbjsKKworICAgIG4gPDw9IDE7ICAgICAgICAgICAgLyogdG8gZ2V0IEJMS1NJWkUsIGJlY2F1c2Ugb2YgM0ROb3chIEFTTSByb3V0aW5lICovCisgICAgZm4gPSBmeiArIG47CisgICAgazQgPSA0OworICAgIGRvIHsKKyAgICAgICAgRkxPQVQgICBzMSwgYzE7CisgICAgICAgIGludCAgICAgaSwgazEsIGsyLCBrMywga3g7CisgICAgICAgIGt4ID0gazQgPj4gMTsKKyAgICAgICAgazEgPSBrNDsKKyAgICAgICAgazIgPSBrNCA8PCAxOworICAgICAgICBrMyA9IGsyICsgazE7CisgICAgICAgIGs0ID0gazIgPDwgMTsKKyAgICAgICAgZmkgPSBmejsKKyAgICAgICAgZ2kgPSBmaSArIGt4OworICAgICAgICBkbyB7CisgICAgICAgICAgICBGTE9BVCAgIGYwLCBmMSwgZjIsIGYzOworICAgICAgICAgICAgZjEgPSBmaVswXSAtIGZpW2sxXTsKKyAgICAgICAgICAgIGYwID0gZmlbMF0gKyBmaVtrMV07CisgICAgICAgICAgICBmMyA9IGZpW2syXSAtIGZpW2szXTsKKyAgICAgICAgICAgIGYyID0gZmlbazJdICsgZmlbazNdOworICAgICAgICAgICAgZmlbazJdID0gZjAgLSBmMjsKKyAgICAgICAgICAgIGZpWzBdID0gZjAgKyBmMjsKKyAgICAgICAgICAgIGZpW2szXSA9IGYxIC0gZjM7CisgICAgICAgICAgICBmaVtrMV0gPSBmMSArIGYzOworICAgICAgICAgICAgZjEgPSBnaVswXSAtIGdpW2sxXTsKKyAgICAgICAgICAgIGYwID0gZ2lbMF0gKyBnaVtrMV07CisgICAgICAgICAgICBmMyA9IFNRUlQyICogZ2lbazNdOworICAgICAgICAgICAgZjIgPSBTUVJUMiAqIGdpW2syXTsKKyAgICAgICAgICAgIGdpW2syXSA9IGYwIC0gZjI7CisgICAgICAgICAgICBnaVswXSA9IGYwICsgZjI7CisgICAgICAgICAgICBnaVtrM10gPSBmMSAtIGYzOworICAgICAgICAgICAgZ2lbazFdID0gZjEgKyBmMzsKKyAgICAgICAgICAgIGdpICs9IGs0OworICAgICAgICAgICAgZmkgKz0gazQ7CisgICAgICAgIH0gd2hpbGUgKGZpIDwgZm4pOworICAgICAgICBjMSA9IHRyaVswXTsKKyAgICAgICAgczEgPSB0cmlbMV07CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBreDsgaSsrKSB7CisgICAgICAgICAgICBGTE9BVCAgIGMyLCBzMjsKKyAgICAgICAgICAgIGMyID0gMSAtICgyICogczEpICogczE7CisgICAgICAgICAgICBzMiA9ICgyICogczEpICogYzE7CisgICAgICAgICAgICBmaSA9IGZ6ICsgaTsKKyAgICAgICAgICAgIGdpID0gZnogKyBrMSAtIGk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgRkxPQVQgICBhLCBiLCBnMCwgZjAsIGYxLCBnMSwgZjIsIGcyLCBmMywgZzM7CisgICAgICAgICAgICAgICAgYiA9IHMyICogZmlbazFdIC0gYzIgKiBnaVtrMV07CisgICAgICAgICAgICAgICAgYSA9IGMyICogZmlbazFdICsgczIgKiBnaVtrMV07CisgICAgICAgICAgICAgICAgZjEgPSBmaVswXSAtIGE7CisgICAgICAgICAgICAgICAgZjAgPSBmaVswXSArIGE7CisgICAgICAgICAgICAgICAgZzEgPSBnaVswXSAtIGI7CisgICAgICAgICAgICAgICAgZzAgPSBnaVswXSArIGI7CisgICAgICAgICAgICAgICAgYiA9IHMyICogZmlbazNdIC0gYzIgKiBnaVtrM107CisgICAgICAgICAgICAgICAgYSA9IGMyICogZmlbazNdICsgczIgKiBnaVtrM107CisgICAgICAgICAgICAgICAgZjMgPSBmaVtrMl0gLSBhOworICAgICAgICAgICAgICAgIGYyID0gZmlbazJdICsgYTsKKyAgICAgICAgICAgICAgICBnMyA9IGdpW2syXSAtIGI7CisgICAgICAgICAgICAgICAgZzIgPSBnaVtrMl0gKyBiOworICAgICAgICAgICAgICAgIGIgPSBzMSAqIGYyIC0gYzEgKiBnMzsKKyAgICAgICAgICAgICAgICBhID0gYzEgKiBmMiArIHMxICogZzM7CisgICAgICAgICAgICAgICAgZmlbazJdID0gZjAgLSBhOworICAgICAgICAgICAgICAgIGZpWzBdID0gZjAgKyBhOworICAgICAgICAgICAgICAgIGdpW2szXSA9IGcxIC0gYjsKKyAgICAgICAgICAgICAgICBnaVtrMV0gPSBnMSArIGI7CisgICAgICAgICAgICAgICAgYiA9IGMxICogZzIgLSBzMSAqIGYzOworICAgICAgICAgICAgICAgIGEgPSBzMSAqIGcyICsgYzEgKiBmMzsKKyAgICAgICAgICAgICAgICBnaVtrMl0gPSBnMCAtIGE7CisgICAgICAgICAgICAgICAgZ2lbMF0gPSBnMCArIGE7CisgICAgICAgICAgICAgICAgZmlbazNdID0gZjEgLSBiOworICAgICAgICAgICAgICAgIGZpW2sxXSA9IGYxICsgYjsKKyAgICAgICAgICAgICAgICBnaSArPSBrNDsKKyAgICAgICAgICAgICAgICBmaSArPSBrNDsKKyAgICAgICAgICAgIH0gd2hpbGUgKGZpIDwgZm4pOworICAgICAgICAgICAgYzIgPSBjMTsKKyAgICAgICAgICAgIGMxID0gYzIgKiB0cmlbMF0gLSBzMSAqIHRyaVsxXTsKKyAgICAgICAgICAgIHMxID0gYzIgKiB0cmlbMV0gKyBzMSAqIHRyaVswXTsKKyAgICAgICAgfQorICAgICAgICB0cmkgKz0gMjsKKyAgICB9IHdoaWxlIChrNCA8IG4pOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBydl90YmxbXSA9IHsKKyAgICAweDAwLCAweDgwLCAweDQwLCAweGMwLCAweDIwLCAweGEwLCAweDYwLCAweGUwLAorICAgIDB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsCisgICAgMHgwOCwgMHg4OCwgMHg0OCwgMHhjOCwgMHgyOCwgMHhhOCwgMHg2OCwgMHhlOCwKKyAgICAweDE4LCAweDk4LCAweDU4LCAweGQ4LCAweDM4LCAweGI4LCAweDc4LCAweGY4LAorICAgIDB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsCisgICAgMHgxNCwgMHg5NCwgMHg1NCwgMHhkNCwgMHgzNCwgMHhiNCwgMHg3NCwgMHhmNCwKKyAgICAweDBjLCAweDhjLCAweDRjLCAweGNjLCAweDJjLCAweGFjLCAweDZjLCAweGVjLAorICAgIDB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsCisgICAgMHgwMiwgMHg4MiwgMHg0MiwgMHhjMiwgMHgyMiwgMHhhMiwgMHg2MiwgMHhlMiwKKyAgICAweDEyLCAweDkyLCAweDUyLCAweGQyLCAweDMyLCAweGIyLCAweDcyLCAweGYyLAorICAgIDB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsCisgICAgMHgxYSwgMHg5YSwgMHg1YSwgMHhkYSwgMHgzYSwgMHhiYSwgMHg3YSwgMHhmYSwKKyAgICAweDA2LCAweDg2LCAweDQ2LCAweGM2LCAweDI2LCAweGE2LCAweDY2LCAweGU2LAorICAgIDB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsCisgICAgMHgwZSwgMHg4ZSwgMHg0ZSwgMHhjZSwgMHgyZSwgMHhhZSwgMHg2ZSwgMHhlZSwKKyAgICAweDFlLCAweDllLCAweDVlLCAweGRlLCAweDNlLCAweGJlLCAweDdlLCAweGZlCit9OworCisjZGVmaW5lIGNoMDEoaW5kZXgpICAoYnVmZmVyW2Nobl1baW5kZXhdKQorCisjZGVmaW5lIG1sMDAoZikgKHdpbmRvd1tpICAgICAgICBdICogZihpKSkKKyNkZWZpbmUgbWwxMChmKSAod2luZG93W2kgKyAweDIwMF0gKiBmKGkgKyAweDIwMCkpCisjZGVmaW5lIG1sMjAoZikgKHdpbmRvd1tpICsgMHgxMDBdICogZihpICsgMHgxMDApKQorI2RlZmluZSBtbDMwKGYpICh3aW5kb3dbaSArIDB4MzAwXSAqIGYoaSArIDB4MzAwKSkKKworI2RlZmluZSBtbDAxKGYpICh3aW5kb3dbaSArIDB4MDAxXSAqIGYoaSArIDB4MDAxKSkKKyNkZWZpbmUgbWwxMShmKSAod2luZG93W2kgKyAweDIwMV0gKiBmKGkgKyAweDIwMSkpCisjZGVmaW5lIG1sMjEoZikgKHdpbmRvd1tpICsgMHgxMDFdICogZihpICsgMHgxMDEpKQorI2RlZmluZSBtbDMxKGYpICh3aW5kb3dbaSArIDB4MzAxXSAqIGYoaSArIDB4MzAxKSkKKworI2RlZmluZSBtczAwKGYpICh3aW5kb3dfc1tpICAgICAgIF0gKiBmKGkgKyBrKSkKKyNkZWZpbmUgbXMxMChmKSAod2luZG93X3NbMHg3ZiAtIGldICogZihpICsgayArIDB4ODApKQorI2RlZmluZSBtczIwKGYpICh3aW5kb3dfc1tpICsgMHg0MF0gKiBmKGkgKyBrICsgMHg0MCkpCisjZGVmaW5lIG1zMzAoZikgKHdpbmRvd19zWzB4M2YgLSBpXSAqIGYoaSArIGsgKyAweGMwKSkKKworI2RlZmluZSBtczAxKGYpICh3aW5kb3dfc1tpICsgMHgwMV0gKiBmKGkgKyBrICsgMHgwMSkpCisjZGVmaW5lIG1zMTEoZikgKHdpbmRvd19zWzB4N2UgLSBpXSAqIGYoaSArIGsgKyAweDgxKSkKKyNkZWZpbmUgbXMyMShmKSAod2luZG93X3NbaSArIDB4NDFdICogZihpICsgayArIDB4NDEpKQorI2RlZmluZSBtczMxKGYpICh3aW5kb3dfc1sweDNlIC0gaV0gKiBmKGkgKyBrICsgMHhjMSkpCisKKwordm9pZAorZmZ0X3Nob3J0KGxhbWVfaW50ZXJuYWxfZmxhZ3MgY29uc3QgKmNvbnN0IGdmYywKKyAgICAgICAgICBGTE9BVCB4X3JlYWxbM11bQkxLU0laRV9zXSwgaW50IGNobiwgY29uc3Qgc2FtcGxlX3QgKiBidWZmZXJbMl0pCit7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgajsKKyAgICBpbnQgICAgIGI7CisKKyAgICBmb3IgKGIgPSAwOyBiIDwgMzsgYisrKSB7CisgICAgICAgIEZMT0FUICAqeCA9ICZ4X3JlYWxbYl1bQkxLU0laRV9zIC8gMl07CisgICAgICAgIHNob3J0IGNvbnN0IGsgPSAoNTc2IC8gMykgKiAoYiArIDEpOworICAgICAgICBqID0gQkxLU0laRV9zIC8gOCAtIDE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIEZMT0FUICAgZjAsIGYxLCBmMiwgZjMsIHc7CisKKyAgICAgICAgICAgIGkgPSBydl90YmxbaiA8PCAyXTsKKworICAgICAgICAgICAgZjAgPSBtczAwKGNoMDEpOworICAgICAgICAgICAgdyA9IG1zMTAoY2gwMSk7CisgICAgICAgICAgICBmMSA9IGYwIC0gdzsKKyAgICAgICAgICAgIGYwID0gZjAgKyB3OworICAgICAgICAgICAgZjIgPSBtczIwKGNoMDEpOworICAgICAgICAgICAgdyA9IG1zMzAoY2gwMSk7CisgICAgICAgICAgICBmMyA9IGYyIC0gdzsKKyAgICAgICAgICAgIGYyID0gZjIgKyB3OworCisgICAgICAgICAgICB4IC09IDQ7CisgICAgICAgICAgICB4WzBdID0gZjAgKyBmMjsKKyAgICAgICAgICAgIHhbMl0gPSBmMCAtIGYyOworICAgICAgICAgICAgeFsxXSA9IGYxICsgZjM7CisgICAgICAgICAgICB4WzNdID0gZjEgLSBmMzsKKworICAgICAgICAgICAgZjAgPSBtczAxKGNoMDEpOworICAgICAgICAgICAgdyA9IG1zMTEoY2gwMSk7CisgICAgICAgICAgICBmMSA9IGYwIC0gdzsKKyAgICAgICAgICAgIGYwID0gZjAgKyB3OworICAgICAgICAgICAgZjIgPSBtczIxKGNoMDEpOworICAgICAgICAgICAgdyA9IG1zMzEoY2gwMSk7CisgICAgICAgICAgICBmMyA9IGYyIC0gdzsKKyAgICAgICAgICAgIGYyID0gZjIgKyB3OworCisgICAgICAgICAgICB4W0JMS1NJWkVfcyAvIDIgKyAwXSA9IGYwICsgZjI7CisgICAgICAgICAgICB4W0JMS1NJWkVfcyAvIDIgKyAyXSA9IGYwIC0gZjI7CisgICAgICAgICAgICB4W0JMS1NJWkVfcyAvIDIgKyAxXSA9IGYxICsgZjM7CisgICAgICAgICAgICB4W0JMS1NJWkVfcyAvIDIgKyAzXSA9IGYxIC0gZjM7CisgICAgICAgIH0gd2hpbGUgKC0taiA+PSAwKTsKKworICAgICAgICBnZmMtPmZmdF9maHQoeCwgQkxLU0laRV9zIC8gMik7CisgICAgICAgIC8qIEJMS1NJWkVfcy8yIGJlY2F1c2Ugb2YgM0ROb3chIEFTTSByb3V0aW5lICovCisgICAgfQorfQorCit2b2lkCitmZnRfbG9uZyhsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMsCisgICAgICAgICBGTE9BVCB4W0JMS1NJWkVdLCBpbnQgY2huLCBjb25zdCBzYW1wbGVfdCAqIGJ1ZmZlclsyXSkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICBqaiA9IEJMS1NJWkUgLyA4IC0gMTsKKyAgICB4ICs9IEJMS1NJWkUgLyAyOworCisgICAgZG8geworICAgICAgICBGTE9BVCAgIGYwLCBmMSwgZjIsIGYzLCB3OworCisgICAgICAgIGkgPSBydl90YmxbampdOworICAgICAgICBmMCA9IG1sMDAoY2gwMSk7CisgICAgICAgIHcgPSBtbDEwKGNoMDEpOworICAgICAgICBmMSA9IGYwIC0gdzsKKyAgICAgICAgZjAgPSBmMCArIHc7CisgICAgICAgIGYyID0gbWwyMChjaDAxKTsKKyAgICAgICAgdyA9IG1sMzAoY2gwMSk7CisgICAgICAgIGYzID0gZjIgLSB3OworICAgICAgICBmMiA9IGYyICsgdzsKKworICAgICAgICB4IC09IDQ7CisgICAgICAgIHhbMF0gPSBmMCArIGYyOworICAgICAgICB4WzJdID0gZjAgLSBmMjsKKyAgICAgICAgeFsxXSA9IGYxICsgZjM7CisgICAgICAgIHhbM10gPSBmMSAtIGYzOworCisgICAgICAgIGYwID0gbWwwMShjaDAxKTsKKyAgICAgICAgdyA9IG1sMTEoY2gwMSk7CisgICAgICAgIGYxID0gZjAgLSB3OworICAgICAgICBmMCA9IGYwICsgdzsKKyAgICAgICAgZjIgPSBtbDIxKGNoMDEpOworICAgICAgICB3ID0gbWwzMShjaDAxKTsKKyAgICAgICAgZjMgPSBmMiAtIHc7CisgICAgICAgIGYyID0gZjIgKyB3OworCisgICAgICAgIHhbQkxLU0laRSAvIDIgKyAwXSA9IGYwICsgZjI7CisgICAgICAgIHhbQkxLU0laRSAvIDIgKyAyXSA9IGYwIC0gZjI7CisgICAgICAgIHhbQkxLU0laRSAvIDIgKyAxXSA9IGYxICsgZjM7CisgICAgICAgIHhbQkxLU0laRSAvIDIgKyAzXSA9IGYxIC0gZjM7CisgICAgfSB3aGlsZSAoLS1qaiA+PSAwKTsKKworICAgIGdmYy0+ZmZ0X2ZodCh4LCBCTEtTSVpFIC8gMik7CisgICAgLyogQkxLU0laRS8yIGJlY2F1c2Ugb2YgM0ROb3chIEFTTSByb3V0aW5lICovCit9CisKKyNpZmRlZiBIQVZFX05BU00KK2V4dGVybiB2b2lkIGZodF8zRE4oRkxPQVQgKiBmeiwgaW50IG4pOworZXh0ZXJuIHZvaWQgZmh0X1NTRShGTE9BVCAqIGZ6LCBpbnQgbik7CisjZW5kaWYKKwordm9pZAoraW5pdF9mZnQobGFtZV9pbnRlcm5hbF9mbGFncyAqIGNvbnN0IGdmYykKK3sKKyAgICBpbnQgICAgIGk7CisKKyAgICAvKiBUaGUgdHlwZSBvZiB3aW5kb3cgdXNlZCBoZXJlIHdpbGwgbWFrZSBubyByZWFsIGRpZmZlcmVuY2UsIGJ1dCAqLworICAgIC8qIGluIHRoZSBpbnRlcmVzdCBvZiBtZXJnaW5nIG5zcHN5dHVuZSBzdHVmZiAtIHN3aXRjaCB0byBibGFja21hbiB3aW5kb3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQkxLU0laRTsgaSsrKQorICAgICAgICAvKiBibGFja21hbiB3aW5kb3cgKi8KKyAgICAgICAgd2luZG93W2ldID0gMC40MiAtIDAuNSAqIGNvcygyICogUEkgKiAoaSArIC41KSAvIEJMS1NJWkUpICsKKyAgICAgICAgICAgIDAuMDggKiBjb3MoNCAqIFBJICogKGkgKyAuNSkgLyBCTEtTSVpFKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCTEtTSVpFX3MgLyAyOyBpKyspCisgICAgICAgIHdpbmRvd19zW2ldID0gMC41ICogKDEuMCAtIGNvcygyLjAgKiBQSSAqIChpICsgMC41KSAvIEJMS1NJWkVfcykpOworCisjaWZkZWYgSEFWRV9OQVNNCisgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLkFNRF8zRE5vdykgeworICAgICAgICBnZmMtPmZmdF9maHQgPSBmaHRfM0ROOworICAgIH0KKyAgICBlbHNlIGlmIChnZmMtPkNQVV9mZWF0dXJlcy5TU0UpIHsKKyAgICAgICAgZ2ZjLT5mZnRfZmh0ID0gZmh0X1NTRTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBnZmMtPmZmdF9maHQgPSBmaHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9mZnQuaCBiL2xpYm1wM2xhbWUvZmZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmOGFiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvZmZ0LmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqCUZhc3QgRm91cmllciBUcmFuc2Zvcm0gaW5jbHVkZSBmaWxlCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwIE1hcmsgVGF5bG9yCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTEFNRV9GRlRfSAorI2RlZmluZSBMQU1FX0ZGVF9ICisKK3ZvaWQgICAgZmZ0X2xvbmcobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjLCBGTE9BVCB4X3JlYWxbQkxLU0laRV0sCisgICAgICAgICAgICAgICAgIGludCBjaG4sIGNvbnN0IHNhbXBsZV90ICogZGF0YVsyXSk7CisKK3ZvaWQgICAgZmZ0X3Nob3J0KGxhbWVfaW50ZXJuYWxfZmxhZ3MgY29uc3QgKmNvbnN0IGdmYywgRkxPQVQgeF9yZWFsWzNdW0JMS1NJWkVfc10sCisgICAgICAgICAgICAgICAgICBpbnQgY2huLCBjb25zdCBzYW1wbGVfdCAqIGRhdGFbMl0pOworCit2b2lkICAgIGluaXRfZmZ0KGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMpOworCisjZW5kaWYKKworLyogRW5kIG9mIGZmdC5oICovCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2dhaW5fYW5hbHlzaXMuYyBiL2xpYm1wM2xhbWUvZ2Fpbl9hbmFseXNpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjMwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2dhaW5fYW5hbHlzaXMuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqICBSZXBsYXlHYWluQW5hbHlzaXMgLSBhbmFseXplcyBpbnB1dCBzYW1wbGVzIGFuZCBnaXZlIHRoZSByZWNvbW1lbmRlZCBkQiBjaGFuZ2UKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgUm9iaW5zb24gYW5kIEdsZW4gU2F3eWVyCisgKiAgSW1wcm92ZW1lbnRzIGFuZCBvcHRpbWl6YXRpb25zIGFkZGVkIGJ5IEZyYW5rIEtsZW1tLCBhbmQgYnkgTWFyY2VsIE11bGxlciAKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBjb25jZXB0IGFuZCBmaWx0ZXIgdmFsdWVzIGJ5IERhdmlkIFJvYmluc29uIChEYXZpZEBSb2JpbnNvbi5vcmcpCisgKiAgICAtLSBibGFtZSBoaW0gaWYgeW91IHRoaW5rIHRoZSBpZGVhIGlzIGZsYXdlZAorICogIG9yaWdpbmFsIGNvZGluZyBieSBHbGVuIFNhd3llciAobXAzZ2FpbkBob3RtYWlsLmNvbSkKKyAqICAgIC0tIGJsYW1lIGhpbSBpZiB5b3UgdGhpbmsgdGhpcyBydW5zIHRvbyBzbG93bHksIG9yIHRoZSBjb2RpbmcgaXMgb3RoZXJ3aXNlIGZsYXdlZAorICoKKyAqICBsb3RzIG9mIGNvZGUgaW1wcm92ZW1lbnRzIGJ5IEZyYW5rIEtsZW1tICggaHR0cDovL3d3dy51bmktamVuYS5kZS9+cGZrL21wcC8gKQorICogICAgLS0gY3JlZGl0IGhpbSBmb3IgYWxsIHRoZSBfZ29vZF8gcHJvZ3JhbW1pbmcgOykKKyAqCisgKgorICogIEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgY29uY2VwdHMgYW5kIHRoZSBiYXNpYyBhbGdvcml0aG1zIGludm9sdmVkLCBnbyB0bzoKKyAqICAgIGh0dHA6Ly93d3cucmVwbGF5Z2Fpbi5vcmcvCisgKi8KKworLyoKKyAqICBIZXJlJ3MgdGhlIGRlYWwuIENhbGwKKyAqCisgKiAgICBJbml0R2FpbkFuYWx5c2lzICggbG9uZyBzYW1wbGVmcmVxICk7CisgKgorICogIHRvIGluaXRpYWxpemUgZXZlcnl0aGluZy4gQ2FsbAorICoKKyAqICAgIEFuYWx5emVTYW1wbGVzICggY29uc3QgRmxvYXRfdCogIGxlZnRfc2FtcGxlcywKKyAqICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRfdCogIHJpZ2h0X3NhbXBsZXMsCisgKiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBudW1fc2FtcGxlcywKKyAqICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG51bV9jaGFubmVscyApOworICoKKyAqICBhcyBtYW55IHRpbWVzIGFzIHlvdSB3YW50LCB3aXRoIGFzIG1hbnkgb3IgYXMgZmV3IHNhbXBsZXMgYXMgeW91IHdhbnQuCisgKiAgSWYgbW9ubywgcGFzcyB0aGUgc2FtcGxlIGJ1ZmZlciBpbiB0aHJvdWdoIGxlZnRfc2FtcGxlcywgbGVhdmUKKyAqICByaWdodF9zYW1wbGVzIE5VTEwsIGFuZCBtYWtlIHN1cmUgbnVtX2NoYW5uZWxzID0gMS4KKyAqCisgKiAgICBHZXRUaXRsZUdhaW4oKQorICoKKyAqICB3aWxsIHJldHVybiB0aGUgcmVjb21tZW5kZWQgZEIgbGV2ZWwgY2hhbmdlIGZvciBhbGwgc2FtcGxlcyBhbmFseXplZAorICogIFNJTkNFIFRIRSBMQVNUIFRJTUUgeW91IGNhbGxlZCBHZXRUaXRsZUdhaW4oKSBPUiBJbml0R2FpbkFuYWx5c2lzKCkuCisgKgorICogICAgR2V0QWxidW1HYWluKCkKKyAqCisgKiAgd2lsbCByZXR1cm4gdGhlIHJlY29tbWVuZGVkIGRCIGxldmVsIGNoYW5nZSBmb3IgYWxsIHNhbXBsZXMgYW5hbHl6ZWQKKyAqICBzaW5jZSBJbml0R2FpbkFuYWx5c2lzKCkgd2FzIGNhbGxlZCBhbmQgZmluYWxpemVkIHdpdGggR2V0VGl0bGVHYWluKCkuCisgKgorICogIFBzZXVkby1jb2RlIHRvIHByb2Nlc3MgYW4gYWxidW06CisgKgorICogICAgRmxvYXRfdCAgICAgICBsX3NhbXBsZXMgWzQwOTZdOworICogICAgRmxvYXRfdCAgICAgICByX3NhbXBsZXMgWzQwOTZdOworICogICAgc2l6ZV90ICAgICAgICBudW1fc2FtcGxlczsKKyAqICAgIHVuc2lnbmVkIGludCAgbnVtX3NvbmdzOworICogICAgdW5zaWduZWQgaW50ICBpOworICoKKyAqICAgIEluaXRHYWluQW5hbHlzaXMgKCA0NDEwMCApOworICogICAgZm9yICggaSA9IDE7IGkgPD0gbnVtX3NvbmdzOyBpKysgKSB7CisgKiAgICAgICAgd2hpbGUgKCAoIG51bV9zYW1wbGVzID0gZ2V0U29uZ1NhbXBsZXMgKCBzb25nW2ldLCBsZWZ0X3NhbXBsZXMsIHJpZ2h0X3NhbXBsZXMgKSApID4gMCApCisgKiAgICAgICAgICAgIEFuYWx5emVTYW1wbGVzICggbGVmdF9zYW1wbGVzLCByaWdodF9zYW1wbGVzLCBudW1fc2FtcGxlcywgMiApOworICogICAgICAgIGZwcmludGYgKCJSZWNvbW1lbmRlZCBkQiBjaGFuZ2UgZm9yIHNvbmcgJTJkOiAlKzYuMmYgZEJcbiIsIGksIEdldFRpdGxlR2FpbigpICk7CisgKiAgICB9CisgKiAgICBmcHJpbnRmICgiUmVjb21tZW5kZWQgZEIgY2hhbmdlIGZvciB3aG9sZSBhbGJ1bTogJSs2LjJmIGRCXG4iLCBHZXRBbGJ1bUdhaW4oKSApOworICovCisKKy8qCisgKiAgU28gaGVyZSdzIHRoZSBtYWluIHNvdXJjZSBvZiBwb3RlbnRpYWwgY29kZSBjb25mdXNpb246CisgKgorICogIFRoZSBmaWx0ZXJzIGFwcGxpZWQgdG8gdGhlIGluY29taW5nIHNhbXBsZXMgYXJlIElJUiBmaWx0ZXJzLAorICogIG1lYW5pbmcgdGhleSByZWx5IG9uIHVwIHRvIDxmaWx0ZXIgb3JkZXI+IG51bWJlciBvZiBwcmV2aW91cyBzYW1wbGVzCisgKiAgQU5EIHVwIHRvIDxmaWx0ZXIgb3JkZXI+IG51bWJlciBvZiBwcmV2aW91cyBmaWx0ZXJlZCBzYW1wbGVzLgorICoKKyAqICBJIHNldCB1cCB0aGUgQW5hbHl6ZVNhbXBsZXMgcm91dGluZSB0byBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UgYW5kIGludGVyZmFjZQorICogIGNvbXBsZXhpdHkuIFRoZSBzcGVlZCBpc24ndCBjb21wcm9taXNlZCB0b28gbXVjaCAoSSBkb24ndCB0aGluayksIGJ1dCB0aGUKKyAqICBpbnRlcm5hbCBjb21wbGV4aXR5IGlzIGhpZ2hlciB0aGFuIGl0IHNob3VsZCBiZSBmb3Igc3VjaCBhIHJlbGF0aXZlbHkKKyAqICBzaW1wbGUgcm91dGluZS4KKyAqCisgKiAgT3B0aW1pemF0aW9uL2NsYXJpdHkgc3VnZ2VzdGlvbnMgYXJlIHdlbGNvbWUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZ2Fpbl9hbmFseXNpcy5oIgorCisvKiBmb3IgZWFjaCBmaWx0ZXI6ICovCisvKiBbMF0gNDgga0h6LCBbMV0gNDQuMSBrSHosIFsyXSAzMiBrSHosIFszXSAyNCBrSHosIFs0XSAyMjA1MCBIeiwgWzVdIDE2IGtIeiwgWzZdIDEyIGtIeiwgWzddIGlzIDExMDI1IEh6LCBbOF0gOCBrSHogKi8KKworI2lmZGVmIFdJTjMyCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogNDMwNSApCisjZW5kaWYKKworLypsaW50IC1zYXZlIC1lNzM2IGxvc3Mgb2YgcHJlY2lzaW9uICovCitzdGF0aWMgY29uc3QgRmxvYXRfdCBBQll1bGVbOV1bMiAqIFlVTEVfT1JERVIgKyAxXSA9IHsKKyAgICB7MC4wMzg1NzU5OTQzNTIwMCwgLTMuODQ2NjQ2MTcxMTgwNjcsIC0wLjAyMTYwMzY3MTg0MTg1LCA3LjgxNTAxNjUzMDA1NTM4LCAtMC4wMDEyMzM5NTMxNjg1MSwKKyAgICAgLTExLjM0MTcwMzU1MTMyMDQyLCAtMC4wMDAwOTI5MTY3Nzk1OSwgMTMuMDU1MDQyMTkzMjc1NDUsIC0wLjAxNjU1MjYwMzQxNjE5LAorICAgICAtMTIuMjg3NTk4OTUxNDUyOTQsIDAuMDIxNjE1MjY4NDMyNzQsIDkuNDgyOTM4MDYzMTk3OTAsIC0wLjAyMDc0MDQ1MjE1Mjg1LCAtNS44NzI1Nzg2MTc3NTk5OSwKKyAgICAgMC4wMDU5NDI5ODA2NTEyNSwgMi43NTQ2NTg2MTg3NDYxMywgMC4wMDMwNjQyODAyMzE5MSwgLTAuODY5ODQzNzY1OTM1NTEsIDAuMDAwMTIwMjUzMjIwMjcsCisgICAgIDAuMTM5MTkzMTQ1Njc0MzIsIDAuMDAyODg0NjM2ODM5MTZ9LAorICAgIHswLjA1NDE4NjU2NDA2NDMwLCAtMy40Nzg0NTk0ODU1MDA3MSwgLTAuMDI5MTEwMDc4MDg5NDgsIDYuMzYzMTc3Nzc1NjYxNDgsIC0wLjAwODQ4NzA5Mzc5ODUxLAorICAgICAtOC41NDc1MTUyNzQ3MTg3NCwgLTAuMDA4NTExNjU2NDU0NjksIDkuNDc2OTM2MDc4MDEyODAsIC0wLjAwODM0OTkwOTA0OTM2LCAtOC44MTQ5ODY4MTM3MDE1NSwKKyAgICAgMC4wMjI0NTI5MzI1MzMzOSwgNi44NTQwMTU0MDkzNjk5OCwgLTAuMDI1OTYzMzg1MTI5MTUsIC00LjM5NDcwOTk2MDc5NTU5LCAwLjAxNjI0ODY0OTYyOTc1LAorICAgICAyLjE5NjExNjg0ODkwNzc0LCAtMC4wMDI0MDg3OTA1MTU4NCwgLTAuNzUxMDQzMDI0NTE0MzIsIDAuMDA2NzQ2MTM2ODIyNDcsIDAuMTMxNDkzMTc5NTg4MDgsCisgICAgIC0wLjAwMTg3NzYzNzc3MzYyfSwKKyAgICB7MC4xNTQ1NzI5OTY4MTkyNCwgLTIuMzc4OTg4MzQ5NzMwODQsIC0wLjA5MzMxMDQ5MDU2MzE1LCAyLjg0ODY4MTUxMTU2MzI3LCAtMC4wNjI0Nzg4MDE1MzY1MywKKyAgICAgLTIuNjQ1NzcxNzAyMjk4MjUsIDAuMDIxNjM1NDE4ODg3OTgsIDIuMjM2OTc2NTc0NTE3MTMsIC0wLjA1NTg4MzkzMzI5ODU2LCAtMS42NzE0ODE1MzM2NzYwMiwKKyAgICAgMC4wNDc4MTQ3NjY3NDkyMSwgMS4wMDU5NTk1NDgwODU0NywgMC4wMDIyMjMxMjU5Nzc0MywgLTAuNDU5NTM0NTgwNTQ5ODMsIDAuMDMxNzQwOTI1NDAwNDksCisgICAgIDAuMTYzNzgxNjQ4NTg1OTYsIC0wLjAxMzkwNTg5NDIxODk4LCAtMC4wNTAzMjA3NzcxNzEzMSwgMC4wMDY1MTQyMDY2NzgzMSwgMC4wMjM0Nzg5NzQwNzAyMCwKKyAgICAgLTAuMDA4ODEzNjI3MzM4Mzl9LAorICAgIHswLjMwMjk2OTA3MzE5MzI3LCAtMS42MTI3MzE2NTEzNzI0NywgLTAuMjI2MTM5ODg2ODIxMjMsIDEuMDc5Nzc0OTIyNTk5NzAsIC0wLjA4NTg3MzIzNzMwNzcyLAorICAgICAtMC4yNTY1NjI1Nzc1NDA3MCwgMC4wMzI4MjkzMDE3MjY2NCwgLTAuMTYyNzY3MTkxMjA0NDAsIC0wLjAwOTE1NzAyOTMzNDM0LCAtMC4yMjYzODg5Mzc3MzkwNiwKKyAgICAgLTAuMDIzNjQxNDEyMDI1MjIsIDAuMzkxMjA4MDA3ODgyODQsIC0wLjAwNTg0NDU2MDM5OTEzLCAtMC4yMjEzODEzODk1NDkyNSwgMC4wNjI3NjEwMTMyMTc0OSwKKyAgICAgMC4wNDUwMDIzNTM4NzM1MiwgLTAuMDAwMDA4MjgwODY3NDgsIDAuMDIwMDU4NTE4MDY1MDEsIDAuMDAyMDU4NjE4ODU1NjQsIDAuMDAzMDI0MzkwOTU3NDEsCisgICAgIC0wLjAyOTUwMTM0OTgzMjg3fSwKKyAgICB7MC4zMzY0MjMwNDg1NjEzMiwgLTEuNDk4NTg5NzkzNjc3OTksIC0wLjI1NTcyMjQxNDI1NTcwLCAwLjg3MzUwMjcxNDE4MTg4LCAtMC4xMTgyODU3MDE3NzU1NSwKKyAgICAgMC4xMjIwNTAyMjMwODA4NCwgMC4xMTkyMTE0ODY3NTIwMywgLTAuODA3NzQ5NDQ2NzE0MzgsIC0wLjA3ODM0NDg5NjA5NDc5LCAwLjQ3ODU0Nzk0NTYyMzI2LAorICAgICAtMC4wMDQ2OTk3NzkxNDM4MCwgLTAuMTI0NTM0NTgxNDAwMTksIC0wLjAwNTg5NTAwMjI0NDQwLCAtMC4wNDA2NzUxMDE5NzAxNCwgMC4wNTcyNDIyODE0MDM1MSwKKyAgICAgMC4wODMzMzc1NTI4NDEwNywgMC4wMDgzMjA0Mzk4MDc3MywgLTAuMDQyMzczNDgwMjU3NDYsIC0wLjAxNjM1MzgxMzg0NTQwLCAwLjAyOTc3MjA3MzE5OTI1LAorICAgICAtMC4wMTc2MDE3NjU2ODE1MH0sCisgICAgezAuNDQ5MTUyNTY2MDg0NTAsIC0wLjYyODIwNjE5MjMzNjcxLCAtMC4xNDM1MTc1NzQ2NDU0NywgMC4yOTY2MTc4MzcwNjM2NiwgLTAuMjI3ODQzOTQ0Mjk3NDksCisgICAgIC0wLjM3MjU2MzcyOTQyNDAwLCAtMC4wMTQxOTE0MDEwMDU1MSwgMC4wMDIxMzc2Nzg1NzEyNCwgMC4wNDA3ODI2Mjc5NzEzOSwgLTAuNDIwMjk4MjAxNzA5MTgsCisgICAgIC0wLjEyMzk4MTYzMzgxNzQ4LCAwLjIyMTk5NjUwNTY0ODI0LCAwLjA0MDk3NTY1MTM1NjQ4LCAwLjAwNjEzNDI0MzUwNjgyLCAwLjEwNDc4NTAzNjAwMjUxLAorICAgICAwLjA2NzQ3NjIwNzQ0NjgzLCAtMC4wMTg2Mzg4NzgxMDkyNywgMC4wNTc4NDgyMDM3NTgwMSwgLTAuMDMxOTM0Mjg0Mzg5MTUsIDAuMDMyMjI3NTQwNzIxNzMsCisgICAgIDAuMDA1NDE5MDc3NDg3MDd9LAorICAgIHswLjU2NjE5NDcwNzU3NjQxLCAtMS4wNDgwMDMzNTEyNjM0OSwgLTAuNzU0NjQ0NTY5MzkzMDIsIDAuMjkxNTYzMTE5NzEyNDksIDAuMTYyNDIxMzc3NDIyMzAsCisgICAgIC0wLjI2ODA2MDAxMDQyOTQ3LCAwLjE2NzQ0MjQzNDkzNjcyLCAwLjAwODE5OTk5NjQ1ODU4LCAtMC4xODkwMTYwNDE5OTYwOSwgMC40NTA1NDczNDUwNTAwOCwKKyAgICAgMC4zMDkzMTc4Mjg0MTgzMCwgLTAuMzMwMzI0MDMzMTQwMDYsIC0wLjI3NTYyOTYxOTg2MjI0LCAwLjA2NzM5MzY4MzMzMTEwLCAwLjAwNjQ3MzEwNjc3MjQ2LAorICAgICAtMC4wNDc4NDI1NDIyOTAzMywgMC4wODY0NzUwMzc4MDM1MSwgMC4wMTYzOTkwNzgzNjE4OSwgLTAuMDM3ODg5ODQ1NTQ4NDAsIDAuMDE4MDczNjQzMjM1NzMsCisgICAgIC0wLjAwNTg4MjE1NDQzNDIxfSwKKyAgICB7MC41ODEwMDQ5NDk2MDU1MywgLTAuNTEwMzUzMjcwOTUxODQsIC0wLjUzMTc0OTA5MDU4NTc4LCAtMC4zMTg2MzU2MzMyNTI0NSwgLTAuMTQyODk3OTkwMzQyNTMsCisgICAgIC0wLjIwMjU2NDEzNDg0NDc3LCAwLjE3NTIwNzA0ODM1NTIyLCAwLjE0NzI4MTU0MTM0MzMwLCAwLjAyMzc3OTQ1MjE3NjE1LCAwLjM4OTUyNjM5OTc4OTk5LAorICAgICAwLjE1NTU4NDQ5MTM1NTczLCAtMC4yMzMxMzI3MTg4MDg2OCwgLTAuMjUzNDQ3OTAwNTkzNTMsIC0wLjA1MjQ2MDE5MDI0NDYzLCAwLjAxNjI4NDYyNDA2MzMzLAorICAgICAtMC4wMjUwNTk2MTcyNDA1MywgMC4wNjkyMDQ2Nzc2Mzk1OSwgMC4wMjQ0MjM1NzMxNjA5OSwgLTAuMDM3MjE2MTEzOTU4MDEsIDAuMDE4MTg4MDExMTE1MDMsCisgICAgIC0wLjAwNzQ5NjE4Nzk3MTcyfSwKKyAgICB7MC41MzY0ODc4OTI1NTEwNSwgLTAuMjUwNDk4NzE5NTYwMjAsIC0wLjQyMTYzMDM0MzUwNjk2LCAtMC40MzE5Mzk0MjMxMTExNCwgLTAuMDAyNzU5NTM2MTE5MjksCisgICAgIC0wLjAzNDI0NjgxMDE3Njc1LCAwLjA0MjY3ODQyMjE5NDE1LCAtMC4wNDY3ODMyODc4NDI0MiwgLTAuMTAyMTQ4NjQxNzk2NzYsIDAuMjY0MDgzMDAyMDA5NTUsCisgICAgIDAuMTQ1OTA3NzIyODkzODgsIDAuMTUxMTMxMzA1MzMyMTYsIC0wLjAyNDU5ODY0ODU5MzQ1LCAtMC4xNzU1NjQ5MzM2NjQ0OSwgLTAuMTEyMDIzMTUxOTUzODgsCisgICAgIC0wLjE4ODIzMDA5MjYyMTE1LCAtMC4wNDA2MDAzNDEyNzAwMCwgMC4wNTQ3NzcyMDQyODY3NCwgMC4wNDc4ODY2NTU0ODE4MCwgMC4wNDcwNDQwOTY4ODEyMCwKKyAgICAgLTAuMDIyMTc5MzY4MDExMzR9Cit9OworCitzdGF0aWMgY29uc3QgRmxvYXRfdCBBQkJ1dHRlcls5XVsyICogQlVUVEVSX09SREVSICsgMV0gPSB7CisgICAgezAuOTg2MjExOTI0NjI3MDgsIC0xLjk3MjIzMzcyOTE5NTI3LCAtMS45NzI0MjM4NDkyNTQxNiwgMC45NzI2MTM5NjkzMTMwNiwgMC45ODYyMTE5MjQ2MjcwOH0sCisgICAgezAuOTg1MDAxNzU3ODcyNDIsIC0xLjk2OTc3ODU1NTgyNjE4LCAtMS45NzAwMDM1MTU3NDQ4NCwgMC45NzAyMjg0NzU2NjM1MCwgMC45ODUwMDE3NTc4NzI0Mn0sCisgICAgezAuOTc5Mzg5MzI3MzUyMTQsIC0xLjk1ODM1MzgwOTc1Mzk4LCAtMS45NTg3Nzg2NTQ3MDQyOCwgMC45NTkyMDM0OTk2NTQ1OSwgMC45NzkzODkzMjczNTIxNH0sCisgICAgezAuOTc1MzE4NDMyMDQ5MjgsIC0xLjk1MDAyNzU5MTQ5ODc4LCAtMS45NTA2MzY4NjQwOTg1NywgMC45NTEyNDYxMzY2OTgzNSwgMC45NzUzMTg0MzIwNDkyOH0sCisgICAgezAuOTczMTY1MjM0OTgxNjEsIC0xLjk0NTYxMDIzNTY2NTI3LCAtMS45NDYzMzA0Njk5NjMyMywgMC45NDcwNTA3MDQyNjExOCwgMC45NzMxNjUyMzQ5ODE2MX0sCisgICAgezAuOTY0NTQ1MTU1NTI4MjYsIC0xLjkyNzgzMjg2OTc3MDM2LCAtMS45MjkwOTAzMTEwNTY1MiwgMC45MzAzNDc3NTIzNDI2OCwgMC45NjQ1NDUxNTU1MjgyNn0sCisgICAgezAuOTYwMDkxNDI5NTA1NDEsIC0xLjkxODU4OTUzMDMzNzg0LCAtMS45MjAxODI4NTkwMTA4MiwgMC45MjE3NzYxODc2ODM4MSwgMC45NjAwOTE0Mjk1MDU0MX0sCisgICAgezAuOTU4NTY5MTY1OTk2MDEsIC0xLjkxNTQyMTA4MDc0NzgwLCAtMS45MTcxMzgzMzE5OTIwMywgMC45MTg4NTU1ODMyMzYyNSwgMC45NTg1NjkxNjU5OTYwMX0sCisgICAgezAuOTQ1OTc2ODU2MDAyNzksIC0xLjg4OTAzMzA3OTM5NDUyLCAtMS44OTE5NTM3MTIwMDU1OCwgMC44OTQ4NzQzNDQ2MTY2NCwgMC45NDU5NzY4NTYwMDI3OX0KK307CisKKy8qbGludCAtcmVzdG9yZSAqLworCisjaWZkZWYgV0lOMzIKKyNwcmFnbWEgd2FybmluZyAoIGRlZmF1bHQgOiA0MzA1ICkKKyNlbmRpZgorCisvKiBXaGVuIGNhbGxpbmcgdGhpcyBwcm9jZWR1cmUsIG1ha2Ugc3VyZSB0aGF0IGlwWy1vcmRlcl0gYW5kIG9wWy1vcmRlcl0gcG9pbnQgdG8gcmVhbCBkYXRhISAqLworCitzdGF0aWMgdm9pZAorZmlsdGVyWXVsZShjb25zdCBGbG9hdF90ICogaW5wdXQsIEZsb2F0X3QgKiBvdXRwdXQsIHNpemVfdCBuU2FtcGxlcywgY29uc3QgRmxvYXRfdCAqIGNvbnN0IGtlcm5lbCkKK3sKKyAgICAvKnJlZ2lzdGVyIGRvdWJsZSAgeTsgKi8KKworICAgIHdoaWxlIChuU2FtcGxlcy0tKSB7CisgICAgICAgICpvdXRwdXQgPSAxZS0xMCAvKiAxZS0xMCBpcyBhIGhhY2sgdG8gYXZvaWQgc2xvd2Rvd24gYmVjYXVzZSBvZiBkZW5vcm1hbHMgKi8KKyAgICAgICAgICAgICsgaW5wdXRbMF0gKiBrZXJuZWxbMF0KKyAgICAgICAgICAgIC0gb3V0cHV0Wy0xXSAqIGtlcm5lbFsxXQorICAgICAgICAgICAgKyBpbnB1dFstMV0gKiBrZXJuZWxbMl0KKyAgICAgICAgICAgIC0gb3V0cHV0Wy0yXSAqIGtlcm5lbFszXQorICAgICAgICAgICAgKyBpbnB1dFstMl0gKiBrZXJuZWxbNF0KKyAgICAgICAgICAgIC0gb3V0cHV0Wy0zXSAqIGtlcm5lbFs1XQorICAgICAgICAgICAgKyBpbnB1dFstM10gKiBrZXJuZWxbNl0KKyAgICAgICAgICAgIC0gb3V0cHV0Wy00XSAqIGtlcm5lbFs3XQorICAgICAgICAgICAgKyBpbnB1dFstNF0gKiBrZXJuZWxbOF0KKyAgICAgICAgICAgIC0gb3V0cHV0Wy01XSAqIGtlcm5lbFs5XQorICAgICAgICAgICAgKyBpbnB1dFstNV0gKiBrZXJuZWxbMTBdCisgICAgICAgICAgICAtIG91dHB1dFstNl0gKiBrZXJuZWxbMTFdCisgICAgICAgICAgICArIGlucHV0Wy02XSAqIGtlcm5lbFsxMl0KKyAgICAgICAgICAgIC0gb3V0cHV0Wy03XSAqIGtlcm5lbFsxM10KKyAgICAgICAgICAgICsgaW5wdXRbLTddICoga2VybmVsWzE0XQorICAgICAgICAgICAgLSBvdXRwdXRbLThdICoga2VybmVsWzE1XQorICAgICAgICAgICAgKyBpbnB1dFstOF0gKiBrZXJuZWxbMTZdCisgICAgICAgICAgICAtIG91dHB1dFstOV0gKiBrZXJuZWxbMTddCisgICAgICAgICAgICArIGlucHV0Wy05XSAqIGtlcm5lbFsxOF0KKyAgICAgICAgICAgIC0gb3V0cHV0Wy0xMF0gKiBrZXJuZWxbMTldCisgICAgICAgICAgICArIGlucHV0Wy0xMF0gKiBrZXJuZWxbMjBdOworICAgICAgICArK291dHB1dDsKKyAgICAgICAgKytpbnB1dDsKKyAgICAgICAgLyogKm91dHB1dCsrID0gKEZsb2F0X3QpeTsgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWx0ZXJCdXR0ZXIoY29uc3QgRmxvYXRfdCAqIGlucHV0LCBGbG9hdF90ICogb3V0cHV0LCBzaXplX3QgblNhbXBsZXMsIGNvbnN0IEZsb2F0X3QgKiBjb25zdCBrZXJuZWwpCit7ICAgICAgICAgICAgICAgICAgICAgICAvKnJlZ2lzdGVyIGRvdWJsZSAgeTsgKi8KKworICAgIHdoaWxlIChuU2FtcGxlcy0tKSB7CisgICAgICAgICpvdXRwdXQgPSBpbnB1dFswXSAqIGtlcm5lbFswXQorICAgICAgICAgICAgLSBvdXRwdXRbLTFdICoga2VybmVsWzFdCisgICAgICAgICAgICArIGlucHV0Wy0xXSAqIGtlcm5lbFsyXQorICAgICAgICAgICAgLSBvdXRwdXRbLTJdICoga2VybmVsWzNdCisgICAgICAgICAgICArIGlucHV0Wy0yXSAqIGtlcm5lbFs0XTsKKyAgICAgICAgKytvdXRwdXQ7CisgICAgICAgICsraW5wdXQ7CisgICAgICAgIC8qICpvdXRwdXQrKyA9IChGbG9hdF90KXk7ICovCisgICAgfQorfQorCisKKy8qIHJldHVybnMgYSBJTklUX0dBSU5fQU5BTFlTSVNfT0sgaWYgc3VjY2Vzc2Z1bCwgSU5JVF9HQUlOX0FOQUxZU0lTX0VSUk9SIGlmIG5vdCAqLworCitpbnQKK1Jlc2V0U2FtcGxlRnJlcXVlbmN5KHJlcGxheWdhaW5fdCAqIHJnRGF0YSwgbG9uZyBzYW1wbGVmcmVxKQoreworICAgIGludCAgICAgaTsKKworICAgIC8qIHplcm8gb3V0IGluaXRpYWwgdmFsdWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9PUkRFUjsgaSsrKQorICAgICAgICByZ0RhdGEtPmxpbnByZWJ1ZltpXSA9IHJnRGF0YS0+bHN0ZXBidWZbaV0KKyAgICAgICAgICAgID0gcmdEYXRhLT5sb3V0YnVmW2ldCisgICAgICAgICAgICA9IHJnRGF0YS0+cmlucHJlYnVmW2ldCisgICAgICAgICAgICA9IHJnRGF0YS0+cnN0ZXBidWZbaV0KKyAgICAgICAgICAgID0gcmdEYXRhLT5yb3V0YnVmW2ldID0gMC47CisKKyAgICBzd2l0Y2ggKChpbnQpIChzYW1wbGVmcmVxKSkgeworICAgIGNhc2UgNDgwMDA6CisgICAgICAgIHJnRGF0YS0+ZnJlcWluZGV4ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgICAgcmdEYXRhLT5mcmVxaW5kZXggPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgICByZ0RhdGEtPmZyZXFpbmRleCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQwMDA6CisgICAgICAgIHJnRGF0YS0+ZnJlcWluZGV4ID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgICAgcmdEYXRhLT5mcmVxaW5kZXggPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgICByZ0RhdGEtPmZyZXFpbmRleCA9IDU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTIwMDA6CisgICAgICAgIHJnRGF0YS0+ZnJlcWluZGV4ID0gNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgICAgcmdEYXRhLT5mcmVxaW5kZXggPSA3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDgwMDA6CisgICAgICAgIHJnRGF0YS0+ZnJlcWluZGV4ID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIElOSVRfR0FJTl9BTkFMWVNJU19FUlJPUjsKKyAgICB9CisKKyAgICByZ0RhdGEtPnNhbXBsZVdpbmRvdyA9CisgICAgICAgIChzYW1wbGVmcmVxICogUk1TX1dJTkRPV19USU1FX05VTUVSQVRPUiArIFJNU19XSU5ET1dfVElNRV9ERU5PTUlOQVRPUiAtCisgICAgICAgICAxKSAvIFJNU19XSU5ET1dfVElNRV9ERU5PTUlOQVRPUjsKKworICAgIHJnRGF0YS0+bHN1bSA9IDAuOworICAgIHJnRGF0YS0+cnN1bSA9IDAuOworICAgIHJnRGF0YS0+dG90c2FtcCA9IDA7CisKKyAgICBtZW1zZXQocmdEYXRhLT5BLCAwLCBzaXplb2YocmdEYXRhLT5BKSk7CisKKyAgICByZXR1cm4gSU5JVF9HQUlOX0FOQUxZU0lTX09LOworfQorCitpbnQKK0luaXRHYWluQW5hbHlzaXMocmVwbGF5Z2Fpbl90ICogcmdEYXRhLCBsb25nIHNhbXBsZWZyZXEpCit7CisgICAgaWYgKFJlc2V0U2FtcGxlRnJlcXVlbmN5KHJnRGF0YSwgc2FtcGxlZnJlcSkgIT0gSU5JVF9HQUlOX0FOQUxZU0lTX09LKSB7CisgICAgICAgIHJldHVybiBJTklUX0dBSU5fQU5BTFlTSVNfRVJST1I7CisgICAgfQorCisgICAgcmdEYXRhLT5saW5wcmUgPSByZ0RhdGEtPmxpbnByZWJ1ZiArIE1BWF9PUkRFUjsKKyAgICByZ0RhdGEtPnJpbnByZSA9IHJnRGF0YS0+cmlucHJlYnVmICsgTUFYX09SREVSOworICAgIHJnRGF0YS0+bHN0ZXAgPSByZ0RhdGEtPmxzdGVwYnVmICsgTUFYX09SREVSOworICAgIHJnRGF0YS0+cnN0ZXAgPSByZ0RhdGEtPnJzdGVwYnVmICsgTUFYX09SREVSOworICAgIHJnRGF0YS0+bG91dCA9IHJnRGF0YS0+bG91dGJ1ZiArIE1BWF9PUkRFUjsKKyAgICByZ0RhdGEtPnJvdXQgPSByZ0RhdGEtPnJvdXRidWYgKyBNQVhfT1JERVI7CisKKyAgICBtZW1zZXQocmdEYXRhLT5CLCAwLCBzaXplb2YocmdEYXRhLT5CKSk7CisKKyAgICByZXR1cm4gSU5JVF9HQUlOX0FOQUxZU0lTX09LOworfQorCisvKiByZXR1cm5zIEdBSU5fQU5BTFlTSVNfT0sgaWYgc3VjY2Vzc2Z1bCwgR0FJTl9BTkFMWVNJU19FUlJPUiBpZiBub3QgKi8KKworc3RhdGljIGlubGluZSBkb3VibGUKK2ZzcXIoY29uc3QgZG91YmxlIGQpCit7CisgICAgcmV0dXJuIGQgKiBkOworfQorCitpbnQKK0FuYWx5emVTYW1wbGVzKHJlcGxheWdhaW5fdCAqIHJnRGF0YSwgY29uc3QgRmxvYXRfdCAqIGxlZnRfc2FtcGxlcywgY29uc3QgRmxvYXRfdCAqIHJpZ2h0X3NhbXBsZXMsCisgICAgICAgICAgICAgICBzaXplX3QgbnVtX3NhbXBsZXMsIGludCBudW1fY2hhbm5lbHMpCit7CisgICAgY29uc3QgRmxvYXRfdCAqY3VybGVmdDsKKyAgICBjb25zdCBGbG9hdF90ICpjdXJyaWdodDsKKyAgICBsb25nICAgIGJhdGNoc2FtcGxlczsKKyAgICBsb25nICAgIGN1cnNhbXBsZXM7CisgICAgbG9uZyAgICBjdXJzYW1wbGVwb3M7CisgICAgaW50ICAgICBpOworCisgICAgaWYgKG51bV9zYW1wbGVzID09IDApCisgICAgICAgIHJldHVybiBHQUlOX0FOQUxZU0lTX09LOworCisgICAgY3Vyc2FtcGxlcG9zID0gMDsKKyAgICBiYXRjaHNhbXBsZXMgPSAobG9uZykgbnVtX3NhbXBsZXM7CisKKyAgICBzd2l0Y2ggKG51bV9jaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgcmlnaHRfc2FtcGxlcyA9IGxlZnRfc2FtcGxlczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gR0FJTl9BTkFMWVNJU19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobnVtX3NhbXBsZXMgPCBNQVhfT1JERVIpIHsKKyAgICAgICAgbWVtY3B5KHJnRGF0YS0+bGlucHJlYnVmICsgTUFYX09SREVSLCBsZWZ0X3NhbXBsZXMsIG51bV9zYW1wbGVzICogc2l6ZW9mKEZsb2F0X3QpKTsKKyAgICAgICAgbWVtY3B5KHJnRGF0YS0+cmlucHJlYnVmICsgTUFYX09SREVSLCByaWdodF9zYW1wbGVzLCBudW1fc2FtcGxlcyAqIHNpemVvZihGbG9hdF90KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtZW1jcHkocmdEYXRhLT5saW5wcmVidWYgKyBNQVhfT1JERVIsIGxlZnRfc2FtcGxlcywgTUFYX09SREVSICogc2l6ZW9mKEZsb2F0X3QpKTsKKyAgICAgICAgbWVtY3B5KHJnRGF0YS0+cmlucHJlYnVmICsgTUFYX09SREVSLCByaWdodF9zYW1wbGVzLCBNQVhfT1JERVIgKiBzaXplb2YoRmxvYXRfdCkpOworICAgIH0KKworICAgIHdoaWxlIChiYXRjaHNhbXBsZXMgPiAwKSB7CisgICAgICAgIGN1cnNhbXBsZXMgPSBiYXRjaHNhbXBsZXMgPiByZ0RhdGEtPnNhbXBsZVdpbmRvdyAtIHJnRGF0YS0+dG90c2FtcCA/CisgICAgICAgICAgICByZ0RhdGEtPnNhbXBsZVdpbmRvdyAtIHJnRGF0YS0+dG90c2FtcCA6IGJhdGNoc2FtcGxlczsKKyAgICAgICAgaWYgKGN1cnNhbXBsZXBvcyA8IE1BWF9PUkRFUikgeworICAgICAgICAgICAgY3VybGVmdCA9IHJnRGF0YS0+bGlucHJlICsgY3Vyc2FtcGxlcG9zOworICAgICAgICAgICAgY3VycmlnaHQgPSByZ0RhdGEtPnJpbnByZSArIGN1cnNhbXBsZXBvczsKKyAgICAgICAgICAgIGlmIChjdXJzYW1wbGVzID4gTUFYX09SREVSIC0gY3Vyc2FtcGxlcG9zKQorICAgICAgICAgICAgICAgIGN1cnNhbXBsZXMgPSBNQVhfT1JERVIgLSBjdXJzYW1wbGVwb3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdXJsZWZ0ID0gbGVmdF9zYW1wbGVzICsgY3Vyc2FtcGxlcG9zOworICAgICAgICAgICAgY3VycmlnaHQgPSByaWdodF9zYW1wbGVzICsgY3Vyc2FtcGxlcG9zOworICAgICAgICB9CisKKyAgICAgICAgWVVMRV9GSUxURVIoY3VybGVmdCwgcmdEYXRhLT5sc3RlcCArIHJnRGF0YS0+dG90c2FtcCwgY3Vyc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgQUJZdWxlW3JnRGF0YS0+ZnJlcWluZGV4XSk7CisgICAgICAgIFlVTEVfRklMVEVSKGN1cnJpZ2h0LCByZ0RhdGEtPnJzdGVwICsgcmdEYXRhLT50b3RzYW1wLCBjdXJzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICBBQll1bGVbcmdEYXRhLT5mcmVxaW5kZXhdKTsKKworICAgICAgICBCVVRURVJfRklMVEVSKHJnRGF0YS0+bHN0ZXAgKyByZ0RhdGEtPnRvdHNhbXAsIHJnRGF0YS0+bG91dCArIHJnRGF0YS0+dG90c2FtcCwgY3Vyc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICBBQkJ1dHRlcltyZ0RhdGEtPmZyZXFpbmRleF0pOworICAgICAgICBCVVRURVJfRklMVEVSKHJnRGF0YS0+cnN0ZXAgKyByZ0RhdGEtPnRvdHNhbXAsIHJnRGF0YS0+cm91dCArIHJnRGF0YS0+dG90c2FtcCwgY3Vyc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICBBQkJ1dHRlcltyZ0RhdGEtPmZyZXFpbmRleF0pOworCisgICAgICAgIGN1cmxlZnQgPSByZ0RhdGEtPmxvdXQgKyByZ0RhdGEtPnRvdHNhbXA7IC8qIEdldCB0aGUgc3F1YXJlZCB2YWx1ZXMgKi8KKyAgICAgICAgY3VycmlnaHQgPSByZ0RhdGEtPnJvdXQgKyByZ0RhdGEtPnRvdHNhbXA7CisKKyAgICAgICAgaSA9IGN1cnNhbXBsZXMgJSA4OworICAgICAgICB3aGlsZSAoaS0tKSB7CisgICAgICAgICAgICByZ0RhdGEtPmxzdW0gKz0gZnNxcigqY3VybGVmdCsrKTsKKyAgICAgICAgICAgIHJnRGF0YS0+cnN1bSArPSBmc3FyKCpjdXJyaWdodCsrKTsKKyAgICAgICAgfQorICAgICAgICBpID0gY3Vyc2FtcGxlcyAvIDg7CisgICAgICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgICAgIHJnRGF0YS0+bHN1bSArPSBmc3FyKGN1cmxlZnRbMF0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cmxlZnRbMV0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cmxlZnRbMl0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cmxlZnRbM10pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cmxlZnRbNF0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cmxlZnRbNV0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cmxlZnRbNl0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cmxlZnRbN10pOworICAgICAgICAgICAgY3VybGVmdCArPSA4OworICAgICAgICAgICAgcmdEYXRhLT5yc3VtICs9IGZzcXIoY3VycmlnaHRbMF0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cnJpZ2h0WzFdKQorICAgICAgICAgICAgICAgICsgZnNxcihjdXJyaWdodFsyXSkKKyAgICAgICAgICAgICAgICArIGZzcXIoY3VycmlnaHRbM10pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cnJpZ2h0WzRdKQorICAgICAgICAgICAgICAgICsgZnNxcihjdXJyaWdodFs1XSkKKyAgICAgICAgICAgICAgICArIGZzcXIoY3VycmlnaHRbNl0pCisgICAgICAgICAgICAgICAgKyBmc3FyKGN1cnJpZ2h0WzddKTsKKyAgICAgICAgICAgIGN1cnJpZ2h0ICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBiYXRjaHNhbXBsZXMgLT0gY3Vyc2FtcGxlczsKKyAgICAgICAgY3Vyc2FtcGxlcG9zICs9IGN1cnNhbXBsZXM7CisgICAgICAgIHJnRGF0YS0+dG90c2FtcCArPSBjdXJzYW1wbGVzOworICAgICAgICBpZiAocmdEYXRhLT50b3RzYW1wID09IHJnRGF0YS0+c2FtcGxlV2luZG93KSB7IC8qIEdldCB0aGUgUm9vdCBNZWFuIFNxdWFyZSAoUk1TKSBmb3IgdGhpcyBzZXQgb2Ygc2FtcGxlcyAqLworICAgICAgICAgICAgZG91YmxlIGNvbnN0IHZhbCA9CisgICAgICAgICAgICAgICAgU1RFUFNfcGVyX2RCICogMTAuICogbG9nMTAoKHJnRGF0YS0+bHN1bSArIHJnRGF0YS0+cnN1bSkgLyByZ0RhdGEtPnRvdHNhbXAgKiAwLjUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuZS0zNyk7CisgICAgICAgICAgICBzaXplX3QgIGl2YWwgPSAodmFsIDw9IDApID8gMCA6IChzaXplX3QpIHZhbDsKKyAgICAgICAgICAgIGlmIChpdmFsID49IHNpemVvZihyZ0RhdGEtPkEpIC8gc2l6ZW9mKCoocmdEYXRhLT5BKSkpCisgICAgICAgICAgICAgICAgaXZhbCA9IHNpemVvZihyZ0RhdGEtPkEpIC8gc2l6ZW9mKCoocmdEYXRhLT5BKSkgLSAxOworICAgICAgICAgICAgcmdEYXRhLT5BW2l2YWxdKys7CisgICAgICAgICAgICByZ0RhdGEtPmxzdW0gPSByZ0RhdGEtPnJzdW0gPSAwLjsKKyAgICAgICAgICAgIG1lbW1vdmUocmdEYXRhLT5sb3V0YnVmLCByZ0RhdGEtPmxvdXRidWYgKyByZ0RhdGEtPnRvdHNhbXAsCisgICAgICAgICAgICAgICAgICAgIE1BWF9PUkRFUiAqIHNpemVvZihGbG9hdF90KSk7CisgICAgICAgICAgICBtZW1tb3ZlKHJnRGF0YS0+cm91dGJ1ZiwgcmdEYXRhLT5yb3V0YnVmICsgcmdEYXRhLT50b3RzYW1wLAorICAgICAgICAgICAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YoRmxvYXRfdCkpOworICAgICAgICAgICAgbWVtbW92ZShyZ0RhdGEtPmxzdGVwYnVmLCByZ0RhdGEtPmxzdGVwYnVmICsgcmdEYXRhLT50b3RzYW1wLAorICAgICAgICAgICAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YoRmxvYXRfdCkpOworICAgICAgICAgICAgbWVtbW92ZShyZ0RhdGEtPnJzdGVwYnVmLCByZ0RhdGEtPnJzdGVwYnVmICsgcmdEYXRhLT50b3RzYW1wLAorICAgICAgICAgICAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YoRmxvYXRfdCkpOworICAgICAgICAgICAgcmdEYXRhLT50b3RzYW1wID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmdEYXRhLT50b3RzYW1wID4gcmdEYXRhLT5zYW1wbGVXaW5kb3cpIC8qIHNvbWVob3cgSSByZWFsbHkgc2NyZXdlZCB1cDogRXJyb3IgaW4gcHJvZ3JhbW1pbmchIENvbnRhY3QgYXV0aG9yIGFib3V0IHRvdHNhbXAgPiBzYW1wbGVXaW5kb3cgKi8KKyAgICAgICAgICAgIHJldHVybiBHQUlOX0FOQUxZU0lTX0VSUk9SOworICAgIH0KKyAgICBpZiAobnVtX3NhbXBsZXMgPCBNQVhfT1JERVIpIHsKKyAgICAgICAgbWVtbW92ZShyZ0RhdGEtPmxpbnByZWJ1ZiwgcmdEYXRhLT5saW5wcmVidWYgKyBudW1fc2FtcGxlcywKKyAgICAgICAgICAgICAgICAoTUFYX09SREVSIC0gbnVtX3NhbXBsZXMpICogc2l6ZW9mKEZsb2F0X3QpKTsKKyAgICAgICAgbWVtbW92ZShyZ0RhdGEtPnJpbnByZWJ1ZiwgcmdEYXRhLT5yaW5wcmVidWYgKyBudW1fc2FtcGxlcywKKyAgICAgICAgICAgICAgICAoTUFYX09SREVSIC0gbnVtX3NhbXBsZXMpICogc2l6ZW9mKEZsb2F0X3QpKTsKKyAgICAgICAgbWVtY3B5KHJnRGF0YS0+bGlucHJlYnVmICsgTUFYX09SREVSIC0gbnVtX3NhbXBsZXMsIGxlZnRfc2FtcGxlcywKKyAgICAgICAgICAgICAgIG51bV9zYW1wbGVzICogc2l6ZW9mKEZsb2F0X3QpKTsKKyAgICAgICAgbWVtY3B5KHJnRGF0YS0+cmlucHJlYnVmICsgTUFYX09SREVSIC0gbnVtX3NhbXBsZXMsIHJpZ2h0X3NhbXBsZXMsCisgICAgICAgICAgICAgICBudW1fc2FtcGxlcyAqIHNpemVvZihGbG9hdF90KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtZW1jcHkocmdEYXRhLT5saW5wcmVidWYsIGxlZnRfc2FtcGxlcyArIG51bV9zYW1wbGVzIC0gTUFYX09SREVSLAorICAgICAgICAgICAgICAgTUFYX09SREVSICogc2l6ZW9mKEZsb2F0X3QpKTsKKyAgICAgICAgbWVtY3B5KHJnRGF0YS0+cmlucHJlYnVmLCByaWdodF9zYW1wbGVzICsgbnVtX3NhbXBsZXMgLSBNQVhfT1JERVIsCisgICAgICAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YoRmxvYXRfdCkpOworICAgIH0KKworICAgIHJldHVybiBHQUlOX0FOQUxZU0lTX09LOworfQorCisKK3N0YXRpYyAgRmxvYXRfdAorYW5hbHl6ZVJlc3VsdCh1aW50MzJfdCBjb25zdCAqQXJyYXksIHNpemVfdCBsZW4pCit7CisgICAgdWludDMyX3QgZWxlbXM7CisgICAgaW50MzJfdCB1cHBlcjsKKyAgICBzaXplX3QgIGk7CisKKyAgICBlbGVtcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBlbGVtcyArPSBBcnJheVtpXTsKKyAgICBpZiAoZWxlbXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIEdBSU5fTk9UX0VOT1VHSF9TQU1QTEVTOworCisgICAgdXBwZXIgPSAoaW50MzJfdCkgY2VpbChlbGVtcyAqICgxLiAtIFJNU19QRVJDRU5USUxFKSk7CisgICAgZm9yIChpID0gbGVuOyBpLS0gPiAwOykgeworICAgICAgICBpZiAoKHVwcGVyIC09IEFycmF5W2ldKSA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIChGbG9hdF90KSAoKEZsb2F0X3QpIFBJTktfUkVGIC0gKEZsb2F0X3QpIGkgLyAoRmxvYXRfdCkgU1RFUFNfcGVyX2RCKTsKK30KKworCitGbG9hdF90CitHZXRUaXRsZUdhaW4ocmVwbGF5Z2Fpbl90ICogcmdEYXRhKQoreworICAgIEZsb2F0X3QgcmV0dmFsOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgcmV0dmFsID0gYW5hbHl6ZVJlc3VsdChyZ0RhdGEtPkEsIHNpemVvZihyZ0RhdGEtPkEpIC8gc2l6ZW9mKCoocmdEYXRhLT5BKSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihyZ0RhdGEtPkEpIC8gc2l6ZW9mKCoocmdEYXRhLT5BKSk7IGkrKykgeworICAgICAgICByZ0RhdGEtPkJbaV0gKz0gcmdEYXRhLT5BW2ldOworICAgICAgICByZ0RhdGEtPkFbaV0gPSAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfT1JERVI7IGkrKykKKyAgICAgICAgcmdEYXRhLT5saW5wcmVidWZbaV0gPSByZ0RhdGEtPmxzdGVwYnVmW2ldCisgICAgICAgICAgICA9IHJnRGF0YS0+bG91dGJ1ZltpXQorICAgICAgICAgICAgPSByZ0RhdGEtPnJpbnByZWJ1ZltpXQorICAgICAgICAgICAgPSByZ0RhdGEtPnJzdGVwYnVmW2ldCisgICAgICAgICAgICA9IHJnRGF0YS0+cm91dGJ1ZltpXSA9IDAuZjsKKworICAgIHJnRGF0YS0+dG90c2FtcCA9IDA7CisgICAgcmdEYXRhLT5sc3VtID0gcmdEYXRhLT5yc3VtID0gMC47CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCitGbG9hdF90CitHZXRBbGJ1bUdhaW4ocmVwbGF5Z2Fpbl90ICogcmdEYXRhKQoreworICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJnRGF0YS0+Qiwgc2l6ZW9mKHJnRGF0YS0+QikgLyBzaXplb2YoKihyZ0RhdGEtPkIpKSk7Cit9CisKKy8qIGVuZCBvZiBnYWluX2FuYWx5c2lzLmMgKi8KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvZ2Fpbl9hbmFseXNpcy5oIGIvbGlibXAzbGFtZS9nYWluX2FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiYzRjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvZ2Fpbl9hbmFseXNpcy5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIFJlcGxheUdhaW5BbmFseXNpcyAtIGFuYWx5emVzIGlucHV0IHNhbXBsZXMgYW5kIGdpdmUgdGhlIHJlY29tbWVuZGVkIGRCIGNoYW5nZQorICogIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBSb2JpbnNvbiBhbmQgR2xlbiBTYXd5ZXIKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBjb25jZXB0IGFuZCBmaWx0ZXIgdmFsdWVzIGJ5IERhdmlkIFJvYmluc29uIChEYXZpZEBSb2JpbnNvbi5vcmcpCisgKiAgICAtLSBibGFtZSBoaW0gaWYgeW91IHRoaW5rIHRoZSBpZGVhIGlzIGZsYXdlZAorICogIGNvZGluZyBieSBHbGVuIFNhd3llciAobXAzZ2FpbkBob3RtYWlsLmNvbSkgNzM1IFcgMjU1IE4sIE9yZW0sIFVUIDg0MDU3LTQ1MDUgVVNBCisgKiAgICAtLSBibGFtZSBoaW0gaWYgeW91IHRoaW5rIHRoaXMgcnVucyB0b28gc2xvd2x5LCBvciB0aGUgY29kaW5nIGlzIG90aGVyd2lzZSBmbGF3ZWQKKyAqCisgKiAgRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBjb25jZXB0cyBhbmQgdGhlIGJhc2ljIGFsZ29yaXRobXMgaW52b2x2ZWQsIGdvIHRvOgorICogICAgaHR0cDovL3d3dy5yZXBsYXlnYWluLm9yZy8KKyAqLworCisjaWZuZGVmIEdBSU5fQU5BTFlTSVNfSAorI2RlZmluZSBHQUlOX0FOQUxZU0lTX0gKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TVERJTlRfSAorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gICJDIiB7CisjZW5kaWYKKworCisgICAgdHlwZWRlZiBzYW1wbGVfdCBGbG9hdF90OyAvKiBUeXBlIHVzZWQgZm9yIGZpbHRlcmluZyAqLworCisKKyNkZWZpbmUgUElOS19SRUYgICAgICAgICAgICAgICAgNjQuODIgICAgICAgLyogMjk4NjQwODgzNzk1ICovIC8qIGNhbGlicmF0aW9uIHZhbHVlIGZvciA4OWRCICovCisKKworI2RlZmluZSBZVUxFX09SREVSICAgICAgICAgMTAKKyNkZWZpbmUgQlVUVEVSX09SREVSICAgICAgICAyCisjZGVmaW5lIFlVTEVfRklMVEVSICAgICBmaWx0ZXJZdWxlCisjZGVmaW5lIEJVVFRFUl9GSUxURVIgICBmaWx0ZXJCdXR0ZXIKKyNkZWZpbmUgUk1TX1BFUkNFTlRJTEUgICAgICAwLjk1IC8qIHBlcmNlbnRpbGUgd2hpY2ggaXMgbG91ZGVyIHRoYW4gdGhlIHByb3Bvc2VkIGxldmVsICovCisjZGVmaW5lIE1BWF9TQU1QX0ZSRVEgICA0ODAwMEwgLyogbWF4aW11bSBhbGxvd2VkIHNhbXBsZSBmcmVxdWVuY3kgW0h6XSAqLworI2RlZmluZSBSTVNfV0lORE9XX1RJTUVfTlVNRVJBVE9SICAgIDFMCisjZGVmaW5lIFJNU19XSU5ET1dfVElNRV9ERU5PTUlOQVRPUiAyMEwgLyogbnVtZXJhdG9yIC8gZGVub21pbmF0b3IgPSB0aW1lIHNsaWNlIHNpemUgW3NdICovCisjZGVmaW5lIFNURVBTX3Blcl9kQiAgICAgIDEwMC4gLyogVGFibGUgZW50cmllcyBwZXIgZEIgKi8KKyNkZWZpbmUgTUFYX2RCICAgICAgICAgICAgMTIwLiAvKiBUYWJsZSBlbnRyaWVzIGZvciAwLi4uTUFYX2RCIChub3JtYWwgbWF4LiB2YWx1ZXMgYXJlIDcwLi4uODAgZEIpICovCisKKyAgICBlbnVtIHsgR0FJTl9OT1RfRU5PVUdIX1NBTVBMRVMgPSAtMjQ2MDEsIEdBSU5fQU5BTFlTSVNfRVJST1IgPSAwLCBHQUlOX0FOQUxZU0lTX09LID0KKyAgICAgICAgICAgIDEsIElOSVRfR0FJTl9BTkFMWVNJU19FUlJPUiA9IDAsIElOSVRfR0FJTl9BTkFMWVNJU19PSyA9IDEKKyAgICB9OworCisgICAgZW51bSB7IE1BWF9PUkRFUiA9IChCVVRURVJfT1JERVIgPiBZVUxFX09SREVSID8gQlVUVEVSX09SREVSIDogWVVMRV9PUkRFUikKKyAgICAgICAgICAgICwgTUFYX1NBTVBMRVNfUEVSX1dJTkRPVyA9ICgoTUFYX1NBTVBfRlJFUSAqIFJNU19XSU5ET1dfVElNRV9OVU1FUkFUT1IpIC8gUk1TX1dJTkRPV19USU1FX0RFTk9NSU5BVE9SICsgMSkgLyogbWF4LiBTYW1wbGVzIHBlciBUaW1lIHNsaWNlICovCisgICAgfTsKKworICAgIHN0cnVjdCByZXBsYXlnYWluX2RhdGEgeworICAgICAgICBGbG9hdF90IGxpbnByZWJ1ZltNQVhfT1JERVIgKiAyXTsKKyAgICAgICAgRmxvYXRfdCAqbGlucHJlOyAgICAgLyogbGVmdCBpbnB1dCBzYW1wbGVzLCB3aXRoIHByZS1idWZmZXIgKi8KKyAgICAgICAgRmxvYXRfdCBsc3RlcGJ1ZltNQVhfU0FNUExFU19QRVJfV0lORE9XICsgTUFYX09SREVSXTsKKyAgICAgICAgRmxvYXRfdCAqbHN0ZXA7ICAgICAgLyogbGVmdCAiZmlyc3Qgc3RlcCIgKGkuZS4gcG9zdCBmaXJzdCBmaWx0ZXIpIHNhbXBsZXMgKi8KKyAgICAgICAgRmxvYXRfdCBsb3V0YnVmW01BWF9TQU1QTEVTX1BFUl9XSU5ET1cgKyBNQVhfT1JERVJdOworICAgICAgICBGbG9hdF90ICpsb3V0OyAgICAgICAvKiBsZWZ0ICJvdXQiIChpLmUuIHBvc3Qgc2Vjb25kIGZpbHRlcikgc2FtcGxlcyAqLworICAgICAgICBGbG9hdF90IHJpbnByZWJ1ZltNQVhfT1JERVIgKiAyXTsKKyAgICAgICAgRmxvYXRfdCAqcmlucHJlOyAgICAgLyogcmlnaHQgaW5wdXQgc2FtcGxlcyAuLi4gKi8KKyAgICAgICAgRmxvYXRfdCByc3RlcGJ1ZltNQVhfU0FNUExFU19QRVJfV0lORE9XICsgTUFYX09SREVSXTsKKyAgICAgICAgRmxvYXRfdCAqcnN0ZXA7CisgICAgICAgIEZsb2F0X3Qgcm91dGJ1ZltNQVhfU0FNUExFU19QRVJfV0lORE9XICsgTUFYX09SREVSXTsKKyAgICAgICAgRmxvYXRfdCAqcm91dDsKKyAgICAgICAgbG9uZyAgICBzYW1wbGVXaW5kb3c7IC8qIG51bWJlciBvZiBzYW1wbGVzIHJlcXVpcmVkIHRvIHJlYWNoIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcmVxdWlyZWQgZm9yIFJNUyB3aW5kb3cgKi8KKyAgICAgICAgbG9uZyAgICB0b3RzYW1wOworICAgICAgICBkb3VibGUgIGxzdW07CisgICAgICAgIGRvdWJsZSAgcnN1bTsKKyAgICAgICAgaW50ICAgICBmcmVxaW5kZXg7CisgICAgICAgIGludCAgICAgZmlyc3Q7CisgICAgICAgIHVpbnQzMl90IEFbKHNpemVfdCkgKFNURVBTX3Blcl9kQiAqIE1BWF9kQildOworICAgICAgICB1aW50MzJfdCBCWyhzaXplX3QpIChTVEVQU19wZXJfZEIgKiBNQVhfZEIpXTsKKworICAgIH07CisjaWZuZGVmIHJlcGxheWdhaW5fZGF0YV9kZWZpbmVkCisjZGVmaW5lIHJlcGxheWdhaW5fZGF0YV9kZWZpbmVkCisgICAgdHlwZWRlZiBzdHJ1Y3QgcmVwbGF5Z2Fpbl9kYXRhIHJlcGxheWdhaW5fdDsKKyNlbmRpZgorCisKKworCisgICAgaW50ICAgICBJbml0R2FpbkFuYWx5c2lzKHJlcGxheWdhaW5fdCAqIHJnRGF0YSwgbG9uZyBzYW1wbGVmcmVxKTsKKyAgICBpbnQgICAgIEFuYWx5emVTYW1wbGVzKHJlcGxheWdhaW5fdCAqIHJnRGF0YSwgY29uc3QgRmxvYXRfdCAqIGxlZnRfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0X3QgKiByaWdodF9zYW1wbGVzLCBzaXplX3QgbnVtX3NhbXBsZXMsIGludCBudW1fY2hhbm5lbHMpOworICAgIGludCAgICAgUmVzZXRTYW1wbGVGcmVxdWVuY3kocmVwbGF5Z2Fpbl90ICogcmdEYXRhLCBsb25nIHNhbXBsZWZyZXEpOworICAgIEZsb2F0X3QgR2V0VGl0bGVHYWluKHJlcGxheWdhaW5fdCAqIHJnRGF0YSk7CisgICAgRmxvYXRfdCBHZXRBbGJ1bUdhaW4ocmVwbGF5Z2Fpbl90ICogcmdEYXRhKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAvKiBHQUlOX0FOQUxZU0lTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvaTM4Ni9NYWtlZmlsZS5hbSBiL2xpYm1wM2xhbWUvaTM4Ni9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc0ZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9pMzg2L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzIgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjIyLjguMiAyMDEwLzAyLzI2IDAwOjU1OjMxIHJvYmVydCBFeHAgJAorCitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCisKK0RFRlMgPSBAREVGU0AgQENPTkZJR19ERUZTQAorCitFQ0hPID89IGVjaG8KKworbmFzbV9zb3VyY2VzID0gXAorCWNob29zZV90YWJsZS5uYXMgXAorCWNwdV9mZWF0Lm5hcyBcCisJZmZ0M2RuLm5hcyBcCisJZmZ0c3NlLm5hcworCitpZiBIQVZFX05BU00KK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmxhbWVhc21yb3V0aW5lcy5sYQorbGlibGFtZWFzbXJvdXRpbmVzX2xhX1NPVVJDRVMgPSAkKG5hc21fc291cmNlcykKK2FtX2xpYmxhbWVhc21yb3V0aW5lc19sYV9PQkpFQ1RTID0gXAorCWNob29zZV90YWJsZSRVLmxvIFwKKwljcHVfZmVhdCRVLmxvIFwKKwlmZnQzZG4kVS5sbyBcCisJZmZ0c3NlJFUubG8KK2VuZGlmCisKK25vaW5zdF9IRUFERVJTID0gbmFzbS5oCisKK0lOQ0xVREVTID0gQElOQ0xVREVTQCAtSSQodG9wX3NyY2RpcikvbGlibXAzbGFtZS9AQ1BVVFlQRUAKKworU1VGRklYRVMgPSAubmFzIC5sbworCitFWFRSQV9saWJsYW1lYXNtcm91dGluZXNfbGFfU09VUkNFUyA9ICQobmFzbV9zb3VyY2VzKQorCitDTEVBTkZJTEVTID0gXAorCWNob29zZV90YWJsZS5vLmxzdCBcCisJY2hvb3NlX3RhYmxlLmxvLmxzdCBcCisJY3B1X2ZlYXQuby5sc3QgXAorCWNwdV9mZWF0LmxvLmxzdCBcCisJZmZ0M2RuLm8ubHN0IFwKKwlmZnQzZG4ubG8ubHN0IFwKKwlmZnRzc2Uuby5sc3QgXAorCWZmdHNzZS5sby5sc3QKKworRVhUUkFfRElTVCA9IFwKKwlmZnQubmFzIFwKKwlmZnRmcHUubmFzIFwKKwlmZnR0YmwubmFzCisKK05BU00gPSBATkFTTUAKK05BU01GTEFHUz1ATkFTTV9GT1JNQVRAIC1pICQodG9wX3NyY2RpcikvbGlibXAzbGFtZS9AQ1BVVFlQRUAvCisKKy5uYXMubzogJDwgbmFzbS5oCisJJChOQVNNKSAkKE5BU01GTEFHUykgJDwgLW8gJEAgLWwgJEAubHN0CisKKy5uYXMubG86ICQ8IG5hc20uaAorCXRlc3QgLWQgLmxpYnMgfHwgbWtkaXIgLmxpYnMKKwkkKEVDSE8pICcjIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggLSBHTlUgbGlidG9vbCAxLjUuMjIgKDEuMTIyMC4yLjM2NSAyMDA1LzEyLzE4IDIyOjE0OjA2KScgPiRACisJJChFQ0hPKSAicGljX29iamVjdD0nLmxpYnMvJCoubyciID4+JEAKKwkkKEVDSE8pICJub25fcGljX29iamVjdD0nLmxpYnMvJCoubyciID4+JEAKKwkkKE5BU00pICQoTkFTTUZMQUdTKSAkPCAtbyAubGlicy8kKi5vIC1sICRALmxzdAorCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSBcCisJJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorCisKKyMkKE9CSkVDVFMpOiBsaWJ0b29sCisjbGlidG9vbDogJChMSUJUT09MX0RFUFMpCisjCSQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9pMzg2L01ha2VmaWxlLmluIGIvbGlibXAzbGFtZS9pMzg2L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjkzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2kzODYvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0OTYgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitBTlNJMktOUiA9ICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK3N1YmRpciA9IGxpYm1wM2xhbWUvaTM4NgorRElTVF9DT01NT04gPSAkKG5vaW5zdF9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0xUTElCUkFSSUVTID0gJChub2luc3RfTFRMSUJSQVJJRVMpCitsaWJsYW1lYXNtcm91dGluZXNfbGFfTElCQUREID0KK2FtX19saWJsYW1lYXNtcm91dGluZXNfbGFfU09VUkNFU19ESVNUID0gY2hvb3NlX3RhYmxlLm5hcyBjcHVfZmVhdC5uYXMgXAorCWZmdDNkbi5uYXMgZmZ0c3NlLm5hcworYW1fX29iamVjdHNfMSA9IGNob29zZV90YWJsZS5sbyBjcHVfZmVhdC5sbyBmZnQzZG4ubG8gZmZ0c3NlLmxvCitsaWJsYW1lYXNtcm91dGluZXNfbGFfT0JKRUNUUyA9ICQoYW1fbGlibGFtZWFzbXJvdXRpbmVzX2xhX09CSkVDVFMpCitASEFWRV9OQVNNX1RSVUVAYW1fbGlibGFtZWFzbXJvdXRpbmVzX2xhX3JwYXRoID0KK0RFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHRvcF9idWlsZGRpcilAYW1fX2lzcmNACitTT1VSQ0VTID0gJChsaWJsYW1lYXNtcm91dGluZXNfbGFfU09VUkNFUykgXAorCSQoRVhUUkFfbGlibGFtZWFzbXJvdXRpbmVzX2xhX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGFtX19saWJsYW1lYXNtcm91dGluZXNfbGFfU09VUkNFU19ESVNUKSBcCisJJChFWFRSQV9saWJsYW1lYXNtcm91dGluZXNfbGFfU09VUkNFUykKK0hFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AgQENPTkZJR19ERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AgLUkkKHRvcF9zcmNkaXIpL2xpYm1wM2xhbWUvQENQVVRZUEVACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorbmFzbV9zb3VyY2VzID0gXAorCWNob29zZV90YWJsZS5uYXMgXAorCWNwdV9mZWF0Lm5hcyBcCisJZmZ0M2RuLm5hcyBcCisJZmZ0c3NlLm5hcworCitASEFWRV9OQVNNX1RSVUVAbm9pbnN0X0xUTElCUkFSSUVTID0gbGlibGFtZWFzbXJvdXRpbmVzLmxhCitASEFWRV9OQVNNX1RSVUVAbGlibGFtZWFzbXJvdXRpbmVzX2xhX1NPVVJDRVMgPSAkKG5hc21fc291cmNlcykKK0BIQVZFX05BU01fVFJVRUBhbV9saWJsYW1lYXNtcm91dGluZXNfbGFfT0JKRUNUUyA9IFwKK0BIQVZFX05BU01fVFJVRUAJY2hvb3NlX3RhYmxlJFUubG8gXAorQEhBVkVfTkFTTV9UUlVFQAljcHVfZmVhdCRVLmxvIFwKK0BIQVZFX05BU01fVFJVRUAJZmZ0M2RuJFUubG8gXAorQEhBVkVfTkFTTV9UUlVFQAlmZnRzc2UkVS5sbworCitub2luc3RfSEVBREVSUyA9IG5hc20uaAorU1VGRklYRVMgPSAubmFzIC5sbworRVhUUkFfbGlibGFtZWFzbXJvdXRpbmVzX2xhX1NPVVJDRVMgPSAkKG5hc21fc291cmNlcykKK0NMRUFORklMRVMgPSBcCisJY2hvb3NlX3RhYmxlLm8ubHN0IFwKKwljaG9vc2VfdGFibGUubG8ubHN0IFwKKwljcHVfZmVhdC5vLmxzdCBcCisJY3B1X2ZlYXQubG8ubHN0IFwKKwlmZnQzZG4uby5sc3QgXAorCWZmdDNkbi5sby5sc3QgXAorCWZmdHNzZS5vLmxzdCBcCisJZmZ0c3NlLmxvLmxzdAorCitFWFRSQV9ESVNUID0gXAorCWZmdC5uYXMgXAorCWZmdGZwdS5uYXMgXAorCWZmdHRibC5uYXMKKworTkFTTUZMQUdTID0gQE5BU01fRk9STUFUQCAtaSAkKHRvcF9zcmNkaXIpL2xpYm1wM2xhbWUvQENQVVRZUEVALworQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSBcCisJJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACisKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLm5hcyAubG8gLm8KKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBsaWJtcDNsYW1lL2kzODYvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGxpYm1wM2xhbWUvaTM4Ni9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCitjbGVhbi1ub2luc3RMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MVExJQlJBUklFUykKKwlAbGlzdD0nJChub2luc3RfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCisJICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKKwkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKKwkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKKwlkb25lCitsaWJsYW1lYXNtcm91dGluZXMubGE6ICQobGlibGFtZWFzbXJvdXRpbmVzX2xhX09CSkVDVFMpICQobGlibGFtZWFzbXJvdXRpbmVzX2xhX0RFUEVOREVOQ0lFUykgCisJJChMSU5LKSAkKGFtX2xpYmxhbWVhc21yb3V0aW5lc19sYV9ycGF0aCkgJChsaWJsYW1lYXNtcm91dGluZXNfbGFfT0JKRUNUUykgJChsaWJsYW1lYXNtcm91dGluZXNfbGFfTElCQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCiskKHRvcF9zcmNkaXIpL2Fuc2kya25yOgorCWNkICQodG9wX3NyY2RpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgLi9hbnNpMmtucgorCittb3N0bHljbGVhbi1rcjoKKwktdGVzdCAiJFUiID0gIiIgfHwgcm0gLWYgKl8uYworCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKEhFQURFUlMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdExUTElCUkFSSUVTIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbQorCisKKy5uYXMubzogJDwgbmFzbS5oCisJJChOQVNNKSAkKE5BU01GTEFHUykgJDwgLW8gJEAgLWwgJEAubHN0CisKKy5uYXMubG86ICQ8IG5hc20uaAorCXRlc3QgLWQgLmxpYnMgfHwgbWtkaXIgLmxpYnMKKwkkKEVDSE8pICcjIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggLSBHTlUgbGlidG9vbCAxLjUuMjIgKDEuMTIyMC4yLjM2NSAyMDA1LzEyLzE4IDIyOjE0OjA2KScgPiRACisJJChFQ0hPKSAicGljX29iamVjdD0nLmxpYnMvJCoubyciID4+JEAKKwkkKEVDSE8pICJub25fcGljX29iamVjdD0nLmxpYnMvJCoubyciID4+JEAKKwkkKE5BU00pICQoTkFTTUZMQUdTKSAkPCAtbyAubGlicy8kKi5vIC1sICRALmxzdAorCisjJChPQkpFQ1RTKTogbGlidG9vbAorI2xpYnRvb2w6ICQoTElCVE9PTF9ERVBTKQorIwkkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvaTM4Ni9jaG9vc2VfdGFibGUubmFzIGIvbGlibXAzbGFtZS9pMzg2L2Nob29zZV90YWJsZS5uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxN2M4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvaTM4Ni9jaG9vc2VfdGFibGUubmFzCkBAIC0wLDAgKzEsNDQ3IEBACis7IG5ldyBjb3VudCBiaXQgcm91dGluZQorOwlwYXJ0IG9mIHRoaXMgY29kZSBpcyBvcmlnaW5lZCBmcm9tCis7CW5ldyBHT0dPLW5vLWNvZGEgKDE5OTksIDIwMDApCis7CUNvcHlyaWdodCAoQykgMTk5OSBzaGlnZW8KKzsJbW9kaWZpZWQgYnkgS2VpaWNoaSBTQUtBSQorCislaW5jbHVkZSAibmFzbS5oIgorCisJZ2xvYmFsZGVmCWNob29zZV90YWJsZV9NTVgKKwlnbG9iYWxkZWYJTU1YX21hc2tpbmcKKworCWV4dGVybmRlZglsYXJnZXRibAorCWV4dGVybmRlZgl0MWwKKwlleHRlcm5kZWYJdGFibGUyMworCWV4dGVybmRlZgl0YWJsZTU2CisKKwlzZWdtZW50X2RhdGEKKwlhbGlnbgkxNgorRDE0XzE0XzE0XzE0CWRkCTB4MDAwRTAwMEUsIDB4MDAwRTAwMEUKK0QxNV8xNV8xNV8xNQlkZAkweGZmZjBmZmYwLCAweGZmZjBmZmYwCittdWxfYWRkCQlkZAkweDAwMDEwMDEwLCAweDAwMDEwMDEwCittdWxfYWRkMjMJZGQJMHgwMDAxMDAwMywgMHgwMDAxMDAwMworbXVsX2FkZDU2CWRkCTB4MDAwMTAwMDQsIDB4MDAwMTAwMDQKK3RhYmxlREVGCisJZGQJMHgwMDAxMDAwMywweDAxLDB4MDAwNTAwMDUsMHgwNSwweDAwMDcwMDA2LDB4MDcsMHgwMDA5MDAwOCwweDA4LDB4MDAwYTAwMDgsIDB4MDkKKwlkZAkweDAwMGEwMDA5LDB4MGEsMHgwMDBiMDAwYSwweDBhLDB4MDAwYjAwMGEsMHgwYiwweDAwMGMwMDBhLDB4MGEsMHgwMDBjMDAwYiwgMHgwYgorCWRkCTB4MDAwYzAwMGIsMHgwYywweDAwMGQwMDBjLDB4MGMsMHgwMDBkMDAwYywweDBkLDB4MDAwZDAwMGMsMHgwZCwweDAwMGUwMDBkLCAweDBlCisJZGQJMHgwMDBiMDAwZSwweDBlLDB4MDAwNDAwMDUsMHgwNCwweDAwMDYwMDA1LDB4MDYsMHgwMDA4MDAwNywweDA4LDB4MDAwOTAwMDgsIDB4MDkKKwlkZAkweDAwMGEwMDA5LDB4MGEsMHgwMDBiMDAwOSwweDBhLDB4MDAwYjAwMGEsMHgwYiwweDAwMGIwMDBhLDB4MGIsMHgwMDBjMDAwYSwgMHgwYgorCWRkCTB4MDAwYzAwMGIsMHgwYiwweDAwMGMwMDBiLDB4MGMsMHgwMDBkMDAwYywweDBjLDB4MDAwZTAwMGMsMHgwZCwweDAwMGQwMDBjLCAweDBlCisJZGQJMHgwMDBlMDAwZCwweDBlLDB4MDAwYjAwMGQsMHgwZSwweDAwMDcwMDA2LDB4MDcsMHgwMDA4MDAwNywweDA4LDB4MDAwOTAwMDcsIDB4MDkKKwlkZAkweDAwMGEwMDA4LDB4MGEsMHgwMDBiMDAwOSwweDBiLDB4MDAwYjAwMDksMHgwYiwweDAwMGMwMDBhLDB4MGMsMHgwMDBjMDAwYSwgMHgwYworCWRkCTB4MDAwZDAwMGEsMHgwYiwweDAwMGMwMDBiLDB4MGMsMHgwMDBkMDAwYiwweDBjLDB4MDAwZDAwMGMsMHgwZCwweDAwMGQwMDBjLCAweDBkCisJZGQJMHgwMDBlMDAwZCwweDBlLDB4MDAwZTAwMGQsMHgwZiwweDAwMGMwMDBkLDB4MGYsMHgwMDA5MDAwNywweDA4LDB4MDAwOTAwMDgsIDB4MDkKKwlkZAkweDAwMGEwMDA4LDB4MGEsMHgwMDBiMDAwOSwweDBiLDB4MDAwYjAwMDksMHgwYiwweDAwMGMwMDBhLDB4MGMsMHgwMDBjMDAwYSwgMHgwYworCWRkCTB4MDAwYzAwMGIsMHgwYywweDAwMGQwMDBiLDB4MGMsMHgwMDBkMDAwYiwweDBkLDB4MDAwZTAwMGMsMHgwZCwweDAwMGUwMDBjLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBkLDB4MDAwZjAwMGQsMHgwZSwweDAwMGYwMDBkLDB4MGYsMHgwMDBkMDAwZCwweDBmLDB4MDAwYTAwMDgsIDB4MDkKKwlkZAkweDAwMGEwMDA4LDB4MDksMHgwMDBiMDAwOSwweDBiLDB4MDAwYjAwMDksMHgwYiwweDAwMGMwMDBhLDB4MGMsMHgwMDBjMDAwYSwgMHgwYworCWRkCTB4MDAwZDAwMGIsMHgwZCwweDAwMGQwMDBiLDB4MGQsMHgwMDBkMDAwYiwweDBjLDB4MDAwZTAwMGIsMHgwZCwweDAwMGUwMDBjLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZjAwMGMsMHgwZSwweDAwMGYwMDBkLDB4MGYsMHgwMDBmMDAwZCwweDBmLDB4MDAwYzAwMGQsIDB4MTAKKwlkZAkweDAwMGEwMDA5LDB4MGEsMHgwMDBhMDAwOSwweDBhLDB4MDAwYjAwMDksMHgwYiwweDAwMGIwMDBhLDB4MGMsMHgwMDBjMDAwYSwgMHgwYworCWRkCTB4MDAwZDAwMGEsMHgwYywweDAwMGQwMDBiLDB4MGQsMHgwMDBlMDAwYiwweDBkLDB4MDAwZDAwMGIsMHgwZCwweDAwMGUwMDBiLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZjAwMGMsMHgwZCwweDAwMGYwMDBkLDB4MGYsMHgwMDBmMDAwZCwweDBmLDB4MDAxMDAwMGQsIDB4MTAKKwlkZAkweDAwMGQwMDBlLDB4MTAsMHgwMDBiMDAwYSwweDBhLDB4MDAwYjAwMDksMHgwYiwweDAwMGIwMDBhLDB4MGMsMHgwMDBjMDAwYSwgMHgwYworCWRkCTB4MDAwZDAwMGEsMHgwZCwweDAwMGQwMDBiLDB4MGQsMHgwMDBkMDAwYiwweDBkLDB4MDAwZDAwMGIsMHgwZCwweDAwMGUwMDBiLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZTAwMGMsMHgwZSwweDAwMGUwMDBjLDB4MGUsMHgwMDBmMDAwZCwweDBmLDB4MDAwZjAwMGQsIDB4MGYKKwlkZAkweDAwMTAwMDBlLDB4MTAsMHgwMDBkMDAwZSwweDEwLDB4MDAwYjAwMGEsMHgwYiwweDAwMGIwMDBhLDB4MGIsMHgwMDBjMDAwYSwgMHgwYworCWRkCTB4MDAwYzAwMGIsMHgwZCwweDAwMGQwMDBiLDB4MGQsMHgwMDBkMDAwYiwweDBkLDB4MDAwZDAwMGIsMHgwZSwweDAwMGUwMDBjLCAweDBlCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZjAwMGMsMHgwZSwweDAwMGYwMDBjLDB4MGYsMHgwMDBmMDAwYywweDBmLDB4MDAwZjAwMGQsIDB4MGYKKwlkZAkweDAwMTEwMDBkLDB4MTAsMHgwMDExMDAwZCwweDEyLDB4MDAwZDAwMGUsMHgxMiwweDAwMGIwMDBhLDB4MGEsMHgwMDBjMDAwYSwgMHgwYQorCWRkCTB4MDAwYzAwMGEsMHgwYiwweDAwMGQwMDBiLDB4MGMsMHgwMDBkMDAwYiwweDBjLDB4MDAwZDAwMGIsMHgwZCwweDAwMGUwMDBiLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZjAwMGMsMHgwZSwweDAwMGYwMDBjLDB4MGUsMHgwMDBmMDAwYywweDBlLDB4MDAwZjAwMGQsIDB4MGYKKwlkZAkweDAwMTAwMDBkLDB4MGYsMHgwMDEwMDAwZSwweDEwLDB4MDAxMDAwMGUsMHgxMSwweDAwMGQwMDBlLDB4MTEsMHgwMDBjMDAwYSwgMHgwYgorCWRkCTB4MDAwYzAwMGEsMHgwYiwweDAwMGMwMDBiLDB4MGMsMHgwMDBkMDAwYiwweDBjLDB4MDAwZDAwMGIsMHgwZCwweDAwMGUwMDBiLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBkLDB4MDAwZjAwMGMsMHgwZiwweDAwMGYwMDBjLDB4MGUsMHgwMDBmMDAwZCwweDBmLDB4MDAwZjAwMGQsIDB4MGYKKwlkZAkweDAwMTAwMDBkLDB4MTAsMHgwMDBmMDAwZCwweDEwLDB4MDAxMDAwMGUsMHgxMCwweDAwMGYwMDBlLDB4MTIsMHgwMDBlMDAwZSwgMHgxMQorCWRkCTB4MDAwYzAwMGIsMHgwYiwweDAwMGQwMDBiLDB4MGMsMHgwMDBjMDAwYiwweDBjLDB4MDAwZDAwMGIsMHgwZCwweDAwMGUwMDBjLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZTAwMGMsMHgwZSwweDAwMGUwMDBjLDB4MGYsMHgwMDBmMDAwYywweDBlLDB4MDAxMDAwMGQsIDB4MGYKKwlkZAkweDAwMTAwMDBkLDB4MTAsMHgwMDEwMDAwZCwweDBmLDB4MDAxMTAwMGQsMHgxMCwweDAwMTEwMDBlLDB4MTEsMHgwMDEwMDAwZiwgMHgxMgorCWRkCTB4MDAwZDAwMGUsMHgxMywweDAwMGQwMDBiLDB4MGMsMHgwMDBkMDAwYiwweDBjLDB4MDAwZDAwMGIsMHgwYywweDAwMGQwMDBiLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZTAwMGMsMHgwZSwweDAwMGYwMDBjLDB4MGUsMHgwMDEwMDAwYywweDBlLDB4MDAxMDAwMGQsIDB4MGYKKwlkZAkweDAwMTAwMDBkLDB4MGYsMHgwMDEwMDAwZCwweDBmLDB4MDAxMDAwMGQsMHgxMCwweDAwMTAwMDBlLDB4MTEsMHgwMDBmMDAwZSwgMHgxMQorCWRkCTB4MDAxMDAwMGUsMHgxMSwweDAwMGUwMDBmLDB4MTIsMHgwMDBkMDAwYywweDBjLDB4MDAwZTAwMGMsMHgwZCwweDAwMGUwMDBiLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZTAwMGMsMHgwZSwweDAwMGYwMDBjLDB4MGYsMHgwMDBmMDAwZCwweDBlLDB4MDAwZjAwMGQsIDB4MGYKKwlkZAkweDAwMGYwMDBkLDB4MTAsMHgwMDExMDAwZCwweDEwLDB4MDAxMDAwMGQsMHgxMSwweDAwMTAwMDBkLDB4MTEsMHgwMDEwMDAwZSwgMHgxMQorCWRkCTB4MDAxMDAwMGUsMHgxMiwweDAwMTIwMDBmLDB4MTIsMHgwMDBlMDAwZiwweDEyLDB4MDAwZjAwMGMsMHgwZCwweDAwMGUwMDBjLCAweDBkCisJZGQJMHgwMDBlMDAwYywweDBlLDB4MDAwZTAwMGMsMHgwZiwweDAwMGYwMDBjLDB4MGYsMHgwMDBmMDAwZCwweDBmLDB4MDAxMDAwMGQsIDB4MTAKKwlkZAkweDAwMTAwMDBkLDB4MTAsMHgwMDEwMDAwZCwweDEwLDB4MDAxMjAwMGUsMHgxMCwweDAwMTEwMDBlLDB4MTAsMHgwMDExMDAwZSwgMHgxMQorCWRkCTB4MDAxMTAwMGUsMHgxMiwweDAwMTMwMDBlLDB4MTEsMHgwMDExMDAwZiwweDEyLDB4MDAwZTAwMGYsMHgxMiwweDAwMGUwMDBkLCAweDBlCisJZGQJMHgwMDBmMDAwZCwweDBlLDB4MDAwZDAwMGQsMHgwZSwweDAwMGUwMDBkLDB4MGYsMHgwMDEwMDAwZCwweDBmLDB4MDAxMDAwMGQsIDB4MGYKKwlkZAkweDAwMGYwMDBkLDB4MTEsMHgwMDEwMDAwZCwweDEwLDB4MDAxMDAwMGUsMHgxMCwweDAwMTEwMDBlLDB4MTMsMHgwMDEyMDAwZSwgMHgxMQorCWRkCTB4MDAxMTAwMGUsMHgxMSwweDAwMTMwMDBmLDB4MTEsMHgwMDExMDAwZiwweDEzLDB4MDAxMDAwMGUsMHgxMiwweDAwMGUwMDBmLCAweDEyCisJZGQJMHgwMDBiMDAwZCwweDBkLDB4MDAwYjAwMGQsMHgwZSwweDAwMGIwMDBkLDB4MGYsMHgwMDBjMDAwZCwweDEwLDB4MDAwYzAwMGQsIDB4MTAKKwlkZAkweDAwMGQwMDBkLDB4MTAsMHgwMDBkMDAwZCwweDExLDB4MDAwZDAwMGUsMHgxMCwweDAwMGUwMDBlLDB4MTEsMHgwMDBlMDAwZSwgMHgxMQorCWRkCTB4MDAwZTAwMGUsMHgxMiwweDAwMGUwMDBlLDB4MTIsMHgwMDBlMDAwZiwweDE1LDB4MDAwZTAwMGYsMHgxNCwweDAwMGUwMDBmLCAweDE1CisJZGQJMHgwMDBjMDAwZiwweDEyCisKK3RhYmxlQUJDCisJZGQJMHgwMDAyMDAwNCwweDEsMHgwMDA0MDAwNCwweDQsMHgwMDA2MDAwNiwweDcsMHgwMDA4MDAwOCwweDksMHgwMDA5MDAwOSwweGEsMHgwMDBhMDAwYSwweGEKKwlkZAkweDAwMDkwMDBhLDB4YSwweDAwMGEwMDBhLDB4YiwweDAwMDAwMDAwLDB4MCwweDAwMDIwMDAzLDB4MSwweDAwMDQwMDA0LDB4NCwweDAwMDcwMDA2LDB4NworCWRkCTB4MDAwOTAwMDcsMHg5LDB4MDAwOTAwMDksMHg5LDB4MDAwYTAwMGEsMHhhLDB4MDAwMDAwMDAsMHgwLDB4MDAwNDAwMDQsMHg0LDB4MDAwNTAwMDUsMHg2CisJZGQJMHgwMDA2MDAwNiwweDgsMHgwMDA4MDAwNywweDksMHgwMDBhMDAwOSwweGEsMHgwMDBhMDAwOSwweGIsMHgwMDA5MDAwYSwweGEsMHgwMDBhMDAwYSwweGEKKwlkZAkweDAwMDAwMDAwLDB4MCwweDAwMDQwMDA0LDB4NCwweDAwMDQwMDA1LDB4NiwweDAwMDYwMDA2LDB4OCwweDAwMGEwMDA3LDB4OSwweDAwMGEwMDA4LDB4OQorCWRkCTB4MDAwYTAwMGEsMHhhLDB4MDAwMDAwMDAsMHgwLDB4MDAwNjAwMDYsMHg3LDB4MDAwNzAwMDYsMHg4LDB4MDAwODAwMDcsMHg5LDB4MDAwOTAwMDgsMHhhCisJZGQJMHgwMDBhMDAwOSwweGIsMHgwMDBiMDAwYSwweGMsMHgwMDBhMDAwOSwweGIsMHgwMDBhMDAwYSwweGIsMHgwMDAwMDAwMCwweDAsMHgwMDA3MDAwNSwweDcKKwlkZAkweDAwMDYwMDA2LDB4NywweDAwMDgwMDA3LDB4OSwweDAwMGEwMDA4LDB4YSwweDAwMGEwMDA5LDB4YSwweDAwMGIwMDBhLDB4YiwweDAwMDAwMDAwLDB4MAorCWRkCTB4MDAwODAwMDcsMHg4LDB4MDAwODAwMDcsMHg5LDB4MDAwOTAwMDgsMHhhLDB4MDAwYjAwMDgsMHhiLDB4MDAwYTAwMDksMHhjLDB4MDAwYzAwMGEsMHhjCisJZGQJMHgwMDBhMDAwYSwweGIsMHgwMDBiMDAwYSwweGMsMHgwMDAwMDAwMCwweDAsMHgwMDA5MDAwNywweDgsMHgwMDBhMDAwNywweDksMHgwMDBhMDAwOCwweGEKKwlkZAkweDAwMGIwMDA5LDB4YiwweDAwMGIwMDA5LDB4YiwweDAwMGMwMDBhLDB4YiwweDAwMDAwMDAwLDB4MCwweDAwMDkwMDA4LDB4OSwweDAwMGEwMDA4LDB4YQorCWRkCTB4MDAwYTAwMDksMHhiLDB4MDAwYjAwMDksMHhjLDB4MDAwYjAwMGEsMHhjLDB4MDAwYzAwMGEsMHhjLDB4MDAwYjAwMGEsMHhjLDB4MDAwYzAwMGIsMHhjCisJZGQJMHgwMDAwMDAwMCwweDAsMHgwMDA5MDAwOCwweDgsMHgwMDA5MDAwOCwweDksMHgwMDBhMDAwOSwweGEsMHgwMDBiMDAwOSwweGIsMHgwMDBjMDAwYSwweGIKKwlkZAkweDAwMGMwMDBiLDB4YywweDAwMDAwMDAwLDB4MCwweDAwMDkwMDA5LDB4YSwweDAwMGEwMDA5LDB4YiwweDAwMGIwMDBhLDB4YywweDAwMGMwMDBhLDB4YworCWRkCTB4MDAwYzAwMGEsMHhkLDB4MDAwZDAwMGIsMHhkLDB4MDAwYzAwMGEsMHhjLDB4MDAwZDAwMGIsMHhkLDB4MDAwMDAwMDAsMHgwLDB4MDAwYTAwMDksMHg5CisJZGQJMHgwMDBhMDAwOSwweGEsMHgwMDBiMDAwYSwweGIsMHgwMDBiMDAwYSwweGMsMHgwMDBkMDAwYiwweGMsMHgwMDBkMDAwYiwweGMsMHgwMDAwMDAwMCwweDAKKwlkZAkweDAwMDkwMDA5LDB4OSwweDAwMDkwMDA5LDB4YSwweDAwMDkwMDA5LDB4YiwweDAwMGEwMDBhLDB4YywweDAwMGIwMDBhLDB4YywweDAwMGMwMDBiLDB4YworCWRkCTB4MDAwYzAwMGIsMHhkLDB4MDAwYzAwMGMsMHhkLDB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwCisJZGQJMHgwMDAwMDAwMCwweDAsMHgwMDAwMDAwMCwweDAsMHgwMDAwMDAwMCwweDAsMHgwMDAwMDAwMCwweDAsMHgwMDA5MDAwYSwweGEsMHgwMDA5MDAwYSwweGEKKwlkZAkweDAwMGEwMDBhLDB4YiwweDAwMGIwMDBiLDB4YywweDAwMGMwMDBiLDB4YywweDAwMGMwMDBiLDB4ZCwweDAwMGMwMDBiLDB4ZCwweDAwMGMwMDBjLDB4ZAorCWRkCTB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwLDB4MDAwMDAwMDAsMHgwCisJZGQJMHgwLDB4MDAwMDAwMDAsIDB4MCwweDAwMDAwMDAwCisKK2xpbmJpdHMzMgorCWRkCTB4MDAwNDAwMDQsMHgxMDAwMSwweDAwMDQwMDA0LDB4MjAwMDIsMHgwMDA0MDAwNCwweDMwMDAzLDB4MDAwNDAwMDQsMHg0MDAwNAorCWRkCTB4MDAwNTAwMDUsMHg2MDAwNiwweDAwMDYwMDA2LDB4NjAwMDYsMHgwMDA3MDAwNywweDgwMDA4LDB4MDAwODAwMDgsMHg4MDAwOAorCWRkCTB4MDAwOTAwMDksMHhhMDAwYSwweDAwMGIwMDBiLDB4YTAwMGEsMHgwMDBiMDAwYiwweGQwMDBkLDB4MDAwZDAwMGQsMHhkMDAwZAorCWRkCTB4MDAwZDAwMGQsMHhkMDAwZAorCisKK2Nob29zZV90YWJsZV9ICisJZHcJMHgxODEwLCAweDE4MTEsIDB4MTgxMiwgMHgxODEzLCAweDE5MTQsIDB4MWExNCwgMHgxYjE1LCAweDFjMTUKKwlkdwkweDFkMTYsIDB4MWUxNiwgMHgxZTE3LCAweDFmMTcsIDB4MWYxNworCitjaG9vc2VfanVtcF90YWJsZV9MOgorCWRkCXRhYmxlX01NWC5MX2Nhc2VfMCAgICAtIGNob29zZV90YWJsZV9NTVgKKwlkZAl0YWJsZV9NTVguTF9jYXNlXzEgICAgLSBjaG9vc2VfdGFibGVfTU1YCisJZGQJdGFibGVfTU1YLkxfY2FzZV8yICAgIC0gY2hvb3NlX3RhYmxlX01NWAorCWRkCXRhYmxlX01NWC5MX2Nhc2VfMyAgICAtIGNob29zZV90YWJsZV9NTVgKKwlkZAl0YWJsZV9NTVguTF9jYXNlXzQ1ICAgLSBjaG9vc2VfdGFibGVfTU1YCisJZGQJdGFibGVfTU1YLkxfY2FzZV80NSAgIC0gY2hvb3NlX3RhYmxlX01NWAorCWRkCXRhYmxlX01NWC5MX2Nhc2VfNjcgICAtIGNob29zZV90YWJsZV9NTVgKKwlkZAl0YWJsZV9NTVguTF9jYXNlXzY3ICAgLSBjaG9vc2VfdGFibGVfTU1YCisJZGQJdGFibGVfTU1YLkxfY2FzZV84XzE1IC0gY2hvb3NlX3RhYmxlX01NWAorCWRkCXRhYmxlX01NWC5MX2Nhc2VfOF8xNSAtIGNob29zZV90YWJsZV9NTVgKKwlkZAl0YWJsZV9NTVguTF9jYXNlXzhfMTUgLSBjaG9vc2VfdGFibGVfTU1YCisJZGQJdGFibGVfTU1YLkxfY2FzZV84XzE1IC0gY2hvb3NlX3RhYmxlX01NWAorCWRkCXRhYmxlX01NWC5MX2Nhc2VfOF8xNSAtIGNob29zZV90YWJsZV9NTVgKKwlkZAl0YWJsZV9NTVguTF9jYXNlXzhfMTUgLSBjaG9vc2VfdGFibGVfTU1YCisJZGQJdGFibGVfTU1YLkxfY2FzZV84XzE1IC0gY2hvb3NlX3RhYmxlX01NWAorCWRkCXRhYmxlX01NWC5MX2Nhc2VfOF8xNSAtIGNob29zZV90YWJsZV9NTVgKKworCXNlZ21lbnRfY29kZQorOworOyB1c2UgTU1YCis7CisKK1BJQ19PRkZTRVRUQUJMRQorCisJYWxpZ24JMTYKKzsgaW50IGNob29zZV90YWJsZShpbnQgKml4LCBpbnQgKmVuZCwgaW50ICpzKQorY2hvb3NlX3RhYmxlX01NWDoKKwlwdXNoCWVicAorCWNhbGwJZ2V0X3BjLmJwCisJYWRkCWVicCwgUElDX0JBU0UoKQorCisJbW92CWVjeCxbZXNwKzhdCTtlY3ggPSBiZWdpbgorCW1vdgllZHgsW2VzcCsxMl0JO2VkeCA9IGVuZAorCXN1YgllY3gsZWR4CQk7ZWN4ID0gYmVnaW4tZW5kKHNob3VsZCBiZSBtaW51cykKKwl0ZXN0CWVjeCw4CisgCXB4b3IJbW0wLG1tMAkJO21tMD1bMDowXQorCW1vdnEJbW0xLFtlZHgrZWN4XQorCWp6CS5scAorCisJYWRkCWVjeCw4CisJanoJLmV4aXQKKworCWFsaWduCTQKKy5scDoKKwltb3ZxCW1tNCxbZWR4K2VjeF0KKwltb3ZxCW1tNSxbZWR4K2VjeCs4XQorCWFkZAllY3gsMTYKKwlwc3VidXN3CW1tNCxtbTAJOyAbJEJLXEV2JE8bKEIgZHdvcmQgGyRCJEckSiQkJEgkJCQxJEokJCROJEAkLBsoQgorCXBzdWJ1c3cJbW01LG1tMQk7IBskQiQ9JHMkSiUzJV4lcyVJJE8kSiQkGyhCIDotcAorCXBhZGR3CW1tMCxtbTQgOyAbJEIkLBsoQiwgGyRCJDMkMyRHMDckJkNNJE5ITzBPJE8bKEIgODE5MSsxNSAbJEIwSjI8JEokTiRHTGRCaiRKJCQbKEIKKwlwYWRkdwltbTEsbW01CisJam56CS5scAorLmV4aXQ6CisJcHN1YnVzdwltbTEsbW0wCTsgGyRCJDMkbCRiS1xFdiRPGyhCIGR3b3JkIBskQiRHJEokJCRIJCQkMSRKJCQbKEIKKwlwYWRkdwltbTAsbW0xCisKKwltb3ZxCW1tNCxtbTAKKwlwdW5wY2toZHEJbW00LG1tNAorCXBzdWJ1c3cJbW00LG1tMAk7IBskQiQzJGwkYktcRXYkTxsoQiBkd29yZCAbJEIkRyRKJCQkSCQkJDEkSiQkGyhCCisJcGFkZHcJbW0wLG1tNAorCW1vdmQJZWF4LG1tMAorCisJY21wCWVheCwxNQorCWphCS53aXRoX0VTQworCWxlYQllY3gsW1BJQ19FQlBfUkVMKGNob29zZV90YWJsZV9NTVgpXQorCWFkZAllY3gsW1BJQ19FQlBfUkVMKGNob29zZV9qdW1wX3RhYmxlX0wrZWF4KjQpXQorCWptcCAJZWN4CisKKy53aXRoX0VTQzE6CisJZW1tcworCW1vdgllY3gsIFtlc3ArMTZdCTsgKnMKKwltb3YJW2VjeF0sIGVheAorCW9yCWVheCwtMQorCXBvcAllYnAKKwlyZXQKKworLndpdGhfRVNDOgorCWNtcAllYXgsIDgxOTErMTUKKwlqYQkud2l0aF9FU0MxCisKKwlzdWIJZWF4LDE1CisJcHVzaAllYngKKwlwdXNoCWVzaQorCWJzcgllYXgsIGVheAorJWFzc2lnbiBfUCA0KjIKKwltb3ZxICAgIG1tNSwgW1BJQ19FQlBfUkVMKEQxNV8xNV8xNV8xNSldCisJbW92cQltbTYsIFtQSUNfRUJQX1JFTChEMTRfMTRfMTRfMTQpXQorCW1vdnEJbW0zLCBbUElDX0VCUF9SRUwobXVsX2FkZCldCisKKwltb3YJZWN4LCBbZXNwK19QKzhdCQk7ID0gaXgKKzsJbW92CWVkeCwgW2VzcCtfUCsxMl0JOyA9IGVuZAorCXN1YgllY3gsIGVkeAorCisJeG9yCWVzaSwgZXNpCTsgc3VtID0gMAorCXRlc3QgICAgZWN4LCA4CisJcHhvcgltbTcsIG1tNwk7IGxpbmJpdHNfc3VtLCAxNBskQiRyMVskKCQ/JGIkTiROP3QbKEIKKwlqegkuSF9kdWFsX2xwMQorCisJbW92cQltbTAsIFtlZHgrZWN4XQorCWFkZAllY3gsOAorCXBhY2tzc2R3CW1tMCxtbTcKKwltb3ZxCW1tMiwgbW0wCisJcGFkZHVzdwltbTAsIG1tNQk7IG1tMCA9IG1pbihpeCwgMTUpKzB4ZmZmMAorCXBjbXBndHcJbW0yLCBtbTYJOyAxNBskQiRoJGpCZyQtJCQkKyEpGyhCCisJcHN1YncJbW03LCBtbTIJOyAxNBskQiRoJGpCZyQtJCQkSCQtGyhCIGxpbmJpdHNfc3VtKys7CisJcG1hZGR3ZAltbTAsIG1tMwk7IHswLCAwLCB5LCB4fSp7MSwgMTYsIDEsIDE2fQorCW1vdmQJZWJ4LCBtbTAKKwltb3YJZXNpLCBbUElDX0VCUF9SRUwobGFyZ2V0YmwrZWJ4KjQrKDE2KjE2KzE2KSo0KV0KKworCWp6CS5IX2R1YWxfZXhpdAorCisJYWxpZ24gICA0CisuSF9kdWFsX2xwMToKKwltb3ZxCW1tMCwgW2VkeCtlY3hdCisJbW92cQltbTEsIFtlZHgrZWN4KzhdCisJcGFja3NzZHcJbW0wLG1tMQorCW1vdnEJbW0yLCBtbTAKKwlwYWRkdXN3CW1tMCwgbW01CTsgbW0wID0gbWluKGl4LCAxNSkrMHhmZmYwCisJcGNtcGd0dwltbTIsIG1tNgk7IDE0GyRCJGgkakJnJC0kJCQrISkbKEIKKwlwbWFkZHdkCW1tMCwgbW0zCTsge3ksIHgsIHksIHh9KnsxLCAxNiwgMSwgMTZ9CisJbW92ZAllYngsIG1tMAorCXB1bnBja2hkcQltbTAsbW0wCisJYWRkCWVzaSwgW1BJQ19FQlBfUkVMKGxhcmdldGJsK2VieCo0KygxNioxNisxNikqNCldCisJbW92ZAllYngsIG1tMAorCWFkZAllc2ksIFtQSUNfRUJQX1JFTChsYXJnZXRibCtlYngqNCsoMTYqMTYrMTYpKjQpXQorCWFkZAllY3gsIDE2CisJcHN1YncJbW03LCBtbTIJOyAxNBskQiRoJGpCZyQtJCQkSCQtGyhCIGxpbmJpdHNfc3VtKys7CisJam56CS5IX2R1YWxfbHAxCisKKy5IX2R1YWxfZXhpdDoKKwlwbW92CW1tMSxtbTcKKwlwdW5wY2toZHEJbW03LG1tNworCXBhZGRkCW1tNyxtbTEKKwlwdW5wY2tsZHEJbW03LG1tNworCisJcG1hZGR3ZAltbTcsIFtQSUNfRUJQX1JFTChsaW5iaXRzMzIrZWF4KjgpXQk7IGxpbmJpdHMKKwltb3YJYXgsIFtQSUNfRUJQX1JFTChjaG9vc2VfdGFibGVfSCtlYXgqMildCisKKwltb3ZkCWVjeCwgbW03CisJcHVucGNraGRxCW1tNyxtbTcKKwltb3ZkCWVkeCxtbTcKKwllbW1zCisJc2hsCWVkeCwgMTYKKwlhZGQJZWN4LCBlZHgKKworCWFkZAllY3gsIGVzaQorCisJcG9wCWVzaQorCXBvcAllYngKKworCW1vdgllZHgsIGVjeAorCWFuZAllY3gsIDB4ZmZmZgk7IGVjeCA9IHN1bTIKKwlzaHIJZWR4LCAxNgk7IGVkeCA9IHN1bQorCisJY21wCWVkeCwgZWN4CisJamxlCS5jaG9vc2VFX3MxCisJbW92CWVkeCwgZWN4CisJc2hyCWVheCwgOAorLmNob29zZUVfczE6CisJbW92CWVjeCwgW2VzcCsxNl0gOyAqcworCWFuZAllYXgsIDB4ZmYKKwlhZGQJW2VjeF0sIGVkeAorCXBvcAllYnAKKwlyZXQKKwordGFibGVfTU1YLkxfY2FzZV8wOgorCWVtbXMKKwlwb3AJZWJwCisJcmV0CisKK3RhYmxlX01NWC5MX2Nhc2VfMToKKwllbW1zCisJbW92CWVheCwgW2VzcCsxNl0gOyAqcworCW1vdgllY3gsIFtlc3ArOF0gOyAqaXgKKwlzdWIJZWN4LCBlZHgKKwlwdXNoCWVieAorLmxwOgorCW1vdgllYngsIFtlZHgrZWN4XQorCWFkZAllYngsIGVieAorCWFkZAllYngsIFtlZHgrZWN4KzRdCisJbW92engJZWJ4LCBieXRlIFtQSUNfRUJQX1JFTChlYngrdDFsKV0KKwlhZGQJW2VheF0sIGVieAorCWFkZAllY3gsIDgKKwlqbnoJLmxwCisJcG9wCWVieAorCW1vdgllYXgsIDEKKwlwb3AJZWJwCisJcmV0CisKK3RhYmxlX01NWC5MX2Nhc2VfNDU6CisJcHVzaAlkd29yZCA3CisJbGVhCWVjeCwgW1BJQ19FQlBfUkVMKHRhYmxlQUJDKzkqOCldCisJam1wCWZyb20zCisKK3RhYmxlX01NWC5MX2Nhc2VfNjc6CisJcHVzaAlkd29yZCAxMAorCWxlYQllY3gsIFtQSUNfRUJQX1JFTCh0YWJsZUFCQyldCisJam1wCWZyb20zCisKK3RhYmxlX01NWC5MX2Nhc2VfOF8xNToKKwlwdXNoCWR3b3JkIDEzCisJbGVhCWVjeCwgW1BJQ19FQlBfUkVMKHRhYmxlREVGKV0KK2Zyb20zOgorCW1vdgllYXgsW2VzcCsxMl0JO2VheCA9ICpiZWdpbgorOwltb3YJZWR4LFtlc3ArMTZdCTtlZHggPSAqZW5kCisKKwlwdXNoCWVieAorCXN1YgllYXgsIGVkeAorCisJbW92cQltbTUsW1BJQ19FQlBfUkVMKG11bF9hZGQpXQorCXB4b3IJbW0yLG1tMgk7bW0yID0gc3VtCisKKwl0ZXN0CWVheCwgOAorCWp6CS5jaG9vc2UzX2xwMQorOyBvZGQgbGVuZ3RoCisJbW92cQltbTAsW2VkeCtlYXhdCTttbTAgPSBpeFswXSB8IGl4WzFdCisJYWRkCWVheCw4CisJcGFja3NzZHcJbW0wLG1tMgorCisJcG1hZGR3ZAltbTAsbW01CisJbW92ZAllYngsbW0wCisKKwltb3ZxCW1tMiwgIFtlY3grZWJ4KjhdCisKKwlqegkuY2hvb3NlM19leGl0CisKKwlhbGlnbgk0CisuY2hvb3NlM19scDEKKwltb3ZxCW1tMCxbZWR4K2VheF0KKwltb3ZxCW1tMSxbZWR4K2VheCs4XQorCWFkZAllYXgsMTYKKwlwYWNrc3NkdwltbTAsbW0xIDttbTAgPSBpeFswXXxpeFsxXXxpeFsyXXxpeFszXQorCXBtYWRkd2QJbW0wLG1tNQorCW1vdmQJZWJ4LG1tMAorCXB1bnBja2hkcQltbTAsbW0wCisJcGFkZGQJbW0yLCBbZWN4K2VieCo4XQorCW1vdmQJZWJ4LG1tMAorCXBhZGRkCW1tMiwgW2VjeCtlYngqOF0KKwlqbnoJLmNob29zZTNfbHAxCisuY2hvb3NlM19leGl0Cis7CXhvcgllYXgsZWF4CisJbW92ZAllYngsIG1tMgorCXB1bnBja2hkcQltbTIsbW0yCisJbW92CWVjeCwgZWJ4CisJYW5kCWVjeCwgMHhmZmZmCTsgZWN4ID0gc3VtMgorCXNocgllYngsIDE2CTsgZWJ4ID0gc3VtMQorCW1vdmQJZWR4LCBtbTIJOyBlZHggPSBzdW0KKworCWNtcAllZHgsIGVieAorCWpsZQkuY2hvb3NlM19zMQorCW1vdgllZHgsIGVieAorCWluYwllYXgKKy5jaG9vc2UzX3MxOgorCWVtbXMKKwlwb3AJZWJ4CisJY21wCWVkeCwgZWN4CisJamxlCS5jaG9vc2UzX3MyCisJbW92CWVkeCwgZWN4CisJbW92CWVheCwgMgorLmNob29zZTNfczI6CisJcG9wCWVjeAorCWFkZAllYXgsIGVjeAorCW1vdgllY3gsIFtlc3ArMTZdIDsgKnMKKwlhZGQJW2VjeF0sIGVkeAorCXBvcAllYnAKKwlyZXQKKwordGFibGVfTU1YLkxfY2FzZV8yOgorCXB1c2gJZHdvcmQgMgorCWxlYQllY3gsW1BJQ19FQlBfUkVMKHRhYmxlMjMpXQorCXBtb3YJbW01LFtQSUNfRUJQX1JFTChtdWxfYWRkMjMpXQorCWptcAlmcm9tMgordGFibGVfTU1YLkxfY2FzZV8zOgorCXB1c2gJZHdvcmQgNQorCWxlYQllY3gsW1BJQ19FQlBfUkVMKHRhYmxlNTYpXQorCXBtb3YJbW01LFtQSUNfRUJQX1JFTChtdWxfYWRkNTYpXQorZnJvbTI6CisJbW92CWVheCxbZXNwKzEyXQk7ZWF4ID0gKmJlZ2luCis7CW1vdgllZHgsW2VzcCsxNl0JO2VkeCA9ICplbmQKKwlwdXNoCWVieAorCXB1c2gJZWRpCisKKwlzdWIJZWF4LCBlZHgKKwl4b3IJZWRpLCBlZGkKKwl0ZXN0CWVheCwgOAorCWp6CS5jaG9vc2UyX2xwMQorOyBvZGQgbGVuZ3RoCisJbW92cQltbTAsW2VkeCtlYXhdCTttbTAgPSBpeFswXSB8IGl4WzFdCisJcHhvcgltbTIsbW0yCQk7bW0yID0gc3VtCisJcGFja3NzZHcJbW0wLG1tMgorCisJcG1hZGR3ZAltbTAsbW01CisJbW92ZAllYngsbW0wCisKKwltb3YJZWRpLCAgW2VjeCtlYngqNF0KKworCWFkZAllYXgsOAorCWp6CS5jaG9vc2UyX2V4aXQKKworCWFsaWduCTQKKy5jaG9vc2UyX2xwMQorCW1vdnEJbW0wLFtlZHgrZWF4XQorCW1vdnEJbW0xLFtlZHgrZWF4KzhdCisJcGFja3NzZHcJbW0wLG1tMSA7bW0wID0gaXhbMF18aXhbMV18aXhbMl18aXhbM10KKwlwbWFkZHdkCW1tMCxtbTUKKwltb3ZkCWVieCxtbTAKKwlwdW5wY2toZHEJbW0wLG1tMAorCWFkZAllZGksIFtlY3grZWJ4KjRdCisJbW92ZAllYngsIG1tMAorCWFkZAllZGksIFtlY3grZWJ4KjRdCisJYWRkCWVheCwxNgorCWpuYwkuY2hvb3NlMl9scDEKKy5jaG9vc2UyX2V4aXQKKwltb3YJZWN4LCBlZGkKKwlwb3AJZWRpCisJcG9wCWVieAorCXBvcAllYXggOyB0YWJsZSBudW0uCisJZW1tcworCisJbW92CWVkeCwgZWN4CisJYW5kCWVjeCwgMHhmZmZmCTsgZWN4ID0gc3VtMgorCXNocgllZHgsIDE2CTsgZWR4ID0gc3VtMQorCisJY21wCWVkeCwgZWN4CisJamxlCS5jaG9vc2UyX3MxCisJbW92CWVkeCwgZWN4CisJaW5jCWVheAorLmNob29zZTJfczE6CisJbW92CWVjeCwgW2VzcCsxNl0gOyAqcworCWFkZAlbZWN4XSwgZWR4CisJcG9wCWVicAorCXJldAorCisJZW5kCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2kzODYvY3B1X2ZlYXQubmFzIGIvbGlibXAzbGFtZS9pMzg2L2NwdV9mZWF0Lm5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWIwOWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9pMzg2L2NwdV9mZWF0Lm5hcwpAQCAtMCwwICsxLDEwNyBAQAorOworOworOyAJYXNzZW1ibGVyIHJvdXRpbmVzIHRvIGRldGVjdCBDUFUtZmVhdHVyZXMKKzsKKzsJTU1YIC8gM0ROb3chIC8gU1NFIC8gU1NFMgorOworOwlmb3IgdGhlIExBTUUgcHJvamVjdAorOwlGcmFuayBLbGVtbSwgUm9iZXJ0IEhlZ2VtYW5uIDIwMDAtMTAtMTIKKzsKKworJWluY2x1ZGUgIm5hc20uaCIKKworCWdsb2JhbGRlZgloYXNfTU1YX25hc20KKwlnbG9iYWxkZWYJaGFzXzNETm93X25hc20KKwlnbG9iYWxkZWYJaGFzX1NTRV9uYXNtCisJZ2xvYmFsZGVmCWhhc19TU0UyX25hc20KKworICAgICAgICBzZWdtZW50X2NvZGUKKwordGVzdENQVUlEOgorCXB1c2hmZAkgICAgICAgICAgICAgICAgICAgICAgICAKKwlwb3AJZWF4CisJbW92CWVjeCxlYXgKKwl4b3IJZWF4LDB4MjAwMDAwCisJcHVzaAllYXgKKwlwb3BmZAorCXB1c2hmZAorCXBvcAllYXgKKwljbXAJZWF4LGVjeAorCXJldAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7CWludCAgaGFzX01NWF9uYXNtICh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitoYXNfTU1YX25hc206CisgICAgICAgIHB1c2hhZAorCWNhbGwJdGVzdENQVUlECisJanoJcmV0dXJuMAkJOyBubyBDUFVJRCBjb21tYW5kLCBzbyBubyBNTVgKKworCW1vdgllYXgsMHgxCisJQ1BVSUQKKwl0ZXN0CWVkeCwweDgwMDAwMAorCWp6CXJldHVybjAJCTsgbm8gTU1YIHN1cHBvcnQKKwlqbXAJcmV0dXJuMQkJOyBNTVggc3VwcG9ydAorICAgICAgICAKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsJaW50ICBoYXNfU1NFX25hc20gKHZvaWQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2hhc19TU0VfbmFzbToKKyAgICAgICAgcHVzaGFkCisJY2FsbAl0ZXN0Q1BVSUQKKwlqeglyZXR1cm4wCQk7IG5vIENQVUlEIGNvbW1hbmQsIHNvIG5vIFNTRQorICAgICAgICAKKwltb3YJZWF4LDB4MQorCUNQVUlECisJdGVzdAllZHgsMHgwMjAwMDAwMAorCWp6CXJldHVybjAJCTsgbm8gU1NFIHN1cHBvcnQKKwlqbXAJcmV0dXJuMQkJOyBTU0Ugc3VwcG9ydAorICAgICAgICAKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsJaW50ICBoYXNfU1NFMl9uYXNtICh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitoYXNfU1NFMl9uYXNtOgorICAgICAgICBwdXNoYWQKKwljYWxsCXRlc3RDUFVJRAorCWp6CXJldHVybjAJCTsgbm8gQ1BVSUQgY29tbWFuZCwgc28gbm8gU1NFMgorICAgICAgICAKKwltb3YJZWF4LDB4MQorCUNQVUlECisJdGVzdAllZHgsMHgwNDAwMDAwMAorCWp6CXJldHVybjAJCTsgbm8gU1NFMiBzdXBwb3J0CisJam1wCXJldHVybjEJCTsgU1NFMiBzdXBwb3J0CisgICAgICAgIAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOwlpbnQgIGhhc18zRE5vd19uYXNtICh2b2lkKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitoYXNfM0ROb3dfbmFzbToKKyAgICAgICAgcHVzaGFkCisJY2FsbAl0ZXN0Q1BVSUQKKwlqeglyZXR1cm4wCQk7IG5vIENQVUlEIGNvbW1hbmQsIHNvIG5vIDNETm93IQorCisJbW92CWVheCwweDgwMDAwMDAwCisJQ1BVSUQKKwljbXAJZWF4LDB4ODAwMDAwMDAKKwlqYmUJcmV0dXJuMAkJOyBubyBleHRlbmRlZCBNU1IoMSksIHNvIG5vIDNETm93IQorCisJbW92CWVheCwweDgwMDAwMDAxCisJQ1BVSUQKKwl0ZXN0CWVkeCwweDgwMDAwMDAwCisJanoJcmV0dXJuMAkJOyBubyAzRE5vdyEgc3VwcG9ydAorCQkJCTsgM0ROb3chIHN1cHBvcnQKK3JldHVybjE6CisJcG9wYWQKKwl4b3IJZWF4LGVheAorCWluYwllYXgKKwlyZXQKKworcmV0dXJuMDoKKwlwb3BhZAorCXhvcgllYXgsZWF4CisJcmV0CisgICAgICAgIAorICAgICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvaTM4Ni9mZnQubmFzIGIvbGlibXAzbGFtZS9pMzg2L2ZmdC5uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyOGIzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvaTM4Ni9mZnQubmFzCkBAIC0wLDAgKzEsMjY3IEBACisKKzsJZm9yIG5ldyBHT0dPLW5vLWNvZGEgKDE5OTkvMDkpCis7CUNvcHlyaWdodCAoQykgMTk5OSBzaGlnZW8KKzsJc3BlY2lhbCB0aGFua3MgdG8gS2VpaWNoaSBTQUtBSSwgVVJVUkkKKyVpbmNsdWRlICJuYXNtLmgiCisKKwlnbG9iYWxkZWYgZmh0XzNETgorCWdsb2JhbGRlZiBmaHQKKwlleHRlcm5kZWYgY29zdGFiX2ZmdAorCWV4dGVybmRlZiBzaW50YWJfZmZ0CisJZXh0ZXJuZGVmIGdyYXlfaW5kZXgKKworCXNlZ21lbnRfZGF0YQorCWFsaWduIDE2CitEX01TQjFfMAlkZAkwICAgICAgICAgLDB4ODAwMDAwMDAKK0RfU1FSVDIJZGQJMS40MTQyMTM1NjIsMS40MTQyMTM1NjIKK3RfczAJZGQJMAk7WyB0X2M6dF9zXQordF9jMAlkZAkwCit0X2MxCWRkCTAJO1stdF9zOnRfY10KK3RfczEJZGQJMAorRF9zMWMxCWRkCTAsIDAKK0RfTWMxczEJZGQJMCwgMAorRF9zMmMyCWRkCTAsIDAKK0RfTWMyczIJZGQJMCwgMAorRF8wXzEJZGQJMS4wLCAwLjAKK1NfMDUJREQJMC41CitTXzAwMDA1CURECTAuMDAwNQorZmh0CQlkZAkwCTu02L/0pd2lpKXzpb8KKworCXNlZ21lbnRfY29kZQorCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsJYnkgc2hpZ2VvCis7CTk5LzA4LzE2Cis7CTIzMDAwY2xrIL/JpKukw6S/ocEKKzsJMTg1MDBjbGsgYml0IHJldmVyc2FsIGZyb20gZ29nbzEgYnkgVVJVUkkKKworO3ZvaWQgZmh0KGZsb2F0ICpmeiwgaW50IG4pOworCWFsaWduIDE2CitmaHRfM0ROOgorCXB1c2gJZWJ4CisJcHVzaAllc2kKKwlwdXNoCWVkaQorCXB1c2gJZWJwCislYXNzaWduIF9QIDQqNAorCTuk3qS6use96aTOpeuhvKXXLi4uIKTPZmh0KCmkzrOwpNiw3MawCisKKwltb3YJZXNpLFtlc3ArX1ArNF0JO2VzaT1megorCW1vdgllY3gsW2VzcCtfUCs4XQk7ZWN4PW4KKworCTul4aWkpfOl66G8pdcKKwltb3ZxCW1tNyxbRF9NU0IxXzBdCTttbTc9WzE8PDMxOjBdCisKKyVhc3NpZ24gTE9DQUxfU1RBQ0sJMTYKKwlzdWIJZXNwLExPQ0FMX1NUQUNLCislYXNzaWduIF9QIChfUCtMT0NBTF9TVEFDSykKKwl4b3IJZWF4LGVheAorCW1vdglbZXNwXSxlYXgJO2s9MAorJWRlZmluZSBrIGR3b3JkIFtlc3BdCislZGVmaW5lIGt4CWR3b3JkIFtlc3ArNF0KKyVkZWZpbmUgZm4gZHdvcmQgW2VzcCs4XQorCisubHAzMDoJO2s9MDsgZG97CisJbW92CWVjeCxrCisJYWRkCWVjeCwyCisJbW92CWssZWN4CisJbW92CWVheCwxCisJc2hsCWVheCxjbAkJO2VheD1rMSA9IDE8PGsKKwlsZWEJZWJ4LFtlYXgrZWF4XQk7ZWJ4PWsyID0gazEqMgorCWxlYQllY3gsW2VheCtlYXgqMl0JO2VjeD1rMyA9IGsyICsgazEgPSBrMSozCisJbGVhCWVkeCxbZWJ4K2VieF0JO2VkeD1rNCA9IGsxKjQKKwltb3YJZXNpLGVheAorCXNocgllc2ksMQkJO2VzaT1reD1rMT4+MQorCW1vdglreCxlc2kJCTvK3cK4KLjlpMe7yKSmKQorCW1vdgllZGksW2VzcCtfUCs0XQk7ZWRpPWZpPWZ6CisJbGVhCWVicCxbZWRpK2VzaSo0XQk7ZWJwPWdpPWZ6K2t4CisJbW92CWVzaSxbZXNwK19QKzhdCTtlc2k9bgorCWxlYQllc2ksW2VkaStlc2kqNF0JO2VzaT1mbj1meituCisJbW92cQltbTYsW0RfU1FSVDJdCTttbTY9W6LlMjqi5TJdCisKKy5scDMxOgk7Zm49ZnorbjsgZG97IEZMT0FUIGcwLGYwLGYxLC4uLgorCW1vdmQJbW0wLFtlZGldCTttbTA9WzA6ZmlbIDBdXQorCW1vdmQJbW0xLFtlZGkrZWF4KjRdCTttbTE9WzA6ZmlbazFdXQorCXB1bnBja2xkcQltbTAsbW0wCTttbTA9W2ZpXzAgOmZpXzAgXQorCXB1bnBja2xkcQltbTEsbW0xCTttbTE9W2ZpX2sxOmZpX2sxXQorCW1vdmQJbW0yLFtlZGkrZWJ4KjRdCisJbW92ZAltbTMsW2VkaStlY3gqNF0KKwlwdW5wY2tsZHEJbW0yLG1tMgk7bW0yPVtmaV9rMjpmaV9rMl0KKwlwdW5wY2tsZHEJbW0zLG1tMwk7bW0zPVtmaV9rMzpmaV9rM10KKwlweG9yCW1tMSxtbTcJCTttbTE9Wy1maV9rMTpmaV9rMV0KKwlweG9yCW1tMyxtbTcJCTttbTM9Wy1maV9rMzpmaV9rM10KKwlwZmFkZAltbTAsbW0xCQk7bW0wPVtmMTpmMF09W2ZpXzAgLWZpX2sxIDogZmlfMCArZmlfazFdCisJcGZhZGQJbW0yLG1tMwkJO21tMj1bZjM6ZjJdPVtmaV9rMi1maV9rMyA6IGZpX2syK2ZpX2szXQorCW1vdnEJbW0zLG1tMAkJO21tMz1bZjE6ZjBdCisJcGZhZGQJbW0wLG1tMgkJO21tMD1bZjErZjM6ZjArZjJdCisJbW92ZAlbZWRpXSxtbTAJO2ZpWzBdPWYwK2YyCisJcHNybHEJbW0wLDMyCQk7bW0wPVswOmYxK2YzXQorCXBmc3ViCW1tMyxtbTIJCTttbTM9W2YxLWYzOmYwLWYyXQorCW1vdmQJW2VkaStlYXgqNF0sbW0wCTtmaVtrMV09ZjErZjMKKwltb3ZkCVtlZGkrZWJ4KjRdLG1tMwk7ZmlbazJdPWYwLWYyCisJcHNybHEJbW0zLDMyCQk7bW0zPVswOmYxLWYzXQorCW1vdmQJW2VkaStlY3gqNF0sbW0zCTtmaVtrM109ZjEtZjMKKworCW1vdmQJbW0wLFtlYnBdCTttbTA9WzA6Z2lfMF0KKwltb3ZkCW1tMSxbZWJwK2VheCo0XQk7bW0xPVswOmdpX2sxXQorCXB1bnBja2xkcQltbTAsbW0wCTttbTA9W2dpXzAgOmdpXzAgXQorCXB1bnBja2xkcQltbTEsbW0xCTttbTE9W2dpX2sxOmdpX2sxXQorCW1vdmQJbW0yLFtlYnArZWJ4KjRdCTttbTI9WzA6Z2lfazJdCisJcHhvcgltbTEsbW03CQk7bW0xPVstZ2lfazE6Z2lfazFdCisJcHVucGNrbGRxCW1tMixbZWJwK2VjeCo0XQk7bW0yPVtnaV9rMzpnaV9rMl0KKwlwZmFkZAltbTAsbW0xCQk7bW0wPVtnMTpnMF09W2dpXzAgLWdpX2sxOmdpXzAgK2dpX2sxXQorCXBmbXVsCW1tMixtbTYJCTttbTI9W2czOmcyXT1zcXJ0MiAqIFtnaV9rMzpnaV9rMl0KKwltb3ZxCW1tMSxtbTAJCTttbTE9W2cxOmcwXQorCXBmYWRkCW1tMCxtbTIJCTttbTA9W2cxK2czOmcwK2cyXQorCW1vdmQJW2VicF0sbW0wCTtnaVswXT1nMCtnMgorCXBzcmxxCW1tMCwzMgkJO21tMD1bMDpnMStnM10KKwlwZnN1YgltbTEsbW0yCQk7bW0xPVtnMS1nMzpnMC1nMl0KKwltb3ZkCVtlYnArZWF4KjRdLG1tMAk7Z2lbazFdPWcxK2czCisJbW92ZAlbZWJwK2VieCo0XSxtbTEJO2dpW2syXT1nMC1nMgorCXBzcmxxCW1tMSwzMgkJO21tMT1bMDpnMS1nM10KKwltb3ZkCVtlYnArZWN4KjRdLG1tMQk7Z2lbazNdPWcxLWczCisJbGVhCWVkaSxbZWRpK2VkeCo0XQk7ZmkgKz0gazQKKwlsZWEJZWJwLFtlYnArZWR4KjRdCTtnaSArPSBrNAorCWNtcAllZGksZXNpCisJamMJbmVhciAubHAzMQk7fXdoaWxlKGZpPGZuKTsKKworOwmks6SzpN6kx6TPwr/KrE8uSy4KKworCW1vdglmbixlc2kJCTtmbj1meituCisJO7yhpM7DzaTPsPqkrcKzpK27yKSmCisJO2VheD1rMSxlYng9azIsZWN4PWszLGVkeD1rNAorCisJbW92CWVkaSxrCisJbGVhCWVicCxbY29zdGFiX2ZmdCtlZGkqNF0KKwltb3YJZWJwLFtlYnBdCTtlYnA9dF9jCisJbW92CVt0X2MwXSxlYnAKKwltb3YJW3RfYzFdLGVicAk7dF9jCisJbGVhCWVicCxbc2ludGFiX2ZmdCtlZGkqNF0KKwltb3YJZWJwLFtlYnBdCTtlYng9dF9zCisJbW92CVt0X3MwXSxlYnAKKwl4b3IJZWJwLDB4ODAwMDAwMDAKKwltb3YJW3RfczFdLGVicAk7LXRfcworCisJbW92cQltbTEsW0RfMF8xXQk7bW0xPVswOjFdCisJbW92cQlbRF9zMWMxXSxtbTEJO21tMT1bczE6YzFdCisJbW92CWVzaSwxCQk7ZXNpPWk9MQorCisubHAzMjoJOwlmb3IoaT0xO2k8a3g7aSsrKXsKKwltb3ZxCW1tMCxbRF9zMWMxXQk7bW0xPVtzMTp0XT1bczE6YzFdCisJbW92cQltbTIsbW0wCisJcGZtdWwJbW0wLFt0X2MxXQk7bW0wPVstczEqdF9zOiB0KnRfY10KKwlwZm11bAltbTIsW3RfczBdCTttbTI9WyBzMSp0X2M6IHQqdF9zXQorCXBmYWNjCW1tMCxtbTIJCTttbTA9W3MxOmMxXT1bIHMxKnRfYyt0KnRfczotczEqdF9zK3QqdF9jXQorCW1vdnEJbW0yLG1tMAkJO21tMj1bczE6YzFdCisJbW92cQlbRF9zMWMxXSxtbTAJO8rdwrgKKwltb3ZxCW1tNixtbTIKKwlwdW5wY2tsZHEJbW01LG1tNgorCXB1bnBja2hkcQltbTYsbW01CTttbTY9WyBjMTpzMV0KKwlweG9yCW1tNixtbTcJCTttbTY9Wy1jMTpzMV0KKwltb3ZxCVtEX01jMXMxXSxtbTYJO8rdwrgKKwlwZm11bAltbTIsbW0yCQk7bW0yPVtzMSpzMTpjMSpjMV0KKwltb3ZxCW1tMyxtbTAJCTttbTM9W3MxOmMxXQorCXB4b3IJbW0yLG1tNwkJO21tMj1bLXMxKnMxOmMxKmMxXQorCXBzcmxxCW1tMywzMgkJO21tMz1bIDA6czFdCisJcGZhY2MJbW0yLG1tMgkJO21tMj1bYzI6YzJdPVtjMSpjMS1zMSpzMTo8XQorCXBmbXVsCW1tMCxtbTMJCTttbTA9WyAwOmMxKnMxXQorCXBmYWRkCW1tMCxtbTAJCTttbTA9WzA6czJdPVsgMDoyKmMxKnMxXQorCXB1bnBja2xkcQltbTIsbW0wCTttbTI9W3MyOmMyXQorCW1vdnEJW0RfczJjMl0sbW0yCTvK3cK4CisKKwlwdW5wY2tsZHEJbW0wLG1tMgorCXB1bnBja2hkcQltbTIsbW0wCTttbTI9W2MyOnMyXQorCXB4b3IJbW0yLG1tNwkJO21tMj1bLWMyOnMyXQorCW1vdnEJW0RfTWMyczJdLG1tMgk7yt3CuAorCisJbW92CWVkaSxbZXNwK19QKzRdCTtlZGk9ZnoKKwlsZWEJZWRpLFtlZGkrZXNpKjRdCTtlZGk9ZnoraQorCisJbW92CWVicCxbZXNwK19QKzRdCTtlYnA9ZnoKKwluZWcJZXNpCQk7ZXNpPS1pCisJbGVhCWVicCxbZWJwK2VheCo0XQk7ZWJwPWZ6K2sxCisJbGVhCWVicCxbZWJwK2VzaSo0XQk7ZWJwPWdpPWZ6K2sxLWkKKwluZWcJZXNpCQk7ZXNpPWkKKworLmxwMzM6CTsJZG97IEZMT0FUIGEsYixnMCxmMCxmMSxnMSxmMixnMixmMyxnMzsKKworCW1vdmQJbW0wLFtlZGkrZWF4KjRdCTttbTA9WzA6ZmlfazFdCisJcHVucGNrbGRxCW1tMCxbZWJwK2VheCo0XQk7bW0wPVtnaV9rMTpmaV9rMV0KKwltb3ZxCW1tMSxtbTAKKwlwZm11bAltbTAsW0RfczJjMl0JO21tMD1bIHMyKmdpX2sxOmMyKmZpX2sxXQorCXBmbXVsCW1tMSxbRF9NYzJzMl0JO21tMT1bLWMyKmdpX2sxOnMyKmZpX2sxXQorCXBmYWNjCW1tMCxtbTEJCTttbTA9W2I6YV0KKwltb3ZkCW1tNCxbZWRpXQk7bW00PVswOmZpXzBdCisJbW92cQltbTMsbW0wCQk7bW0zPVtiOmFdCisJcHVucGNrbGRxCW1tNCxbZWJwXQk7bW00PVtnaV8wOmZpXzBdCisJcGZhZGQJbW0zLG1tNAkJO21tMz1bZzA6ZjBdPVtnaV8wK2I6ZmlfMCthXQorCXBmc3ViCW1tNCxtbTAJCTttbTQ9W2cxOmYxXT1bZ2lfMC1iOmZpXzAtYV0KKworCW1vdmQJbW0wLFtlZGkrZWN4KjRdCTttbTA9WzA6ZmlfazNdCisJcHVucGNrbGRxCW1tMCxbZWJwK2VjeCo0XQk7bW0wPVtnaV9rMzpmaV9rM10KKwltb3ZxCW1tMSxtbTAKKwlwZm11bAltbTAsW0RfczJjMl0JO21tMD1bIHMyKmdpX2szOmMyKmZpX2szXQorCXBmbXVsCW1tMSxbRF9NYzJzMl0JO21tMT1bLWMyKmdpX2szOnMyKmZpX2szXQorCXBmYWNjCW1tMCxtbTEJCTttbTA9W2I6YV0KKwltb3ZkCW1tNSxbZWRpK2VieCo0XQk7bW01PVswOmZpX2syXQorCW1vdnEJbW02LG1tMAkJO21tNj1bYjphXQorCXB1bnBja2xkcQltbTUsW2VicCtlYngqNF0JO21tNT1bZ2lfazI6ZmlfazJdCisJcGZhZGQJbW02LG1tNQkJO21tNj1bZzI6ZjJdPVtnaV9rMitiOmZpX2syK2FdCisJcGZzdWIJbW01LG1tMAkJO21tNT1bZzM6ZjNdPVtnaV9rMi1iOmZpX2syLWFdCisKKwlwdW5wY2tsZHEJbW0xLG1tNgk7bW0xPVtmMjoqXQorCW1vdnEJbW0wLFtEX3MxYzFdCTttbTA9W3MxOmMxXQorCXB1bnBja2hkcQltbTEsbW01CTttbTE9W2czOmYyXQorCXBmbXVsCW1tMCxtbTEJCTttbTA9WyBzMSpnMzpjMSpmMl0KKwltb3ZxCW1tMixbRF9NYzFzMV0JO21tMj1bLWMxOnMxXQorCXBmbXVsCW1tMixtbTEJCTttbTI9Wy1jMSpnMzpzMSpmMl0KKwlwZmFjYwltbTAsbW0yCQk7bW0wPVtiOmFdCisKKwlwdW5wY2tsZHEJbW0xLG1tMwk7bW0xPVtmMDoqXQorCXB1bnBja2hkcQltbTEsbW00CTttbTE9W2cxOmYwXQorCW1vdnEJbW0yLG1tMAkJO21tMj1bYjphXQorCXBmYWRkCW1tMCxtbTEJCTttbTA9W2cxK2I6ZjArYV0KKwlwZnN1YnIJbW0yLG1tMQkJO21tMj1bZzEtYjpmMC1hXQorCW1vdmQJW2VkaV0sbW0wCTtmaVswXT1mMCthCisJcHNybHEJbW0wLDMyCQk7bW0wPVswOmcxK2JdCisJbW92ZAlbZWRpK2VieCo0XSxtbTIJO2ZpW2syXT1mMC1hCisJcHNybHEJbW0yLDMyCQk7bW0yPVswOmcxLWJdCisJbW92ZAlbZWJwK2VheCo0XSxtbTAJO2dpW2sxXT1nMStiCisJbW92ZAlbZWJwK2VjeCo0XSxtbTIJO2dpW2szXT1nMS1iCisJcHNybHEJbW02LDMyCQk7bW02PVswOmcyXQorCW1vdnEJbW0wLFtEX3MxYzFdCTttbTA9W3MxOmMxXQorCXB1bnBja2xkcQltbTUsbW02CTttbTU9W2cyOmYzXQorCXBmbXVsCW1tMCxtbTUJCTttbTA9W2cyKiBzMTpmMypjMV0KKwlwZm11bAltbTUsW0RfTWMxczFdCTttbTU9W2cyKi1jMTpmMypzMV0KKwlwZmFjYwltbTAsbW01CQk7bW0wPVstYjphXQorCXBzcmxxCW1tMywzMgkJO21tMz1bMDpnMF0KKwltb3ZxCW1tMSxtbTAJCTttbTE9Wy1iOmFdCisJcHVucGNrbGRxCW1tMyxtbTQJO21tMz1bZjE6ZzBdCisJcGZhZGQJbW0wLG1tMwkJO21tMD1bZjEtYjpnMCthXQorCXBmc3VicgltbTEsbW0zCQk7bW0xPVtmMStiOmcwLWFdCisJbW92ZAlbZWJwXSxtbTAJO2dpWzBdPWcwK2EKKwlwc3JscQltbTAsMzIJCTttbTA9WzA6ZjEtYl0KKwltb3ZkCVtlYnArZWJ4KjRdLG1tMQk7Z2lbazJdPWcwLWEKKwlwc3JscQltbTEsMzIJCTttbTE9WzA6ZjErYl0KKwltb3ZkCVtlZGkrZWN4KjRdLG1tMAk7ZmlbazNdPWYxLWIKKwltb3ZkCVtlZGkrZWF4KjRdLG1tMQk7ZmlbazFdPWYxK2IKKworCWxlYQllZGksW2VkaStlZHgqNF0JO2ZpICs9IGs0CisJbGVhCWVicCxbZWJwK2VkeCo0XQk7Z2kgKz0gazQKKwljbXAJZWRpLGZuCisJamMJbmVhciAubHAzMwk7fXdoaWxlKGZpPGZuKQorCWluYwllc2kKKwljbXAJZXNpLGt4CisJam56CW5lYXIgLmxwMzIJO30KKwljbXAJZWR4LFtlc3ArX1ArOF0KKwlqbnoJbmVhciAubHAzMAk7fXdoaWxlKGs0PG4pCisKKworLmV4aXQ6CisJYWRkCWVzcCxMT0NBTF9TVEFDSworCWZlbW1zCisJcG9wCWVicAorCXBvcAllZGkKKwlwb3AJZXNpCisJcG9wCWVieAorCXJldApkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9pMzg2L2ZmdDNkbi5uYXMgYi9saWJtcDNsYW1lL2kzODYvZmZ0M2RuLm5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRiN2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9pMzg2L2ZmdDNkbi5uYXMKQEAgLTAsMCArMSw0ODggQEAKKzsgZnJvbSBhIG5ldyBHT0dPLW5vLWNvZGEgKDE5OTkvMDkpCis7CUNvcHlyaWdodCAoQykgMTk5OSBzaGlnZW8KKzsJc3BlY2lhbCB0aGFua3MgdG8gS2VpaWNoaSBTQUtBSSwgVVJVUkkKKzsgaGFja2VkIGFuZCBiYWNrLXBvcnRlZCB0byBMQU1FCis7CSBieSBUYWtlaGlybyBUT01JTkFHQSBOb3YgMjAwMAorCislaW5jbHVkZSAibmFzbS5oIgorCisJZ2xvYmFsZGVmIGZodF8zRE4KKworCXNlZ21lbnRfZGF0YQorCWFsaWduCTE2Citjb3N0YWIJZGQJMHg4MDAwMDAwMCwgMAorCWRkCTEuNDE0MjEzNTYyLDEuNDE0MjEzNTYyCisJZGQJOS4yMzg3OTUyODMyOTM4MDVlLTAxLCA5LjIzODc5NTI4MzI5MzgwNWUtMDEKKwlkZAkzLjgyNjgzNDQyNDYxMTA0NGUtMDEsIDMuODI2ODM0NDI0NjExMDQ0ZS0wMQorCWRkCTkuOTUxODQ3MjY0MDQ0MTc4ZS0wMSwgOS45NTE4NDcyNjQwNDQxNzhlLTAxCisJZGQJOS44MDE3MTQzMDQ4MzY3MzRlLTAyLCA5LjgwMTcxNDMwNDgzNjczNGUtMDIKKwlkZAk5Ljk5Njk4ODE4Njc5NDQyOGUtMDEsIDkuOTk2OTg4MTg2Nzk0NDI4ZS0wMQorCWRkCTIuNDU0MTIyOTIwNTY5NzA1ZS0wMiwgMi40NTQxMjI5MjA1Njk3MDVlLTAyCisJZGQJOS45OTk4MTE3NTI4MTU1MzVlLTAxLCA5Ljk5OTgxMTc1MjgxNTUzNWUtMDEKKwlkZAk2LjEzNTg4NDgxOTg5ODg3OGUtMDMsIDYuMTM1ODg0ODE5ODk4ODc4ZS0wMworRF8xXzBfMF8wCWRkCTAuMAkJLCAxLjAKKworCXNlZ21lbnRfY29kZQorCitQSUNfT0ZGU0VUVEFCTEUKKworCis7dm9pZCBmaHRfM0ROKGZsb2F0ICpmeiwgaW50IG5uKTsKKworcHJvYwlmaHRfM0ROCisKKwlwdXNoZAllYnAsIGVieCwgZXNpLCBlZGkKKworCXN1Ygllc3AsIDIwCisKKwljYWxsCWdldF9wYy5icAorCWFkZAllYnAsIFBJQ19CQVNFKCkKKworCW1vdglyMCwgW2VzcCs0MF0JCTtmaQorCW1vdglyMSwgW2VzcCs0NF0JCTtyMSA9IG5uCisJbGVhCXIzLCBbUElDX0VCUF9SRUwoY29zdGFiKV0JCTt0cmkgPSBjb3N0YWIKKwlsZWEJcjQsIFtyMCtyMSo4XQkJO3I0ID0gZm4gPSAmZnpbbl0KKwltb3YJW2VzcCsxNl0sIHI0CisJbW92CXI0LCA4CQkJO2t4ID0gazEvMgorCisJcG1vdgltbTcsIFtyM10KKworCWxvb3BhbGlnbiAxNgorLmRvMQorCWxlYQlyMywgW3IzKzE2XQk7dHJpICs9IDI7CisJcG1vdgltbTYsIFtQSUNfRUJQX1JFTChjb3N0YWIrOCldCisJbGVhCXIyLCBbcjQrcjQqMl0JCTtrMypmc2l6ZS8yCisJbW92CXI1LCA0CQk7aSA9IDEqZnNpemUKKworCWxvb3BhbGlnbiAxNgorLmRvMjoKKwlsZWEJcjEsIFtyMCtyNF0JCTtnaSA9IGZpICsga3gKKwk7ZgorCXBtb3YJbW0wLCBbcjBdCTtmaTAKKwlwbW92CW1tMSwgW3IwK3I0KjJdCTtmaTEKKwlwbW92CW1tMiwgW3IwK3IyKjJdCTtmaTMKKwlwbW92CW1tMywgW3IwK3I0KjRdCTtmaTIKKworCXB1cGxkcQltbTAsIG1tMAk7ZmkwIHwgZmkwCisJcHVwbGRxCW1tMSwgbW0xCTtmaTEgfCBmaTEKKwlwdXBsZHEJbW0yLCBtbTIJO2ZpMiB8IGZpMgorCXB1cGxkcQltbTMsIG1tMwk7ZmkzIHwgZmkzCisKKwlweG9yCW1tMSwgbW03CTtmaTEgfCAtZmkxCisJcHhvcgltbTMsIG1tNwk7ZmkzIHwgLWZpMworCisJcGZzdWIJbW0wLCBtbTEJO2YxIHwgZjAKKwlwZnN1YgltbTIsIG1tMwk7ZjMgfCBmMgorCisJcG1vdgltbTQsIG1tMAorCXBmYWRkCW1tMCwgbW0yCTtmMStmM3xmMCtmMiA9IGZpMSB8IGZpMAorCXBmc3ViCW1tNCwgbW0yCTtmMS1mM3xmMC1mMiA9IGZpMyB8IGZpMgorCisJcG1vdmQJW3IwXSwgbW0wCTtmaVswXQorCXB1cGhkcQltbTAsIG1tMAorCXBtb3ZkCVtyMCtyNCo0XSwgbW00CTtmaVtrMl0KKwlwdXBoZHEJbW00LCBtbTQKKworCXBtb3ZkCVtyMCtyNCoyXSwgbW00CTtmaVtrMV0KKwlwbW92ZAlbcjArcjIqMl0sIG1tMAk7ZmlbazNdCisJbGVhCXIwLCBbcjArcjQqOF0KKworCTtnCisJcG1vdgltbTAsIFtyMV0JO2dpMAorCXBtb3YJbW0xLCBbcjErcjQqMl0JO2dpMQorCXBtb3YJbW0yLCBbcjErcjQqNF0JO2dpMgorCXBtb3YJbW0zLCBbcjErcjIqMl0JO2dpMworCisJcHVwbGRxCW1tMSwgbW0xCisJcHVwbGRxCW1tMCwgbW0wCTtnaTAgfCBnaTAKKwlwdXBsZHEJbW0yLCBtbTMJO2dpMyB8IGdpMgorCisJcHhvcgltbTEsIG1tNwk7Z2kxIHwgLWdpMQorCisJcGZzdWIJbW0wLCBtbTEJO2dpMC1naTF8Z2kwK2dpMSA9IGcxIHwgZzAKKwlwZm11bAltbTIsIG1tNgk7Z2kzKlNRUlQyfGdpMipTUVJUMiA9IGczIHwgZzIKKworCXBtb3YJbW00LCBtbTAKKwlwZmFkZAltbTAsIG1tMgk7ZzErZzN8ZzArZzIgPSBnaTEgfCBnaTAKKwlwZnN1YgltbTQsIG1tMgk7ZzEtZzN8ZzAtZzIgPSBnaTMgfCBnaTIKKworCXBtb3ZkCVtyMV0sIG1tMAk7Z2lbMF0KKwlwdXBoZHEJbW0wLCBtbTAKKwlwbW92ZAlbcjErcjQqNF0sIG1tNAk7Z2lbazJdCisJcHVwaGRxCW1tNCwgbW00CisKKwljbXAJcjAsIFtlc3AgKyAxNl0KKwlwbW92ZAlbcjErcjQqMl0sIG1tMAk7Z2lbazFdCisJcG1vdmQJW3IxK3IyKjJdLCBtbTQJO2dpW2szXQorCisJamIgbmVhciAuZG8yCisKKwlwbW92CW1tNiwgW3IzK3I1XQk7IHRoaXMgaXMgbm90IGFsaWduZWQgYWRkcmVzcyEhCisKKwlsb29wYWxpZ24gMTYKKy5mb3I6Cis7Cis7IG1tNiA9IGMxIHwgczEKKzsgbW03ID0gMHg4MDAwMDAwMDAgfCAwCis7CisJcG1vdgltbTEsIG1tNgorCW1vdglyMCwgW2VzcCs0MF0JOyBmegorCXB1cGhkcQltbTEsIG1tMQk7IGMxIHwgYzEKKwlsZWEJcjEsIFtyMCtyNCoyXQorCXBmYWRkCW1tMSwgbW0xCTsgYzErYzEgfCBjMStjMQorCXBmbXVsCW1tMSwgbW02CTsgMipjMSpjMSB8IDIqYzEqczEKKwlwZnN1YgltbTEsIFtQSUNfRUJQX1JFTChEXzFfMF8wXzApXSA7IDIqYzEqYzEtMS4wIHwgMipjMSpzMSA9IC1jMiB8IHMyCisKKwlwbW92CW1tMCwgbW0xCisJcHhvcgltbTcsIG1tNgk7IGMxIHwgLXMxCisKKwlwdXBsZHEJbW0yLCBtbTAKKwlwdXBsZHEJbW0zLCBtbTYJOyAqKiB8IGMxCisJcHVwaGRxCW1tMCwgbW0yCTsgczIgfCBjMgorCXB1cGhkcQltbTYsIG1tMwk7LXMxIHwgYzEKKworCXB4b3IJbW0wLCBbUElDX0VCUF9SRUwoY29zdGFiKV0JOyBjMiB8IC1zMgorCis7IG1tMCA9ICBzMnwgYzIKKzsgbW0xID0gLWMyfCBzMgorOyBtbTYgPSAgYzF8IHMxCis7IG1tNyA9ICBzMXwtYzEgKHdlIHVzZSB0aGUgb3Bwb3NpdGUgc2lnbi4gZnJvbSBHT0dPIGhlcmUpCisKKwlwbW92CVtlc3BdLCBtbTAKKwlwbW92CVtlc3ArOF0sIG1tMQorCisJc3ViCXIxLCByNQkJO3IxID0gZ2kKKwlhZGQJcjAsIHI1CQk7cjAgPSBmaQorCisJbG9vcGFsaWduIDE2CisuZG8zOgorCXBtb3YJbW0yLCBbcjArcjQqMl0gOyBmaVtrMV0KKwlwbW92CW1tNCwgW3IxK3I0KjJdIDsgZ2lbazFdCisJcG1vdgltbTMsIFtyMCtyMioyXSA7IGZpW2szXQorCXBtb3YJbW01LCBbcjErcjIqMl0gOyBnaVtrM10KKworCXB1cGxkcQltbTIsIG1tMgk7IGZpMSB8IGZpMQorCXB1cGxkcQltbTQsIG1tNAk7IGdpMSB8IGdpMQorCXB1cGxkcQltbTMsIG1tMwk7IGZpMyB8IGZpMworCXB1cGxkcQltbTUsIG1tNQk7IGdpMyB8IGdpMworCisJcGZtdWwJbW0yLCBtbTAJOyBzMiAqIGZpMSB8IGMyICogZmkxCisJcGZtdWwJbW00LCBtbTEJOy1jMiAqIGdpMSB8IHMyICogZ2kxCisJcGZtdWwJbW0zLCBtbTAJOyBzMiAqIGZpMyB8IGMyICogZmkzCisJcGZtdWwJbW01LCBtbTEJOy1jMiAqIGdpMyB8IHMyICogZ2kzCisKKwlwZmFkZAltbTIsIG1tNAkJO2IgfCBhCisJcGZhZGQJbW0zLCBtbTUJCTtkIHwgYworCisJcG1vdgltbTAsIFtyMF0KKwlwbW92CW1tNCwgW3IxXQorCXBtb3YJbW0xLCBbcjArcjQqNF0KKwlwbW92CW1tNSwgW3IxK3I0KjRdCisKKwlwdXBsZHEJbW0wLCBtbTQJCTtnaTAgfCBmaTAKKwlwdXBsZHEJbW0xLCBtbTUJCTtnaTIgfCBmaTIKKworCXBtb3YJbW00LCBtbTIKKwlwbW92CW1tNSwgbW0zCisKKwlwZmFkZAltbTIsIG1tMAkJO2cwIHwgZjAKKwlwZmFkZAltbTMsIG1tMQkJO2cyIHwgZjIKKworCXBmc3ViCW1tMCwgbW00CQk7ZzEgfCBmMQorCXBmc3ViCW1tMSwgbW01CQk7ZzMgfCBmMworCisJcG1vdgltbTQsIG1tMworCXBtb3YJbW01LCBtbTEKKworCXB1cGxkcQltbTQsIG1tNAkJO2YyIHwgZjIKKwlwdXBoZHEJbW01LCBtbTUJCTtnMyB8IGczCisJcHVwaGRxCW1tMywgbW0zCQk7ZzIgfCBnMgorCXB1cGxkcQltbTEsIG1tMQkJO2YzIHwgZjMKKworCXBmbXVsCW1tNCwgbW02CQk7ZjIgKiBjMSB8IGYyICogczEKKwlwZm11bAltbTUsIG1tNwkJO2czICogczEgfCBnMyAqLWMxCisJcGZtdWwJbW0zLCBtbTYJCTtnMiAqIGMxIHwgZzIgKiBzMQorCXBmbXVsCW1tMSwgbW03CQk7ZjMgKiBzMSB8IGYzICotYzEKKworCXBmYWRkCW1tNCwgbW01CQk7YSB8IGIKKwlwZnN1YgltbTMsIG1tMQkJO2QgfCBjCisKKwlwbW92CW1tNSwgbW0yCisJcG1vdgltbTEsIG1tMAorCisJcHVwbGRxCW1tMiwgbW0yCQk7ZjAgfCBmMAorCXB1cGxkcQltbTAsIG1tMAkJO2YxIHwgZjEKKworCXB1cGhkcQltbTEsIG1tMgkJO2YwIHwgZzEKKwlwdXBoZHEJbW01LCBtbTAJCTtmMSB8IGcwCisKKwlwbW92CW1tMiwgbW00CisJcG1vdgltbTAsIG1tMworCisJcGZhZGQJbW00LCBtbTEJCTtmaTAgfCBnaTEKKwlwZmFkZAltbTMsIG1tNQkJO2ZpMSB8IGdpMAorCXBmc3ViCW1tMSwgbW0yCQk7ZmkyIHwgZ2kzCisJcGZzdWIJbW01LCBtbTAJCTtmaTMgfCBnaTIKKworCXBtb3ZkCVtyMStyNCoyXSwgbW00CTtnaVtrMV0KKwlwdXBoZHEJbW00LCBtbTQKKwlwbW92ZAlbcjFdLCBtbTMJCTtnaVswXQorCXB1cGhkcQltbTMsIG1tMworCXBtb3ZkCVtyMStyMioyXSwgbW0xCTtnaVtrM10KKwlwdXBoZHEJbW0xLCBtbTEKKwlwbW92ZAlbcjErcjQqNF0sIG1tNQk7Z2lbazJdCisJcHVwaGRxCW1tNSwgbW01CisKKwlwbW92ZAlbcjBdLCBtbTQJO2ZpWzBdCisJcG1vdmQJW3IwK3I0KjJdLCBtbTMJO2ZpW2sxXQorCXBtb3ZkCVtyMCtyNCo0XSwgbW0xCTtmaVtrMl0KKwlwbW92ZAlbcjArcjIqMl0sIG1tNQk7ZmlbazNdCisKKwlsZWEJcjAsIFtyMCtyNCo4XQorCWxlYQlyMSwgW3IxK3I0KjhdCisJY21wCXIwLCBbZXNwICsgMTZdCisJcG1vdgltbTAsIFtlc3BdCisJcG1vdgltbTEsIFtlc3ArOF0KKworCWpiIG5lYXIJLmRvMworCisJYWRkCXI1LCA0Cis7IG1tNiA9ICBjMXwgczEKKzsgbW03ID0gIHMxfC1jMSAod2UgdXNlIHRoZSBvcHBvc2l0ZSBzaWduLiBmcm9tIEdPR08gaGVyZSkKKwlwZm11bAltbTYsIFtyM10JOyBjMSphIHwgczEqYQorCXBmbXVsCW1tNywgW3IzKzhdCTsgczEqYiB8LWMxKmIKKwljbXAJcjUsIHI0CisKKwlwZnN1YgltbTYsIG1tNwk7IGMxKmEtczEqYiB8IHMxKmErYzEqYgorCXB1cGxkcQltbTcsbW02CisJcHVwaGRxCW1tNixtbTcKKwlwbW92CW1tNywgW1BJQ19FQlBfUkVMKGNvc3RhYildCisJamIgbmVhcgkuZm9yCisKKwltb3YJcjAsIFtlc3ArNDBdCTtmaQorCWNtcAlyNCwgW2VzcCs0MCs0XQorCWxlYQlyNCwgW3I0KjRdCTtreCAqPSA0CisKKwlqYiBuZWFyCS5kbzEKKy5leGl0dHR0CisJZmVtbXMKKwlhZGQJZXNwLDIwCisJcG9wZAllYnAsIGVieCwgZXNpLCBlZGkKK2VuZHByb2MKKworCis7dm9pZCBmaHRfRTNETihmbG9hdCAqZnosIGludCBubik7CisKK3Byb2MJZmh0X0UzRE4KKworCXB1c2hkCWVicCwgZWJ4LCBlc2ksIGVkaQorCisJc3ViCWVzcCwgMjAKKworCWNhbGwJZ2V0X3BjLmJwCisJYWRkCWVicCwgUElDX0JBU0UoKQorCisJbW92CXIwLCBbZXNwKzQwXQkJO2ZpCisJbW92CXIxLCBbZXNwKzQ0XQkJO3IxID0gbm4KKwlsZWEJcjMsIFtQSUNfRUJQX1JFTChjb3N0YWIpXQkJO3RyaSA9IGNvc3RhYgorCWxlYQlyNCwgW3IwK3IxKjhdCQk7cjQgPSBmbiA9ICZmeltuXQorCW1vdglbZXNwKzE2XSwgcjQKKwltb3YJcjQsIDgJCQk7a3ggPSBrMS8yCisKKwlwbW92CW1tNywgW3IzXQorCisJbG9vcGFsaWduIDE2CisuZG8xCisJbGVhCXIzLCBbcjMrMTZdCTt0cmkgKz0gMjsKKwlwbW92CW1tNiwgW1BJQ19FQlBfUkVMKGNvc3RhYis4KV0KKwlsZWEJcjIsIFtyNCtyNCoyXQkJO2szKmZzaXplLzIKKwltb3YJcjUsIDQJCTtpID0gMSpmc2l6ZQorCisJbG9vcGFsaWduIDE2CisuZG8yOgorCWxlYQlyMSwgW3IwK3I0XQkJO2dpID0gZmkgKyBreAorO2YKKwlwbW92CW1tMCwgW3IwXQk7IFggIHwgZmkwCisJcG1vdgltbTEsIFtyMCtyNCo0XQk7IFggIHwgZmkyCisJcHVwbGRxCW1tMCwgW3IwK3I0KjJdCTtmaTEgfCBmaTAKKwlwdXBsZHEJbW0xLCBbcjArcjIqMl0JO2ZpMyB8IGZpMgorCXBmcG5hY2MJbW0wLCBtbTAJO2ZpMCtmaTEgfCBmaTAtZmkxID0gZjB8ZjEKKwlwZnBuYWNjCW1tMSwgbW0xCTtmaTIrZmkzIHwgZmkyLWZpMyA9IGYyfGYzCisKKwlwbW92CW1tMiwgbW0wCisJcGZhZGQJbW0wLCBtbTEJO2YwK2YyfGYxK2YzID0gZmkwIHwgZmkxCisJcGZzdWIJbW0yLCBtbTEJO2YwLWYyfGYxLWYzID0gZmkyIHwgZmkzCisKKwlwbW92ZAlbcjArcjQqMl0sIG1tMAk7ZmlbazFdCisJcG1vdmQJW3IwK3IyKjJdLCBtbTIJO2ZpW2szXQorCisJcHVwaGRxCW1tMCwgbW0wCisJcHVwaGRxCW1tMiwgbW0yCisJcG1vdmQJW3IwXSwgbW0wCTtmaVswXQorCXBtb3ZkCVtyMCtyNCo0XSwgbW0yCTtmaVtrMl0KKworCWxlYQlyMCwgW3IwK3I0KjhdCis7ZworCXBtb3YJbW0zLCBbcjFdCTsgICAgZ2kwCisJcG1vdgltbTQsIFtyMStyMioyXQk7ICAgIGdpMworCXB1cGxkcQltbTMsIFtyMStyNCoyXQk7Z2kxfGdpMAorCXB1cGxkcQltbTQsIFtyMStyNCo0XQk7Z2kyfGdpMworCisJcGZwbmFjYwltbTMsIG1tMwk7Z2kwK2dpMSAgfGdpMC1naTEgICA9IGYwfGYxCisJcGZtdWwJbW00LCBtbTYJO2dpMipTUVJUMnxnaTMqU1FSVDIgPSBmMnxmMworCisJcG1vdgltbTUsIG1tMworCXBmYWRkCW1tMywgbW00CTtmMCtmMnxmMStmMworCXBmc3ViCW1tNSwgbW00CTtmMC1mMnxmMS1mMworCisJY21wCXIwLCBbZXNwICsgMTZdCisJcG1vdmQJW3IxK3I0KjJdLCBtbTMJO2dpW2sxXQorCXBtb3ZkCVtyMStyMioyXSwgbW01CTtnaVtrM10KKwlwdXBoZHEJbW0zLCBtbTMKKwlwdXBoZHEJbW01LCBtbTUKKwlwbW92ZAlbcjFdLCBtbTMJO2dpWzBdCisJcG1vdmQJW3IxK3I0KjRdLCBtbTUJO2dpW2syXQorCisJamIgbmVhciAuZG8yCisKKwlwbW92CW1tNiwgW3IzK3I1XQk7IHRoaXMgaXMgbm90IGFsaWduZWQgYWRkcmVzcyEhCisKKwlsb29wYWxpZ24gMTYKKy5mb3I6Cis7Cis7IG1tNiA9IGMxIHwgczEKKzsgbW03ID0gMHg4MDAwMDAwMDAgfCAwCis7CisJcG1vdgltbTUsIG1tNgorCW1vdglyMCwgW2VzcCs0MF0JOyBmegorCXB1cGhkcQltbTUsIG1tNQk7IGMxIHwgYzEKKwlsZWEJcjEsIFtyMCtyNCoyXQorCXBmYWRkCW1tNSwgbW01CTsgYzErYzEgfCBjMStjMQorCXBmbXVsCW1tNSwgbW02CTsgMipjMSpjMSB8IDIqYzEqczEKKwlwZnN1YgltbTUsIFtQSUNfRUJQX1JFTChEXzFfMF8wXzApXSA7IDIqYzEqYzEtMS4wIHwgMipjMSpzMSA9IC1jMiB8IHMyCisKKwlwc3dhcGQJbW00LCBtbTUJOyBzMiB8LWMyCisJcHhvcgltbTQsIG1tNwk7IHMyIHwgYzIKKwlweG9yCW1tNywgbW02CTsgYzEgfC1zMQorCXBzd2FwZAltbTYsIG1tNgk7IHMxIHwgYzEKKworOyBtbTQgPSAgczJ8IGMyCis7IG1tNSA9IC1jMnwgczIKKzsgbW02ID0gIGMxfCBzMQorOyBtbTcgPSAgczF8LWMxICh3ZSB1c2UgdGhlIG9wcG9zaXRlIHNpZ24uIGZyb20gR09HTyBoZXJlKQorCisJcG1vdglbZXNwXSwgbW00CisJcG1vdglbZXNwKzhdLCBtbTUKKworCXN1YglyMSwgcjUJCTtyMSA9IGdpCisJYWRkCXIwLCByNQkJO3IwID0gZmkKKworCWxvb3BhbGlnbiAxNgorLmRvMzoKKwlwbW92CW1tMCwgW3IwK3IyKjJdIDsgZmlbazFdCisJcG1vdgltbTIsIFtyMStyMioyXSA7IGdpW2sxXQorCXBtb3YJbW0xLCBbcjArcjQqMl0gOyBmaVtrM10KKwlwbW92CW1tMywgW3IxK3I0KjJdIDsgZ2lbazNdCisKKwlwdXBsZHEJbW0wLCBtbTAKKwlwdXBsZHEJbW0yLCBtbTIKKwlwdXBsZHEJbW0xLCBtbTEKKwlwdXBsZHEJbW0zLCBtbTMKKworCXBmbXVsCW1tMCwgbW00CisJcGZtdWwJbW0yLCBtbTUKKwlwZm11bAltbTEsIG1tNAorCXBmbXVsCW1tMywgbW01CisKKwlwZmFkZAltbTAsIG1tMgkJO2QgfCBjCisJcGZhZGQJbW0xLCBtbTMJCTtiIHwgYQorCisJcG1vdgltbTIsIFtyMCtyNCo0XQkJO2ZpMgorCXB1cGxkcQltbTMsIFtyMStyNCo0XQkJO2dpMiB8IC0KKwlwbW92CW1tNCwgW3IwXQkJO2ZpMAorCXB1cGxkcQltbTUsIFtyMV0JCTtnaTAgfCAtCisKKwlwdXBsZHEJbW0yLCBtbTAJCTtjIHwgZmkyCisJcHVwaGRxCW1tMywgbW0wCQk7ZCB8IGdpMgorCXB1cGxkcQltbTQsIG1tMQkJO2EgfCBmaTAKKwlwdXBoZHEJbW01LCBtbTEJCTtiIHwgZ2kwCisKKwlwZnBuYWNjCW1tMiwgbW0yCQk7ZjIgfCBmMworCXBmcG5hY2MJbW0zLCBtbTMJCTtnMiB8IGczCisJcGZwbmFjYwltbTQsIG1tNAkJO2YwIHwgZjEKKwlwZnBuYWNjCW1tNSwgbW01CQk7ZzAgfCBnMQorCisJcG1vdgltbTAsIG1tMgorCXBtb3YJbW0xLCBtbTMKKwlwdXBsZHEJbW0yLCBtbTIJCTtmMyB8IGYzCisJcHVwbGRxCW1tMywgbW0zCQk7ZzMgfCBnMworCXB1cGhkcQltbTAsIG1tMAkJO2YyIHwgZjIKKwlwdXBoZHEJbW0xLCBtbTEJCTtnMiB8IGcyCisKKwlwc3dhcGQJbW00LCBtbTQJCTtmMSB8IGYwCisJcHN3YXBkCW1tNSwgbW01CQk7ZzEgfCBnMAorCisJcGZtdWwJbW0wLCBtbTcJCTtmMiAqIHMxIHwgZjIgKi1jMQorCXBmbXVsCW1tMywgbW02CQk7ZzMgKiBjMSB8IGczICogczEKKwlwZm11bAltbTEsIG1tNgkJO2cyICogYzEgfCBnMiAqIHMxCisJcGZtdWwJbW0yLCBtbTcJCTtmMyAqIHMxIHwgZjMgKi1jMQorCisJcGZzdWIJbW0wLCBtbTMJCTsgYiB8LWEKKwlwZnN1YgltbTEsIG1tMgkJOyBkIHwgYworCisJcG1vdgltbTIsIG1tNQorCXBtb3YJbW0zLCBtbTQKKwlwdXBsZHEJbW00LCBtbTAJCTstYSB8IGYwCisJcHVwbGRxCW1tNSwgbW0xCQk7IGMgfCBnMAorCXB1cGhkcQltbTIsIG1tMAkJOyBiIHwgZzEKKwlwdXBoZHEJbW0zLCBtbTEJCTsgZCB8IGYxCisKKwlwZnBuYWNjCW1tNCwgbW00CQk7ZmkyIHwgZmkwCisJcGZwbmFjYwltbTUsIG1tNQkJO2dpMCB8IGdpMgorCXBmcG5hY2MJbW0yLCBtbTIJCTtnaTEgfCBnaTMKKwlwZnBuYWNjCW1tMywgbW0zCQk7ZmkxIHwgZmkzCisKKwlwbW92ZAlbcjBdLCBtbTQJCTtmaVswXQorCXBtb3ZkCVtyMStyNCo0XSwgbW01CQk7Z2lbazJdCisJcG1vdmQJW3IxK3IyKjJdLCBtbTIJCTtnaVtrM10KKwlwbW92ZAlbcjArcjIqMl0sIG1tMwkJO2ZpW2szXQorCisJcHVwaGRxCW1tNCwgbW00CisJcHVwaGRxCW1tNSwgbW01CisJcHVwaGRxCW1tMiwgbW0yCisJcHVwaGRxCW1tMywgbW0zCisJcG1vdmQJW3IwK3I0KjRdLCBtbTQJCTtmaVtrMl0KKwlwbW92ZAlbcjFdLCBtbTUJCTtnaVswXQorCXBtb3ZkCVtyMStyNCoyXSwgbW0yCQk7Z2lbazFdCisJcG1vdmQJW3IwK3I0KjJdLCBtbTMJCTtmaVtrMV0KKworCWxlYQlyMCwgW3IwK3I0KjhdCisJbGVhCXIxLCBbcjErcjQqOF0KKwljbXAJcjAsIFtlc3AgKyAxNl0KKwlwbW92CW1tNCwgW2VzcF0KKwlwbW92CW1tNSwgW2VzcCs4XQorCisJamIgbmVhcgkuZG8zCisKKwlhZGQJcjUsIDQKKzsgbW02ID0gIGMxfCBzMQorOyBtbTcgPSAgczF8LWMxICh3ZSB1c2UgdGhlIG9wcG9zaXRlIHNpZ24uIGZyb20gR09HTyBoZXJlKQorCXBmbXVsCW1tNiwgW3IzXQk7IGMxKmEgfCBzMSphCisJcGZtdWwJbW03LCBbcjMrOF0JOyBzMSpiIHwtYzEqYgorCWNtcAlyNSwgcjQKKworCXBmc3ViCW1tNiwgbW03CTsgYzEqYS1zMSpiIHwgczEqYStjMSpiCisJcHN3YXBkCW1tNiwgbW02IDsgPz8/CTsgczEqYStjMSpiIHwgYzEqYS1zMSpiCisJcG1vdgltbTcsIFtQSUNfRUJQX1JFTChjb3N0YWIpXQorCWpiIG5lYXIJLmZvcgorCisJbW92CXIwLCBbZXNwKzQwXQk7ZmkKKwljbXAJcjQsIFtlc3ArNDArNF0KKwlsZWEJcjQsIFtyNCo0XQk7a3ggKj0gNAorCisJamIgbmVhcgkuZG8xCisuZXhpdHR0dAorCWZlbW1zCisJYWRkCWVzcCwyMAorCXBvcGQJZWJwLCBlYngsIGVzaSwgZWRpCitlbmRwcm9jCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2kzODYvZmZ0ZnB1Lm5hcyBiL2xpYm1wM2xhbWUvaTM4Ni9mZnRmcHUubmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTg5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2kzODYvZmZ0ZnB1Lm5hcwpAQCAtMCwwICsxLDYxOSBAQAorOyBiYWNrIHBvcnQgZnJvbSBHT0dPLW5vIGNvZGEgMi4yNGIgYnkgVGFrZWhpcm8gVE9NSU5BR0EKKworOyBHT0dPLW5vLWNvZGEKKzsJQ29weXJpZ2h0IChDKSAxOTk5IHNoaWdlbworOwlzcGVjaWFsIHRoYW5rcyB0byBVUlVSSQorCislaW5jbHVkZSAibmFzbS5oIgorCisJZXh0ZXJuZGVmIGNvc3RhYl9mZnQKKwlleHRlcm5kZWYgc2ludGFiX2ZmdAorCisJc2VnbWVudF9kYXRhCisJYWxpZ24gMzIKK0RfMV80MTQyMQlkZAkxLjQxNDIxMzU2CitEXzFfMAlkZAkxLjAKK0RfMF81CWRkCTAuNQorRF8wXzI1CWRkCTAuMjUKK0RfMF8wMDA1CWRkCTAuMDAwNQorRF8wXzAJZGQJMC4wCisKKwlzZWdtZW50X2NvZGUKKworO3ZvaWQgZmh0KGZsb2F0ICpmeiwgaW50IG4pOworcHJvYwlmaHRfRlBVCisKKyUkZnoJYXJnCTQKKyUkbglhcmcJNAorCislJGsJbG9jYWwJNAorCislJGYwCWxvY2FsCTQKKyUkZjEJbG9jYWwJNAorJSRmMglsb2NhbAk0CislJGYzCWxvY2FsCTQKKworJSRnMAlsb2NhbAk0CislJGcxCWxvY2FsCTQKKyUkZzIJbG9jYWwJNAorJSRnMwlsb2NhbAk0CisKKyUkczEJbG9jYWwJNAorJSRjMQlsb2NhbAk0CislJHMyCWxvY2FsCTQKKyUkYzIJbG9jYWwJNAorCislJHRfcwlsb2NhbAk0CislJHRfYwlsb2NhbAk0CisJYWxsb2MKKworCXB1c2hkCWVicCwgZWJ4LCBlc2ksIGVkaQorCitmaHRfRlBVXzFzdF9wYXJ0OgorCitmaHRfRlBVXzJuZF9wYXJ0OgorCitmaHRfRlBVXzNyZF9wYXJ0OgorCisuZG9faW5pdDoKKwltb3YJcjMsIDE2CQk7azEqZnNpemUgPSA0KmZzaXplID0gazQKKwltb3YJcjQsIDgJCTtreCA9IGsxLzIKKwltb3YJcjIsIDQ4CQk7azMqZnNpemUKKwltb3YJZHdvcmQgW3NwKCUkayldLCAyCTtrID0gMgorCW1vdglyMCwgW3NwKCUkZnopXQk7ZmkKKwlsZWEJcjEsIFtyMCs4XQkJO2dpID0gZmkgKyBreAorCisuZG86CisuZG8yOgorCTtmCisJZmxkCWR3b3JkIFtyMF0KKwlmc3ViCWR3b3JkIFtyMCtyM10KKworCWZsZAlkd29yZCBbcjBdCisJZmFkZAlkd29yZCBbcjArcjNdCisKKwlmbGQJZHdvcmQgW3IwK3IzKjJdCisJZnN1Yglkd29yZCBbcjArcjJdCisKKwlmbGQJZHdvcmQgW3IwK3IzKjJdCisJZmFkZAlkd29yZCBbcjArcjJdCQk7ZjIgZjMgZjAgZjEKKworCWZsZAlzdDIJCQk7ZjAgZjIgZjMgZjAgZjEKKwlmYWRkCXN0MCwgc3QxCisJZnN0cAlkd29yZCBbcjBdCQk7ZmlbMF0KKworCWZsZAlzdDMJCQk7ZjEgZjIgZjMgZjAgZjEKKwlmYWRkCXN0MCwgc3QyCisJZnN0cAlkd29yZCBbcjArcjNdCQk7ZmlbazFdCisKKwlmc3VicglzdDAsIHN0MgkJO2YwLWYyIGYzIGYwIGYxCisJZnN0cAlkd29yZCBbcjArcjMqMl0JCTtmaVtrMl0KKworCWZzdWJyCXN0MCwgc3QyCQk7ZjEtZjMgZjAgZjEKKwlmc3RwCWR3b3JkIFtyMCtyMl0JCTtmaVtrM10KKwlmY29tcHAKKworCTtnCisJZmxkCWR3b3JkIFtyMV0KKwlmc3ViCWR3b3JkIFtyMStyM10KKworCWZsZAlkd29yZCBbcjFdCisJZmFkZAlkd29yZCBbcjErcjNdCisKKwlmbGQJZHdvcmQgW0RfMV80MTQyMV0KKwlmbXVsCWR3b3JkIFtyMStyMl0KKworCWZsZAlkd29yZCBbRF8xXzQxNDIxXQorCWZtdWwJZHdvcmQgW3IxK3IzKjJdCQk7ZzIgZzMgZzAgZzEKKworCWZsZAlzdDIJCQk7ZzAgZzIgZzMgZzAgZzEKKwlmYWRkCXN0MCwgc3QxCisJZnN0cAlkd29yZCBbcjFdCQk7Z2lbMF0KKworCWZsZAlzdDMJCQk7ZzEgZzIgZzMgZzAgZzEKKwlmYWRkCXN0MCwgc3QyCisJZnN0cAlkd29yZCBbcjErcjNdCQk7Z2lbazFdCisKKwlmc3VicglzdDAsIHN0MgkJO2cwLWcyIGczIGcwIGcxCisJZnN0cAlkd29yZCBbcjErcjMqMl0JCTtnaVtrMl0KKworCWZzdWJyCXN0MCwgc3QyCQk7ZzEtZzMgZzAgZzEKKwlmc3RwCWR3b3JkIFtyMStyMl0JCTtnaVtrM10KKwlmY29tcHAKKworCWxlYQlyMCwgW3IwK3IzKjRdCisJbGVhCXIxLCBbcjErcjMqNF0KKwljbXAJcjAsIHI2CisJamIJLmRvMgorCisKKwltb3YJcjAsIFtzcCglJGspXQorCWZsZAlkd29yZCBbY29zdGFiX2ZmdCArcjAqNF0KKwlmc3RwCWR3b3JkIFtzcCglJHRfYyldCisJZmxkCWR3b3JkIFtzaW50YWJfZmZ0ICtyMCo0XQorCWZzdHAJZHdvcmQgW3NwKCUkdF9zKV0KKwlmbGQJZHdvcmQgW0RfMV8wXQorCWZzdHAJZHdvcmQgW3NwKCUkYzEpXQorCWZsZAlkd29yZCBbRF8wXzBdCisJZnN0cAlkd29yZCBbc3AoJSRzMSldCisKKy5mb3JfaW5pdDoKKwltb3YJcjUsIDQJCTtpID0gMSpmc2l6ZQorCisuZm9yOgorCWZsZAlkd29yZCBbc3AoJSRjMSldCisJZm11bAlkd29yZCBbc3AoJSR0X2MpXQorCWZsZAlkd29yZCBbc3AoJSRzMSldCisJZm11bAlkd29yZCBbc3AoJSR0X3MpXQorCWZzdWJwCXN0MSwgc3QwCQk7YzEKKworCWZsZAlkd29yZCBbc3AoJSRjMSldCisJZm11bAlkd29yZCBbc3AoJSR0X3MpXQorCWZsZAlkd29yZCBbc3AoJSRzMSldCisJZm11bAlkd29yZCBbc3AoJSR0X2MpXQorCWZhZGRwCXN0MSwgc3QwCQk7czEgYzEKKwkKKwlmbGQJc3QxCisJZm11bAlzdDAsIHN0MAkJO2MxYzEgczEgYzEKKwlmbGQJc3QxCisJZm11bAlzdDAsIHN0MAkJO3MxczEgYzFjMSBzMSBjMQorCWZzdWJwCXN0MSwgc3QwCQk7YzIgczEgYzEKKwlmc3RwCWR3b3JkIFtzcCglJGMyKV0JO3MxIGMxCisKKwlmbGQJc3QxCQkJO2MxIHMxIGMxCisJZm11bAlzdDAsIHN0MQkJO2MxczEgczEgYzEKKwlmYWRkCXN0MCwgc3QwCQk7czIgczEgYzEKKwlmc3RwCWR3b3JkIFtzcCglJHMyKV0JO3MxIGMxCisKKwlmc3RwCWR3b3JkIFtzcCglJHMxKV0JO2MxCisJZnN0cAlkd29yZCBbc3AoJSRjMSldCTsKKwkKKwltb3YJcjAsIFtzcCglJGZ6KV0KKwlhZGQJcjAsIHI1CQk7cjAgPSBmaQorCW1vdglyMSwgW3NwKCUkZnopXQorCWFkZAlyMSwgcjMKKwlzdWIJcjEsIHI1CQk7cjEgPSBnaQorCisuZG8zOgorCWZsZAlkd29yZCBbc3AoJSRzMildCisJZm11bAlkd29yZCBbcjArcjNdCisJZmxkCWR3b3JkIFtzcCglJGMyKV0KKwlmbXVsCWR3b3JkIFtyMStyM10KKwlmc3VicAlzdDEsIHN0MAkJO2IgPSBzMipmaVtrMV0gLSBjMipnaVtrMV0KKworCWZsZAlkd29yZCBbc3AoJSRjMildCisJZm11bAlkd29yZCBbcjArcjNdCisJZmxkCWR3b3JkIFtzcCglJHMyKV0KKwlmbXVsCWR3b3JkIFtyMStyM10KKwlmYWRkcAlzdDEsIHN0MAkJO2EgPSBjMipmaVtrMV0gKyBzMipnaVtrMV0gIGIKKworCWZsZAlkd29yZCBbcjBdCisJZnN1YglzdDAsIHN0MQkJO2YxIGEgYgorCWZzdHAJZHdvcmQgW3NwKCUkZjEpXQk7YSBiCisKKwlmYWRkCWR3b3JkIFtyMF0JCTtmMCBiCisJZnN0cAlkd29yZCBbc3AoJSRmMCldCTtiCisKKwlmbGQJZHdvcmQgW3IxXQorCWZzdWIJc3QwLCBzdDEJCTtnMSBiCisJZnN0cAlkd29yZCBbc3AoJSRnMSldCTtiCisKKwlmYWRkCWR3b3JkIFtyMV0JCTtnMAorCWZzdHAJZHdvcmQgW3NwKCUkZzApXQk7CisKKworCWZsZAlkd29yZCBbc3AoJSRzMildCisJZm11bAlkd29yZCBbcjArcjJdCisJZmxkCWR3b3JkIFtzcCglJGMyKV0KKwlmbXVsCWR3b3JkIFtyMStyMl0KKwlmc3VicAlzdDEsIHN0MAkJO2IgPSBzMipmaVtrM10gLSBjMipnaVtrM10KKworCWZsZAlkd29yZCBbc3AoJSRjMildCisJZm11bAlkd29yZCBbcjArcjJdCisJZmxkCWR3b3JkIFtzcCglJHMyKV0KKwlmbXVsCWR3b3JkIFtyMStyMl0KKwlmYWRkcAlzdDEsIHN0MAkJO2EgPSBjMipmaVtrM10gKyBzMipnaVtrM10gIGIKKworCWZsZAlkd29yZCBbcjArcjMqMl0KKwlmc3ViCXN0MCwgc3QxCQk7ZjMgYSBiCisJZnN0cAlkd29yZCBbc3AoJSRmMyldCTthIGIKKworCWZhZGQJZHdvcmQgW3IwK3IzKjJdCTtmMiBiCisJZnN0cAlkd29yZCBbc3AoJSRmMildCTtiCisKKwlmbGQJZHdvcmQgW3IxK3IzKjJdCisJZnN1YglzdDAsIHN0MQkJO2czIGIKKwlmc3RwCWR3b3JkIFtzcCglJGczKV0JO2IKKworCWZhZGQJZHdvcmQgW3IxK3IzKjJdCTtnMgorCWZzdHAJZHdvcmQgW3NwKCUkZzIpXQk7CisKKworCWZsZAlkd29yZCBbc3AoJSRzMSldCisJZm11bAlkd29yZCBbc3AoJSRmMildCisJZmxkCWR3b3JkIFtzcCglJGMxKV0KKwlmbXVsCWR3b3JkIFtzcCglJGczKV0KKwlmc3VicAlzdDEsIHN0MAkJO2IgPSBzMSpmMiAtIGMxKmczCisJCisJZmxkCWR3b3JkIFtzcCglJGMxKV0KKwlmbXVsCWR3b3JkIFtzcCglJGYyKV0KKwlmbGQJZHdvcmQgW3NwKCUkczEpXQorCWZtdWwJZHdvcmQgW3NwKCUkZzMpXQorCWZhZGRwCXN0MSwgc3QwCQk7YSA9IGMxKmYyICsgczEqZzMgIGIKKworCWZsZAlkd29yZCBbc3AoJSRmMCldCisJZnN1YglzdDAsIHN0MQkJO2ZpW2syXSBhIGIKKwlmc3RwCWR3b3JkIFtyMCtyMyoyXQorCisJZmFkZAlkd29yZCBbc3AoJSRmMCldCTtmaVswXSBiCisJZnN0cAlkd29yZCBbcjBdCisKKwlmbGQJZHdvcmQgW3NwKCUkZzEpXQorCWZzdWIJc3QwLCBzdDEJCTtnaVtrM10gYgorCWZzdHAJZHdvcmQgW3IxK3IyXQorCisJZmFkZAlkd29yZCBbc3AoJSRnMSldCTtnaVtrMV0KKwlmc3RwCWR3b3JkIFtyMStyM10KKworCisJZmxkCWR3b3JkIFtzcCglJGMxKV0KKwlmbXVsCWR3b3JkIFtzcCglJGcyKV0KKwlmbGQJZHdvcmQgW3NwKCUkczEpXQorCWZtdWwJZHdvcmQgW3NwKCUkZjMpXQorCWZzdWJwCXN0MSwgc3QwCQk7YiA9IGMxKmcyIC0gczEqZjMKKwkKKwlmbGQJZHdvcmQgW3NwKCUkczEpXQorCWZtdWwJZHdvcmQgW3NwKCUkZzIpXQorCWZsZAlkd29yZCBbc3AoJSRjMSldCisJZm11bAlkd29yZCBbc3AoJSRmMyldCisJZmFkZHAJc3QxLCBzdDAJCTthID0gczEqZzIgKyBjMSpmMyAgYgorCisJZmxkCWR3b3JkIFtzcCglJGcwKV0KKwlmc3ViCXN0MCwgc3QxCQk7Z2lbazJdIGEgYgorCWZzdHAJZHdvcmQgW3IxK3IzKjJdCisKKwlmYWRkCWR3b3JkIFtzcCglJGcwKV0JO2dpWzBdIGIKKwlmc3RwCWR3b3JkIFtyMV0KKworCWZsZAlkd29yZCBbc3AoJSRmMSldCisJZnN1YglzdDAsIHN0MQkJO2ZpW2szXSBiCisJZnN0cAlkd29yZCBbcjArcjJdCisKKwlmYWRkCWR3b3JkIFtzcCglJGYxKV0JO2ZpW2sxXQorCWZzdHAJZHdvcmQgW3IwK3IzXQorCisKKwlsZWEJcjAsIFtyMCtyMyo0XQorCWxlYQlyMSwgW3IxK3IzKjRdCisJY21wCXIwLCByNgorCWpiIG5lYXIJLmRvMworCisJYWRkCXI1LCA0CisJY21wCXI1LCByNAorCWpiIG5lYXIJLmZvcgorCisJY21wCXIzLCBbc3AoJSRuKV0KKwlqYWUJLmV4aXQKKworCWFkZAlkd29yZCBbc3AoJSRrKV0sIDIJO2sgICs9IDI7CisJbGVhCXIzLCBbcjMqNF0JCTtrMSAqPSA0CisJbGVhCXIyLCBbcjIqNF0JCTtrMyAqPSA0CisJbGVhCXI0LCBbcjQqNF0JCTtreCAqPSA0CisJbW92CXIwLCBbc3AoJSRmeildCTtmaQorCWxlYQlyMSwgW3IwK3I0XQkJO2dpID0gZmkgKyBreAorCWptcAkuZG8KKworLmV4aXQ6CisJcG9wZAllYnAsIGVieCwgZXNpLCBlZGkKK2VuZHByb2MKKworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworO3ZvaWQgZmh0X0ZQVV9GWENIKGZsb2F0ICpmeiwgaW50IG4pOworcHJvYwlmaHRfRlBVX0ZYQ0gKKworJSRmeglhcmcJNAorJSRuCWFyZwk0CisKKyUkawlsb2NhbAk0CisKKyUkZjAJbG9jYWwJNAorJSRmMQlsb2NhbAk0CislJGYyCWxvY2FsCTQKKyUkZjMJbG9jYWwJNAorCislJGcwCWxvY2FsCTQKKyUkZzEJbG9jYWwJNAorJSRnMglsb2NhbAk0CislJGczCWxvY2FsCTQKKworJSRzMQlsb2NhbAk0CislJGMxCWxvY2FsCTQKKyUkczIJbG9jYWwJNAorJSRjMglsb2NhbAk0CisKKyUkdF9zCWxvY2FsCTQKKyUkdF9jCWxvY2FsCTQKKwlhbGxvYworCisJcHVzaGQJZWJwLCBlYngsIGVzaSwgZWRpCisKK2ZodF9GUFVfRlhDSF8xc3RfcGFydDoKKworZmh0X0ZQVV9GWENIXzJuZF9wYXJ0OgorCitmaHRfRlBVX0ZYQ0hfM3JkX3BhcnQ6CisKKy5kb19pbml0OgorCW1vdglyMywgMTYJCTtrMSpmc2l6ZSA9IDQqZnNpemUgPSBrNAorCW1vdglyNCwgOAkJO2t4ID0gazEvMgorCW1vdglyMiwgNDgJCTtrMypmc2l6ZQorCW1vdglkd29yZCBbc3AoJSRrKV0sIDIJO2sgPSAyCisJbW92CXIwLCBbc3AoJSRmeildCTtmaQorCWxlYQlyMSwgW3IwKzhdCQk7Z2kgPSBmaSArIGt4CisKKy5kbzoKKy5kbzI6CisJO2YKKwlmbGQJZHdvcmQgW3IwXQorCWZzdWIJZHdvcmQgW3IwK3IzXQorCWZsZAlkd29yZCBbcjBdCisJZmFkZAlkd29yZCBbcjArcjNdCisKKwlmbGQJZHdvcmQgW3IwK3IzKjJdCisJZnN1Yglkd29yZCBbcjArcjJdCisJZmxkCWR3b3JkIFtyMCtyMyoyXQorCWZhZGQJZHdvcmQgW3IwK3IyXQkJO2YyIGYzIGYwIGYxCisKKwlmbGQJc3QzCisJZmxkCXN0MworCWZ4Y2gJc3Q1CisJZmFkZAlzdDAsIHN0MworCWZ4Y2gJc3Q0CisJZmFkZAlzdDAsIHN0MgorCWZ4Y2gJc3QzCisJZnN1YnAJc3QxLCBzdDAKKwlmeGNoCXN0MQorCWZzdWJwCXN0NCwgc3QwCisJZnhjaAlzdDIKKworCWZzdHAJZHdvcmQgW3IwK3IzXQkJO2ZpW2sxXQorCWZzdHAJZHdvcmQgW3IwXQkJO2ZpWzBdCisJZnN0cAlkd29yZCBbcjArcjJdCQk7ZmlbazNdCisJZnN0cAlkd29yZCBbcjArcjMqMl0JCTtmaVtrMl0KKworCTtnCisJZmxkCWR3b3JkIFtyMV0KKwlmc3ViCWR3b3JkIFtyMStyM10KKwlmbGQJZHdvcmQgW3IxXQorCWZhZGQJZHdvcmQgW3IxK3IzXQorCisJZmxkCWR3b3JkIFtEXzFfNDE0MjFdCisJZm11bAlkd29yZCBbcjErcjJdCisJZmxkCWR3b3JkIFtEXzFfNDE0MjFdCisJZm11bAlkd29yZCBbcjErcjMqMl0JCTtnMiBnMyBnMCBnMQorCisJZmxkCXN0MworCWZsZAlzdDMKKwlmeGNoCXN0NQorCWZhZGQJc3QwLCBzdDMKKwlmeGNoCXN0NAorCWZhZGQJc3QwLCBzdDIKKwlmeGNoCXN0MworCWZzdWJwCXN0MSwgc3QwCisJZnhjaAlzdDEKKwlmc3VicAlzdDQsIHN0MAorCWZ4Y2gJc3QyCisKKwlmc3RwCWR3b3JkIFtyMStyM10JCTtnaVtrMV0KKwlmc3RwCWR3b3JkIFtyMV0JCTtnaVswXQorCWZzdHAJZHdvcmQgW3IxK3IyXQkJO2dpW2szXQorCWZzdHAJZHdvcmQgW3IxK3IzKjJdCQk7Z2lbazJdCisKKwlsZWEJcjAsIFtyMCtyMyo0XQorCWxlYQlyMSwgW3IxK3IzKjRdCisJY21wCXIwLCByNgorCWpiCS5kbzIKKworCisJbW92CXIwLCBbc3AoJSRrKV0KKwlmbGQJZHdvcmQgW2Nvc3RhYl9mZnQgK3IwKjRdCisJZmxkCWR3b3JkIFtzaW50YWJfZmZ0ICtyMCo0XQorCWZsZAlkd29yZCBbRF8xXzBdCisJZmxkCWR3b3JkIFtEXzBfMF0KKwlmeGNoCXN0MworCWZzdHAJZHdvcmQgW3NwKCUkdF9jKV0KKwlmeGNoCXN0MQorCWZzdHAJZHdvcmQgW3NwKCUkdF9zKV0KKwlmc3RwCWR3b3JkIFtzcCglJGMxKV0KKwlmc3RwCWR3b3JkIFtzcCglJHMxKV0KKworLmZvcl9pbml0OgorCW1vdglyNSwgNAkJO2kgPSAxKmZzaXplCisKKy5mb3I6CisJZmxkCWR3b3JkIFtzcCglJGMxKV0KKwlmbXVsCWR3b3JkIFtzcCglJHRfYyldCisJZmxkCWR3b3JkIFtzcCglJHMxKV0KKwlmbXVsCWR3b3JkIFtzcCglJHRfcyldCisKKwlmbGQJZHdvcmQgW3NwKCUkYzEpXQorCWZtdWwJZHdvcmQgW3NwKCUkdF9zKV0KKwlmbGQJZHdvcmQgW3NwKCUkczEpXQorCWZtdWwJZHdvcmQgW3NwKCUkdF9jKV0KKwlmeGNoCXN0MgorCWZzdWJwCXN0Mywgc3QwCQk7YzEKKwlmYWRkcAlzdDEsIHN0MAkJO3MxIGMxCisJCisJZmxkCXN0MQorCWZ4Y2gJc3QyCisJZm11bAlzdDAsIHN0MAkJO2MxYzEgczEgYzEKKwlmbGQJc3QxCisJZnhjaAlzdDIKKwlmbXVsCXN0MCwgc3QwCQk7czFzMSBjMWMxIHMxIGMxCisKKwlmeGNoCXN0MworCWZzdAlkd29yZCBbc3AoJSRjMSldCTtjMQorCWZ4Y2gJc3QyCisJZnN0CWR3b3JkIFtzcCglJHMxKV0JO3MxIGMxYzEgYzEgczFzMQorCisJZm11bHAJc3QyLCBzdDAKKwlmc3VicnAJc3QyLCBzdDAKKwlmYWRkCXN0MCwgc3QwCQk7czIgYzIKKwlmeGNoCXN0MQorCWZzdHAJZHdvcmQgW3NwKCUkYzIpXQorCWZzdHAJZHdvcmQgW3NwKCUkczIpXQorCisJbW92CXIwLCBbc3AoJSRmeildCisJbW92CXIxLCBbc3AoJSRmeildCisJYWRkCXIwLCByNQkJO3IwID0gZmkKKwlhZGQJcjEsIHIzCisJc3ViCXIxLCByNQkJO3IxID0gZ2kKKworLmRvMzoKKwlmbGQJZHdvcmQgW3NwKCUkczIpXQorCWZtdWwJZHdvcmQgW3IwK3IzXQorCWZsZAlkd29yZCBbc3AoJSRjMildCisJZm11bAlkd29yZCBbcjErcjNdCisKKwlmbGQJZHdvcmQgW3NwKCUkYzIpXQorCWZtdWwJZHdvcmQgW3IwK3IzXQorCWZsZAlkd29yZCBbc3AoJSRzMildCisJZm11bAlkd29yZCBbcjErcjNdCisJZnhjaAlzdDIKKwlmc3VicAlzdDMsIHN0MAkJO2IgPSBzMipmaVtrMV0gLSBjMipnaVtrMV0KKwlmYWRkcAlzdDEsIHN0MAkJO2EgPSBjMipmaVtrMV0gKyBzMipnaVtrMV0gIGIKKworCWZsZAlkd29yZCBbcjFdCisJZnN1YglzdDAsIHN0MgkJO2cxIGEgYgorCWZ4Y2gJc3QyCisJZmFkZAlkd29yZCBbcjFdCQk7ZzAgYSBnMQorCisJZmxkCWR3b3JkIFtyMF0KKwlmc3ViCXN0MCwgc3QyCQk7ZjEgZzAgYSBnMQorCWZ4Y2gJc3QyCisJZmFkZAlkd29yZCBbcjBdCQk7ZjAgZzAgZjEgZzEKKworCWZ4Y2gJc3QzCisJZnN0cAlkd29yZCBbc3AoJSRnMSldCisJZnN0cAlkd29yZCBbc3AoJSRnMCldCisJZnN0cAlkd29yZCBbc3AoJSRmMSldCisJZnN0cAlkd29yZCBbc3AoJSRmMCldCisKKworCWZsZAlkd29yZCBbc3AoJSRzMildCisJZm11bAlkd29yZCBbcjArcjJdCisJZmxkCWR3b3JkIFtzcCglJGMyKV0KKwlmbXVsCWR3b3JkIFtyMStyMl0KKworCWZsZAlkd29yZCBbc3AoJSRjMildCisJZm11bAlkd29yZCBbcjArcjJdCisJZmxkCWR3b3JkIFtzcCglJHMyKV0KKwlmbXVsCWR3b3JkIFtyMStyMl0KKwlmeGNoCXN0MgorCWZzdWJwCXN0Mywgc3QwCQk7YiA9IHMyKmZpW2szXSAtIGMyKmdpW2szXQorCWZhZGRwCXN0MSwgc3QwCQk7YSA9IGMyKmZpW2szXSArIHMyKmdpW2szXSAgYgorCisKKwlmbGQJZHdvcmQgW3IxK3IzKjJdCisJZnN1YglzdDAsIHN0MgkJO2czIGEgYgorCWZ4Y2gJc3QyCisJZmFkZAlkd29yZCBbcjErcjMqMl0JO2cyIGEgZzMKKworCWZsZAlkd29yZCBbcjArcjMqMl0KKwlmc3ViCXN0MCwgc3QyCQk7ZjMgZzIgYSBnMworCWZ4Y2gJc3QyCisJZmFkZAlkd29yZCBbcjArcjMqMl0JO2YyIGcyIGYzIGczCisKKwlmeGNoCXN0MworCWZzdHAJZHdvcmQgW3NwKCUkZzMpXQorCWZzdHAJZHdvcmQgW3NwKCUkZzIpXQorCWZzdHAJZHdvcmQgW3NwKCUkZjMpXQorCWZzdHAJZHdvcmQgW3NwKCUkZjIpXQorCisKKwlmbGQJZHdvcmQgW3NwKCUkczEpXQorCWZtdWwJZHdvcmQgW3NwKCUkZjIpXQorCWZsZAlkd29yZCBbc3AoJSRjMSldCisJZm11bAlkd29yZCBbc3AoJSRnMyldCisJCisJZmxkCWR3b3JkIFtzcCglJGMxKV0KKwlmbXVsCWR3b3JkIFtzcCglJGYyKV0KKwlmbGQJZHdvcmQgW3NwKCUkczEpXQorCWZtdWwJZHdvcmQgW3NwKCUkZzMpXQorCWZ4Y2gJc3QyCisJZnN1YnAJc3QzLCBzdDAJCTtiID0gczEqZjIgLSBjMSpnMworCWZhZGRwCXN0MSwgc3QwCQk7YSA9IGMxKmYyICsgczEqZzMgIGIKKworCWZsZAlkd29yZCBbc3AoJSRnMSldCisJZnN1YglzdDAsIHN0MgkJO2dpW2szXSBhIGIKKwlmeGNoCXN0MgorCWZhZGQJZHdvcmQgW3NwKCUkZzEpXQk7Z2lbazFdIGEgZ2lbazNdCisKKwlmbGQJZHdvcmQgW3NwKCUkZjApXQorCWZzdWIJc3QwLCBzdDIJCTtmaVtrMl0gZ2lbazFdIGEgZ2lbazNdCisJZnhjaAlzdDIKKwlmYWRkCWR3b3JkIFtzcCglJGYwKV0JO2ZpWzBdIGdpW2sxXSBmaVtrMl0gZ2lbazNdCisKKwlmeGNoCXN0MworCWZzdHAJZHdvcmQgW3IxK3IyXQorCWZzdHAJZHdvcmQgW3IxK3IzXQorCWZzdHAJZHdvcmQgW3IwK3IzKjJdCisJZnN0cAlkd29yZCBbcjBdCisKKworCWZsZAlkd29yZCBbc3AoJSRjMSldCisJZm11bAlkd29yZCBbc3AoJSRnMildCisJZmxkCWR3b3JkIFtzcCglJHMxKV0KKwlmbXVsCWR3b3JkIFtzcCglJGYzKV0KKwkKKwlmbGQJZHdvcmQgW3NwKCUkczEpXQorCWZtdWwJZHdvcmQgW3NwKCUkZzIpXQorCWZsZAlkd29yZCBbc3AoJSRjMSldCisJZm11bAlkd29yZCBbc3AoJSRmMyldCisJZnhjaAlzdDIKKwlmc3VicAlzdDMsIHN0MAkJO2IgPSBjMSpnMiAtIHMxKmYzCisJZmFkZHAJc3QxLCBzdDAJCTthID0gczEqZzIgKyBjMSpmMyAgYgorCisJZmxkCWR3b3JkIFtzcCglJGYxKV0KKwlmc3ViCXN0MCwgc3QyCQk7ZmlbazNdIGEgYgorCWZ4Y2gJc3QyCisJZmFkZAlkd29yZCBbc3AoJSRmMSldCTtmaVtrMV0gYSBmaVtrM10KKworCWZsZAlkd29yZCBbc3AoJSRnMCldCisJZnN1YglzdDAsIHN0MgkJO2dpW2syXSBmaVtrMV0gYSBmaVtrM10KKwlmeGNoCXN0MgorCWZhZGQJZHdvcmQgW3NwKCUkZzApXQk7Z2lbMF0gZmlbazFdIGdpW2syXSBmaVtrM10KKworCWZ4Y2gJc3QzCisJZnN0cAlkd29yZCBbcjArcjJdCisJZnN0cAlkd29yZCBbcjArcjNdCisJZnN0cAlkd29yZCBbcjErcjMqMl0KKwlmc3RwCWR3b3JkIFtyMV0KKworCisJbGVhCXIwLCBbcjArcjMqNF0KKwlsZWEJcjEsIFtyMStyMyo0XQorCWNtcAlyMCwgcjYKKwlqYiBuZWFyCS5kbzMKKworCWFkZAlyNSwgNAorCWNtcAlyNSwgcjQKKwlqYiBuZWFyCS5mb3IKKworCWNtcAlyMywgW3NwKCUkbildCisJamFlCS5leGl0CisKKwlhZGQJZHdvcmQgW3NwKCUkayldLCAyCTtrICArPSAyOworCWxlYQlyMywgW3IzKjRdCQk7azEgKj0gNAorCWxlYQlyMiwgW3IyKjRdCQk7azMgKj0gNAorCWxlYQlyNCwgW3I0KjRdCQk7a3ggKj0gNAorCW1vdglyMCwgW3NwKCUkZnopXQk7ZmkKKwlsZWEJcjEsIFtyMCtyNF0JCTtnaSA9IGZpICsga3gKKwlqbXAJLmRvCisKKy5leGl0OgorCXBvcGQJZWJwLCBlYngsIGVzaSwgZWRpCitlbmRwcm9jCisKKwllbmQKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvaTM4Ni9mZnRzc2UubmFzIGIvbGlibXAzbGFtZS9pMzg2L2ZmdHNzZS5uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2ZmNjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvaTM4Ni9mZnRzc2UubmFzCkBAIC0wLDAgKzEsNDIyIEBACis7IGJhY2sgcG9ydCBmcm9tIEdPR08tbm8gY29kYSAyLjI0YiBieSBUYWtlaGlybyBUT01JTkFHQQorCis7IEdPR08tbm8tY29kYQorOwlDb3B5cmlnaHQgKEMpIDE5OTkgc2hpZ2VvCis7CXNwZWNpYWwgdGhhbmtzIHRvIEtlaWljaGkgU0FLQUkKKyAKKyVpbmNsdWRlICJuYXNtLmgiCisKKwlnbG9iYWxkZWYgZmh0X1NTRQorCisJc2VnbWVudF9kYXRhCisJYWxpZ24gMTYKK1FfTU1QUAlkZAkweDAsMHgwLDB4ODAwMDAwMDAsMHg4MDAwMDAwMAorUV9NUE1QCWRkCTB4MCwweDgwMDAwMDAwLDB4MCwweDgwMDAwMDAwCitEXzExMDAJZGQgMC4wLCAwLjAsIDEuMCwgMS4wCitjb3N0YWJfZmZ0OgorCWRkIDkuMjM4Nzk1MzI1MTEyODY3ZS0wMQorCWRkIDMuODI2ODM0MzIzNjUwODk4ZS0wMQorCWRkIDkuOTUxODQ3MjY2NzIxOTY5ZS0wMQorCWRkIDkuODAxNzE0MDMyOTU2MDYwZS0wMgorCWRkIDkuOTk2OTg4MTg2OTYyMDQyZS0wMQorCWRkIDIuNDU0MTIyODUyMjkxMjI5ZS0wMgorCWRkIDkuOTk5ODExNzUyODM2MDExZS0wMQorCWRkIDYuMTM1ODg0NjQ5MTU0NDc1ZS0wMworU19TUVJUMglkZAkxLjQxNDIxMzU2MgorCisJc2VnbWVudF9jb2RlCisKK1BJQ19PRkZTRVRUQUJMRQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7CWJ5IEsuIFNBS0FJCis7CTk5LzA4LzE4CVBJSUkgMjNrW2Nsa10KKzsJOTkvMDgvMTkJzL/O4b3nvfjG/qTstLmkqCBQSUlJIDIya1tjbGtdCis7CTk5LzA4LzIwCWJpdCByZXZlcnNhbCCk8rXsuOG45aSrpOmw3L+ipLekvyBQSUlJIDE3a1tjbGtdCis7CTk5LzA4LzIzCbDsyfQgdW5yb2xsIFBJSUkgMTRrW2Nsa10KKzsJOTkvMTEvMTIJY2xlYW4gdXAKKzsKKzt2b2lkIGZodF9TU0UoZmxvYXQgKmZ6LCBpbnQgbik7CisJYWxpZ24gMTYKK2ZodF9TU0U6CisJcHVzaAllYngKKwlwdXNoCWVzaQorCXB1c2gJZWRpCisJcHVzaAllYnAKKworJWFzc2lnbiBfUCA0KjUKKworCTsypMTM3KTOpeuhvKXXCisJbW92CWVheCxbZXNwK19QKzBdCTtlYXg9ZnoKKwltb3YJZWJwLFtlc3ArX1ArNF0JOz1uCisJc2hsCWVicCwzCisJYWRkCWVicCxlYXgJCTsgZm4gID0gZnogKyBuLCCks6TOtNi/9L2qzruk3qTHydTK0QorCXB1c2gJZWJwCisKKwljYWxsCWdldF9wYy5icAorCWFkZAllYnAsIFBJQ19CQVNFKCkKKworCWxlYQllY3gsW1BJQ19FQlBfUkVMKGNvc3RhYl9mZnQpXQorCXhvcgllYXgsZWF4CisJbW92CWFsLDgJCTsgPWsxPTEqKHNpemVvZiBmbG9hdCkJLy8gNCwgMTYsIDY0LCAyNTYsLi4uCisubHAyOgkJCQk7IGRveworCW1vdgllc2ksW2VzcCtfUCs0XQk7IGVzaT1maT1megorCWxlYQllZHgsW2VheCtlYXgqMl0KKwltb3YJZWJ4LCBlc2kKKworOyCkv6SrpMCkqzLKws7zpLekq7T8wtSkx6StpMqkpMn0yqykz0ZQVaTOpNukpqSswq6kpKGjCisJbG9vcGFsaWduCTE2CisubHAyMDoJCQkJOyBkb3sKKzsgICAgICAgICAgICAgICAgICAgICAgIGYwICAgICA9IGZpWzAgXSArIGZpW2sxXTsKKzsgICAgICAgICAgICAgICAgICAgICAgIGYyICAgICA9IGZpW2syXSArIGZpW2szXTsKKzsgICAgICAgICAgICAgICAgICAgICAgIGYxICAgICA9IGZpWzAgXSAtIGZpW2sxXTsKKzsgICAgICAgICAgICAgICAgICAgICAgIGYzICAgICA9IGZpW2syXSAtIGZpW2szXTsKKzsgICAgICAgICAgICAgICAgICAgICAgIGZpWzAgXSA9IGYwICAgICArIGYyOworOyAgICAgICAgICAgICAgICAgICAgICAgZmlbazFdID0gZjEgICAgICsgZjM7Cis7ICAgICAgICAgICAgICAgICAgICAgICBmaVtrMl0gPSBmMCAgICAgLSBmMjsKKzsgICAgICAgICAgICAgICAgICAgICAgIGZpW2szXSA9IGYxICAgICAtIGYzOworCWxlYQllZGksW2VieCtlYXhdCTsgZWRpPWdpPWZpK2tpLzIKKwlmbGQJZHdvcmQgW2VieF0KKwlmYWRkCWR3b3JkIFtlYngrZWF4KjJdCisJZmxkCWR3b3JkIFtlYngrZWF4KjRdCisJZmFkZAlkd29yZCBbZWJ4K2VkeCoyXQorCisJZmxkCWR3b3JkIFtlYnhdCisJZnN1Yglkd29yZCBbZWJ4K2VheCoyXQorCWZsZAlkd29yZCBbZWJ4K2VheCo0XQorCWZzdWIJZHdvcmQgW2VieCtlZHgqMl0KKworCWZsZAlzdDEKKwlmYWRkCXN0MCxzdDEKKwlmc3RwCWR3b3JkIFtlYngrZWF4KjJdCisJZnN1YnAJc3QxLHN0MAorCWZzdHAJZHdvcmQgW2VieCtlZHgqMl0KKworCWZsZAlzdDEKKwlmYWRkCXN0MCxzdDEKKwlmc3RwCWR3b3JkIFtlYnhdCisJZnN1YnAJc3QxLHN0MAorCWZzdHAJZHdvcmQgW2VieCtlYXgqNF0KKworCWxlYQllYngsW2VieCArIGVheCo4XQk7ID0gZmkgKz0gKGsxICogNCk7Cis7ICAgICAgICAgICAgICAgICAgICAgICBnMCAgICAgPSBnaVswIF0gKyBnaVtrMV07Cis7ICAgICAgICAgICAgICAgICAgICAgICBnMiAgICAgPSBTUVJUMiAgKiBnaVtrMl07Cis7ICAgICAgICAgICAgICAgICAgICAgICBnMSAgICAgPSBnaVswIF0gLSBnaVtrMV07Cis7ICAgICAgICAgICAgICAgICAgICAgICBnMyAgICAgPSBTUVJUMiAgKiBnaVtrM107Cis7ICAgICAgICAgICAgICAgICAgICAgICBnaVswIF0gPSBnMCAgICAgKyBnMjsKKzsgICAgICAgICAgICAgICAgICAgICAgIGdpW2syXSA9IGcwICAgICAtIGcyOworOyAgICAgICAgICAgICAgICAgICAgICAgZ2lbazFdID0gZzEgICAgICsgZzM7Cis7ICAgICAgICAgICAgICAgICAgICAgICBnaVtrM10gPSBnMSAgICAgLSBnMzsKKwlmbGQJZHdvcmQgW2VkaV0KKwlmYWRkCWR3b3JkIFtlZGkrZWF4KjJdCisJZmxkCWR3b3JkIFtQSUNfRUJQX1JFTChTX1NRUlQyKV0KKwlmbXVsCWR3b3JkIFtlZGkrZWF4KjRdCisKKwlmbGQJZHdvcmQgW2VkaV0KKwlmc3ViCWR3b3JkIFtlZGkrZWF4KjJdCisJZmxkCWR3b3JkIFtQSUNfRUJQX1JFTChTX1NRUlQyKV0KKwlmbXVsCWR3b3JkIFtlZGkrZWR4KjJdCisKKwlmbGQJc3QxCisJZmFkZAlzdDAsc3QxCisJZnN0cAlkd29yZCBbZWRpK2VheCoyXQorCWZzdWJwCXN0MSxzdDAKKwlmc3RwCWR3b3JkIFtlZGkrZWR4KjJdCisKKwlmbGQJc3QxCisJZmFkZAlzdDAsc3QxCisJZnN0cAlkd29yZCBbZWRpXQorCWZzdWJwCXN0MSxzdDAKKwlmc3RwCWR3b3JkIFtlZGkrZWF4KjRdCisKKwljbXAJZWJ4LFtlc3BdCisJamwJbmVhciAubHAyMAkJOyB3aGlsZSAoZmk8Zm4pOworCisKKzsgICAgICAgICAgICAgICBpID0gMTsgLy9mb3IgKGk9MTtpPGt4O2krKyl7Cis7ICAgICAgICAgICAgICAgICAgICAgICBjMSA9IDEuMCp0X2MgLSAwLjAqdF9zOworOyAgICAgICAgICAgICAgICAgICAgICAgczEgPSAwLjAqdF9jICsgMS4wKnRfczsKKwltb3ZscHMJeG1tNixbZWN4XSA7ID0geyAtLSwgIC0tLCAgczEsIGMxfQorCW1vdmFwcwl4bW03LHhtbTYKKworCXNodWZwcwl4bW02LHhtbTYsUjQoMCwxLDEsMCkJOyA9IHsrYzEsICtzMSwgK3MxLCArYzF9IC0+IMmszdcKKzsgICAgICAgICAgICAgICAgICAgICAgIGMyID0gYzEqYzEgLSBzMSpzMSA9IDEgLSAoMipzMSkqczE7Cis7ICAgICAgICAgICAgICAgICAgICAgICBzMiA9IGMxKnMxICsgczEqYzEgPSAyKnMxKmMxOworCXNodWZwcwl4bW03LHhtbTcsUjQoMSwwLDAsMSkKKwltb3Zzcwl4bW01LHhtbTcJCTsgPSB7IC0tLCAgLS0sICAtLSwgczF9CisJeG9ycHMJeG1tNyxbUElDX0VCUF9SRUwoUV9NTVBQKV0JOyA9IHstczEsIC1jMSwgK2MxLCArczF9IC0+IMmszdcKKworCWFkZHNzCXhtbTUseG1tNQkJOyA9ICgtLSwgLS0sICAtLSwgMipzMSkKKwlhZGQJZXNpLDQJCTsgZXNpID0gZmkgPSBmeiArIGkKKwlzaHVmcHMJeG1tNSx4bW01LFI0KDAsMCwwLDApCTsgPSAoMipzMSwgMipzMSwgMipzMSwgMipzMSkKKwltdWxwcwl4bW01LHhtbTYJCTsgPSAoMipzMSpjMSwgMipzMSpzMSwgMipzMSpzMSwgMipzMSpjMSkKKwlzdWJwcwl4bW01LFtQSUNfRUJQX1JFTChEXzExMDApXQkJOyA9ICgtLSwgMipzMSpzMS0xLCAtLSwgMipzMSpjMSkgPSB7LS0gLWMyIC0tIHMyfQorCW1vdmFwcwl4bW00LHhtbTUKKwlzaHVmcHMJeG1tNSx4bW01LFI0KDIsMCwyLDApCTsgPSB7LWMyLCBzMiwgLWMyLCBzMn0gLT4gyazN1worCisJeG9ycHMJeG1tNCxbUElDX0VCUF9SRUwoUV9NTVBQKV0JCTsgPSB7LS0sIGMyLCAtLSwgczJ9CisJc2h1ZnBzCXhtbTQseG1tNCxSNCgwLDIsMCwyKQk7ID0ge3MyLCBjMiwgczIsIGMyfSAtPiDJrM3XCisKKwlsb29wYWxpZ24JMTYKKy5scDIxOgkJCQk7IGRveworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICAgICAgID0gYzIqZmlbazFdICsgczIqZ2lbazFdOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICAgICAgID0gczIqZmlbazFdIC0gYzIqZ2lbazFdOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICAgICAgID0gYzIqZmlbazNdICsgczIqZ2lbazNdOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICAgICAgID0gczIqZmlbazNdIC0gYzIqZ2lbazNdOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMCAgICAgID0gZmlbMCBdICAgICAgICArIGE7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcwICAgICAgPSBnaVswIF0gICAgICAgICsgYjsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjIgICAgICA9IGZpW2sxICogMl0gICAgKyBjOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMiAgICAgID0gZ2lbazEgKiAyXSAgICArIGQ7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxICAgICAgPSBmaVswIF0gICAgICAgIC0gYTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzEgICAgICA9IGdpWzAgXSAgICAgICAgLSBiOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMyAgICAgID0gZmlbazEgKiAyXSAgICAtIGM7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGczICAgICAgPSBnaVtrMSAqIDJdICAgIC0gZDsKKwlsZWEJZWRpLFtlc2kgKyBlYXgqMiAtIDhdCTsgZWRpID0gZ2kgPSBmeiArazEtaQorCisJbW92c3MJeG1tMCxbZXNpICsgZWF4KjJdCTsgPSBmaVtrMV0KKwltb3Zzcwl4bW0yLFtlc2kgKyBlZHgqMl0JOyA9IGZpW2szXQorCXNodWZwcwl4bW0wLHhtbTIsMHgwMAk7ID0ge2ZpW2szXSwgZmlbazNdLCBmaVtrMV0sIGZpW2sxXX0KKwltb3Zzcwl4bW0xLFtlZGkgKyBlYXgqMl0JOyA9IGZpW2sxXQorCW1vdnNzCXhtbTMsW2VkaSArIGVkeCoyXQk7ID0gZmlbazNdCisJc2h1ZnBzCXhtbTEseG1tMywweDAwCTsgPSB7Z2lbazNdLCBnaVtrM10sIGdpW2sxXSwgZ2lbazFdfQorCW1vdnNzCXhtbTIsW2VzaV0JCTsgPSBmaVswXQorCW11bHBzCXhtbTAseG1tNAkJOyAqPSB7K3MyLCArYzIsICtzMiwgK2MyfQorCW1vdnNzCXhtbTMsW2VzaSArIGVheCo0XQk7ID0gZmlbazJdCisJdW5wY2tscHMJeG1tMix4bW0zCTsgPSB7LS0sIC0tLCBmaVtrMl0sIGZpWzBdfQorCW11bHBzCXhtbTEseG1tNQkJOyAqPSB7LWMyLCArczIsIC1jMiwgK3MyfQorCW1vdnNzCXhtbTMsW2VkaSArIGVheCo0XQk7ID0gZ2lbazJdCisJYWRkcHMJeG1tMCx4bW0xCQk7ID0ge2QsIGMsIGIsIGF9CisJbW92c3MJeG1tMSxbZWRpXQkJOyA9IGdpWzBdCisJdW5wY2tscHMJeG1tMSx4bW0zCTsgPSB7LS0sICAtLSwgZ2lbazJdLCBnaVswXX0KKwl1bnBja2xwcwl4bW0yLHhtbTEJOyA9IHtnaVtrMl0sIGZpW2syXSwgZ2lbMF0sIGZpWzBdfQorCW1vdmFwcwl4bW0xLHhtbTIKKwlhZGRwcwl4bW0xLHhtbTAJOyA9IHtnMiwgZjIsIGcwLCBmMH0KKwlzdWJwcwl4bW0yLHhtbTAJOyA9IHtnMywgZjMsIGcxLCBmMX0KKworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICAgICAgID0gYzEqZjIgICAgICsgczEqZzM7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgICAgICAgPSBzMSpnMiAgICAgKyBjMSpmMzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAgICAgICA9IHMxKmYyICAgICAtIGMxKmczOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICAgICAgID0gYzEqZzIgICAgIC0gczEqZjM7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpWzAgXSAgPSBmMCAgICAgICAgKyBhOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaVswIF0gID0gZzAgICAgICAgICsgYzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazFdICA9IGcxICAgICAgICArIGI7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpW2sxXSAgPSBmMSAgICAgICAgKyBkOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaVtrMSAqIDJdICA9IGYwICAgIC0gYTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazEgKiAyXSAgPSBnMCAgICAtIGM7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpW2szXSAgICAgID0gZzEgICAgLSBiOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaVtrM10gICAgICA9IGYxICAgIC0gZDsKKwltb3ZhcHMJeG1tMyx4bW0xCisJbW92aGxwcwl4bW0xLHhtbTEJOyA9IHtnMiwgZjIsIGcyLCBmMn0KKwlzaHVmcHMJeG1tMyx4bW0yLDB4MTQJOyA9IHtmMSwgZzEsIGcwLCBmMH0KKwltdWxwcwl4bW0xLHhtbTYJOyAqPSB7K2MxLCArczEsICtzMSwgK2MxfQorCXNodWZwcwl4bW0yLHhtbTIsMHhCQgk7ID0ge2YzLCBnMywgZjMsIGczfQorCW11bHBzCXhtbTIseG1tNwk7ICo9IHstczEsIC1jMSwgK2MxLCArczF9CisJYWRkcHMJeG1tMSx4bW0yCTsgPSB7ZCwgYiwgYywgYX0KKwltb3ZhcHMJeG1tMix4bW0zCisJYWRkcHMJeG1tMyx4bW0xCTsgPSB7ZmlbazFdLCBnaVtrMV0sIGdpWzBdLCBmaVswXX0KKwlzdWJwcwl4bW0yLHhtbTEJOyA9IHtmaVtrM10sIGdpW2szXSwgZ2lbazEqMl0sIGZpW2sxKjJdfQorCW1vdmhscHMJeG1tMCx4bW0zCisJbW92c3MJW2VzaV0seG1tMworCXNodWZwcwl4bW0zLHhtbTMsMHg1NQorCW1vdnNzCVtlZGkrZWF4KjJdLHhtbTAKKwlzaHVmcHMJeG1tMCx4bW0wLDB4NTUKKwltb3ZzcwlbZWRpXSx4bW0zCisJbW92c3MJW2VzaStlYXgqMl0seG1tMAorCW1vdmhscHMJeG1tMCx4bW0yCisJbW92c3MJW2VzaStlYXgqNF0seG1tMgorCXNodWZwcwl4bW0yLHhtbTIsMHg1NQorCW1vdnNzCVtlZGkrZWR4KjJdLHhtbTAKKwlzaHVmcHMJeG1tMCx4bW0wLDB4NTUKKwltb3ZzcwlbZWRpK2VheCo0XSx4bW0yCisJbW92c3MJW2VzaStlZHgqMl0seG1tMAorCWxlYQllc2ksW2VzaSArIGVheCo4XSA7IGZpICs9IChrMSAqIDQpOworCWNtcAllc2ksW2VzcF0KKwlqbAluZWFyIC5scDIxCQk7IHdoaWxlIChmaTxmbik7CisKKworOyB1bnJvbGzBsKTOZG8gbG9vcKTPNDMrNMy/zuEKKworOyC6x8bivP6kx6TPpMqkpGZvcqXrobyl16TOaT0ypKuk6cDopPJ1bnJvbGxpbmekt6S/Cis7IGt4PSAgIDIsICAgOCwgIDMyLCAgMTI4Cis7IGs0PSAgMTYsICA2NCwgMjU2LCAxMDI0Cis7ICAgICAgIDAsIDYvMiwzMC8yLDEyNi8yCisKKwl4b3IJZWJ4LGVieAorCW1vdglibCwgNCoyCQk7ID0gaSA9IDQKKwljbXAJZWJ4LGVheAkJOyBpIDwgazEKKwlqbmwJbmVhciAuRjIyCis7ICAgICAgICAgICAgICAgZm9yIChpPTI7aTxreDtpKz0yKXsKKwlsb29wYWxpZ24JMTYKKy5scDIyOgorOyBhdCBoZXJlLCB4bW02IGlzIHtjMywgczMsIHMzLCBjM30KKzsgICAgICAgICAgICAgICAgICAgICAgIGMxID0gYzMqdF9jIC0gczMqdF9zOworOyAgICAgICAgICAgICAgICAgICAgICAgczEgPSBjMyp0X3MgKyBzMyp0X2M7CisJbW92bHBzCXhtbTAsW2VjeF0KKwlzaHVmcHMJeG1tMCx4bW0wLFI0KDEsMSwwLDApCTsgPSB7dF9zLCB0X3MsIHRfYywgdF9jfQorCW11bHBzCXhtbTYseG1tMAk7ID0ge2MzKnRzLCBzMyp0cywgczMqdGMsIGMzKnRjfQorCW1vdmhscHMJeG1tNCx4bW02CTsgPSB7LS0sICAgIC0tLCAgICBjMyp0cywgczMqdHN9CisJeG9ycHMJeG1tNCxbUElDX0VCUF9SRUwoUV9NUE1QKV0JOyA9IHstLSwgICAgLS0sICAgLWMzKnRzLCBzMyp0c30KKwlzdWJwcwl4bW02LHhtbTQJOyA9IHstLC0sIGMzKnRzK3MzKnRjLCBjMyp0Yy1zMyp0c309ey0sLSxzMSxjMX0KKworOyAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBjMSp0X2MgLSBzMSp0X3M7Cis7ICAgICAgICAgICAgICAgICAgICAgICBzMyA9IHMxKnRfYyArIGMxKnRfczsKKwlzaHVmcHMJeG1tNix4bW02LDB4MTQJOyA9IHtjMSwgczEsIHMxLCBjMX0KKwltdWxwcwl4bW0wLHhtbTYJOyA9IHt0cypjMSB0cypzMSB0YypzMSB0YypjMX0KKwltb3ZobHBzCXhtbTMseG1tMAorCXhvcnBzCXhtbTMsW1BJQ19FQlBfUkVMKFFfTVBNUCldCisJc3VicHMJeG1tMCx4bW0zCTsgPSB7LS0sIC0tLCBzMywgYzN9CisKKzsge3MyIHM0IGM0IGMyfSA9IHsyKnMxKmMxIDIqczMqYzMgMS0yKnMzKnMzIDEtMipzMSpzMX0KKwl1bnBja2xwcwl4bW02LHhtbTAJOyB4bW02ID0ge3MzLCBzMSwgYzMsIGMxfQorCW1vdmFwcwl4bW03LCB4bW02CisJc2h1ZnBzCXhtbTYseG1tNixSNCgyLDMsMSwwKQk7IHhtbTYgPSB7czEsIHMzLCBjMywgYzF9CisJYWRkcHMJeG1tNywgeG1tNwkJOyB7czMqMiwgczEqMiwgICAtLSwgICAtLX0KKwltb3YJZWRpLFtlc3ArX1ArNF0JCTsgPSBmegorCXNodWZwcwl4bW03LCB4bW03LCBSNCgyLDMsMywyKQk7IHtzMSoyLCBzMyoyLCBzMyoyLCBzMSoyfQorCXN1YgllZGksZWJ4CQkJOyBlZGkgPSBmeiAtIGkvMgorCW11bHBzCXhtbTcsIHhtbTYJCTsge3MxKnMxKjIsIHMzKnMzKjIsIHMzKmMzKjIsIHMxKmMxKjJ9CisJbGVhCWVzaSxbZWRpICsgZWJ4KjJdCTsgZXNpID0gZmkgPSBmeiAraS8yCisJc3VicHMJeG1tNywgW1BJQ19FQlBfUkVMKERfMTEwMCldCQk7IHstYzIsIC1jNCwgczQsIHMyfQorCWxlYQllZGksW2VkaSArIGVheCoyLTRdCTsgZWRpID0gZ2kgPSBmeiArazEtaS8yCisKKzsgICAgICAgICAgICAgICAgICAgICAgIGZpID0gZnogK2k7Cis7ICAgICAgICAgICAgICAgICAgICAgICBnaSA9IGZ6ICtrMS1pOworOyAgICAgICAgICAgICAgICAgICAgICAgZG97CisubHAyMjA6Cis7IHVucm9sbLjlpM5kbyBsb29wpM81MSs0zL/O4QorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICAgICAgID0gYzIqZmlbazEgIF0gKyBzMipnaVtrMSAgXTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAgICAgICA9IGM0KmZpW2sxKzFdICsgczQqZ2lbazEtMV07Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICAgPSBzNCpmaVtrMSsxXSAtIGM0KmdpW2sxLTFdOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICAgICAgID0gczIqZmlbazEgIF0gLSBjMipnaVtrMSAgXTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAgICAgICA9IGMyKmZpW2szICBdICsgczIqZ2lbazMgIF07Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgICAgICAgPSBjNCpmaVtrMysxXSArIHM0KmdpW2szLTFdOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICAgICAgID0gczQqZmlbazMrMV0gLSBjNCpnaVtrMy0xXTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAgICAgICA9IHMyKmZpW2szICBdIC0gYzIqZ2lbazMgIF07CisKKwltb3ZhcHMJeG1tNCx4bW03CTsgPSB7LWMyIC1jNCAgczQgIHMyfQorCXhvcnBzCXhtbTQsW1BJQ19FQlBfUkVMKFFfTU1QUCldCTsgPSB7IGMyICBjNCAgczQgIHMyfQorCXNodWZwcwl4bW00LHhtbTQsMHgxQgk7ID0geyBzMiAgczQgIGM0ICBjMn0KKwltb3ZscHMJeG1tMCxbZXNpK2VheCoyXQorCW1vdmxwcwl4bW0xLFtlZGkrZWF4KjJdCisJbW92bHBzCXhtbTIsW2VzaStlZHgqMl0KKwltb3ZscHMJeG1tMyxbZWRpK2VkeCoyXQorCXNodWZwcwl4bW0wLHhtbTAsMHgxNAorCXNodWZwcwl4bW0xLHhtbTEsMHg0MQorCXNodWZwcwl4bW0yLHhtbTIsMHgxNAorCXNodWZwcwl4bW0zLHhtbTMsMHg0MQorCW11bHBzCXhtbTAseG1tNAorCW11bHBzCXhtbTEseG1tNworCW11bHBzCXhtbTIseG1tNAorCW11bHBzCXhtbTMseG1tNworCWFkZHBzCXhtbTAseG1tMQk7IHhtbTAgPSB7YiwgZiwgZSwgYX0KKwlhZGRwcwl4bW0yLHhtbTMJOyB4bW0yID0ge2QsIGgsIGcsIGN9Cis7MTcKKworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMCAgICAgID0gZmlbMCAgIF0gICAgKyBhOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmNCAgICAgID0gZmlbMCArMV0gICAgKyBlOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnNCAgICAgID0gZ2lbMCAtMV0gICAgKyBmOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMCAgICAgID0gZ2lbMCAgIF0gICAgKyBiOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMSAgICAgID0gZmlbMCAgIF0gICAgLSBhOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmNSAgICAgID0gZmlbMCArMV0gICAgLSBlOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnNSAgICAgID0gZ2lbMCAtMV0gICAgLSBmOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMSAgICAgID0gZ2lbMCAgIF0gICAgLSBiOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMiAgICAgID0gZmlbazIgIF0gICAgKyBjOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmNiAgICAgID0gZmlbazIrMV0gICAgKyBnOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnNiAgICAgID0gZ2lbazItMV0gICAgKyBoOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMiAgICAgID0gZ2lbazIgIF0gICAgKyBkOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMyAgICAgID0gZmlbazIgIF0gICAgLSBjOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmNyAgICAgID0gZmlbazIrMV0gICAgLSBnOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnNyAgICAgID0gZ2lbazItMV0gICAgLSBoOworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMyAgICAgID0gZ2lbazIgIF0gICAgLSBkOworCW1vdmxwcwl4bW0xLFtlc2kgICAgICBdCisJbW92aHBzCXhtbTEsW2VkaSAgICAgIF0KKwltb3ZhcHMJeG1tNCx4bW0xCisJc3VicHMJeG1tMSx4bW0wCTsgeG1tMSA9IHtnMSwgZzUsIGY1LCBmMX0KKwltb3ZscHMJeG1tMyxbZXNpK2VheCo0XQorCW1vdmhwcwl4bW0zLFtlZGkrZWF4KjRdCisJbW92YXBzCXhtbTUseG1tMworCXN1YnBzCXhtbTMseG1tMgk7IHhtbTMgPSB7ZzMsIGc3LCBmNywgZjN9CisJYWRkcHMJeG1tMCx4bW00CTsgeG1tMCA9IHtnMCwgZzQsIGY0LCBmMH0KKwlhZGRwcwl4bW0yLHhtbTUJOyB4bW0yID0ge2cyLCBnNiwgZjYsIGYyfQorOzEwCisKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAgICAgICA9IGMxKmYyICAgICArIHMxKmczOwm95yq95yArILXVKrXVCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgICAgICAgPSBjMypmNiAgICAgKyBzMypnNzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAgICAgICA9IHMzKmc2ICAgICArIGMzKmY3OworOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICAgICAgID0gczEqZzIgICAgICsgYzEqZjM7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgICAgICAgPSBjMSpnMiAgICAgLSBzMSpmMzsJvecqtdUgLSC11Sq95worOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICAgICAgID0gYzMqZzYgICAgIC0gczMqZjc7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICAgPSBzMypmNiAgICAgLSBjMypnNzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAgICAgICA9IHMxKmYyICAgICAtIGMxKmczOworCisJbW92YXBzCXhtbTUseG1tNgk7IHhtbTYgPSB7czEsIHMzLCBjMywgYzF9CisJc2h1ZnBzCXhtbTUseG1tNSwweDFCCTsgPSB7YzEsIGMzLCBzMywgczF9CisJbW92YXBzCXhtbTQseG1tMgorCW11bHBzCXhtbTQseG1tNgorCXNodWZwcwl4bW0yLHhtbTIsMHgxQgk7IHhtbTIgPSB7ZjIsIGY2LCBnNiwgZzJ9CisJbXVscHMJeG1tMix4bW02CisJbXVscHMJeG1tNSx4bW0zCisJbXVscHMJeG1tMyx4bW02CisJc2h1ZnBzCXhtbTMseG1tMywweDFCCisJYWRkcHMJeG1tNCx4bW0zCTsgPSB7YywgZywgZSwgYX0KKwlzdWJwcwl4bW0yLHhtbTUJOyA9IHtiLCBmLCBoLCBkfQorOzEwCisKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbMCAgIF0gID0gZjAgICAgICAgICsgYTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbMCArMV0gID0gZjQgICAgICAgICsgZTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbMCAtMV0gID0gZzQgICAgICAgICsgZzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbMCAgIF0gID0gZzAgICAgICAgICsgYzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbazIgIF0gID0gZjAgICAgICAgIC0gYTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbazIrMV0gID0gZjQgICAgICAgIC0gZTsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazItMV0gID0gZzQgICAgICAgIC0gZzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazIgIF0gID0gZzAgICAgICAgIC0gYzsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbazEgIF0gID0gZjEgICAgICAgICsgZDsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbazErMV0gID0gZjUgICAgICAgICsgaDsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazEtMV0gID0gZzUgICAgICAgICsgZjsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazEgIF0gID0gZzEgICAgICAgICsgYjsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbazMgIF0gID0gZjEgICAgICAgIC0gZDsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlbazMrMV0gID0gZjUgICAgICAgIC0gaDsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazMtMV0gID0gZzUgICAgICAgIC0gZjsKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lbazMgIF0gID0gZzEgICAgICAgIC0gYjsKKwltb3ZhcHMJeG1tMyx4bW0wCisJc3VicHMJeG1tMCx4bW00CisJbW92bHBzCVtlc2krZWF4KjRdLHhtbTAKKwltb3ZocHMJW2VkaStlYXgqNF0seG1tMAorCWFkZHBzCXhtbTQseG1tMworCW1vdmxwcwlbZXNpICAgICAgXSx4bW00CisJbW92aHBzCVtlZGkgICAgICBdLHhtbTQKKworCW1vdmFwcwl4bW01LHhtbTEKKwlzdWJwcwl4bW0xLHhtbTIKKwltb3ZscHMJW2VzaStlZHgqMl0seG1tMQorCW1vdmhwcwlbZWRpK2VkeCoyXSx4bW0xCisJYWRkcHMJeG1tMix4bW01CisJbW92bHBzCVtlc2krZWF4KjJdLHhtbTIKKwltb3ZocHMJW2VkaStlYXgqMl0seG1tMgorOyAxNAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaSAgICAgKz0gazQ7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpICAgICArPSBrNDsKKwlsZWEJZWRpLFtlZGkgKyBlYXgqOF0gOyBnaSArPSAoazEgKiA0KTsKKwlsZWEJZXNpLFtlc2kgKyBlYXgqOF0gOyBmaSArPSAoazEgKiA0KTsKKwljbXAJZXNpLFtlc3BdCisJamwJbmVhciAubHAyMjAJCTsgd2hpbGUgKGZpPGZuKTsKKzsgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGZpPGZuKTsKKworCWFkZAllYngsYnl0ZSAyKjQJOyBpKz0gNAorCWNtcAllYngsZWF4CQk7IGkgPCBrMQorCXNodWZwcwl4bW02LHhtbTYsUjQoMSwyLDIsMSkJOyAoLS0sczMsYzMsLS0pID0+IHtjMywgczMsIHMzLCBjM30KKwlqbAluZWFyIC5scDIyCis7ICAgICAgICAgICAgICAgfQorLkYyMjoKKwlzaGwJZWF4LDIKKwlhZGQJZWN4LCBieXRlIDgKKwljbXAJZWF4LFtlc3ArX1ArOF0JOyB3aGlsZSAoKGsxICogNCk8bik7CisJamxlCW5lYXIgLmxwMgorCXBvcAllYnAKKwlwb3AJZWJwCisJcG9wCWVkaQorCXBvcAllc2kKKwlwb3AJZWJ4CisJcmV0CisKKwllbmQKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvaTM4Ni9mZnR0YmwubmFzIGIvbGlibXAzbGFtZS9pMzg2L2ZmdHRibC5uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkZDlhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvaTM4Ni9mZnR0YmwubmFzCkBAIC0wLDAgKzEsNzggQEAKKworOwlmb3IgbmV3IEdPR08tbm8tY29kYSAoMTk5OS8wOSkKKzsJQ29weXJpZ2h0IChDKSAxOTk5IHNoaWdlbworOwlzcGVjaWFsIHRoYW5rcyB0byBVUlVSSSwgS2VpaWNoaSBTQUtBSQorCisKKzsJZmZ0IHNpbixjb3MsZ3JheaXGobyl1qXrCis7CTk5LzA4LzIxCis7CTk5LzA5LzAxKKSmpOuk6imhoaXTpcOlyMi/xb6lxqG8pdal67rvvfwKKzsJOTkvMDkvMTQgpbCl7KWkpbOhvKXJpaSl86XHpcOlr6W5yb2lsKXtobyl0KXrsr0KKworJWluY2x1ZGUgIm5hc20uaCIKKworCWdsb2JhbGRlZgljb3N0YWJfZmZ0CisJZ2xvYmFsZGVmCXNpbnRhYl9mZnQKKwlnbG9iYWxkZWYJZ3JheV9pbmRleAorCisJc2VnbWVudF9kYXRhCisJYWxpZ24gMTYKKworY29zdGFiX2ZmdDoKKwlkZCAwLjAwMDAwMDAwMDAwMAorCWRkIDAuNzA3MTA2NzgxMTg3CisJZGQgMC45MjM4Nzk1MzI1MTEKKwlkZCAwLjk4MDc4NTI4MDQwMworCWRkIDAuOTk1MTg0NzI2NjcyCisJZGQgMC45OTg3OTU0NTYyMDUKKwlkZCAwLjk5OTY5ODgxODY5NgorCWRkIDAuOTk5OTI0NzAxODM5CisJZGQgMC45OTk5ODExNzUyODMKKwlkZCAwLjk5OTk5NTI5MzgxMAorCWRkIDAuOTk5OTk4ODIzNDUyCisJZGQgMC45OTk5OTk3MDU4NjMKKwlkZCAwLjk5OTk5OTkyNjQ2NgorCWRkIDAuOTk5OTk5OTgxNjE2CisJZGQgMC45OTk5OTk5OTU0MDQKKwlkZCAwLjk5OTk5OTk5ODg1MQorCitzaW50YWJfZmZ0OgorCWRkIDEuMDAwMDAwMDAwMDAwCisJZGQgMC43MDcxMDY3ODExODcKKwlkZCAwLjM4MjY4MzQzMjM2NQorCWRkIDAuMTk1MDkwMzIyMDE2CisJZGQgMC4wOTgwMTcxNDAzMzAKKwlkZCAwLjA0OTA2NzY3NDMyNworCWRkIDAuMDI0NTQxMjI4NTIzCisJZGQgMC4wMTIyNzE1MzgyODYKKwlkZCAwLjAwNjEzNTg4NDY0OQorCWRkIDAuMDAzMDY3OTU2NzYzCisJZGQgMC4wMDE1MzM5ODAxODYKKwlkZCAwLjAwMDc2Njk5MDMxOQorCWRkIDAuMDAwMzgzNDk1MTg4CisJZGQgMC4wMDAxOTE3NDc1OTcKKwlkZCAwLjAwMDA5NTg3Mzc5OQorCWRkIDAuMDAwMDQ3OTM2OTAwCisKKwkJYWxpZ24gMTYKK2dyYXlfaW5kZXg6CisJCWRiCTIsIDMsIDIsIDQsIDIsIDMsIDIsIDUsIDIsIDMsIDIsIDQsIDIsIDMsIDIsIDYKKwkJZGIJMiwgMywgMiwgNCwgMiwgMywgMiwgNSwgMiwgMywgMiwgNCwgMiwgMywgMiwgNworCQlkYgkyLCAzLCAyLCA0LCAyLCAzLCAyLCA1LCAyLCAzLCAyLCA0LCAyLCAzLCAyLCA2CisJCWRiCTIsIDMsIDIsIDQsIDIsIDMsIDIsIDUsIDIsIDMsIDIsIDQsIDIsIDMsIDIsIDgKKwkJZGIJMiwgMywgMiwgNCwgMiwgMywgMiwgNSwgMiwgMywgMiwgNCwgMiwgMywgMiwgNgorCQlkYgkyLCAzLCAyLCA0LCAyLCAzLCAyLCA1LCAyLCAzLCAyLCA0LCAyLCAzLCAyLCA3CisJCWRiCTIsIDMsIDIsIDQsIDIsIDMsIDIsIDUsIDIsIDMsIDIsIDQsIDIsIDMsIDIsIDYKKwkJZGIJMiwgMywgMiwgNCwgMiwgMywgMiwgNSwgMiwgMywgMiwgNCwgMiwgMywgMiwgOQorCQlkYgkyLCAzLCAyLCA0LCAyLCAzLCAyLCA1LCAyLCAzLCAyLCA0LCAyLCAzLCAyLCA2CisJCWRiCTIsIDMsIDIsIDQsIDIsIDMsIDIsIDUsIDIsIDMsIDIsIDQsIDIsIDMsIDIsIDcKKwkJZGIJMiwgMywgMiwgNCwgMiwgMywgMiwgNSwgMiwgMywgMiwgNCwgMiwgMywgMiwgNgorCQlkYgkyLCAzLCAyLCA0LCAyLCAzLCAyLCA1LCAyLCAzLCAyLCA0LCAyLCAzLCAyLCA4CisJCWRiCTIsIDMsIDIsIDQsIDIsIDMsIDIsIDUsIDIsIDMsIDIsIDQsIDIsIDMsIDIsIDYKKwkJZGIJMiwgMywgMiwgNCwgMiwgMywgMiwgNSwgMiwgMywgMiwgNCwgMiwgMywgMiwgNworCQlkYgkyLCAzLCAyLCA0LCAyLCAzLCAyLCA1LCAyLCAzLCAyLCA0LCAyLCAzLCAyLCA2CisJCWRiCTIsIDMsIDIsIDQsIDIsIDMsIDIsIDUsIDIsIDMsIDIsIDQsIDIsIDMsIDIsIDEwCisKKwlzZWdtZW50X2NvZGUKKworCWVuZApkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9pMzg2L25hc20uaCBiL2xpYm1wM2xhbWUvaTM4Ni9uYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkM2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvaTM4Ni9uYXNtLmgKQEAgLTAsMCArMSwyNjYgQEAKKworOwlDb3B5cmlnaHQgKEMpIDE5OTkgVVJVUkkKKworOwluYXNt77+90aXepe+/ve+/ve+/vQorOwkxOTk5LzA4LzIxIO+/ve+/ve+/vQorOwkxOTk5LzEwLzEwIO+/ve+/ve+/vcSk77+977+9ybLvv70KKzsJMTk5OS8xMC8yNyBhb3V077+90LHvv70KKzsJMTk5OS8xMS8wNyBwdXNoZiwgcG9wZiDvv73vv71OQVNN77+9zqXQpe+/ve+/vdCx77+9Cis7CTE5OTkvMTIvMDIgZm9yIEJDQyAoIFRoYW5rcyB0byBNaXF1ZWwgKQorCis7IGZvciBXaW5kb3dzIFZpc3VhbCBDKysgICAgICAgIC0+IGRlZmluZSBXSU4zMgorOyAgICAgICAgICAgICBCb3JsYW5kIG9yIGN5Z3dpbiAtPiAgICAgICAgV0lOMzIgYW5kIENPRkYKKzsgZm9yIEZyZWVCU0QgMi54ICAgICAgICAgICAgICAgLT4gICAgICAgIEFPVVQKKzsgZm9yIFRvd25zT1MgICAgICAgICAgICAgICAgICAgLT4gICAgICAgIF9fdG9zX18KKzsgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgLT4gICBub25lCisKKzvMvu+/ve+/ve+/ve+/vdWk77+977+977+9CisKK0JJVFMgMzIKKworJWlmZGVmIFlBU00KKwklZGVmaW5lIHNlZ21lbnRfY29kZSBzZWdtZW50IC50ZXh0IGFsaWduPTE2IHVzZTMyCisJJWRlZmluZSBzZWdtZW50X2RhdGEgc2VnbWVudCAuZGF0YSBhbGlnbj0xNiB1c2UzMgorCSVkZWZpbmUgc2VnbWVudF9ic3MgIHNlZ21lbnQgLmJzcyBhbGlnbj0xNiB1c2UzMgorJWVsaWZkZWYgV0lOMzIKKwklZGVmaW5lIHNlZ21lbnRfY29kZSBzZWdtZW50IC50ZXh0IGFsaWduPTE2IGNsYXNzPUNPREUgdXNlMzIKKwklZGVmaW5lIHNlZ21lbnRfZGF0YSBzZWdtZW50IC5kYXRhIGFsaWduPTE2IGNsYXNzPURBVEEgdXNlMzIKKyVpZmRlZiBfX0JPUkxBTkRDX18KKwklZGVmaW5lIHNlZ21lbnRfYnNzICBzZWdtZW50IC5kYXRhIGFsaWduPTE2IGNsYXNzPURBVEEgdXNlMzIKKyVlbHNlCisJJWRlZmluZSBzZWdtZW50X2JzcyAgc2VnbWVudCAuYnNzIGFsaWduPTE2IGNsYXNzPURBVEEgdXNlMzIKKyVlbmRpZgorJWVsaWZkZWYgQU9VVAorCSVkZWZpbmUgX05BTUlORworCSVkZWZpbmUgc2VnbWVudF9jb2RlIHNlZ21lbnQgLnRleHQKKwklZGVmaW5lIHNlZ21lbnRfZGF0YSBzZWdtZW50IC5kYXRhCisJJWRlZmluZSBzZWdtZW50X2JzcyAgc2VnbWVudCAuYnNzCislZWxzZQorJWlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGVsZgorCXNlY3Rpb24gLm5vdGUuR05VLXN0YWNrIHByb2diaXRzIG5vYWxsb2Mgbm9leGVjIG5vd3JpdGUgYWxpZ249MQorJWVuZGlmCisJJWRlZmluZSBzZWdtZW50X2NvZGUgc2VnbWVudCAudGV4dCBhbGlnbj0xNiBjbGFzcz1DT0RFIHVzZTMyCisJJWRlZmluZSBzZWdtZW50X2RhdGEgc2VnbWVudCAuZGF0YSBhbGlnbj0xNiBjbGFzcz1EQVRBIHVzZTMyCisJJWRlZmluZSBzZWdtZW50X2JzcyAgc2VnbWVudCAuYnNzIGFsaWduPTE2IGNsYXNzPURBVEEgdXNlMzIKKyVlbmRpZgorCislaWZkZWYgV0lOMzIKKwklZGVmaW5lIF9OQU1JTkcKKyVlbmRpZgorCislaWZkZWYgX190b3NfXworZ3JvdXAgQ0dST1VQIHRleHQKK2dyb3VwIERHUk9VUCBkYXRhCislZW5kaWYKKworO8Ox77+977+977+977+977+9xrDvv73vv73vv73vv73vv73vv73vv73vv70KKworJWlkZWZpbmUgZmxvYXQgZHdvcmQKKyVpZGVmaW5lIGZzaXplIDQKKyVpZGVmaW5lIGZzaXplbihhKSAoZnNpemUqKGEpKQorCis777+976G877+9ybfvv73vv70KKworJWlkZWZpbmUgd3NpemUgMgorJWlkZWZpbmUgd3NpemVuKGEpICh3c2l6ZSooYSkpCislaWRlZmluZSBkd3NpemUgNAorJWlkZWZpbmUgZHdzaXplbihhKSAoZHdzaXplKihhKSkKKworO1JFRworCislZGVmaW5lIHIwIGVheAorJWRlZmluZSByMSBlYngKKyVkZWZpbmUgcjIgZWN4CislZGVmaW5lIHIzIGVkeAorJWRlZmluZSByNCBlc2kKKyVkZWZpbmUgcjUgZWRpCislZGVmaW5lIHI2IGVicAorJWRlZmluZSByNyBlc3AKKworO01NWCwzRE5vdyEsU1NFCisKKyVkZWZpbmUgcG1vdgltb3ZxCislZGVmaW5lIHBtb3ZkCW1vdmQKKworJWRlZmluZSBwdXBsZHEJcHVucGNrbGRxCislZGVmaW5lIHB1cGhkcQlwdW5wY2toZHEKKyVkZWZpbmUgcHVwbHdkCXB1bnBja2x3ZAorJWRlZmluZSBwdXBod2QJcHVucGNraHdkCisKKyVkZWZpbmUgeG0wIHhtbTAKKyVkZWZpbmUgeG0xIHhtbTEKKyVkZWZpbmUgeG0yIHhtbTIKKyVkZWZpbmUgeG0zIHhtbTMKKyVkZWZpbmUgeG00IHhtbTQKKyVkZWZpbmUgeG01IHhtbTUKKyVkZWZpbmUgeG02IHhtbTYKKyVkZWZpbmUgeG03IHhtbTcKKworO++/ve+/ve+/ve+/ve+/vcOl1aXvv73vv73RpO+/vTTvv73Kpd6l77+977+977+9CisKKyVkZWZpbmUgUjQoYSxiLGMsZCkgKGEqNjQrYioxNitjKjQrZCkKKworO0Pvv73ppaTvv73vv73vv73KtMqw16Xepe+/ve+/ve+/vQorCislaW1hY3JvIGdsb2JhbGRlZiAxCisJJWlmZGVmIF9OQU1JTkcKKwkJJWRlZmluZSAlMSBfJTEKKwklZW5kaWYKKwlnbG9iYWwgJTEKKyVlbmRtYWNybworCislaW1hY3JvIGV4dGVybmRlZiAxCisJJWlmZGVmIF9OQU1JTkcKKwkJJWRlZmluZSAlMSBfJTEKKwklZW5kaWYKKwlleHRlcm4gJTEKKyVlbmRtYWNybworCislaW1hY3JvIHByb2MgMQorCSVwdXNoCXByb2MKKwklaWZkZWYgX05BTUlORworCQlnbG9iYWwgXyUxCisJJWVsc2UKKwkJZ2xvYmFsICUxCisJJWVuZGlmCisKKwlhbGlnbiAzMgorJTE6CitfJTE6CisKKwklYXNzaWduICUkU1RBQ0sgMAorCSVhc3NpZ24gJSRTVEFDS04gMAorCSVhc3NpZ24gJSRBUkcgNAorJWVuZG1hY3JvCisKKyVpbWFjcm8gZW5kcHJvYyAwCisJJWlmbmN0eCBwcm9jCisJCSVlcnJvciBleHBlY3RlZCAncHJvYycgYmVmb3JlICdlbmRwcm9jJy4KKwklZWxzZQorCQklaWYgJSRTVEFDSyA+IDAKKwkJCWFkZCBlc3AsICUkU1RBQ0sKKwkJJWVuZGlmCisKKwkJJWlmICUkU1RBQ0sgPD4gKC0lJFNUQUNLTikKKwkJCSVlcnJvciBTVEFDS0xFVkVMIG1pc21hdGNoIGNoZWNrICdsb2NhbCcsICdhbGxvYycsICdwdXNoZCcsICdwb3BkJworCQklZW5kaWYKKworCQlyZXQKKwkJJXBvcAorCSVlbmRpZgorJWVuZG1hY3JvCisKKyVpZGVmaW5lIHNwKGEpIGVzcCslJFNUQUNLK2EKKworJWltYWNybyBhcmcgMQorCSUwMAllcXUgJSRBUkcKKwklYXNzaWduICUkQVJHICUkQVJHKyUxCislZW5kbWFjcm8KKworJWltYWNybyBsb2NhbCAxCisJJWFzc2lnbiAlJFNUQUNLTiAlJFNUQUNLTi0lMQorCSUwMCBlcXUgJSRTVEFDS04KKyVlbmRtYWNybworCislaW1hY3JvIGFsbG9jIDAKKwlzdWIgZXNwLCAoLSUkU1RBQ0tOKS0lJFNUQUNLCisJJWFzc2lnbiAlJFNUQUNLICgtJSRTVEFDS04pCislZW5kbWFjcm8KKworJWltYWNybyBwdXNoZCAxLSoKKwklcmVwICUwCisJCXB1c2ggJTEKKwkJJWFzc2lnbiAlJFNUQUNLICUkU1RBQ0srNAorCSVyb3RhdGUgMQorCSVlbmRyZXAKKyVlbmRtYWNybworCislaW1hY3JvIHBvcGQgMS0qCisJJXJlcCAlMAorCSVyb3RhdGUgLTEKKwkJcG9wICUxCisJCSVhc3NpZ24gJSRTVEFDSyAlJFNUQUNLLTQKKwklZW5kcmVwCislZW5kbWFjcm8KKworOyBidWcgb2YgTkFTTS0wLjk4CislZGVmaW5lIHB1c2hmIGRiIDB4NjYsIDB4OUMKKyVkZWZpbmUgcG9wZiAgZGIgMHg2NiwgMHg5RAorCislZGVmaW5lCWdlMTYobikJCSgoKChuKSAvIDE2KSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpCislZGVmaW5lCWdlMTUobikJCSgoKChuKSAvIDE1KSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpCislZGVmaW5lCWdlMTQobikJCSgoKChuKSAvIDE0KSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpCislZGVmaW5lCWdlMTMobikJCSgoKChuKSAvIDEzKSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpCislZGVmaW5lCWdlMTIobikJCSgoKChuKSAvIDEyKSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpCislZGVmaW5lCWdlMTEobikJCSgoKChuKSAvIDExKSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpCislZGVmaW5lCWdlMTAobikJCSgoKChuKSAvIDEwKSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpCislZGVmaW5lCWdlOShuKQkJKCgoKG4pIC8gIDkpKjB4RkZGRkZGRkYpICYgMHhGRkZGRkZGRikKKyVkZWZpbmUJZ2U4KG4pCQkoZ2U5KG4pIHwgKCgoKG4pIC8gIDgpKjB4RkZGRkZGRkYpICYgMHhGRkZGRkZGRikpCislZGVmaW5lCWdlNyhuKQkJKGdlOShuKSB8ICgoKChuKSAvICA3KSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpKQorJWRlZmluZQlnZTYobikJCShnZTkobikgfCAoKCgobikgLyAgNikqMHhGRkZGRkZGRikgJiAweEZGRkZGRkZGKSkKKyVkZWZpbmUJZ2U1KG4pCQkoZ2U5KG4pIHwgKCgoKG4pIC8gIDUpKjB4RkZGRkZGRkYpICYgMHhGRkZGRkZGRikpCislZGVmaW5lCWdlNChuKQkJKGdlNShuKSB8ICgoKChuKSAvICA0KSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpKQorJWRlZmluZQlnZTMobikJCShnZTUobikgfCAoKCgobikgLyAgMykqMHhGRkZGRkZGRikgJiAweEZGRkZGRkZGKSkKKyVkZWZpbmUJZ2UyKG4pCQkoZ2UzKG4pIHwgKCgoKG4pIC8gIDIpKjB4RkZGRkZGRkYpICYgMHhGRkZGRkZGRikpCislZGVmaW5lCWdlMShuKQkJKGdlMihuKSB8ICgoKChuKSAvICAxKSoweEZGRkZGRkZGKSAmIDB4RkZGRkZGRkYpKQorCis7IG1hY3JvIHRvIGFsaWduIGZvciBiZWdpbmluZyBvZiBsb29wCis7ICUxICAgZG9lcyBub3QgYWxpZ24gaWYgaXQgTEUgYnl0ZXMgdG8gbmV4dCBhbGlnbm1lbnQgCis7ICAgICAgNC4uMTYgCis7ICAgICAgZGVmYXVsdCBpcyAxMgorCislaW1hY3JvCWxvb3BhbGlnbks2CTAtMSAxMiAKKyUlaGVyZToKKwl0aW1lcyAoKCQkLSUlaGVyZSkgJiAxNSAmIGdlMSgoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZTQoKCQkLSUlaGVyZSkgJiAxNSkpIG5vcAorCXRpbWVzICgxICAgICAgICAgICAgICAgICYgZ2U0KCgkJC0lJWhlcmUpICYgMTUpICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIGptcCBzaG9ydCAlJXNraXAKKwl0aW1lcyAoKCgoJCQtJSVoZXJlKSAmIDE1KS0yKSAmIGdlNCgoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBub3AKKyUlc2tpcDoKKyVlbmRtYWNybworCislaW1hY3JvCWxvb3BhbGlnbks3CTAtMSAxMiAKKyUlaGVyZToKKwl0aW1lcyAoMSAmIGdlMSgoJCQtJSVoZXJlKSAmIDE1KSAgJiB+Z2UyKCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBub3AKKwl0aW1lcyAoMSAmIGdlMigoJCQtJSVoZXJlKSAmIDE1KSAgJiB+Z2UzKCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBEQiAwOEJoLDBDMGgKKwl0aW1lcyAoMSAmIGdlMygoJCQtJSVoZXJlKSAmIDE1KSAgJiB+Z2U0KCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBEQiAwOERoLDAwNGgsMDIwaAorCXRpbWVzICgxICYgZ2U0KCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZTUoKCQkLSUlaGVyZSkgJiAxNSkgICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIERCIDA4RGgsMDQ0aCwwMjBoLDAwMGgKKwl0aW1lcyAoMSAmIGdlNSgoJCQtJSVoZXJlKSAmIDE1KSAgJiB+Z2U2KCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBEQiAwOERoLDA0NGgsMDIwaCwwMDBoLDA5MGgKKwl0aW1lcyAoMSAmIGdlNigoJCQtJSVoZXJlKSAmIDE1KSAgJiB+Z2U3KCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBEQiAwOERoLDA4MGgsMCwwLDAsMAorCXRpbWVzICgxICYgZ2U3KCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZTgoKCQkLSUlaGVyZSkgJiAxNSkgICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIERCIDA4RGgsMDA0aCwwMDVoLDAsMCwwLDAKKwl0aW1lcyAoMSAmIGdlOCgoJCQtJSVoZXJlKSAmIDE1KSAgJiB+Z2U5KCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBEQiAwOERoLDAwNGgsMDA1aCwwLDAsMCwwLDkwaAorCXRpbWVzICgxICYgZ2U5KCgkJC0lJWhlcmUpICYgMTUpICAmIH5nZTEwKCgkJC0lJWhlcmUpICYgMTUpICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIERCIDBFQmgsMDA3aCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgKKwl0aW1lcyAoMSAmIGdlMTAoKCQkLSUlaGVyZSkgJiAxNSkgJiB+Z2UxMSgoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBEQiAwRUJoLDAwOGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaAorCXRpbWVzICgxICYgZ2UxMSgoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZTEyKCgkJC0lJWhlcmUpICYgMTUpICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIERCIDBFQmgsMDA5aCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaAorCXRpbWVzICgxICYgZ2UxMigoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZTEzKCgkJC0lJWhlcmUpICYgMTUpICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIERCIDBFQmgsMDBBaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgKKwl0aW1lcyAoMSAmIGdlMTMoKCQkLSUlaGVyZSkgJiAxNSkgJiB+Z2UxNCgoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZSUxKCgkJC0lJWhlcmUpICYgMTUpKSBEQiAwRUJoLDAwQmgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaAorCXRpbWVzICgxICYgZ2UxNCgoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZTE1KCgkJC0lJWhlcmUpICYgMTUpICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIERCIDBFQmgsMDBDaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaAorCXRpbWVzICgxICYgZ2UxNSgoJCQtJSVoZXJlKSAmIDE1KSAmIH5nZTE2KCgkJC0lJWhlcmUpICYgMTUpICYgfmdlJTEoKCQkLSUlaGVyZSkgJiAxNSkpIERCIDBFQmgsMDBEaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgsOTBoLDkwaCw5MGgKKyUlc2tpcDoKKyVlbmRtYWNybworCislaW1hY3JvCWxvb3BhbGlnbgkwLTEgMTIgCisJbG9vcGFsaWduSzcgJTEKKyVlbmRtYWNybworJWRlZmluZSBQQUNLKHgseSx6LHcpCSh4KjY0K3kqMTYreio0K3cpCisKKyVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxlbGYKKworJWlkZWZpbmUgUElDX0JBU0UoQSkgX0dMT0JBTF9PRkZTRVRfVEFCTEVfICsgJCQgLSAkIHdydCAuLmdvdHBjCislaWRlZmluZSBQSUNfRUJQX1JFTChBKSBlYnAgKyBBIHdydCAuLmdvdG9mZgorJW1hY3JvIFBJQ19PRkZTRVRUQUJMRSAwCitleHRlcm4gIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXworZ2V0X3BjLmJwOgorCW1vdiBlYnAsIFtlc3BdCisJcmV0bgorJWVuZG1hY3JvCisKKyVlbHNlCisKKyVkZWZpbmUgUElDX0JBU0UoQSkgKDApCislZGVmaW5lIFBJQ19FQlBfUkVMKEEpIChBKQorJW1hY3JvIFBJQ19PRkZTRVRUQUJMRSAwCitnZXRfcGMuYnA6CisJbW92IGVicCwgW2VzcF0KKwlyZXRuCislZW5kbWFjcm8KKworJWVuZGlmCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2kzODYvc2NhbGFyLm5hcyBiL2xpYm1wM2xhbWUvaTM4Ni9zY2FsYXIubmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjlmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2kzODYvc2NhbGFyLm5hcwpAQCAtMCwwICsxLDEwMjIgQEAKKzsKKzsgICAgKEMpIEZyYW5rIEtsZW1tIDE5OTUsOTksMjAwMAorOyAgICBEZWRpY2F0ZWQgdG8gdGhlIExBTUUgcHJvamVjdAorOworOworICAgICAgICAlaW5jbHVkZSAibmFzbS5oIgorCisgICAgICAgIHNlZ21lbnRfY29kZQorICAgICAgICAKKzsgZmxvYXRfdCAgc2NhbGFyMDRfZmxvYXQzMl9pMzg3ICggCis7ICAgICAgICAgY29uc3QgZmxvYXQzMl90KiBjb25zdCAgcCwgCis7ICAgICAgICAgY29uc3QgZmxvYXQzMl90KiBjb25zdCAgcSApOworCitwcm9jICAgIHNjYWxhcjA0X2Zsb2F0MzJfaTM4NworJSRwICAgICBhcmcgICAgIDQKKyUkcSAgICAgYXJnICAgICA0Cis7OzsgICAgIGFsbG9jCisKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeF0KKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMTJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDEyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCitlbmRwcm9jCisKKworcHJvYyAgICBzY2FsYXIwOF9mbG9hdDMyX2kzODcKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorOzs7ICAgICBhbGxvYworCisgICAgICAgIG1vdiAgICAgZWF4LFtzcCglJHApXQorICAgICAgICBtb3YgICAgIGVkeCxbc3AoJSRxKV0KKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHhdCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArICA0XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAgNF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArICA4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAgOF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDEyXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAxMl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAxNl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMTZdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMjBdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDIwXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDI0XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAyNF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAyOF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMjhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjEyX2Zsb2F0MzJfaTM4NworJSRwICAgICBhcmcgICAgIDQKKyUkcSAgICAgYXJnICAgICA0Cis7OzsgICAgIGFsbG9jCisKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeF0KKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMTJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDEyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDE2XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAxNl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAyMF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMjBdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMjRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDI0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDI4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAyOF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAzMl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMzJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMzZdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDM2XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDQwXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA0MF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA0NF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjE2X2Zsb2F0MzJfaTM4NworJSRwICAgICBhcmcgICAgIDQKKyUkcSAgICAgYXJnICAgICA0Cis7OzsgICAgIGFsbG9jCisKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeF0KKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMTJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDEyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDE2XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAxNl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAyMF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMjBdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMjRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDI0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDI4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAyOF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAzMl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMzJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMzZdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDM2XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDQwXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA0MF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA0NF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDQ4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDUyXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA1Ml0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA1Nl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNTZdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNjBdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDYwXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCitlbmRwcm9jCisKKworcHJvYyAgICBzY2FsYXIyMF9mbG9hdDMyX2kzODcKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorOzs7ICAgICBhbGxvYworCisgICAgICAgIG1vdiAgICAgZWF4LFtzcCglJHApXQorICAgICAgICBtb3YgICAgIGVkeCxbc3AoJSRxKV0KKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHhdCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArICA0XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAgNF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArICA4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAgOF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDEyXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAxMl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAxNl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMTZdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMjBdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDIwXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDI0XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAyNF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAyOF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMjhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMzJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDMyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDM2XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAzNl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA0MF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNDBdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNDRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDQ0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDQ4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA0OF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA1Ml0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNTJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNTZdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDU2XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDYwXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA2MF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA2NF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNjRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNjhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDY4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDcyXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA3Ml0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA3Nl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNzZdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjI0X2Zsb2F0MzJfaTM4NworJSRwICAgICBhcmcgICAgIDQKKyUkcSAgICAgYXJnICAgICA0Cis7OzsgICAgIGFsbG9jCisKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeF0KKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMTJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDEyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDE2XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAxNl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAyMF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMjBdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMjRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDI0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDI4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAyOF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAzMl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMzJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMzZdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDM2XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDQwXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA0MF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA0NF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDQ4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDUyXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA1Ml0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA1Nl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNTZdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNjBdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDYwXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDY0XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA2NF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA2OF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNjhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNzJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDcyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDc2XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA3Nl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA4MF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgODBdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgODRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDg0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDg4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA4OF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA5Ml0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgOTJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjMyX2Zsb2F0MzJfaTM4NworJSRwICAgICBhcmcgICAgIDQKKyUkcSAgICAgYXJnICAgICA0Cis7OzsgICAgIGFsbG9jCisKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeF0KKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgIDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArICA4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMTJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDEyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDE2XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAxNl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAyMF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMjBdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMjRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDI0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDI4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyAyOF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAzMl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMzJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgMzZdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDM2XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDQwXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA0MF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA0NF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDQ4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDUyXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA1Ml0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA1Nl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNTZdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNjBdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDYwXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDY0XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA2NF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA2OF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgNjhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgNzJdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDcyXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDc2XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA3Nl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA4MF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgODBdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgODRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDg0XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDg4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKyA4OF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyA5Ml0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgOTJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsgOTZdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDk2XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArMTAwXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKzEwMF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKzEwNF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsxMDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsxMDhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArMTA4XQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArMTEyXQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKzExMl0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKzExNl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsxMTZdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MCAgICAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4ICsxMjBdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArMTIwXQorICAgICAgICBmYWRkcCAgIHN0MSxzdDAgICAgCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArMTI0XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHggKzEyNF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwICAgIAorZW5kcHJvYworCisKKzsgZmxvYXRfdCAgc2NhbGFyNG5fZmxvYXQzMl9pMzg3ICggCis7ICAgICAgICAgY29uc3QgZmxvYXQzMl90KiBjb25zdCAgcCwgCis7ICAgICAgICAgY29uc3QgZmxvYXQzMl90KiBjb25zdCAgcSwKKzsgICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICAgICBsZW4gKTsKKworcHJvYyAgICBzY2FsYXI0bl9mbG9hdDMyX2kzODcKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorJSRsZW4gICBhcmcgICAgIDQKKzs7OyAgICAgYWxsb2MKKworICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisgICAgICAgIG1vdiAgICAgZWN4LFtzcCglJGxlbildCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4XQorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAgNF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgIDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAgOF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgIDhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAxMl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMTJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBkZWMgICAgIGVjeAorICAgICAgICBqeiAgICAgIC5yZXQxCisgICAgICAgIGFkZCAgICAgZWF4LGJ5dGUgMTYKKyAgICAgICAgYWRkICAgICBlZHgsYnl0ZSAxNgorLmxibDEKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAgNF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgIDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAgOF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgIDhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAxMl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMTJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBhZGQgICAgIGVheCxieXRlIDE2CisgICAgICAgIGFkZCAgICAgZWR4LGJ5dGUgMTYKKyAgICAgICAgZGVjICAgICBlY3gKKyAgICAgICAgam56ICAgICAubGJsMQorLnJldDEgICAKK2VuZHByb2MKKworCis7IGZsb2F0X3QgIHNjYWxhcjFuX2Zsb2F0MzJfaTM4NyAoIAorOyAgICAgICAgIGNvbnN0IGZsb2F0MzJfdCogY29uc3QgIHAsIAorOyAgICAgICAgIGNvbnN0IGZsb2F0MzJfdCogY29uc3QgIHEsCis7ICAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgICAgbGVuICk7CisKK3Byb2MgICAgc2NhbGFyMW5fZmxvYXQzMl9pMzg3CislJHAgICAgIGFyZyAgICAgNAorJSRxICAgICBhcmcgICAgIDQKKyUkbGVuICAgYXJnICAgICA0Cis7OzsgICAgIGFsbG9jCisKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorICAgICAgICBtb3YgICAgIGVjeCxbc3AoJSRsZW4pXQorICAgICAgICBmbGQwCisgICAgICAgIHNociAgICAgZWN4LDEKKyAgICAgICAgam5jICAgICAubGJsMgorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwCisgICAgICAgIGFkZCAgICAgZWF4LGJ5dGUgNAorICAgICAgICBhZGQgICAgIGVkeCxieXRlIDQKKy5sYmwyCisgICAgICAgIHNociAgICAgZWN4LDEKKyAgICAgICAgam5jICAgICAubGJsMworICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXhdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeF0KKyAgICAgICAgZmFkZHAgICBzdDEsc3QwCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VheCArIDRdCisgICAgICAgIGZtdWwgICAgZHdvcmQgW2VkeCArIDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBhZGQgICAgIGVheCxieXRlIDgKKyAgICAgICAgYWRkICAgICBlZHgsYnl0ZSA4CisgICAgICAgIGFuZCAgICAgZWN4LGVjeAorLmxibDMKKyAgICAgICAganogICAgICAucmV0MgorLmxibDQKKyAgICAgICAgZmxkICAgICBkd29yZCBbZWF4XQorICAgICAgICBmbXVsICAgIGR3b3JkIFtlZHhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAgNF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgIDRdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAgOF0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgIDhdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBmbGQgICAgIGR3b3JkIFtlYXggKyAxMl0KKyAgICAgICAgZm11bCAgICBkd29yZCBbZWR4ICsgMTJdCisgICAgICAgIGZhZGRwICAgc3QxLHN0MAorICAgICAgICBhZGQgICAgIGVheCxieXRlIDE2CisgICAgICAgIGFkZCAgICAgZWR4LGJ5dGUgMTYKKyAgICAgICAgZGVjICAgICBlY3gKKyAgICAgICAgam56ICAgICAubGJsNAorLnJldDIKK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjA0X2Zsb2F0MzJfM0ROb3cKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisKKyAgICAgICAgcG1vdiAgICBtbTAscXdvcmQgW2VheF0KKyAgICAgICAgcG1vdiAgICBtbTEscXdvcmQgW2VheCs4XQorICAgICAgICBwZm11bCAgIG1tMCxxd29yZCBbZWR4XQorICAgICAgICBwZm11bCAgIG1tMSxxd29yZCBbZWR4KzhdCisKKyAgICAgICAgcGZhZGQgICBtbTAsbW0xCisgICAgICAgIHBtb3YgICAgcXdvcmQgW3NwKCUkcCldLG1tMAorICAgICAgICBmZW1tcworICAgICAgICBmbGQgICAgIGR3b3JkIFtzcCglJHApXQorICAgICAgICBmYWRkICAgIGR3b3JkIFtzcCglJHApKzRdCitlbmRwcm9jCisKKworcHJvYyAgICBzY2FsYXIwOF9mbG9hdDMyXzNETm93CislJHAgICAgIGFyZyAgICAgNAorJSRxICAgICBhcmcgICAgIDQKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorCisgICAgICAgIHBtb3YgICAgbW0wLHF3b3JkIFtlYXhdCisgICAgICAgIHBtb3YgICAgbW0xLHF3b3JkIFtlYXgrOF0KKyAgICAgICAgcGZtdWwgICBtbTAscXdvcmQgW2VkeF0KKyAgICAgICAgcGZtdWwgICBtbTEscXdvcmQgW2VkeCs4XQorCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrMTZdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrMjRdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrMTZdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrMjRdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwZmFkZCAgIG1tMCxtbTEKKyAgICAgICAgcG1vdiAgICBxd29yZCBbc3AoJSRwKV0sbW0wCisgICAgICAgIGZlbW1zCisgICAgICAgIGZsZCAgICAgZHdvcmQgW3NwKCUkcCldCisgICAgICAgIGZhZGQgICAgZHdvcmQgW3NwKCUkcCkrNF0KK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjEyX2Zsb2F0MzJfM0ROb3cKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisKKyAgICAgICAgcG1vdiAgICBtbTAscXdvcmQgW2VheF0KKyAgICAgICAgcG1vdiAgICBtbTEscXdvcmQgW2VheCs4XQorICAgICAgICBwZm11bCAgIG1tMCxxd29yZCBbZWR4XQorICAgICAgICBwZm11bCAgIG1tMSxxd29yZCBbZWR4KzhdCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCsxNl0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCsyNF0KKyAgICAgICAgcGZtdWwgICBtbTIscXdvcmQgW2VkeCsxNl0KKyAgICAgICAgcGZtdWwgICBtbTMscXdvcmQgW2VkeCsyNF0KKyAgICAgICAgcGZhZGQgICBtbTAsbW0yCisgICAgICAgIHBmYWRkICAgbW0xLG1tMworCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrMzJdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrNDBdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrMzJdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrNDBdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwZmFkZCAgIG1tMCxtbTEKKyAgICAgICAgcG1vdiAgICBxd29yZCBbc3AoJSRwKV0sbW0wCisgICAgICAgIGZlbW1zCisgICAgICAgIGZsZCAgICAgZHdvcmQgW3NwKCUkcCldCisgICAgICAgIGZhZGQgICAgZHdvcmQgW3NwKCUkcCkrNF0KK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjE2X2Zsb2F0MzJfM0ROb3cKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisKKyAgICAgICAgcG1vdiAgICBtbTAscXdvcmQgW2VheF0KKyAgICAgICAgcG1vdiAgICBtbTEscXdvcmQgW2VheCs4XQorICAgICAgICBwZm11bCAgIG1tMCxxd29yZCBbZWR4XQorICAgICAgICBwZm11bCAgIG1tMSxxd29yZCBbZWR4KzhdCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCsxNl0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCsyNF0KKyAgICAgICAgcGZtdWwgICBtbTIscXdvcmQgW2VkeCsxNl0KKyAgICAgICAgcGZtdWwgICBtbTMscXdvcmQgW2VkeCsyNF0KKyAgICAgICAgcGZhZGQgICBtbTAsbW0yCisgICAgICAgIHBmYWRkICAgbW0xLG1tMworCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrMzJdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrNDBdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrMzJdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrNDBdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwbW92ICAgIG1tMixxd29yZCBbZWF4KzQ4XQorICAgICAgICBwbW92ICAgIG1tMyxxd29yZCBbZWF4KzU2XQorICAgICAgICBwZm11bCAgIG1tMixxd29yZCBbZWR4KzQ4XQorICAgICAgICBwZm11bCAgIG1tMyxxd29yZCBbZWR4KzU2XQorICAgICAgICBwZmFkZCAgIG1tMCxtbTIKKyAgICAgICAgcGZhZGQgICBtbTEsbW0zCisKKyAgICAgICAgcGZhZGQgICBtbTAsbW0xCisgICAgICAgIHBtb3YgICAgcXdvcmQgW3NwKCUkcCldLG1tMAorICAgICAgICBmZW1tcworICAgICAgICBmbGQgICAgIGR3b3JkIFtzcCglJHApXQorICAgICAgICBmYWRkICAgIGR3b3JkIFtzcCglJHApKzRdCitlbmRwcm9jCisKKworcHJvYyAgICBzY2FsYXIyMF9mbG9hdDMyXzNETm93CislJHAgICAgIGFyZyAgICAgNAorJSRxICAgICBhcmcgICAgIDQKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorCisgICAgICAgIHBtb3YgICAgbW0wLHF3b3JkIFtlYXhdCisgICAgICAgIHBtb3YgICAgbW0xLHF3b3JkIFtlYXgrOF0KKyAgICAgICAgcGZtdWwgICBtbTAscXdvcmQgW2VkeF0KKyAgICAgICAgcGZtdWwgICBtbTEscXdvcmQgW2VkeCs4XQorCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrMTZdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrMjRdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrMTZdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrMjRdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwbW92ICAgIG1tMixxd29yZCBbZWF4KzMyXQorICAgICAgICBwbW92ICAgIG1tMyxxd29yZCBbZWF4KzQwXQorICAgICAgICBwZm11bCAgIG1tMixxd29yZCBbZWR4KzMyXQorICAgICAgICBwZm11bCAgIG1tMyxxd29yZCBbZWR4KzQwXQorICAgICAgICBwZmFkZCAgIG1tMCxtbTIKKyAgICAgICAgcGZhZGQgICBtbTEsbW0zCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCs0OF0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCs1Nl0KKyAgICAgICAgcGZtdWwgICBtbTIscXdvcmQgW2VkeCs0OF0KKyAgICAgICAgcGZtdWwgICBtbTMscXdvcmQgW2VkeCs1Nl0KKyAgICAgICAgcGZhZGQgICBtbTAsbW0yCisgICAgICAgIHBmYWRkICAgbW0xLG1tMworCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrNjRdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrNzJdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrNjRdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrNzJdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwZmFkZCAgIG1tMCxtbTEKKyAgICAgICAgcG1vdiAgICBxd29yZCBbc3AoJSRwKV0sbW0wCisgICAgICAgIGZlbW1zCisgICAgICAgIGZsZCAgICAgZHdvcmQgW3NwKCUkcCldCisgICAgICAgIGZhZGQgICAgZHdvcmQgW3NwKCUkcCkrNF0KK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjI0X2Zsb2F0MzJfM0ROb3cKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisKKyAgICAgICAgcG1vdiAgICBtbTAscXdvcmQgW2VheF0KKyAgICAgICAgcG1vdiAgICBtbTEscXdvcmQgW2VheCs4XQorICAgICAgICBwZm11bCAgIG1tMCxxd29yZCBbZWR4XQorICAgICAgICBwZm11bCAgIG1tMSxxd29yZCBbZWR4KzhdCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCsxNl0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCsyNF0KKyAgICAgICAgcGZtdWwgICBtbTIscXdvcmQgW2VkeCsxNl0KKyAgICAgICAgcGZtdWwgICBtbTMscXdvcmQgW2VkeCsyNF0KKyAgICAgICAgcGZhZGQgICBtbTAsbW0yCisgICAgICAgIHBmYWRkICAgbW0xLG1tMworCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrMzJdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrNDBdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrMzJdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrNDBdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwbW92ICAgIG1tMixxd29yZCBbZWF4KzQ4XQorICAgICAgICBwbW92ICAgIG1tMyxxd29yZCBbZWF4KzU2XQorICAgICAgICBwZm11bCAgIG1tMixxd29yZCBbZWR4KzQ4XQorICAgICAgICBwZm11bCAgIG1tMyxxd29yZCBbZWR4KzU2XQorICAgICAgICBwZmFkZCAgIG1tMCxtbTIKKyAgICAgICAgcGZhZGQgICBtbTEsbW0zCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCs2NF0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCs3Ml0KKyAgICAgICAgcGZtdWwgICBtbTIscXdvcmQgW2VkeCs2NF0KKyAgICAgICAgcGZtdWwgICBtbTMscXdvcmQgW2VkeCs3Ml0KKyAgICAgICAgcGZhZGQgICBtbTAsbW0yCisgICAgICAgIHBmYWRkICAgbW0xLG1tMworCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrODBdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrODhdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrODBdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrODhdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwZmFkZCAgIG1tMCxtbTEKKyAgICAgICAgcG1vdiAgICBxd29yZCBbc3AoJSRwKV0sbW0wCisgICAgICAgIGZlbW1zCisgICAgICAgIGZsZCAgICAgZHdvcmQgW3NwKCUkcCldCisgICAgICAgIGZhZGQgICAgZHdvcmQgW3NwKCUkcCkrNF0KK2VuZHByb2MKKworcHJvYyAgICBzY2FsYXIzMl9mbG9hdDMyXzNETm93CislJHAgICAgIGFyZyAgICAgNAorJSRxICAgICBhcmcgICAgIDQKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorCisgICAgICAgIHBtb3YgICAgbW0wLHF3b3JkIFtlYXhdCisgICAgICAgIHBtb3YgICAgbW0xLHF3b3JkIFtlYXgrOF0KKyAgICAgICAgcGZtdWwgICBtbTAscXdvcmQgW2VkeF0KKyAgICAgICAgcGZtdWwgICBtbTEscXdvcmQgW2VkeCs4XQorCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrMTZdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrMjRdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrMTZdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrMjRdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwbW92ICAgIG1tMixxd29yZCBbZWF4KzMyXQorICAgICAgICBwbW92ICAgIG1tMyxxd29yZCBbZWF4KzQwXQorICAgICAgICBwZm11bCAgIG1tMixxd29yZCBbZWR4KzMyXQorICAgICAgICBwZm11bCAgIG1tMyxxd29yZCBbZWR4KzQwXQorICAgICAgICBwZmFkZCAgIG1tMCxtbTIKKyAgICAgICAgcGZhZGQgICBtbTEsbW0zCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCs0OF0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCs1Nl0KKyAgICAgICAgcGZtdWwgICBtbTIscXdvcmQgW2VkeCs0OF0KKyAgICAgICAgcGZtdWwgICBtbTMscXdvcmQgW2VkeCs1Nl0KKyAgICAgICAgcGZhZGQgICBtbTAsbW0yCisgICAgICAgIHBmYWRkICAgbW0xLG1tMworCisgICAgICAgIHBtb3YgICAgbW0yLHF3b3JkIFtlYXgrNjRdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrNzJdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrNjRdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrNzJdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwbW92ICAgIG1tMixxd29yZCBbZWF4KzgwXQorICAgICAgICBwbW92ICAgIG1tMyxxd29yZCBbZWF4Kzg4XQorICAgICAgICBwZm11bCAgIG1tMixxd29yZCBbZWR4KzgwXQorICAgICAgICBwZm11bCAgIG1tMyxxd29yZCBbZWR4Kzg4XQorICAgICAgICBwZmFkZCAgIG1tMCxtbTIKKyAgICAgICAgcGZhZGQgICBtbTEsbW0zCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCs5Nl0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCsxMDRdCisgICAgICAgIHBmbXVsICAgbW0yLHF3b3JkIFtlZHgrOTZdCisgICAgICAgIHBmbXVsICAgbW0zLHF3b3JkIFtlZHgrMTA0XQorICAgICAgICBwZmFkZCAgIG1tMCxtbTIKKyAgICAgICAgcGZhZGQgICBtbTEsbW0zCisKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheCsxMTJdCisgICAgICAgIHBtb3YgICAgbW0zLHF3b3JkIFtlYXgrMTIwXQorICAgICAgICBwZm11bCAgIG1tMixxd29yZCBbZWR4KzExMl0KKyAgICAgICAgcGZtdWwgICBtbTMscXdvcmQgW2VkeCsxMjBdCisgICAgICAgIHBmYWRkICAgbW0wLG1tMgorICAgICAgICBwZmFkZCAgIG1tMSxtbTMKKworICAgICAgICBwZmFkZCAgIG1tMCxtbTEKKyAgICAgICAgcG1vdiAgICBxd29yZCBbc3AoJSRwKV0sbW0wCisgICAgICAgIGZlbW1zCisgICAgICAgIGZsZCAgICAgZHdvcmQgW3NwKCUkcCldCisgICAgICAgIGZhZGQgICAgZHdvcmQgW3NwKCUkcCkrNF0KK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjRuX2Zsb2F0MzJfM0ROb3cKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorJSRsZW4gICBhcmcgICAgIDQKKworICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisgICAgICAgIG1vdiAgICAgZWN4LFtzcCglJGxlbildCisKKyAgICAgICAgcG1vdiAgICBtbTAscXdvcmQgW2VheF0KKyAgICAgICAgcG1vdiAgICBtbTEscXdvcmQgW2VheCs4XQorICAgICAgICBwZm11bCAgIG1tMCxxd29yZCBbZWR4XQorICAgICAgICBwZm11bCAgIG1tMSxxd29yZCBbZWR4KzhdCisgICAgICAgIGRlYyAgICAgZWN4CisgICAgICAgIGp6ICAgICAgLnJldDQKKyAgICAgICAgCisgICAgICAgIGFkZCAgICAgZWF4LGJ5dGUgMTYKKyAgICAgICAgYWRkICAgICBlZHgsYnl0ZSAxNgorLmxibDQ6ICAKKyAgICAgICAgcG1vdiAgICBtbTIscXdvcmQgW2VheF0KKyAgICAgICAgcG1vdiAgICBtbTMscXdvcmQgW2VheCs4XQorICAgICAgICBwZm11bCAgIG1tMixxd29yZCBbZWR4XQorICAgICAgICBwZm11bCAgIG1tMyxxd29yZCBbZWR4KzhdCisgICAgICAgIGFkZCAgICAgZWF4LGJ5dGUgMTYKKyAgICAgICAgYWRkICAgICBlZHgsYnl0ZSAxNgorICAgICAgICBwZmFkZCAgIG1tMCxtbTIKKyAgICAgICAgcGZhZGQgICBtbTEsbW0zCisgICAgICAgIGRlYyAgICAgZWN4CisgICAgICAgIGpueiAgICAgLmxibDQKKworLnJldDQ6ICBwZmFkZCAgIG1tMCxtbTEKKyAgICAgICAgcG1vdiAgICBxd29yZCBbc3AoJSRwKV0sbW0wCisgICAgICAgIGZlbW1zCisgICAgICAgIGZsZCAgICAgZHdvcmQgW3NwKCUkcCldCisgICAgICAgIGZhZGQgICAgZHdvcmQgW3NwKCUkcCkrNF0KK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjFuX2Zsb2F0MzJfM0ROb3cKKyAgICAgICAgam1wICAgICBzY2FsYXIyNF9mbG9hdDMyX2kzODcKK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjA0X2Zsb2F0MzJfU0lNRAorICAgICAgICBqbXAgICAgIHNjYWxhcjA0X2Zsb2F0MzJfaTM4NworZW5kcHJvYworCisKK3Byb2MgICAgc2NhbGFyMDhfZmxvYXQzMl9TSU1ECislJHAgICAgIGFyZyAgICAgNAorJSRxICAgICBhcmcgICAgIDQKKyAgICAgICAgbW92ICAgICBlYXgsW3NwKCUkcCldCisgICAgICAgIG1vdiAgICAgZWR4LFtzcCglJHEpXQorCisgICAgICAgIG1vdnVwcyAgeG1tMCwgW2VheF0KKyAgICAgICAgbW92dXBzICB4bW0xLCBbZWF4KzE2XQorICAgICAgICBtdWxwcyAgIHhtbTAsIFtlZHhdCisgICAgICAgIG11bHBzICAgeG1tMSwgW2VkeCsxNl0KKworICAgICAgICBhZGRwcyAgIHhtbTAseG1tMQorICAgICAgICBzdWIgICAgIGVzcCwxNgorICAgICAgICBtb3Z1cHMgIFtlc3BdLHhtbTAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZXNwKyAwXQorICAgICAgICBmYWRkICAgIGR3b3JkIFtlc3ArIDRdCisgICAgICAgIGZhZGQgICAgZHdvcmQgW2VzcCsgOF0KKyAgICAgICAgZmFkZCAgICBkd29yZCBbZXNwKzEyXQorICAgICAgICBhZGQgICAgIGVzcCwxNgorZW5kcHJvYworCisKK3Byb2MgICAgc2NhbGFyMTJfZmxvYXQzMl9TSU1ECisgICAgICAgIGptcCAgICAgc2NhbGFyMTJfZmxvYXQzMl9pMzg3CitlbmRwcm9jCisKKworcHJvYyAgICBzY2FsYXIxNl9mbG9hdDMyX1NJTUQKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisKKyAgICAgICAgbW92dXBzICB4bW0wLCBbZWF4XQorICAgICAgICBtb3Z1cHMgIHhtbTEsIFtlYXgrMTZdCisgICAgICAgIG11bHBzICAgeG1tMCwgW2VkeF0KKyAgICAgICAgbXVscHMgICB4bW0xLCBbZWR4KzE2XQorCisgICAgICAgIG1vdnVwcyAgeG1tMiwgW2VheCszMl0KKyAgICAgICAgbW92dXBzICB4bW0zLCBbZWF4KzQ4XQorICAgICAgICBtdWxwcyAgIHhtbTIsIFtlZHgrMzJdCisgICAgICAgIG11bHBzICAgeG1tMywgW2VkeCs0OF0KKyAgICAgICAgYWRkcHMgICB4bW0wLHhtbTIKKyAgICAgICAgYWRkcHMgICB4bW0xLHhtbTMKKworICAgICAgICBhZGRwcyAgIHhtbTAseG1tMQorICAgICAgICBzdWIgICAgIGVzcCwxNgorICAgICAgICBtb3Z1cHMgIFtlc3BdLHhtbTAKKyAgICAgICAgZmxkICAgICBkd29yZCBbZXNwKyAwXQorICAgICAgICBmYWRkICAgIGR3b3JkIFtlc3ArIDRdCisgICAgICAgIGZhZGQgICAgZHdvcmQgW2VzcCsgOF0KKyAgICAgICAgZmFkZCAgICBkd29yZCBbZXNwKzEyXQorICAgICAgICBhZGQgICAgIGVzcCwxNgorZW5kcHJvYworCisKK3Byb2MgICAgc2NhbGFyMjBfZmxvYXQzMl9TSU1ECisgICAgICAgIGptcCAgICAgc2NhbGFyMjBfZmxvYXQzMl9pMzg3CitlbmRwcm9jCisKKworcHJvYyAgICBzY2FsYXIyNF9mbG9hdDMyX1NJTUQKKyUkcCAgICAgYXJnICAgICA0CislJHEgICAgIGFyZyAgICAgNAorICAgICAgICBtb3YgICAgIGVheCxbc3AoJSRwKV0KKyAgICAgICAgbW92ICAgICBlZHgsW3NwKCUkcSldCisKKyAgICAgICAgbW92dXBzICB4bW0wLCBbZWF4XQorICAgICAgICBtb3Z1cHMgIHhtbTEsIFtlYXgrMTZdCisgICAgICAgIG11bHBzICAgeG1tMCwgW2VkeF0KKyAgICAgICAgbXVscHMgICB4bW0xLCBbZWR4KzE2XQorCisgICAgICAgIG1vdnVwcyAgeG1tMiwgW2VheCszMl0KKyAgICAgICAgbW92dXBzICB4bW0zLCBbZWF4KzQ4XQorICAgICAgICBtdWxwcyAgIHhtbTIsIFtlZHgrMzJdCisgICAgICAgIG11bHBzICAgeG1tMywgW2VkeCs0OF0KKyAgICAgICAgYWRkcHMgICB4bW0wLHhtbTIKKyAgICAgICAgYWRkcHMgICB4bW0xLHhtbTMKKworICAgICAgICBtb3Z1cHMgIHhtbTIsIFtlYXgrNjRdCisgICAgICAgIG1vdnVwcyAgeG1tMywgW2VheCs4MF0KKyAgICAgICAgbXVscHMgICB4bW0yLCBbZWR4KzY0XQorICAgICAgICBtdWxwcyAgIHhtbTMsIFtlZHgrODBdCisgICAgICAgIGFkZHBzICAgeG1tMCx4bW0yCisgICAgICAgIGFkZHBzICAgeG1tMSx4bW0zCisKKyAgICAgICAgYWRkcHMgICB4bW0wLHhtbTEKKyAgICAgICAgc3ViICAgICBlc3AsMTYKKyAgICAgICAgbW92dXBzICBbZXNwXSx4bW0wCisgICAgICAgIGZsZCAgICAgZHdvcmQgW2VzcCsgMF0KKyAgICAgICAgZmFkZCAgICBkd29yZCBbZXNwKyA0XQorICAgICAgICBmYWRkICAgIGR3b3JkIFtlc3ArIDhdCisgICAgICAgIGZhZGQgICAgZHdvcmQgW2VzcCsxMl0KKyAgICAgICAgYWRkICAgICBlc3AsMTYKK2VuZHByb2MKKworCitwcm9jICAgIHNjYWxhcjMyX2Zsb2F0MzJfU0lNRAorJSRwICAgICBhcmcgICAgIDQKKyUkcSAgICAgYXJnICAgICA0CisgICAgICAgIG1vdiAgICAgZWF4LFtzcCglJHApXQorICAgICAgICBtb3YgICAgIGVkeCxbc3AoJSRxKV0KKworICAgICAgICBtb3Z1cHMgIHhtbTAsIFtlYXhdCisgICAgICAgIG1vdnVwcyAgeG1tMSwgW2VheCsxNl0KKyAgICAgICAgbXVscHMgICB4bW0wLCBbZWR4XQorICAgICAgICBtdWxwcyAgIHhtbTEsIFtlZHgrMTZdCisKKyAgICAgICAgbW92dXBzICB4bW0yLCBbZWF4KzMyXQorICAgICAgICBtb3Z1cHMgIHhtbTMsIFtlYXgrNDhdCisgICAgICAgIG11bHBzICAgeG1tMiwgW2VkeCszMl0KKyAgICAgICAgbXVscHMgICB4bW0zLCBbZWR4KzQ4XQorICAgICAgICBhZGRwcyAgIHhtbTAseG1tMgorICAgICAgICBhZGRwcyAgIHhtbTEseG1tMworCisgICAgICAgIG1vdnVwcyAgeG1tMiwgW2VheCs2NF0KKyAgICAgICAgbW92dXBzICB4bW0zLCBbZWF4KzgwXQorICAgICAgICBtdWxwcyAgIHhtbTIsIFtlZHgrNjRdCisgICAgICAgIG11bHBzICAgeG1tMywgW2VkeCs4MF0KKyAgICAgICAgYWRkcHMgICB4bW0wLHhtbTIKKyAgICAgICAgYWRkcHMgICB4bW0xLHhtbTMKKworICAgICAgICBtb3Z1cHMgIHhtbTIsIFtlYXgrOTZdCisgICAgICAgIG1vdnVwcyAgeG1tMywgW2VheCsxMTJdCisgICAgICAgIG11bHBzICAgeG1tMiwgW2VkeCs5Nl0KKyAgICAgICAgbXVscHMgICB4bW0zLCBbZWR4KzExMl0KKyAgICAgICAgYWRkcHMgICB4bW0wLHhtbTIKKyAgICAgICAgYWRkcHMgICB4bW0xLHhtbTMKKworICAgICAgICBhZGRwcyAgIHhtbTAseG1tMQorCisgICAgICAgIDtzdWIgICAgIGVzcCwxNgorICAgICAgICA7bW92dXBzICBbZXNwXSx4bW0wCisgICAgICAgIDtmbGQgICAgIGR3b3JkIFtlc3ArIDBdCisgICAgICAgIDtmYWRkICAgIGR3b3JkIFtlc3ArIDRdCisgICAgICAgIDtmYWRkICAgIGR3b3JkIFtlc3ArIDhdCisgICAgICAgIDtmYWRkICAgIGR3b3JkIFtlc3ArMTJdCisgICAgICAgIDthZGQgICAgIGVzcCwxNgorICAgICAgICAgCisgICAgICAgICBtb3ZobHBzIHhtbTEseG1tMAorICAgICAgICAgYWRkcHMgICB4bW0wLHhtbTEKKyAgICAgICAgIG1vdmxwcyAgW3NwKCUkcCldLHhtbTAKKyAgICAgICAgZmxkICAgICBkd29yZCBbc3AoJSRwKV0KKyAgICAgICAgZmFkZCAgICBkd29yZCBbc3AoJSRwKSs0XQorZW5kcHJvYworCisKK3Byb2MgICAgc2NhbGFyNG5fZmxvYXQzMl9TSU1ECisgICAgICAgIGptcCAgICAgc2NhbGFyNG5fZmxvYXQzMl9pMzg3CitlbmRwcm9jCisKKworcHJvYyAgICBzY2FsYXIxbl9mbG9hdDMyX1NJTUQKKyAgICAgICAgam1wICAgICBzY2FsYXIxbl9mbG9hdDMyX2kzODcKK2VuZHByb2MKKworOyBlbmQgb2Ygc2NhbGFyLm5hcwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9pZDN0YWcuYyBiL2xpYm1wM2xhbWUvaWQzdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzNzM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvaWQzdGFnLmMKQEAgLTAsMCArMSwxNDM3IEBACisvKgorICogaWQzdGFnLmMgLS0gV3JpdGUgSUQzIHZlcnNpb24gMSBhbmQgMiB0YWdzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEb24gTWVsdG9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyoKKyAqIEhJU1RPUlk6IFRoaXMgc291cmNlIGZpbGUgaXMgcGFydCBvZiBMQU1FIChzZWUgaHR0cDovL3d3dy5tcDNkZXYub3JnKQorICogYW5kIHdhcyBvcmlnaW5hbGx5IGFkYXB0ZWQgYnkgQ29ucmFkIFNhbmRlcnNvbiA8Yy5zYW5kZXJzb25AbWUuZ3UuZWR1LmF1PgorICogZnJvbSBtcDNpbmZvIGJ5IFJpY2FyZG8gQ2VycXVlaXJhIDxybWNAcmNjbi5uZXQ+IHRvIHdyaXRlIG9ubHkgSUQzIHZlcnNpb24gMQorICogdGFncy4gIERvbiBNZWx0b24gPGRvbkBibGl2ZXQuY29tPiBDT01QTEVURUxZIHJld3JvdGUgaXQgdG8gc3VwcG9ydCB2ZXJzaW9uCisgKiAyIHRhZ3MgYW5kIGJlIG1vcmUgY29uZm9ybWFudCB0byBvdGhlciBzdGFuZGFyZHMgd2hpbGUgcmVtYWluaW5nIGZsZXhpYmxlLgorICoKKyAqIE5PVEU6IFNlZSBodHRwOi8vaWQzLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgSUQzIHRhZyBmb3JtYXRzLgorICovCisKKy8qICRJZDogaWQzdGFnLmMsdiAxLjUzLjIuNSAyMDEwLzAyLzE5IDAwOjQ0OjM3IHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbHNlCisjIGlmbmRlZiBIQVZFX1NUUkNIUgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyAgZGVmaW5lIHN0cnJjaHIgcmluZGV4CisjIGVuZGlmCitjaGFyICAgKnN0cmNocigpLCAqc3RycmNocigpOworIyBpZm5kZWYgSEFWRV9NRU1DUFkKKyMgIGRlZmluZSBtZW1jcHkoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjICBkZWZpbmUgbWVtbW92ZShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImVuY29kZXIuaCIKKyNpbmNsdWRlICJpZDN0YWcuaCIKKyNpbmNsdWRlICJsYW1lX2dsb2JhbF9mbGFncy5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ2VucmVfbmFtZXNbXSA9IHsKKyAgICAvKgorICAgICAqIE5PVEU6IFRoZSBzcGVsbGluZyBvZiB0aGVzZSBnZW5yZSBuYW1lcyBpcyBpZGVudGljYWwgdG8gdGhvc2UgZm91bmQgaW4KKyAgICAgKiBXaW5hbXAgYW5kIG1wM2luZm8uCisgICAgICovCisgICAgIkJsdWVzIiwgIkNsYXNzaWMgUm9jayIsICJDb3VudHJ5IiwgIkRhbmNlIiwgIkRpc2NvIiwgIkZ1bmsiLCAiR3J1bmdlIiwKKyAgICAiSGlwLUhvcCIsICJKYXp6IiwgIk1ldGFsIiwgIk5ldyBBZ2UiLCAiT2xkaWVzIiwgIk90aGVyIiwgIlBvcCIsICJSJkIiLAorICAgICJSYXAiLCAiUmVnZ2FlIiwgIlJvY2siLCAiVGVjaG5vIiwgIkluZHVzdHJpYWwiLCAiQWx0ZXJuYXRpdmUiLCAiU2thIiwKKyAgICAiRGVhdGggTWV0YWwiLCAiUHJhbmtzIiwgIlNvdW5kdHJhY2siLCAiRXVyby1UZWNobm8iLCAiQW1iaWVudCIsICJUcmlwLUhvcCIsCisgICAgIlZvY2FsIiwgIkphenorRnVuayIsICJGdXNpb24iLCAiVHJhbmNlIiwgIkNsYXNzaWNhbCIsICJJbnN0cnVtZW50YWwiLAorICAgICJBY2lkIiwgIkhvdXNlIiwgIkdhbWUiLCAiU291bmQgQ2xpcCIsICJHb3NwZWwiLCAiTm9pc2UiLCAiQWx0ZXJuYXRpdmUgUm9jayIsCisgICAgIkJhc3MiLCAiU291bCIsICJQdW5rIiwgIlNwYWNlIiwgIk1lZGl0YXRpdmUiLCAiSW5zdHJ1bWVudGFsIFBvcCIsCisgICAgIkluc3RydW1lbnRhbCBSb2NrIiwgIkV0aG5pYyIsICJHb3RoaWMiLCAiRGFya3dhdmUiLCAiVGVjaG5vLUluZHVzdHJpYWwiLAorICAgICJFbGVjdHJvbmljIiwgIlBvcC1Gb2xrIiwgIkV1cm9kYW5jZSIsICJEcmVhbSIsICJTb3V0aGVybiBSb2NrIiwgIkNvbWVkeSIsCisgICAgIkN1bHQiLCAiR2FuZ3N0YSIsICJUb3AgNDAiLCAiQ2hyaXN0aWFuIFJhcCIsICJQb3AvRnVuayIsICJKdW5nbGUiLAorICAgICJOYXRpdmUgVVMiLCAiQ2FiYXJldCIsICJOZXcgV2F2ZSIsICJQc3ljaGVkZWxpYyIsICJSYXZlIiwKKyAgICAiU2hvd3R1bmVzIiwgIlRyYWlsZXIiLCAiTG8tRmkiLCAiVHJpYmFsIiwgIkFjaWQgUHVuayIsICJBY2lkIEphenoiLAorICAgICJQb2xrYSIsICJSZXRybyIsICJNdXNpY2FsIiwgIlJvY2sgJiBSb2xsIiwgIkhhcmQgUm9jayIsICJGb2xrIiwKKyAgICAiRm9say1Sb2NrIiwgIk5hdGlvbmFsIEZvbGsiLCAiU3dpbmciLCAiRmFzdCBGdXNpb24iLCAiQmVib2IiLCAiTGF0aW4iLAorICAgICJSZXZpdmFsIiwgIkNlbHRpYyIsICJCbHVlZ3Jhc3MiLCAiQXZhbnRnYXJkZSIsICJHb3RoaWMgUm9jayIsCisgICAgIlByb2dyZXNzaXZlIFJvY2siLCAiUHN5Y2hlZGVsaWMgUm9jayIsICJTeW1waG9uaWMgUm9jayIsICJTbG93IFJvY2siLAorICAgICJCaWcgQmFuZCIsICJDaG9ydXMiLCAiRWFzeSBMaXN0ZW5pbmciLCAiQWNvdXN0aWMiLCAiSHVtb3VyIiwgIlNwZWVjaCIsCisgICAgIkNoYW5zb24iLCAiT3BlcmEiLCAiQ2hhbWJlciBNdXNpYyIsICJTb25hdGEiLCAiU3ltcGhvbnkiLCAiQm9vdHkgQmFzcyIsCisgICAgIlByaW11cyIsICJQb3JuIEdyb292ZSIsICJTYXRpcmUiLCAiU2xvdyBKYW0iLCAiQ2x1YiIsICJUYW5nbyIsICJTYW1iYSIsCisgICAgIkZvbGtsb3JlIiwgIkJhbGxhZCIsICJQb3dlciBCYWxsYWQiLCAiUmh5dGhtaWMgU291bCIsICJGcmVlc3R5bGUiLCAiRHVldCIsCisgICAgIlB1bmsgUm9jayIsICJEcnVtIFNvbG8iLCAiQSBDYXBwZWxsYSIsICJFdXJvLUhvdXNlIiwgIkRhbmNlIEhhbGwiLAorICAgICJHb2EiLCAiRHJ1bSAmIEJhc3MiLCAiQ2x1Yi1Ib3VzZSIsICJIYXJkY29yZSIsICJUZXJyb3IiLCAiSW5kaWUiLAorICAgICJCcml0UG9wIiwgIk5lZ2VycHVuayIsICJQb2xzayBQdW5rIiwgIkJlYXQiLCAiQ2hyaXN0aWFuIEdhbmdzdGEiLAorICAgICJIZWF2eSBNZXRhbCIsICJCbGFjayBNZXRhbCIsICJDcm9zc292ZXIiLCAiQ29udGVtcG9yYXJ5IENocmlzdGlhbiIsCisgICAgIkNocmlzdGlhbiBSb2NrIiwgIk1lcmVuZ3VlIiwgIlNhbHNhIiwgIlRocmFzaCBNZXRhbCIsICJBbmltZSIsICJKUG9wIiwKKyAgICAiU3ludGhQb3AiCit9OworCisjZGVmaW5lIEdFTlJFX05BTUVfQ09VTlQgXAorICAgICgoaW50KShzaXplb2YgZ2VucmVfbmFtZXMgLyBzaXplb2YgKGNvbnN0IGNoYXIgKmNvbnN0KSkpCisKK3N0YXRpYyBjb25zdCBpbnQgZ2VucmVfYWxwaGFfbWFwW10gPSB7CisgICAgMTIzLCAzNCwgNzQsIDczLCA5OSwgMjAsIDQwLCAyNiwgMTQ1LCA5MCwgMTE2LCA0MSwgMTM1LCA4NSwgOTYsIDEzOCwgODksIDAsCisgICAgMTA3LCAxMzIsIDY1LCA4OCwgMTA0LCAxMDIsIDk3LCAxMzYsIDYxLCAxNDEsIDMyLCAxLCAxMTIsIDEyOCwgNTcsIDE0MCwgMiwKKyAgICAxMzksIDU4LCAzLCAxMjUsIDUwLCAyMiwgNCwgNTUsIDEyNywgMTIyLCAxMjAsIDk4LCA1MiwgNDgsIDU0LCAxMjQsIDI1LCA4NCwKKyAgICA4MCwgMTE1LCA4MSwgMTE5LCA1LCAzMCwgMzYsIDU5LCAxMjYsIDM4LCA0OSwgOTEsIDYsIDEyOSwgNzksIDEzNywgNywgMzUsCisgICAgMTAwLCAxMzEsIDE5LCAzMywgNDYsIDQ3LCA4LCAyOSwgMTQ2LCA2MywgODYsIDcxLCA0NSwgMTQyLCA5LCA3NywgODIsIDY0LAorICAgIDEzMywgMTAsIDY2LCAzOSwgMTEsIDEwMywgMTIsIDc1LCAxMzQsIDEzLCA1MywgNjIsIDEwOSwgMTE3LCAyMywgMTA4LCA5MiwKKyAgICA2NywgOTMsIDQzLCAxMjEsIDE1LCA2OCwgMTQsIDE2LCA3NiwgODcsIDExOCwgMTcsIDc4LCAxNDMsIDExNCwgMTEwLCA2OSwgMjEsCisgICAgMTExLCA5NSwgMTA1LCA0MiwgMzcsIDI0LCA1NiwgNDQsIDEwMSwgODMsIDk0LCAxMDYsIDE0NywgMTEzLCAxOCwgNTEsIDEzMCwKKyAgICAxNDQsIDYwLCA3MCwgMzEsIDcyLCAyNywgMjgKK307CisKKyNkZWZpbmUgR0VOUkVfQUxQSEFfQ09VTlQgKChpbnQpKHNpemVvZiBnZW5yZV9hbHBoYV9tYXAgLyBzaXplb2YgKGludCkpKQorCisjZGVmaW5lIEdFTlJFX0lOREVYX09USEVSIDEyCisKKworI2RlZmluZSBGUkFNRV9JRChhLCBiLCBjLCBkKSBcCisgICAgKCAoKHVuc2lnbmVkIGxvbmcpKGEpIDw8IDI0KSBcCisgICAgfCAoKHVuc2lnbmVkIGxvbmcpKGIpIDw8IDE2KSBcCisgICAgfCAoKHVuc2lnbmVkIGxvbmcpKGMpIDw8ICA4KSBcCisgICAgfCAoKHVuc2lnbmVkIGxvbmcpKGQpIDw8ICAwKSApCisKK3R5cGVkZWYgZW51bSBVc3VhbFN0cmluZ0lEcyB7IElEX1RJVExFID0gRlJBTUVfSUQoJ1QnLCAnSScsICdUJywgJzInKQorICAgICAgICAsIElEX0FSVElTVCA9IEZSQU1FX0lEKCdUJywgJ1AnLCAnRScsICcxJykKKyAgICAgICAgLCBJRF9BTEJVTSA9IEZSQU1FX0lEKCdUJywgJ0EnLCAnTCcsICdCJykKKyAgICAgICAgLCBJRF9HRU5SRSA9IEZSQU1FX0lEKCdUJywgJ0MnLCAnTycsICdOJykKKyAgICAgICAgLCBJRF9FTkNPREVSID0gRlJBTUVfSUQoJ1QnLCAnUycsICdTJywgJ0UnKQorICAgICAgICAsIElEX1BMQVlMRU5HVEggPSBGUkFNRV9JRCgnVCcsICdMJywgJ0UnLCAnTicpCisgICAgICAgICwgSURfQ09NTUVOVCA9IEZSQU1FX0lEKCdDJywgJ08nLCAnTScsICdNJykgLyogZnVsbCB0ZXh0IHN0cmluZyAqLworfSBVc3VhbFN0cmluZ0lEczsKKwordHlwZWRlZiBlbnVtIE51bWVyaWNTdHJpbmdJRHMgeyBJRF9EQVRFID0gRlJBTUVfSUQoJ1QnLCAnRCcsICdBJywgJ1QnKSAvKiAiZGRNTSIgKi8KKyAgICAgICAgLCBJRF9USU1FID0gRlJBTUVfSUQoJ1QnLCAnSScsICdNJywgJ0UnKSAvKiAiaGhtbSIgKi8KKyAgICAgICAgLCBJRF9UUE9TID0gRlJBTUVfSUQoJ1QnLCAnUCcsICdPJywgJ1MnKSAvKiAnMCctJzknIGFuZCAnLycgYWxsb3dlZCAqLworICAgICAgICAsIElEX1RSQUNLID0gRlJBTUVfSUQoJ1QnLCAnUicsICdDJywgJ0snKSAvKiAnMCctJzknIGFuZCAnLycgYWxsb3dlZCAqLworICAgICAgICAsIElEX1lFQVIgPSBGUkFNRV9JRCgnVCcsICdZJywgJ0UnLCAnUicpIC8qICJ5eXl5IiAqLworfSBOdW1lcmljU3RyaW5nSURzOworCit0eXBlZGVmIGVudW0gTWlzY0lEcyB7IElEX1RYWFggPSBGUkFNRV9JRCgnVCcsICdYJywgJ1gnLCAnWCcpCisgICAgICAgICwgSURfV1hYWCA9IEZSQU1FX0lEKCdXJywgJ1gnLCAnWCcsICdYJykKKyAgICAgICAgLCBJRF9TWUxUID0gRlJBTUVfSUQoJ1MnLCAnWScsICdMJywgJ1QnKQorICAgICAgICAsIElEX0FQSUMgPSBGUkFNRV9JRCgnQScsICdQJywgJ0knLCAnQycpCisgICAgICAgICwgSURfR0VPQiA9IEZSQU1FX0lEKCdHJywgJ0UnLCAnTycsICdCJykKKyAgICAgICAgLCBJRF9QQ05UID0gRlJBTUVfSUQoJ1AnLCAnQycsICdOJywgJ1QnKQorICAgICAgICAsIElEX0FFTkMgPSBGUkFNRV9JRCgnQScsICdFJywgJ04nLCAnQycpCisgICAgICAgICwgSURfTElOSyA9IEZSQU1FX0lEKCdMJywgJ0knLCAnTicsICdLJykKKyAgICAgICAgLCBJRF9FTkNSID0gRlJBTUVfSUQoJ0UnLCAnTicsICdDJywgJ1InKQorICAgICAgICAsIElEX0dSSUQgPSBGUkFNRV9JRCgnRycsICdSJywgJ0knLCAnRCcpCisgICAgICAgICwgSURfUFJJViA9IEZSQU1FX0lEKCdQJywgJ1InLCAnSScsICdWJykKKyAgICAgICAgLCBJRF9WU0xUID0gRlJBTUVfSUQoJ1YnLCAnUycsICdMJywgJ1QnKSAvKiBmdWxsIHRleHQgc3RyaW5nICovCit9IE1pc2NJRHM7CisKKworCisKKworc3RhdGljIGludAoraWQzdjJfYWRkX3VjczIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBmcmFtZV9pZCwgY2hhciBjb25zdCAqbGFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY29uc3QgKmRlc2MsIHVuc2lnbmVkIHNob3J0IGNvbnN0ICp0ZXh0KTsKK3N0YXRpYyBpbnQKK2lkM3YyX2FkZF9sYXRpbjEobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBmcmFtZV9pZCwgY2hhciBjb25zdCAqbGFuZywgY2hhciBjb25zdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp0ZXh0KTsKKworc3RhdGljIHZvaWQKK2NvcHlWMVRvVjIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBmcmFtZV9pZCwgY2hhciBjb25zdCAqcykKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgZmxhZ3MgPSBnZmMtPnRhZ19zcGVjLmZsYWdzOworICAgIGlkM3YyX2FkZF9sYXRpbjEoZ2ZwLCBmcmFtZV9pZCwgMCwgMCwgcyk7CisgICAgZ2ZjLT50YWdfc3BlYy5mbGFncyA9IGZsYWdzOworfQorCisKK3N0YXRpYyB2b2lkCitpZDN2MkFkZExhbWVWZXJzaW9uKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGNoYXIgICAgYnVmZmVyWzEwMjRdOworICAgIGNvbnN0IGNoYXIgKmIgPSBnZXRfbGFtZV9vc19iaXRuZXNzKCk7CisgICAgY29uc3QgY2hhciAqdiA9IGdldF9sYW1lX3ZlcnNpb24oKTsKKyAgICBjb25zdCBjaGFyICp1ID0gZ2V0X2xhbWVfdXJsKCk7CisgICAgY29uc3Qgc2l6ZV90IGxlbmIgPSBzdHJsZW4oYik7CisKKyAgICBpZiAobGVuYiA+IDApIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJMQU1FICVzIHZlcnNpb24gJXMgKCVzKSIsIGIsIHYsIHUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJMQU1FIHZlcnNpb24gJXMgKCVzKSIsIHYsIHUpOworICAgIH0KKyAgICBjb3B5VjFUb1YyKGdmcCwgSURfRU5DT0RFUiwgYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK2lkM3YyQWRkQXVkaW9EdXJhdGlvbihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBpZiAoZ2ZwLT5udW1fc2FtcGxlcyAhPSBNQVhfVV8zMl9OVU0pIHsKKyAgICAgICAgY2hhciAgICBidWZmZXJbMTAyNF07CisgICAgICAgIGRvdWJsZSBjb25zdCBtYXhfdWxvbmcgPSBNQVhfVV8zMl9OVU07CisgICAgICAgIGRvdWJsZSAgbXMgPSBnZnAtPm51bV9zYW1wbGVzOworICAgICAgICB1bnNpZ25lZCBsb25nIHBsYXlsZW5ndGhfbXM7CisKKyAgICAgICAgbXMgKj0gMTAwMDsKKyAgICAgICAgbXMgLz0gZ2ZwLT5pbl9zYW1wbGVyYXRlOworICAgICAgICBpZiAobXMgPiBtYXhfdWxvbmcpIHsKKyAgICAgICAgICAgIHBsYXlsZW5ndGhfbXMgPSBtYXhfdWxvbmc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobXMgPCAwKSB7CisgICAgICAgICAgICBwbGF5bGVuZ3RoX21zID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBsYXlsZW5ndGhfbXMgPSBtczsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWx1IiwgcGxheWxlbmd0aF9tcyk7CisgICAgICAgIGNvcHlWMVRvVjIoZ2ZwLCBJRF9QTEFZTEVOR1RILCBidWZmZXIpOworICAgIH0KK30KKwordm9pZAoraWQzdGFnX2dlbnJlX2xpc3Qodm9pZCAoKmhhbmRsZXIpIChpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqY29va2llKQoreworICAgIGlmIChoYW5kbGVyKSB7CisgICAgICAgIGludCAgICAgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEdFTlJFX05BTUVfQ09VTlQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPCBHRU5SRV9BTFBIQV9DT1VOVCkgeworICAgICAgICAgICAgICAgIGludCAgICAgaiA9IGdlbnJlX2FscGhhX21hcFtpXTsKKyAgICAgICAgICAgICAgICBoYW5kbGVyKGosIGdlbnJlX25hbWVzW2pdLCBjb29raWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIEdFTlJFX05VTV9VTktOT1dOIDI1NQorCit2b2lkCitpZDN0YWdfaW5pdChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGZyZWVfaWQzdGFnKGdmYyk7CisgICAgbWVtc2V0KCZnZmMtPnRhZ19zcGVjLCAwLCBzaXplb2YgZ2ZjLT50YWdfc3BlYyk7CisgICAgZ2ZjLT50YWdfc3BlYy5nZW5yZV9pZDN2MSA9IEdFTlJFX05VTV9VTktOT1dOOworICAgIGdmYy0+dGFnX3NwZWMucGFkZGluZ19zaXplID0gMTI4OworICAgIGlkM3YyQWRkTGFtZVZlcnNpb24oZ2ZwKTsKK30KKworCisKK3ZvaWQKK2lkM3RhZ19hZGRfdjIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBnZmMtPnRhZ19zcGVjLmZsYWdzICY9IH5WMV9PTkxZX0ZMQUc7CisgICAgZ2ZjLT50YWdfc3BlYy5mbGFncyB8PSBBRERfVjJfRkxBRzsKK30KKwordm9pZAoraWQzdGFnX3YxX29ubHkobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBnZmMtPnRhZ19zcGVjLmZsYWdzICY9IH4oQUREX1YyX0ZMQUcgfCBWMl9PTkxZX0ZMQUcpOworICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gVjFfT05MWV9GTEFHOworfQorCit2b2lkCitpZDN0YWdfdjJfb25seShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgJj0gflYxX09OTFlfRkxBRzsKKyAgICBnZmMtPnRhZ19zcGVjLmZsYWdzIHw9IFYyX09OTFlfRkxBRzsKK30KKwordm9pZAoraWQzdGFnX3NwYWNlX3YxKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgZ2ZjLT50YWdfc3BlYy5mbGFncyAmPSB+VjJfT05MWV9GTEFHOworICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gU1BBQ0VfVjFfRkxBRzsKK30KKwordm9pZAoraWQzdGFnX3BhZF92MihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBpZDN0YWdfc2V0X3BhZChnZnAsIDEyOCk7Cit9CisKK3ZvaWQKK2lkM3RhZ19zZXRfcGFkKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBzaXplX3QgbikKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgJj0gflYxX09OTFlfRkxBRzsKKyAgICBnZmMtPnRhZ19zcGVjLmZsYWdzIHw9IFBBRF9WMl9GTEFHOworICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQUREX1YyX0ZMQUc7CisgICAgZ2ZjLT50YWdfc3BlYy5wYWRkaW5nX3NpemUgPSBuOworfQorCisKK3N0YXRpYyAgc2l6ZV90Citsb2NhbF9zdHJkdXAoY2hhciAqKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGlmIChkc3QgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZnJlZSgqZHN0KTsKKyAgICAqZHN0ID0gMDsKKyAgICBpZiAoc3JjICE9IDApIHsKKyAgICAgICAgc2l6ZV90ICBuOworICAgICAgICBmb3IgKG4gPSAwOyBzcmNbbl0gIT0gMDsgKytuKSB7IC8qIGNhbGMgc3JjIHN0cmluZyBsZW5ndGggKi8KKyAgICAgICAgfQorICAgICAgICBpZiAobiA+IDApIHsgICAgLyogc3RyaW5nIGxlbmd0aCB3aXRob3V0IHplcm8gdGVybWluYXRpb24gKi8KKyAgICAgICAgICAgIGFzc2VydChzaXplb2YoKnNyYykgPT0gc2l6ZW9mKCoqZHN0KSk7CisgICAgICAgICAgICAqZHN0ID0gbWFsbG9jKChuICsgMSkgKiBzaXplb2YoKipkc3QpKTsKKyAgICAgICAgICAgIGlmICgqZHN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKmRzdCwgc3JjLCBuICogc2l6ZW9mKCoqZHN0KSk7CisgICAgICAgICAgICAgICAgKCpkc3QpW25dID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljICBzaXplX3QKK2xvY2FsX3VjczJfc3RyZHVwKHVuc2lnbmVkIHNob3J0ICoqZHN0LCB1bnNpZ25lZCBzaG9ydCBjb25zdCAqc3JjKQoreworICAgIGlmIChkc3QgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZnJlZSgqZHN0KTsgICAgICAgICAvKiBmcmVlIG9sZCBzdHJpbmcgcG9pbnRlciAqLworICAgICpkc3QgPSAwOworICAgIGlmIChzcmMgIT0gMCkgeworICAgICAgICBzaXplX3QgIG47CisgICAgICAgIGZvciAobiA9IDA7IHNyY1tuXSAhPSAwOyArK24pIHsgLyogY2FsYyBzcmMgc3RyaW5nIGxlbmd0aCAqLworICAgICAgICB9CisgICAgICAgIGlmIChuID4gMCkgeyAgICAvKiBzdHJpbmcgbGVuZ3RoIHdpdGhvdXQgemVybyB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgYXNzZXJ0KHNpemVvZigqc3JjKSA+PSAyKTsKKyAgICAgICAgICAgIGFzc2VydChzaXplb2YoKnNyYykgPT0gc2l6ZW9mKCoqZHN0KSk7CisgICAgICAgICAgICAqZHN0ID0gbWFsbG9jKChuICsgMSkgKiBzaXplb2YoKipkc3QpKTsKKyAgICAgICAgICAgIGlmICgqZHN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKmRzdCwgc3JjLCBuICogc2l6ZW9mKCoqZHN0KSk7CisgICAgICAgICAgICAgICAgKCpkc3QpW25dID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyAgc2l6ZV90Citsb2NhbF91Y3MyX3N0cmxlbih1bnNpZ25lZCBzaG9ydCBjb25zdCAqcykKK3sKKyAgICBzaXplX3QgIG4gPSAwOworICAgIGlmIChzICE9IDApIHsKKyAgICAgICAgd2hpbGUgKCpzKyspIHsKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKgorU29tZSBleGlzdGluZyBvcHRpb25zIGZvciBJRDMgdGFnIGNhbiBiZSBzcGVjaWZpZWQgYnkgLS10diBvcHRpb24KK2FzIGZvbGxvd3MuCistLXR0IDx2YWx1ZT4sIC0tdHYgVElUMj12YWx1ZQorLS10YSA8dmFsdWU+LCAtLXR2IFRQRTE9dmFsdWUKKy0tdGwgPHZhbHVlPiwgLS10diBUQUxCPXZhbHVlCistLXR5IDx2YWx1ZT4sIC0tdHYgVFlFUj12YWx1ZQorLS10biA8dmFsdWU+LCAtLXR2IFRSQ0s9dmFsdWUKKy0tdGcgPHZhbHVlPiwgLS10diBUQ09OPXZhbHVlCisoYWx0aG91Z2ggc29tZSBhcmUgbm90IGV4YWN0bHkgc2FtZSkqLworCitpbnQKK2lkM3RhZ19zZXRfYWxidW1hcnQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGNvbnN0IGNoYXIgKmltYWdlLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpbnQgICAgIG1pbWV0eXBlID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhID0gKHVuc2lnbmVkIGNoYXIgY29uc3QgKikgaW1hZ2U7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgaW1hZ2Ugc2l6ZSBpcyBubyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSAqLworICAgIGlmIChMQU1FX01BWEFMQlVNQVJUIDwgc2l6ZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIGRldGVybWluZSBNSU1FIHR5cGUgZnJvbSB0aGUgYWN0dWFsIGltYWdlIGRhdGEgKi8KKyAgICBpZiAoMiA8IHNpemUgJiYgZGF0YVswXSA9PSAweEZGICYmIGRhdGFbMV0gPT0gMHhEOCkgeworICAgICAgICBtaW1ldHlwZSA9IE1JTUVUWVBFX0pQRUc7CisgICAgfQorICAgIGVsc2UgaWYgKDQgPCBzaXplICYmIGRhdGFbMF0gPT0gMHg4OSAmJiBzdHJuY21wKChjb25zdCBjaGFyICopICZkYXRhWzFdLCAiUE5HIiwgMykgPT0gMCkgeworICAgICAgICBtaW1ldHlwZSA9IE1JTUVUWVBFX1BORzsKKyAgICB9CisgICAgZWxzZSBpZiAoNCA8IHNpemUgJiYgc3RybmNtcCgoY29uc3QgY2hhciAqKSBkYXRhLCAiR0lGOCIsIDQpID09IDApIHsKKyAgICAgICAgbWltZXR5cGUgPSBNSU1FVFlQRV9HSUY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0ICE9IDApIHsKKyAgICAgICAgZnJlZShnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0KTsKKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5hbGJ1bWFydCA9IDA7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuYWxidW1hcnRfc2l6ZSA9IDA7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuYWxidW1hcnRfbWltZXR5cGUgPSBNSU1FVFlQRV9OT05FOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGdmYy0+dGFnX3NwZWMuYWxidW1hcnQgPSBtYWxsb2Moc2l6ZSk7CisgICAgaWYgKGdmYy0+dGFnX3NwZWMuYWxidW1hcnQgIT0gMCkgeworICAgICAgICBtZW1jcHkoZ2ZjLT50YWdfc3BlYy5hbGJ1bWFydCwgaW1hZ2UsIHNpemUpOworICAgICAgICBnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0X3NpemUgPSBzaXplOworICAgICAgICBnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0X21pbWV0eXBlID0gbWltZXR5cGU7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQ0hBTkdFRF9GTEFHOworICAgICAgICBpZDN0YWdfYWRkX3YyKGdmcCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitzZXRfNF9ieXRlX3ZhbHVlKHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgYnl0ZXNbaV0gPSB2YWx1ZSAmIDB4ZmZVTDsKKyAgICAgICAgdmFsdWUgPj49IDg7CisgICAgfQorICAgIHJldHVybiBieXRlcyArIDQ7Cit9CisKK3N0YXRpYyBpbnQKK3RvSUQzdjJUYWdJZChjaGFyIGNvbnN0ICpzKQoreworICAgIGludCAgICAgaSwgeCA9IDA7CisgICAgaWYgKHMgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgc1tpXSAhPSAwOyArK2kpIHsKKyAgICAgICAgY2hhciBjb25zdCBjID0gc1tpXTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IHUgPSAweDBmZiAmIGM7CisgICAgICAgIHggPDw9IDg7CisgICAgICAgIHggfD0gdTsKKyAgICAgICAgaWYgKGMgPCAnQScgfHwgJ1onIDwgYykgeworICAgICAgICAgICAgaWYgKGMgPCAnMCcgfHwgJzknIDwgYykgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB4OworfQorCitzdGF0aWMgaW50Citpc051bWVyaWNTdHJpbmcoaW50IGZyYW1lX2lkKQoreworICAgIHN3aXRjaCAoZnJhbWVfaWQpIHsKKyAgICBjYXNlIElEX0RBVEU6CisgICAgY2FzZSBJRF9USU1FOgorICAgIGNhc2UgSURfVFBPUzoKKyAgICBjYXNlIElEX1RSQUNLOgorICAgIGNhc2UgSURfWUVBUjoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc011bHRpRnJhbWUoaW50IGZyYW1lX2lkKQoreworICAgIHN3aXRjaCAoZnJhbWVfaWQpIHsKKyAgICBjYXNlIElEX1RYWFg6CisgICAgY2FzZSBJRF9XWFhYOgorICAgIGNhc2UgSURfQ09NTUVOVDoKKyAgICBjYXNlIElEX1NZTFQ6CisgICAgY2FzZSBJRF9BUElDOgorICAgIGNhc2UgSURfR0VPQjoKKyAgICBjYXNlIElEX1BDTlQ6CisgICAgY2FzZSBJRF9BRU5DOgorICAgIGNhc2UgSURfTElOSzoKKyAgICBjYXNlIElEX0VOQ1I6CisgICAgY2FzZSBJRF9HUklEOgorICAgIGNhc2UgSURfUFJJVjoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIGludAoraXNGdWxsVGV4dFN0cmluZyhpbnQgZnJhbWVfaWQpCit7CisgICAgc3dpdGNoIChmcmFtZV9pZCkgeworICAgIGNhc2UgSURfVlNMVDoKKyAgICBjYXNlIElEX0NPTU1FTlQ6CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitoYXNVY3MyQnl0ZU9yZGVyTWFya2VyKHVuc2lnbmVkIHNob3J0IGJvbSkKK3sKKyAgICBpZiAoYm9tID09IDB4RkZGRXUgfHwgYm9tID09IDB4RkVGRnUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgRnJhbWVEYXRhTm9kZSAqCitmaW5kTm9kZShpZDN0YWdfc3BlYyBjb25zdCAqdGFnLCBpbnQgZnJhbWVfaWQsIEZyYW1lRGF0YU5vZGUgKiBsYXN0KQoreworICAgIEZyYW1lRGF0YU5vZGUgKm5vZGUgPSBsYXN0ID8gbGFzdC0+bnh0IDogdGFnLT52Ml9oZWFkOworICAgIHdoaWxlIChub2RlICE9IDApIHsKKyAgICAgICAgaWYgKG5vZGUtPmZpZCA9PSBmcmFtZV9pZCkgeworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm54dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmROb2RlKGlkM3RhZ19zcGVjICogdGFnLCBGcmFtZURhdGFOb2RlICogbm9kZSkKK3sKKyAgICBpZiAodGFnLT52Ml90YWlsID09IDAgfHwgdGFnLT52Ml9oZWFkID09IDApIHsKKyAgICAgICAgdGFnLT52Ml9oZWFkID0gbm9kZTsKKyAgICAgICAgdGFnLT52Ml90YWlsID0gbm9kZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRhZy0+djJfdGFpbC0+bnh0ID0gbm9kZTsKKyAgICAgICAgdGFnLT52Ml90YWlsID0gbm9kZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRMYW5nKGNoYXIgKmRzdCwgY2hhciBjb25zdCAqc3JjKQoreworICAgIGludCAgICAgaTsKKyAgICBpZiAoc3JjID09IDAgfHwgc3JjWzBdID09IDApIHsKKyAgICAgICAgZHN0WzBdID0gJ1gnOworICAgICAgICBkc3RbMV0gPSAnWCc7CisgICAgICAgIGRzdFsyXSA9ICdYJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIHNyYyAmJiAqc3JjOyArK2kpIHsKKyAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgZHN0W2ldID0gJyAnOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50Citpc1NhbWVMYW5nKGNoYXIgY29uc3QgKmwxLCBjaGFyIGNvbnN0ICpsMikKK3sKKyAgICBjaGFyICAgIGRbM107CisgICAgaW50ICAgICBpOworICAgIHNldExhbmcoZCwgbDIpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgY2hhciAgICBhID0gdG9sb3dlcihsMVtpXSk7CisgICAgICAgIGNoYXIgICAgYiA9IHRvbG93ZXIoZFtpXSk7CisgICAgICAgIGlmIChhIDwgJyAnKQorICAgICAgICAgICAgYSA9ICcgJzsKKyAgICAgICAgaWYgKGIgPCAnICcpCisgICAgICAgICAgICBiID0gJyAnOworICAgICAgICBpZiAoYSAhPSBiKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAoraXNTYW1lRGVzY3JpcHRvcihGcmFtZURhdGFOb2RlICogbm9kZSwgY2hhciBjb25zdCAqZHNjKQoreworICAgIHNpemVfdCAgaTsKKyAgICBpZiAobm9kZS0+ZHNjLmVuYyA9PSAxICYmIG5vZGUtPmRzYy5kaW0gPiAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZS0+ZHNjLmRpbTsgKytpKSB7CisgICAgICAgIGlmICghZHNjIHx8IG5vZGUtPmRzYy5wdHIubFtpXSAhPSBkc2NbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Citpc1NhbWVEZXNjcmlwdG9yVWNzMihGcmFtZURhdGFOb2RlIGNvbnN0ICpub2RlLCB1bnNpZ25lZCBzaG9ydCBjb25zdCAqZHNjKQoreworICAgIHNpemVfdCAgaTsKKyAgICBpZiAobm9kZS0+ZHNjLmVuYyAhPSAxICYmIG5vZGUtPmRzYy5kaW0gPiAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZS0+ZHNjLmRpbTsgKytpKSB7CisgICAgICAgIGlmICghZHNjIHx8IG5vZGUtPmRzYy5wdHIudVtpXSAhPSBkc2NbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitpZDN2Ml9hZGRfdWNzMihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGZyYW1lX2lkLCBjaGFyIGNvbnN0ICpsYW5nLCB1bnNpZ25lZCBzaG9ydCBjb25zdCAqZGVzYywKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGNvbnN0ICp0ZXh0KQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaWYgKGdmYyAhPSAwKSB7CisgICAgICAgIEZyYW1lRGF0YU5vZGUgKm5vZGUgPSAwOworICAgICAgICBub2RlID0gZmluZE5vZGUoJmdmYy0+dGFnX3NwZWMsIGZyYW1lX2lkLCAwKTsKKyAgICAgICAgaWYgKGlzTXVsdGlGcmFtZShmcmFtZV9pZCkpIHsKKyAgICAgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU2FtZUxhbmcobm9kZS0+bG5nLCBsYW5nKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lRGVzY3JpcHRvclVjczIobm9kZSwgZGVzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBmaW5kTm9kZSgmZ2ZjLT50YWdfc3BlYywgZnJhbWVfaWQsIG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IDApIHsKKyAgICAgICAgICAgIG5vZGUgPSBjYWxsb2MoMSwgc2l6ZW9mKEZyYW1lRGF0YU5vZGUpKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI1NDsgLyogbWVtb3J5IHByb2JsZW0gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwcGVuZE5vZGUoJmdmYy0+dGFnX3NwZWMsIG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUtPmZpZCA9IGZyYW1lX2lkOworICAgICAgICBzZXRMYW5nKG5vZGUtPmxuZywgbGFuZyk7CisgICAgICAgIG5vZGUtPmRzYy5kaW0gPSBsb2NhbF91Y3MyX3N0cmR1cCgmbm9kZS0+ZHNjLnB0ci51LCBkZXNjKTsKKyAgICAgICAgbm9kZS0+ZHNjLmVuYyA9IDE7CisgICAgICAgIG5vZGUtPnR4dC5kaW0gPSBsb2NhbF91Y3MyX3N0cmR1cCgmbm9kZS0+dHh0LnB0ci51LCB0ZXh0KTsKKyAgICAgICAgbm9kZS0+dHh0LmVuYyA9IDE7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gKENIQU5HRURfRkxBRyB8IEFERF9WMl9GTEFHKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lkM3YyX2FkZF9sYXRpbjEobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBmcmFtZV9pZCwgY2hhciBjb25zdCAqbGFuZywgY2hhciBjb25zdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdGV4dCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmIChnZmMgIT0gMCkgeworICAgICAgICBGcmFtZURhdGFOb2RlICpub2RlID0gMDsKKyAgICAgICAgbm9kZSA9IGZpbmROb2RlKCZnZmMtPnRhZ19zcGVjLCBmcmFtZV9pZCwgMCk7CisgICAgICAgIGlmIChpc011bHRpRnJhbWUoZnJhbWVfaWQpKSB7CisgICAgICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgICAgIGlmIChpc1NhbWVMYW5nKG5vZGUtPmxuZywgbGFuZykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZURlc2NyaXB0b3Iobm9kZSwgZGVzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBmaW5kTm9kZSgmZ2ZjLT50YWdfc3BlYywgZnJhbWVfaWQsIG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IDApIHsKKyAgICAgICAgICAgIG5vZGUgPSBjYWxsb2MoMSwgc2l6ZW9mKEZyYW1lRGF0YU5vZGUpKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI1NDsgLyogbWVtb3J5IHByb2JsZW0gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwcGVuZE5vZGUoJmdmYy0+dGFnX3NwZWMsIG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUtPmZpZCA9IGZyYW1lX2lkOworICAgICAgICBzZXRMYW5nKG5vZGUtPmxuZywgbGFuZyk7CisgICAgICAgIG5vZGUtPmRzYy5kaW0gPSBsb2NhbF9zdHJkdXAoJm5vZGUtPmRzYy5wdHIubCwgZGVzYyk7CisgICAgICAgIG5vZGUtPmRzYy5lbmMgPSAwOworICAgICAgICBub2RlLT50eHQuZGltID0gbG9jYWxfc3RyZHVwKCZub2RlLT50eHQucHRyLmwsIHRleHQpOworICAgICAgICBub2RlLT50eHQuZW5jID0gMDsKKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5mbGFncyB8PSAoQ0hBTkdFRF9GTEFHIHwgQUREX1YyX0ZMQUcpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK2lkM3RhZ19zZXRfdGV4dGluZm9fdWNzMihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgY2hhciBjb25zdCAqaWQsIHVuc2lnbmVkIHNob3J0IGNvbnN0ICp0ZXh0KQoreworICAgIGludCBjb25zdCB0X21hc2sgPSBGUkFNRV9JRCgnVCcsIDAsIDAsIDApOworICAgIGludCBjb25zdCBmcmFtZV9pZCA9IHRvSUQzdjJUYWdJZChpZCk7CisgICAgaWYgKGZyYW1lX2lkID09IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGZyYW1lX2lkICYgdF9tYXNrKSA9PSB0X21hc2spIHsKKyAgICAgICAgaWYgKGlzTnVtZXJpY1N0cmluZyhmcmFtZV9pZCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMjsgIC8qIG11c3QgYmUgTGF0aW4tMSBlbmNvZGVkICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNVY3MyQnl0ZU9yZGVyTWFya2VyKHRleHRbMF0pKSB7CisgICAgICAgICAgICByZXR1cm4gLTM7ICAvKiBCT00gbWlzc2luZyAqLworICAgICAgICB9CisgICAgICAgIGlmIChnZnAgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGlkM3YyX2FkZF91Y3MyKGdmcCwgZnJhbWVfaWQsIDAsIDAsIHRleHQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMjU1OyAgICAgICAgLyogbm90IHN1cHBvcnRlZCBieSBub3cgKi8KK30KKworaW50CitpZDN0YWdfc2V0X3RleHRpbmZvX2xhdGluMShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgY2hhciBjb25zdCAqaWQsIGNoYXIgY29uc3QgKnRleHQpCit7CisgICAgaW50IGNvbnN0IHRfbWFzayA9IEZSQU1FX0lEKCdUJywgMCwgMCwgMCk7CisgICAgaW50IGNvbnN0IGZyYW1lX2lkID0gdG9JRDN2MlRhZ0lkKGlkKTsKKyAgICBpZiAoZnJhbWVfaWQgPT0gMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoZnJhbWVfaWQgJiB0X21hc2spID09IHRfbWFzaykgeworICAgICAgICBpZiAodGV4dCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2ZwICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBpZDN2Ml9hZGRfbGF0aW4xKGdmcCwgZnJhbWVfaWQsIDAsIDAsIHRleHQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMjU1OyAgICAgICAgLyogbm90IHN1cHBvcnRlZCBieSBub3cgKi8KK30KKworCitpbnQKK2lkM3RhZ19zZXRfY29tbWVudF9sYXRpbjEobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGNoYXIgY29uc3QgKmxhbmcsIGNoYXIgY29uc3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKnRleHQpCit7CisgICAgaWYgKGdmcCAhPSAwKSB7CisgICAgICAgIHJldHVybiBpZDN2Ml9hZGRfbGF0aW4xKGdmcCwgSURfQ09NTUVOVCwgbGFuZywgZGVzYywgdGV4dCk7CisgICAgfQorICAgIHJldHVybiAtMjU1OworfQorCisKK2ludAoraWQzdGFnX3NldF9jb21tZW50X3VjczIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGNoYXIgY29uc3QgKmxhbmcsIHVuc2lnbmVkIHNob3J0IGNvbnN0ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY29uc3QgKnRleHQpCit7CisgICAgaWYgKGdmcCAhPSAwKSB7CisgICAgICAgIHJldHVybiBpZDN2Ml9hZGRfdWNzMihnZnAsIElEX0NPTU1FTlQsIGxhbmcsIGRlc2MsIHRleHQpOworICAgIH0KKyAgICByZXR1cm4gLTI1NTsKK30KKworCit2b2lkCitpZDN0YWdfc2V0X3RpdGxlKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBjb25zdCBjaGFyICp0aXRsZSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmICh0aXRsZSAmJiAqdGl0bGUpIHsKKyAgICAgICAgbG9jYWxfc3RyZHVwKCZnZmMtPnRhZ19zcGVjLnRpdGxlLCB0aXRsZSk7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQ0hBTkdFRF9GTEFHOworICAgICAgICBjb3B5VjFUb1YyKGdmcCwgSURfVElUTEUsIHRpdGxlKTsKKyAgICB9Cit9CisKK3ZvaWQKK2lkM3RhZ19zZXRfYXJ0aXN0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBjb25zdCBjaGFyICphcnRpc3QpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpZiAoYXJ0aXN0ICYmICphcnRpc3QpIHsKKyAgICAgICAgbG9jYWxfc3RyZHVwKCZnZmMtPnRhZ19zcGVjLmFydGlzdCwgYXJ0aXN0KTsKKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5mbGFncyB8PSBDSEFOR0VEX0ZMQUc7CisgICAgICAgIGNvcHlWMVRvVjIoZ2ZwLCBJRF9BUlRJU1QsIGFydGlzdCk7CisgICAgfQorfQorCit2b2lkCitpZDN0YWdfc2V0X2FsYnVtKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBjb25zdCBjaGFyICphbGJ1bSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmIChhbGJ1bSAmJiAqYWxidW0pIHsKKyAgICAgICAgbG9jYWxfc3RyZHVwKCZnZmMtPnRhZ19zcGVjLmFsYnVtLCBhbGJ1bSk7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQ0hBTkdFRF9GTEFHOworICAgICAgICBjb3B5VjFUb1YyKGdmcCwgSURfQUxCVU0sIGFsYnVtKTsKKyAgICB9Cit9CisKK3ZvaWQKK2lkM3RhZ19zZXRfeWVhcihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgY29uc3QgY2hhciAqeWVhcikKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmICh5ZWFyICYmICp5ZWFyKSB7CisgICAgICAgIGludCAgICAgbnVtID0gYXRvaSh5ZWFyKTsKKyAgICAgICAgaWYgKG51bSA8IDApIHsKKyAgICAgICAgICAgIG51bSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogbGltaXQgYSB5ZWFyIHRvIDQgZGlnaXRzIHNvIGl0IGZpdHMgaW4gYSB2ZXJzaW9uIDEgdGFnICovCisgICAgICAgIGlmIChudW0gPiA5OTk5KSB7CisgICAgICAgICAgICBudW0gPSA5OTk5OworICAgICAgICB9CisgICAgICAgIGlmIChudW0pIHsKKyAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMueWVhciA9IG51bTsKKyAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQ0hBTkdFRF9GTEFHOworICAgICAgICB9CisgICAgICAgIGNvcHlWMVRvVjIoZ2ZwLCBJRF9ZRUFSLCB5ZWFyKTsKKyAgICB9Cit9CisKK3ZvaWQKK2lkM3RhZ19zZXRfY29tbWVudChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgY29uc3QgY2hhciAqY29tbWVudCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmIChjb21tZW50ICYmICpjb21tZW50KSB7CisgICAgICAgIGxvY2FsX3N0cmR1cCgmZ2ZjLT50YWdfc3BlYy5jb21tZW50LCBjb21tZW50KTsKKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5mbGFncyB8PSBDSEFOR0VEX0ZMQUc7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb25zdCBmbGFncyA9IGdmYy0+dGFnX3NwZWMuZmxhZ3M7CisgICAgICAgICAgICBpZDN2Ml9hZGRfbGF0aW4xKGdmcCwgSURfQ09NTUVOVCwgIlhYWCIsICIiLCBjb21tZW50KTsKKyAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50CitpZDN0YWdfc2V0X3RyYWNrKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBjb25zdCBjaGFyICp0cmFjaykKK3sKKyAgICBjaGFyIGNvbnN0ICp0cmFja2NvdW50OworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICByZXQgPSAwOworCisgICAgaWYgKHRyYWNrICYmICp0cmFjaykgeworICAgICAgICBpbnQgICAgIG51bSA9IGF0b2kodHJhY2spOworICAgICAgICAvKiBjaGVjayBmb3IgdmFsaWQgSUQzdjEgdHJhY2sgbnVtYmVyIHJhbmdlICovCisgICAgICAgIGlmIChudW0gPCAxIHx8IG51bSA+IDI1NSkgeworICAgICAgICAgICAgbnVtID0gMDsKKyAgICAgICAgICAgIHJldCA9IC0xOyAgIC8qIHRyYWNrIG51bWJlciBvdXQgb2YgSUQzdjEgcmFuZ2UsIGlnbm9yZWQgZm9yIElEM3YxICovCisgICAgICAgICAgICBnZmMtPnRhZ19zcGVjLmZsYWdzIHw9IChDSEFOR0VEX0ZMQUcgfCBBRERfVjJfRkxBRyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bSkgeworICAgICAgICAgICAgZ2ZjLT50YWdfc3BlYy50cmFja19pZDN2MSA9IG51bTsKKyAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQ0hBTkdFRF9GTEFHOworICAgICAgICB9CisgICAgICAgIC8qIExvb2sgZm9yIHRoZSB0b3RhbCB0cmFjayBjb3VudCBhZnRlciBhICIvIiwgc2FtZSByZXN0cmljdGlvbnMgKi8KKyAgICAgICAgdHJhY2tjb3VudCA9IHN0cmNocih0cmFjaywgJy8nKTsKKyAgICAgICAgaWYgKHRyYWNrY291bnQgJiYgKnRyYWNrY291bnQpIHsKKyAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gKENIQU5HRURfRkxBRyB8IEFERF9WMl9GTEFHKTsKKyAgICAgICAgfQorICAgICAgICBjb3B5VjFUb1YyKGdmcCwgSURfVFJBQ0ssIHRyYWNrKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyogd291bGQgdXNlIHJlYWwgInN0cmNhc2VjbXAiIGJ1dCBpdCBpc24ndCBwb3J0YWJsZSAqLworc3RhdGljIGludAorbG9jYWxfc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgICAgdW5zaWduZWQgY2hhciBjMTsKKyAgICB1bnNpZ25lZCBjaGFyIGMyOworICAgIGRvIHsKKyAgICAgICAgYzEgPSB0b2xvd2VyKCpzMSk7CisgICAgICAgIGMyID0gdG9sb3dlcigqczIpOworICAgICAgICBpZiAoIWMxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICArK3MxOworICAgICAgICArK3MyOworICAgIH0gd2hpbGUgKGMxID09IGMyKTsKKyAgICByZXR1cm4gYzEgLSBjMjsKK30KKworCitzdGF0aWMgCitjb25zdCBjaGFyKiBuZXh0VXBwZXJBbHBoYShjb25zdCBjaGFyKiBwLCBjaGFyIHgpCit7CisgICAgY2hhciBjOworICAgIGZvcihjID0gdG91cHBlcigqcCk7ICpwICE9IDA7IGMgPSB0b3VwcGVyKCorK3ApKSB7CisgICAgICAgIGlmICgnQScgPD0gYyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgaWYgKGMgIT0geCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwOworfQorCisKK3N0YXRpYyBpbnQKK3Nsb3BweUNvbXBhcmVkKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIHEpCit7CisgICAgY2hhciBjcCwgY3E7CisgICAgcCA9IG5leHRVcHBlckFscGhhKHAsIDApOworICAgIHEgPSBuZXh0VXBwZXJBbHBoYShxLCAwKTsKKyAgICBjcCA9IHRvdXBwZXIoKnApOworICAgIGNxID0gdG91cHBlcigqcSk7CisgICAgd2hpbGUgKGNwID09IGNxKSB7CisgICAgICAgIGlmIChjcCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFsxXSA9PSAnLicpIHsgLyogc29tZSBhYmJyZXZhdGlvbiAqLworICAgICAgICAgICAgd2hpbGUgKCpxICYmICpxKysgIT0gJyAnKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcCA9IG5leHRVcHBlckFscGhhKHAsIGNwKTsKKyAgICAgICAgcSA9IG5leHRVcHBlckFscGhhKHEsIGNxKTsKKyAgICAgICAgY3AgPSB0b3VwcGVyKCpwKTsKKyAgICAgICAgY3EgPSB0b3VwcGVyKCpxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCAKK3Nsb3BweVNlYXJjaEdlbnJlKGNvbnN0IGNoYXIgKmdlbnJlKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBHRU5SRV9OQU1FX0NPVU5UOyArK2kpIHsKKyAgICAgICAgaWYgKHNsb3BweUNvbXBhcmVkKGdlbnJlLCBnZW5yZV9uYW1lc1tpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBHRU5SRV9OQU1FX0NPVU5UOworfQorCisKK3N0YXRpYyBpbnQKK3NlYXJjaEdlbnJlKGNvbnN0IGNoYXIqIGdlbnJlKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBHRU5SRV9OQU1FX0NPVU5UOyArK2kpIHsKKyAgICAgICAgaWYgKCFsb2NhbF9zdHJjYXNlY21wKGdlbnJlLCBnZW5yZV9uYW1lc1tpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBHRU5SRV9OQU1FX0NPVU5UOworfQorCisKK2ludAoraWQzdGFnX3NldF9nZW5yZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgY29uc3QgY2hhciAqZ2VucmUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIHJldCA9IDA7CisgICAgaWYgKGdlbnJlICYmICpnZW5yZSkgeworICAgICAgICBjaGFyICAgKnN0cjsKKyAgICAgICAgaW50ICAgICBudW0gPSBzdHJ0b2woZ2VucmUsICZzdHIsIDEwKTsKKyAgICAgICAgLyogaXMgdGhlIGlucHV0IGEgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyPyAqLworICAgICAgICBpZiAoKnN0cikgeworICAgICAgICAgICAgbnVtID0gc2VhcmNoR2VucmUoZ2VucmUpOworICAgICAgICAgICAgaWYgKG51bSA9PSBHRU5SRV9OQU1FX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgbnVtID0gc2xvcHB5U2VhcmNoR2VucmUoZ2VucmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bSA9PSBHRU5SRV9OQU1FX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgbnVtID0gR0VOUkVfSU5ERVhfT1RIRVI7CisgICAgICAgICAgICAgICAgcmV0ID0gLTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5yZSA9IGdlbnJlX25hbWVzW251bV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKG51bSA8IDApIHx8IChudW0gPj0gR0VOUkVfTkFNRV9DT1VOVCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5yZSA9IGdlbnJlX25hbWVzW251bV07CisgICAgICAgIH0KKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5nZW5yZV9pZDN2MSA9IG51bTsKKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5mbGFncyB8PSBDSEFOR0VEX0ZMQUc7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQUREX1YyX0ZMQUc7CisgICAgICAgIH0KKyAgICAgICAgY29weVYxVG9WMihnZnAsIElEX0dFTlJFLCBnZW5yZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorc2V0X2ZyYW1lX2N1c3RvbSh1bnNpZ25lZCBjaGFyICpmcmFtZSwgY29uc3QgY2hhciAqZmllbGR2YWx1ZSkKK3sKKyAgICBpZiAoZmllbGR2YWx1ZSAmJiAqZmllbGR2YWx1ZSkgeworICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSA9IGZpZWxkdmFsdWUgKyA1OworICAgICAgICBzaXplX3QgIGxlbmd0aCA9IHN0cmxlbih2YWx1ZSk7CisgICAgICAgICpmcmFtZSsrID0gKmZpZWxkdmFsdWUrKzsKKyAgICAgICAgKmZyYW1lKysgPSAqZmllbGR2YWx1ZSsrOworICAgICAgICAqZnJhbWUrKyA9ICpmaWVsZHZhbHVlKys7CisgICAgICAgICpmcmFtZSsrID0gKmZpZWxkdmFsdWUrKzsKKyAgICAgICAgZnJhbWUgPSBzZXRfNF9ieXRlX3ZhbHVlKGZyYW1lLCAodW5zaWduZWQgbG9uZykgKHN0cmxlbih2YWx1ZSkgKyAxKSk7CisgICAgICAgIC8qIGNsZWFyIDItYnl0ZSBoZWFkZXIgZmxhZ3MgKi8KKyAgICAgICAgKmZyYW1lKysgPSAwOworICAgICAgICAqZnJhbWUrKyA9IDA7CisgICAgICAgIC8qIGNsZWFyIDEgZW5jb2RpbmcgZGVzY3JpcHRvciBieXRlIHRvIGluZGljYXRlIElTTy04ODU5LTEgZm9ybWF0ICovCisgICAgICAgICpmcmFtZSsrID0gMDsKKyAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgICAgICAqZnJhbWUrKyA9ICp2YWx1ZSsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmcmFtZTsKK30KKworc3RhdGljICBzaXplX3QKK3NpemVPZk5vZGUoRnJhbWVEYXRhTm9kZSBjb25zdCAqbm9kZSkKK3sKKyAgICBzaXplX3QgIG4gPSAwOworICAgIGlmIChub2RlKSB7CisgICAgICAgIG4gPSAxMDsgICAgICAgICAvKiBoZWFkZXIgc2l6ZSAqLworICAgICAgICBuICs9IDE7ICAgICAgICAgLyogdGV4dCBlbmNvZGluZyBmbGFnICovCisgICAgICAgIHN3aXRjaCAobm9kZS0+dHh0LmVuYykgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBuICs9IG5vZGUtPnR4dC5kaW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbiArPSBub2RlLT50eHQuZGltICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuOworfQorCitzdGF0aWMgIHNpemVfdAorc2l6ZU9mQ29tbWVudE5vZGUoRnJhbWVEYXRhTm9kZSBjb25zdCAqbm9kZSkKK3sKKyAgICBzaXplX3QgIG4gPSAwOworICAgIGlmIChub2RlKSB7CisgICAgICAgIG4gPSAxMDsgICAgICAgICAvKiBoZWFkZXIgc2l6ZSAqLworICAgICAgICBuICs9IDE7ICAgICAgICAgLyogdGV4dCBlbmNvZGluZyBmbGFnICovCisgICAgICAgIG4gKz0gMzsgICAgICAgICAvKiBsYW5ndWFnZSAqLworICAgICAgICBzd2l0Y2ggKG5vZGUtPmRzYy5lbmMpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgbiArPSAxICsgbm9kZS0+ZHNjLmRpbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBuICs9IDIgKyBub2RlLT5kc2MuZGltICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobm9kZS0+dHh0LmVuYykgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBuICs9IG5vZGUtPnR4dC5kaW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbiArPSBub2RlLT50eHQuZGltICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCit3cml0ZUNoYXJzKHVuc2lnbmVkIGNoYXIgKmZyYW1lLCBjaGFyIGNvbnN0ICpzdHIsIHNpemVfdCBuKQoreworICAgIHdoaWxlIChuLS0pIHsKKyAgICAgICAgKmZyYW1lKysgPSAqc3RyKys7CisgICAgfQorICAgIHJldHVybiBmcmFtZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgord3JpdGVVY3Mycyh1bnNpZ25lZCBjaGFyICpmcmFtZSwgdW5zaWduZWQgc2hvcnQgKnN0ciwgc2l6ZV90IG4pCit7CisgICAgd2hpbGUgKG4tLSkgeworICAgICAgICAqZnJhbWUrKyA9IDB4ZmYgJiAoKnN0ciA+PiA4KTsKKyAgICAgICAgKmZyYW1lKysgPSAweGZmICYgKCpzdHIrKyk7CisgICAgfQorICAgIHJldHVybiBmcmFtZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorc2V0X2ZyYW1lX2NvbW1lbnQodW5zaWduZWQgY2hhciAqZnJhbWUsIEZyYW1lRGF0YU5vZGUgY29uc3QgKm5vZGUpCit7CisgICAgc2l6ZV90IGNvbnN0IG4gPSBzaXplT2ZDb21tZW50Tm9kZShub2RlKTsKKyAgICBpZiAobiA+IDEwKSB7CisgICAgICAgIGZyYW1lID0gc2V0XzRfYnl0ZV92YWx1ZShmcmFtZSwgSURfQ09NTUVOVCk7CisgICAgICAgIGZyYW1lID0gc2V0XzRfYnl0ZV92YWx1ZShmcmFtZSwgKHVpbnQzMl90KSAobiAtIDEwKSk7CisgICAgICAgIC8qIGNsZWFyIDItYnl0ZSBoZWFkZXIgZmxhZ3MgKi8KKyAgICAgICAgKmZyYW1lKysgPSAwOworICAgICAgICAqZnJhbWUrKyA9IDA7CisgICAgICAgIC8qIGVuY29kaW5nIGRlc2NyaXB0b3IgYnl0ZSAqLworICAgICAgICAqZnJhbWUrKyA9IG5vZGUtPnR4dC5lbmMgPT0gMSA/IDEgOiAwOworICAgICAgICAvKiAzIGJ5dGVzIGxhbmd1YWdlICovCisgICAgICAgICpmcmFtZSsrID0gbm9kZS0+bG5nWzBdOworICAgICAgICAqZnJhbWUrKyA9IG5vZGUtPmxuZ1sxXTsKKyAgICAgICAgKmZyYW1lKysgPSBub2RlLT5sbmdbMl07CisgICAgICAgIC8qIGRlc2NyaXB0b3Igd2l0aCB6ZXJvIGJ5dGUocykgc2VwYXJhdG9yICovCisgICAgICAgIGlmIChub2RlLT5kc2MuZW5jICE9IDEpIHsKKyAgICAgICAgICAgIGZyYW1lID0gd3JpdGVDaGFycyhmcmFtZSwgbm9kZS0+ZHNjLnB0ci5sLCBub2RlLT5kc2MuZGltKTsKKyAgICAgICAgICAgICpmcmFtZSsrID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lID0gd3JpdGVVY3MycyhmcmFtZSwgbm9kZS0+ZHNjLnB0ci51LCBub2RlLT5kc2MuZGltKTsKKyAgICAgICAgICAgICpmcmFtZSsrID0gMDsKKyAgICAgICAgICAgICpmcmFtZSsrID0gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBjb21tZW50IGZ1bGwgdGV4dCAqLworICAgICAgICBpZiAobm9kZS0+dHh0LmVuYyAhPSAxKSB7CisgICAgICAgICAgICBmcmFtZSA9IHdyaXRlQ2hhcnMoZnJhbWUsIG5vZGUtPnR4dC5wdHIubCwgbm9kZS0+dHh0LmRpbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcmFtZSA9IHdyaXRlVWNzMnMoZnJhbWUsIG5vZGUtPnR4dC5wdHIudSwgbm9kZS0+dHh0LmRpbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitzZXRfZnJhbWVfY3VzdG9tMih1bnNpZ25lZCBjaGFyICpmcmFtZSwgRnJhbWVEYXRhTm9kZSBjb25zdCAqbm9kZSkKK3sKKyAgICBzaXplX3QgY29uc3QgbiA9IHNpemVPZk5vZGUobm9kZSk7CisgICAgaWYgKG4gPiAxMCkgeworICAgICAgICBmcmFtZSA9IHNldF80X2J5dGVfdmFsdWUoZnJhbWUsIG5vZGUtPmZpZCk7CisgICAgICAgIGZyYW1lID0gc2V0XzRfYnl0ZV92YWx1ZShmcmFtZSwgKHVuc2lnbmVkIGxvbmcpIChuIC0gMTApKTsKKyAgICAgICAgLyogY2xlYXIgMi1ieXRlIGhlYWRlciBmbGFncyAqLworICAgICAgICAqZnJhbWUrKyA9IDA7CisgICAgICAgICpmcmFtZSsrID0gMDsKKyAgICAgICAgLyogY2xlYXIgMSBlbmNvZGluZyBkZXNjcmlwdG9yIGJ5dGUgdG8gaW5kaWNhdGUgSVNPLTg4NTktMSBmb3JtYXQgKi8KKyAgICAgICAgKmZyYW1lKysgPSBub2RlLT50eHQuZW5jID09IDEgPyAxIDogMDsKKyAgICAgICAgaWYgKG5vZGUtPnR4dC5lbmMgIT0gMSkgeworICAgICAgICAgICAgZnJhbWUgPSB3cml0ZUNoYXJzKGZyYW1lLCBub2RlLT50eHQucHRyLmwsIG5vZGUtPnR4dC5kaW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnJhbWUgPSB3cml0ZVVjczJzKGZyYW1lLCBub2RlLT50eHQucHRyLnUsIG5vZGUtPnR4dC5kaW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmcmFtZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorc2V0X2ZyYW1lX2FwaWModW5zaWduZWQgY2hhciAqZnJhbWUsIGNvbnN0IGNoYXIgKm1pbWV0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICAvKiBJRDN2Mi4zIHN0YW5kYXJkIEFQSUMgZnJhbWU6CisgICAgICogICAgIDxIZWFkZXIgZm9yICdBdHRhY2hlZCBwaWN0dXJlJywgSUQ6ICJBUElDIj4KKyAgICAgKiAgICAgVGV4dCBlbmNvZGluZyAgICAkeHgKKyAgICAgKiAgICAgTUlNRSB0eXBlICAgICAgICA8dGV4dCBzdHJpbmc+ICQwMAorICAgICAqICAgICBQaWN0dXJlIHR5cGUgICAgICR4eAorICAgICAqICAgICBEZXNjcmlwdGlvbiAgICAgIDx0ZXh0IHN0cmluZyBhY2NvcmRpbmcgdG8gZW5jb2Rpbmc+ICQwMCAoMDApCisgICAgICogICAgIFBpY3R1cmUgZGF0YSAgICAgPGJpbmFyeSBkYXRhPgorICAgICAqLworICAgIGlmIChtaW1ldHlwZSAmJiBkYXRhICYmIHNpemUpIHsKKyAgICAgICAgZnJhbWUgPSBzZXRfNF9ieXRlX3ZhbHVlKGZyYW1lLCBGUkFNRV9JRCgnQScsICdQJywgJ0knLCAnQycpKTsKKyAgICAgICAgZnJhbWUgPSBzZXRfNF9ieXRlX3ZhbHVlKGZyYW1lLCAodW5zaWduZWQgbG9uZykgKDQgKyBzdHJsZW4obWltZXR5cGUpICsgc2l6ZSkpOworICAgICAgICAvKiBjbGVhciAyLWJ5dGUgaGVhZGVyIGZsYWdzICovCisgICAgICAgICpmcmFtZSsrID0gMDsKKyAgICAgICAgKmZyYW1lKysgPSAwOworICAgICAgICAvKiBjbGVhciAxIGVuY29kaW5nIGRlc2NyaXB0b3IgYnl0ZSB0byBpbmRpY2F0ZSBJU08tODg1OS0xIGZvcm1hdCAqLworICAgICAgICAqZnJhbWUrKyA9IDA7CisgICAgICAgIC8qIGNvcHkgbWltZV90eXBlICovCisgICAgICAgIHdoaWxlICgqbWltZXR5cGUpIHsKKyAgICAgICAgICAgICpmcmFtZSsrID0gKm1pbWV0eXBlKys7CisgICAgICAgIH0KKyAgICAgICAgKmZyYW1lKysgPSAwOworICAgICAgICAvKiBzZXQgcGljdHVyZSB0eXBlIHRvIDAgKi8KKyAgICAgICAgKmZyYW1lKysgPSAwOworICAgICAgICAvKiBlbXB0eSBkZXNjcmlwdGlvbiBmaWVsZCAqLworICAgICAgICAqZnJhbWUrKyA9IDA7CisgICAgICAgIC8qIGNvcHkgdGhlIGltYWdlIGRhdGEgKi8KKyAgICAgICAgd2hpbGUgKHNpemUtLSkgeworICAgICAgICAgICAgKmZyYW1lKysgPSAqZGF0YSsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmcmFtZTsKK30KKworaW50CitpZDN0YWdfc2V0X2ZpZWxkdmFsdWUobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGNvbnN0IGNoYXIgKmZpZWxkdmFsdWUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpZiAoZmllbGR2YWx1ZSAmJiAqZmllbGR2YWx1ZSkgeworICAgICAgICBpbnQgY29uc3QgZnJhbWVfaWQgPSB0b0lEM3YyVGFnSWQoZmllbGR2YWx1ZSk7CisgICAgICAgIGNoYXIgICoqcCA9IE5VTEw7CisgICAgICAgIGlmIChzdHJsZW4oZmllbGR2YWx1ZSkgPCA1IHx8IGZpZWxkdmFsdWVbNF0gIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYW1lX2lkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChpZDN0YWdfc2V0X3RleHRpbmZvX2xhdGluMShnZnAsIGZpZWxkdmFsdWUsICZmaWVsZHZhbHVlWzVdKSkgeworICAgICAgICAgICAgICAgIHAgPSAoY2hhciAqKikgcmVhbGxvYyhnZmMtPnRhZ19zcGVjLnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYXIgKikgKiAoZ2ZjLT50YWdfc3BlYy5udW1fdmFsdWVzICsgMSkpOworICAgICAgICAgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMudmFsdWVzID0gKGNoYXIgKiopIHA7CisgICAgICAgICAgICAgICAgZ2ZjLT50YWdfc3BlYy52YWx1ZXNbZ2ZjLT50YWdfc3BlYy5udW1fdmFsdWVzKytdID0gc3RyZHVwKGZpZWxkdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdmYy0+dGFnX3NwZWMuZmxhZ3MgfD0gQ0hBTkdFRF9GTEFHOworICAgIH0KKyAgICBpZDN0YWdfYWRkX3YyKGdmcCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3NpemVfdAorbGFtZV9nZXRfaWQzdjJfdGFnKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYzsKKyAgICBpZiAoZ2ZwID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaWYgKGdmYyA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZ2ZjLT50YWdfc3BlYy5mbGFncyAmIFYxX09OTFlfRkxBRykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgeworICAgICAgICAvKiBjYWxjdWxhdGUgbGVuZ3RoIG9mIGZvdXIgZmllbGRzIHdoaWNoIG1heSBub3QgZml0IGluIHZlcmlvbiAxIHRhZyAqLworICAgICAgICBzaXplX3QgIHRpdGxlX2xlbmd0aCA9IGdmYy0+dGFnX3NwZWMudGl0bGUgPyBzdHJsZW4oZ2ZjLT50YWdfc3BlYy50aXRsZSkgOiAwOworICAgICAgICBzaXplX3QgIGFydGlzdF9sZW5ndGggPSBnZmMtPnRhZ19zcGVjLmFydGlzdCA/IHN0cmxlbihnZmMtPnRhZ19zcGVjLmFydGlzdCkgOiAwOworICAgICAgICBzaXplX3QgIGFsYnVtX2xlbmd0aCA9IGdmYy0+dGFnX3NwZWMuYWxidW0gPyBzdHJsZW4oZ2ZjLT50YWdfc3BlYy5hbGJ1bSkgOiAwOworICAgICAgICBzaXplX3QgIGNvbW1lbnRfbGVuZ3RoID0gZ2ZjLT50YWdfc3BlYy5jb21tZW50ID8gc3RybGVuKGdmYy0+dGFnX3NwZWMuY29tbWVudCkgOiAwOworICAgICAgICAvKiB3cml0ZSB0YWcgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQgb3IgaWYgZmllbGRzIG92ZXJmbG93ICovCisgICAgICAgIGlmICgoZ2ZjLT50YWdfc3BlYy5mbGFncyAmIChBRERfVjJfRkxBRyB8IFYyX09OTFlfRkxBRykpCisgICAgICAgICAgICB8fCAodGl0bGVfbGVuZ3RoID4gMzApCisgICAgICAgICAgICB8fCAoYXJ0aXN0X2xlbmd0aCA+IDMwKSB8fCAoYWxidW1fbGVuZ3RoID4gMzApCisgICAgICAgICAgICB8fCAoY29tbWVudF9sZW5ndGggPiAzMCkKKyAgICAgICAgICAgIHx8IChnZmMtPnRhZ19zcGVjLnRyYWNrX2lkM3YxICYmIChjb21tZW50X2xlbmd0aCA+IDI4KSkpIHsKKyAgICAgICAgICAgIHNpemVfdCAgdGFnX3NpemU7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgICAgc2l6ZV90ICBhZGp1c3RlZF90YWdfc2l6ZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICAgICAgY29uc3QgY2hhciAqYWxidW1hcnRfbWltZSA9IE5VTEw7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbWltZV9qcGVnID0gImltYWdlL2pwZWciOworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm1pbWVfcG5nID0gImltYWdlL3BuZyI7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbWltZV9naWYgPSAiaW1hZ2UvZ2lmIjsKKworICAgICAgICAgICAgaWQzdjJBZGRBdWRpb0R1cmF0aW9uKGdmcCk7CisKKyAgICAgICAgICAgIC8qIGNhbHVsYXRlIHNpemUgb2YgdGFnIHN0YXJ0aW5nIHdpdGggMTAtYnl0ZSB0YWcgaGVhZGVyICovCisgICAgICAgICAgICB0YWdfc2l6ZSA9IDEwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGdmYy0+dGFnX3NwZWMubnVtX3ZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgdGFnX3NpemUgKz0gNiArIHN0cmxlbihnZmMtPnRhZ19zcGVjLnZhbHVlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2ZjLT50YWdfc3BlYy5hbGJ1bWFydCAmJiBnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0X3NpemUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGdmYy0+dGFnX3NwZWMuYWxidW1hcnRfbWltZXR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1JTUVUWVBFX0pQRUc6CisgICAgICAgICAgICAgICAgICAgIGFsYnVtYXJ0X21pbWUgPSBtaW1lX2pwZWc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUlNRVRZUEVfUE5HOgorICAgICAgICAgICAgICAgICAgICBhbGJ1bWFydF9taW1lID0gbWltZV9wbmc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUlNRVRZUEVfR0lGOgorICAgICAgICAgICAgICAgICAgICBhbGJ1bWFydF9taW1lID0gbWltZV9naWY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWxidW1hcnRfbWltZSkgeworICAgICAgICAgICAgICAgICAgICB0YWdfc2l6ZSArPSAxMCArIDQgKyBzdHJsZW4oYWxidW1hcnRfbWltZSkgKyBnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0X3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlkM3RhZ19zcGVjICp0YWcgPSAmZ2ZjLT50YWdfc3BlYzsKKyAgICAgICAgICAgICAgICBpZiAodGFnLT52Ml9oZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVEYXRhTm9kZSAqbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChub2RlID0gdGFnLT52Ml9oZWFkOyBub2RlICE9IDA7IG5vZGUgPSBub2RlLT5ueHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+ZmlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElEX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnX3NpemUgKz0gc2l6ZU9mQ29tbWVudE5vZGUobm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnX3NpemUgKz0gc2l6ZU9mTm9kZShub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZmMtPnRhZ19zcGVjLmZsYWdzICYgUEFEX1YyX0ZMQUcpIHsKKyAgICAgICAgICAgICAgICAvKiBhZGQgc29tZSBieXRlcyBvZiBwYWRkaW5nICovCisgICAgICAgICAgICAgICAgdGFnX3NpemUgKz0gZ2ZjLT50YWdfc3BlYy5wYWRkaW5nX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHRhZ19zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhZ19zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gYnVmZmVyOworICAgICAgICAgICAgLyogc2V0IHRhZyBoZWFkZXIgc3RhcnRpbmcgd2l0aCBmaWxlIGlkZW50aWZpZXIgKi8KKyAgICAgICAgICAgICpwKysgPSAnSSc7CisgICAgICAgICAgICAqcCsrID0gJ0QnOworICAgICAgICAgICAgKnArKyA9ICczJzsKKyAgICAgICAgICAgIC8qIHNldCB2ZXJzaW9uIG51bWJlciB3b3JkICovCisgICAgICAgICAgICAqcCsrID0gMzsKKyAgICAgICAgICAgICpwKysgPSAwOworICAgICAgICAgICAgLyogY2xlYXIgZmxhZ3MgYnl0ZSAqLworICAgICAgICAgICAgKnArKyA9IDA7CisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgYW5kIHNldCB0YWcgc2l6ZSA9IHRvdGFsIHNpemUgLSBoZWFkZXIgc2l6ZSAqLworICAgICAgICAgICAgYWRqdXN0ZWRfdGFnX3NpemUgPSB0YWdfc2l6ZSAtIDEwOworICAgICAgICAgICAgLyogZW5jb2RlIGFkanVzdGVkIHNpemUgaW50byBmb3VyIGJ5dGVzIHdoZXJlIG1vc3Qgc2lnbmlmaWNhbnQgCisgICAgICAgICAgICAgKiBiaXQgaXMgY2xlYXIgaW4gZWFjaCBieXRlLCBmb3IgMjgtYml0IHRvdGFsICovCisgICAgICAgICAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpICgoYWRqdXN0ZWRfdGFnX3NpemUgPj4gMjEpICYgMHg3ZnUpOworICAgICAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSAoKGFkanVzdGVkX3RhZ19zaXplID4+IDE0KSAmIDB4N2Z1KTsKKyAgICAgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikgKChhZGp1c3RlZF90YWdfc2l6ZSA+PiA3KSAmIDB4N2Z1KTsKKyAgICAgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikgKGFkanVzdGVkX3RhZ19zaXplICYgMHg3ZnUpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTk9URTogVGhlIHJlbWFpbmRlciBvZiB0aGUgdGFnIChmcmFtZXMgYW5kIHBhZGRpbmcsIGlmIGFueSkKKyAgICAgICAgICAgICAqIGFyZSBub3QgInVuc3luY2hyb25pemVkIiB0byBwcmV2ZW50IGZhbHNlIE1QRUcgYXVkaW8gaGVhZGVycworICAgICAgICAgICAgICogZnJvbSBhcHBlYXJpbmcgaW4gdGhlIGJpdHN0cmVhbS4gIFdoeT8gIFdlbGwsIG1vc3QgcGxheWVycworICAgICAgICAgICAgICogYW5kIHV0aWxpdGllcyBrbm93IGhvdyB0byBza2lwIHRoZSBJRDMgdmVyc2lvbiAyIHRhZyBieSBub3cKKyAgICAgICAgICAgICAqIGV2ZW4gaWYgdGhleSBkb24ndCByZWFkIGl0cyBjb250ZW50cywgYW5kIGl0J3MgYWN0dWFsbHkKKyAgICAgICAgICAgICAqIHZlcnkgdW5saWtlbHkgdGhhdCBzdWNoIGEgZmFsc2UgInN5bmMiIHBhdHRlcm4gd291bGQgb2NjdXIKKyAgICAgICAgICAgICAqIGluIGp1c3QgdGhlIHNpbXBsZSB0ZXh0IGZyYW1lcyBhZGRlZCBoZXJlLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qIHNldCBlYWNoIGZyYW1lIGluIHRhZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlkM3RhZ19zcGVjICp0YWcgPSAmZ2ZjLT50YWdfc3BlYzsKKyAgICAgICAgICAgICAgICBpZiAodGFnLT52Ml9oZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVEYXRhTm9kZSAqbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChub2RlID0gdGFnLT52Ml9oZWFkOyBub2RlICE9IDA7IG5vZGUgPSBub2RlLT5ueHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+ZmlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElEX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHNldF9mcmFtZV9jb21tZW50KHAsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBzZXRfZnJhbWVfY3VzdG9tMihwLCBub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZmMtPnRhZ19zcGVjLm51bV92YWx1ZXM7ICsraSkgeworICAgICAgICAgICAgICAgIHAgPSBzZXRfZnJhbWVfY3VzdG9tKHAsIGdmYy0+dGFnX3NwZWMudmFsdWVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbGJ1bWFydF9taW1lKSB7CisgICAgICAgICAgICAgICAgcCA9IHNldF9mcmFtZV9hcGljKHAsIGFsYnVtYXJ0X21pbWUsIGdmYy0+dGFnX3NwZWMuYWxidW1hcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdmYy0+dGFnX3NwZWMuYWxidW1hcnRfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjbGVhciBhbnkgcGFkZGluZyBieXRlcyAqLworICAgICAgICAgICAgbWVtc2V0KHAsIDAsIHRhZ19zaXplIC0gKHAgLSBidWZmZXIpKTsKKyAgICAgICAgICAgIHJldHVybiB0YWdfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CitpZDN0YWdfd3JpdGVfdjIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpZiAoKGdmYy0+dGFnX3NwZWMuZmxhZ3MgJiBDSEFOR0VEX0ZMQUcpCisgICAgICAgICYmICEoZ2ZjLT50YWdfc3BlYy5mbGFncyAmIFYxX09OTFlfRkxBRykpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnID0gMDsKKyAgICAgICAgc2l6ZV90ICB0YWdfc2l6ZSwgbjsKKworICAgICAgICBuID0gbGFtZV9nZXRfaWQzdjJfdGFnKGdmcCwgMCwgMCk7CisgICAgICAgIHRhZyA9IG1hbGxvYyhuKTsKKyAgICAgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdGFnX3NpemUgPSBsYW1lX2dldF9pZDN2Ml90YWcoZ2ZwLCB0YWcsIG4pOworICAgICAgICBpZiAodGFnX3NpemUgPiBuKSB7CisgICAgICAgICAgICBmcmVlKHRhZyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgIGk7CisgICAgICAgICAgICAvKiB3cml0ZSB0YWcgZGlyZWN0bHkgaW50byBiaXRzdHJlYW0gYXQgY3VycmVudCBwb3NpdGlvbiAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhZ19zaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhZGRfZHVtbXlfYnl0ZShnZnAsIHRhZ1tpXSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZSh0YWcpOworICAgICAgICByZXR1cm4gKGludCkgdGFnX3NpemU7IC8qIG9rLCB0YWcgc2hvdWxkIG5vdCBleGNlZWQgMkdCICovCisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitzZXRfdGV4dF9maWVsZCh1bnNpZ25lZCBjaGFyICpmaWVsZCwgY29uc3QgY2hhciAqdGV4dCwgc2l6ZV90IHNpemUsIGludCBwYWQpCit7CisgICAgd2hpbGUgKHNpemUtLSkgeworICAgICAgICBpZiAodGV4dCAmJiAqdGV4dCkgeworICAgICAgICAgICAgKmZpZWxkKysgPSAqdGV4dCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgKmZpZWxkKysgPSBwYWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpZWxkOworfQorCitzaXplX3QKK2xhbWVfZ2V0X2lkM3YxX3RhZyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzaXplX3QgY29uc3QgdGFnX3NpemUgPSAxMjg7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjOworCisgICAgaWYgKGdmcCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IHRhZ19zaXplKSB7CisgICAgICAgIHJldHVybiB0YWdfc2l6ZTsKKyAgICB9CisgICAgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpZiAoZ2ZjID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChidWZmZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKChnZmMtPnRhZ19zcGVjLmZsYWdzICYgQ0hBTkdFRF9GTEFHKQorICAgICAgICAmJiAhKGdmYy0+dGFnX3NwZWMuZmxhZ3MgJiBWMl9PTkxZX0ZMQUcpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBidWZmZXI7CisgICAgICAgIGludCAgICAgcGFkID0gKGdmYy0+dGFnX3NwZWMuZmxhZ3MgJiBTUEFDRV9WMV9GTEFHKSA/ICcgJyA6IDA7CisgICAgICAgIGNoYXIgICAgeWVhcls1XTsKKworICAgICAgICAvKiBzZXQgdGFnIGlkZW50aWZpZXIgKi8KKyAgICAgICAgKnArKyA9ICdUJzsKKyAgICAgICAgKnArKyA9ICdBJzsKKyAgICAgICAgKnArKyA9ICdHJzsKKyAgICAgICAgLyogc2V0IGVhY2ggZmllbGQgaW4gdGFnICovCisgICAgICAgIHAgPSBzZXRfdGV4dF9maWVsZChwLCBnZmMtPnRhZ19zcGVjLnRpdGxlLCAzMCwgcGFkKTsKKyAgICAgICAgcCA9IHNldF90ZXh0X2ZpZWxkKHAsIGdmYy0+dGFnX3NwZWMuYXJ0aXN0LCAzMCwgcGFkKTsKKyAgICAgICAgcCA9IHNldF90ZXh0X2ZpZWxkKHAsIGdmYy0+dGFnX3NwZWMuYWxidW0sIDMwLCBwYWQpOworICAgICAgICBzbnByaW50Zih5ZWFyLCBzaXplb2YoeWVhciksICIlZCIsIGdmYy0+dGFnX3NwZWMueWVhcik7CisgICAgICAgIHAgPSBzZXRfdGV4dF9maWVsZChwLCBnZmMtPnRhZ19zcGVjLnllYXIgPyB5ZWFyIDogTlVMTCwgNCwgcGFkKTsKKyAgICAgICAgLyogbGltaXQgY29tbWVudCBmaWVsZCB0byAyOCBieXRlcyBpZiBhIHRyYWNrIGlzIHNwZWNpZmllZCAqLworICAgICAgICBwID0gc2V0X3RleHRfZmllbGQocCwgZ2ZjLT50YWdfc3BlYy5jb21tZW50LCBnZmMtPnRhZ19zcGVjLnRyYWNrX2lkM3YxID8gMjggOiAzMCwgcGFkKTsKKyAgICAgICAgaWYgKGdmYy0+dGFnX3NwZWMudHJhY2tfaWQzdjEpIHsKKyAgICAgICAgICAgIC8qIGNsZWFyIHRoZSBuZXh0IGJ5dGUgdG8gaW5kaWNhdGUgYSB2ZXJzaW9uIDEuMSB0YWcgKi8KKyAgICAgICAgICAgICpwKysgPSAwOworICAgICAgICAgICAgKnArKyA9IGdmYy0+dGFnX3NwZWMudHJhY2tfaWQzdjE7CisgICAgICAgIH0KKyAgICAgICAgKnArKyA9IGdmYy0+dGFnX3NwZWMuZ2VucmVfaWQzdjE7CisgICAgICAgIHJldHVybiB0YWdfc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAoraWQzdGFnX3dyaXRlX3YxKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHNpemVfdCAgaSwgbiwgbTsKKyAgICB1bnNpZ25lZCBjaGFyIHRhZ1sxMjhdOworCisgICAgbSA9IHNpemVvZih0YWcpOworICAgIG4gPSBsYW1lX2dldF9pZDN2MV90YWcoZ2ZwLCB0YWcsIG0pOworICAgIGlmIChuID4gbSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogd3JpdGUgdGFnIGRpcmVjdGx5IGludG8gYml0c3RyZWFtIGF0IGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGFkZF9kdW1teV9ieXRlKGdmcCwgdGFnW2ldLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpIG47ICAgICAvKiBvaywgdGFnIGhhcyBmaXhlZCBzaXplIG9mIDEyOCBieXRlcywgd2VsbCBiZWxvdyAyR0IgKi8KK30KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvaWQzdGFnLmggYi9saWJtcDNsYW1lL2lkM3RhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZGJiYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2lkM3RhZy5oCkBAIC0wLDAgKzEsOTEgQEAKKworI2lmbmRlZiBMQU1FX0lEM19ICisjZGVmaW5lIExBTUVfSUQzX0gKKworCisjZGVmaW5lIENIQU5HRURfRkxBRyAgICAoMVUgPDwgMCkKKyNkZWZpbmUgQUREX1YyX0ZMQUcgICAgICgxVSA8PCAxKQorI2RlZmluZSBWMV9PTkxZX0ZMQUcgICAgKDFVIDw8IDIpCisjZGVmaW5lIFYyX09OTFlfRkxBRyAgICAoMVUgPDwgMykKKyNkZWZpbmUgU1BBQ0VfVjFfRkxBRyAgICgxVSA8PCA0KQorI2RlZmluZSBQQURfVjJfRkxBRyAgICAgKDFVIDw8IDUpCisKK2VudW0geworICAgIE1JTUVUWVBFX05PTkUgPSAwLAorICAgIE1JTUVUWVBFX0pQRUcsCisgICAgTUlNRVRZUEVfUE5HLAorICAgIE1JTUVUWVBFX0dJRiwKK307CisKK3R5cGVkZWYgc3RydWN0IEZyYW1lRGF0YU5vZGUKK3sKKyAgICBzdHJ1Y3QgRnJhbWVEYXRhTm9kZSogbnh0OworICAgIGludCAgICAgZmlkOyAgICAgICAgICAgICAgICAvKiBGcmFtZSBJZGVudGlmaWVyICAgICAgICAgICAgICAgICAqLworICAgIGNoYXIgICAgbG5nWzRdOyAgICAgICAgICAgICAvKiAzLWNoYXJhY3RlciBsYW5ndWFnZSBkZXNjcmlwdG9yICAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIGNoYXIqICAgICAgICAgICBsOyAgLyogcHRyIHRvIExhdGluLTEgY2hhcnMgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiB1OyAgLyogcHRyIHRvIFVDUy0yIHRleHQgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqICBiOyAgLyogcHRyIHRvIHJhdyBieXRlcyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgfSAgICAgICBwdHI7CisgICAgICAgIHNpemVfdCAgZGltOworICAgICAgICBpbnQgICAgIGVuYzsgICAgICAgICAgICAvKiAwOkxhdGluLTEsIDE6VUNTLTIsIDI6UkFXICAgICAgICAqLworICAgIH0gZHNjLCB0eHQ7Cit9IEZyYW1lRGF0YU5vZGU7CisKKwordHlwZWRlZiBzdHJ1Y3QgaWQzdGFnX3NwZWMgeworICAgIC8qIHByaXZhdGUgZGF0YSBtZW1iZXJzICovCisgICAgdW5zaWduZWQgaW50IGZsYWdzOworICAgIGludCAgICAgeWVhcjsKKyAgICBjaGFyICAgKnRpdGxlOworICAgIGNoYXIgICAqYXJ0aXN0OworICAgIGNoYXIgICAqYWxidW07CisgICAgY2hhciAgICpjb21tZW50OworICAgIGludCAgICAgdHJhY2tfaWQzdjE7CisgICAgaW50ICAgICBnZW5yZV9pZDN2MTsKKyAgICB1bnNpZ25lZCBjaGFyICphbGJ1bWFydDsKKyAgICB1bnNpZ25lZCBpbnQgYWxidW1hcnRfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgcGFkZGluZ19zaXplOworICAgIGludCAgICAgYWxidW1hcnRfbWltZXR5cGU7CisgICAgY2hhciAgKip2YWx1ZXM7CisgICAgdW5zaWduZWQgaW50IG51bV92YWx1ZXM7CisgICAgRnJhbWVEYXRhTm9kZSogdjJfaGVhZCwgKnYyX3RhaWw7Cit9IGlkM3RhZ19zcGVjOworCisKKy8qIHdyaXRlIHRhZyBpbnRvIHN0cmVhbSBhdCBjdXJyZW50IHBvc2l0aW9uICovCitleHRlcm4gaW50IGlkM3RhZ193cml0ZV92MihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCk7CitleHRlcm4gaW50IGlkM3RhZ193cml0ZV92MShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCk7CisvKgorICogTk9URTogQSB2ZXJzaW9uIDIgdGFnIHdpbGwgTk9UIGJlIGFkZGVkIHVubGVzcyBvbmUgb2YgdGhlIHRleHQgZmllbGRzIHdvbid0CisgKiBmaXQgaW4gYSB2ZXJzaW9uIDEgdGFnIChlLmcuIHRoZSB0aXRsZSBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gMzAgY2hhcmFjdGVycyksCisgKiBvciB0aGUgImlkM3RhZ19hZGRfdjIiIG9yICJpZDN0YWdfdjJfb25seSIgZnVuY3Rpb25zIGFyZSB1c2VkLgorICovCisvKiBleHBlcmltZW50YWwgKi8KK2ludCBDREVDTCBpZDN0YWdfc2V0X3RleHRpbmZvX2xhdGluMSgKKyAgICAgICAgbGFtZV9nbG9iYWxfZmxhZ3MqIGdmcCwKKyAgICAgICAgY2hhciBjb25zdCogICAgICAgIGlkLAorICAgICAgICBjaGFyIGNvbnN0KiAgICAgICAgdGV4dCApOworCisvKiBleHBlcmltZW50YWwgKi8KK2ludCBDREVDTCBpZDN0YWdfc2V0X3RleHRpbmZvX3VjczIoCisgICAgICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKiAgICBnZnAsIAorICAgICAgICBjaGFyIGNvbnN0KiAgICAgICAgICAgaWQsCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGNvbnN0KiB0ZXh0ICk7CisKKy8qIGV4cGVyaW1lbnRhbCAqLworaW50IENERUNMIGlkM3RhZ19zZXRfY29tbWVudF9sYXRpbjEoCisgICAgICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKiBnZnAsCisgICAgICAgIGNoYXIgY29uc3QqICAgICAgICBsYW5nLAorICAgICAgICBjaGFyIGNvbnN0KiAgICAgICAgZGVzYywKKyAgICAgICAgY2hhciBjb25zdCogICAgICAgIHRleHQgKTsKKworLyogZXhwZXJpbWVudGFsICovCitpbnQgQ0RFQ0wgaWQzdGFnX3NldF9jb21tZW50X3VjczIoCisgICAgICAgIGxhbWVfZ2xvYmFsX2ZsYWdzKiAgICBnZnAsIAorICAgICAgICBjaGFyIGNvbnN0KiAgICAgICAgICAgbGFuZywKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgY29uc3QqIGRlc2MsCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGNvbnN0KiB0ZXh0ICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9sM3NpZGUuaCBiL2xpYm1wM2xhbWUvbDNzaWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhZGJjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbDNzaWRlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqCUxheWVyIDMgc2lkZSBpbmNsdWRlIGZpbGUKKyAqCisgKglDb3B5cmlnaHQgKGMpIDE5OTkgTWFyayBUYXlsb3IKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBMQU1FX0wzU0lERV9ICisjZGVmaW5lIExBTUVfTDNTSURFX0gKKworLyogbWF4IHNjYWxlZmFjdG9yIGJhbmQsIG1heChTQk1BWF9sLCBTQk1BWF9zKjMsIChTQk1BWF9zLTMpKjMrOCkgKi8KKyNkZWZpbmUgU0ZCTUFYIChTQk1BWF9zKjMpCisKKy8qIExheWVyIElJSSBzaWRlIGluZm9ybWF0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgbFsxICsgU0JNQVhfbF07CisgICAgaW50ICAgICBzWzEgKyBTQk1BWF9zXTsKKyAgICBpbnQgICAgIHBzZmIyMVsxICsgUFNGQjIxXTsKKyAgICBpbnQgICAgIHBzZmIxMlsxICsgUFNGQjEyXTsKK30gc2NhbGVmYWNfc3RydWN0OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBGTE9BVCAgIGxbU0JNQVhfbF07CisgICAgRkxPQVQgICBzW1NCTUFYX3NdWzNdOworfSBJSUlfcHN5X3htaW47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBJSUlfcHN5X3htaW4gdGhtOworICAgIElJSV9wc3lfeG1pbiBlbjsKK30gSUlJX3BzeV9yYXRpbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEZMT0FUICAgeHJbNTc2XTsKKyAgICBpbnQgICAgIGwzX2VuY1s1NzZdOworICAgIGludCAgICAgc2NhbGVmYWNbU0ZCTUFYXTsKKyAgICBGTE9BVCAgIHhycG93X21heDsKKworICAgIGludCAgICAgcGFydDJfM19sZW5ndGg7CisgICAgaW50ICAgICBiaWdfdmFsdWVzOworICAgIGludCAgICAgY291bnQxOworICAgIGludCAgICAgZ2xvYmFsX2dhaW47CisgICAgaW50ICAgICBzY2FsZWZhY19jb21wcmVzczsKKyAgICBpbnQgICAgIGJsb2NrX3R5cGU7CisgICAgaW50ICAgICBtaXhlZF9ibG9ja19mbGFnOworICAgIGludCAgICAgdGFibGVfc2VsZWN0WzNdOworICAgIGludCAgICAgc3ViYmxvY2tfZ2FpblszICsgMV07CisgICAgaW50ICAgICByZWdpb24wX2NvdW50OworICAgIGludCAgICAgcmVnaW9uMV9jb3VudDsKKyAgICBpbnQgICAgIHByZWZsYWc7CisgICAgaW50ICAgICBzY2FsZWZhY19zY2FsZTsKKyAgICBpbnQgICAgIGNvdW50MXRhYmxlX3NlbGVjdDsKKworICAgIGludCAgICAgcGFydDJfbGVuZ3RoOworICAgIGludCAgICAgc2ZiX2xtYXg7CisgICAgaW50ICAgICBzZmJfc21pbjsKKyAgICBpbnQgICAgIHBzeV9sbWF4OworICAgIGludCAgICAgc2ZibWF4OworICAgIGludCAgICAgcHN5bWF4OworICAgIGludCAgICAgc2ZiZGl2aWRlOworICAgIGludCAgICAgd2lkdGhbU0ZCTUFYXTsKKyAgICBpbnQgICAgIHdpbmRvd1tTRkJNQVhdOworICAgIGludCAgICAgY291bnQxYml0czsKKyAgICAvKiBhZGRlZCBmb3IgTFNGICovCisgICAgY29uc3QgaW50ICpzZmJfcGFydGl0aW9uX3RhYmxlOworICAgIGludCAgICAgc2xlbls0XTsKKworICAgIGludCAgICAgbWF4X25vbnplcm9fY29lZmY7Cit9IGdyX2luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBncl9pbmZvIHR0WzJdWzJdOworICAgIGludCAgICAgbWFpbl9kYXRhX2JlZ2luOworICAgIGludCAgICAgcHJpdmF0ZV9iaXRzOworICAgIGludCAgICAgcmVzdkRyYWluX3ByZTsKKyAgICBpbnQgICAgIHJlc3ZEcmFpbl9wb3N0OworICAgIGludCAgICAgc2Nmc2lbMl1bNF07Cit9IElJSV9zaWRlX2luZm9fdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2xhbWUtYW5hbHlzaXMuaCBiL2xpYm1wM2xhbWUvbGFtZS1hbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTNjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2xhbWUtYW5hbHlzaXMuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogICAgICBHVEsgcGxvdHRpbmcgcm91dGluZXMgc291cmNlIGZpbGUKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5OSBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfR1RLQU5BTF9ICisjZGVmaW5lIExBTUVfR1RLQU5BTF9ICisKKworI2RlZmluZSBSRUFEX0FIRUFEIDQwICAgLyogbnVtYmVyIG9mIGZyYW1lcyB0byByZWFkIGFoZWFkICovCisjZGVmaW5lIE1BWE1QR0xBRyBSRUFEX0FIRUFEIC8qIGlmIHRoZSBtcGcxMjMgbGFnIGJlY29tZXMgYmlnZ2VyIHRoYW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHN0b3AgKi8KKyNkZWZpbmUgTlVNQkFDSyA2ICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgd2UgY2FuIGJhY2sgdXAgKi8KKyNkZWZpbmUgTlVNUElORk8gKE5VTUJBQ0srUkVBRF9BSEVBRCsxKQorCisKKworc3RydWN0IHBsb3R0aW5nX2RhdGEgeworICAgIGludCAgICAgZnJhbWVOdW07ICAgICAgICAvKiBjdXJyZW50IGZyYW1lIG51bWJlciAqLworICAgIGludCAgICAgZnJhbWVOdW0xMjM7CisgICAgaW50ICAgICBudW1fc2FtcGxlczsgICAgIC8qIG51bWJlciBvZiBwY20gc2FtcGxlcyByZWFkIGZvciB0aGlzIGZyYW1lICovCisgICAgZG91YmxlICBmcmFtZXRpbWU7ICAgICAgIC8qIHN0YXJ0aW5nIHRpbWUgb2YgZnJhbWUsIGluIHNlY29uZHMgKi8KKyAgICBkb3VibGUgIHBjbWRhdGFbMl1bMTYwMF07CisgICAgZG91YmxlICBwY21kYXRhMlsyXVsxMTUyICsgMTE1MiAtIERFQ0RFTEFZXTsKKyAgICBkb3VibGUgIHhyWzJdWzJdWzU3Nl07CisgICAgZG91YmxlICBtcGcxMjN4clsyXVsyXVs1NzZdOworICAgIGRvdWJsZSAgbXNfcmF0aW9bMl07CisgICAgZG91YmxlICBtc19lbmVyX3JhdGlvWzJdOworCisgICAgLyogTCxSLCBNIGFuZCBTIHZhbHVlcyAqLworICAgIGRvdWJsZSAgZW5lcmd5X3NhdmVbNF1bQkxLU0laRV07IC8qIHBzeW1vZGVsIGlzIG9uZSBhaGVhZCAqLworICAgIGRvdWJsZSAgZW5lcmd5WzJdWzRdW0JMS1NJWkVdOworICAgIGRvdWJsZSAgcGVbMl1bNF07CisgICAgZG91YmxlICB0aHJbMl1bNF1bU0JNQVhfbF07CisgICAgZG91YmxlICBlblsyXVs0XVtTQk1BWF9sXTsKKyAgICBkb3VibGUgIHRocl9zWzJdWzRdWzMgKiBTQk1BWF9zXTsKKyAgICBkb3VibGUgIGVuX3NbMl1bNF1bMyAqIFNCTUFYX3NdOworICAgIGRvdWJsZSAgZXJzX3NhdmVbNF07ICAgICAvKiBwc3ltb2RlbCBpcyBvbmUgYWhlYWQgKi8KKyAgICBkb3VibGUgIGVyc1syXVs0XTsKKworICAgIGRvdWJsZSAgc2ZiWzJdWzJdW1NCTUFYX2xdOworICAgIGRvdWJsZSAgc2ZiX3NbMl1bMl1bMyAqIFNCTUFYX3NdOworICAgIGRvdWJsZSAgTEFNRXNmYlsyXVsyXVtTQk1BWF9sXTsKKyAgICBkb3VibGUgIExBTUVzZmJfc1syXVsyXVszICogU0JNQVhfc107CisKKyAgICBpbnQgICAgIExBTUVxc3NbMl1bMl07CisgICAgaW50ICAgICBxc3NbMl1bMl07CisgICAgaW50ICAgICBiaWdfdmFsdWVzWzJdWzJdOworICAgIGludCAgICAgc3ViX2dhaW5bMl1bMl1bM107CisKKyAgICBkb3VibGUgIHhmc2ZbMl1bMl1bU0JNQVhfbF07CisgICAgZG91YmxlICB4ZnNmX3NbMl1bMl1bMyAqIFNCTUFYX3NdOworCisgICAgaW50ICAgICBvdmVyWzJdWzJdOworICAgIGRvdWJsZSAgdG90X25vaXNlWzJdWzJdOworICAgIGRvdWJsZSAgbWF4X25vaXNlWzJdWzJdOworICAgIGRvdWJsZSAgb3Zlcl9ub2lzZVsyXVsyXTsKKyAgICBpbnQgICAgIG92ZXJfU1NEWzJdWzJdOworICAgIGludCAgICAgYmxvY2t0eXBlWzJdWzJdOworICAgIGludCAgICAgc2NhbGVmYWNfc2NhbGVbMl1bMl07CisgICAgaW50ICAgICBwcmVmbGFnWzJdWzJdOworICAgIGludCAgICAgbXBnMTIzYmxvY2t0eXBlWzJdWzJdOworICAgIGludCAgICAgbWl4ZWRbMl1bMl07CisgICAgaW50ICAgICBtYWluYml0c1syXVsyXTsKKyAgICBpbnQgICAgIHNmYml0c1syXVsyXTsKKyAgICBpbnQgICAgIExBTUVtYWluYml0c1syXVsyXTsKKyAgICBpbnQgICAgIExBTUVzZmJpdHNbMl1bMl07CisgICAgaW50ICAgICBmcmFtZXNpemUsIHN0ZXJlbywganMsIG1zX3N0ZXJlbywgaV9zdGVyZW8sIGVtcGgsIGJpdHJhdGUsIHNhbXBmcmVxLCBtYWluZGF0YTsKKyAgICBpbnQgICAgIGNyYywgcGFkZGluZzsKKyAgICBpbnQgICAgIHNjZnNpWzJdLCBtZWFuX2JpdHMsIHJlc3ZzaXplOworICAgIGludCAgICAgdG90Yml0czsKK307CisjaWZuZGVmIHBsb3R0aW5nX2RhdGFfZGVmaW5lZAorI2RlZmluZSBwbG90dGluZ19kYXRhX2RlZmluZWQKK3R5cGVkZWYgc3RydWN0IHBsb3R0aW5nX2RhdGEgcGxvdHRpbmdfZGF0YTsKKyNlbmRpZgorCitleHRlcm4gcGxvdHRpbmdfZGF0YSAqcGluZm87CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9sYW1lLmMgYi9saWJtcDNsYW1lL2xhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJhMzFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9sYW1lLmMKQEAgLTAsMCArMSwyNDU5IEBACisvKiAtKi0gbW9kZTogQzsgbW9kZTogZm9sZCAtKi0gKi8KKy8qCisgKiAgICAgIExBTUUgTVAzIGVuY29kaW5nIGVuZ2luZQorICoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgTWFyayBUYXlsb3IKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVGFrZWhpcm8gVG9taW5hZ2EKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgUm9iZXJ0IEhlZ2VtYW5uCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IEdhYnJpZWwgQm91dmlnbmUKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgQWxleGFuZGVyIExlaWRpbmdlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IGxhbWUuYyx2IDEuMzIzLjIuOCAyMDEwLzAyLzIwIDIxOjA4OjU1IHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJsYW1lX2dsb2JhbF9mbGFncy5oIgorI2luY2x1ZGUgImdhaW5fYW5hbHlzaXMuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJxdWFudGl6ZV9wdnQuaCIKKyNpbmNsdWRlICJzZXRfZ2V0LmgiCisjaW5jbHVkZSAicXVhbnRpemUuaCIKKyNpbmNsdWRlICJwc3ltb2RlbC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJWYnJUYWcuaCIKKworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgIWRlZmluZWQoX19hbHBoYV9fKQorI2luY2x1ZGUgPGZsb2F0aW5ncG9pbnQuaD4KKyNlbmRpZgorI2lmZGVmIF9fcmlzY29zX18KKyNpbmNsdWRlICJhc21zdHVmZi5oIgorI2VuZGlmCisKKyNpZmRlZiBfX3N1bl9fCisvKiB3b3Jhcm91bmQgZm9yIFN1bk9TIDQueCwgaXQgaGFzIFNFRUtfKiBkZWZpbmVkIGhlcmUgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisKKyNkZWZpbmUgTEFNRV9ERUZBVUxUX1FVQUxJVFkgMworCitzdGF0aWMgIEZMT0FUCitmaWx0ZXJfY29lZihGTE9BVCB4KQoreworICAgIGlmICh4ID4gMS4wKQorICAgICAgICByZXR1cm4gMC4wOworICAgIGlmICh4IDw9IDAuMCkKKyAgICAgICAgcmV0dXJuIDEuMDsKKworICAgIHJldHVybiBjb3MoUEkgLyAyICogeCk7Cit9CisKK3N0YXRpYyB2b2lkCitsYW1lX2luaXRfcGFyYW1zX3BwZmx0KGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGNvbXB1dGUgaW5mbyBuZWVkZWQgZm9yIHBvbHlwaGFzZSBmaWx0ZXIgKGZpbHRlciB0eXBlPT0wLCBkZWZhdWx0KSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpbnQgICAgIGJhbmQsIG1heGJhbmQsIG1pbmJhbmQ7CisgICAgRkxPQVQgICBmcmVxOworICAgIGludCAgICAgbG93cGFzc19iYW5kID0gMzI7CisgICAgaW50ICAgICBoaWdocGFzc19iYW5kID0gLTE7CisKKyAgICBpZiAoZ2ZjLT5sb3dwYXNzMSA+IDApIHsKKyAgICAgICAgbWluYmFuZCA9IDk5OTsKKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8PSAzMTsgYmFuZCsrKSB7CisgICAgICAgICAgICBmcmVxID0gYmFuZCAvIDMxLjA7CisgICAgICAgICAgICAvKiB0aGlzIGJhbmQgYW5kIGFib3ZlIHdpbGwgYmUgemVyb2VkOiAqLworICAgICAgICAgICAgaWYgKGZyZXEgPj0gZ2ZjLT5sb3dwYXNzMikgeworICAgICAgICAgICAgICAgIGxvd3Bhc3NfYmFuZCA9IE1pbihsb3dwYXNzX2JhbmQsIGJhbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdmYy0+bG93cGFzczEgPCBmcmVxICYmIGZyZXEgPCBnZmMtPmxvd3Bhc3MyKSB7CisgICAgICAgICAgICAgICAgbWluYmFuZCA9IE1pbihtaW5iYW5kLCBiYW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbXB1dGUgdGhlICphY3R1YWwqIHRyYW5zaXRpb24gYmFuZCBpbXBsZW1lbnRlZCBieQorICAgICAgICAgKiB0aGUgcG9seXBoYXNlIGZpbHRlciAqLworICAgICAgICBpZiAobWluYmFuZCA9PSA5OTkpIHsKKyAgICAgICAgICAgIGdmYy0+bG93cGFzczEgPSAobG93cGFzc19iYW5kIC0gLjc1KSAvIDMxLjA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBnZmMtPmxvd3Bhc3MxID0gKG1pbmJhbmQgLSAuNzUpIC8gMzEuMDsKKyAgICAgICAgfQorICAgICAgICBnZmMtPmxvd3Bhc3MyID0gbG93cGFzc19iYW5kIC8gMzEuMDsKKyAgICB9CisKKyAgICAvKiBtYWtlIHN1cmUgaGlnaHBhc3MgZmlsdGVyIGlzIHdpdGhpbiA5MCUgb2Ygd2hhdCB0aGUgZWZmZWN0aXZlCisgICAgICogaGlnaHBhc3MgZnJlcXVlbmN5IHdpbGwgYmUgKi8KKyAgICBpZiAoZ2ZjLT5oaWdocGFzczIgPiAwKSB7CisgICAgICAgIGlmIChnZmMtPmhpZ2hwYXNzMiA8IC45ICogKC43NSAvIDMxLjApKSB7CisgICAgICAgICAgICBnZmMtPmhpZ2hwYXNzMSA9IDA7CisgICAgICAgICAgICBnZmMtPmhpZ2hwYXNzMiA9IDA7CisgICAgICAgICAgICBNU0dGKGdmYywgIldhcm5pbmc6IGhpZ2hwYXNzIGZpbHRlciBkaXNhYmxlZC4gICIgImhpZ2hwYXNzIGZyZXF1ZW5jeSB0b28gc21hbGxcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdmYy0+aGlnaHBhc3MyID4gMCkgeworICAgICAgICBtYXhiYW5kID0gLTE7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPD0gMzE7IGJhbmQrKykgeworICAgICAgICAgICAgZnJlcSA9IGJhbmQgLyAzMS4wOworICAgICAgICAgICAgLyogdGhpcyBiYW5kIGFuZCBiZWxvdyB3aWxsIGJlIHplcmVvZCAqLworICAgICAgICAgICAgaWYgKGZyZXEgPD0gZ2ZjLT5oaWdocGFzczEpIHsKKyAgICAgICAgICAgICAgICBoaWdocGFzc19iYW5kID0gTWF4KGhpZ2hwYXNzX2JhbmQsIGJhbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdmYy0+aGlnaHBhc3MxIDwgZnJlcSAmJiBmcmVxIDwgZ2ZjLT5oaWdocGFzczIpIHsKKyAgICAgICAgICAgICAgICBtYXhiYW5kID0gTWF4KG1heGJhbmQsIGJhbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGNvbXB1dGUgdGhlICphY3R1YWwqIHRyYW5zaXRpb24gYmFuZCBpbXBsZW1lbnRlZCBieQorICAgICAgICAgKiB0aGUgcG9seXBoYXNlIGZpbHRlciAqLworICAgICAgICBnZmMtPmhpZ2hwYXNzMSA9IGhpZ2hwYXNzX2JhbmQgLyAzMS4wOworICAgICAgICBpZiAobWF4YmFuZCA9PSAtMSkgeworICAgICAgICAgICAgZ2ZjLT5oaWdocGFzczIgPSAoaGlnaHBhc3NfYmFuZCArIC43NSkgLyAzMS4wOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ2ZjLT5oaWdocGFzczIgPSAobWF4YmFuZCArIC43NSkgLyAzMS4wOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDMyOyBiYW5kKyspIHsKKyAgICAgICAgZG91YmxlIGZjMSwgZmMyOworICAgICAgICBmcmVxID0gYmFuZCAvIDMxLjA7CisgICAgICAgIGlmIChnZmMtPmhpZ2hwYXNzMiA+IGdmYy0+aGlnaHBhc3MxKSB7CisgICAgICAgICAgICBmYzEgPSBmaWx0ZXJfY29lZigoZ2ZjLT5oaWdocGFzczIgLSBmcmVxKSAvIChnZmMtPmhpZ2hwYXNzMiAtIGdmYy0+aGlnaHBhc3MxICsgMWUtMjApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZjMSA9IDEuMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2ZjLT5sb3dwYXNzMiA+IGdmYy0+bG93cGFzczEpIHsKKyAgICAgICAgICAgIGZjMiA9IGZpbHRlcl9jb2VmKChmcmVxIC0gZ2ZjLT5sb3dwYXNzMSkgIC8gKGdmYy0+bG93cGFzczIgLSBnZmMtPmxvd3Bhc3MxICsgMWUtMjApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZjMiA9IDEuMDsKKyAgICAgICAgfQorICAgICAgICBnZmMtPmFtcF9maWx0ZXJbYmFuZF0gPSBmYzEgKiBmYzI7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitvcHRpbXVtX2JhbmR3aWR0aChkb3VibGUgKmNvbnN0IGxvd2VybGltaXQsIGRvdWJsZSAqY29uc3QgdXBwZXJsaW1pdCwgY29uc3QgdW5zaWduZWQgYml0cmF0ZSkKK3sKKy8qCisgKiAgSW5wdXQ6CisgKiAgICAgIGJpdHJhdGUgICAgIHRvdGFsIGJpdHJhdGUgaW4ga2JwcworICoKKyAqICAgT3V0cHV0OgorICogICAgICBsb3dlcmxpbWl0OiBiZXN0IGxvd3Bhc3MgZnJlcXVlbmN5IGxpbWl0IGZvciBpbnB1dCBmaWx0ZXIgaW4gSHoKKyAqICAgICAgdXBwZXJsaW1pdDogYmVzdCBoaWdocGFzcyBmcmVxdWVuY3kgbGltaXQgZm9yIGlucHV0IGZpbHRlciBpbiBIegorICovCisgICAgaW50ICAgICB0YWJsZV9pbmRleDsKKworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50ICAgICBiaXRyYXRlOyAgICAgLyogb25seSBpbmRpY2F0aXZlIHZhbHVlICovCisgICAgICAgIGludCAgICAgbG93cGFzczsKKyAgICB9IGJhbmRfcGFzc190OworCisgICAgY29uc3QgYmFuZF9wYXNzX3QgZnJlcV9tYXBbXSA9IHsKKyAgICAgICAgezgsIDIwMDB9LAorICAgICAgICB7MTYsIDM3MDB9LAorICAgICAgICB7MjQsIDM5MDB9LAorICAgICAgICB7MzIsIDU1MDB9LAorICAgICAgICB7NDAsIDcwMDB9LAorICAgICAgICB7NDgsIDc1MDB9LAorICAgICAgICB7NTYsIDEwMDAwfSwKKyAgICAgICAgezY0LCAxMTAwMH0sCisgICAgICAgIHs4MCwgMTM1MDB9LAorICAgICAgICB7OTYsIDE1MTAwfSwKKyAgICAgICAgezExMiwgMTU2MDB9LAorICAgICAgICB7MTI4LCAxNzAwMH0sCisgICAgICAgIHsxNjAsIDE3NTAwfSwKKyAgICAgICAgezE5MiwgMTg2MDB9LAorICAgICAgICB7MjI0LCAxOTQwMH0sCisgICAgICAgIHsyNTYsIDE5NzAwfSwKKyAgICAgICAgezMyMCwgMjA1MDB9CisgICAgfTsKKworCisgICAgdGFibGVfaW5kZXggPSBuZWFyZXN0Qml0cmF0ZUZ1bGxJbmRleChiaXRyYXRlKTsKKworICAgICpsb3dlcmxpbWl0ID0gZnJlcV9tYXBbdGFibGVfaW5kZXhdLmxvd3Bhc3M7CisKKworLyoKKyAqICBOb3cgd2UgdHJ5IHRvIGNob29zZSBhIGdvb2QgaGlnaCBwYXNzIGZpbHRlcmluZyBmcmVxdWVuY3kuCisgKiAgVGhpcyB2YWx1ZSBpcyBjdXJyZW50bHkgbm90IHVzZWQuCisgKiAgICBGb3IgZnUgPCAxNiBrSHo6ICBzcXJ0KGZ1KmZsKSA9IDU2MCBIegorICogICAgRm9yIGZ1ID0gMTgga0h6OiAgbm8gaGlnaCBwYXNzIGZpbHRlcmluZworICogIFRoaXMgZ2l2ZXM6CisgKgorICogICAyIGtIeiA9PiAxNjAgSHoKKyAqICAgMyBrSHogPT4gMTA3IEh6CisgKiAgIDQga0h6ID0+ICA4MCBIegorICogICA4IGtIeiA9PiAgNDAgSHoKKyAqICAxNiBrSHogPT4gIDIwIEh6CisgKiAgMTcga0h6ID0+ICAxMCBIegorICogIDE4IGtIeiA9PiAgIDAgSHoKKyAqCisgKiAgVGhlc2UgYXJlIGFkIGhvYyB2YWx1ZXMgYW5kIHRoZXNlIGNhbiBiZSBvcHRpbWl6ZWQgaWYgYSBoaWdoIHBhc3MgaXMgYXZhaWxhYmxlLgorICovCisvKiAgICBpZiAoZl9sb3cgPD0gMTYwMDApCisgICAgICAgIGZfaGlnaCA9IDE2MDAwLiAqIDIwLiAvIGZfbG93OworICAgIGVsc2UgaWYgKGZfbG93IDw9IDE4MDAwKQorICAgICAgICBmX2hpZ2ggPSAxODAuIC0gMC4wMSAqIGZfbG93OworICAgIGVsc2UKKyAgICAgICAgZl9oaWdoID0gMC47Ki8KKworICAgIC8qCisgICAgICogIFdoZW4gd2Ugc29tZXRpbWVzIGhhdmUgYSBnb29kIGhpZ2hwYXNzIGZpbHRlciwgd2UgY2FuIGFkZCB0aGUgaGlnaHBhc3MKKyAgICAgKiAgZnJlcXVlbmN5IHRvIHRoZSBsb3dwYXNzIGZyZXF1ZW5jeQorICAgICAqLworCisgICAgLyppZiAodXBwZXJsaW1pdCAhPSBOVUxMKQorICAgICAqdXBwZXJsaW1pdCA9IGZfaGlnaDsqLworICAgICh2b2lkKSB1cHBlcmxpbWl0OworfQorCisKK3N0YXRpYyBpbnQKK29wdGltdW1fc2FtcGxlZnJlcShpbnQgbG93cGFzc2ZyZXEsIGludCBpbnB1dF9zYW1wbGVmcmVxKQoreworLyoKKyAqIFJ1bGVzOgorICogIC0gaWYgcG9zc2libGUsIHNmYjIxIHNob3VsZCBOT1QgYmUgdXNlZAorICoKKyAqLworICAgIGludCAgICAgc3VnZ2VzdGVkX3NhbXBsZWZyZXEgPSA0NDEwMDsKKworICAgIGlmIChpbnB1dF9zYW1wbGVmcmVxID49IDQ4MDAwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDQ4MDAwOworICAgIGVsc2UgaWYgKGlucHV0X3NhbXBsZWZyZXEgPj0gNDQxMDApCisgICAgICAgIHN1Z2dlc3RlZF9zYW1wbGVmcmVxID0gNDQxMDA7CisgICAgZWxzZSBpZiAoaW5wdXRfc2FtcGxlZnJlcSA+PSAzMjAwMCkKKyAgICAgICAgc3VnZ2VzdGVkX3NhbXBsZWZyZXEgPSAzMjAwMDsKKyAgICBlbHNlIGlmIChpbnB1dF9zYW1wbGVmcmVxID49IDI0MDAwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDI0MDAwOworICAgIGVsc2UgaWYgKGlucHV0X3NhbXBsZWZyZXEgPj0gMjIwNTApCisgICAgICAgIHN1Z2dlc3RlZF9zYW1wbGVmcmVxID0gMjIwNTA7CisgICAgZWxzZSBpZiAoaW5wdXRfc2FtcGxlZnJlcSA+PSAxNjAwMCkKKyAgICAgICAgc3VnZ2VzdGVkX3NhbXBsZWZyZXEgPSAxNjAwMDsKKyAgICBlbHNlIGlmIChpbnB1dF9zYW1wbGVmcmVxID49IDEyMDAwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDEyMDAwOworICAgIGVsc2UgaWYgKGlucHV0X3NhbXBsZWZyZXEgPj0gMTEwMjUpCisgICAgICAgIHN1Z2dlc3RlZF9zYW1wbGVmcmVxID0gMTEwMjU7CisgICAgZWxzZSBpZiAoaW5wdXRfc2FtcGxlZnJlcSA+PSA4MDAwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDgwMDA7CisKKyAgICBpZiAobG93cGFzc2ZyZXEgPT0gLTEpCisgICAgICAgIHJldHVybiBzdWdnZXN0ZWRfc2FtcGxlZnJlcTsKKworICAgIGlmIChsb3dwYXNzZnJlcSA8PSAxNTk2MCkKKyAgICAgICAgc3VnZ2VzdGVkX3NhbXBsZWZyZXEgPSA0NDEwMDsKKyAgICBpZiAobG93cGFzc2ZyZXEgPD0gMTUyNTApCisgICAgICAgIHN1Z2dlc3RlZF9zYW1wbGVmcmVxID0gMzIwMDA7CisgICAgaWYgKGxvd3Bhc3NmcmVxIDw9IDExMjIwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDI0MDAwOworICAgIGlmIChsb3dwYXNzZnJlcSA8PSA5OTcwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDIyMDUwOworICAgIGlmIChsb3dwYXNzZnJlcSA8PSA3MjMwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDE2MDAwOworICAgIGlmIChsb3dwYXNzZnJlcSA8PSA1NDIwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDEyMDAwOworICAgIGlmIChsb3dwYXNzZnJlcSA8PSA0NTEwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDExMDI1OworICAgIGlmIChsb3dwYXNzZnJlcSA8PSAzOTcwKQorICAgICAgICBzdWdnZXN0ZWRfc2FtcGxlZnJlcSA9IDgwMDA7CisKKyAgICBpZiAoaW5wdXRfc2FtcGxlZnJlcSA8IHN1Z2dlc3RlZF9zYW1wbGVmcmVxKSB7CisgICAgICAgIC8qIGNob29zZSBhIHZhbGlkIE1QRUcgc2FtcGxlIGZyZXF1ZW5jeSBhYm92ZSB0aGUgaW5wdXQgc2FtcGxlIGZyZXF1ZW5jeQorICAgICAgICAgICB0byBhdm9pZCBTRkIyMS8xMiBiaXRyYXRlIGJsb2F0CisgICAgICAgICAgIHJoIDA2MTExNQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGlucHV0X3NhbXBsZWZyZXEgPiA0NDEwMCkgeworICAgICAgICAgICAgcmV0dXJuIDQ4MDAwOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dF9zYW1wbGVmcmVxID4gMzIwMDApIHsKKyAgICAgICAgICAgIHJldHVybiA0NDEwMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRfc2FtcGxlZnJlcSA+IDI0MDAwKSB7CisgICAgICAgICAgICByZXR1cm4gMzIwMDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0X3NhbXBsZWZyZXEgPiAyMjA1MCkgeworICAgICAgICAgICAgcmV0dXJuIDI0MDAwOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dF9zYW1wbGVmcmVxID4gMTYwMDApIHsKKyAgICAgICAgICAgIHJldHVybiAyMjA1MDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRfc2FtcGxlZnJlcSA+IDEyMDAwKSB7CisgICAgICAgICAgICByZXR1cm4gMTYwMDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0X3NhbXBsZWZyZXEgPiAxMTAyNSkgeworICAgICAgICAgICAgcmV0dXJuIDEyMDAwOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dF9zYW1wbGVmcmVxID4gODAwMCkgeworICAgICAgICAgICAgcmV0dXJuIDExMDI1OworICAgICAgICB9CisgICAgICAgIHJldHVybiA4MDAwOworICAgIH0KKyAgICByZXR1cm4gc3VnZ2VzdGVkX3NhbXBsZWZyZXE7Cit9CisKKworCisKKworLyogc2V0IGludGVybmFsIGZlYXR1cmUgZmxhZ3MuICBVU0VSIHNob3VsZCBub3QgYWNjZXNzIHRoZXNlIHNpbmNlCisgKiBzb21lIGNvbWJpbmF0aW9ucyB3aWxsIHByb2R1Y2Ugc3RyYW5nZSByZXN1bHRzICovCitzdGF0aWMgdm9pZAorbGFtZV9pbml0X3F2YWwobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIHN3aXRjaCAoZ2ZwLT5xdWFsaXR5KSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDk6ICAgICAgICAgICAgLyogbm8gcHN5bW9kZWwsIG5vIG5vaXNlIHNoYXBpbmcgKi8KKyAgICAgICAgZ2ZjLT5wc3ltb2RlbCA9IDA7CisgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZyA9IDA7CisgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZ19hbXAgPSAwOworICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmdfc3RvcCA9IDA7CisgICAgICAgIGdmYy0+dXNlX2Jlc3RfaHVmZm1hbiA9IDA7CisgICAgICAgIGdmYy0+ZnVsbF9vdXRlcl9sb29wID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDg6CisgICAgICAgIGdmcC0+cXVhbGl0eSA9IDc7CisgICAgICAgIC8qbGludCAtLWZhbGx0aHJvdWdoICovCisgICAgY2FzZSA3OiAgICAgICAgICAgIC8qIHVzZSBwc3ltb2RlbCAoZm9yIHNob3J0IGJsb2NrIGFuZCBtL3Mgc3dpdGNoaW5nKSwgYnV0IG5vIG5vaXNlIHNoYXBwaW5nICovCisgICAgICAgIGdmYy0+cHN5bW9kZWwgPSAxOworICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmcgPSAwOworICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmdfYW1wID0gMDsKKyAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nX3N0b3AgPSAwOworICAgICAgICBnZmMtPnVzZV9iZXN0X2h1ZmZtYW4gPSAwOworICAgICAgICBnZmMtPmZ1bGxfb3V0ZXJfbG9vcCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA2OgorICAgICAgICBnZmMtPnBzeW1vZGVsID0gMTsKKyAgICAgICAgaWYgKGdmYy0+bm9pc2Vfc2hhcGluZyA9PSAwKQorICAgICAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nID0gMTsKKyAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nX2FtcCA9IDA7CisgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZ19zdG9wID0gMDsKKyAgICAgICAgaWYgKGdmYy0+c3ViYmxvY2tfZ2FpbiA9PSAtMSkKKyAgICAgICAgICAgIGdmYy0+c3ViYmxvY2tfZ2FpbiA9IDE7CisgICAgICAgIGdmYy0+dXNlX2Jlc3RfaHVmZm1hbiA9IDA7CisgICAgICAgIGdmYy0+ZnVsbF9vdXRlcl9sb29wID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDU6CisgICAgICAgIGdmYy0+cHN5bW9kZWwgPSAxOworICAgICAgICBpZiAoZ2ZjLT5ub2lzZV9zaGFwaW5nID09IDApCisgICAgICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmcgPSAxOworICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmdfYW1wID0gMDsKKyAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nX3N0b3AgPSAwOworICAgICAgICBpZiAoZ2ZjLT5zdWJibG9ja19nYWluID09IC0xKQorICAgICAgICAgICAgZ2ZjLT5zdWJibG9ja19nYWluID0gMTsKKyAgICAgICAgZ2ZjLT51c2VfYmVzdF9odWZmbWFuID0gMDsKKyAgICAgICAgZ2ZjLT5mdWxsX291dGVyX2xvb3AgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICAgICAgZ2ZjLT5wc3ltb2RlbCA9IDE7CisgICAgICAgIGlmIChnZmMtPm5vaXNlX3NoYXBpbmcgPT0gMCkKKyAgICAgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZyA9IDE7CisgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZ19hbXAgPSAwOworICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmdfc3RvcCA9IDA7CisgICAgICAgIGlmIChnZmMtPnN1YmJsb2NrX2dhaW4gPT0gLTEpCisgICAgICAgICAgICBnZmMtPnN1YmJsb2NrX2dhaW4gPSAxOworICAgICAgICBnZmMtPnVzZV9iZXN0X2h1ZmZtYW4gPSAxOworICAgICAgICBnZmMtPmZ1bGxfb3V0ZXJfbG9vcCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgICBnZmMtPnBzeW1vZGVsID0gMTsKKyAgICAgICAgaWYgKGdmYy0+bm9pc2Vfc2hhcGluZyA9PSAwKQorICAgICAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nID0gMTsKKyAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nX2FtcCA9IDE7CisgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZ19zdG9wID0gMTsKKyAgICAgICAgaWYgKGdmYy0+c3ViYmxvY2tfZ2FpbiA9PSAtMSkKKyAgICAgICAgICAgIGdmYy0+c3ViYmxvY2tfZ2FpbiA9IDE7CisgICAgICAgIGdmYy0+dXNlX2Jlc3RfaHVmZm1hbiA9IDE7CisgICAgICAgIGdmYy0+ZnVsbF9vdXRlcl9sb29wID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICAgIGdmYy0+cHN5bW9kZWwgPSAxOworICAgICAgICBpZiAoZ2ZjLT5ub2lzZV9zaGFwaW5nID09IDApCisgICAgICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmcgPSAxOworICAgICAgICBpZiAoZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgPT0gMCkKKyAgICAgICAgICAgIGdmYy0+c3Vic3RlcF9zaGFwaW5nID0gMjsKKyAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nX2FtcCA9IDE7CisgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZ19zdG9wID0gMTsKKyAgICAgICAgaWYgKGdmYy0+c3ViYmxvY2tfZ2FpbiA9PSAtMSkKKyAgICAgICAgICAgIGdmYy0+c3ViYmxvY2tfZ2FpbiA9IDE7CisgICAgICAgIGdmYy0+dXNlX2Jlc3RfaHVmZm1hbiA9IDE7IC8qIGlubmVyIGxvb3AgKi8KKyAgICAgICAgZ2ZjLT5mdWxsX291dGVyX2xvb3AgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgICAgZ2ZjLT5wc3ltb2RlbCA9IDE7CisgICAgICAgIGlmIChnZmMtPm5vaXNlX3NoYXBpbmcgPT0gMCkKKyAgICAgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZyA9IDE7CisgICAgICAgIGlmIChnZmMtPnN1YnN0ZXBfc2hhcGluZyA9PSAwKQorICAgICAgICAgICAgZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgPSAyOworICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmdfYW1wID0gMjsKKyAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nX3N0b3AgPSAxOworICAgICAgICBpZiAoZ2ZjLT5zdWJibG9ja19nYWluID09IC0xKQorICAgICAgICAgICAgZ2ZjLT5zdWJibG9ja19nYWluID0gMTsKKyAgICAgICAgZ2ZjLT51c2VfYmVzdF9odWZmbWFuID0gMTsKKyAgICAgICAgZ2ZjLT5mdWxsX291dGVyX2xvb3AgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMDoKKyAgICAgICAgZ2ZjLT5wc3ltb2RlbCA9IDE7CisgICAgICAgIGlmIChnZmMtPm5vaXNlX3NoYXBpbmcgPT0gMCkKKyAgICAgICAgICAgIGdmYy0+bm9pc2Vfc2hhcGluZyA9IDE7CisgICAgICAgIGlmIChnZmMtPnN1YnN0ZXBfc2hhcGluZyA9PSAwKQorICAgICAgICAgICAgZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgPSAyOworICAgICAgICBnZmMtPm5vaXNlX3NoYXBpbmdfYW1wID0gMjsKKyAgICAgICAgZ2ZjLT5ub2lzZV9zaGFwaW5nX3N0b3AgPSAxOworICAgICAgICBpZiAoZ2ZjLT5zdWJibG9ja19nYWluID09IC0xKQorICAgICAgICAgICAgZ2ZjLT5zdWJibG9ja19nYWluID0gMTsKKyAgICAgICAgZ2ZjLT51c2VfYmVzdF9odWZmbWFuID0gMTsgLyp0eXBlIDIgZGlzYWJsZWQgYmVjYXVzZSBvZiBpdCBzbG93bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZmF2b3Igb2YgZnVsbCBvdXRlciBsb29wIHNlYXJjaCAqLworICAgICAgICBnZmMtPmZ1bGxfb3V0ZXJfbG9vcCA9IDA7IC8qIGZ1bGwgb3V0ZXIgbG9vcCBzZWFyY2ggZGlzYWJsZWQgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGF1ZGlibGUgZGlzdG9ydGlvbnMgaXQgbWF5IGdlbmVyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmggMDYwNjI5ICovCisgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCisKKworc3RhdGljIGRvdWJsZQorbGluZWFyX2ludChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBtKQoreworICAgIHJldHVybiBhICsgbSAqIChiIC0gYSk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgaW5pdGlhbGl6ZSBpbnRlcm5hbCBwYXJhbXMgYmFzZWQgb24gZGF0YSBpbiBnZgorICogICAoZ2xvYmFsZmxhZ3Mgc3RydWN0IGZpbGxlZCBpbiBieSBjYWxsaW5nIHByb2dyYW0pCisgKgorICogIE9VVExJTkU6CisgKgorICogV2UgZmlyc3QgaGF2ZSBzb21lIGNvbXBsZXggY29kZSB0byBkZXRlcm1pbmUgYml0cmF0ZSwKKyAqIG91dHB1dCBzYW1wbGVyYXRlIGFuZCBtb2RlLiAgSXQgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QKKyAqIHRoYXQgd2UgYWxsb3cgdGhlIHVzZXIgdG8gc2V0IHNvbWUgb3IgYWxsIG9mIHRoZXNlIHBhcmFtZXRlcnMsCisgKiBhbmQgbmVlZCB0byBkZXRlcm1pbmUgYmVzdCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSByZXN0IG9mIHRoZW06CisgKgorICogIDEuIHNldCBzb21lIENQVSByZWxhdGVkIGZsYWdzCisgKiAgMi4gY2hlY2sgaWYgd2UgYXJlIG1vbm8tPm1vbm8sIHN0ZXJlby0+bW9ubyBvciBzdGVyZW8tPnN0ZXJlbworICogIDMuICBjb21wdXRlIGJpdHJhdGUgYW5kIG91dHB1dCBzYW1wbGVyYXRlOgorICogICAgICAgICAgdXNlciBtYXkgaGF2ZSBzZXQgY29tcHJlc3Npb24gcmF0aW8KKyAqICAgICAgICAgIHVzZXIgbWF5IGhhdmUgc2V0IGEgYml0cmF0ZQorICogICAgICAgICAgdXNlciBtYXkgaGF2ZSBzZXQgYSBvdXRwdXQgc2FtcGxlcmF0ZQorICogIDQuIHNldCBzb21lIG9wdGlvbnMgd2hpY2ggZGVwZW5kIG9uIG91dHB1dCBzYW1wbGVyYXRlCisgKiAgNS4gY29tcHV0ZSB0aGUgYWN0dWFsIGNvbXByZXNzaW9uIHJhdGlvCisgKiAgNi4gc2V0IG1vZGUgYmFzZWQgb24gY29tcHJlc3Npb24gcmF0aW8KKyAqCisgKiAgVGhlIHJlbWFpbmluZyBjb2RlIGlzIG11Y2ggc2ltcGxlciAtIGl0IGp1c3Qgc2V0cyBvcHRpb25zCisgKiAgYmFzZWQgb24gdGhlIG1vZGUgJiBjb21wcmVzc2lvbiByYXRpbzoKKyAqCisgKiAgIHNldCBhbGxvd19kaWZmX3Nob3J0IGJhc2VkIG9uIG1vZGUKKyAqICAgc2VsZWN0IGxvd3Bhc3MgZmlsdGVyIGJhc2VkIG9uIGNvbXByZXNzaW9uIHJhdGlvICYgbW9kZQorICogICBzZXQgdGhlIGJpdHJhdGUgaW5kZXgsIGFuZCBtaW4vbWF4IGJpdHJhdGVzIGZvciBWQlIgbW9kZXMKKyAqICAgZGlzYWJsZSBWQlIgdGFnIGlmIGl0IGlzIG5vdCBhcHByb3ByaWF0ZQorICogICBpbml0aWFsaXplIHRoZSBiaXRzdHJlYW0KKyAqICAgaW5pdGlhbGl6ZSBzY2FsZWZhY19iYW5kIGRhdGEKKyAqICAgc2V0IHNpZGVpbmZvX2xlbiAoYmFzZWQgb24gY2hhbm5lbHMsIENSQywgb3V0X3NhbXBsZXJhdGUpCisgKiAgIHdyaXRlIGFuIGlkM3YyIHRhZyBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqICAgd3JpdGUgVkJSIHRhZyBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqICAgc2V0IG1wZWcxLzIgZmxhZworICogICBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyAoYmFzZWQgb24gYSBsb3Qgb2YgZGF0YSkKKyAqCisgKiAgIG5vdyB3ZSBzZXQgbW9yZSBmbGFnczoKKyAqICAgbnNwc3l0dW5lOgorICogICAgICBzZWUgY29kZQorICogICBWQlIgbW9kZXMKKyAqICAgICAgc2VlIGNvZGUKKyAqICAgQ0JSL0FCUgorICogICAgICBzZWUgY29kZQorICoKKyAqICBGaW5hbGx5LCB3ZSBzZXQgdGhlIGFsZ29yaXRobSBmbGFncyBiYXNlZCBvbiB0aGUgZ2ZwLT5xdWFsaXR5IHZhbHVlCisgKiAgbGFtZV9pbml0X3F2YWwoZ2ZwKTsKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2xhbWVfaW5pdF9wYXJhbXMobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICBqOworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisKKyAgICBnZmMtPkNsYXNzX0lEID0gMDsKKworICAgIC8qIHJlcG9ydCBmdW5jdGlvbnMgKi8KKyAgICBnZmMtPnJlcG9ydC5tc2dmID0gZ2ZwLT5yZXBvcnQubXNnZjsKKyAgICBnZmMtPnJlcG9ydC5kZWJ1Z2YgPSBnZnAtPnJlcG9ydC5kZWJ1Z2Y7CisgICAgZ2ZjLT5yZXBvcnQuZXJyb3JmID0gZ2ZwLT5yZXBvcnQuZXJyb3JmOworCisgICAgaWYgKGdmcC0+YXNtX29wdGltaXphdGlvbnMuYW1kM2Rub3cpCisgICAgICAgIGdmYy0+Q1BVX2ZlYXR1cmVzLkFNRF8zRE5vdyA9IGhhc18zRE5vdygpOworICAgIGVsc2UKKyAgICAgICAgZ2ZjLT5DUFVfZmVhdHVyZXMuQU1EXzNETm93ID0gMDsKKworICAgIGlmIChnZnAtPmFzbV9vcHRpbWl6YXRpb25zLm1teCkKKyAgICAgICAgZ2ZjLT5DUFVfZmVhdHVyZXMuTU1YID0gaGFzX01NWCgpOworICAgIGVsc2UKKyAgICAgICAgZ2ZjLT5DUFVfZmVhdHVyZXMuTU1YID0gMDsKKworICAgIGlmIChnZnAtPmFzbV9vcHRpbWl6YXRpb25zLnNzZSkgeworICAgICAgICBnZmMtPkNQVV9mZWF0dXJlcy5TU0UgPSBoYXNfU1NFKCk7CisgICAgICAgIGdmYy0+Q1BVX2ZlYXR1cmVzLlNTRTIgPSBoYXNfU1NFMigpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ2ZjLT5DUFVfZmVhdHVyZXMuU1NFID0gMDsKKyAgICAgICAgZ2ZjLT5DUFVfZmVhdHVyZXMuU1NFMiA9IDA7CisgICAgfQorCisKKyAgICBpZiAoTlVMTCA9PSBnZmMtPkFUSCkKKyAgICAgICAgZ2ZjLT5BVEggPSBjYWxsb2MoMSwgc2l6ZW9mKEFUSF90KSk7CisKKyAgICBpZiAoTlVMTCA9PSBnZmMtPkFUSCkKKyAgICAgICAgcmV0dXJuIC0yOyAgICAgIC8qIG1heWJlIGVycm9yIGNvZGVzIHNob3VsZCBiZSBlbnVtZXJhdGVkIGluIGxhbWUuaCA/PyAqLworCisgICAgaWYgKE5VTEwgPT0gZ2ZjLT5QU1kpCisgICAgICAgIGdmYy0+UFNZID0gY2FsbG9jKDEsIHNpemVvZihQU1lfdCkpOworICAgIGlmIChOVUxMID09IGdmYy0+UFNZKSB7CisgICAgICAgIGZyZWVnZmMoZ2ZjKTsKKyAgICAgICAgZ2ZwLT5pbnRlcm5hbF9mbGFncyA9IE5VTEw7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBnZmMtPnJnZGF0YSkKKyAgICAgICAgZ2ZjLT5yZ2RhdGEgPSBjYWxsb2MoMSwgc2l6ZW9mKHJlcGxheWdhaW5fdCkpOworICAgIGlmIChOVUxMID09IGdmYy0+cmdkYXRhKSB7CisgICAgICAgIGZyZWVnZmMoZ2ZjKTsKKyAgICAgICAgZ2ZwLT5pbnRlcm5hbF9mbGFncyA9IE5VTEw7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBnZmMtPmNoYW5uZWxzX2luID0gZ2ZwLT5udW1fY2hhbm5lbHM7CisgICAgaWYgKGdmYy0+Y2hhbm5lbHNfaW4gPT0gMSkKKyAgICAgICAgZ2ZwLT5tb2RlID0gTU9OTzsKKyAgICBnZmMtPmNoYW5uZWxzX291dCA9IChnZnAtPm1vZGUgPT0gTU9OTykgPyAxIDogMjsKKyAgICBnZmMtPm1vZGVfZXh0ID0gTVBHX01EX01TX0xSOworICAgIGlmIChnZnAtPm1vZGUgPT0gTU9OTykKKyAgICAgICAgZ2ZwLT5mb3JjZV9tcyA9IDA7IC8qIGRvbid0IGFsbG93IGZvcmNlZCBtaWQvc2lkZSBzdGVyZW8gZm9yIG1vbm8gb3V0cHV0ICovCisKKyAgICBpZiAoZ2ZwLT5WQlIgPT0gdmJyX29mZiAmJiBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcyAhPSAxMjggJiYgZ2ZwLT5icmF0ZSA9PSAwKQorICAgICAgICBnZnAtPmJyYXRlID0gZ2ZwLT5WQlJfbWVhbl9iaXRyYXRlX2ticHM7CisKKyAgICBzd2l0Y2ggKGdmcC0+VkJSKSB7CisgICAgY2FzZSB2YnJfb2ZmOgorICAgIGNhc2UgdmJyX210cmg6CisgICAgY2FzZSB2YnJfbXQ6CisgICAgICAgIC8qIHRoZXNlIG1vZGVzIGNhbiBoYW5kbGUgZnJlZSBmb3JtYXQgY29uZGl0aW9uICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGdmcC0+ZnJlZV9mb3JtYXQgPSAwOyAvKiBtb2RlIGNhbid0IGJlIG1peGVkIHdpdGggZnJlZSBmb3JtYXQgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGdmcC0+VkJSID09IHZicl9vZmYgJiYgZ2ZwLT5icmF0ZSA9PSAwKSB7CisgICAgICAgIC8qIG5vIGJpdHJhdGUgb3IgY29tcHJlc3Npb24gcmF0aW8gc3BlY2lmaWVkLCB1c2UgMTEuMDI1ICovCisgICAgICAgIGlmIChFUShnZnAtPmNvbXByZXNzaW9uX3JhdGlvLCAwKSkKKyAgICAgICAgICAgIGdmcC0+Y29tcHJlc3Npb25fcmF0aW8gPSAxMS4wMjU7IC8qIHJhdGUgdG8gY29tcHJlc3MgYSBDRCBkb3duIHRvIGV4YWN0bHkgMTI4MDAwIGJwcyAqLworICAgIH0KKworICAgIC8qIGZpbmQgYml0cmF0ZSBpZiB1c2VyIHNwZWNpZnkgYSBjb21wcmVzc2lvbiByYXRpbyAqLworICAgIGlmIChnZnAtPlZCUiA9PSB2YnJfb2ZmICYmIGdmcC0+Y29tcHJlc3Npb25fcmF0aW8gPiAwKSB7CisKKyAgICAgICAgaWYgKGdmcC0+b3V0X3NhbXBsZXJhdGUgPT0gMCkKKyAgICAgICAgICAgIGdmcC0+b3V0X3NhbXBsZXJhdGUgPSBtYXAyTVAzRnJlcXVlbmN5KChpbnQpICgwLjk3ICogZ2ZwLT5pbl9zYW1wbGVyYXRlKSk7IC8qIHJvdW5kIHVwIHdpdGggYSBtYXJnaW4gb2YgMyUgKi8KKworICAgICAgICAvKiBjaG9vc2UgYSBiaXRyYXRlIGZvciB0aGUgb3V0cHV0IHNhbXBsZXJhdGUgd2hpY2ggYWNoaWV2ZXMKKyAgICAgICAgICogc3BlY2lmaWVkIGNvbXByZXNzaW9uIHJhdGlvCisgICAgICAgICAqLworICAgICAgICBnZnAtPmJyYXRlID0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZSAqIDE2ICogZ2ZjLT5jaGFubmVsc19vdXQgLyAoMS5lMyAqIGdmcC0+Y29tcHJlc3Npb25fcmF0aW8pOworCisgICAgICAgIC8qIHdlIG5lZWQgdGhlIHZlcnNpb24gZm9yIHRoZSBiaXRyYXRlIHRhYmxlIGxvb2sgdXAgKi8KKyAgICAgICAgZ2ZjLT5zYW1wbGVyYXRlX2luZGV4ID0gU21wRnJxSW5kZXgoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSwgJmdmcC0+dmVyc2lvbik7CisKKyAgICAgICAgaWYgKCFnZnAtPmZyZWVfZm9ybWF0KSAvKiBmb3Igbm9uIEZyZWUgRm9ybWF0IGZpbmQgdGhlIG5lYXJlc3QgYWxsb3dlZCBiaXRyYXRlICovCisgICAgICAgICAgICBnZnAtPmJyYXRlID0gRmluZE5lYXJlc3RCaXRyYXRlKGdmcC0+YnJhdGUsIGdmcC0+dmVyc2lvbiwgZ2ZwLT5vdXRfc2FtcGxlcmF0ZSk7CisgICAgfQorICAgIGlmIChnZnAtPm91dF9zYW1wbGVyYXRlKSB7CisgICAgICAgIGlmIChnZnAtPm91dF9zYW1wbGVyYXRlIDwgMTYwMDApIHsKKyAgICAgICAgICAgIGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzID0gTWF4KGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzLCA4KTsKKyAgICAgICAgICAgIGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzID0gTWluKGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzLCA2NCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSA8IDMyMDAwKSB7CisgICAgICAgICAgICBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcyA9IE1heChnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcywgOCk7CisgICAgICAgICAgICBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcyA9IE1pbihnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcywgMTYwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzID0gTWF4KGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzLCAzMik7CisgICAgICAgICAgICBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcyA9IE1pbihnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcywgMzIwKTsKKyAgICAgICAgfQorICAgIH0KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBpZiBhIGZpbHRlciBoYXMgbm90IGJlZW4gZW5hYmxlZCwgc2VlIGlmIHdlIHNob3VsZCBhZGQgb25lOiAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoZ2ZwLT5sb3dwYXNzZnJlcSA9PSAwKSB7CisgICAgICAgIGRvdWJsZSAgbG93cGFzcyA9IDE2MDAwOworICAgICAgICBkb3VibGUgIGhpZ2hwYXNzOworCisgICAgICAgIHN3aXRjaCAoZ2ZwLT5WQlIpIHsKKyAgICAgICAgY2FzZSB2YnJfb2ZmOnsKKyAgICAgICAgICAgICAgICBvcHRpbXVtX2JhbmR3aWR0aCgmbG93cGFzcywgJmhpZ2hwYXNzLCBnZnAtPmJyYXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSB2YnJfYWJyOnsKKyAgICAgICAgICAgICAgICBvcHRpbXVtX2JhbmR3aWR0aCgmbG93cGFzcywgJmhpZ2hwYXNzLCBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2Jwcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgdmJyX3JoOnsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3QgeFsxMV0gPSB7CisgICAgICAgICAgICAgICAgICAgIDE5NTAwLCAxOTAwMCwgMTg2MDAsIDE4MDAwLCAxNzUwMCwgMTYwMDAsIDE1NjAwLCAxNDkwMCwgMTI1MDAsIDEwMDAwLCAzOTUwCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBnZnAtPlZCUl9xICYmIGdmcC0+VkJSX3EgPD0gOSkgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGEgPSB4W2dmcC0+VkJSX3FdLCBiID0geFtnZnAtPlZCUl9xICsgMV0sIG0gPSBnZnAtPlZCUl9xX2ZyYWM7CisgICAgICAgICAgICAgICAgICAgIGxvd3Bhc3MgPSBsaW5lYXJfaW50KGEsIGIsIG0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG93cGFzcyA9IDE5NTAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDp7CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IHhbMTFdID0geworICAgICAgICAgICAgICAgICAgICAxOTUwMCwgMTkwMDAsIDE4NTAwLCAxODAwMCwgMTc1MDAsIDE2NTAwLCAxNTUwMCwgMTQ1MDAsIDEyNTAwLCA5NTAwLCAzOTUwCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBnZnAtPlZCUl9xICYmIGdmcC0+VkJSX3EgPD0gOSkgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGEgPSB4W2dmcC0+VkJSX3FdLCBiID0geFtnZnAtPlZCUl9xICsgMV0sIG0gPSBnZnAtPlZCUl9xX2ZyYWM7CisgICAgICAgICAgICAgICAgICAgIGxvd3Bhc3MgPSBsaW5lYXJfaW50KGEsIGIsIG0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG93cGFzcyA9IDE5NTAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZnAtPm1vZGUgPT0gTU9OTyAmJiAoZ2ZwLT5WQlIgPT0gdmJyX29mZiB8fCBnZnAtPlZCUiA9PSB2YnJfYWJyKSkKKyAgICAgICAgICAgIGxvd3Bhc3MgKj0gMS41OworCisgICAgICAgIGdmcC0+bG93cGFzc2ZyZXEgPSBsb3dwYXNzOworICAgIH0KKworICAgIGlmIChnZnAtPm91dF9zYW1wbGVyYXRlID09IDApIHsKKyAgICAgICAgaWYgKDIgKiBnZnAtPmxvd3Bhc3NmcmVxID4gZ2ZwLT5pbl9zYW1wbGVyYXRlKSB7CisgICAgICAgICAgICBnZnAtPmxvd3Bhc3NmcmVxID0gZ2ZwLT5pbl9zYW1wbGVyYXRlIC8gMjsKKyAgICAgICAgfQorICAgICAgICBnZnAtPm91dF9zYW1wbGVyYXRlID0gb3B0aW11bV9zYW1wbGVmcmVxKChpbnQpIGdmcC0+bG93cGFzc2ZyZXEsIGdmcC0+aW5fc2FtcGxlcmF0ZSk7CisgICAgfQorCisgICAgZ2ZwLT5sb3dwYXNzZnJlcSA9IE1pbigyMDUwMCwgZ2ZwLT5sb3dwYXNzZnJlcSk7CisgICAgZ2ZwLT5sb3dwYXNzZnJlcSA9IE1pbihnZnAtPm91dF9zYW1wbGVyYXRlIC8gMiwgZ2ZwLT5sb3dwYXNzZnJlcSk7CisKKyAgICBpZiAoZ2ZwLT5WQlIgPT0gdmJyX29mZikgeworICAgICAgICBnZnAtPmNvbXByZXNzaW9uX3JhdGlvID0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZSAqIDE2ICogZ2ZjLT5jaGFubmVsc19vdXQgLyAoMS5lMyAqIGdmcC0+YnJhdGUpOworICAgIH0KKyAgICBpZiAoZ2ZwLT5WQlIgPT0gdmJyX2FicikgeworICAgICAgICBnZnAtPmNvbXByZXNzaW9uX3JhdGlvID0KKyAgICAgICAgICAgIGdmcC0+b3V0X3NhbXBsZXJhdGUgKiAxNiAqIGdmYy0+Y2hhbm5lbHNfb3V0IC8gKDEuZTMgKiBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2Jwcyk7CisgICAgfQorCisgICAgLyogZG8gbm90IGNvbXB1dGUgUmVwbGF5R2FpbiB2YWx1ZXMgYW5kIGRvIG5vdCBmaW5kIHRoZSBwZWFrIHNhbXBsZQorICAgICAgIGlmIHdlIGNhbid0IHN0b3JlIHRoZW0gKi8KKyAgICBpZiAoIWdmcC0+YldyaXRlVmJyVGFnKSB7CisgICAgICAgIGdmcC0+ZmluZFJlcGxheUdhaW4gPSAwOworICAgICAgICBnZnAtPmRlY29kZV9vbl90aGVfZmx5ID0gMDsKKyAgICAgICAgZ2ZjLT5maW5kUGVha1NhbXBsZSA9IDA7CisgICAgfQorICAgIGdmYy0+ZmluZFJlcGxheUdhaW4gPSBnZnAtPmZpbmRSZXBsYXlHYWluOworICAgIGdmYy0+ZGVjb2RlX29uX3RoZV9mbHkgPSBnZnAtPmRlY29kZV9vbl90aGVfZmx5OworCisgICAgaWYgKGdmYy0+ZGVjb2RlX29uX3RoZV9mbHkpCisgICAgICAgIGdmYy0+ZmluZFBlYWtTYW1wbGUgPSAxOworCisgICAgaWYgKGdmYy0+ZmluZFJlcGxheUdhaW4pIHsKKyAgICAgICAgaWYgKEluaXRHYWluQW5hbHlzaXMoZ2ZjLT5yZ2RhdGEsIGdmcC0+b3V0X3NhbXBsZXJhdGUpID09IElOSVRfR0FJTl9BTkFMWVNJU19FUlJPUikgeworICAgICAgICAgICAgZnJlZWdmYyhnZmMpOworICAgICAgICAgICAgZ2ZwLT5pbnRlcm5hbF9mbGFncyA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTY7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBERUNPREVfT05fVEhFX0ZMWQorICAgIGlmIChnZmMtPmRlY29kZV9vbl90aGVfZmx5ICYmICFnZnAtPmRlY29kZV9vbmx5KSB7CisgICAgICAgIGlmIChnZmMtPmhpcCkgeworICAgICAgICAgICAgaGlwX2RlY29kZV9leGl0KGdmYy0+aGlwKTsKKyAgICAgICAgfQorICAgICAgICBnZmMtPmhpcCA9IGhpcF9kZWNvZGVfaW5pdCgpOworICAgIH0KKyNlbmRpZgorCisgICAgZ2ZjLT5tb2RlX2dyID0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZSA8PSAyNDAwMCA/IDEgOiAyOyAvKiBOdW1iZXIgb2YgZ3JhbnVsZXMgcGVyIGZyYW1lICovCisgICAgZ2ZwLT5mcmFtZXNpemUgPSA1NzYgKiBnZmMtPm1vZGVfZ3I7CisgICAgZ2ZwLT5lbmNvZGVyX2RlbGF5ID0gRU5DREVMQVk7CisKKyAgICBnZmMtPnJlc2FtcGxlX3JhdGlvID0gKGRvdWJsZSkgZ2ZwLT5pbl9zYW1wbGVyYXRlIC8gZ2ZwLT5vdXRfc2FtcGxlcmF0ZTsKKworICAgIC8qCisgICAgICogIHNhbXBsZSBmcmVxICAgICAgIGJpdHJhdGUgICAgIGNvbXByZXNzaW9uIHJhdGlvCisgICAgICogICAgIFtrSHpdICAgICAgW2ticHMvY2hhbm5lbF0gICBmb3IgMTYgYml0IGlucHV0CisgICAgICogICAgIDQ0LjEgICAgICAgICAgICA1NiAgICAgICAgICAgICAgIDEyLjYKKyAgICAgKiAgICAgNDQuMSAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgMTEuMDI1CisgICAgICogICAgIDQ0LjEgICAgICAgICAgICA4MCAgICAgICAgICAgICAgICA4LjgyCisgICAgICogICAgIDIyLjA1ICAgICAgICAgICAyNCAgICAgICAgICAgICAgIDE0LjcKKyAgICAgKiAgICAgMjIuMDUgICAgICAgICAgIDMyICAgICAgICAgICAgICAgMTEuMDI1CisgICAgICogICAgIDIyLjA1ICAgICAgICAgICA0MCAgICAgICAgICAgICAgICA4LjgyCisgICAgICogICAgIDE2ICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgIDE2LjAKKyAgICAgKiAgICAgMTYgICAgICAgICAgICAgIDI0ICAgICAgICAgICAgICAgMTAuNjY3CisgICAgICoKKyAgICAgKi8KKyAgICAvKgorICAgICAqICBGb3IgVkJSLCB0YWtlIGEgZ3Vlc3MgYXQgdGhlIGNvbXByZXNzaW9uX3JhdGlvLgorICAgICAqICBGb3IgZXhhbXBsZToKKyAgICAgKgorICAgICAqICAgIFZCUl9xICAgIGNvbXByZXNzaW9uICAgICBsaWtlCisgICAgICogICAgIC0gICAgICAgIDQuNCAgICAgICAgIDMyMCBrYnBzLzQ0IGtIegorICAgICAqICAgMC4uLjEgICAgICA1LjUgICAgICAgICAyNTYga2Jwcy80NCBrSHoKKyAgICAgKiAgICAgMiAgICAgICAgNy4zICAgICAgICAgMTkyIGticHMvNDQga0h6CisgICAgICogICAgIDQgICAgICAgIDguOCAgICAgICAgIDE2MCBrYnBzLzQ0IGtIegorICAgICAqICAgICA2ICAgICAgIDExICAgICAgICAgICAxMjgga2Jwcy80NCBrSHoKKyAgICAgKiAgICAgOSAgICAgICAxNC43ICAgICAgICAgIDk2IGticHMKKyAgICAgKgorICAgICAqICBmb3IgbG93ZXIgYml0cmF0ZXMsIGRvd25zYW1wbGUgd2l0aCAtLXJlc2FtcGxlCisgICAgICovCisKKyAgICBzd2l0Y2ggKGdmcC0+VkJSKSB7CisgICAgY2FzZSB2YnJfbXQ6CisgICAgY2FzZSB2YnJfcmg6CisgICAgY2FzZSB2YnJfbXRyaDoKKyAgICAgICAgeworICAgICAgICAgICAgLypudW1iZXJzIGFyZSBhIGJpdCBzdHJhbmdlLCBidXQgdGhleSBkZXRlcm1pbmUgdGhlIGxvd3Bhc3MgdmFsdWUgKi8KKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IGNtcFtdID0geyA1LjcsIDYuNSwgNy4zLCA4LjIsIDEwLCAxMS45LCAxMywgMTQsIDE1LCAxNi41IH07CisgICAgICAgICAgICBnZnAtPmNvbXByZXNzaW9uX3JhdGlvID0gY21wW2dmcC0+VkJSX3FdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgdmJyX2FicjoKKyAgICAgICAgZ2ZwLT5jb21wcmVzc2lvbl9yYXRpbyA9CisgICAgICAgICAgICBnZnAtPm91dF9zYW1wbGVyYXRlICogMTYgKiBnZmMtPmNoYW5uZWxzX291dCAvICgxLmUzICogZ2ZwLT5WQlJfbWVhbl9iaXRyYXRlX2ticHMpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBnZnAtPmNvbXByZXNzaW9uX3JhdGlvID0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZSAqIDE2ICogZ2ZjLT5jaGFubmVsc19vdXQgLyAoMS5lMyAqIGdmcC0+YnJhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIC8qIG1vZGUgPSAtMSAobm90IHNldCBieSB1c2VyKSBvcgorICAgICAqIG1vZGUgPSBNT05PIChiZWNhdXNlIG9mIG9ubHkgMSBpbnB1dCBjaGFubmVsKS4KKyAgICAgKiBJZiBtb2RlIGhhcyBub3QgYmVlbiBzZXQsIHRoZW4gc2VsZWN0IEotU1RFUkVPCisgICAgICovCisgICAgaWYgKGdmcC0+bW9kZSA9PSBOT1RfU0VUKSB7CisgICAgICAgIGdmcC0+bW9kZSA9IEpPSU5UX1NURVJFTzsKKyAgICB9CisKKworICAgIC8qIGFwcGx5IHVzZXIgZHJpdmVuIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICBpZiAoZ2ZwLT5oaWdocGFzc2ZyZXEgPiAwKSB7CisgICAgICAgIGdmYy0+aGlnaHBhc3MxID0gMi4gKiBnZnAtPmhpZ2hwYXNzZnJlcTsKKworICAgICAgICBpZiAoZ2ZwLT5oaWdocGFzc3dpZHRoID49IDApCisgICAgICAgICAgICBnZmMtPmhpZ2hwYXNzMiA9IDIuICogKGdmcC0+aGlnaHBhc3NmcmVxICsgZ2ZwLT5oaWdocGFzc3dpZHRoKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgIC8qIDAlIGFib3ZlIG9uIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIGdmYy0+aGlnaHBhc3MyID0gKDEgKyAwLjAwKSAqIDIuICogZ2ZwLT5oaWdocGFzc2ZyZXE7CisKKyAgICAgICAgZ2ZjLT5oaWdocGFzczEgLz0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZTsKKyAgICAgICAgZ2ZjLT5oaWdocGFzczIgLz0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGdmYy0+aGlnaHBhc3MxID0gMDsKKyAgICAgICAgZ2ZjLT5oaWdocGFzczIgPSAwOworICAgIH0KKyAgICAvKiBhcHBseSB1c2VyIGRyaXZlbiBsb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICBpZiAoZ2ZwLT5sb3dwYXNzZnJlcSA+IDApIHsKKyAgICAgICAgZ2ZjLT5sb3dwYXNzMiA9IDIuICogZ2ZwLT5sb3dwYXNzZnJlcTsKKyAgICAgICAgaWYgKGdmcC0+bG93cGFzc3dpZHRoID49IDApIHsKKyAgICAgICAgICAgIGdmYy0+bG93cGFzczEgPSAyLiAqIChnZnAtPmxvd3Bhc3NmcmVxIC0gZ2ZwLT5sb3dwYXNzd2lkdGgpOworICAgICAgICAgICAgaWYgKGdmYy0+bG93cGFzczEgPCAwKSAvKiBoYXMgdG8gYmUgPj0gMCAqLworICAgICAgICAgICAgICAgIGdmYy0+bG93cGFzczEgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgICAgICAgICAvKiAwJSBiZWxvdyBvbiBkZWZhdWx0ICovCisgICAgICAgICAgICBnZmMtPmxvd3Bhc3MxID0gKDEgLSAwLjAwKSAqIDIuICogZ2ZwLT5sb3dwYXNzZnJlcTsKKyAgICAgICAgfQorICAgICAgICBnZmMtPmxvd3Bhc3MxIC89IGdmcC0+b3V0X3NhbXBsZXJhdGU7CisgICAgICAgIGdmYy0+bG93cGFzczIgLz0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGdmYy0+bG93cGFzczEgPSAwOworICAgICAgICBnZmMtPmxvd3Bhc3MyID0gMDsKKyAgICB9CisKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogY29tcHV0ZSBpbmZvIG5lZWRlZCBmb3IgcG9seXBoYXNlIGZpbHRlciAoZmlsdGVyIHR5cGU9PTAsIGRlZmF1bHQpICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGxhbWVfaW5pdF9wYXJhbXNfcHBmbHQoZ2ZwKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIHNhbXBsZXJhdGUgYW5kIGJpdHJhdGUgaW5kZXgKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZ2ZjLT5zYW1wbGVyYXRlX2luZGV4ID0gU21wRnJxSW5kZXgoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSwgJmdmcC0+dmVyc2lvbik7CisgICAgaWYgKGdmYy0+c2FtcGxlcmF0ZV9pbmRleCA8IDApIHsKKyAgICAgICAgZnJlZWdmYyhnZmMpOworICAgICAgICBnZnAtPmludGVybmFsX2ZsYWdzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChnZnAtPlZCUiA9PSB2YnJfb2ZmKSB7CisgICAgICAgIGlmIChnZnAtPmZyZWVfZm9ybWF0KSB7CisgICAgICAgICAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ2ZwLT5icmF0ZSA9IEZpbmROZWFyZXN0Qml0cmF0ZShnZnAtPmJyYXRlLCBnZnAtPnZlcnNpb24sIGdmcC0+b3V0X3NhbXBsZXJhdGUpOworICAgICAgICAgICAgZ2ZjLT5iaXRyYXRlX2luZGV4ID0gQml0cmF0ZUluZGV4KGdmcC0+YnJhdGUsIGdmcC0+dmVyc2lvbiwgZ2ZwLT5vdXRfc2FtcGxlcmF0ZSk7CisgICAgICAgICAgICBpZiAoZ2ZjLT5iaXRyYXRlX2luZGV4IDw9IDApIHsKKyAgICAgICAgICAgICAgICBmcmVlZ2ZjKGdmYyk7CisgICAgICAgICAgICAgICAgZ2ZwLT5pbnRlcm5hbF9mbGFncyA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSAxOworICAgIH0KKworICAgIC8qIGZvciBDQlIsIHdlIHdpbGwgd3JpdGUgYW4gImluZm8iIHRhZy4gKi8KKyAgICAvKiAgICBpZiAoKGdmcC0+VkJSID09IHZicl9vZmYpKSAgKi8KKyAgICAvKiAgZ2ZwLT5iV3JpdGVWYnJUYWcgPSAwOyAqLworCisgICAgaWYgKGdmcC0+YW5hbHlzaXMpCisgICAgICAgIGdmcC0+YldyaXRlVmJyVGFnID0gMDsKKworICAgIC8qIHNvbWUgZmlsZSBvcHRpb25zIG5vdCBhbGxvd2VkIGlmIG91dHB1dCBpczogbm90IHNwZWNpZmllZCBvciBzdGRvdXQgKi8KKyAgICBpZiAoZ2ZjLT5waW5mbyAhPSBOVUxMKQorICAgICAgICBnZnAtPmJXcml0ZVZiclRhZyA9IDA7IC8qIGRpc2FibGUgWGluZyBWQlIgdGFnICovCisKKyAgICBpbml0X2JpdF9zdHJlYW1fdyhnZmMpOworCisgICAgaiA9IGdmYy0+c2FtcGxlcmF0ZV9pbmRleCArICgzICogZ2ZwLT52ZXJzaW9uKSArIDYgKiAoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSA8IDE2MDAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0JNQVhfbCArIDE7IGkrKykKKyAgICAgICAgZ2ZjLT5zY2FsZWZhY19iYW5kLmxbaV0gPSBzZkJhbmRJbmRleFtqXS5sW2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IFBTRkIyMSArIDE7IGkrKykgeworICAgICAgICBpbnQgY29uc3Qgc2l6ZSA9IChnZmMtPnNjYWxlZmFjX2JhbmQubFsyMl0gLSBnZmMtPnNjYWxlZmFjX2JhbmQubFsyMV0pIC8gUFNGQjIxOworICAgICAgICBpbnQgY29uc3Qgc3RhcnQgPSBnZmMtPnNjYWxlZmFjX2JhbmQubFsyMV0gKyBpICogc2l6ZTsKKyAgICAgICAgZ2ZjLT5zY2FsZWZhY19iYW5kLnBzZmIyMVtpXSA9IHN0YXJ0OworICAgIH0KKyAgICBnZmMtPnNjYWxlZmFjX2JhbmQucHNmYjIxW1BTRkIyMV0gPSA1NzY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0JNQVhfcyArIDE7IGkrKykKKyAgICAgICAgZ2ZjLT5zY2FsZWZhY19iYW5kLnNbaV0gPSBzZkJhbmRJbmRleFtqXS5zW2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IFBTRkIxMiArIDE7IGkrKykgeworICAgICAgICBpbnQgY29uc3Qgc2l6ZSA9IChnZmMtPnNjYWxlZmFjX2JhbmQuc1sxM10gLSBnZmMtPnNjYWxlZmFjX2JhbmQuc1sxMl0pIC8gUFNGQjEyOworICAgICAgICBpbnQgY29uc3Qgc3RhcnQgPSBnZmMtPnNjYWxlZmFjX2JhbmQuc1sxMl0gKyBpICogc2l6ZTsKKyAgICAgICAgZ2ZjLT5zY2FsZWZhY19iYW5kLnBzZmIxMltpXSA9IHN0YXJ0OworICAgIH0KKyAgICBnZmMtPnNjYWxlZmFjX2JhbmQucHNmYjEyW1BTRkIxMl0gPSAxOTI7CisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIG1lYW4gYml0cmF0ZSBmb3IgbWFpbiBkYXRhICovCisgICAgaWYgKGdmcC0+dmVyc2lvbiA9PSAxKSAvKiBNUEVHIDEgKi8KKyAgICAgICAgZ2ZjLT5zaWRlaW5mb19sZW4gPSAoZ2ZjLT5jaGFubmVsc19vdXQgPT0gMSkgPyA0ICsgMTcgOiA0ICsgMzI7CisgICAgZWxzZSAgICAgICAgICAgICAgICAvKiBNUEVHIDIgKi8KKyAgICAgICAgZ2ZjLT5zaWRlaW5mb19sZW4gPSAoZ2ZjLT5jaGFubmVsc19vdXQgPT0gMSkgPyA0ICsgOSA6IDQgKyAxNzsKKworICAgIGlmIChnZnAtPmVycm9yX3Byb3RlY3Rpb24pCisgICAgICAgIGdmYy0+c2lkZWluZm9fbGVuICs9IDI7CisKKyAgICAodm9pZCkgbGFtZV9pbml0X2JpdHN0cmVhbShnZnApOworCisgICAgZ2ZjLT5DbGFzc19JRCA9IExBTUVfSUQ7CisKKyAgICAvKmlmIChnZnAtPmV4cF9uc3BzeXR1bmUgJiAxKSAqLyAgeworICAgICAgICBpbnQgICAgIGs7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IDE5OyBrKyspCisgICAgICAgICAgICBnZmMtPm5zUHN5LnBlZmlyYnVmW2tdID0gNzAwICogZ2ZjLT5tb2RlX2dyICogZ2ZjLT5jaGFubmVsc19vdXQ7CisKKyAgICAgICAgaWYgKGdmcC0+QVRIdHlwZSA9PSAtMSkKKyAgICAgICAgICAgIGdmcC0+QVRIdHlwZSA9IDQ7CisgICAgfQorCisgICAgYXNzZXJ0KGdmcC0+VkJSX3EgPD0gOSk7CisgICAgYXNzZXJ0KGdmcC0+VkJSX3EgPj0gMCk7CisKKyAgICBzd2l0Y2ggKGdmcC0+VkJSKSB7CisKKyAgICBjYXNlIHZicl9tdDoKKyAgICAgICAgZ2ZwLT5WQlIgPSB2YnJfbXRyaDsKKyAgICAgICAgLypsaW50IC0tZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIHZicl9tdHJoOnsKKyAgICAgICAgICAgIGlmIChnZnAtPnVzZVRlbXBvcmFsIDwgMCkgeworICAgICAgICAgICAgICAgIGdmcC0+dXNlVGVtcG9yYWwgPSAwOyAvKiBvZmYgYnkgZGVmYXVsdCBmb3IgdGhpcyBWQlIgbW9kZSAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAodm9pZCkgYXBwbHlfcHJlc2V0KGdmcCwgNTAwIC0gKGdmcC0+VkJSX3EgKiAxMCksIDApOworICAgICAgICAgICAgLyogIFRoZSBuZXdlciBWQlIgY29kZSBzdXBwb3J0cyBvbmx5IGEgbGltaXRlZAorICAgICAgICAgICAgICAgc3Vic2V0IG9mIHF1YWxpdHkgbGV2ZWxzOgorICAgICAgICAgICAgICAgOS01PTUgYXJlIHRoZSBzYW1lLCB1c2VzIHheMy80IHF1YW50aXphdGlvbgorICAgICAgICAgICAgICAgNC0wPTAgYXJlIHRoZSBzYW1lICA1IHBsdXMgYmVzdCBodWZmbWFuIGRpdmlkZSBjb2RlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChnZnAtPnF1YWxpdHkgPCAwKQorICAgICAgICAgICAgICAgIGdmcC0+cXVhbGl0eSA9IExBTUVfREVGQVVMVF9RVUFMSVRZOworICAgICAgICAgICAgaWYgKGdmcC0+cXVhbGl0eSA8IDUpCisgICAgICAgICAgICAgICAgZ2ZwLT5xdWFsaXR5ID0gMDsKKyAgICAgICAgICAgIGlmIChnZnAtPnF1YWxpdHkgPiA1KQorICAgICAgICAgICAgICAgIGdmcC0+cXVhbGl0eSA9IDU7CisKKyAgICAgICAgICAgIGdmYy0+UFNZLT5tYXNrX2FkanVzdCA9IGdmcC0+bWFza2luZ2FkanVzdDsKKyAgICAgICAgICAgIGdmYy0+UFNZLT5tYXNrX2FkanVzdF9zaG9ydCA9IGdmcC0+bWFza2luZ2FkanVzdF9zaG9ydDsKKworICAgICAgICAgICAgLyogIHNmYjIxIGV4dHJhIG9ubHkgd2l0aCBNUEVHLTEgYXQgaGlnaGVyIHNhbXBsaW5nIHJhdGVzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChnZnAtPmV4cGVyaW1lbnRhbFkpCisgICAgICAgICAgICAgICAgZ2ZjLT5zZmIyMV9leHRyYSA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2ZjLT5zZmIyMV9leHRyYSA9IChnZnAtPm91dF9zYW1wbGVyYXRlID4gNDQwMDApOworCisgICAgICAgICAgICBnZmMtPml0ZXJhdGlvbl9sb29wID0gVkJSX25ld19pdGVyYXRpb25fbG9vcDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICBjYXNlIHZicl9yaDp7CisKKyAgICAgICAgICAgICh2b2lkKSBhcHBseV9wcmVzZXQoZ2ZwLCA1MDAgLSAoZ2ZwLT5WQlJfcSAqIDEwKSwgMCk7CisKKyAgICAgICAgICAgIGdmYy0+UFNZLT5tYXNrX2FkanVzdCA9IGdmcC0+bWFza2luZ2FkanVzdDsKKyAgICAgICAgICAgIGdmYy0+UFNZLT5tYXNrX2FkanVzdF9zaG9ydCA9IGdmcC0+bWFza2luZ2FkanVzdF9zaG9ydDsKKworICAgICAgICAgICAgLyogIHNmYjIxIGV4dHJhIG9ubHkgd2l0aCBNUEVHLTEgYXQgaGlnaGVyIHNhbXBsaW5nIHJhdGVzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChnZnAtPmV4cGVyaW1lbnRhbFkpCisgICAgICAgICAgICAgICAgZ2ZjLT5zZmIyMV9leHRyYSA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2ZjLT5zZmIyMV9leHRyYSA9IChnZnAtPm91dF9zYW1wbGVyYXRlID4gNDQwMDApOworCisgICAgICAgICAgICAvKiAgVkJSIG5lZWRzIGF0IGxlYXN0IHRoZSBvdXRwdXQgb2YgR1BTWUNITywKKyAgICAgICAgICAgICAqICBzbyB3ZSBoYXZlIHRvIGdhcmFudGVlIHRoYXQgYnkgc2V0dGluZyBhIG1pbmltdW0KKyAgICAgICAgICAgICAqICBxdWFsaXR5IGxldmVsLCBhY3R1YWxseSBsZXZlbCA2IGRvZXMgaXQuCisgICAgICAgICAgICAgKiAgZG93biB0byBsZXZlbCA2CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChnZnAtPnF1YWxpdHkgPiA2KQorICAgICAgICAgICAgICAgIGdmcC0+cXVhbGl0eSA9IDY7CisKKworICAgICAgICAgICAgaWYgKGdmcC0+cXVhbGl0eSA8IDApCisgICAgICAgICAgICAgICAgZ2ZwLT5xdWFsaXR5ID0gTEFNRV9ERUZBVUxUX1FVQUxJVFk7CisKKyAgICAgICAgICAgIGdmYy0+aXRlcmF0aW9uX2xvb3AgPSBWQlJfb2xkX2l0ZXJhdGlvbl9sb29wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGRlZmF1bHQ6ICAgICAgICAgICAvKiBjYnIvYWJyICovICB7CisgICAgICAgICAgICB2YnJfbW9kZSB2YnJtb2RlOworCisgICAgICAgICAgICAvKiAgbm8gc2ZiMjEgZXh0cmEgd2l0aCBDQlIgY29kZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBnZmMtPnNmYjIxX2V4dHJhID0gMDsKKworICAgICAgICAgICAgaWYgKGdmcC0+cXVhbGl0eSA8IDApCisgICAgICAgICAgICAgICAgZ2ZwLT5xdWFsaXR5ID0gTEFNRV9ERUZBVUxUX1FVQUxJVFk7CisKKworICAgICAgICAgICAgdmJybW9kZSA9IGxhbWVfZ2V0X1ZCUihnZnApOworICAgICAgICAgICAgaWYgKHZicm1vZGUgPT0gdmJyX29mZikKKyAgICAgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCwgZ2ZwLT5icmF0ZSk7CisgICAgICAgICAgICAvKiBzZWNvbmQsIHNldCBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBiaXRyYXRlICovCisgICAgICAgICAgICAodm9pZCkgYXBwbHlfcHJlc2V0KGdmcCwgZ2ZwLT5WQlJfbWVhbl9iaXRyYXRlX2ticHMsIDApOworICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X1ZCUihnZnAsIHZicm1vZGUpOworCisgICAgICAgICAgICBnZmMtPlBTWS0+bWFza19hZGp1c3QgPSBnZnAtPm1hc2tpbmdhZGp1c3Q7CisgICAgICAgICAgICBnZmMtPlBTWS0+bWFza19hZGp1c3Rfc2hvcnQgPSBnZnAtPm1hc2tpbmdhZGp1c3Rfc2hvcnQ7CisKKyAgICAgICAgICAgIGlmICh2YnJtb2RlID09IHZicl9vZmYpIHsKKyAgICAgICAgICAgICAgICBnZmMtPml0ZXJhdGlvbl9sb29wID0gQ0JSX2l0ZXJhdGlvbl9sb29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZ2ZjLT5pdGVyYXRpb25fbG9vcCA9IEFCUl9pdGVyYXRpb25fbG9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyppbml0aWFsaXplIGRlZmF1bHQgdmFsdWVzIGNvbW1vbiBmb3IgYWxsIG1vZGVzICovCisKKworICAgIGlmIChsYW1lX2dldF9WQlIoZ2ZwKSAhPSB2YnJfb2ZmKSB7IC8qIGNob29zZSBhIG1pbi9tYXggYml0cmF0ZSBmb3IgVkJSICovCisgICAgICAgIC8qIGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IFZCUl9tYXhfYml0cmF0ZTogKi8KKyAgICAgICAgZ2ZjLT5WQlJfbWluX2JpdHJhdGUgPSAxOyAvKiBkZWZhdWx0OiBhbGxvdyAgIDgga2JwcyAoTVBFRy0yKSBvciAgMzIga2JwcyAoTVBFRy0xKSAqLworICAgICAgICBnZmMtPlZCUl9tYXhfYml0cmF0ZSA9IDE0OyAvKiBkZWZhdWx0OiBhbGxvdyAxNjAga2JwcyAoTVBFRy0yKSBvciAzMjAga2JwcyAoTVBFRy0xKSAqLworICAgICAgICBpZiAoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSA8IDE2MDAwKQorICAgICAgICAgICAgZ2ZjLT5WQlJfbWF4X2JpdHJhdGUgPSA4OyAvKiBkZWZhdWx0OiBhbGxvdyA2NCBrYnBzIChNUEVHLTIuNSkgKi8KKyAgICAgICAgaWYgKGdmcC0+VkJSX21pbl9iaXRyYXRlX2ticHMpIHsKKyAgICAgICAgICAgIGdmcC0+VkJSX21pbl9iaXRyYXRlX2ticHMgPQorICAgICAgICAgICAgICAgIEZpbmROZWFyZXN0Qml0cmF0ZShnZnAtPlZCUl9taW5fYml0cmF0ZV9rYnBzLCBnZnAtPnZlcnNpb24sIGdmcC0+b3V0X3NhbXBsZXJhdGUpOworICAgICAgICAgICAgZ2ZjLT5WQlJfbWluX2JpdHJhdGUgPQorICAgICAgICAgICAgICAgIEJpdHJhdGVJbmRleChnZnAtPlZCUl9taW5fYml0cmF0ZV9rYnBzLCBnZnAtPnZlcnNpb24sIGdmcC0+b3V0X3NhbXBsZXJhdGUpOworICAgICAgICAgICAgaWYgKGdmYy0+VkJSX21pbl9iaXRyYXRlIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdmcC0+VkJSX21heF9iaXRyYXRlX2ticHMpIHsKKyAgICAgICAgICAgIGdmcC0+VkJSX21heF9iaXRyYXRlX2ticHMgPQorICAgICAgICAgICAgICAgIEZpbmROZWFyZXN0Qml0cmF0ZShnZnAtPlZCUl9tYXhfYml0cmF0ZV9rYnBzLCBnZnAtPnZlcnNpb24sIGdmcC0+b3V0X3NhbXBsZXJhdGUpOworICAgICAgICAgICAgZ2ZjLT5WQlJfbWF4X2JpdHJhdGUgPQorICAgICAgICAgICAgICAgIEJpdHJhdGVJbmRleChnZnAtPlZCUl9tYXhfYml0cmF0ZV9rYnBzLCBnZnAtPnZlcnNpb24sIGdmcC0+b3V0X3NhbXBsZXJhdGUpOworICAgICAgICAgICAgaWYgKGdmYy0+VkJSX21heF9iaXRyYXRlIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZ2ZwLT5WQlJfbWluX2JpdHJhdGVfa2JwcyA9IGJpdHJhdGVfdGFibGVbZ2ZwLT52ZXJzaW9uXVtnZmMtPlZCUl9taW5fYml0cmF0ZV07CisgICAgICAgIGdmcC0+VkJSX21heF9iaXRyYXRlX2ticHMgPSBiaXRyYXRlX3RhYmxlW2dmcC0+dmVyc2lvbl1bZ2ZjLT5WQlJfbWF4X2JpdHJhdGVdOworICAgICAgICBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcyA9CisgICAgICAgICAgICBNaW4oYml0cmF0ZV90YWJsZVtnZnAtPnZlcnNpb25dW2dmYy0+VkJSX21heF9iaXRyYXRlXSwgZ2ZwLT5WQlJfbWVhbl9iaXRyYXRlX2ticHMpOworICAgICAgICBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcyA9CisgICAgICAgICAgICBNYXgoYml0cmF0ZV90YWJsZVtnZnAtPnZlcnNpb25dW2dmYy0+VkJSX21pbl9iaXRyYXRlXSwgZ2ZwLT5WQlJfbWVhbl9iaXRyYXRlX2ticHMpOworICAgIH0KKworCisgICAgLyogIGp1c3QgYW5vdGhlciBkYWlseSBjaGFuZ2luZyBkZXZlbG9wZXIgc3dpdGNoICAqLworICAgIGlmIChnZnAtPnR1bmUpIHsKKyAgICAgICAgZ2ZjLT5QU1ktPm1hc2tfYWRqdXN0ICs9IGdmcC0+dHVuZV92YWx1ZV9hOworICAgICAgICBnZmMtPlBTWS0+bWFza19hZGp1c3Rfc2hvcnQgKz0gZ2ZwLT50dW5lX3ZhbHVlX2E7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCBxdmFsIHNldHRpbmdzICovCisgICAgbGFtZV9pbml0X3F2YWwoZ2ZwKTsKKworCisgICAgLyogIGF1dG9tYXRpYyBBVEggYWRqdXN0bWVudCBvbgorICAgICAqLworICAgIGlmIChnZnAtPmF0aGFhX3R5cGUgPCAwKQorICAgICAgICBnZmMtPkFUSC0+dXNlX2FkanVzdCA9IDM7CisgICAgZWxzZQorICAgICAgICBnZmMtPkFUSC0+dXNlX2FkanVzdCA9IGdmcC0+YXRoYWFfdHlwZTsKKworCisgICAgLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCBhZGFwdGl2ZSBBVEggc2V0dGluZ3MgIC1qZCAqLworICAgIGdmYy0+QVRILT5hYV9zZW5zaXRpdml0eV9wID0gcG93KDEwLjAsIGdmcC0+YXRoYWFfc2Vuc2l0aXZpdHkgLyAtMTAuMCk7CisKKworICAgIGlmIChnZnAtPnNob3J0X2Jsb2NrcyA9PSBzaG9ydF9ibG9ja19ub3Rfc2V0KSB7CisgICAgICAgIGdmcC0+c2hvcnRfYmxvY2tzID0gc2hvcnRfYmxvY2tfYWxsb3dlZDsKKyAgICB9CisKKyAgICAvKk5vdGUgSmFuLzIwMDM6IE1hbnkgaGFyZHdhcmUgZGVjb2RlcnMgY2Fubm90IGhhbmRsZSBzaG9ydCBibG9ja3MgaW4gcmVndWxhcgorICAgICAgIHN0ZXJlbyBtb2RlIHVubGVzcyB0aGV5IGFyZSBjb3VwbGVkIChzYW1lIHR5cGUgaW4gYm90aCBjaGFubmVscykKKyAgICAgICBpdCBpcyBhIHJhcmUgZXZlbnQgKDEgZnJhbWUgcGVyIG1pbi4gb3Igc28pIHRoYXQgTEFNRSB3b3VsZCB1c2UKKyAgICAgICB1bmNvdXBsZWQgc2hvcnQgYmxvY2tzLCBzbyBsZXRzIHR1cm4gdGhlbSBvZmYgdW50aWwgd2UgZGVjaWRlCisgICAgICAgaG93IHRvIGhhbmRsZSB0aGlzLiAgTm8gb3RoZXIgZW5jb2RlcnMgYWxsb3cgdW5jb3VwbGVkIHNob3J0IGJsb2NrcywKKyAgICAgICBldmVuIHRob3VnaCBpdCBpcyBpbiB0aGUgc3RhbmRhcmQuICAqLworICAgIC8qIHJoIDIwMDQwMjE3OiBjb3VwbGluZyBtYWtlcyBubyBzZW5zZSBmb3IgbW9ubyBhbmQgZHVhbC1tb25vIHN0cmVhbXMKKyAgICAgKi8KKyAgICBpZiAoZ2ZwLT5zaG9ydF9ibG9ja3MgPT0gc2hvcnRfYmxvY2tfYWxsb3dlZAorICAgICAgICAmJiAoZ2ZwLT5tb2RlID09IEpPSU5UX1NURVJFTyB8fCBnZnAtPm1vZGUgPT0gU1RFUkVPKSkgeworICAgICAgICBnZnAtPnNob3J0X2Jsb2NrcyA9IHNob3J0X2Jsb2NrX2NvdXBsZWQ7CisgICAgfQorCisKKyAgICBpZiAobGFtZV9nZXRfcXVhbnRfY29tcChnZnApIDwgMCkKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3F1YW50X2NvbXAoZ2ZwLCAxKTsKKyAgICBpZiAobGFtZV9nZXRfcXVhbnRfY29tcF9zaG9ydChnZnApIDwgMCkKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3F1YW50X2NvbXBfc2hvcnQoZ2ZwLCAwKTsKKworICAgIGlmIChsYW1lX2dldF9tc2ZpeChnZnApIDwgMCkKKyAgICAgICAgbGFtZV9zZXRfbXNmaXgoZ2ZwLCAwKTsKKworICAgIC8qIHNlbGVjdCBwc3ljaG9hY291c3RpYyBtb2RlbCAqLworICAgICh2b2lkKSBsYW1lX3NldF9leHBfbnNwc3l0dW5lKGdmcCwgbGFtZV9nZXRfZXhwX25zcHN5dHVuZShnZnApIHwgMSk7CisKKyAgICBpZiAobGFtZV9nZXRfc2hvcnRfdGhyZXNob2xkX2xybShnZnApIDwgMCkKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3Nob3J0X3RocmVzaG9sZF9scm0oZ2ZwLCBOU0FUVEFDS1RIUkUpOworICAgIGlmIChsYW1lX2dldF9zaG9ydF90aHJlc2hvbGRfcyhnZnApIDwgMCkKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X3Nob3J0X3RocmVzaG9sZF9zKGdmcCwgTlNBVFRBQ0tUSFJFX1MpOworCisgICAgaWYgKGdmcC0+c2NhbGUgPCAwKQorICAgICAgICBnZnAtPnNjYWxlID0gMTsKKworICAgIGlmIChnZnAtPkFUSHR5cGUgPCAwKQorICAgICAgICBnZnAtPkFUSHR5cGUgPSA0OworCisgICAgaWYgKGdmcC0+QVRIY3VydmUgPCAwKQorICAgICAgICBnZnAtPkFUSGN1cnZlID0gNDsKKworICAgIGlmIChnZnAtPmF0aGFhX2xvdWRhcHByb3ggPCAwKQorICAgICAgICBnZnAtPmF0aGFhX2xvdWRhcHByb3ggPSAyOworCisgICAgaWYgKGdmcC0+aW50ZXJDaFJhdGlvIDwgMCkKKyAgICAgICAgZ2ZwLT5pbnRlckNoUmF0aW8gPSAwOworCisgICAgaWYgKGdmcC0+dXNlVGVtcG9yYWwgPCAwKQorICAgICAgICBnZnAtPnVzZVRlbXBvcmFsID0gMTsgLyogb24gYnkgZGVmYXVsdCAqLworCisKKworICAgIC8qIHBhZGRpbmcgbWV0aG9kIGFzIGRlc2NyaWJlZCBpbgorICAgICAqICJNUEVHLUxheWVyMyAvIEJpdHN0cmVhbSBTeW50YXggYW5kIERlY29kaW5nIgorICAgICAqIGJ5IE1hcnRpbiBTaWVsZXIsIFJhbHBoIFNwZXJzY2huZWlkZXIKKyAgICAgKgorICAgICAqIG5vdGU6IHRoZXJlIGlzIG5vIHBhZGRpbmcgZm9yIHRoZSB2ZXJ5IGZpcnN0IGZyYW1lCisgICAgICoKKyAgICAgKiBSb2JlcnQgSGVnZW1hbm4gMjAwMC0wNi0yMgorICAgICAqLworICAgIGdmYy0+c2xvdF9sYWcgPSBnZmMtPmZyYWNfU3BGID0gMDsKKyAgICBpZiAoZ2ZwLT5WQlIgPT0gdmJyX29mZikKKyAgICAgICAgZ2ZjLT5zbG90X2xhZyA9IGdmYy0+ZnJhY19TcEYKKyAgICAgICAgICAgID0gKChnZnAtPnZlcnNpb24gKyAxKSAqIDcyMDAwTCAqIGdmcC0+YnJhdGUpICUgZ2ZwLT5vdXRfc2FtcGxlcmF0ZTsKKworICAgIGl0ZXJhdGlvbl9pbml0KGdmcCk7CisgICAgKHZvaWQpIHBzeW1vZGVsX2luaXQoZ2ZwKTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogIHByaW50X2NvbmZpZworICoKKyAqICBQcmludHMgc29tZSBzZWxlY3RlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kaW5nIHBhcmFtZXRlcnMgdmlhCisgKiAgdGhlIG1hY3JvIGNvbW1hbmQgTVNHRigpLCB3aGljaCBpcyBjdXJyZW50bHkgbWFwcGVkIHRvIGxhbWVfZXJyb3JmCisgKiAgKHJlcG9ydHMgdmlhIGEgZXJyb3IgZnVuY3Rpb24/KSwgd2hpY2ggaXMgYSBwcmludGYtbGlrZSBmdW5jdGlvbgorICogIGZvciA8c3RkZXJyPi4KKyAqLworCit2b2lkCitsYW1lX3ByaW50X2NvbmZpZyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGRvdWJsZSBjb25zdCBvdXRfc2FtcGxlcmF0ZSA9IGdmcC0+b3V0X3NhbXBsZXJhdGU7CisgICAgZG91YmxlIGNvbnN0IGluX3NhbXBsZXJhdGUgPSBnZnAtPm91dF9zYW1wbGVyYXRlICogZ2ZjLT5yZXNhbXBsZV9yYXRpbzsKKworICAgIE1TR0YoZ2ZjLCAiTEFNRSAlcyAlcyAoJXMpXG4iLCBnZXRfbGFtZV92ZXJzaW9uKCksIGdldF9sYW1lX29zX2JpdG5lc3MoKSwgZ2V0X2xhbWVfdXJsKCkpOworCisjaWYgKExBTUVfQUxQSEFfVkVSU0lPTikKKyAgICBNU0dGKGdmYywgIndhcm5pbmc6IGFscGhhIHZlcnNpb25zIHNob3VsZCBiZSB1c2VkIGZvciB0ZXN0aW5nIG9ubHlcbiIpOworI2VuZGlmCisgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLk1NWAorICAgICAgICB8fCBnZmMtPkNQVV9mZWF0dXJlcy5BTURfM0ROb3cgfHwgZ2ZjLT5DUFVfZmVhdHVyZXMuU1NFIHx8IGdmYy0+Q1BVX2ZlYXR1cmVzLlNTRTIpIHsKKyAgICAgICAgaW50ICAgICBmZnRfYXNtX3VzZWQgPSAwOworI2lmZGVmIEhBVkVfTkFTTQorICAgICAgICBpZiAoZ2ZjLT5DUFVfZmVhdHVyZXMuQU1EXzNETm93KSB7CisgICAgICAgICAgICBmZnRfYXNtX3VzZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLlNTRSkgeworICAgICAgICAgICAgZmZ0X2FzbV91c2VkID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgZmZ0X2FzbV91c2VkID0gMDsKKyAgICAgICAgfQorICAgICAgICBNU0dGKGdmYywgIkNQVSBmZWF0dXJlczogIik7CisKKyAgICAgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLk1NWCkgeworI2lmZGVmIE1NWF9jaG9vc2VfdGFibGUKKyAgICAgICAgICAgIE1TR0YoZ2ZjLCAiTU1YIChBU00gdXNlZCkiKTsKKyNlbHNlCisgICAgICAgICAgICBNU0dGKGdmYywgIk1NWCIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLkFNRF8zRE5vdykgeworICAgICAgICAgICAgaWYgKGZmdF9hc21fdXNlZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgTVNHRihnZmMsICIsIDNETm93ISAoQVNNIHVzZWQpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNU0dGKGdmYywgIiwgM0ROb3chIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLlNTRSkgeworI2lmIGRlZmluZWQoSEFWRV9YTU1JTlRSSU5fSCkKKyAgICAgICAgICAgIE1TR0YoZ2ZjLCAiLCBTU0UgKEFTTSB1c2VkKSIpOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChmZnRfYXNtX3VzZWQgPT0gMikgeworICAgICAgICAgICAgICAgIE1TR0YoZ2ZjLCAiLCBTU0UgKEFTTSB1c2VkKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTVNHRihnZmMsICIsIFNTRSIpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLlNTRTIpIHsKKyAgICAgICAgICAgIE1TR0YoZ2ZjLCAiLCBTU0UyIik7CisgICAgICAgIH0KKyAgICAgICAgTVNHRihnZmMsICJcbiIpOworICAgIH0KKworICAgIGlmIChnZnAtPm51bV9jaGFubmVscyA9PSAyICYmIGdmYy0+Y2hhbm5lbHNfb3V0ID09IDEgLyogbW9ubyAqLyApIHsKKyAgICAgICAgTVNHRihnZmMsICJBdXRvY29udmVydGluZyBmcm9tIHN0ZXJlbyB0byBtb25vLiBTZXR0aW5nIGVuY29kaW5nIHRvIG1vbm8gbW9kZS5cbiIpOworICAgIH0KKworICAgIGlmIChORVEoZ2ZjLT5yZXNhbXBsZV9yYXRpbywgMS4pKSB7CisgICAgICAgIE1TR0YoZ2ZjLCAiUmVzYW1wbGluZzogIGlucHV0ICVnIGtIeiAgb3V0cHV0ICVnIGtIelxuIiwKKyAgICAgICAgICAgICAxLmUtMyAqIGluX3NhbXBsZXJhdGUsIDEuZS0zICogb3V0X3NhbXBsZXJhdGUpOworICAgIH0KKworICAgIGlmIChnZmMtPmhpZ2hwYXNzMiA+IDAuKQorICAgICAgICBNU0dGKGdmYywKKyAgICAgICAgICAgICAiVXNpbmcgcG9seXBoYXNlIGhpZ2hwYXNzIGZpbHRlciwgdHJhbnNpdGlvbiBiYW5kOiAlNS4wZiBIeiAtICU1LjBmIEh6XG4iLAorICAgICAgICAgICAgIDAuNSAqIGdmYy0+aGlnaHBhc3MxICogb3V0X3NhbXBsZXJhdGUsIDAuNSAqIGdmYy0+aGlnaHBhc3MyICogb3V0X3NhbXBsZXJhdGUpOworICAgIGlmICgwLiA8IGdmYy0+bG93cGFzczEgfHwgMC4gPCBnZmMtPmxvd3Bhc3MyKSB7CisgICAgICAgIE1TR0YoZ2ZjLAorICAgICAgICAgICAgICJVc2luZyBwb2x5cGhhc2UgbG93cGFzcyBmaWx0ZXIsIHRyYW5zaXRpb24gYmFuZDogJTUuMGYgSHogLSAlNS4wZiBIelxuIiwKKyAgICAgICAgICAgICAwLjUgKiBnZmMtPmxvd3Bhc3MxICogb3V0X3NhbXBsZXJhdGUsIDAuNSAqIGdmYy0+bG93cGFzczIgKiBvdXRfc2FtcGxlcmF0ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBNU0dGKGdmYywgInBvbHlwaGFzZSBsb3dwYXNzIGZpbHRlciBkaXNhYmxlZFxuIik7CisgICAgfQorCisgICAgaWYgKGdmcC0+ZnJlZV9mb3JtYXQpIHsKKyAgICAgICAgTVNHRihnZmMsICJXYXJuaW5nOiBtYW55IGRlY29kZXJzIGNhbm5vdCBoYW5kbGUgZnJlZSBmb3JtYXQgYml0c3RyZWFtc1xuIik7CisgICAgICAgIGlmIChnZnAtPmJyYXRlID4gMzIwKSB7CisgICAgICAgICAgICBNU0dGKGdmYywKKyAgICAgICAgICAgICAgICAgIldhcm5pbmc6IG1hbnkgZGVjb2RlcnMgY2Fubm90IGhhbmRsZSBmcmVlIGZvcm1hdCBiaXRyYXRlcyA+MzIwIGticHMgKHNlZSBkb2N1bWVudGF0aW9uKVxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqICAgICByaDoKKyAqICAgICAgc29tZSBwcmV0dHkgcHJpbnRpbmcgaXMgdmVyeSB3ZWxjb21lIGF0IHRoaXMgcG9pbnQhCisgKiAgICAgIHNvLCBpZiBzb21lb25lIGlzIHdpbGxpbmcgdG8gZG8gc28sIHBsZWFzZSBkbyBpdCEKKyAqICAgICAgYWRkIG1vcmUsIGlmIHlvdSBzZWUgbW9yZS4uLgorICovCit2b2lkCitsYW1lX3ByaW50X2ludGVybmFscyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGNvbnN0IGNoYXIgKnBjID0gIiI7CisKKyAgICAvKiAgY29tcGlsZXIvcHJvY2Vzc29yIG9wdGltaXphdGlvbnMsIG9wZXJhdGlvbmFsLCBldGMuCisgICAgICovCisgICAgTVNHRihnZmMsICJcbm1pc2M6XG5cbiIpOworCisgICAgTVNHRihnZmMsICJcdHNjYWxpbmc6ICVnXG4iLCBnZnAtPnNjYWxlKTsKKyAgICBNU0dGKGdmYywgIlx0Y2gwIChsZWZ0KSBzY2FsaW5nOiAlZ1xuIiwgZ2ZwLT5zY2FsZV9sZWZ0KTsKKyAgICBNU0dGKGdmYywgIlx0Y2gxIChyaWdodCkgc2NhbGluZzogJWdcbiIsIGdmcC0+c2NhbGVfcmlnaHQpOworICAgIHN3aXRjaCAoZ2ZjLT51c2VfYmVzdF9odWZmbWFuKSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcGMgPSAibm9ybWFsIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBwYyA9ICJiZXN0IChvdXRzaWRlIGxvb3ApIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBwYyA9ICJiZXN0IChpbnNpZGUgbG9vcCwgc2xvdykiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgTVNHRihnZmMsICJcdGh1ZmZtYW4gc2VhcmNoOiAlc1xuIiwgcGMpOworICAgIE1TR0YoZ2ZjLCAiXHRleHBlcmltZW50YWwgWT0lZFxuIiwgZ2ZwLT5leHBlcmltZW50YWxZKTsKKyAgICBNU0dGKGdmYywgIlx0Li4uXG4iKTsKKworICAgIC8qICBldmVyeXRoaW5nIGNvbnRyb2xsaW5nIHRoZSBzdHJlYW0gZm9ybWF0CisgICAgICovCisgICAgTVNHRihnZmMsICJcbnN0cmVhbSBmb3JtYXQ6XG5cbiIpOworICAgIHN3aXRjaCAoZ2ZwLT52ZXJzaW9uKSB7CisgICAgY2FzZSAwOgorICAgICAgICBwYyA9ICIyLjUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHBjID0gIjEiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHBjID0gIjIiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwYyA9ICI/IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIE1TR0YoZ2ZjLCAiXHRNUEVHLSVzIExheWVyIDNcbiIsIHBjKTsKKyAgICBzd2l0Y2ggKGdmcC0+bW9kZSkgeworICAgIGNhc2UgSk9JTlRfU1RFUkVPOgorICAgICAgICBwYyA9ICJqb2ludCBzdGVyZW8iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNURVJFTzoKKyAgICAgICAgcGMgPSAic3RlcmVvIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEVUFMX0NIQU5ORUw6CisgICAgICAgIHBjID0gImR1YWwgY2hhbm5lbCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9OTzoKKyAgICAgICAgcGMgPSAibW9ubyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTk9UX1NFVDoKKyAgICAgICAgcGMgPSAibm90IHNldCAoZXJyb3IpIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcGMgPSAidW5rbm93biAoZXJyb3IpIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIE1TR0YoZ2ZjLCAiXHQlZCBjaGFubmVsIC0gJXNcbiIsIGdmYy0+Y2hhbm5lbHNfb3V0LCBwYyk7CisKKyAgICBzd2l0Y2ggKGdmcC0+VkJSKSB7CisgICAgY2FzZSB2YnJfb2ZmOgorICAgICAgICBwYyA9ICJvZmYiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwYyA9ICJhbGwiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgTVNHRihnZmMsICJcdHBhZGRpbmc6ICVzXG4iLCBwYyk7CisKKyAgICBpZiAodmJyX2RlZmF1bHQgPT0gZ2ZwLT5WQlIpCisgICAgICAgIHBjID0gIihkZWZhdWx0KSI7CisgICAgZWxzZSBpZiAoZ2ZwLT5mcmVlX2Zvcm1hdCkKKyAgICAgICAgcGMgPSAiKGZyZWUgZm9ybWF0KSI7CisgICAgZWxzZQorICAgICAgICBwYyA9ICIiOworICAgIHN3aXRjaCAoZ2ZwLT5WQlIpIHsKKyAgICBjYXNlIHZicl9vZmY6CisgICAgICAgIE1TR0YoZ2ZjLCAiXHRjb25zdGFudCBiaXRyYXRlIC0gQ0JSICVzXG4iLCBwYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgdmJyX2FicjoKKyAgICAgICAgTVNHRihnZmMsICJcdHZhcmlhYmxlIGJpdHJhdGUgLSBBQlIgJXNcbiIsIHBjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSB2YnJfcmg6CisgICAgICAgIE1TR0YoZ2ZjLCAiXHR2YXJpYWJsZSBiaXRyYXRlIC0gVkJSIHJoICVzXG4iLCBwYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgdmJyX210OgorICAgICAgICBNU0dGKGdmYywgIlx0dmFyaWFibGUgYml0cmF0ZSAtIFZCUiBtdCAlc1xuIiwgcGMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHZicl9tdHJoOgorICAgICAgICBNU0dGKGdmYywgIlx0dmFyaWFibGUgYml0cmF0ZSAtIFZCUiBtdHJoICVzXG4iLCBwYyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIE1TR0YoZ2ZjLCAiXHQgPz8gb29wcywgc29tZSBuZXcgb25lID8/IFxuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZ2ZwLT5iV3JpdGVWYnJUYWcpCisgICAgICAgIE1TR0YoZ2ZjLCAiXHR1c2luZyBMQU1FIFRhZ1xuIik7CisgICAgTVNHRihnZmMsICJcdC4uLlxuIik7CisKKyAgICAvKiAgZXZlcnl0aGluZyBjb250cm9sbGluZyBwc3ljaG9hY291c3RpYyBzZXR0aW5ncywgbGlrZSBBVEgsIGV0Yy4KKyAgICAgKi8KKyAgICBNU0dGKGdmYywgIlxucHN5Y2hvYWNvdXN0aWM6XG5cbiIpOworCisgICAgc3dpdGNoIChnZnAtPnNob3J0X2Jsb2NrcykgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBzaG9ydF9ibG9ja19ub3Rfc2V0OgorICAgICAgICBwYyA9ICI/IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzaG9ydF9ibG9ja19hbGxvd2VkOgorICAgICAgICBwYyA9ICJhbGxvd2VkIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzaG9ydF9ibG9ja19jb3VwbGVkOgorICAgICAgICBwYyA9ICJjaGFubmVsIGNvdXBsZWQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHNob3J0X2Jsb2NrX2Rpc3BlbnNlZDoKKyAgICAgICAgcGMgPSAiZGlzcGVuc2VkIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBzaG9ydF9ibG9ja19mb3JjZWQ6CisgICAgICAgIHBjID0gImZvcmNlZCI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBNU0dGKGdmYywgIlx0dXNpbmcgc2hvcnQgYmxvY2tzOiAlc1xuIiwgcGMpOworICAgIE1TR0YoZ2ZjLCAiXHRzdWJibG9jayBnYWluOiAlZFxuIiwgZ2ZjLT5zdWJibG9ja19nYWluKTsKKyAgICBNU0dGKGdmYywgIlx0YWRqdXN0IG1hc2tpbmc6ICVnIGRCXG4iLCBnZmMtPlBTWS0+bWFza19hZGp1c3QpOworICAgIE1TR0YoZ2ZjLCAiXHRhZGp1c3QgbWFza2luZyBzaG9ydDogJWcgZEJcbiIsIGdmYy0+UFNZLT5tYXNrX2FkanVzdF9zaG9ydCk7CisgICAgTVNHRihnZmMsICJcdHF1YW50aXphdGlvbiBjb21wYXJpc29uOiAlZFxuIiwgZ2ZwLT5xdWFudF9jb21wKTsKKyAgICBNU0dGKGdmYywgIlx0IF4gY29tcGFyaXNvbiBzaG9ydCBibG9ja3M6ICVkXG4iLCBnZnAtPnF1YW50X2NvbXBfc2hvcnQpOworICAgIE1TR0YoZ2ZjLCAiXHRub2lzZSBzaGFwaW5nOiAlZFxuIiwgZ2ZjLT5ub2lzZV9zaGFwaW5nKTsKKyAgICBNU0dGKGdmYywgIlx0IF4gYW1wbGlmaWNhdGlvbjogJWRcbiIsIGdmYy0+bm9pc2Vfc2hhcGluZ19hbXApOworICAgIE1TR0YoZ2ZjLCAiXHQgXiBzdG9wcGluZzogJWRcbiIsIGdmYy0+bm9pc2Vfc2hhcGluZ19zdG9wKTsKKworICAgIHBjID0gInVzaW5nIjsKKyAgICBpZiAoZ2ZwLT5BVEhzaG9ydCkKKyAgICAgICAgcGMgPSAidGhlIG9ubHkgbWFza2luZyBmb3Igc2hvcnQgYmxvY2tzIjsKKyAgICBpZiAoZ2ZwLT5BVEhvbmx5KQorICAgICAgICBwYyA9ICJ0aGUgb25seSBtYXNraW5nIjsKKyAgICBpZiAoZ2ZwLT5ub0FUSCkKKyAgICAgICAgcGMgPSAibm90IHVzZWQiOworICAgIE1TR0YoZ2ZjLCAiXHRBVEg6ICVzXG4iLCBwYyk7CisgICAgTVNHRihnZmMsICJcdCBeIHR5cGU6ICVkXG4iLCBnZnAtPkFUSHR5cGUpOworICAgIE1TR0YoZ2ZjLCAiXHQgXiBzaGFwZTogJWclc1xuIiwgZ2ZwLT5BVEhjdXJ2ZSwgIiAob25seSBmb3IgdHlwZSA0KSIpOworICAgIE1TR0YoZ2ZjLCAiXHQgXiBsZXZlbCBhZGp1c3RlbWVudDogJWdcbiIsIGdmcC0+QVRIbG93ZXIpOworICAgIE1TR0YoZ2ZjLCAiXHQgXiBhZGp1c3QgdHlwZTogJWRcbiIsIGdmYy0+QVRILT51c2VfYWRqdXN0KTsKKyAgICBNU0dGKGdmYywgIlx0IF4gYWRqdXN0IHNlbnNpdGl2aXR5IHBvd2VyOiAlZlxuIiwgZ2ZjLT5BVEgtPmFhX3NlbnNpdGl2aXR5X3ApOworICAgIE1TR0YoZ2ZjLCAiXHQgXiBhZGFwdCB0aHJlc2hvbGQgdHlwZTogJWRcbiIsIGdmcC0+YXRoYWFfbG91ZGFwcHJveCk7CisKKyAgICBNU0dGKGdmYywgIlx0ZXhwZXJpbWVudGFsIHBzeSB0dW5pbmdzIGJ5IE5hb2tpIFNoaWJhdGFcbiIpOworICAgIE1TR0YoZ2ZjLCAiXHQgICBhZGp1c3QgbWFza2luZyBiYXNzPSVnIGRCLCBhbHRvPSVnIGRCLCB0cmVibGU9JWcgZEIsIHNmYjIxPSVnIGRCXG4iLAorICAgICAgICAgMTAgKiBsb2cxMChnZmMtPm5zUHN5LmxvbmdmYWN0WzBdKSwKKyAgICAgICAgIDEwICogbG9nMTAoZ2ZjLT5uc1BzeS5sb25nZmFjdFs3XSksCisgICAgICAgICAxMCAqIGxvZzEwKGdmYy0+bnNQc3kubG9uZ2ZhY3RbMTRdKSwgMTAgKiBsb2cxMChnZmMtPm5zUHN5LmxvbmdmYWN0WzIxXSkpOworCisgICAgcGMgPSBnZnAtPnVzZVRlbXBvcmFsID8gInllcyIgOiAibm8iOworICAgIE1TR0YoZ2ZjLCAiXHR1c2luZyB0ZW1wb3JhbCBtYXNraW5nIGVmZmVjdDogJXNcbiIsIHBjKTsKKyAgICBNU0dGKGdmYywgIlx0aW50ZXJjaGFubmVsIG1hc2tpbmcgcmF0aW86ICVnXG4iLCBnZnAtPmludGVyQ2hSYXRpbyk7CisgICAgTVNHRihnZmMsICJcdC4uLlxuIik7CisKKyAgICAvKiAgdGhhdCdzIGFsbCA/CisgICAgICovCisgICAgTVNHRihnZmMsICJcbiIpOworICAgIHJldHVybjsKK30KKworCisKKy8qIHJvdXRpbmUgdG8gZmVlZCBleGFjdGx5IG9uZSBmcmFtZSAoZ2ZwLT5mcmFtZXNpemUpIHdvcnRoIG9mIGRhdGEgdG8gdGhlCitlbmNvZGluZyBlbmdpbmUuICBBbGwgYnVmZmVyaW5nLCByZXNhbXBsaW5nLCBldGMsIGhhbmRsZWQgYnkgY2FsbGluZworcHJvZ3JhbS4KKyovCitzdGF0aWMgaW50CitsYW1lX2VuY29kZV9mcmFtZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwKKyAgICAgICAgICAgICAgICAgIHNhbXBsZV90IGluYnVmX2xbXSwgc2FtcGxlX3QgaW5idWZfcltdLCB1bnNpZ25lZCBjaGFyICptcDNidWYsIGludCBtcDNidWZfc2l6ZSkKK3sKKyAgICBpbnQgICAgIHJldDsKKyAgICByZXQgPSBsYW1lX2VuY29kZV9tcDNfZnJhbWUoZ2ZwLCBpbmJ1Zl9sLCBpbmJ1Zl9yLCBtcDNidWYsIG1wM2J1Zl9zaXplKTsKKyAgICBnZnAtPmZyYW1lTnVtKys7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordXBkYXRlX2luYnVmZmVyX3NpemUobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgY29uc3QgaW50IG5zYW1wbGVzKQoreworICAgIGlmIChnZmMtPmluX2J1ZmZlcl8wID09IDAgfHwgZ2ZjLT5pbl9idWZmZXJfbnNhbXBsZXMgPCBuc2FtcGxlcykgeworICAgICAgICBpZiAoZ2ZjLT5pbl9idWZmZXJfMCkgeworICAgICAgICAgICAgZnJlZShnZmMtPmluX2J1ZmZlcl8wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2ZjLT5pbl9idWZmZXJfMSkgeworICAgICAgICAgICAgZnJlZShnZmMtPmluX2J1ZmZlcl8xKTsKKyAgICAgICAgfQorICAgICAgICBnZmMtPmluX2J1ZmZlcl8wID0gY2FsbG9jKHNpemVvZihzYW1wbGVfdCksIG5zYW1wbGVzKTsKKyAgICAgICAgZ2ZjLT5pbl9idWZmZXJfMSA9IGNhbGxvYyhzaXplb2Yoc2FtcGxlX3QpLCBuc2FtcGxlcyk7CisgICAgICAgIGdmYy0+aW5fYnVmZmVyX25zYW1wbGVzID0gbnNhbXBsZXM7CisgICAgfQorICAgIGlmIChnZmMtPmluX2J1ZmZlcl8wID09IE5VTEwgfHwgZ2ZjLT5pbl9idWZmZXJfMSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChnZmMtPmluX2J1ZmZlcl8wKSB7CisgICAgICAgICAgICBmcmVlKGdmYy0+aW5fYnVmZmVyXzApOworICAgICAgICB9CisgICAgICAgIGlmIChnZmMtPmluX2J1ZmZlcl8xKSB7CisgICAgICAgICAgICBmcmVlKGdmYy0+aW5fYnVmZmVyXzEpOworICAgICAgICB9CisgICAgICAgIGdmYy0+aW5fYnVmZmVyXzAgPSAwOworICAgICAgICBnZmMtPmluX2J1ZmZlcl8xID0gMDsKKyAgICAgICAgZ2ZjLT5pbl9idWZmZXJfbnNhbXBsZXMgPSAwOworICAgICAgICBFUlJPUkYoZ2ZjLCAiRXJyb3I6IGNhbid0IGFsbG9jYXRlIGluX2J1ZmZlciBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2NhbGNOZWVkZWQobGFtZV9nbG9iYWxfZmxhZ3MqIGdmcCkKK3sKKyAgICBpbnQgbWZfbmVlZGVkOworICAgIC8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqLworI2lmIEVOQ0RFTEFZIDwgTURDVERFTEFZCisjIGVycm9yIEVOQ0RFTEFZIGlzIGxlc3MgdGhhbiBNRENUREVMQVksIHNlZSBlbmNvZGVyLmgKKyNlbmRpZgorI2lmIEZGVE9GRlNFVCA+IEJMS1NJWkUKKyMgZXJyb3IgRkZUT0ZGU0VUIGlzIGdyZWF0ZXIgdGhhbiBCTEtTSVpFLCBzZWUgZW5jb2Rlci5oCisjZW5kaWYKKworICAgIG1mX25lZWRlZCA9IEJMS1NJWkUgKyBnZnAtPmZyYW1lc2l6ZSAtIEZGVE9GRlNFVDsgLyogYW1vdW50IG5lZWRlZCBmb3IgRkZUICovCisgICAgLyptZl9uZWVkZWQgPSBNYXgobWZfbmVlZGVkLCAyODYgKyA1NzYgKiAoMSArIGdmYy0+bW9kZV9ncikpOyAqLworICAgIG1mX25lZWRlZCA9IE1heChtZl9uZWVkZWQsIDUxMiArIGdmcC0+ZnJhbWVzaXplIC0gMzIpOworCisgICAgYXNzZXJ0KE1GU0laRSA+PSBtZl9uZWVkZWQpOworICAgIAorICAgIHJldHVybiBtZl9uZWVkZWQ7Cit9CisKKy8qCisgKiBUSEUgTUFJTiBMQU1FIEVOQ09ESU5HIElOVEVSRkFDRQorICogbXQgMy8wMAorICoKKyAqIGlucHV0IHBjbSBkYXRhLCBvdXRwdXQgKG1heWJlKSBtcDMgZnJhbWVzLgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgYWxsIGJ1ZmZlcmluZywgcmVzYW1wbGluZyBhbmQgZmlsdGVyaW5nIGZvciB5b3UuCisgKiBUaGUgcmVxdWlyZWQgbXAzYnVmZmVyX3NpemUgY2FuIGJlIGNvbXB1dGVkIGZyb20gbnVtX3NhbXBsZXMsCisgKiBzYW1wbGVyYXRlIGFuZCBlbmNvZGluZyByYXRlLCBidXQgaGVyZSBpcyBhIHdvcnN0IGNhc2UgZXN0aW1hdGU6CisgKgorICogbXAzYnVmZmVyX3NpemUgaW4gYnl0ZXMgPSAxLjI1Km51bV9zYW1wbGVzICsgNzIwMAorICoKKyAqIHJldHVybiBjb2RlID0gbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBpbiBtcDNidWZmZXIuICBjYW4gYmUgMAorICoKKyAqIE5PVEU6IHRoaXMgcm91dGluZSB1c2VzIExBTUUncyBpbnRlcm5hbCBQQ00gZGF0YSByZXByZXNlbnRhdGlvbiwKKyAqICdzYW1wbGVfdCcuICBJdCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IGFwcGxpY2F0aW9uLgorICogYXBwbGljYXRpb25zIHNob3VsZCB1c2UgbGFtZV9lbmNvZGVfYnVmZmVyKCksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsYW1lX2VuY29kZV9idWZmZXJfZmxvYXQoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGFtZV9lbmNvZGVfYnVmZmVyX2ludCgpCisgKiBldGMuLi4gZGVwZW5kaW5nIG9uIHdoYXQgdHlwZSBvZiBkYXRhIHRoZXkgYXJlIHdvcmtpbmcgd2l0aC4KKyovCitzdGF0aWMgaW50CitsYW1lX2VuY29kZV9idWZmZXJfc2FtcGxlX3QobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3QgYnVmZmVyX2xbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfdCBidWZmZXJfcltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuc2FtcGxlcywgdW5zaWduZWQgY2hhciAqbXAzYnVmLCBjb25zdCBpbnQgbXAzYnVmX3NpemUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIG1wM3NpemUgPSAwLCByZXQsIGksIGNoLCBtZl9uZWVkZWQ7CisgICAgaW50ICAgICBtcDNvdXQ7CisgICAgc2FtcGxlX3QgKm1mYnVmWzJdOworICAgIHNhbXBsZV90ICppbl9idWZmZXJbMl07CisKKyAgICBpZiAoZ2ZjLT5DbGFzc19JRCAhPSBMQU1FX0lEKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBpZiAobnNhbXBsZXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjb3B5IG91dCBhbnkgdGFncyB0aGF0IG1heSBoYXZlIGJlZW4gd3JpdHRlbiBpbnRvIGJpdHN0cmVhbSAqLworICAgIG1wM291dCA9IGNvcHlfYnVmZmVyKGdmYywgbXAzYnVmLCBtcDNidWZfc2l6ZSwgMCk7CisgICAgaWYgKG1wM291dCA8IDApCisgICAgICAgIHJldHVybiBtcDNvdXQ7ICAvKiBub3QgZW5vdWdoIGJ1ZmZlciBzcGFjZSAqLworICAgIG1wM2J1ZiArPSBtcDNvdXQ7CisgICAgbXAzc2l6ZSArPSBtcDNvdXQ7CisKKworICAgIGluX2J1ZmZlclswXSA9IGJ1ZmZlcl9sOworICAgIGluX2J1ZmZlclsxXSA9IGJ1ZmZlcl9yOworCisKKyAgICAvKiBBcHBseSB1c2VyIGRlZmluZWQgcmUtc2NhbGluZyAqLworCisgICAgLyogdXNlciBzZWxlY3RlZCBzY2FsaW5nIG9mIHRoZSBzYW1wbGVzICovCisgICAgaWYgKE5FUShnZnAtPnNjYWxlLCAwKSAmJiBORVEoZ2ZwLT5zY2FsZSwgMS4wKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgaW5fYnVmZmVyWzBdW2ldICo9IGdmcC0+c2NhbGU7CisgICAgICAgICAgICBpZiAoZ2ZjLT5jaGFubmVsc19vdXQgPT0gMikKKyAgICAgICAgICAgICAgICBpbl9idWZmZXJbMV1baV0gKj0gZ2ZwLT5zY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHVzZXIgc2VsZWN0ZWQgc2NhbGluZyBvZiB0aGUgY2hhbm5lbCAwIChsZWZ0KSBzYW1wbGVzICovCisgICAgaWYgKE5FUShnZnAtPnNjYWxlX2xlZnQsIDApICYmIE5FUShnZnAtPnNjYWxlX2xlZnQsIDEuMCkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGluX2J1ZmZlclswXVtpXSAqPSBnZnAtPnNjYWxlX2xlZnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1c2VyIHNlbGVjdGVkIHNjYWxpbmcgb2YgdGhlIGNoYW5uZWwgMSAocmlnaHQpIHNhbXBsZXMgKi8KKyAgICBpZiAoTkVRKGdmcC0+c2NhbGVfcmlnaHQsIDApICYmIE5FUShnZnAtPnNjYWxlX3JpZ2h0LCAxLjApKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBpbl9idWZmZXJbMV1baV0gKj0gZ2ZwLT5zY2FsZV9yaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIERvd25zYW1wbGUgdG8gTW9ubyBpZiAyIGNoYW5uZWxzIGluIGFuZCAxIGNoYW5uZWwgb3V0ICovCisgICAgaWYgKGdmcC0+bnVtX2NoYW5uZWxzID09IDIgJiYgZ2ZjLT5jaGFubmVsc19vdXQgPT0gMSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgaW5fYnVmZmVyWzBdW2ldID0gMC41ICogKChGTE9BVCkgaW5fYnVmZmVyWzBdW2ldICsgaW5fYnVmZmVyWzFdW2ldKTsKKyAgICAgICAgICAgIGluX2J1ZmZlclsxXVtpXSA9IDAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1mX25lZWRlZCA9IGNhbGNOZWVkZWQoZ2ZwKTsKKworICAgIG1mYnVmWzBdID0gZ2ZjLT5tZmJ1ZlswXTsKKyAgICBtZmJ1ZlsxXSA9IGdmYy0+bWZidWZbMV07CisKKyAgICB3aGlsZSAobnNhbXBsZXMgPiAwKSB7CisgICAgICAgIHNhbXBsZV90IGNvbnN0ICppbl9idWZmZXJfcHRyWzJdOworICAgICAgICBpbnQgICAgIG5faW4gPSAwOyAgICAvKiBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcyBwcm9jZXNzZWQgd2l0aCBmaWxsX2J1ZmZlciAqLworICAgICAgICBpbnQgICAgIG5fb3V0ID0gMDsgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBvdXRwdXQgd2l0aCBmaWxsX2J1ZmZlciAqLworICAgICAgICAvKiBuX2luIDw+IG5fb3V0IGlmIHdlIGFyZSByZXNhbXBsaW5nICovCisKKyAgICAgICAgaW5fYnVmZmVyX3B0clswXSA9IGluX2J1ZmZlclswXTsKKyAgICAgICAgaW5fYnVmZmVyX3B0clsxXSA9IGluX2J1ZmZlclsxXTsKKyAgICAgICAgLyogY29weSBpbiBuZXcgc2FtcGxlcyBpbnRvIG1mYnVmLCB3aXRoIHJlc2FtcGxpbmcgKi8KKyAgICAgICAgZmlsbF9idWZmZXIoZ2ZwLCBtZmJ1ZiwgJmluX2J1ZmZlcl9wdHJbMF0sIG5zYW1wbGVzLCAmbl9pbiwgJm5fb3V0KTsKKworICAgICAgICAvKiBjb21wdXRlIFJlcGxheUdhaW4gb2YgcmVzYW1wbGVkIGlucHV0IGlmIHJlcXVlc3RlZCAqLworICAgICAgICBpZiAoZ2ZjLT5maW5kUmVwbGF5R2FpbiAmJiAhZ2ZjLT5kZWNvZGVfb25fdGhlX2ZseSkKKyAgICAgICAgICAgIGlmIChBbmFseXplU2FtcGxlcworICAgICAgICAgICAgICAgIChnZmMtPnJnZGF0YSwgJm1mYnVmWzBdW2dmYy0+bWZfc2l6ZV0sICZtZmJ1ZlsxXVtnZmMtPm1mX3NpemVdLCBuX291dCwKKyAgICAgICAgICAgICAgICAgZ2ZjLT5jaGFubmVsc19vdXQpID09IEdBSU5fQU5BTFlTSVNfRVJST1IpCisgICAgICAgICAgICAgICAgcmV0dXJuIC02OworCisKKworICAgICAgICAvKiB1cGRhdGUgaW5fYnVmZmVyIGNvdW50ZXJzICovCisgICAgICAgIG5zYW1wbGVzIC09IG5faW47CisgICAgICAgIGluX2J1ZmZlclswXSArPSBuX2luOworICAgICAgICBpZiAoZ2ZjLT5jaGFubmVsc19vdXQgPT0gMikKKyAgICAgICAgICAgIGluX2J1ZmZlclsxXSArPSBuX2luOworCisgICAgICAgIC8qIHVwZGF0ZSBtZmJ1ZltdIGNvdW50ZXJzICovCisgICAgICAgIGdmYy0+bWZfc2l6ZSArPSBuX291dDsKKyAgICAgICAgYXNzZXJ0KGdmYy0+bWZfc2l6ZSA8PSBNRlNJWkUpOworCisgICAgICAgIC8qIGxhbWVfZW5jb2RlX2ZsdXNoIG1heSBoYXZlIHNldCBnZmMtPm1mX3NhbXBsZV90b19lbmNvZGUgdG8gMAorICAgICAgICAgKiBzbyB3ZSBoYXZlIHRvIHJlaW5pdGlhbGl6ZSBpdCBoZXJlIHdoZW4gdGhhdCBoYXBwZW5lZC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChnZmMtPm1mX3NhbXBsZXNfdG9fZW5jb2RlIDwgMSkgeworICAgICAgICAgICAgZ2ZjLT5tZl9zYW1wbGVzX3RvX2VuY29kZSA9IEVOQ0RFTEFZICsgUE9TVERFTEFZOworICAgICAgICB9CisgICAgICAgIGdmYy0+bWZfc2FtcGxlc190b19lbmNvZGUgKz0gbl9vdXQ7CisKKworICAgICAgICBpZiAoZ2ZjLT5tZl9zaXplID49IG1mX25lZWRlZCkgeworICAgICAgICAgICAgLyogZW5jb2RlIHRoZSBmcmFtZS4gICovCisgICAgICAgICAgICAvKiBtcDNidWYgICAgICAgICAgICAgID0gcG9pbnRlciB0byBjdXJyZW50IGxvY2F0aW9uIGluIGJ1ZmZlciAqLworICAgICAgICAgICAgLyogbXAzYnVmX3NpemUgICAgICAgICA9IHNpemUgb2Ygb3JpZ2luYWwgbXAzIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgPSAwIGlmIHdlIHNob3VsZCBub3Qgd29ycnkgYWJvdXQgdGhlICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIHNpemUgYmVjYXVzZSBjYWxsaW5nIHByb2dyYW0gaXMgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgdG8gbGF6eSB0byBjb21wdXRlIGl0ICovCisgICAgICAgICAgICAvKiBtcDNzaXplICAgICAgICAgICAgID0gc2l6ZSBvZiBkYXRhIHdyaXR0ZW4gdG8gYnVmZmVyIHNvIGZhciAqLworICAgICAgICAgICAgLyogbXAzYnVmX3NpemUtbXAzc2l6ZSA9IGFtb3VudCBvZiBzcGFjZSBhdmFsYWJsZSAgKi8KKworICAgICAgICAgICAgaW50ICAgICBidWZfc2l6ZSA9IG1wM2J1Zl9zaXplIC0gbXAzc2l6ZTsKKyAgICAgICAgICAgIGlmIChtcDNidWZfc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIGJ1Zl9zaXplID0gMDsKKworICAgICAgICAgICAgcmV0ID0gbGFtZV9lbmNvZGVfZnJhbWUoZ2ZwLCBtZmJ1ZlswXSwgbWZidWZbMV0sIG1wM2J1ZiwgYnVmX3NpemUpOworCisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgbXAzYnVmICs9IHJldDsKKyAgICAgICAgICAgIG1wM3NpemUgKz0gcmV0OworCisgICAgICAgICAgICAvKiBzaGlmdCBvdXQgb2xkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIGdmYy0+bWZfc2l6ZSAtPSBnZnAtPmZyYW1lc2l6ZTsKKyAgICAgICAgICAgIGdmYy0+bWZfc2FtcGxlc190b19lbmNvZGUgLT0gZ2ZwLT5mcmFtZXNpemU7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2ZjLT5tZl9zaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgIG1mYnVmW2NoXVtpXSA9IG1mYnVmW2NoXVtpICsgZ2ZwLT5mcmFtZXNpemVdOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydChuc2FtcGxlcyA9PSAwKTsKKworICAgIHJldHVybiBtcDNzaXplOworfQorCisKK2ludAorbGFtZV9lbmNvZGVfYnVmZmVyKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0IGludCBidWZmZXJfbFtdLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0IGludCBidWZmZXJfcltdLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuc2FtcGxlcywgdW5zaWduZWQgY2hhciAqbXAzYnVmLCBjb25zdCBpbnQgbXAzYnVmX3NpemUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGk7CisgICAgc2FtcGxlX3QgKmluX2J1ZmZlclsyXTsKKworICAgIGlmIChnZmMtPkNsYXNzX0lEICE9IExBTUVfSUQpCisgICAgICAgIHJldHVybiAtMzsKKworICAgIGlmIChuc2FtcGxlcyA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICh1cGRhdGVfaW5idWZmZXJfc2l6ZShnZmMsIG5zYW1wbGVzKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBpbl9idWZmZXJbMF0gPSBnZmMtPmluX2J1ZmZlcl8wOworICAgIGluX2J1ZmZlclsxXSA9IGdmYy0+aW5fYnVmZmVyXzE7CisKKyAgICAvKiBtYWtlIGEgY29weSBvZiBpbnB1dCBidWZmZXIsIGNoYW5naW5nIHR5cGUgdG8gc2FtcGxlX3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKykgeworICAgICAgICBpbl9idWZmZXJbMF1baV0gPSBidWZmZXJfbFtpXTsKKyAgICAgICAgaWYgKGdmYy0+Y2hhbm5lbHNfaW4gPiAxKQorICAgICAgICAgICAgaW5fYnVmZmVyWzFdW2ldID0gYnVmZmVyX3JbaV07CisgICAgfQorCisgICAgcmV0dXJuIGxhbWVfZW5jb2RlX2J1ZmZlcl9zYW1wbGVfdChnZnAsIGluX2J1ZmZlclswXSwgaW5fYnVmZmVyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNhbXBsZXMsIG1wM2J1ZiwgbXAzYnVmX3NpemUpOworfQorCisKK2ludAorbGFtZV9lbmNvZGVfYnVmZmVyX2Zsb2F0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGJ1ZmZlcl9sW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYnVmZmVyX3JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnNhbXBsZXMsIHVuc2lnbmVkIGNoYXIgKm1wM2J1ZiwgY29uc3QgaW50IG1wM2J1Zl9zaXplKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBpOworICAgIHNhbXBsZV90ICppbl9idWZmZXJbMl07CisKKyAgICBpZiAoZ2ZjLT5DbGFzc19JRCAhPSBMQU1FX0lEKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBpZiAobnNhbXBsZXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodXBkYXRlX2luYnVmZmVyX3NpemUoZ2ZjLCBuc2FtcGxlcykgIT0gMCkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgaW5fYnVmZmVyWzBdID0gZ2ZjLT5pbl9idWZmZXJfMDsKKyAgICBpbl9idWZmZXJbMV0gPSBnZmMtPmluX2J1ZmZlcl8xOworCisgICAgLyogbWFrZSBhIGNvcHkgb2YgaW5wdXQgYnVmZmVyLCBjaGFuZ2luZyB0eXBlIHRvIHNhbXBsZV90ICovCisgICAgZm9yIChpID0gMDsgaSA8IG5zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW5fYnVmZmVyWzBdW2ldID0gYnVmZmVyX2xbaV07CisgICAgICAgIGlmIChnZmMtPmNoYW5uZWxzX2luID4gMSkKKyAgICAgICAgICAgIGluX2J1ZmZlclsxXVtpXSA9IGJ1ZmZlcl9yW2ldOworICAgIH0KKworICAgIHJldHVybiBsYW1lX2VuY29kZV9idWZmZXJfc2FtcGxlX3QoZ2ZwLCBpbl9idWZmZXJbMF0sIGluX2J1ZmZlclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zYW1wbGVzLCBtcDNidWYsIG1wM2J1Zl9zaXplKTsKK30KKworCitpbnQKK2xhbWVfZW5jb2RlX2J1ZmZlcl9pbnQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJfbFtdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyX3JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5zYW1wbGVzLCB1bnNpZ25lZCBjaGFyICptcDNidWYsIGNvbnN0IGludCBtcDNidWZfc2l6ZSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgaTsKKyAgICBzYW1wbGVfdCAqaW5fYnVmZmVyWzJdOworCisgICAgaWYgKGdmYy0+Q2xhc3NfSUQgIT0gTEFNRV9JRCkKKyAgICAgICAgcmV0dXJuIC0zOworCisgICAgaWYgKG5zYW1wbGVzID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHVwZGF0ZV9pbmJ1ZmZlcl9zaXplKGdmYywgbnNhbXBsZXMpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIGluX2J1ZmZlclswXSA9IGdmYy0+aW5fYnVmZmVyXzA7CisgICAgaW5fYnVmZmVyWzFdID0gZ2ZjLT5pbl9idWZmZXJfMTsKKworICAgIC8qIG1ha2UgYSBjb3B5IG9mIGlucHV0IGJ1ZmZlciwgY2hhbmdpbmcgdHlwZSB0byBzYW1wbGVfdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrKSB7CisgICAgICAgIC8qIGludGVybmFsIGNvZGUgZXhwZWN0cyArLy0gMzI3NjguMCAqLworICAgICAgICBpbl9idWZmZXJbMF1baV0gPSBidWZmZXJfbFtpXSAqICgxLjAgLyAoMUwgPDwgKDggKiBzaXplb2YoaW50KSAtIDE2KSkpOworICAgICAgICBpZiAoZ2ZjLT5jaGFubmVsc19pbiA+IDEpCisgICAgICAgICAgICBpbl9idWZmZXJbMV1baV0gPSBidWZmZXJfcltpXSAqICgxLjAgLyAoMUwgPDwgKDggKiBzaXplb2YoaW50KSAtIDE2KSkpOworICAgIH0KKworICAgIHJldHVybiBsYW1lX2VuY29kZV9idWZmZXJfc2FtcGxlX3QoZ2ZwLCBpbl9idWZmZXJbMF0sIGluX2J1ZmZlclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zYW1wbGVzLCBtcDNidWYsIG1wM2J1Zl9zaXplKTsKK30KKworCisKKworaW50CitsYW1lX2VuY29kZV9idWZmZXJfbG9uZzIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBidWZmZXJfbFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgYnVmZmVyX3JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnNhbXBsZXMsIHVuc2lnbmVkIGNoYXIgKm1wM2J1ZiwgY29uc3QgaW50IG1wM2J1Zl9zaXplKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBpOworICAgIHNhbXBsZV90ICppbl9idWZmZXJbMl07CisKKyAgICBpZiAoZ2ZjLT5DbGFzc19JRCAhPSBMQU1FX0lEKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBpZiAobnNhbXBsZXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodXBkYXRlX2luYnVmZmVyX3NpemUoZ2ZjLCBuc2FtcGxlcykgIT0gMCkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgaW5fYnVmZmVyWzBdID0gZ2ZjLT5pbl9idWZmZXJfMDsKKyAgICBpbl9idWZmZXJbMV0gPSBnZmMtPmluX2J1ZmZlcl8xOworCisgICAgLyogbWFrZSBhIGNvcHkgb2YgaW5wdXQgYnVmZmVyLCBjaGFuZ2luZyB0eXBlIHRvIHNhbXBsZV90ICovCisgICAgZm9yIChpID0gMDsgaSA8IG5zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgLyogaW50ZXJuYWwgY29kZSBleHBlY3RzICsvLSAzMjc2OC4wICovCisgICAgICAgIGluX2J1ZmZlclswXVtpXSA9IGJ1ZmZlcl9sW2ldICogKDEuMCAvICgxTCA8PCAoOCAqIHNpemVvZihsb25nKSAtIDE2KSkpOworICAgICAgICBpZiAoZ2ZjLT5jaGFubmVsc19pbiA+IDEpCisgICAgICAgICAgICBpbl9idWZmZXJbMV1baV0gPSBidWZmZXJfcltpXSAqICgxLjAgLyAoMUwgPDwgKDggKiBzaXplb2YobG9uZykgLSAxNikpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGFtZV9lbmNvZGVfYnVmZmVyX3NhbXBsZV90KGdmcCwgaW5fYnVmZmVyWzBdLCBpbl9idWZmZXJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2FtcGxlcywgbXAzYnVmLCBtcDNidWZfc2l6ZSk7CisKK30KKworCisKK2ludAorbGFtZV9lbmNvZGVfYnVmZmVyX2xvbmcobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGJ1ZmZlcl9sW10sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGJ1ZmZlcl9yW10sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnNhbXBsZXMsIHVuc2lnbmVkIGNoYXIgKm1wM2J1ZiwgY29uc3QgaW50IG1wM2J1Zl9zaXplKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBpOworICAgIHNhbXBsZV90ICppbl9idWZmZXJbMl07CisKKyAgICBpZiAoZ2ZjLT5DbGFzc19JRCAhPSBMQU1FX0lEKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBpZiAobnNhbXBsZXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodXBkYXRlX2luYnVmZmVyX3NpemUoZ2ZjLCBuc2FtcGxlcykgIT0gMCkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgaW5fYnVmZmVyWzBdID0gZ2ZjLT5pbl9idWZmZXJfMDsKKyAgICBpbl9idWZmZXJbMV0gPSBnZmMtPmluX2J1ZmZlcl8xOworCisgICAgLyogbWFrZSBhIGNvcHkgb2YgaW5wdXQgYnVmZmVyLCBjaGFuZ2luZyB0eXBlIHRvIHNhbXBsZV90ICovCisgICAgZm9yIChpID0gMDsgaSA8IG5zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW5fYnVmZmVyWzBdW2ldID0gYnVmZmVyX2xbaV07CisgICAgICAgIGlmIChnZmMtPmNoYW5uZWxzX2luID4gMSkKKyAgICAgICAgICAgIGluX2J1ZmZlclsxXVtpXSA9IGJ1ZmZlcl9yW2ldOworICAgIH0KKworICAgIHJldHVybiBsYW1lX2VuY29kZV9idWZmZXJfc2FtcGxlX3QoZ2ZwLCBpbl9idWZmZXJbMF0sIGluX2J1ZmZlclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zYW1wbGVzLCBtcDNidWYsIG1wM2J1Zl9zaXplKTsKK30KKworCisKKworCisKKworCisKKworCitpbnQKK2xhbWVfZW5jb2RlX2J1ZmZlcl9pbnRlcmxlYXZlZChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBpbnQgYnVmZmVyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5zYW1wbGVzLCB1bnNpZ25lZCBjaGFyICptcDNidWYsIGludCBtcDNidWZfc2l6ZSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgaTsKKyAgICBzYW1wbGVfdCAqaW5fYnVmZmVyWzJdOworCisgICAgaWYgKHVwZGF0ZV9pbmJ1ZmZlcl9zaXplKGdmYywgbnNhbXBsZXMpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIGluX2J1ZmZlclswXSA9IGdmYy0+aW5fYnVmZmVyXzA7CisgICAgaW5fYnVmZmVyWzFdID0gZ2ZjLT5pbl9idWZmZXJfMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGluX2J1ZmZlclswXVtpXSA9IGJ1ZmZlclsyICogaV07CisgICAgICAgIGluX2J1ZmZlclsxXVtpXSA9IGJ1ZmZlclsyICogaSArIDFdOworICAgIH0KKyAgICByZXR1cm4gbGFtZV9lbmNvZGVfYnVmZmVyX3NhbXBsZV90KGdmcCwgaW5fYnVmZmVyWzBdLCBpbl9idWZmZXJbMV0sIG5zYW1wbGVzLCBtcDNidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDNidWZfc2l6ZSk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50CitsYW1lX2VuY29kZShsYW1lX2dsb2JhbF9mbGFncyAqIGNvbnN0IGdmcCwKKyAgICAgICAgICAgIGNvbnN0IHNob3J0IGludCBpbl9idWZmZXJbMl1bMTE1Ml0sIHVuc2lnbmVkIGNoYXIgKmNvbnN0IG1wM2J1ZiwgY29uc3QgaW50IHNpemUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIGlmIChnZmMtPkNsYXNzX0lEICE9IExBTUVfSUQpCisgICAgICAgIHJldHVybiAtMzsKKworICAgIHJldHVybiBsYW1lX2VuY29kZV9idWZmZXIoZ2ZwLCBpbl9idWZmZXJbMF0sIGluX2J1ZmZlclsxXSwgZ2ZwLT5mcmFtZXNpemUsIG1wM2J1Ziwgc2l6ZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRmx1c2ggbXAzIGJ1ZmZlciwgcGFkIHdpdGggYW5jaWxsYXJ5IGRhdGEgc28gbGFzdCBmcmFtZSBpcyBjb21wbGV0ZS4KKyBSZXNldCByZXNlcnZvaXIgc2l6ZSB0byAwCisgYnV0IGtlZXAgYWxsIFBDTSBzYW1wbGVzIGFuZCBNRENUIGRhdGEgaW4gbWVtb3J5CisgVGhpcyBvcHRpb24gaXMgdXNlZCB0byBicmVhayBhIGxhcmdlIGZpbGUgaW50byBzZXZlcmFsIG1wMyBmaWxlcworIHRoYXQgd2hlbiBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgd2lsbCBkZWNvZGUgd2l0aCBubyBnYXBzCisgQmVjYXVzZSB3ZSBzZXQgdGhlIHJlc2Vydm9pcj0wLCB0aGV5IHdpbGwgYWxzbyBkZWNvZGUgc2VwZXJhdGVseQorIHdpdGggbm8gZXJyb3JzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitsYW1lX2VuY29kZV9mbHVzaF9ub2dhcChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgdW5zaWduZWQgY2hhciAqbXAzYnVmZmVyLCBpbnQgbXAzYnVmZmVyX3NpemUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBmbHVzaF9iaXRzdHJlYW0oZ2ZwKTsKKyAgICByZXR1cm4gY29weV9idWZmZXIoZ2ZjLCBtcDNidWZmZXIsIG1wM2J1ZmZlcl9zaXplLCAxKTsKK30KKworCisvKiBjYWxsZWQgYnkgbGFtZV9pbml0X3BhcmFtcy4gIFlvdSBjYW4gYWxzbyBjYWxsIHRoaXMgYWZ0ZXIgZmx1c2hfbm9nYXAKKyAgIGlmIHlvdSB3YW50IHRvIHdyaXRlIG5ldyBpZDN2MiBhbmQgWGluZyBWQlIgdGFncyBpbnRvIHRoZSBiaXRzdHJlYW0gKi8KK2ludAorbGFtZV9pbml0X2JpdHN0cmVhbShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGdmcC0+ZnJhbWVOdW0gPSAwOworCisgICAgaWYgKGdmcC0+d3JpdGVfaWQzdGFnX2F1dG9tYXRpYykgeworICAgICAgICAodm9pZCkgaWQzdGFnX3dyaXRlX3YyKGdmcCk7CisgICAgfQorICAgIC8qIGluaXRpYWxpemUgaGlzdG9ncmFtIGRhdGEgb3B0aW9uYWxseSB1c2VkIGJ5IGZyb250ZW5kICovCisgICAgbWVtc2V0KGdmYy0+Yml0cmF0ZV9zdGVyZW9Nb2RlX0hpc3QsIDAsIHNpemVvZihnZmMtPmJpdHJhdGVfc3RlcmVvTW9kZV9IaXN0KSk7CisgICAgbWVtc2V0KGdmYy0+Yml0cmF0ZV9ibG9ja1R5cGVfSGlzdCwgMCwgc2l6ZW9mKGdmYy0+Yml0cmF0ZV9ibG9ja1R5cGVfSGlzdCkpOworCisgICAgZ2ZjLT5QZWFrU2FtcGxlID0gMC4wOworCisgICAgLyogV3JpdGUgaW5pdGlhbCBWQlIgSGVhZGVyIHRvIGJpdHN0cmVhbSBhbmQgaW5pdCBWQlIgZGF0YSAqLworICAgIGlmIChnZnAtPmJXcml0ZVZiclRhZykKKyAgICAgICAgKHZvaWQpIEluaXRWYnJUYWcoZ2ZwKTsKKworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZmx1c2ggaW50ZXJuYWwgUENNIHNhbXBsZSBidWZmZXJzLCB0aGVuIG1wMyBidWZmZXJzICAgICAgICAgICAqLworLyogdGhlbiB3cml0ZSBpZDMgdjEgdGFncyBpbnRvIGJpdHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK2xhbWVfZW5jb2RlX2ZsdXNoKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCB1bnNpZ25lZCBjaGFyICptcDNidWZmZXIsIGludCBtcDNidWZmZXJfc2l6ZSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIHNob3J0IGludCBidWZmZXJbMl1bMTE1Ml07CisgICAgaW50ICAgICBpbXAzID0gMCwgbXAzY291bnQsIG1wM2J1ZmZlcl9zaXplX3JlbWFpbmluZzsKKworICAgIC8qIHdlIGFsd2F5cyBhZGQgUE9TVERFTEFZPTI4OCBwYWRkaW5nIHRvIG1ha2Ugc3VyZSBncmFudWxlIHdpdGggcmVhbAorICAgICAqIGRhdGEgY2FuIGJlIGNvbXBsZXR5IGRlY29kZWQgKGJlY2F1c2Ugb2YgNTAlIG92ZXJsYXAgd2l0aCBuZXh0IGdyYW51bGUgKi8KKyAgICBpbnQgICAgIGVuZF9wYWRkaW5nOworICAgIGludCAgICAgZnJhbWVzX2xlZnQ7CisgICAgaW50ICAgICBzYW1wbGVzX3RvX2VuY29kZSA9IGdmYy0+bWZfc2FtcGxlc190b19lbmNvZGUgLSBQT1NUREVMQVk7CisgICAgaW50ICAgICBtZl9uZWVkZWQgPSBjYWxjTmVlZGVkKGdmcCk7CisKKyAgICAvKiBXYXMgZmx1c2ggYWxyZWFkeSBjYWxsZWQ/ICovCisgICAgaWYgKGdmYy0+bWZfc2FtcGxlc190b19lbmNvZGUgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgbXAzY291bnQgPSAwOworCisgICAgaWYgKGdmcC0+aW5fc2FtcGxlcmF0ZSAhPSBnZnAtPm91dF9zYW1wbGVyYXRlKSB7CisgICAgICAgIC8qIGRlbGF5IGR1ZSB0byByZXNhbXBsaW5nOyBuZWVkcyB0byBiZSBmaXhlZCwgaWYgcmVzYW1wbGluZyBjb2RlIGdldHMgY2hhbmdlZCAqLworICAgICAgICBzYW1wbGVzX3RvX2VuY29kZSArPSAxNi4qZ2ZwLT5vdXRfc2FtcGxlcmF0ZS9nZnAtPmluX3NhbXBsZXJhdGU7CisgICAgfQorICAgIGVuZF9wYWRkaW5nID0gZ2ZwLT5mcmFtZXNpemUgLSAoc2FtcGxlc190b19lbmNvZGUgJSBnZnAtPmZyYW1lc2l6ZSk7CisgICAgaWYgKGVuZF9wYWRkaW5nIDwgNTc2KQorICAgICAgICBlbmRfcGFkZGluZyArPSBnZnAtPmZyYW1lc2l6ZTsKKyAgICBnZnAtPmVuY29kZXJfcGFkZGluZyA9IGVuZF9wYWRkaW5nOworCisgICAgZnJhbWVzX2xlZnQgPSAoc2FtcGxlc190b19lbmNvZGUgKyBlbmRfcGFkZGluZykgLyBnZnAtPmZyYW1lc2l6ZTsKKworICAgIC8qIHNlbmQgaW4gYSBmcmFtZSBvZiAwIHBhZGRpbmcgdW50aWwgYWxsIGludGVybmFsIHNhbXBsZSBidWZmZXJzIGFyZSBmbHVzaGVkICovCisgICAgd2hpbGUgKGZyYW1lc19sZWZ0ID4gMCAmJiBpbXAzID49IDApIHsKKyAgICAgICAgaW50IGJ1bmNoID0gbWZfbmVlZGVkLWdmYy0+bWZfc2l6ZTsKKyAgICAgICAgaW50IGZyYW1lX251bSA9IGdmcC0+ZnJhbWVOdW07CisgICAgICAgIAorICAgICAgICBidW5jaCAqPSBnZnAtPmluX3NhbXBsZXJhdGU7CisgICAgICAgIGJ1bmNoIC89IGdmcC0+b3V0X3NhbXBsZXJhdGU7CisgICAgICAgIGlmIChidW5jaCA+IDExNTIpIGJ1bmNoID0gMTE1MjsKKyAgICAgICAgaWYgKGJ1bmNoIDwgMSkgYnVuY2ggPSAxOworCisgICAgICAgIG1wM2J1ZmZlcl9zaXplX3JlbWFpbmluZyA9IG1wM2J1ZmZlcl9zaXplIC0gbXAzY291bnQ7CisKKyAgICAgICAgLyogaWYgdXNlciBzcGVjaWZlZCBidWZmZXIgc2l6ZSA9IDAsIGRvbnQgY2hlY2sgc2l6ZSAqLworICAgICAgICBpZiAobXAzYnVmZmVyX3NpemUgPT0gMCkKKyAgICAgICAgICAgIG1wM2J1ZmZlcl9zaXplX3JlbWFpbmluZyA9IDA7CisKKyAgICAgICAgaW1wMyA9IGxhbWVfZW5jb2RlX2J1ZmZlcihnZnAsIGJ1ZmZlclswXSwgYnVmZmVyWzFdLCBidW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDNidWZmZXIsIG1wM2J1ZmZlcl9zaXplX3JlbWFpbmluZyk7CisgICAgICAgIAorICAgICAgICBtcDNidWZmZXIgKz0gaW1wMzsKKyAgICAgICAgbXAzY291bnQgKz0gaW1wMzsKKyAgICAgICAgZnJhbWVzX2xlZnQgLT0gKGZyYW1lX251bSAhPSBnZnAtPmZyYW1lTnVtKSA/IDEgOiAwOworICAgIH0KKyAgICAvKiBTZXQgZ2ZjLT5tZl9zYW1wbGVzX3RvX2VuY29kZSB0byAwLCBzbyB3ZSBtYXkgZGV0ZWN0CisgICAgICogYW5kIGJyZWFrIGxvb3BzIGNhbGxpbmcgaXQgbW9yZSB0aGFuIG9uY2UgaW4gYSByb3cuCisgICAgICovCisgICAgZ2ZjLT5tZl9zYW1wbGVzX3RvX2VuY29kZSA9IDA7CisKKyAgICBpZiAoaW1wMyA8IDApIHsKKyAgICAgICAgLyogc29tZSB0eXBlIG9mIGZhdGFsIGVycm9yICovCisgICAgICAgIHJldHVybiBpbXAzOworICAgIH0KKworICAgIG1wM2J1ZmZlcl9zaXplX3JlbWFpbmluZyA9IG1wM2J1ZmZlcl9zaXplIC0gbXAzY291bnQ7CisgICAgLyogaWYgdXNlciBzcGVjaWZlZCBidWZmZXIgc2l6ZSA9IDAsIGRvbnQgY2hlY2sgc2l6ZSAqLworICAgIGlmIChtcDNidWZmZXJfc2l6ZSA9PSAwKQorICAgICAgICBtcDNidWZmZXJfc2l6ZV9yZW1haW5pbmcgPSAwOworCisgICAgLyogbXAzIHJlbGF0ZWQgc3R1ZmYuICBiaXQgYnVmZmVyIG1pZ2h0IHN0aWxsIGNvbnRhaW4gc29tZSBtcDMgZGF0YSAqLworICAgIGZsdXNoX2JpdHN0cmVhbShnZnApOworICAgIGltcDMgPSBjb3B5X2J1ZmZlcihnZmMsIG1wM2J1ZmZlciwgbXAzYnVmZmVyX3NpemVfcmVtYWluaW5nLCAxKTsKKyAgICBpZiAoaW1wMyA8IDApIHsKKyAgICAgICAgLyogc29tZSB0eXBlIG9mIGZhdGFsIGVycm9yICovCisgICAgICAgIHJldHVybiBpbXAzOworICAgIH0KKyAgICBtcDNidWZmZXIgKz0gaW1wMzsKKyAgICBtcDNjb3VudCArPSBpbXAzOworICAgIG1wM2J1ZmZlcl9zaXplX3JlbWFpbmluZyA9IG1wM2J1ZmZlcl9zaXplIC0gbXAzY291bnQ7CisgICAgLyogaWYgdXNlciBzcGVjaWZlZCBidWZmZXIgc2l6ZSA9IDAsIGRvbnQgY2hlY2sgc2l6ZSAqLworICAgIGlmIChtcDNidWZmZXJfc2l6ZSA9PSAwKQorICAgICAgICBtcDNidWZmZXJfc2l6ZV9yZW1haW5pbmcgPSAwOworCisgICAgaWYgKGdmcC0+d3JpdGVfaWQzdGFnX2F1dG9tYXRpYykgeworICAgICAgICAvKiB3cml0ZSBhIGlkMyB0YWcgdG8gdGhlIGJpdHN0cmVhbSAqLworICAgICAgICAodm9pZCkgaWQzdGFnX3dyaXRlX3YxKGdmcCk7CisKKyAgICAgICAgaW1wMyA9IGNvcHlfYnVmZmVyKGdmYywgbXAzYnVmZmVyLCBtcDNidWZmZXJfc2l6ZV9yZW1haW5pbmcsIDApOworCisgICAgICAgIGlmIChpbXAzIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGltcDM7CisgICAgICAgIH0KKyAgICAgICAgbXAzY291bnQgKz0gaW1wMzsKKyAgICB9CisjaWYgMAorICAgIHsKKyAgICAgICAgaW50IGNvbnN0IGVkID0gZ2ZwLT5lbmNvZGVyX2RlbGF5OworICAgICAgICBpbnQgY29uc3QgZXAgPSBnZnAtPmVuY29kZXJfcGFkZGluZzsKKyAgICAgICAgaW50IGNvbnN0IG5zID0gKGdmcC0+ZnJhbWVOdW0qZ2ZwLT5mcmFtZXNpemUpIC0gKGVkICsgZXApOyAKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gbnM7CisgICAgICAgIGR1cmF0aW9uIC89IGdmcC0+b3V0X3NhbXBsZXJhdGU7CisgICAgICAgIE1TR0YoZ2ZjLCAiZnJhbWVzPSVkXG4iLCBnZnAtPmZyYW1lTnVtKTsKKyAgICAgICAgTVNHRihnZmMsICJmcmFtZXNpemU9JWRcbiIsIGdmcC0+ZnJhbWVzaXplKTsKKyAgICAgICAgTVNHRihnZmMsICJlbmNvZGVyIGRlbGF5PSVkXG4iLCBlZCk7CisgICAgICAgIE1TR0YoZ2ZjLCAiZW5jb2RlciBwYWRkaW5nPSVkXG4iLCBlcCk7CisgICAgICAgIE1TR0YoZ2ZjLCAic2FtcGxlIGNvdW50PSVkICglZylcbiIsIG5zLCBnZnAtPmluX3NhbXBsZXJhdGUqZHVyYXRpb24pOworICAgICAgICBNU0dGKGdmYywgImR1cmF0aW9uPSVnIHNlY1xuIiwgZHVyYXRpb24pOworICAgICAgICBNU0dGKGdmYywgIm1mX3NpemU9JWRcbiIsZ2ZjLT5tZl9zaXplKTsKKyAgICAgICAgTVNHRihnZmMsICJtZl9zYW1wbGVzX3RvX2VuY29kZT0lZFxuIixnZmMtPm1mX3NhbXBsZXNfdG9fZW5jb2RlKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gbXAzY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgbGFtZV9jbG9zZSAoKQorICoKKyAqICBmcmVlcyBpbnRlcm5hbCBidWZmZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK2xhbWVfY2xvc2UobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKGdmcCAmJiBnZnAtPmNsYXNzX2lkID09IExBTUVfSUQpIHsKKyAgICAgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICAgICAgZ2ZwLT5jbGFzc19pZCA9IDA7CisgICAgICAgIGlmIChOVUxMID09IGdmYyB8fCBnZmMtPkNsYXNzX0lEICE9IExBTUVfSUQpIHsKKyAgICAgICAgICAgIHJldCA9IC0zOworICAgICAgICB9CisgICAgICAgIGlmIChOVUxMICE9IGdmYykgeworICAgICAgICAgICAgZ2ZjLT5DbGFzc19JRCA9IDA7CisgICAgICAgICAgICAvKiB0aGlzIHJvdXRpbmUgd2lsbCBmcmVlIGFsbCBtYWxsb2MnZCBkYXRhIGluIGdmYywgYW5kIHRoZW4gZnJlZSBnZmM6ICovCisgICAgICAgICAgICBmcmVlZ2ZjKGdmYyk7CisgICAgICAgICAgICBnZnAtPmludGVybmFsX2ZsYWdzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2ZwLT5sYW1lX2FsbG9jYXRlZF9nZnApIHsKKyAgICAgICAgICAgIGdmcC0+bGFtZV9hbGxvY2F0ZWRfZ2ZwID0gMDsKKyAgICAgICAgICAgIGZyZWUoZ2ZwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmbHVzaCBpbnRlcm5hbCBtcDMgYnVmZmVycywgYW5kIGZyZWUgaW50ZXJuYWwgYnVmZmVycyAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREVQUkVDQVRFRF9PUl9PQlNPTEVURV9DT0RFX1JFTU9WRUQKKy8qIE9CU09MRVRFICovCitpbnQgQ0RFQ0wKK2xhbWVfZW5jb2RlX2ZpbmlzaChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgdW5zaWduZWQgY2hhciAqbXAzYnVmZmVyLCBpbnQgbXAzYnVmZmVyX3NpemUpOworI2Vsc2UKKyNlbmRpZgorCitpbnQKK2xhbWVfZW5jb2RlX2ZpbmlzaChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgdW5zaWduZWQgY2hhciAqbXAzYnVmZmVyLCBpbnQgbXAzYnVmZmVyX3NpemUpCit7CisgICAgaW50IGNvbnN0IHJldCA9IGxhbWVfZW5jb2RlX2ZsdXNoKGdmcCwgbXAzYnVmZmVyLCBtcDNidWZmZXJfc2l6ZSk7CisKKyAgICAodm9pZCkgbGFtZV9jbG9zZShnZnApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogd3JpdGUgVkJSIFhpbmcgaGVhZGVyLCBhbmQgSUQzIHZlcnNpb24gMSB0YWcsIGlmIGFza2VkIGZvciAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBsYW1lX21wM190YWdzX2ZpZChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgRklMRSAqIGZwU3RyZWFtKTsKKwordm9pZAorbGFtZV9tcDNfdGFnc19maWQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIEZJTEUgKiBmcFN0cmVhbSkKK3sKKyAgICBpZiAoZ2ZwLT5iV3JpdGVWYnJUYWcpIHsKKyAgICAgICAgLyogV3JpdGUgWGluZyBoZWFkZXIgYWdhaW4gKi8KKyAgICAgICAgaWYgKGZwU3RyZWFtICYmICFmc2VlayhmcFN0cmVhbSwgMCwgU0VFS19TRVQpKSB7CisgICAgICAgICAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgICAgICAgICAgaW50ICAgICByYyA9IFB1dFZiclRhZyhnZnAsIGZwU3RyZWFtKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmMpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogT0sgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICBFUlJPUkYoZ2ZjLCAiRXJyb3I6IGNvdWxkIG5vdCB1cGRhdGUgTEFNRSB0YWcuXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAtMjoKKyAgICAgICAgICAgICAgICBFUlJPUkYoZ2ZjLCAiRXJyb3I6IGNvdWxkIG5vdCB1cGRhdGUgTEFNRSB0YWcsIGZpbGUgbm90IHNlZWthYmxlLlxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgLTM6CisgICAgICAgICAgICAgICAgRVJST1JGKGdmYywgIkVycm9yOiBjb3VsZCBub3QgdXBkYXRlIExBTUUgdGFnLCBmaWxlIG5vdCByZWFkYWJsZS5cbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworLyogaW5pdGlhbGl6ZSBtcDMgZW5jb2RlciAqLworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECitzdGF0aWMKKyNlbHNlCisjZW5kaWYKK2ludAorbGFtZV9pbml0X29sZChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmM7CisgICAgCisgICAgZGlzYWJsZV9GUEUoKTsgICAgICAvKiBkaXNhYmxlIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMgKi8KKworICAgIG1lbXNldChnZnAsIDAsIHNpemVvZihsYW1lX2dsb2JhbF9mbGFncykpOworCisgICAgZ2ZwLT5jbGFzc19pZCA9IExBTUVfSUQ7CisKKyAgICBpZiAoTlVMTCA9PSAoZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFncyA9IGNhbGxvYygxLCBzaXplb2YobGFtZV9pbnRlcm5hbF9mbGFncykpKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogR2xvYmFsIGZsYWdzLiAgc2V0IGRlZmF1bHRzIGhlcmUgZm9yIG5vbi16ZXJvIHZhbHVlcyAqLworICAgIC8qIHNlZSBsYW1lLmggZm9yIGRlc2NyaXB0aW9uICovCisgICAgLyogc2V0IGludGVnZXIgdmFsdWVzIHRvIC0xIHRvIG1lYW4gdGhhdCBMQU1FIHdpbGwgY29tcHV0ZSB0aGUKKyAgICAgKiBiZXN0IHZhbHVlLCBVTkxFU1MgdGhlIGNhbGxpbmcgcHJvZ3JhbSBhcyBzZXQgaXQKKyAgICAgKiAoYW5kIHRoZSB2YWx1ZSBpcyBubyBsb25nZXIgLTEpCisgICAgICovCisKKworICAgIGdmcC0+bW9kZSA9IE5PVF9TRVQ7CisgICAgZ2ZwLT5vcmlnaW5hbCA9IDE7CisgICAgZ2ZwLT5pbl9zYW1wbGVyYXRlID0gNDQxMDA7CisgICAgZ2ZwLT5udW1fY2hhbm5lbHMgPSAyOworICAgIGdmcC0+bnVtX3NhbXBsZXMgPSBNQVhfVV8zMl9OVU07CisKKyAgICBnZnAtPmJXcml0ZVZiclRhZyA9IDE7CisgICAgZ2ZwLT5xdWFsaXR5ID0gLTE7CisgICAgZ2ZwLT5zaG9ydF9ibG9ja3MgPSBzaG9ydF9ibG9ja19ub3Rfc2V0OworICAgIGdmYy0+c3ViYmxvY2tfZ2FpbiA9IC0xOworCisgICAgZ2ZwLT5sb3dwYXNzZnJlcSA9IDA7CisgICAgZ2ZwLT5oaWdocGFzc2ZyZXEgPSAwOworICAgIGdmcC0+bG93cGFzc3dpZHRoID0gLTE7CisgICAgZ2ZwLT5oaWdocGFzc3dpZHRoID0gLTE7CisKKyAgICBnZnAtPlZCUiA9IHZicl9vZmY7CisgICAgZ2ZwLT5WQlJfcSA9IDQ7CisgICAgZ2ZwLT5BVEhjdXJ2ZSA9IC0xOworICAgIGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzID0gMTI4OworICAgIGdmcC0+VkJSX21pbl9iaXRyYXRlX2ticHMgPSAwOworICAgIGdmcC0+VkJSX21heF9iaXRyYXRlX2ticHMgPSAwOworICAgIGdmcC0+VkJSX2hhcmRfbWluID0gMDsKKyAgICBnZmMtPlZCUl9taW5fYml0cmF0ZSA9IDE7IC8qIG5vdCAgMCA/Pz8/PyAqLworICAgIGdmYy0+VkJSX21heF9iaXRyYXRlID0gMTM7IC8qIG5vdCAxNCA/Pz8/PyAqLworCisgICAgZ2ZwLT5xdWFudF9jb21wID0gLTE7CisgICAgZ2ZwLT5xdWFudF9jb21wX3Nob3J0ID0gLTE7CisKKyAgICBnZnAtPm1zZml4ID0gLTE7CisKKyAgICBnZmMtPnJlc2FtcGxlX3JhdGlvID0gMTsKKworICAgIGdmYy0+T2xkVmFsdWVbMF0gPSAxODA7CisgICAgZ2ZjLT5PbGRWYWx1ZVsxXSA9IDE4MDsKKyAgICBnZmMtPkN1cnJlbnRTdGVwWzBdID0gNDsKKyAgICBnZmMtPkN1cnJlbnRTdGVwWzFdID0gNDsKKyAgICBnZmMtPm1hc2tpbmdfbG93ZXIgPSAxOworICAgIGdmYy0+bnNQc3kuYXR0YWNrdGhyZSA9IC0xOworICAgIGdmYy0+bnNQc3kuYXR0YWNrdGhyZV9zID0gLTE7CisKKyAgICBnZnAtPnNjYWxlID0gLTE7CisKKyAgICBnZnAtPmF0aGFhX3R5cGUgPSAtMTsKKyAgICBnZnAtPkFUSHR5cGUgPSAtMTsgIC8qIGRlZmF1bHQgPSAtMSA9IHNldCBpbiBsYW1lX2luaXRfcGFyYW1zICovCisgICAgZ2ZwLT5hdGhhYV9sb3VkYXBwcm94ID0gLTE7IC8qIDEgPSBmbGF0IGxvdWRuZXNzIGFwcHJveC4gKHRvdGFsIGVuZXJneSkgKi8KKyAgICAvKiAyID0gZXF1YWwgbG91ZG5lc3MgY3VydmUgKi8KKyAgICBnZnAtPmF0aGFhX3NlbnNpdGl2aXR5ID0gMC4wOyAvKiBubyBvZmZzZXQgKi8KKyAgICBnZnAtPnVzZVRlbXBvcmFsID0gLTE7CisgICAgZ2ZwLT5pbnRlckNoUmF0aW8gPSAtMTsKKworICAgIC8qIFRoZSByZWFzb24gZm9yCisgICAgICogICAgICAgaW50IG1mX3NhbXBsZXNfdG9fZW5jb2RlID0gRU5DREVMQVkgKyBQT1NUREVMQVk7CisgICAgICogRU5DREVMQVkgPSBpbnRlcm5hbCBlbmNvZGVyIGRlbGF5LiAgQW5kIHRoZW4gd2UgaGF2ZSB0byBhZGQgUE9TVERFTEFZPTI4OAorICAgICAqIGJlY2F1c2Ugb2YgdGhlIDUwJSBNRENUIG92ZXJsYXAuICBBIDU3NiBNRENUIGdyYW51bGUgZGVjb2RlcyB0bworICAgICAqIDExNTIgc2FtcGxlcy4gIFRvIHN5bnRoZXNpemUgdGhlIDU3NiBzYW1wbGVzIGNlbnRlcmVkIHVuZGVyIHRoaXMgZ3JhbnVsZQorICAgICAqIHdlIG5lZWQgdGhlIHByZXZpb3VzIGdyYW51bGUgZm9yIHRoZSBmaXJzdCAyODggc2FtcGxlcyAobm8gcHJvYmxlbSksIGFuZAorICAgICAqIHRoZSBuZXh0IGdyYW51bGUgZm9yIHRoZSBuZXh0IDI4OCBzYW1wbGVzIChub3QgcG9zc2libGUgaWYgdGhpcyBpcyBsYXN0CisgICAgICogZ3JhbnVsZSkuICBTbyB3ZSBuZWVkIHRvIHBhZCB3aXRoIDI4OCBzYW1wbGVzIHRvIG1ha2Ugc3VyZSB3ZSBjYW4KKyAgICAgKiBlbmNvZGUgdGhlIDU3NiBzYW1wbGVzIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICAgICAqLworICAgIGdmYy0+bWZfc2FtcGxlc190b19lbmNvZGUgPSBFTkNERUxBWSArIFBPU1RERUxBWTsKKyAgICBnZnAtPmVuY29kZXJfcGFkZGluZyA9IDA7CisgICAgZ2ZjLT5tZl9zaXplID0gRU5DREVMQVkgLSBNRENUREVMQVk7IC8qIHdlIHBhZCBpbnB1dCB3aXRoIHRoaXMgbWFueSAwJ3MgKi8KKworICAgIGdmcC0+ZmluZFJlcGxheUdhaW4gPSAwOworICAgIGdmcC0+ZGVjb2RlX29uX3RoZV9mbHkgPSAwOworCisgICAgZ2ZjLT5kZWNvZGVfb25fdGhlX2ZseSA9IDA7CisgICAgZ2ZjLT5maW5kUmVwbGF5R2FpbiA9IDA7CisgICAgZ2ZjLT5maW5kUGVha1NhbXBsZSA9IDA7CisKKyAgICBnZmMtPlJhZGlvR2FpbiA9IDA7CisgICAgZ2ZjLT5BdWRpb3BoaWxlR2FpbiA9IDA7CisgICAgZ2ZjLT5ub2NsaXBHYWluQ2hhbmdlID0gMDsKKyAgICBnZmMtPm5vY2xpcFNjYWxlID0gLTEuMDsKKworICAgIGdmcC0+YXNtX29wdGltaXphdGlvbnMubW14ID0gMTsKKyAgICBnZnAtPmFzbV9vcHRpbWl6YXRpb25zLmFtZDNkbm93ID0gMTsKKyAgICBnZnAtPmFzbV9vcHRpbWl6YXRpb25zLnNzZSA9IDE7CisKKyAgICBnZnAtPnByZXNldCA9IDA7CisKKyAgICBnZnAtPndyaXRlX2lkM3RhZ19hdXRvbWF0aWMgPSAxOworICAgIHJldHVybiAwOworfQorCisKK2xhbWVfZ2xvYmFsX2ZsYWdzICoKK2xhbWVfaW5pdCh2b2lkKQoreworICAgIGxhbWVfZ2xvYmFsX2ZsYWdzICpnZnA7CisgICAgaW50ICAgICByZXQ7CisKKyAgICBpbml0X2xvZ190YWJsZSgpOworCisgICAgZ2ZwID0gY2FsbG9jKDEsIHNpemVvZihsYW1lX2dsb2JhbF9mbGFncykpOworICAgIGlmIChnZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXQgPSBsYW1lX2luaXRfb2xkKGdmcCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIGZyZWUoZ2ZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZ2ZwLT5sYW1lX2FsbG9jYXRlZF9nZnAgPSAxOworICAgIHJldHVybiBnZnA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHNvbWUgc2ltcGxlIHN0YXRpc3RpY3MKKyAqCisgKiAgUm9iZXJ0IEhlZ2VtYW5uIDIwMDAtMTAtMTEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBoaXN0b2dyYW0gb2YgdXNlZCBiaXRyYXRlIGluZGV4ZXM6CisgKiAgT25lIGhhcyB0byB3ZWlnaHQgdGhlbSB0byBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgYml0cmF0ZSBpbiBrYnBzCisgKgorICogIGJpdHJhdGUgaW5kaWNlczoKKyAqICB0aGVyZSBhcmUgMTQgcG9zc2libGUgYml0cmF0ZSBpbmRpY2VzLCAwIGhhcyB0aGUgc3BlY2lhbCBtZWFuaW5nCisgKiAgImZyZWUgZm9ybWF0IiB3aGljaCBpcyBub3QgcG9zc2libGUgdG8gbWl4IHdpdGggVkJSIGFuZCAxNSBpcyBmb3JiaWRkZW4KKyAqICBhbnl3YXkuCisgKgorICogIHN0ZXJlbyBtb2RlczoKKyAqICAwOiBMUiAgIG51bWJlciBvZiBsZWZ0LXJpZ2h0IGVuY29kZWQgZnJhbWVzCisgKiAgMTogTFItSSBudW1iZXIgb2YgbGVmdC1yaWdodCBhbmQgaW50ZW5zaXR5IGVuY29kZWQgZnJhbWVzCisgKiAgMjogTVMgICBudW1iZXIgb2YgbWlkLXNpZGUgZW5jb2RlZCBmcmFtZXMKKyAqICAzOiBNUy1JIG51bWJlciBvZiBtaWQtc2lkZSBhbmQgaW50ZW5zaXR5IGVuY29kZWQgZnJhbWVzCisgKgorICogIDQ6IG51bWJlciBvZiBlbmNvZGVkIGZyYW1lcworICoKKyAqLworCit2b2lkCitsYW1lX2JpdHJhdGVfa2Jwcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGJpdHJhdGVfa2Jwc1sxNF0pCit7CisgICAgY29uc3QgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjOworICAgIGludCAgICAgaTsKKworICAgIGlmIChOVUxMID09IGJpdHJhdGVfa2JwcykKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChOVUxMID09IGdmcCkKKyAgICAgICAgcmV0dXJuOworICAgIGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaWYgKE5VTEwgPT0gZ2ZjKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZ2ZwLT5mcmVlX2Zvcm1hdCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKyAgICAgICAgICAgIGJpdHJhdGVfa2Jwc1tpXSA9IC0xOworICAgICAgICBiaXRyYXRlX2ticHNbMF0gPSBnZnAtPmJyYXRlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisgICAgICAgICAgICBiaXRyYXRlX2ticHNbaV0gPSBiaXRyYXRlX3RhYmxlW2dmcC0+dmVyc2lvbl1baSArIDFdOworICAgIH0KK30KKworCit2b2lkCitsYW1lX2JpdHJhdGVfaGlzdChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGJpdHJhdGVfY291bnRbMTRdKQoreworICAgIGNvbnN0IGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYzsKKyAgICBpbnQgICAgIGk7CisKKyAgICBpZiAoTlVMTCA9PSBiaXRyYXRlX2NvdW50KQorICAgICAgICByZXR1cm47CisgICAgaWYgKE5VTEwgPT0gZ2ZwKQorICAgICAgICByZXR1cm47CisgICAgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpZiAoTlVMTCA9PSBnZmMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChnZnAtPmZyZWVfZm9ybWF0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorICAgICAgICAgICAgYml0cmF0ZV9jb3VudFtpXSA9IDA7CisgICAgICAgIGJpdHJhdGVfY291bnRbMF0gPSBnZmMtPmJpdHJhdGVfc3RlcmVvTW9kZV9IaXN0WzBdWzRdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisgICAgICAgICAgICBiaXRyYXRlX2NvdW50W2ldID0gZ2ZjLT5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFtpICsgMV1bNF07CisgICAgfQorfQorCisKK3ZvaWQKK2xhbWVfc3RlcmVvX21vZGVfaGlzdChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHN0bW9kZV9jb3VudFs0XSkKK3sKKyAgICBjb25zdCBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmM7CisgICAgaW50ICAgICBpOworCisgICAgaWYgKE5VTEwgPT0gc3Rtb2RlX2NvdW50KQorICAgICAgICByZXR1cm47CisgICAgaWYgKE5VTEwgPT0gZ2ZwKQorICAgICAgICByZXR1cm47CisgICAgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpZiAoTlVMTCA9PSBnZmMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgc3Rtb2RlX2NvdW50W2ldID0gZ2ZjLT5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFsxNV1baV07CisgICAgfQorfQorCisKKwordm9pZAorbGFtZV9iaXRyYXRlX3N0ZXJlb19tb2RlX2hpc3QoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBiaXRyYXRlX3N0bW9kZV9jb3VudFsxNF1bNF0pCit7CisgICAgY29uc3QgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjOworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIGo7CisKKyAgICBpZiAoTlVMTCA9PSBiaXRyYXRlX3N0bW9kZV9jb3VudCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChOVUxMID09IGdmcCkKKyAgICAgICAgcmV0dXJuOworICAgIGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaWYgKE5VTEwgPT0gZ2ZjKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZ2ZwLT5mcmVlX2Zvcm1hdCkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTQ7IGorKykKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgYml0cmF0ZV9zdG1vZGVfY291bnRbal1baV0gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgYml0cmF0ZV9zdG1vZGVfY291bnRbMF1baV0gPSBnZmMtPmJpdHJhdGVfc3RlcmVvTW9kZV9IaXN0WzBdW2ldOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE0OyBqKyspCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIGJpdHJhdGVfc3Rtb2RlX2NvdW50W2pdW2ldID0gZ2ZjLT5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFtqICsgMV1baV07CisgICAgfQorfQorCisKK3ZvaWQKK2xhbWVfYmxvY2tfdHlwZV9oaXN0KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgYnR5cGVfY291bnRbNl0pCit7CisgICAgY29uc3QgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjOworICAgIGludCAgICAgaTsKKworICAgIGlmIChOVUxMID09IGJ0eXBlX2NvdW50KQorICAgICAgICByZXR1cm47CisgICAgaWYgKE5VTEwgPT0gZ2ZwKQorICAgICAgICByZXR1cm47CisgICAgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpZiAoTlVMTCA9PSBnZmMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgYnR5cGVfY291bnRbaV0gPSBnZmMtPmJpdHJhdGVfYmxvY2tUeXBlX0hpc3RbMTVdW2ldOworICAgIH0KK30KKworCisKK3ZvaWQKK2xhbWVfYml0cmF0ZV9ibG9ja190eXBlX2hpc3QoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBiaXRyYXRlX2J0eXBlX2NvdW50WzE0XVs2XSkKK3sKKyAgICBjb25zdCBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmM7CisgICAgaW50ICAgICBpLCBqOworCisgICAgaWYgKE5VTEwgPT0gYml0cmF0ZV9idHlwZV9jb3VudCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChOVUxMID09IGdmcCkKKyAgICAgICAgcmV0dXJuOworICAgIGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaWYgKE5VTEwgPT0gZ2ZjKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZ2ZwLT5mcmVlX2Zvcm1hdCkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTQ7ICsraikKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisgICAgICAgICAgICAgICAgYml0cmF0ZV9idHlwZV9jb3VudFtqXVtpXSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisgICAgICAgICAgICBiaXRyYXRlX2J0eXBlX2NvdW50WzBdW2ldID0gZ2ZjLT5iaXRyYXRlX2Jsb2NrVHlwZV9IaXN0WzBdW2ldOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE0OyArK2opCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgKytpKQorICAgICAgICAgICAgICAgIGJpdHJhdGVfYnR5cGVfY291bnRbal1baV0gPSBnZmMtPmJpdHJhdGVfYmxvY2tUeXBlX0hpc3RbaiArIDFdW2ldOworICAgIH0KK30KKworCisvKiBlbmQgb2YgbGFtZS5jICovCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2xhbWUucmMgYi9saWJtcDNsYW1lL2xhbWUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiYmEwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbGFtZS5yYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8d2ludmVyLmg+CisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWZkZWYgX0RMTAorI2Vsc2UKK0lESV9JQ09OMQkJSUNPTgkJRElTQ0FSREFCTEUJImxvZ29lLmljbyIKKyNlbmRpZgorCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKwlGSUxFVkVSU0lPTiBMQU1FX01BSk9SX1ZFUlNJT04sTEFNRV9NSU5PUl9WRVJTSU9OLExBTUVfVFlQRV9WRVJTSU9OLExBTUVfUEFUQ0hfVkVSU0lPTgorCVBST0RVQ1RWRVJTSU9OIExBTUVfTUFKT1JfVkVSU0lPTixMQU1FX01JTk9SX1ZFUlNJT04sTEFNRV9UWVBFX1ZFUlNJT04sTEFNRV9QQVRDSF9WRVJTSU9OCisJRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworCUZJTEVGTEFHUyBWU19GRl9ERUJVRworI2Vsc2UKKwlGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisJRklMRU9TIFZPU19fV0lORE9XUzMyCisjaWZkZWYgX0RMTAorCUZJTEVUWVBFIFZGVF9ETEwKKyNlbHNlCisJRklMRVRZUEUgVkZUX0FQUAorI2VuZGlmCisJRklMRVNVQlRZUEUgMHgwTAorCUJFR0lOCisJCUJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKwkJQkVHSU4KKwkJCUJMT0NLICIwNDA5MDRCMCIKKwkJCUJFR0lOCisJCQkJVkFMVUUgIkNvbXBhbnlOYW1lIiwgTEFNRV9VUkwgIlwwIgorCQkJCVZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiTVAzIEVuY29kZXIuXDAiCisJCQkJVkFMVUUgIkZpbGVWZXJzaW9uIiwgTEFNRV9WRVJTSU9OX1NUUklORyAiXDAiCisJCQkJVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBUZWFtXDAiCisjaWZkZWYgX0RMTAorCQkJCVZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgU1RSKF9ETEwpICJcMCIKKyNlbHNlCisJCQkJVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBTVFIoX0FQUCkgIlwwIgorI2VuZGlmCisJCQkJVkFMVUUgIlByb2R1Y3ROYW1lIiwgIkwuQS5NLkUuXDAiCisJCQlFTkQKKwkJRU5ECisJRU5ECisvKiBFbmQgb2YgVmVyc2lvbiBpbmZvICovCisKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvbGFtZV9nbG9iYWxfZmxhZ3MuaCBiL2xpYm1wM2xhbWUvbGFtZV9nbG9iYWxfZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2JjZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9sYW1lX2dsb2JhbF9mbGFncy5oCkBAIC0wLDAgKzEsMTc1IEBACisjaWZuZGVmIExBTUVfR0xPQkFMX0ZMQUdTX0gKKyNkZWZpbmUgTEFNRV9HTE9CQUxfRkxBR1NfSAorCisjaWZuZGVmIGxhbWVfaW50ZXJuYWxfZmxhZ3NfZGVmaW5lZAorI2RlZmluZSBsYW1lX2ludGVybmFsX2ZsYWdzX2RlZmluZWQKK3N0cnVjdCBsYW1lX2ludGVybmFsX2ZsYWdzOwordHlwZWRlZiBzdHJ1Y3QgbGFtZV9pbnRlcm5hbF9mbGFncyBsYW1lX2ludGVybmFsX2ZsYWdzOworI2VuZGlmCisKKwordHlwZWRlZiBlbnVtIHNob3J0X2Jsb2NrX2UgeworICAgIHNob3J0X2Jsb2NrX25vdF9zZXQgPSAtMSwgLyogYWxsb3cgTEFNRSB0byBkZWNpZGUgKi8KKyAgICBzaG9ydF9ibG9ja19hbGxvd2VkID0gMCwgLyogTEFNRSBtYXkgdXNlIHRoZW0sIGV2ZW4gZGlmZmVyZW50IGJsb2NrIHR5cGVzIGZvciBML1IgKi8KKyAgICBzaG9ydF9ibG9ja19jb3VwbGVkLCAvKiBMQU1FIG1heSB1c2UgdGhlbSwgYnV0IGFsd2F5cyBzYW1lIGJsb2NrIHR5cGVzIGluIEwvUiAqLworICAgIHNob3J0X2Jsb2NrX2Rpc3BlbnNlZCwgLyogTEFNRSB3aWxsIG5vdCB1c2Ugc2hvcnQgYmxvY2tzLCBsb25nIGJsb2NrcyBvbmx5ICovCisgICAgc2hvcnRfYmxvY2tfZm9yY2VkICAvKiBMQU1FIHdpbGwgbm90IHVzZSBsb25nIGJsb2Nrcywgc2hvcnQgYmxvY2tzIG9ubHkgKi8KK30gc2hvcnRfYmxvY2tfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBDb250cm9sIFBhcmFtZXRlcnMgc2V0IGJ5IFVzZXIuICBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBoZXJlIGZvcgorKiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkLCBub24tc2hhcmVkIGxpYiBBUEkuCisqICBQbGVhc2UgdXNlIHRoZSBsYW1lX3NldF92YXJpYWJsZW5hbWUoKSBmdW5jdGlvbnMgYmVsb3cKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGxhbWVfZ2xvYmFsX3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGNsYXNzX2lkOworICAgIC8qIGlucHV0IGRlc2NyaXB0aW9uICovCisgICAgdW5zaWduZWQgbG9uZyBudW1fc2FtcGxlczsgLyogbnVtYmVyIG9mIHNhbXBsZXMuIGRlZmF1bHQ9Ml4zMi0xICAgICAgICAgICAqLworICAgIGludCAgICAgbnVtX2NoYW5uZWxzOyAgICAvKiBpbnB1dCBudW1iZXIgb2YgY2hhbm5lbHMuIGRlZmF1bHQ9MiAgICAgICAgICovCisgICAgaW50ICAgICBpbl9zYW1wbGVyYXRlOyAgIC8qIGlucHV0X3NhbXBfcmF0ZSBpbiBIei4gZGVmYXVsdD00NC4xIGtIeiAgICAgKi8KKyAgICBpbnQgICAgIG91dF9zYW1wbGVyYXRlOyAgLyogb3V0cHV0X3NhbXBfcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogTEFNRSBwaWNrcyBiZXN0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGxlYXN0IG5vdCB1c2VkIGZvciBNUDMgZGVjb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWVtYmVyIDQ0LjEga0h6IE1QM3MgYW5kIEFDOTcgICAgICAgICAgICovCisgICAgZmxvYXQgICBzY2FsZTsgICAgICAgICAgIC8qIHNjYWxlIGlucHV0IGJ5IHRoaXMgYW1vdW50IGJlZm9yZSBlbmNvZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBsZWFzdCBub3QgdXNlZCBmb3IgTVAzIGRlY29kaW5nICAgICAgICAgICovCisgICAgZmxvYXQgICBzY2FsZV9sZWZ0OyAgICAgIC8qIHNjYWxlIGlucHV0IG9mIGNoYW5uZWwgMCAobGVmdCkgYnkgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQgYmVmb3JlIGVuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmxvYXQgICBzY2FsZV9yaWdodDsgICAgIC8qIHNjYWxlIGlucHV0IG9mIGNoYW5uZWwgMSAocmlnaHQpIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50IGJlZm9yZSBlbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLyogZ2VuZXJhbCBjb250cm9sIHBhcmFtcyAqLworICAgIGludCAgICAgYW5hbHlzaXM7ICAgICAgICAvKiBjb2xsZWN0IGRhdGEgZm9yIGEgTVAzIGZyYW1lIGFuYWx5emVyPyAgICAgICovCisgICAgaW50ICAgICBiV3JpdGVWYnJUYWc7ICAgIC8qIGFkZCBYaW5nIFZCUiB0YWc/ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgIGRlY29kZV9vbmx5OyAgICAgLyogdXNlIGxhbWUvbXBnbGliIHRvIGNvbnZlcnQgbXAzIHRvIHdhdiAgICAgICAqLworICAgIGludCAgICAgcXVhbGl0eTsgICAgICAgICAvKiBxdWFsaXR5IHNldHRpbmcgMD1iZXN0LCAgOT13b3JzdCAgZGVmYXVsdD01ICovCisgICAgTVBFR19tb2RlIG1vZGU7ICAgICAgICAgIC8qIHNlZSBlbnVtIGluIGxhbWUuaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gTEFNRSBwaWNrcyBiZXN0IHZhbHVlICAgICAgICAgICAgICovCisgICAgaW50ICAgICBmb3JjZV9tczsgICAgICAgIC8qIGZvcmNlIE0vUyBtb2RlLiAgcmVxdWlyZXMgbW9kZT0xICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgIGZyZWVfZm9ybWF0OyAgICAgLyogdXNlIGZyZWUgZm9ybWF0PyBkZWZhdWx0PTAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgZmluZFJlcGxheUdhaW47ICAvKiBmaW5kIHRoZSBSRyB2YWx1ZT8gZGVmYXVsdD0wICAgICAgICovCisgICAgaW50ICAgICBkZWNvZGVfb25fdGhlX2ZseTsgLyogZGVjb2RlIG9uIHRoZSBmbHk/IGRlZmF1bHQ9MCAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgd3JpdGVfaWQzdGFnX2F1dG9tYXRpYzsgLyogMSAoZGVmYXVsdCkgd3JpdGVzIElEMyB0YWdzLCAwIG5vdCAqLworCisgICAgLyoKKyAgICAgKiBzZXQgZWl0aGVyIGJyYXRlPjAgIG9yIGNvbXByZXNzaW9uX3JhdGlvPjAsIExBTUUgd2lsbCBjb21wdXRlCisgICAgICogdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBub3Qgc2V0LgorICAgICAqIERlZmF1bHQgaXMgY29tcHJlc3Npb25fcmF0aW8gPSAxMS4wMjUKKyAgICAgKi8KKyAgICBpbnQgICAgIGJyYXRlOyAgICAgICAgICAgLyogYml0cmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmxvYXQgICBjb21wcmVzc2lvbl9yYXRpbzsgLyogc2l6ZW9mKHdhdiBmaWxlKS9zaXplb2YobXAzIGZpbGUpICAgICAgICAgICovCisKKworICAgIC8qIGZyYW1lIHBhcmFtcyAqLworICAgIGludCAgICAgY29weXJpZ2h0OyAgICAgICAvKiBtYXJrIGFzIGNvcHlyaWdodC4gZGVmYXVsdD0wICAgICAgICAgICAqLworICAgIGludCAgICAgb3JpZ2luYWw7ICAgICAgICAvKiBtYXJrIGFzIG9yaWdpbmFsLiBkZWZhdWx0PTEgICAgICAgICAgICAqLworICAgIGludCAgICAgZXh0ZW5zaW9uOyAgICAgICAvKiB0aGUgTVAzICdwcml2YXRlIGV4dGVuc2lvbicgYml0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuaW5nbGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgZW1waGFzaXM7ICAgICAgICAvKiBJbnB1dCBQQ00gaXMgZW1waGFzZWQgUENNIChmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgZnJvbSBvbmUgb2YgdGhlIHJhcmVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNlZCBDRHMpLCBpdCBpcyBTVFJPTkdMWSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Y2hvIGRvZXMgbm90IHRha2UgaXQgaW50byBhY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbGFzdCBidXQgbm90IGxlYXN0IG1hbnkgZGVjb2RlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBhYm91dCB0aGVzZSBiaXRzICAgICAgICAgICovCisgICAgaW50ICAgICBlcnJvcl9wcm90ZWN0aW9uOyAvKiB1c2UgMiBieXRlcyBwZXIgZnJhbWUgZm9yIGEgQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bS4gZGVmYXVsdD0wICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgc3RyaWN0X0lTTzsgICAgICAvKiBlbmZvcmNlIElTTyBzcGVjIGFzIG11Y2ggYXMgcG9zc2libGUgICAqLworCisgICAgaW50ICAgICBkaXNhYmxlX3Jlc2Vydm9pcjsgLyogdXNlIGJpdCByZXNlcnZvaXI/ICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8qIHF1YW50aXphdGlvbi9ub2lzZSBzaGFwaW5nICovCisgICAgaW50ICAgICBxdWFudF9jb21wOworICAgIGludCAgICAgcXVhbnRfY29tcF9zaG9ydDsKKyAgICBpbnQgICAgIGV4cGVyaW1lbnRhbFk7CisgICAgaW50ICAgICBleHBlcmltZW50YWxaOworICAgIGludCAgICAgZXhwX25zcHN5dHVuZTsKKworICAgIGludCAgICAgcHJlc2V0OworCisgICAgLyogVkJSIGNvbnRyb2wgKi8KKyAgICB2YnJfbW9kZSBWQlI7CisgICAgZmxvYXQgICBWQlJfcV9mcmFjOyAgICAgIC8qIFJhbmdlIFswLC4uLiwxWyAqLworICAgIGludCAgICAgVkJSX3E7ICAgICAgICAgICAvKiBSYW5nZSBbMCwuLi4sOV0gKi8KKyAgICBpbnQgICAgIFZCUl9tZWFuX2JpdHJhdGVfa2JwczsKKyAgICBpbnQgICAgIFZCUl9taW5fYml0cmF0ZV9rYnBzOworICAgIGludCAgICAgVkJSX21heF9iaXRyYXRlX2ticHM7CisgICAgaW50ICAgICBWQlJfaGFyZF9taW47ICAgIC8qIHN0cmljdGx5IGVuZm9yY2UgVkJSX21pbl9iaXRyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbHksIGl0IHdpbGwgYmUgdmlvbGF0ZWQgZm9yIGFuYWxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisgICAgLyogcmVzYW1wbGluZyBhbmQgZmlsdGVyaW5nICovCisgICAgaW50ICAgICBsb3dwYXNzZnJlcTsgICAgIC8qIGZyZXEgaW4gSHouIDA9bGFtZSBjaG9zZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xPW5vIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgIGhpZ2hwYXNzZnJlcTsgICAgLyogZnJlcSBpbiBIei4gMD1sYW1lIGNob3Nlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE9bm8gZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgbG93cGFzc3dpZHRoOyAgICAvKiBmcmVxIHdpZHRoIG9mIGZpbHRlciwgaW4gSHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ9MTUlKSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgaGlnaHBhc3N3aWR0aDsgICAvKiBmcmVxIHdpZHRoIG9mIGZpbHRlciwgaW4gSHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ9MTUlKSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKworICAgIC8qCisgICAgICogcHN5Y2hvIGFjb3VzdGljcyBhbmQgb3RoZXIgYXJndW1lbnRzIHdoaWNoIHlvdSBzaG91bGQgbm90IGNoYW5nZQorICAgICAqIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyAgICAgKi8KKyAgICBmbG9hdCAgIG1hc2tpbmdhZGp1c3Q7CisgICAgZmxvYXQgICBtYXNraW5nYWRqdXN0X3Nob3J0OworICAgIGludCAgICAgQVRIb25seTsgICAgICAgICAvKiBvbmx5IHVzZSBBVEggICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgIEFUSHNob3J0OyAgICAgICAgLyogb25seSB1c2UgQVRIIGZvciBzaG9ydCBibG9ja3MgICAgICAgICovCisgICAgaW50ICAgICBub0FUSDsgICAgICAgICAgIC8qIGRpc2FibGUgQVRIICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgQVRIdHlwZTsgICAgICAgICAvKiBzZWxlY3QgQVRIIGZvcm11bGEgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmbG9hdCAgIEFUSGN1cnZlOyAgICAgICAgLyogY2hhbmdlIEFUSCBmb3JtdWxhIDQgc2hhcGUgICAgICAgICAgICovCisgICAgZmxvYXQgICBBVEhsb3dlcjsgICAgICAgIC8qIGxvd2VyIEFUSCBieSB0aGlzIG1hbnkgZGIgICAgICAgICAgICAqLworICAgIGludCAgICAgYXRoYWFfdHlwZTsgICAgICAvKiBzZWxlY3QgQVRIIGF1dG8tYWRqdXN0IHNjaGVtZSAgICAgICAgKi8KKyAgICBpbnQgICAgIGF0aGFhX2xvdWRhcHByb3g7IC8qIHNlbGVjdCBBVEggYXV0by1hZGp1c3QgbG91ZG5lc3MgY2FsYyAqLworICAgIGZsb2F0ICAgYXRoYWFfc2Vuc2l0aXZpdHk7IC8qIGRCLCB0dW5lIGFjdGl2ZSByZWdpb24gb2YgYXV0by1sZXZlbCAqLworICAgIHNob3J0X2Jsb2NrX3Qgc2hvcnRfYmxvY2tzOworICAgIGludCAgICAgdXNlVGVtcG9yYWw7ICAgICAvKiB1c2UgdGVtcG9yYWwgbWFza2luZyBlZmZlY3QgICAgICAgICAgKi8KKyAgICBmbG9hdCAgIGludGVyQ2hSYXRpbzsKKyAgICBmbG9hdCAgIG1zZml4OyAgICAgICAgICAgLyogTmFva2kncyBhZGp1c3RtZW50IG9mIE1pZC9TaWRlIG1hc2tpbmdzICovCisKKyAgICBpbnQgICAgIHR1bmU7ICAgICAgICAgICAgLyogMCBvZmYsIDEgb24gKi8KKyAgICBmbG9hdCAgIHR1bmVfdmFsdWVfYTsgICAgLyogdXNlZCB0byBwYXNzIHZhbHVlcyBmb3IgZGVidWdnaW5nIGFuZCBzdHVmZiAqLworCisgICAgc3RydWN0IHsKKyAgICAgICAgdm9pZCAgICAoKm1zZ2YpIChjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworICAgICAgICB2b2lkICAgICgqZGVidWdmKSAoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKKyAgICAgICAgdm9pZCAgICAoKmVycm9yZikgKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisgICAgfSByZXBvcnQ7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBpbnRlcm5hbCB2YXJpYWJsZXMsIGRvIG5vdCBzZXQuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIHByb3ZpZGVkIGJlY2F1c2UgdGhleSBtYXkgYmUgb2YgdXNlIHRvIGNhbGxpbmcgYXBwbGljYXRpb24gICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpbnQgICAgIHZlcnNpb247ICAgICAgICAgLyogMD1NUEVHLTIvMi41ICAxPU1QRUctMSAgICAgICAgICAgICAgICovCisgICAgaW50ICAgICBlbmNvZGVyX2RlbGF5OworICAgIGludCAgICAgZW5jb2Rlcl9wYWRkaW5nOyAvKiBudW1iZXIgb2Ygc2FtcGxlcyBvZiBwYWRkaW5nIGFwcGVuZGVkIHRvIGlucHV0ICovCisgICAgaW50ICAgICBmcmFtZXNpemU7CisgICAgaW50ICAgICBmcmFtZU51bTsgICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgZW5jb2RlZCAgICAgICAgICAgICAqLworICAgIGludCAgICAgbGFtZV9hbGxvY2F0ZWRfZ2ZwOyAvKiBpcyB0aGlzIHN0cnVjdCBvd25lZCBieSBjYWxsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gb3IgbGFtZT8gICAgICAgICAgICAgICAgICAgICAqLworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogbW9yZSBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbiB0aGlzIHN0cnVjdHVyZTogICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqaW50ZXJuYWxfZmxhZ3M7CisKKworICAgIHN0cnVjdCB7CisgICAgICAgIGludCAgICAgbW14OworICAgICAgICBpbnQgICAgIGFtZDNkbm93OworICAgICAgICBpbnQgICAgIHNzZTsKKworICAgIH0gYXNtX29wdGltaXphdGlvbnM7Cit9OworCisjZW5kaWYgLyogTEFNRV9HTE9CQUxfRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9sYW1lZXJyb3IuaCBiL2xpYm1wM2xhbWUvbGFtZWVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5MjE2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbGFtZWVycm9yLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqICBBIGNvbGxlY3Rpb24gb2YgTEFNRSBFcnJvciBDb2RlcworICoKKyAqICBQbGVhc2UgdXNlIHRoZSBjb25zdGFudHMgZGVmaW5lZCBoZXJlIGluc3RlYWQgb2Ygc29tZSBhcmJpdHJhcnkKKyAqICB2YWx1ZXMuIEN1cnJlbnRseSB0aGUgdmFsdWVzIHN0YXJ0aW5nIGF0IC0xMCB0byBhdm9pZCBpbnRlcnNlY3Rpb24KKyAqICB3aXRoIHRoZSAtMSwgLTIsIC0zIGFuZCAtNCB1c2VkIGluIHRoZSBjdXJyZW50IGNvZGUuCisgKgorICogIE1heSBiZSB0aGlzIHNob3VsZCBiZSBhIHBhcnQgb2YgdGhlIGluY2x1ZGUvbGFtZS5oLgorICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgTEFNRV9PS0FZID0gMCwKKyAgICBMQU1FX05PRVJST1IgPSAwLAorICAgIExBTUVfR0VORVJJQ0VSUk9SID0gLTEsCisgICAgTEFNRV9OT01FTSA9IC0xMCwKKyAgICBMQU1FX0JBREJJVFJBVEUgPSAtMTEsCisgICAgTEFNRV9CQURTQU1QRlJFUSA9IC0xMiwKKyAgICBMQU1FX0lOVEVSTkFMRVJST1IgPSAtMTMsCisKKyAgICBGUk9OVEVORF9SRUFERVJST1IgPSAtODAsCisgICAgRlJPTlRFTkRfV1JJVEVFUlJPUiA9IC04MSwKKyAgICBGUk9OVEVORF9GSUxFVE9PTEFSR0UgPSAtODIsCisKK30gbGFtZV9lcnJvcmNvZGVzX3Q7CisKKy8qIGVuZCBvZiBsYW1lZXJyb3IuaCAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9saWJsYW1lLmRlZiBiL2xpYm1wM2xhbWUvbGlibGFtZS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1NmFlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbGlibGFtZS5kZWYKQEAgLTAsMCArMSwyNzAgQEAKK0xJQlJBUlkgIGxpYmF1ZGlvZW5jLmRsbAorRVhQT1JUUworCitsYW1lX2luaXQJCUAxCisKK2xhbWVfc2V0X251bV9zYW1wbGVzCUAyCitsYW1lX2dldF9udW1fc2FtcGxlcwlAMworCitsYW1lX3NldF9pbl9zYW1wbGVyYXRlCUA0CitsYW1lX2dldF9pbl9zYW1wbGVyYXRlCUA1CisKK2xhbWVfc2V0X251bV9jaGFubmVscwlANgorbGFtZV9nZXRfbnVtX2NoYW5uZWxzCUA3CisKK2xhbWVfc2V0X3NjYWxlCQlAOAorbGFtZV9nZXRfc2NhbGUJCUA5CisKK2xhbWVfc2V0X3NjYWxlX2xlZnQJQDEwCitsYW1lX2dldF9zY2FsZV9sZWZ0CUAxMQorCitsYW1lX3NldF9zY2FsZV9yaWdodAlAMTIKK2xhbWVfZ2V0X3NjYWxlX3JpZ2h0CUAxMworCitsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZQlAMTQKK2xhbWVfZ2V0X291dF9zYW1wbGVyYXRlCUAxNQorCitsYW1lX3NldF9hbmFseXNpcwlAMTYKK2xhbWVfZ2V0X2FuYWx5c2lzCUAxNworCitsYW1lX3NldF9iV3JpdGVWYnJUYWcJQDE4CitsYW1lX2dldF9iV3JpdGVWYnJUYWcJQDE5CisKK2xhbWVfc2V0X2RlY29kZV9vbmx5CUAyMAorbGFtZV9nZXRfZGVjb2RlX29ubHkJQDIxCisKK2xhbWVfc2V0X3F1YWxpdHkJQDIyCitsYW1lX2dldF9xdWFsaXR5CUAyMworCitsYW1lX3NldF9tb2RlCQlAMjQKK2xhbWVfZ2V0X21vZGUJCUAyNQorCitsYW1lX3NldF9mb3JjZV9tcwlAMjYKK2xhbWVfZ2V0X2ZvcmNlX21zCUAyNworCitsYW1lX3NldF9mcmVlX2Zvcm1hdAlAMjgKK2xhbWVfZ2V0X2ZyZWVfZm9ybWF0CUAyOQorCisKK2xhbWVfc2V0X2ZpbmRSZXBsYXlHYWluCUAzMAorbGFtZV9nZXRfZmluZFJlcGxheUdhaW4JQDMxCisKK2xhbWVfc2V0X2RlY29kZV9vbl90aGVfZmx5CUAzMgorbGFtZV9nZXRfZGVjb2RlX29uX3RoZV9mbHkJQDMzCisKK2xhbWVfc2V0X25vZ2FwX3RvdGFsCUAzNAorbGFtZV9nZXRfbm9nYXBfdG90YWwJQDM1CisKK2xhbWVfc2V0X25vZ2FwX2N1cnJlbnRpbmRleAlAMzYKK2xhbWVfZ2V0X25vZ2FwX2N1cnJlbnRpbmRleAlAMzcKKworCitsYW1lX3NldF9lcnJvcmYJCUAzOAorbGFtZV9zZXRfZGVidWdmCQlAMzkKK2xhbWVfc2V0X21zZ2YJCUA0MAorCitsYW1lX3NldF9icmF0ZQkJQDQxCitsYW1lX2dldF9icmF0ZQkJQDQyCisgCitsYW1lX3NldF9jb21wcmVzc2lvbl9yYXRpbwlANDMKK2xhbWVfZ2V0X2NvbXByZXNzaW9uX3JhdGlvCUA0NAorCitsYW1lX3NldF9wcmVzZXQJCUA0NQorCitsYW1lX3NldF9hc21fb3B0aW1pemF0aW9ucwlANDYKKworCitsYW1lX3NldF9jb3B5cmlnaHQJQDQ3CitsYW1lX2dldF9jb3B5cmlnaHQJQDQ4CisKK2xhbWVfc2V0X29yaWdpbmFsCUA0OQorbGFtZV9nZXRfb3JpZ2luYWwJQDUwCisKK2xhbWVfc2V0X2Vycm9yX3Byb3RlY3Rpb24JQDUxCitsYW1lX2dldF9lcnJvcl9wcm90ZWN0aW9uCUA1MgorCitsYW1lX3NldF9wYWRkaW5nX3R5cGUJQDUzCitsYW1lX2dldF9wYWRkaW5nX3R5cGUJQDU0CisKK2xhbWVfc2V0X2V4dGVuc2lvbglANTUKK2xhbWVfZ2V0X2V4dGVuc2lvbglANTYKKworbGFtZV9zZXRfc3RyaWN0X0lTTwlANTcKK2xhbWVfZ2V0X3N0cmljdF9JU08JQDU4CisKK2xhbWVfc2V0X2Rpc2FibGVfcmVzZXJ2b2lyCUA1OQorbGFtZV9nZXRfZGlzYWJsZV9yZXNlcnZvaXIJQDYwCisKK2xhbWVfc2V0X3F1YW50X2NvbXAJQDYxCitsYW1lX2dldF9xdWFudF9jb21wCUA2MgorbGFtZV9zZXRfcXVhbnRfY29tcF9zaG9ydAlANjMKK2xhbWVfZ2V0X3F1YW50X2NvbXBfc2hvcnQJQDY0CisKK2xhbWVfc2V0X2V4cGVyaW1lbnRhbFgJQDY1CitsYW1lX2dldF9leHBlcmltZW50YWxYCUA2NgorCitsYW1lX3NldF9leHBlcmltZW50YWxZCUA2NworbGFtZV9nZXRfZXhwZXJpbWVudGFsWQlANjgKKworbGFtZV9zZXRfZXhwZXJpbWVudGFsWglANjkKK2xhbWVfZ2V0X2V4cGVyaW1lbnRhbFoJQDcwCisKK2xhbWVfc2V0X2V4cF9uc3BzeXR1bmUJQDcxCitsYW1lX2dldF9leHBfbnNwc3l0dW5lCUA3MgorCitsYW1lX3NldF9tc2ZpeAkJQDczCitsYW1lX2dldF9tc2ZpeAkJQDc0CisKK2xhbWVfc2V0X1ZCUgkJQDc1CitsYW1lX2dldF9WQlIJCUA3NgorCitsYW1lX3NldF9WQlJfcQkJQDc3CitsYW1lX2dldF9WQlJfcQkJQDc4CisKK2xhbWVfc2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcwlANzkKK2xhbWVfZ2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcwlAODAKKworbGFtZV9zZXRfVkJSX21pbl9iaXRyYXRlX2ticHMJQDgxCitsYW1lX2dldF9WQlJfbWluX2JpdHJhdGVfa2JwcwlAODIKKworbGFtZV9zZXRfVkJSX21heF9iaXRyYXRlX2ticHMJQDgzCitsYW1lX2dldF9WQlJfbWF4X2JpdHJhdGVfa2JwcwlAODQKKworbGFtZV9zZXRfVkJSX2hhcmRfbWluCUA4NQorbGFtZV9nZXRfVkJSX2hhcmRfbWluCUA4NgorCitsYW1lX3NldF9wcmVzZXRfZXhwb3B0cwlAODcKKworbGFtZV9zZXRfbG93cGFzc2ZyZXEJQDg4CitsYW1lX2dldF9sb3dwYXNzZnJlcQlAODkKKworbGFtZV9zZXRfbG93cGFzc3dpZHRoCUA5MAorbGFtZV9nZXRfbG93cGFzc3dpZHRoCUA5MQorCitsYW1lX3NldF9oaWdocGFzc2ZyZXEJQDkyCitsYW1lX2dldF9oaWdocGFzc2ZyZXEJQDkzCisKK2xhbWVfc2V0X2hpZ2hwYXNzd2lkdGgJQDk0CitsYW1lX2dldF9oaWdocGFzc3dpZHRoCUA5NQorCitsYW1lX3NldF9BVEhvbmx5CUA5NgorbGFtZV9nZXRfQVRIb25seQlAOTcKKworbGFtZV9zZXRfQVRIc2hvcnQJQDk4CitsYW1lX2dldF9BVEhzaG9ydAlAOTkKKworbGFtZV9zZXRfbm9BVEgJCUAxMDAKK2xhbWVfZ2V0X25vQVRICQlAMTAxCisKK2xhbWVfc2V0X0FUSHR5cGUJQDEwMgorbGFtZV9nZXRfQVRIdHlwZQlAMTAzCisKK2xhbWVfc2V0X0FUSGxvd2VyCUAxMDQKK2xhbWVfZ2V0X0FUSGxvd2VyCUAxMDUKKworbGFtZV9zZXRfYXRoYWFfdHlwZQlAMTA2CitsYW1lX2dldF9hdGhhYV90eXBlCUAxMDcKKworbGFtZV9zZXRfYXRoYWFfbG91ZGFwcHJveAlAMTA4CitsYW1lX2dldF9hdGhhYV9sb3VkYXBwcm94CUAxMDkKKworbGFtZV9zZXRfYXRoYWFfc2Vuc2l0aXZpdHkJQDExMAorbGFtZV9nZXRfYXRoYWFfc2Vuc2l0aXZpdHkJQDExMQorCitsYW1lX3NldF9jd2xpbWl0CUAxMTIKK2xhbWVfZ2V0X2N3bGltaXQJQDExMworCitsYW1lX3NldF91c2VUZW1wb3JhbAlAMTE0CitsYW1lX2dldF91c2VUZW1wb3JhbAlAMTE1CisKK2xhbWVfc2V0X2ludGVyQ2hSYXRpbwlAMTE2CitsYW1lX2dldF9pbnRlckNoUmF0aW8JQDExNworCitsYW1lX3NldF9ub19zaG9ydF9ibG9ja3MJQDExOAorbGFtZV9nZXRfbm9fc2hvcnRfYmxvY2tzCUAxMTkKK2xhbWVfc2V0X2ZvcmNlX3Nob3J0X2Jsb2NrcwlAMTIwCitsYW1lX2dldF9mb3JjZV9zaG9ydF9ibG9ja3MJQDEyMQorbGFtZV9zZXRfYWxsb3dfZGlmZl9zaG9ydAlAMTIyCitsYW1lX2dldF9hbGxvd19kaWZmX3Nob3J0CUAxMjMKKworbGFtZV9zZXRfZW1waGFzaXMJQDEyNAorbGFtZV9nZXRfZW1waGFzaXMJQDEyNQorCitsYW1lX2dldF92ZXJzaW9uCUAxMjYKK2xhbWVfZ2V0X2VuY29kZXJfZGVsYXkJQDEyNworbGFtZV9nZXRfZW5jb2Rlcl9wYWRkaW5nCUAxMjgKK2xhbWVfZ2V0X2ZyYW1lc2l6ZQlAMTI5CisKK2xhbWVfZ2V0X21mX3NhbXBsZXNfdG9fZW5jb2RlCUAxMzAKK2xhbWVfZ2V0X3NpemVfbXAzYnVmZmVyCUAxMzEKK2xhbWVfZ2V0X2ZyYW1lTnVtCUAxMzIKK2xhbWVfZ2V0X3RvdGFsZnJhbWVzCUAxMzMKKworbGFtZV9nZXRfUmFkaW9HYWluCUAxMzQKK2xhbWVfZ2V0X0F1ZGlvcGhpbGVHYWluCUAxMzUKK2xhbWVfZ2V0X1BlYWtTYW1wbGUJQDEzNgorbGFtZV9nZXRfbm9jbGlwR2FpbkNoYW5nZQlAMTM3CitsYW1lX2dldF9ub2NsaXBTY2FsZQlAMTM4CisKK2xhbWVfaW5pdF9wYXJhbXMJQDEzOQorCitnZXRfbGFtZV92ZXJzaW9uCUAxNDAKK2dldF9sYW1lX3Nob3J0X3ZlcnNpb24gQDE0MQorZ2V0X2xhbWVfdmVyeV9zaG9ydF92ZXJzaW9uCUAxNDIKK2dldF9wc3lfdmVyc2lvbgkJQDE0MyAgICAgICAgCitnZXRfbGFtZV91cmwJCUAxNDQgICAgICAgICAgIAorCitnZXRfbGFtZV92ZXJzaW9uX251bWVyaWNhbAlAMTQ1CisKK2xhbWVfcHJpbnRfY29uZmlnCUAxNDYKK2xhbWVfcHJpbnRfaW50ZXJuYWxzCUAxNDcKKworbGFtZV9lbmNvZGVfYnVmZmVyCUAxNDgKK2xhbWVfZW5jb2RlX2J1ZmZlcl9pbnRlcmxlYXZlZAlAMTQ5CitsYW1lX2VuY29kZV9idWZmZXJfZmxvYXQJQDE1MAorbGFtZV9lbmNvZGVfYnVmZmVyX2xvbmcJQDE1MQorbGFtZV9lbmNvZGVfYnVmZmVyX2xvbmcyCUAxNTIKK2xhbWVfZW5jb2RlX2J1ZmZlcl9pbnQJQDE1MworbGFtZV9lbmNvZGVfZmx1c2gJQDE1NAorbGFtZV9lbmNvZGVfZmx1c2hfbm9nYXAJQDE1NQorCitsYW1lX2luaXRfYml0c3RyZWFtCUAxNTYKKworbGFtZV9iaXRyYXRlX2hpc3QJQDE1NworbGFtZV9iaXRyYXRlX2ticHMJQDE1OAorbGFtZV9zdGVyZW9fbW9kZV9oaXN0CUAxNTkKK2xhbWVfYml0cmF0ZV9zdGVyZW9fbW9kZV9oaXN0CUAxNjAKK2xhbWVfYmxvY2tfdHlwZV9oaXN0CUAxNjEKK2xhbWVfYml0cmF0ZV9ibG9ja190eXBlX2hpc3QJQDE2MgorbGFtZV9tcDNfdGFnc19maWQJQDE2MworbGFtZV9jbG9zZQkJQDE2NAorbGFtZV9nZXRfbGFtZXRhZ19mcmFtZQlAMTY1CitnZXRfbGFtZV9vc19iaXRuZXNzCUAxNjYKK2xhbWVfc2V0X1ZCUl9xdWFsaXR5CUAxNjcKK2xhbWVfZ2V0X1ZCUl9xdWFsaXR5CUAxNjgKKworCitiaXRyYXRlX3RhYmxlCQlANTAwCitzYW1wbGVyYXRlX3RhYmxlCUA1MDEKKworaWQzdGFnX2dlbnJlX2xpc3QJQDIwMDAKK2lkM3RhZ19pbml0ICAgCQlAMjAwMQoraWQzdGFnX2FkZF92MiAgIAlAMjAwMgoraWQzdGFnX3YxX29ubHkgIAlAMjAwMworaWQzdGFnX3YyX29ubHkgIAlAMjAwNAoraWQzdGFnX3NwYWNlX3YxIAlAMjAwNQoraWQzdGFnX3BhZF92MiAgIAlAMjAwNgoraWQzdGFnX3NldF90aXRsZQlAMjAwNworaWQzdGFnX3NldF9hcnRpc3QJQDIwMDgKK2lkM3RhZ19zZXRfYWxidW0JQDIwMDkKK2lkM3RhZ19zZXRfeWVhcgkJQDIwMTAKK2lkM3RhZ19zZXRfY29tbWVudAlAMjAxMQoraWQzdGFnX3NldF90cmFjawlAMjAxMgoraWQzdGFnX3NldF9nZW5yZQlAMjAxMworaWQzdGFnX3NldF9maWVsZHZhbHVlCUAyMDE0CitpZDN0YWdfc2V0X2FsYnVtYXJ0CUAyMDE1CitsYW1lX2dldF9pZDN2MV90YWcJQDIwMTYKK2xhbWVfZ2V0X2lkM3YyX3RhZwlAMjAxNworbGFtZV9zZXRfd3JpdGVfaWQzdGFnX2F1dG9tYXRpYwlAMjAxOAorbGFtZV9nZXRfd3JpdGVfaWQzdGFnX2F1dG9tYXRpYwlAMjAxOQoraWQzdGFnX3NldF9wYWQJQDIwMjAKZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvbGlibXAzbGFtZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvbGlibXAzbGFtZS9saWJtcDNsYW1lLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2NmNjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbGlibXAzbGFtZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMzc5IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDU7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJRDdEMEZGOEIxMTI0RTI5ODAwRTAxRkU3IC8qIGNvbmZpZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNjIxMTI0RTI5ODAwRTAxRkU3IC8qIGNvbmZpZy5oICovOyB9OworCQlEN0QwRkY4QzExMjRFMjk4MDBFMDFGRTcgLyogcXVhbnRpemUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjYzMTEyNEUyOTgwMEUwMUZFNyAvKiBxdWFudGl6ZS5oICovOyB9OworCQlEN0QwRkY4RDExMjRFMjk4MDBFMDFGRTcgLyogZW5jb2Rlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNjQxMTI0RTI5ODAwRTAxRkU3IC8qIGVuY29kZXIuaCAqLzsgfTsKKwkJRDdEMEZGOEUxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplX3B2dC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNjUxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplX3B2dC5jICovOyB9OworCQlEN0QwRkY4RjExMjRFMjk4MDBFMDFGRTcgLyogbmV3bWRjdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNjYxMTI0RTI5ODAwRTAxRkU3IC8qIG5ld21kY3QuaCAqLzsgfTsKKwkJRDdEMEZGOTAxMTI0RTI5ODAwRTAxRkU3IC8qIGxhbWUtYW5hbHlzaXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjY3MTEyNEUyOTgwMEUwMUZFNyAvKiBsYW1lLWFuYWx5c2lzLmggKi87IH07CisJCUQ3RDBGRjkxMTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjY4MTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuYyAqLzsgfTsKKwkJRDdEMEZGOTIxMTI0RTI5ODAwRTAxRkU3IC8qIHJlc2Vydm9pci5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNjkxMTI0RTI5ODAwRTAxRkU3IC8qIHJlc2Vydm9pci5jICovOyB9OworCQlEN0QwRkY5MzExMjRFMjk4MDBFMDFGRTcgLyogdGFibGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY2QTExMjRFMjk4MDBFMDFGRTcgLyogdGFibGVzLmggKi87IH07CisJCUQ3RDBGRjk0MTEyNEUyOTgwMEUwMUZFNyAvKiBzZXRfZ2V0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY2QjExMjRFMjk4MDBFMDFGRTcgLyogc2V0X2dldC5oICovOyB9OworCQlEN0QwRkY5NTExMjRFMjk4MDBFMDFGRTcgLyogdmVyc2lvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNkMxMTI0RTI5ODAwRTAxRkU3IC8qIHZlcnNpb24uaCAqLzsgfTsKKwkJRDdEMEZGOTYxMTI0RTI5ODAwRTAxRkU3IC8qIHZlcnNpb24uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjZEMTEyNEUyOTgwMEUwMUZFNyAvKiB2ZXJzaW9uLmMgKi87IH07CisJCUQ3RDBGRjk3MTEyNEUyOTgwMEUwMUZFNyAvKiBtYWNoaW5lLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY2RTExMjRFMjk4MDBFMDFGRTcgLyogbWFjaGluZS5oICovOyB9OworCQlEN0QwRkY5ODExMjRFMjk4MDBFMDFGRTcgLyogZmZ0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY2RjExMjRFMjk4MDBFMDFGRTcgLyogZmZ0LmggKi87IH07CisJCUQ3RDBGRjk5MTEyNEUyOTgwMEUwMUZFNyAvKiBlbmNvZGVyLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY3MDExMjRFMjk4MDBFMDFGRTcgLyogZW5jb2Rlci5jICovOyB9OworCQlEN0QwRkY5QTExMjRFMjk4MDBFMDFGRTcgLyogZmZ0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY3MTExMjRFMjk4MDBFMDFGRTcgLyogZmZ0LmMgKi87IH07CisJCUQ3RDBGRjlCMTEyNEUyOTgwMEUwMUZFNyAvKiBnYWluX2FuYWx5c2lzLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY3MjExMjRFMjk4MDBFMDFGRTcgLyogZ2Fpbl9hbmFseXNpcy5jICovOyB9OworCQlEN0QwRkY5QzExMjRFMjk4MDBFMDFGRTcgLyogbXBnbGliX2ludGVyZmFjZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNzMxMTI0RTI5ODAwRTAxRkU3IC8qIG1wZ2xpYl9pbnRlcmZhY2UuYyAqLzsgfTsKKwkJRDdEMEZGOUQxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplX3B2dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNzQxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplX3B2dC5oICovOyB9OworCQlEN0QwRkY5RTExMjRFMjk4MDBFMDFGRTcgLyogZ2Fpbl9hbmFseXNpcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGNzUxMTI0RTI5ODAwRTAxRkU3IC8qIGdhaW5fYW5hbHlzaXMuaCAqLzsgfTsKKwkJRDdEMEZGOUYxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY3NjExMjRFMjk4MDBFMDFGRTcgLyogcXVhbnRpemUuYyAqLzsgfTsKKwkJRDdEMEZGQTAxMTI0RTI5ODAwRTAxRkU3IC8qIHNldF9nZXQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjc3MTEyNEUyOTgwMEUwMUZFNyAvKiBzZXRfZ2V0LmMgKi87IH07CisJCUQ3RDBGRkExMTEyNEUyOTgwMEUwMUZFNyAvKiB0YWJsZXMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjc4MTEyNEUyOTgwMEUwMUZFNyAvKiB0YWJsZXMuYyAqLzsgfTsKKwkJRDdEMEZGQTIxMTI0RTI5ODAwRTAxRkU3IC8qIHV0aWwuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjc5MTEyNEUyOTgwMEUwMUZFNyAvKiB1dGlsLmMgKi87IH07CisJCUQ3RDBGRkEzMTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjdBMTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuaCAqLzsgfTsKKwkJRDdEMEZGQTQxMTI0RTI5ODAwRTAxRkU3IC8qIGwzc2lkZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGN0IxMTI0RTI5ODAwRTAxRkU3IC8qIGwzc2lkZS5oICovOyB9OworCQlEN0QwRkZBNTExMjRFMjk4MDBFMDFGRTcgLyogcHN5bW9kZWwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjdDMTEyNEUyOTgwMEUwMUZFNyAvKiBwc3ltb2RlbC5oICovOyB9OworCQlEN0QwRkZBNjExMjRFMjk4MDBFMDFGRTcgLyogdmJycXVhbnRpemUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjdEMTEyNEUyOTgwMEUwMUZFNyAvKiB2YnJxdWFudGl6ZS5oICovOyB9OworCQlEN0QwRkZBNzExMjRFMjk4MDBFMDFGRTcgLyogdmJycXVhbnRpemUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjdFMTEyNEUyOTgwMEUwMUZFNyAvKiB2YnJxdWFudGl6ZS5jICovOyB9OworCQlEN0QwRkZBODExMjRFMjk4MDBFMDFGRTcgLyogdXRpbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGN0YxMTI0RTI5ODAwRTAxRkU3IC8qIHV0aWwuaCAqLzsgfTsKKwkJRDdEMEZGQTkxMTI0RTI5ODAwRTAxRkU3IC8qIGJpdHN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGODAxMTI0RTI5ODAwRTAxRkU3IC8qIGJpdHN0cmVhbS5oICovOyB9OworCQlEN0QwRkZBQTExMjRFMjk4MDBFMDFGRTcgLyogdGFrZWhpcm8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEQ3RDBGRjgxMTEyNEUyOTgwMEUwMUZFNyAvKiB0YWtlaGlyby5jICovOyB9OworCQlEN0QwRkZBQjExMjRFMjk4MDBFMDFGRTcgLyogcHJlc2V0cy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGODIxMTI0RTI5ODAwRTAxRkU3IC8qIHByZXNldHMuYyAqLzsgfTsKKwkJRDdEMEZGQUMxMTI0RTI5ODAwRTAxRkU3IC8qIHJlc2Vydm9pci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGODMxMTI0RTI5ODAwRTAxRkU3IC8qIHJlc2Vydm9pci5oICovOyB9OworCQlEN0QwRkZBRDExMjRFMjk4MDBFMDFGRTcgLyogbGFtZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGODQxMTI0RTI5ODAwRTAxRkU3IC8qIGxhbWUuYyAqLzsgfTsKKwkJRDdEMEZGQUUxMTI0RTI5ODAwRTAxRkU3IC8qIFZiclRhZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGODUxMTI0RTI5ODAwRTAxRkU3IC8qIFZiclRhZy5oICovOyB9OworCQlEN0QwRkZBRjExMjRFMjk4MDBFMDFGRTcgLyogVmJyVGFnLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY4NjExMjRFMjk4MDBFMDFGRTcgLyogVmJyVGFnLmMgKi87IH07CisJCUQ3RDBGRkIwMTEyNEUyOTgwMEUwMUZFNyAvKiBuZXdtZGN0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY4NzExMjRFMjk4MDBFMDFGRTcgLyogbmV3bWRjdC5jICovOyB9OworCQlEN0QwRkZCMTExMjRFMjk4MDBFMDFGRTcgLyogYml0c3RyZWFtLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEN0QwRkY4ODExMjRFMjk4MDBFMDFGRTcgLyogYml0c3RyZWFtLmMgKi87IH07CisJCUQ3RDBGRkIyMTEyNEUyOTgwMEUwMUZFNyAvKiBwc3ltb2RlbC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGODkxMTI0RTI5ODAwRTAxRkU3IC8qIHBzeW1vZGVsLmMgKi87IH07CisJCUQ3RDBGRkIzMTEyNEUyOTgwMEUwMUZFNyAvKiBsYW1lX2dsb2JhbF9mbGFncy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDdEMEZGOEExMTI0RTI5ODAwRTAxRkU3IC8qIGxhbWVfZ2xvYmFsX2ZsYWdzLmggKi87IH07CisvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCUQyQUFDMDYzMDU1NDY2MEIwMERCNTE4RCAvKiBsaWJhdWRpb2VuYy5keWxpYiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5keWxpYiI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGxpYmF1ZGlvZW5jLmR5bGliOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlENzEzNTA0NjExMjRENTY2MDBFMkMxREEgLyogTWFjQ29uZmlnRXh0ZXJuYWxEZWJ1Zy54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IG5hbWUgPSBNYWNDb25maWdFeHRlcm5hbERlYnVnLnhjY29uZmlnOyBwYXRoID0gLi4vLi4vTWFjQ29uZmlnRXh0ZXJuYWxEZWJ1Zy54Y2NvbmZpZzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlENzEzNTA0NzExMjRENTY2MDBFMkMxREEgLyogTWFjQ29uZmlnRXh0ZXJuYWxSZWxlYXNlLnhjY29uZmlnICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC54Y2NvbmZpZzsgbmFtZSA9IE1hY0NvbmZpZ0V4dGVybmFsUmVsZWFzZS54Y2NvbmZpZzsgcGF0aCA9IC4uLy4uL01hY0NvbmZpZ0V4dGVybmFsUmVsZWFzZS54Y2NvbmZpZzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY2MjExMjRFMjk4MDBFMDFGRTcgLyogY29uZmlnLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IGNvbmZpZy5oOyBwYXRoID0gLi4vY29uZmlnLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNjMxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHF1YW50aXplLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNjQxMTI0RTI5ODAwRTAxRkU3IC8qIGVuY29kZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZW5jb2Rlci5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjY1MTEyNEUyOTgwMEUwMUZFNyAvKiBxdWFudGl6ZV9wdnQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gcXVhbnRpemVfcHZ0LmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNjYxMTI0RTI5ODAwRTAxRkU3IC8qIG5ld21kY3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gbmV3bWRjdC5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjY3MTEyNEUyOTgwMEUwMUZFNyAvKiBsYW1lLWFuYWx5c2lzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJsYW1lLWFuYWx5c2lzLmgiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjY4MTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gaWQzdGFnLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNjkxMTI0RTI5ODAwRTAxRkU3IC8qIHJlc2Vydm9pci5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSByZXNlcnZvaXIuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY2QTExMjRFMjk4MDBFMDFGRTcgLyogdGFibGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHRhYmxlcy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjZCMTEyNEUyOTgwMEUwMUZFNyAvKiBzZXRfZ2V0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHNldF9nZXQuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY2QzExMjRFMjk4MDBFMDFGRTcgLyogdmVyc2lvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSB2ZXJzaW9uLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNkQxMTI0RTI5ODAwRTAxRkU3IC8qIHZlcnNpb24uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gdmVyc2lvbi5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjZFMTEyNEUyOTgwMEUwMUZFNyAvKiBtYWNoaW5lLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IG1hY2hpbmUuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY2RjExMjRFMjk4MDBFMDFGRTcgLyogZmZ0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGZmdC5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjcwMTEyNEUyOTgwMEUwMUZFNyAvKiBlbmNvZGVyLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGVuY29kZXIuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY3MTExMjRFMjk4MDBFMDFGRTcgLyogZmZ0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGZmdC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjcyMTEyNEUyOTgwMEUwMUZFNyAvKiBnYWluX2FuYWx5c2lzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGdhaW5fYW5hbHlzaXMuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY3MzExMjRFMjk4MDBFMDFGRTcgLyogbXBnbGliX2ludGVyZmFjZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBtcGdsaWJfaW50ZXJmYWNlLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNzQxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplX3B2dC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBxdWFudGl6ZV9wdnQuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY3NTExMjRFMjk4MDBFMDFGRTcgLyogZ2Fpbl9hbmFseXNpcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBnYWluX2FuYWx5c2lzLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNzYxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IHF1YW50aXplLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNzcxMTI0RTI5ODAwRTAxRkU3IC8qIHNldF9nZXQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gc2V0X2dldC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjc4MTEyNEUyOTgwMEUwMUZFNyAvKiB0YWJsZXMuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gdGFibGVzLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGNzkxMTI0RTI5ODAwRTAxRkU3IC8qIHV0aWwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gdXRpbC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjdBMTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gaWQzdGFnLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGN0IxMTI0RTI5ODAwRTAxRkU3IC8qIGwzc2lkZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBsM3NpZGUuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY3QzExMjRFMjk4MDBFMDFGRTcgLyogcHN5bW9kZWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gcHN5bW9kZWwuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY3RDExMjRFMjk4MDBFMDFGRTcgLyogdmJycXVhbnRpemUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gdmJycXVhbnRpemUuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY3RTExMjRFMjk4MDBFMDFGRTcgLyogdmJycXVhbnRpemUuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gdmJycXVhbnRpemUuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY3RjExMjRFMjk4MDBFMDFGRTcgLyogdXRpbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSB1dGlsLmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGODAxMTI0RTI5ODAwRTAxRkU3IC8qIGJpdHN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBiaXRzdHJlYW0uaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY4MTExMjRFMjk4MDBFMDFGRTcgLyogdGFrZWhpcm8uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gdGFrZWhpcm8uYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY4MjExMjRFMjk4MDBFMDFGRTcgLyogcHJlc2V0cy5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBwcmVzZXRzLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGODMxMTI0RTI5ODAwRTAxRkU3IC8qIHJlc2Vydm9pci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSByZXNlcnZvaXIuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY4NDExMjRFMjk4MDBFMDFGRTcgLyogbGFtZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBsYW1lLmM7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJRDdEMEZGODUxMTI0RTI5ODAwRTAxRkU3IC8qIFZiclRhZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBWYnJUYWcuaDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY4NjExMjRFMjk4MDBFMDFGRTcgLyogVmJyVGFnLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFZiclRhZy5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjg3MTEyNEUyOTgwMEUwMUZFNyAvKiBuZXdtZGN0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IG5ld21kY3QuYzsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQlEN0QwRkY4ODExMjRFMjk4MDBFMDFGRTcgLyogYml0c3RyZWFtLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGJpdHN0cmVhbS5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjg5MTEyNEUyOTgwMEUwMUZFNyAvKiBwc3ltb2RlbC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBwc3ltb2RlbC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCUQ3RDBGRjhBMTEyNEUyOTgwMEUwMUZFNyAvKiBsYW1lX2dsb2JhbF9mbGFncy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBsYW1lX2dsb2JhbF9mbGFncy5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJRDI4OTk4ODUwNUU2OEUwMDAwNEVEQjg2IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMDhGQjc3OTRGRTg0MTU1REMwMkFBQzA3IC8qIGxpYm1wM2xhbWUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUQ3MTM1MDQ2MTEyNEQ1NjYwMEUyQzFEQSAvKiBNYWNDb25maWdFeHRlcm5hbERlYnVnLnhjY29uZmlnICovLAorCQkJCUQ3MTM1MDQ3MTEyNEQ1NjYwMEUyQzFEQSAvKiBNYWNDb25maWdFeHRlcm5hbFJlbGVhc2UueGNjb25maWcgKi8sCisJCQkJMDhGQjc3OTVGRTg0MTU1REMwMkFBQzA3IC8qIFNvdXJjZSAqLywKKwkJCQkxQUI2NzRBREZFOUQ1NEI1MTFDQTJDQkIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9IGxpYm1wM2xhbWU7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwOEZCNzc5NUZFODQxNTVEQzAyQUFDMDcgLyogU291cmNlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlEN0QwRkY2MjExMjRFMjk4MDBFMDFGRTcgLyogY29uZmlnLmggKi8sCisJCQkJRDdEMEZGNjMxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplLmggKi8sCisJCQkJRDdEMEZGNjQxMTI0RTI5ODAwRTAxRkU3IC8qIGVuY29kZXIuaCAqLywKKwkJCQlEN0QwRkY2NTExMjRFMjk4MDBFMDFGRTcgLyogcXVhbnRpemVfcHZ0LmMgKi8sCisJCQkJRDdEMEZGNjYxMTI0RTI5ODAwRTAxRkU3IC8qIG5ld21kY3QuaCAqLywKKwkJCQlEN0QwRkY2NzExMjRFMjk4MDBFMDFGRTcgLyogbGFtZS1hbmFseXNpcy5oICovLAorCQkJCUQ3RDBGRjY4MTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuYyAqLywKKwkJCQlEN0QwRkY2OTExMjRFMjk4MDBFMDFGRTcgLyogcmVzZXJ2b2lyLmMgKi8sCisJCQkJRDdEMEZGNkExMTI0RTI5ODAwRTAxRkU3IC8qIHRhYmxlcy5oICovLAorCQkJCUQ3RDBGRjZCMTEyNEUyOTgwMEUwMUZFNyAvKiBzZXRfZ2V0LmggKi8sCisJCQkJRDdEMEZGNkMxMTI0RTI5ODAwRTAxRkU3IC8qIHZlcnNpb24uaCAqLywKKwkJCQlEN0QwRkY2RDExMjRFMjk4MDBFMDFGRTcgLyogdmVyc2lvbi5jICovLAorCQkJCUQ3RDBGRjZFMTEyNEUyOTgwMEUwMUZFNyAvKiBtYWNoaW5lLmggKi8sCisJCQkJRDdEMEZGNkYxMTI0RTI5ODAwRTAxRkU3IC8qIGZmdC5oICovLAorCQkJCUQ3RDBGRjcwMTEyNEUyOTgwMEUwMUZFNyAvKiBlbmNvZGVyLmMgKi8sCisJCQkJRDdEMEZGNzExMTI0RTI5ODAwRTAxRkU3IC8qIGZmdC5jICovLAorCQkJCUQ3RDBGRjcyMTEyNEUyOTgwMEUwMUZFNyAvKiBnYWluX2FuYWx5c2lzLmMgKi8sCisJCQkJRDdEMEZGNzMxMTI0RTI5ODAwRTAxRkU3IC8qIG1wZ2xpYl9pbnRlcmZhY2UuYyAqLywKKwkJCQlEN0QwRkY3NDExMjRFMjk4MDBFMDFGRTcgLyogcXVhbnRpemVfcHZ0LmggKi8sCisJCQkJRDdEMEZGNzUxMTI0RTI5ODAwRTAxRkU3IC8qIGdhaW5fYW5hbHlzaXMuaCAqLywKKwkJCQlEN0QwRkY3NjExMjRFMjk4MDBFMDFGRTcgLyogcXVhbnRpemUuYyAqLywKKwkJCQlEN0QwRkY3NzExMjRFMjk4MDBFMDFGRTcgLyogc2V0X2dldC5jICovLAorCQkJCUQ3RDBGRjc4MTEyNEUyOTgwMEUwMUZFNyAvKiB0YWJsZXMuYyAqLywKKwkJCQlEN0QwRkY3OTExMjRFMjk4MDBFMDFGRTcgLyogdXRpbC5jICovLAorCQkJCUQ3RDBGRjdBMTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuaCAqLywKKwkJCQlEN0QwRkY3QjExMjRFMjk4MDBFMDFGRTcgLyogbDNzaWRlLmggKi8sCisJCQkJRDdEMEZGN0MxMTI0RTI5ODAwRTAxRkU3IC8qIHBzeW1vZGVsLmggKi8sCisJCQkJRDdEMEZGN0QxMTI0RTI5ODAwRTAxRkU3IC8qIHZicnF1YW50aXplLmggKi8sCisJCQkJRDdEMEZGN0UxMTI0RTI5ODAwRTAxRkU3IC8qIHZicnF1YW50aXplLmMgKi8sCisJCQkJRDdEMEZGN0YxMTI0RTI5ODAwRTAxRkU3IC8qIHV0aWwuaCAqLywKKwkJCQlEN0QwRkY4MDExMjRFMjk4MDBFMDFGRTcgLyogYml0c3RyZWFtLmggKi8sCisJCQkJRDdEMEZGODExMTI0RTI5ODAwRTAxRkU3IC8qIHRha2VoaXJvLmMgKi8sCisJCQkJRDdEMEZGODIxMTI0RTI5ODAwRTAxRkU3IC8qIHByZXNldHMuYyAqLywKKwkJCQlEN0QwRkY4MzExMjRFMjk4MDBFMDFGRTcgLyogcmVzZXJ2b2lyLmggKi8sCisJCQkJRDdEMEZGODQxMTI0RTI5ODAwRTAxRkU3IC8qIGxhbWUuYyAqLywKKwkJCQlEN0QwRkY4NTExMjRFMjk4MDBFMDFGRTcgLyogVmJyVGFnLmggKi8sCisJCQkJRDdEMEZGODYxMTI0RTI5ODAwRTAxRkU3IC8qIFZiclRhZy5jICovLAorCQkJCUQ3RDBGRjg3MTEyNEUyOTgwMEUwMUZFNyAvKiBuZXdtZGN0LmMgKi8sCisJCQkJRDdEMEZGODgxMTI0RTI5ODAwRTAxRkU3IC8qIGJpdHN0cmVhbS5jICovLAorCQkJCUQ3RDBGRjg5MTEyNEUyOTgwMEUwMUZFNyAvKiBwc3ltb2RlbC5jICovLAorCQkJCUQ3RDBGRjhBMTEyNEUyOTgwMEUwMUZFNyAvKiBsYW1lX2dsb2JhbF9mbGFncy5oICovLAorCQkJKTsKKwkJCW5hbWUgPSBTb3VyY2U7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQUI2NzRBREZFOUQ1NEI1MTFDQTJDQkIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUQyQUFDMDYzMDU1NDY2MEIwMERCNTE4RCAvKiBsaWJhdWRpb2VuYy5keWxpYiAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQlEMkFBQzA2MDA1NTQ2NjBCMDBEQjUxOEQgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUQ3RDBGRjhCMTEyNEUyOTgwMEUwMUZFNyAvKiBjb25maWcuaCBpbiBIZWFkZXJzICovLAorCQkJCUQ3RDBGRjhDMTEyNEUyOTgwMEUwMUZFNyAvKiBxdWFudGl6ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGOEQxMTI0RTI5ODAwRTAxRkU3IC8qIGVuY29kZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUQ3RDBGRjhGMTEyNEUyOTgwMEUwMUZFNyAvKiBuZXdtZGN0LmggaW4gSGVhZGVycyAqLywKKwkJCQlEN0QwRkY5MDExMjRFMjk4MDBFMDFGRTcgLyogbGFtZS1hbmFseXNpcy5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGOTMxMTI0RTI5ODAwRTAxRkU3IC8qIHRhYmxlcy5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGOTQxMTI0RTI5ODAwRTAxRkU3IC8qIHNldF9nZXQuaCBpbiBIZWFkZXJzICovLAorCQkJCUQ3RDBGRjk1MTEyNEUyOTgwMEUwMUZFNyAvKiB2ZXJzaW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQlEN0QwRkY5NzExMjRFMjk4MDBFMDFGRTcgLyogbWFjaGluZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGOTgxMTI0RTI5ODAwRTAxRkU3IC8qIGZmdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGOUQxMTI0RTI5ODAwRTAxRkU3IC8qIHF1YW50aXplX3B2dC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGOUUxMTI0RTI5ODAwRTAxRkU3IC8qIGdhaW5fYW5hbHlzaXMuaCBpbiBIZWFkZXJzICovLAorCQkJCUQ3RDBGRkEzMTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuaCBpbiBIZWFkZXJzICovLAorCQkJCUQ3RDBGRkE0MTEyNEUyOTgwMEUwMUZFNyAvKiBsM3NpZGUuaCBpbiBIZWFkZXJzICovLAorCQkJCUQ3RDBGRkE1MTEyNEUyOTgwMEUwMUZFNyAvKiBwc3ltb2RlbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGQTYxMTI0RTI5ODAwRTAxRkU3IC8qIHZicnF1YW50aXplLmggaW4gSGVhZGVycyAqLywKKwkJCQlEN0QwRkZBODExMjRFMjk4MDBFMDFGRTcgLyogdXRpbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGQTkxMTI0RTI5ODAwRTAxRkU3IC8qIGJpdHN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGQUMxMTI0RTI5ODAwRTAxRkU3IC8qIHJlc2Vydm9pci5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGQUUxMTI0RTI5ODAwRTAxRkU3IC8qIFZiclRhZy5oIGluIEhlYWRlcnMgKi8sCisJCQkJRDdEMEZGQjMxMTI0RTI5ODAwRTAxRkU3IC8qIGxhbWVfZ2xvYmFsX2ZsYWdzLmggaW4gSGVhZGVycyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCUQyQUFDMDYyMDU1NDY2MEIwMERCNTE4RCAvKiBsaWJtcDNsYW1lICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFERUI5MTRBMDg3MzNEOEUwMDEwRTlDRCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGlibXAzbGFtZSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlEN0IzODUyQzExMjRFODZDMDAyNTAxMzcgLyogU2hlbGxTY3JpcHQgKi8sCisJCQkJRDJBQUMwNjAwNTU0NjYwQjAwREI1MThEIC8qIEhlYWRlcnMgKi8sCisJCQkJRDJBQUMwNjEwNTU0NjYwQjAwREI1MThEIC8qIFNvdXJjZXMgKi8sCisJCQkJRDI4OTk4ODUwNUU2OEUwMDAwNEVEQjg2IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IGxpYm1wM2xhbWU7CisJCQlwcm9kdWN0TmFtZSA9IGxpYm1wM2xhbWU7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gRDJBQUMwNjMwNTU0NjYwQjAwREI1MThEIC8qIGxpYmF1ZGlvZW5jLmR5bGliICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5saWJyYXJ5LmR5bmFtaWMiOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFERUI5MTRFMDg3MzNEOEUwMDEwRTlDRCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImxpYm1wM2xhbWUiICovOworCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMy4xIjsKKwkJCWRldmVsb3BtZW50UmVnaW9uID0gRW5nbGlzaDsKKwkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOworCQkJa25vd25SZWdpb25zID0gKAorCQkJCUVuZ2xpc2gsCisJCQkJSmFwYW5lc2UsCisJCQkJRnJlbmNoLAorCQkJCUdlcm1hbiwKKwkJCSk7CisJCQltYWluR3JvdXAgPSAwOEZCNzc5NEZFODQxNTVEQzAyQUFDMDcgLyogbGlibXAzbGFtZSAqLzsKKwkJCXByb2plY3REaXJQYXRoID0gIiI7CisJCQlwcm9qZWN0Um9vdCA9ICIiOworCQkJdGFyZ2V0cyA9ICgKKwkJCQlEMkFBQzA2MjA1NTQ2NjBCMDBEQjUxOEQgLyogbGlibXAzbGFtZSAqLywKKwkJCSk7CisJCX07CisvKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCUQ3QjM4NTJDMTEyNEU4NkMwMDI1MDEzNyAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDEyOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCQkiJChTUkNST09UKS8uLi9jb25maWdNYWMuaCIsCisJCQkpOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkJIiQoU1JDUk9PVCkvLi4vY29uZmlnLmgiLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gImNwICRTUkNST09ULy4uL2NvbmZpZ01hYy5oICRTUkNST09ULy4uL2NvbmZpZy5oICI7CisJCX07CisvKiBFbmQgUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQlEMkFBQzA2MTA1NTQ2NjBCMDBEQjUxOEQgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUQ3RDBGRjhFMTEyNEUyOTgwMEUwMUZFNyAvKiBxdWFudGl6ZV9wdnQuYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRjkxMTEyNEUyOTgwMEUwMUZFNyAvKiBpZDN0YWcuYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRjkyMTEyNEUyOTgwMEUwMUZFNyAvKiByZXNlcnZvaXIuYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRjk2MTEyNEUyOTgwMEUwMUZFNyAvKiB2ZXJzaW9uLmMgaW4gU291cmNlcyAqLywKKwkJCQlEN0QwRkY5OTExMjRFMjk4MDBFMDFGRTcgLyogZW5jb2Rlci5jIGluIFNvdXJjZXMgKi8sCisJCQkJRDdEMEZGOUExMTI0RTI5ODAwRTAxRkU3IC8qIGZmdC5jIGluIFNvdXJjZXMgKi8sCisJCQkJRDdEMEZGOUIxMTI0RTI5ODAwRTAxRkU3IC8qIGdhaW5fYW5hbHlzaXMuYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRjlDMTEyNEUyOTgwMEUwMUZFNyAvKiBtcGdsaWJfaW50ZXJmYWNlLmMgaW4gU291cmNlcyAqLywKKwkJCQlEN0QwRkY5RjExMjRFMjk4MDBFMDFGRTcgLyogcXVhbnRpemUuYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRkEwMTEyNEUyOTgwMEUwMUZFNyAvKiBzZXRfZ2V0LmMgaW4gU291cmNlcyAqLywKKwkJCQlEN0QwRkZBMTExMjRFMjk4MDBFMDFGRTcgLyogdGFibGVzLmMgaW4gU291cmNlcyAqLywKKwkJCQlEN0QwRkZBMjExMjRFMjk4MDBFMDFGRTcgLyogdXRpbC5jIGluIFNvdXJjZXMgKi8sCisJCQkJRDdEMEZGQTcxMTI0RTI5ODAwRTAxRkU3IC8qIHZicnF1YW50aXplLmMgaW4gU291cmNlcyAqLywKKwkJCQlEN0QwRkZBQTExMjRFMjk4MDBFMDFGRTcgLyogdGFrZWhpcm8uYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRkFCMTEyNEUyOTgwMEUwMUZFNyAvKiBwcmVzZXRzLmMgaW4gU291cmNlcyAqLywKKwkJCQlEN0QwRkZBRDExMjRFMjk4MDBFMDFGRTcgLyogbGFtZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJRDdEMEZGQUYxMTI0RTI5ODAwRTAxRkU3IC8qIFZiclRhZy5jIGluIFNvdXJjZXMgKi8sCisJCQkJRDdEMEZGQjAxMTI0RTI5ODAwRTAxRkU3IC8qIG5ld21kY3QuYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRkIxMTEyNEUyOTgwMEUwMUZFNyAvKiBiaXRzdHJlYW0uYyBpbiBTb3VyY2VzICovLAorCQkJCUQ3RDBGRkIyMTEyNEUyOTgwMEUwMUZFNyAvKiBwc3ltb2RlbC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCTFERUI5MTRCMDg3MzNEOEUwMDEwRTlDRCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlFWEVDVVRBQkxFX1BSRUZJWCA9IGxpYjsKKwkJCQlQUk9EVUNUX05BTUUgPSBhdWRpb2VuYzsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFERUI5MTRDMDg3MzNEOEUwMDEwRTlDRCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUVYRUNVVEFCTEVfUFJFRklYID0gbGliOworCQkJCVBST0RVQ1RfTkFNRSA9IGF1ZGlvZW5jOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxREVCOTE0RjA4NzMzRDhFMDAxMEU5Q0QgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gRDcxMzUwNDYxMTI0RDU2NjAwRTJDMURBIC8qIE1hY0NvbmZpZ0V4dGVybmFsRGVidWcueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gTk87CisJCQkJT1RIRVJfQ0ZMQUdTID0gKAorCQkJCQkiJChpbmhlcml0ZWQpIiwKKwkJCQkJIi1ESEFWRV9DT05GSUdfSCIsCisJCQkJCSItTzMiLAorCQkJCQkiLWZmYXN0LW1hdGgiLAorCQkJCQkiLWZ1bnJvbGwtbG9vcHMiLAorCQkJCQkiLVdhbGwiLAorCQkJCQkiLWZuby1jb21tb24iLAorCQkJCSk7CisJCQkJVVNFUl9IRUFERVJfU0VBUkNIX1BBVEhTID0gIi4uL2luY2x1ZGUgLi4vIC4uL21wZ2xpYiI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxREVCOTE1MDA4NzMzRDhFMDAxMEU5Q0QgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSBENzEzNTA0NzExMjRENTY2MDBFMkMxREEgLyogTWFjQ29uZmlnRXh0ZXJuYWxSZWxlYXNlLnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfU1lNQk9MU19QUklWQVRFX0VYVEVSTiA9IE5POworCQkJCU9USEVSX0NGTEFHUyA9ICgKKwkJCQkJIiQoaW5oZXJpdGVkKSIsCisJCQkJCSItREhBVkVfQ09ORklHX0giLAorCQkJCQkiLU8zIiwKKwkJCQkJIi1mZmFzdC1tYXRoIiwKKwkJCQkJIi1mdW5yb2xsLWxvb3BzIiwKKwkJCQkJIi1XYWxsIiwKKwkJCQkJIi1mbm8tY29tbW9uIiwKKwkJCQkpOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9ICIuLi9pbmNsdWRlIC4uLyAuLi9tcGdsaWIiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTFERUI5MTRBMDg3MzNEOEUwMDEwRTlDRCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGlibXAzbGFtZSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxREVCOTE0QjA4NzMzRDhFMDAxMEU5Q0QgLyogRGVidWcgKi8sCisJCQkJMURFQjkxNEMwODczM0Q4RTAwMTBFOUNEIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMURFQjkxNEUwODczM0Q4RTAwMTBFOUNEIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAibGlibXAzbGFtZSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxREVCOTE0RjA4NzMzRDhFMDAxMEU5Q0QgLyogRGVidWcgKi8sCisJCQkJMURFQjkxNTAwODczM0Q4RTAwMTBFOUNEIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAwOEZCNzc5M0ZFODQxNTVEQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2xpYm1wM2xhbWVfZGxsX3ZjNi5kc3AgYi9saWJtcDNsYW1lL2xpYm1wM2xhbWVfZGxsX3ZjNi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3NDMxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbGlibXAzbGFtZV9kbGxfdmM2LmRzcApAQCAtMCwwICsxLDEyMzggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibGlibXAzbGFtZSBETEwiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMg0KKw0KK0NGRz1saWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UNCishTUVTU0FHRSBEaWVzIGlzdCBrZWluIGf8bHRpZ2VzIE1ha2VmaWxlLiBadW0gRXJzdGVsbGVuIGRpZXNlcyBQcm9qZWt0cyBtaXQgTk1BS0UNCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZvxocmVuIFNpZSBkZW4gQmVmZWhsDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImxpYm1wM2xhbWVfZGxsX3ZjNi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImxpYm1wM2xhbWVfZGxsX3ZjNi5tYWsiIENGRz0ibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIEb8ciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorTVRMPW1pZGwuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJtcDNsYSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJsaWJtcDNsYSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlXGxpYm1wM2xhbWVETEwiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9PYjIgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0dzMTAyNCAvRkQgL0dBeSAvUUlmZGl2IC9RSTBmIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL09iMiAvSSAiLi4vbGlibXAzbGFtZSIgL0kgIi4uLyIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2luY2x1ZGUiIC9JICIuLiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJXSU4zMiIgL0QgIkhBVkVfQ09ORklHX0giIC9HczEwMjQgL0ZEIC9HQXkgL1FJZmRpdiAvUUkwZiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5DQorIyBBREQgUlNDIC9sIDB4NDA5DQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2IC9kZWY6Ii4uXGluY2x1ZGVcbGFtZS5kZWYiIC9mb3JjZSAvb3V0OiIuLlxvdXRwdXRcUmVsZWFzZVxsaWJtcDNsYW1lLmRsbCIgL29wdDpOT1dJTjk4DQorIyBTVUJUUkFDVCBMSU5LMzIgL25vZGVmYXVsdGxpYg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxvdXRwdXRcRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxEZWJ1Z1xsaWJtcDNsYW1lRExMIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL1ppIC9PZCAvSSAiLi4vbGlibXAzbGFtZSIgL0kgIi4uLyIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2luY2x1ZGUiIC9JICIuLiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJXSU4zMiIgL0QgIkhBVkVfQ09ORklHX0giIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9GciAvWVgNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOQ0KKyMgQUREIFJTQyAvbCAweDQwOQ0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvZGVmOiIuLlxpbmNsdWRlXGxhbWUuZGVmIiAvZm9yY2UgL291dDoiLi5cb3V0cHV0XERlYnVnXGxpYm1wM2xhbWUuZGxsIiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUgL21hcCAvbm9kZWZhdWx0bGliDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImxpYm1wM2xhIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImxpYm1wM2xhIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxvdXRwdXRcUmVsZWFzZV9OQVNNIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9PYjIgL0kgIi4uLyIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2luY2x1ZGUiIC9JICIuLiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJXSU4zMiIgL0QgIkhBVkVfQ09ORklHX0giIC9HczEwMjQgL0ZEIC9HQXkgL1FJZmRpdiAvUUkwZiAvYw0KKyMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL09iMiAvSSAiLi4vbGlibXAzbGFtZSIgL0kgIi4uLyIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2luY2x1ZGUiIC9JICIuLiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJIQVZFX0NPTkZJR19IIiAvRCAiSEFWRV9OQVNNIiAvRCAiTU1YX2Nob29zZV90YWJsZSIgL0QgIldJTjMyIiAvRCAiX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIiAvR3MxMDI0IC9GRCAvR0F5IC9RSWZkaXYgL1FJMGYgL2MNCisjIFNVQlRSQUNUIENQUCAvWVgNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOQ0KKyMgQUREIFJTQyAvbCAweDQwOQ0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvcGRiOm5vbmUgL21hY2hpbmU6STM4NiAvZGVmOiIuLlxpbmNsdWRlXGxhbWUuZGVmIiAvZm9yY2UgL291dDoiLi5cb3V0cHV0XFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lLmRsbCIgL29wdDpOT1dJTjk4DQorIyBTVUJUUkFDVCBMSU5LMzIgL25vZGVmYXVsdGxpYg0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisjIE5hbWUgImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKyMgQmVnaW4gR3JvdXAgImVuY29kZXIgc291cmNlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiouYyINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYml0c3RyZWFtLmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGVuY29kZXIuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZmZ0LmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGdhaW5fYW5hbHlzaXMuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caWQzdGFnLmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxhbWUuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbXBnbGliX2ludGVyZmFjZS5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxuZXdtZGN0LmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHByZXNldHMuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccHN5bW9kZWwuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccXVhbnRpemUuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccXVhbnRpemVfcHZ0LmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc2Vydm9pci5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxzZXRfZ2V0LmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHRhYmxlcy5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx0YWtlaGlyby5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx1dGlsLmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHZicnF1YW50aXplLmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFZiclRhZy5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx2ZXJzaW9uLmMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJlbmNvZGVyIGhlYWRlciINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIi5oIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxiaXRzdHJlYW0uaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGVuY29kZXIuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGZmdC5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZ2Fpbl9hbmFseXNpcy5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caWQzdGFnLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxsM3NpZGUuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0iLlxsYW1lLWFuYWx5c2lzLmgiDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGFtZV9nbG9iYWxfZmxhZ3MuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxhbWVlcnJvci5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbWFjaGluZS5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbmV3bWRjdC5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccHN5bW9kZWwuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHF1YW50aXplLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxxdWFudGl6ZV9wdnQuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc2Vydm9pci5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc2V0X2dldC5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdGFibGVzLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx1dGlsLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx2YnJxdWFudGl6ZS5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVmJyVGFnLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx2ZXJzaW9uLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQXNtIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpMzg2XGNob29zZV90YWJsZS5uYXMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLg0KK0lucHV0RGlyPS5caTM4Ng0KK0ludERpcj0uXC4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTA0KK0lucHV0UGF0aD0uXGkzODZcY2hvb3NlX3RhYmxlLm5hcw0KK0lucHV0TmFtZT1jaG9vc2VfdGFibGUNCisNCisiJChJbnREaXIpLyQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorCW5hc213IC1mIHdpbjMyIC1pICQoSW5wdXREaXIpLyAtRFdJTjMyICQoSW5wdXRQYXRoKSAtbyAgICQoSW50RGlyKS8kKElucHV0TmFtZSkub2JqDQorDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGkzODZcY3B1X2ZlYXQubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4NCitJbnB1dERpcj0uXGkzODYNCitJbnREaXI9LlwuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwNCitJbnB1dFBhdGg9LlxpMzg2XGNwdV9mZWF0Lm5hcw0KK0lucHV0TmFtZT1jcHVfZmVhdA0KKw0KKyIkKEludERpcikvJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJbmFzbXcgLWYgd2luMzIgLWkgJChJbnB1dERpcikvIC1EV0lOMzIgJChJbnB1dFBhdGgpIC1vICAgJChJbnREaXIpLyQoSW5wdXROYW1lKS5vYmoNCisNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxmZnQubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpMzg2XGZmdDNkbi5uYXMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLg0KK0lucHV0RGlyPS5caTM4Ng0KK0ludERpcj0uXC4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTA0KK0lucHV0UGF0aD0uXGkzODZcZmZ0M2RuLm5hcw0KK0lucHV0TmFtZT1mZnQzZG4NCisNCisiJChJbnREaXIpLyQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorCW5hc213IC1mIHdpbjMyIC1pICQoSW5wdXREaXIpLyAtRFdJTjMyICQoSW5wdXRQYXRoKSAtbyAgICQoSW50RGlyKS8kKElucHV0TmFtZSkub2JqDQorDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGkzODZcZmZ0ZnB1Lm5hcw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxmZnRzc2UubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4NCitJbnB1dERpcj0uXGkzODYNCitJbnREaXI9LlwuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwNCitJbnB1dFBhdGg9LlxpMzg2XGZmdHNzZS5uYXMNCitJbnB1dE5hbWU9ZmZ0c3NlDQorDQorIiQoSW50RGlyKS8kKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKwluYXNtdyAtZiB3aW4zMiAtaSAkKElucHV0RGlyKS8gLURXSU4zMiAkKElucHV0UGF0aCkgLW8gICAkKEludERpcikvJChJbnB1dE5hbWUpLm9iag0KKw0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpMzg2XGZmdHRibC5uYXMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWVETEwiDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGkzODZcc2NhbGFyLm5hcw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgImRlY29kZXIgc291cmNlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIi5jIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGNvbW1vbi5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGRjdDY0X2kzODYuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXG1wZ2xpYlxkZWNvZGVfaTM4Ni5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGludGVyZmFjZS5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGxheWVyMS5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGxheWVyMi5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGxheWVyMy5jDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lRExMIg0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXHRhYmluaXQuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZURMTCINCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgImRlY29kZXIgaGVhZGVyIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiLmgiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxtcGdsaWJcY29tbW9uLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGRjdDY0X2kzODYuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxtcGdsaWJcZGVjb2RlX2kzODYuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxtcGdsaWJcaHVmZm1hbi5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXG1wZ2xpYlxpbnRlcmZhY2UuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxtcGdsaWJcbGF5ZXIxLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXGxheWVyMi5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXG1wZ2xpYlxsYXllcjMuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxtcGdsaWJcbXBnMTIzLmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbXBnbGliXG1wZ2xpYi5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXG1wZ2xpYlx0YWJpbml0LmgNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIERMTCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxjb25maWdNUy5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gUGVyZm9ybWluZyBDdXN0b20gQnVpbGQgU3RlcCBvbiAkKElucHV0TmFtZSkNCitJbnB1dFBhdGg9Li5cY29uZmlnTVMuaA0KKw0KKyIuLlxjb25maWcuaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oDQorDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgRExMIC0gV2luMzIgRGVidWciDQorDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBQZXJmb3JtaW5nIEN1c3RvbSBCdWlsZCBTdGVwIG9uICQoSW5wdXROYW1lKQ0KK0lucHV0UGF0aD0uLlxjb25maWdNUy5oDQorDQorIi4uXGNvbmZpZy5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKwljb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgNCisNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSBETEwgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXGxhbWUuZGVmDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9saWJtcDNsYW1lX2ljYy5pY3Byb2ogYi9saWJtcDNsYW1lL2xpYm1wM2xhbWVfaWNjLmljcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTFiMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9saWJtcDNsYW1lX2ljYy5pY3Byb2oKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IkludGVsIEMrKyBQcm9qZWN0Ig0KKwlWZXJzaW9uPSIxMS4xIg0KKwlOYW1lPSJsaWJtcDNsYW1lX2ljYyINCisJUHJvamVjdEdVSUQ9InsyODQwMDVGMi0yNEFBLTQwRTItQkUzQi01RjkzOThDNDdDMEV9Ig0KKwlWQ05lc3RlZFByb2plY3RHVUlEPSJ7NkNFNjdEQjktODRDMy00M0E1LUEyMEYtQTdCMDdGOUExNkJFfSINCisJVkNOZXN0ZWRQcm9qZWN0RmlsZU5hbWU9ImxpYm1wM2xhbWVfaWNjLnZjcHJvaiI+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iQ3BwQ21wbHJUb29sIg0KKwkJCQlHZW5lcmF0ZUFsdGVybmF0ZUNvZGVQYXRocz0iMiINCisJCQkJVXNlUHJvY2Vzc29yRXh0ZW5zaW9ucz0iMSIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlIE5BU018V2luMzIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IkNwcENtcGxyVG9vbCINCisJCQkJR2VuZXJhdGVBbHRlcm5hdGVDb2RlUGF0aHM9IjIiDQorCQkJCVVzZVByb2Nlc3NvckV4dGVuc2lvbnM9IjEiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPEZpbGVzLz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9saWJtcDNsYW1lX2ljYy52Y3Byb2ogYi9saWJtcDNsYW1lL2xpYm1wM2xhbWVfaWNjLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk1OTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9saWJtcDNsYW1lX2ljYy52Y3Byb2oKQEAgLTAsMCArMSw2MTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LjAwIg0KKwlOYW1lPSJsaWJtcDNsYW1lX2ljYyINCisJUHJvamVjdEdVSUQ9Ins2Q0U2N0RCOS04NEMzLTQzQTUtQTIwRi1BN0IwN0Y5QTE2QkV9Ig0KKwlSb290TmFtZXNwYWNlPSJsaWJtcDNsYW1lX2ljYyINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUHJvamVjdERpcikkKENvbmZpZ3VyYXRpb25OYW1lKUlDQyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpSUNDIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJChQcm9qZWN0RGlyKS4uXGNvbmZpZ01TLmggJChQcm9qZWN0RGlyKS4uXGNvbmZpZy5oIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vaW5jbHVkZTsuLi87Li4vbXBnbGliOy4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHLF9XSU5ET1dTLFdJTjMyLEhBVkVfQ09ORklHX0gsX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PSIyIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUHJvamVjdERpcikkKENvbmZpZ3VyYXRpb25OYW1lKUlDQyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpSUNDIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjAiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICQoUHJvamVjdERpcikuLlxjb25maWdNUy5oICQoUHJvamVjdERpcikuLlxjb25maWcuaCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2luY2x1ZGU7Li4vOy4uL21wZ2xpYjsuLyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyxfV0lORE9XUyxXSU4zMixIQVZFX0NPTkZJR19ILF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnIE5BU018V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFByb2plY3REaXIpJChDb25maWd1cmF0aW9uTmFtZSlJQ0MiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKUlDQyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iY29weSAkKFByb2plY3REaXIpLi5cY29uZmlnTVMuaCAkKFByb2plY3REaXIpLi5cY29uZmlnLmgiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249ImZhbHNlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9pbmNsdWRlOy4uLzsuLi9tcGdsaWI7Li87Li92ZWN0b3IiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X1dJTkRPV1M7V0lOMzI7SEFWRV9DT05GSUdfSDtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7SEFWRV9OQVNNO01NWF9jaG9vc2VfdGFibGU7VVNFX0ZGVFNTRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUHJvamVjdERpcikkKENvbmZpZ3VyYXRpb25OYW1lKUlDQyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpSUNDIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICQoUHJvamVjdERpcikuLlxjb25maWdNUy5oICQoUHJvamVjdERpcikuLlxjb25maWcuaCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9pbmNsdWRlOy4uLzsuLi9tcGdsaWI7Li87Li92ZWN0b3IiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUcsX1dJTkRPV1MsV0lOMzIsSEFWRV9DT05GSUdfSCxfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUsSEFWRV9OQVNNLE1NWF9jaG9vc2VfdGFibGUsVVNFX0ZGVFNTRSINCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UiDQorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGJpdHN0cmVhbS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxlbmNvZGVyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGZmdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnYWluX2FuYWx5c2lzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGlkM3RhZy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsYW1lLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXG1wZ2xpYl9pbnRlcmZhY2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbmV3bWRjdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxwcmVzZXRzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHBzeW1vZGVsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHF1YW50aXplLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHF1YW50aXplX3B2dC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxyZXNlcnZvaXIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc2V0X2dldC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0YWJsZXMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdGFrZWhpcm8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdXRpbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx2YnJxdWFudGl6ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxWYnJUYWcuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdmVyc2lvbi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cYml0c3RyZWFtLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxjb25maWdNUy5oIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJjb3B5IGNvbmZpZ01TLmggLSZndDsgY29uZmlnLmgiDQorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImNvcHkgY29uZmlnTVMuaCAtJmd0OyBjb25maWcuaCINCisJCQkJCQlDb21tYW5kTGluZT0iY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oJiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBOQVNNfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iY29weSBjb25maWdNUy5oIC0mZ3Q7IGNvbmZpZy5oIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iLi5cY29uZmlnLmgiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImNvcHkgY29uZmlnTVMuaCAtJmd0OyBjb25maWcuaCINCisJCQkJCQlDb21tYW5kTGluZT0iY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oJiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBHVEt8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJjb3B5IGNvbmZpZ01TLmggLSZndDsgY29uZmlnLmgiDQorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxlbmNvZGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGZmdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnYWluX2FuYWx5c2lzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGlkM3RhZy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsM3NpZGUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbGFtZS1hbmFseXNpcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsYW1lX2dsb2JhbF9mbGFncy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx2ZWN0b3JcbGFtZV9pbnRyaW4uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbGFtZWVycm9yLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXG1hY2hpbmUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbmV3bWRjdC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxwc3ltb2RlbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxxdWFudGl6ZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxxdWFudGl6ZV9wdnQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccmVzZXJ2b2lyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNldF9nZXQuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdGFibGVzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHV0aWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdmJycXVhbnRpemUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cVmJyVGFnLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHZlcnNpb24uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkludGVyZmFjZSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxpbmNsdWRlXGxhbWUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkFzc2VtYmx5Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caTM4NlxjaG9vc2VfdGFibGUubmFzIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWcgTkFTTXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249IkFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSIkKFByb2plY3REaXIpXC4uXC4uXC4uXFRvb2xzXG5hc21cbmFzbXcgIC1mIHdpbjMyIC1pICAkKElucHV0RGlyKSAtRFdJTjMyICAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5uYXMmI3gwRDsmI3gwQTttb3ZlICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm9iaiAgJnF1b3Q7JChPdXREaXIpJnF1b3Q7JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9IiQoT3V0RGlyKS8kKElucHV0TmFtZSkub2JqIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlIE5BU018V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLiINCisJCQkJCQlDb21tYW5kTGluZT0iJChQcm9qZWN0RGlyKVwuLlwuLlwuLlxUb29sc1xuYXNtXG5hc213ICAtZiB3aW4zMiAtaSAgJChJbnB1dERpcikgLURXSU4zMiAgJChJbnB1dERpcikkKElucHV0TmFtZSkubmFzJiN4MEQ7JiN4MEE7bW92ZSAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5vYmogICZxdW90OyQoT3V0RGlyKSZxdW90OyYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIkKE91dERpcikvJChJbnB1dE5hbWUpLm9iaiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpMzg2XGNwdV9mZWF0Lm5hcyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnIE5BU018V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLiINCisJCQkJCQlDb21tYW5kTGluZT0iJChQcm9qZWN0RGlyKVwuLlwuLlwuLlxUb29sc1xuYXNtXG5hc213ICAtZiB3aW4zMiAtaSAgJChJbnB1dERpcikgLURXSU4zMiAgJChJbnB1dERpcikkKElucHV0TmFtZSkubmFzJiN4MEQ7JiN4MEE7bW92ZSAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5vYmogICZxdW90OyQoT3V0RGlyKSZxdW90OyYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIkKE91dERpcikvJChJbnB1dE5hbWUpLm9iaiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZSBOQVNNfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4iDQorCQkJCQkJQ29tbWFuZExpbmU9IiQoUHJvamVjdERpcilcLi5cLi5cLi5cVG9vbHNcbmFzbVxuYXNtdyAgLWYgd2luMzIgLWkgICQoSW5wdXREaXIpIC1EV0lOMzIgICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm5hcyYjeDBEOyYjeDBBO21vdmUgJChJbnB1dERpcikkKElucHV0TmFtZSkub2JqICAmcXVvdDskKE91dERpcikmcXVvdDsmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iJChPdXREaXIpLyQoSW5wdXROYW1lKS5vYmoiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caTM4NlxmZnQzZG4ubmFzIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWcgTkFTTXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249IkFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSIkKFByb2plY3REaXIpXC4uXC4uXC4uXFRvb2xzXG5hc21cbmFzbXcgIC1mIHdpbjMyIC1pICAkKElucHV0RGlyKSAtRFdJTjMyICAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5uYXMmI3gwRDsmI3gwQTttb3ZlICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm9iaiAgJnF1b3Q7JChPdXREaXIpJnF1b3Q7JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9IiQoT3V0RGlyKS8kKElucHV0TmFtZSkub2JqIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlIE5BU018V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLiINCisJCQkJCQlDb21tYW5kTGluZT0iJChQcm9qZWN0RGlyKVwuLlwuLlwuLlxUb29sc1xuYXNtXG5hc213ICAtZiB3aW4zMiAtaSAgJChJbnB1dERpcikgLURXSU4zMiAgJChJbnB1dERpcikkKElucHV0TmFtZSkubmFzJiN4MEQ7JiN4MEE7bW92ZSAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5vYmogICZxdW90OyQoT3V0RGlyKSZxdW90OyYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIkKE91dERpcikvJChJbnB1dE5hbWUpLm9iaiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpMzg2XGZmdHNzZS5uYXMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBOQVNNfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4iDQorCQkJCQkJQ29tbWFuZExpbmU9IiQoUHJvamVjdERpcilcLi5cLi5cLi5cVG9vbHNcbmFzbVxuYXNtdyAgLWYgd2luMzIgLWkgICQoSW5wdXREaXIpIC1EV0lOMzIgICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm5hcyYjeDBEOyYjeDBBO21vdmUgJChJbnB1dERpcikkKElucHV0TmFtZSkub2JqICAmcXVvdDskKE91dERpcikmcXVvdDsmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iJChPdXREaXIpLyQoSW5wdXROYW1lKS5vYmoiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249IkFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSIkKFByb2plY3REaXIpXC4uXC4uXC4uXFRvb2xzXG5hc21cbmFzbXcgIC1mIHdpbjMyIC1pICAkKElucHV0RGlyKSAtRFdJTjMyICAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5uYXMmI3gwRDsmI3gwQTttb3ZlICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm9iaiAgJnF1b3Q7JChPdXREaXIpJnF1b3Q7JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9IiQoT3V0RGlyKS8kKElucHV0TmFtZSkub2JqIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHZlY3Rvclx4bW1fcXVhbnRpemVfc3ViLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9saWJtcDNsYW1lX3ZjNi5kc3AgYi9saWJtcDNsYW1lL2xpYm1wM2xhbWVfdmM2LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhjNjAyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9saWJtcDNsYW1lX3ZjNi5kc3AKQEAgLTAsMCArMSw0ODcgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibGlibXAzbGFtZSIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIE5JQ0hUIEJFQVJCRUlURU4gKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQorDQorQ0ZHPWxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJsaWJtcDNsYW1lX3ZjNi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImxpYm1wM2xhbWVfdmM2Lm1hayIgQ0ZHPSJsaWJtcDNsYW1lIC0gV2luMzIgUmVsZWFzZSINCishTUVTU0FHRSANCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJsaWJtcDNsYW1lIC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgImxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlIE5BU00iIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJtcDNsYSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJsaWJtcDNsYSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlXGxpYm1wM2xhbWUiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9PYjIgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0dzMTAyNCAvRkQgL0dBeSAvUUlmZGl2IC9RSTBmIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9PMiAvT2IyIC9JICIuLi8iIC9JICIuLi9tcGdsaWIiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4iIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIkhBVkVfTVBHTElCIiAvRCAiV0lOMzIiIC9EICJIQVZFX0NPTkZJR19IIiAvR3MxMDI0IC9GRCAvR0F5IC9RSWZkaXYgL1FJMGYgL2MNCisjIFNVQlRSQUNUIENQUCAvWVgNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOQ0KKyMgQUREIFJTQyAvbCAweDQwOQ0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXG91dHB1dFxSZWxlYXNlXGxpYm1wM2xhbWUtc3RhdGljLmxpYiINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlxvdXRwdXRcRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxEZWJ1Z1xsaWJtcDNsYW1lIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aSSAvT2QgL0kgIi4uLyIgL0kgIi4uL21wZ2xpYiIgL0kgIi4uL2luY2x1ZGUiIC9JICIuLiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJXSU4zMiIgL0QgIkhBVkVfQ09ORklHX0giIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWA0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5DQorIyBBREQgUlNDIC9sIDB4NDA5DQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cb3V0cHV0XERlYnVnXGxpYm1wM2xhbWUtc3RhdGljLmxpYiINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJtcDNsYSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJsaWJtcDNsYSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XFJlbGVhc2VfTkFTTSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvT2IyIC9JICIuLi8iIC9JICIuLi9tcGdsaWIiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4iIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIkhBVkVfTVBHTElCIiAvRCAiV0lOMzIiIC9EICJIQVZFX0NPTkZJR19IIiAvR3MxMDI0IC9GRCAvR0F5IC9RSWZkaXYgL1FJMGYgL2MNCisjIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWA0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvTzIgL09iMiAvSSAiLi4vIiAvSSAiLi4vbXBnbGliIiAvSSAiLi4vaW5jbHVkZSIgL0kgIi4uIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJIQVZFX01QR0xJQiIgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0QgIkhBVkVfTkFTTSIgL0QgIk1NWF9jaG9vc2VfdGFibGUiIC9EICJfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiIC9HczEwMjQgL0ZEIC9HQXkgL1FJZmRpdiAvUUkwZiAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWA0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5DQorIyBBREQgUlNDIC9sIDB4NDA5DQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cb3V0cHV0XFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lLXN0YXRpYy5saWIiDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJsaWJtcDNsYW1lIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyINCisjIE5hbWUgImxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorIyBCZWdpbiBHcm91cCAiU291cmNlIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiYyINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYml0c3RyZWFtLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxlbmNvZGVyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxmZnQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGdhaW5fYW5hbHlzaXMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGlkM3RhZy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGFtZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbXBnbGliX2ludGVyZmFjZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbmV3bWRjdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccHJlc2V0cy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccHN5bW9kZWwuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHF1YW50aXplLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxxdWFudGl6ZV9wdnQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc2Vydm9pci5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc2V0X2dldC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdGFibGVzLmMNCisjIEFERCBDUFAgL1cxDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdGFrZWhpcm8uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHV0aWwuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHZicnF1YW50aXplLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxWYnJUYWcuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHZlcnNpb24uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJJbmNsdWRlIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYml0c3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cY29uZmlnTVMuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gUGVyZm9ybWluZyBDdXN0b20gQnVpbGQgU3RlcCBvbiAkKElucHV0TmFtZSkNCitJbnB1dFBhdGg9Li5cY29uZmlnTVMuaA0KKw0KKyIuLlxjb25maWcuaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oDQorDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIFBlcmZvcm1pbmcgQ3VzdG9tIEJ1aWxkIFN0ZXAgb24gJChJbnB1dE5hbWUpDQorSW5wdXRQYXRoPS4uXGNvbmZpZ01TLmgNCisNCisiLi5cY29uZmlnLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorCWNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaA0KKw0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gUGVyZm9ybWluZyBDdXN0b20gQnVpbGQgU3RlcCBvbiAkKElucHV0TmFtZSkNCitJbnB1dFBhdGg9Li5cY29uZmlnTVMuaA0KKw0KKyIuLlxjb25maWcuaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oDQorDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGVuY29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGZmdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZ2Fpbl9hbmFseXNpcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caWQzdGFnLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxsM3NpZGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0iLlxsYW1lLWFuYWx5c2lzLmgiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGFtZV9nbG9iYWxfZmxhZ3MuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxhbWVlcnJvci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbWFjaGluZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbmV3bWRjdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccHN5bW9kZWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHF1YW50aXplLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxxdWFudGl6ZV9wdnQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc2Vydm9pci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc2V0X2dldC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdGFibGVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx1dGlsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx2YnJxdWFudGl6ZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cVmJyVGFnLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx2ZXJzaW9uLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQXNtIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiLm5hcyINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxjaG9vc2VfdGFibGUubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uDQorSW5wdXREaXI9LlxpMzg2DQorSW50RGlyPS5cLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lDQorSW5wdXRQYXRoPS5caTM4NlxjaG9vc2VfdGFibGUubmFzDQorSW5wdXROYW1lPWNob29zZV90YWJsZQ0KKw0KKyIkKEludERpcikvJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJbmFzbXcgLWYgd2luMzIgLWkgJChJbnB1dERpcikvIC1EV0lOMzIgJChJbnB1dFBhdGgpIC1vICAgJChJbnREaXIpLyQoSW5wdXROYW1lKS5vYmoNCisNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxjcHVfZmVhdC5uYXMNCisNCishSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIERlYnVnIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4NCitJbnB1dERpcj0uXGkzODYNCitJbnREaXI9LlwuLlxvYmpcUmVsZWFzZV9OQVNNXGxpYm1wM2xhbWUNCitJbnB1dFBhdGg9LlxpMzg2XGNwdV9mZWF0Lm5hcw0KK0lucHV0TmFtZT1jcHVfZmVhdA0KKw0KKyIkKEludERpcikvJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJbmFzbXcgLWYgd2luMzIgLWkgJChJbnB1dERpcikvIC1EV0lOMzIgJChJbnB1dFBhdGgpIC1vICAgJChJbnREaXIpLyQoSW5wdXROYW1lKS5vYmoNCisNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxmZnQubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxmZnQzZG4ubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uDQorSW5wdXREaXI9LlxpMzg2DQorSW50RGlyPS5cLi5cb2JqXFJlbGVhc2VfTkFTTVxsaWJtcDNsYW1lDQorSW5wdXRQYXRoPS5caTM4NlxmZnQzZG4ubmFzDQorSW5wdXROYW1lPWZmdDNkbg0KKw0KKyIkKEludERpcikvJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJbmFzbXcgLWYgd2luMzIgLWkgJChJbnB1dERpcikvIC1EV0lOMzIgJChJbnB1dFBhdGgpIC1vICAgJChJbnREaXIpLyQoSW5wdXROYW1lKS5vYmoNCisNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxmZnRmcHUubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDENCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caTM4NlxmZnRzc2UubmFzDQorDQorIUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBEZWJ1ZyINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibGlibXAzbGFtZSAtIFdpbjMyIFJlbGVhc2UgTkFTTSINCisNCisjIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLg0KK0lucHV0RGlyPS5caTM4Ng0KK0ludERpcj0uXC4uXG9ialxSZWxlYXNlX05BU01cbGlibXAzbGFtZQ0KK0lucHV0UGF0aD0uXGkzODZcZmZ0c3NlLm5hcw0KK0lucHV0TmFtZT1mZnRzc2UNCisNCisiJChJbnREaXIpLyQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorCW5hc213IC1mIHdpbjMyIC1pICQoSW5wdXREaXIpLyAtRFdJTjMyICQoSW5wdXRQYXRoKSAtbyAgICQoSW50RGlyKS8kKElucHV0TmFtZSkub2JqDQorDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGkzODZcZmZ0dGJsLm5hcw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGkzODZcc2NhbGFyLm5hcw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJtcDNsYW1lIC0gV2luMzIgRGVidWciDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYm1wM2xhbWUgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9saWJtcDNsYW1lX3ZjOC52Y3Byb2ogYi9saWJtcDNsYW1lL2xpYm1wM2xhbWVfdmM4LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI1NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9saWJtcDNsYW1lX3ZjOC52Y3Byb2oKQEAgLTAsMCArMSw2NTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LjAwIg0KKwlOYW1lPSJsaWJtcDNsYW1lX3ZjOCINCisJUHJvamVjdEdVSUQ9Ins0QjE1MjMxOS0wQUY2LTRFMUItQTI4NC04MDVENjQ4M0M1RjF9Ig0KKwlSb290TmFtZXNwYWNlPSJsaWJtcDNsYW1lX3ZjOCINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUHJvamVjdERpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJChQcm9qZWN0RGlyKS4uXGNvbmZpZ01TLmggJChQcm9qZWN0RGlyKS4uXGNvbmZpZy5oIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vaW5jbHVkZTsuLi87Li4vbXBnbGliOy4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19XSU5ET1dTO1dJTjMyO19VU1JETEw7RExMX0VYUE9SVFM7SEFWRV9DT05GSUdfSDtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjEiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSJsaWJsYW1lLmRlZiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChQcm9qZWN0RGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMCINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJChQcm9qZWN0RGlyKS4uXGNvbmZpZ01TLmggJChQcm9qZWN0RGlyKS4uXGNvbmZpZy5oIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vaW5jbHVkZTsuLi87Li4vbXBnbGliOy4vIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19XSU5ET1dTO1dJTjMyO19VU1JETEw7RExMX0VYUE9SVFM7SEFWRV9DT05GSUdfSDtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PSIxIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0ibGlibGFtZS5kZWYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWcgTkFTTXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUHJvamVjdERpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICQoUHJvamVjdERpcikuLlxjb25maWdNUy5oICQoUHJvamVjdERpcikuLlxjb25maWcuaCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iZmFsc2UiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2luY2x1ZGU7Li4vOy4uL21wZ2xpYjsuLzsuL3ZlY3RvciINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lORE9XUztXSU4zMjtfVVNSRExMO0RMTF9FWFBPUlRTO0hBVkVfQ09ORklHX0g7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO1VTRV9GRlRTU0UiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjEiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoU29sdXRpb25EaXIpLi5cLi5cYnVpbGRccHJvZHVjdHNcRGVidWdcbGliYXVkaW9lbmMuZGxsIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0ibGlibGFtZS5kZWYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZSBOQVNNfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChQcm9qZWN0RGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJChQcm9qZWN0RGlyKS4uXGNvbmZpZ01TLmggJChQcm9qZWN0RGlyKS4uXGNvbmZpZy5oIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2luY2x1ZGU7Li4vOy4uL21wZ2xpYjsuLzsuL3ZlY3RvciINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfV0lORE9XUztXSU4zMjtfVVNSRExMO0RMTF9FWFBPUlRTO0hBVkVfQ09ORklHX0g7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO1VTRV9GRlRTU0UiDQorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjEiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoU29sdXRpb25EaXIpLi5cLi5cYnVpbGRccHJvZHVjdHNcUmVsZWFzZVxsaWJhdWRpb2VuYy5kbGwiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSJsaWJsYW1lLmRlZiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxiaXRzdHJlYW0uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZW5jb2Rlci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxmZnQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ2Fpbl9hbmFseXNpcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpZDN0YWcuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbGFtZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsaWJsYW1lLmRlZiINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbXBnbGliX2ludGVyZmFjZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxuZXdtZGN0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHByZXNldHMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccHN5bW9kZWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccXVhbnRpemUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccXVhbnRpemVfcHZ0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHJlc2Vydm9pci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzZXRfZ2V0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHRhYmxlcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0YWtlaGlyby5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx1dGlsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHZicnF1YW50aXplLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXFZiclRhZy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx2ZXJzaW9uLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxiaXRzdHJlYW0uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGNvbmZpZ01TLmgiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImNvcHkgY29uZmlnTVMuaCAtJmd0OyBjb25maWcuaCINCisJCQkJCQlDb21tYW5kTGluZT0iY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oJiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iY29weSBjb25maWdNUy5oIC0mZ3Q7IGNvbmZpZy5oIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iLi5cY29uZmlnLmgiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnIE5BU018V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJjb3B5IGNvbmZpZ01TLmggLSZndDsgY29uZmlnLmgiDQorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZSBOQVNNfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iY29weSBjb25maWdNUy5oIC0mZ3Q7IGNvbmZpZy5oIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iLi5cY29uZmlnLmgiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnIEdUS3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImNvcHkgY29uZmlnTVMuaCAtJmd0OyBjb25maWcuaCINCisJCQkJCQlDb21tYW5kTGluZT0iY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oJiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGVuY29kZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZmZ0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdhaW5fYW5hbHlzaXMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caWQzdGFnLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGwzc2lkZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsYW1lLWFuYWx5c2lzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGxhbWVfZ2xvYmFsX2ZsYWdzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHZlY3RvclxsYW1lX2ludHJpbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsYW1lZXJyb3IuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbWFjaGluZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxuZXdtZGN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHBzeW1vZGVsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHF1YW50aXplLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHF1YW50aXplX3B2dC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxyZXNlcnZvaXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc2V0X2dldC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0YWJsZXMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdXRpbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx2YnJxdWFudGl6ZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxWYnJUYWcuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdmVyc2lvbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSW50ZXJmYWNlIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluY2x1ZGVcbGFtZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iQXNzZW1ibHkiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpMzg2XGNob29zZV90YWJsZS5uYXMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBOQVNNfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4iDQorCQkJCQkJQ29tbWFuZExpbmU9IiQoUHJvamVjdERpcilcLi5cLi5cLi5cVG9vbHNcbmFzbVxuYXNtdyAgLWYgd2luMzIgLWkgICQoSW5wdXREaXIpIC1EV0lOMzIgICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm5hcyYjeDBEOyYjeDBBO21vdmUgJChJbnB1dERpcikkKElucHV0TmFtZSkub2JqICAmcXVvdDskKE91dERpcikmcXVvdDsmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iJChPdXREaXIpLyQoSW5wdXROYW1lKS5vYmoiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249IkFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSIkKFByb2plY3REaXIpXC4uXC4uXC4uXFRvb2xzXG5hc21cbmFzbXcgIC1mIHdpbjMyIC1pICAkKElucHV0RGlyKSAtRFdJTjMyICAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5uYXMmI3gwRDsmI3gwQTttb3ZlICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm9iaiAgJnF1b3Q7JChPdXREaXIpJnF1b3Q7JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9IiQoT3V0RGlyKS8kKElucHV0TmFtZSkub2JqIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGkzODZcY3B1X2ZlYXQubmFzIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWcgTkFTTXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249IkFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSIkKFByb2plY3REaXIpXC4uXC4uXC4uXFRvb2xzXG5hc21cbmFzbXcgIC1mIHdpbjMyIC1pICAkKElucHV0RGlyKSAtRFdJTjMyICAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5uYXMmI3gwRDsmI3gwQTttb3ZlICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm9iaiAgJnF1b3Q7JChPdXREaXIpJnF1b3Q7JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9IiQoT3V0RGlyKS8kKElucHV0TmFtZSkub2JqIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlIE5BU018V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLiINCisJCQkJCQlDb21tYW5kTGluZT0iJChQcm9qZWN0RGlyKVwuLlwuLlwuLlxUb29sc1xuYXNtXG5hc213ICAtZiB3aW4zMiAtaSAgJChJbnB1dERpcikgLURXSU4zMiAgJChJbnB1dERpcikkKElucHV0TmFtZSkubmFzJiN4MEQ7JiN4MEE7bW92ZSAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5vYmogICZxdW90OyQoT3V0RGlyKSZxdW90OyYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIkKE91dERpcikvJChJbnB1dE5hbWUpLm9iaiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpMzg2XGZmdDNkbi5uYXMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBOQVNNfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4iDQorCQkJCQkJQ29tbWFuZExpbmU9IiQoUHJvamVjdERpcilcLi5cLi5cLi5cVG9vbHNcbmFzbVxuYXNtdyAgLWYgd2luMzIgLWkgICQoSW5wdXREaXIpIC1EV0lOMzIgICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm5hcyYjeDBEOyYjeDBBO21vdmUgJChJbnB1dERpcikkKElucHV0TmFtZSkub2JqICAmcXVvdDskKE91dERpcikmcXVvdDsmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iJChPdXREaXIpLyQoSW5wdXROYW1lKS5vYmoiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UgTkFTTXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249IkFzc2VtYmxpbmcgJChJbnB1dE5hbWUpLi4uIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSIkKFByb2plY3REaXIpXC4uXC4uXC4uXFRvb2xzXG5hc21cbmFzbXcgIC1mIHdpbjMyIC1pICAkKElucHV0RGlyKSAtRFdJTjMyICAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5uYXMmI3gwRDsmI3gwQTttb3ZlICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm9iaiAgJnF1b3Q7JChPdXREaXIpJnF1b3Q7JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9IiQoT3V0RGlyKS8kKElucHV0TmFtZSkub2JqIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGkzODZcZmZ0c3NlLm5hcyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnIE5BU018V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLiINCisJCQkJCQlDb21tYW5kTGluZT0iJChQcm9qZWN0RGlyKVwuLlwuLlwuLlxUb29sc1xuYXNtXG5hc213ICAtZiB3aW4zMiAtaSAgJChJbnB1dERpcikgLURXSU4zMiAgJChJbnB1dERpcikkKElucHV0TmFtZSkubmFzJiN4MEQ7JiN4MEE7bW92ZSAkKElucHV0RGlyKSQoSW5wdXROYW1lKS5vYmogICZxdW90OyQoT3V0RGlyKSZxdW90OyYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIkKE91dERpcikvJChJbnB1dE5hbWUpLm9iaiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZSBOQVNNfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iQXNzZW1ibGluZyAkKElucHV0TmFtZSkuLi4iDQorCQkJCQkJQ29tbWFuZExpbmU9IiQoUHJvamVjdERpcilcLi5cLi5cLi5cVG9vbHNcbmFzbVxuYXNtdyAgLWYgd2luMzIgLWkgICQoSW5wdXREaXIpIC1EV0lOMzIgICQoSW5wdXREaXIpJChJbnB1dE5hbWUpLm5hcyYjeDBEOyYjeDBBO21vdmUgJChJbnB1dERpcikkKElucHV0TmFtZSkub2JqICAmcXVvdDskKE91dERpcikmcXVvdDsmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iJChPdXREaXIpLyQoSW5wdXROYW1lKS5vYmoiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdmVjdG9yXHhtbV9xdWFudGl6ZV9zdWIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL2xvZ29lLmljbyBiL2xpYm1wM2xhbWUvbG9nb2UuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTk0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL2xvZ29lLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL21hY2hpbmUuaCBiL2xpYm1wM2xhbWUvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2QwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL21hY2hpbmUuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqICAgICAgTWFjaGluZSBkZXBlbmRlbnQgZGVmaW5lcy9pbmNsdWRlcyBmb3IgTEFNRS4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5OSBBLkwuIEZhYmVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTEFNRV9NQUNISU5FX0gKKyNkZWZpbmUgTEFNRV9NQUNISU5FX0gKKworI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2lmIChMQU1FX1JFTEVBU0VfVkVSU0lPTiA9PSAwKQorI3VuZGVmIE5ERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGlmbmRlZiBIQVZFX1NUUkNIUgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyAgZGVmaW5lIHN0cnJjaHIgcmluZGV4CisjIGVuZGlmCitjaGFyICAgKnN0cmNocigpLCAqc3RycmNocigpOworIyBpZm5kZWYgSEFWRV9NRU1DUFkKKyMgIGRlZmluZSBtZW1jcHkoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjICBkZWZpbmUgbWVtbW92ZShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIGRlZmluZWQoX19yaXNjb3NfXykgICYmICBkZWZpbmVkKEZQQTEwKQorIyBpbmNsdWRlICJ5bWF0aC5oIgorI2Vsc2UKKyMgaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChtYWNpbnRvc2gpCisjIGluY2x1ZGUgPHR5cGVzLmg+CisjIGluY2x1ZGUgPHN0YXQuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1RESU5UX0gKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKworLyoKKyAqIDMgZGlmZmVyZW50IHR5cGVzIG9mIHBvdygpIGZ1bmN0aW9uczoKKyAqICAgLSB0YWJsZSBsb29rdXAKKyAqICAgLSBwb3coKQorICogICAtIGV4cCgpICAgb24gc29tZSBtYWNoaW5lcyB0aGlzIGlzIGNsYWltZWQgdG8gYmUgZmFzdGVyIHRoYW4gcG93KCkKKyAqLworCisjZGVmaW5lIFBPVzIwKHgpIChhc3NlcnQoMCA8PSAoeCtRX01BWDIpICYmIHggPCBRX01BWCksIHBvdzIwW3grUV9NQVgyXSkKKy8qI2RlZmluZSBQT1cyMCh4KSAgcG93KDIuMCwoKGRvdWJsZSkoeCktMjEwKSouMjUpICovCisvKiNkZWZpbmUgUE9XMjAoeCkgIGV4cCggKChkb3VibGUpKHgpLTIxMCkqKC4yNSpMT0cyKSApICovCisKKyNkZWZpbmUgSVBPVzIwKHgpICAoYXNzZXJ0KDAgPD0geCAmJiB4IDwgUV9NQVgpLCBpcG93MjBbeF0pCisvKiNkZWZpbmUgSVBPVzIwKHgpICBleHAoIC0oKGRvdWJsZSkoeCktMjEwKSouMTg3NSpMT0cyICkgKi8KKy8qI2RlZmluZSBJUE9XMjAoeCkgIHBvdygyLjAsLSgoZG91YmxlKSh4KS0yMTApKi4xODc1KSAqLworCisvKiBpbiBjYXNlIHRoaXMgaXMgdXNlZCB3aXRob3V0IGNvbmZpZ3VyZSAqLworI2lmbmRlZiBpbmxpbmUKKyMgZGVmaW5lIGlubGluZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyB1bmRlZiBpbmxpbmUKKyMgZGVmaW5lIGlubGluZSBfaW5saW5lCisjZWxpZiBkZWZpbmVkKF9fU0FTQykgfHwgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0lDQykgfHwgZGVmaW5lZChfX0VDQykKKy8qIGlmIF9fR05VQ19fIHdlIGFsd2F5cyB3YW50IHRvIGlubGluZSwgbm90IG9ubHkgaWYgdGhlIHVzZXIgcmVxdWVzdHMgaXQgKi8KKyMgdW5kZWYgaW5saW5lCisjIGRlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZgorCisjaWYgICAgZGVmaW5lZChfTVNDX1ZFUikKKyMgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjQ0ICkKKy8qIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQzMDUgKSAqLworI2VuZGlmCisKKy8qCisgKiBGTE9BVCAgICBmb3IgdmFyaWFibGVzIHdoaWNoIHJlcXVpcmUgYXQgbGVhc3QgMzIgYml0cworICogRkxPQVQ4ICAgZm9yIHZhcmlhYmxlcyB3aGljaCByZXF1aXJlIGF0IGxlYXN0IDY0IGJpdHMKKyAqCisgKiBPbiBzb21lIG1hY2hpbmVzLCA2NCBiaXQgd2lsbCBiZSBmYXN0ZXIgdGhhbiAzMiBiaXQuICBBbHNvLCBzb21lIG1hdGgKKyAqIHJvdXRpbmVzIHJlcXVpcmUgNjQgYml0IGZsb2F0LCBzbyBzZXR0aW5nIEZMT0FUPWZsb2F0IHdpbGwgcmVzdWx0IGluIGEKKyAqIGxvdCBvZiBjb252ZXJzaW9ucy4KKyAqLworCisjaWYgKCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgKQorIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGluY2x1ZGUgPGZsb2F0Lmg+CisjIGRlZmluZSBGTE9BVF9NQVggRkxUX01BWAorI2Vsc2UKKyMgaWZuZGVmIEZMT0FUCit0eXBlZGVmIGZsb2F0IEZMT0FUOworIyAgaWZkZWYgRkxUX01BWAorIyAgIGRlZmluZSBGTE9BVF9NQVggRkxUX01BWAorIyAgZWxzZQorIyAgIGRlZmluZSBGTE9BVF9NQVggMWUzNyAvKiBhcHByb3ggKi8KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTE9BVDggCit0eXBlZGVmIGRvdWJsZSBGTE9BVDg7CisjIGlmZGVmIERCTF9NQVgKKyMgIGRlZmluZSBGTE9BVDhfTUFYIERCTF9NQVgKKyMgZWxzZQorIyAgZGVmaW5lIEZMT0FUOF9NQVggMWU5OSAvKiBhcHByb3ggKi8KKyMgZW5kaWYKKyNlbHNlCisjIGlmZGVmIEZMVF9NQVgKKyMgIGRlZmluZSBGTE9BVDhfTUFYIEZMVF9NQVgKKyMgZWxzZQorIyAgZGVmaW5lIEZMT0FUOF9NQVggMWUzNyAvKiBhcHByb3ggKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBzYW1wbGVfdCBtdXN0IGJlIGZsb2F0aW5nIHBvaW50LCBhdCBsZWFzdCAzMiBiaXRzICovCit0eXBlZGVmIEZMT0FUIHNhbXBsZV90OwordHlwZWRlZiBzYW1wbGVfdCBzdGVyZW9fdFsyXTsKKworI2RlZmluZSBkaW1lbnNpb25fb2YoYXJyYXkpIChzaXplb2YoYXJyYXkpL3NpemVvZihhcnJheVswXSkpCisjZGVmaW5lIGJleW9uZChhcnJheSkgKGFycmF5K2RpbWVuc2lvbl9vZihhcnJheSkpCisKKyNpZiAxCisjZGVmaW5lIEVRKGEsYikgKFwKKyhmYWJzKGEpID4gZmFicyhiKSkgXAorID8gKGZhYnMoKGEpLShiKSkgPD0gKGZhYnMoYSkgKiAxZS02ZikpIFwKKyA6IChmYWJzKChhKS0oYikpIDw9IChmYWJzKGIpICogMWUtNmYpKSkKKyNlbHNlCisjZGVmaW5lIEVRKGEsYikgKGZhYnMoKGEpLShiKSk8MUUtMzcpCisjZW5kaWYgCisKKyNkZWZpbmUgTkVRKGEsYikgKCFFUShhLGIpKQorCisjZW5kaWYKKworLyogZW5kIG9mIG1hY2hpbmUuaCAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9tcGdsaWJfaW50ZXJmYWNlLmMgYi9saWJtcDNsYW1lL21wZ2xpYl9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2YwMjliCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9tcGdsaWJfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSw0MTEgQEAKKy8qIC0qLSBtb2RlOiBDOyBtb2RlOiBmb2xkIC0qLSAqLworLyoKKyAqICAgICAgTEFNRSBNUDMgZW5jb2RpbmcgZW5naW5lCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBNYXJrIFRheWxvcgorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDMgT2xjaW9zCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwOCBSb2JlcnQgSGVnZW1hbm4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogJElkOiBtcGdsaWJfaW50ZXJmYWNlLmMsdiAxLjM1LjIuMiAyMDA4LzEwLzExIDE5OjA4OjMyIHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9NUEdMSUIKKyNkZWZpbmUgaGlwX2dsb2JhbF9zdHJ1Y3QgbXBzdHJfdGFnIAorI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidXRpbC5oIgorCisKK3N0YXRpYyBNUFNUUiAgIG1wOyAvKiB1Z2x5LCB1c2VkIGJ5IG9ic29sZXRlIGxhbWVfZGVjb2RlIGZ1bmN0aW9ucyAqLworCitpbnQKK2xhbWVfZGVjb2RlX2V4aXQodm9pZCkKK3sKKyAgICBFeGl0TVAzKCZtcCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CitsYW1lX2RlY29kZV9pbml0KHZvaWQpCit7CisgICAgKHZvaWQpIEluaXRNUDMoJm1wKTsKKyAgICByZXR1cm4gMDsKK30KKworCisKKworLyogY29weSBtb25vIHNhbXBsZXMgKi8KKyNkZWZpbmUgQ09QWV9NT05PKERTVF9UWVBFLCBTUkNfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEU1RfVFlQRSAqcGNtX2wgPSAoRFNUX1RZUEUgKilwY21fbF9yYXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTUkNfVFlQRSBjb25zdCAqcF9zYW1wbGVzID0gKFNSQ19UWVBFIGNvbnN0ICopcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHJvY2Vzc2VkX3NhbXBsZXM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwY21fbCsrID0gKERTVF9UWVBFKSgqcF9zYW1wbGVzKyspOworCisvKiBjb3B5IHN0ZXJlbyBzYW1wbGVzICovCisjZGVmaW5lIENPUFlfU1RFUkVPKERTVF9UWVBFLCBTUkNfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRFNUX1RZUEUgKnBjbV9sID0gKERTVF9UWVBFICopcGNtX2xfcmF3LCAqcGNtX3IgPSAoRFNUX1RZUEUgKilwY21fcl9yYXc7ICAgICAgICAgICAgICAgICAgICBcCisgICAgU1JDX1RZUEUgY29uc3QgKnBfc2FtcGxlcyA9IChTUkNfVFlQRSBjb25zdCAqKXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IHByb2Nlc3NlZF9zYW1wbGVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqcGNtX2wrKyA9IChEU1RfVFlQRSkoKnBfc2FtcGxlcysrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqcGNtX3IrKyA9IChEU1RfVFlQRSkoKnBfc2FtcGxlcysrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKworLyoKKyAqIEZvciBsYW1lX2RlY29kZTogIHJldHVybiBjb2RlCisgKiAtMSAgICAgZXJyb3IKKyAqICAwICAgICBvaywgYnV0IG5lZWQgbW9yZSBkYXRhIGJlZm9yZSBvdXRwdXRpbmcgYW55IHNhbXBsZXMKKyAqICBuICAgICBudW1iZXIgb2Ygc2FtcGxlcyBvdXRwdXQuICBlaXRoZXIgNTc2IG9yIDExNTIgZGVwZW5kaW5nIG9uIE1QMyBmaWxlLgorICovCisKK3N0YXRpYyBpbnQKK2RlY29kZTFfaGVhZGVyc0JfY2xpcGNob2ljZShQTVBTVFIgcG1wLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBwY21fbF9yYXdbXSwgY2hhciBwY21fcl9yYXdbXSwgbXAzZGF0YV9zdHJ1Y3QgKiBtcDNkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5jX2RlbGF5LCBpbnQgKmVuY19wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnAsIHNpemVfdCBwc2l6ZSwgaW50IGRlY29kZWRfc2FtcGxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZGVjb2RlTVAzX3B0cikgKFBNUFNUUiwgdW5zaWduZWQgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKSkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHNtcGxzWzJdWzRdID0geworICAgICAgICAvKiBMYXllciAgIEkgICAgSUkgICBJSUkgKi8KKyAgICAgICAgezAsIDM4NCwgMTE1MiwgMTE1Mn0sIC8qIE1QRUctMSAgICAgKi8KKyAgICAgICAgezAsIDM4NCwgMTE1MiwgNTc2fSAvKiBNUEVHLTIoLjUpICovCisgICAgfTsKKworICAgIGludCAgICAgcHJvY2Vzc2VkX2J5dGVzOworICAgIGludCAgICAgcHJvY2Vzc2VkX3NhbXBsZXM7IC8qIHByb2Nlc3NlZCBzYW1wbGVzIHBlciBjaGFubmVsICovCisgICAgaW50ICAgICByZXQ7CisgICAgaW50ICAgICBpOworCisgICAgbXAzZGF0YS0+aGVhZGVyX3BhcnNlZCA9IDA7CisKKyAgICByZXQgPSAoKmRlY29kZU1QM19wdHIpIChwbXAsIGJ1ZmZlciwgbGVuLCBwLCAoaW50KSBwc2l6ZSwgJnByb2Nlc3NlZF9ieXRlcyk7CisgICAgLyogdGhyZWUgY2FzZXM6ICAKKyAgICAgKiAxLiBoZWFkZXJzIHBhcnNlZCwgYnV0IGRhdGEgbm90IGNvbXBsZXRlCisgICAgICogICAgICAgcG1wLT5oZWFkZXJfcGFyc2VkPT0xIAorICAgICAqICAgICAgIHBtcC0+ZnJhbWVzaXplPTAgICAgICAgICAgIAorICAgICAqICAgICAgIHBtcC0+ZnNpemVvbGQ9c2l6ZSBvZiBsYXN0IGZyYW1lLCBvciAwIGlmIHRoaXMgaXMgZmlyc3QgZnJhbWUKKyAgICAgKgorICAgICAqIDIuIGhlYWRlcnMsIGRhdGEgcGFyc2VkLCBidXQgYW5jaWxsYXJ5IGRhdGEgbm90IGNvbXBsZXRlCisgICAgICogICAgICAgcG1wLT5oZWFkZXJfcGFyc2VkPT0xIAorICAgICAqICAgICAgIHBtcC0+ZnJhbWVzaXplPXNpemUgb2YgZnJhbWUgICAgICAgICAgIAorICAgICAqICAgICAgIHBtcC0+ZnNpemVvbGQ9c2l6ZSBvZiBsYXN0IGZyYW1lLCBvciAwIGlmIHRoaXMgaXMgZmlyc3QgZnJhbWUKKyAgICAgKgorICAgICAqIDMuIGZyYW1lIGZ1bGx5IGRlY29kZWQ6ICAKKyAgICAgKiAgICAgICBwbXAtPmhlYWRlcl9wYXJzZWQ9PTAgCisgICAgICogICAgICAgcG1wLT5mcmFtZXNpemU9MCAgICAgICAgICAgCisgICAgICogICAgICAgcG1wLT5mc2l6ZW9sZD1zaXplIG9mIGZyYW1lICh3aGljaCBpcyBub3cgdGhlIGxhc3QgZnJhbWUpCisgICAgICoKKyAgICAgKi8KKyAgICBpZiAocG1wLT5oZWFkZXJfcGFyc2VkIHx8IHBtcC0+ZnNpemVvbGQgPiAwIHx8IHBtcC0+ZnJhbWVzaXplID4gMCkgeworICAgICAgICBtcDNkYXRhLT5oZWFkZXJfcGFyc2VkID0gMTsKKyAgICAgICAgbXAzZGF0YS0+c3RlcmVvID0gcG1wLT5mci5zdGVyZW87CisgICAgICAgIG1wM2RhdGEtPnNhbXBsZXJhdGUgPSBmcmVxc1twbXAtPmZyLnNhbXBsaW5nX2ZyZXF1ZW5jeV07CisgICAgICAgIG1wM2RhdGEtPm1vZGUgPSBwbXAtPmZyLm1vZGU7CisgICAgICAgIG1wM2RhdGEtPm1vZGVfZXh0ID0gcG1wLT5mci5tb2RlX2V4dDsKKyAgICAgICAgbXAzZGF0YS0+ZnJhbWVzaXplID0gc21wbHNbcG1wLT5mci5sc2ZdW3BtcC0+ZnIubGF5XTsKKworICAgICAgICAvKiBmcmVlIGZvcm1hdCwgd2UgbmVlZCB0aGUgZW50aXJlIGZyYW1lIGJlZm9yZSB3ZSBjYW4gZGV0ZXJtaW5lCisgICAgICAgICAqIHRoZSBiaXRyYXRlLiAgSWYgd2UgaGF2ZW4ndCBnb3R0ZW4gdGhlIGVudGlyZSBmcmFtZSwgYml0cmF0ZT0wICovCisgICAgICAgIGlmIChwbXAtPmZzaXplb2xkID4gMCkgLyogd29ya3MgZm9yIGZyZWUgZm9ybWF0IGFuZCBmaXhlZCwgbm8gb3ZlcnJ1biwgdGVtcG9yYWwgcmVzdWx0cyBhcmUgPCA0MDAuZTYgKi8KKyAgICAgICAgICAgIG1wM2RhdGEtPmJpdHJhdGUgPSA4ICogKDQgKyBwbXAtPmZzaXplb2xkKSAqIG1wM2RhdGEtPnNhbXBsZXJhdGUgLworICAgICAgICAgICAgICAgICgxLmUzICogbXAzZGF0YS0+ZnJhbWVzaXplKSArIDAuNTsKKyAgICAgICAgZWxzZSBpZiAocG1wLT5mcmFtZXNpemUgPiAwKQorICAgICAgICAgICAgbXAzZGF0YS0+Yml0cmF0ZSA9IDggKiAoNCArIHBtcC0+ZnJhbWVzaXplKSAqIG1wM2RhdGEtPnNhbXBsZXJhdGUgLworICAgICAgICAgICAgICAgICgxLmUzICogbXAzZGF0YS0+ZnJhbWVzaXplKSArIDAuNTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXAzZGF0YS0+Yml0cmF0ZSA9IHRhYnNlbF8xMjNbcG1wLT5mci5sc2ZdW3BtcC0+ZnIubGF5IC0gMV1bcG1wLT5mci5iaXRyYXRlX2luZGV4XTsKKworCisKKyAgICAgICAgaWYgKHBtcC0+bnVtX2ZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIC8qIFhpbmcgVkJSIGhlYWRlciBmb3VuZCBhbmQgbnVtX2ZyYW1lcyB3YXMgc2V0ICovCisgICAgICAgICAgICBtcDNkYXRhLT50b3RhbGZyYW1lcyA9IHBtcC0+bnVtX2ZyYW1lczsKKyAgICAgICAgICAgIG1wM2RhdGEtPm5zYW1wID0gbXAzZGF0YS0+ZnJhbWVzaXplICogcG1wLT5udW1fZnJhbWVzOworICAgICAgICAgICAgKmVuY19kZWxheSA9IHBtcC0+ZW5jX2RlbGF5OworICAgICAgICAgICAgKmVuY19wYWRkaW5nID0gcG1wLT5lbmNfcGFkZGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSBNUDNfT0s6CisgICAgICAgIHN3aXRjaCAocG1wLT5mci5zdGVyZW8pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcHJvY2Vzc2VkX3NhbXBsZXMgPSBwcm9jZXNzZWRfYnl0ZXMgLyBkZWNvZGVkX3NhbXBsZV9zaXplOworICAgICAgICAgICAgaWYgKGRlY29kZWRfc2FtcGxlX3NpemUgPT0gc2l6ZW9mKHNob3J0KSkgeworICAgICAgICAgICAgICAgIENPUFlfTU9OTyhzaG9ydCwgc2hvcnQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDT1BZX01PTk8oc2FtcGxlX3QsIEZMT0FUKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHByb2Nlc3NlZF9zYW1wbGVzID0gKHByb2Nlc3NlZF9ieXRlcyAvIGRlY29kZWRfc2FtcGxlX3NpemUpID4+IDE7CisgICAgICAgICAgICBpZiAoZGVjb2RlZF9zYW1wbGVfc2l6ZSA9PSBzaXplb2Yoc2hvcnQpKSB7CisgICAgICAgICAgICAgICAgQ09QWV9TVEVSRU8oc2hvcnQsIHNob3J0KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ09QWV9TVEVSRU8oc2FtcGxlX3QsIEZMT0FUKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcm9jZXNzZWRfc2FtcGxlcyA9IC0xOworICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1QM19ORUVEX01PUkU6CisgICAgICAgIHByb2Nlc3NlZF9zYW1wbGVzID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1QM19FUlI6CisgICAgICAgIHByb2Nlc3NlZF9zYW1wbGVzID0gLTE7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJvY2Vzc2VkX3NhbXBsZXMgPSAtMTsKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKmZwcmludGYoc3RkZXJyLCJvaywgbW9yZSwgZXJyOiAgJWkgJWkgJWlcbiIsIE1QM19PSywgTVAzX05FRURfTU9SRSwgTVAzX0VSUiApOyAqLworICAgIC8qZnByaW50ZihzdGRlcnIsInJldCA9ICVpIG91dD0laVxuIiwgcmV0LCBwcm9jZXNzZWRfc2FtcGxlcyApOyAqLworICAgIHJldHVybiBwcm9jZXNzZWRfc2FtcGxlczsKK30KKworCisjZGVmaW5lIE9VVFNJWkVfQ0xJUFBFRCAgICg0MDk2KnNpemVvZihzaG9ydCkpCisKK2ludAorbGFtZV9kZWNvZGUxX2hlYWRlcnNCKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHBjbV9sW10sIHNob3J0IHBjbV9yW10sIG1wM2RhdGFfc3RydWN0ICogbXAzZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuY19kZWxheSwgaW50ICplbmNfcGFkZGluZykKK3sKKyAgICBzdGF0aWMgY2hhciBvdXRbT1VUU0laRV9DTElQUEVEXTsKKworICAgIHJldHVybiBkZWNvZGUxX2hlYWRlcnNCX2NsaXBjaG9pY2UoJm1wLCBidWZmZXIsIGxlbiwgKGNoYXIgKikgcGNtX2wsIChjaGFyICopIHBjbV9yLCBtcDNkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2RlbGF5LCBlbmNfcGFkZGluZywgb3V0LCBPVVRTSVpFX0NMSVBQRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBkZWNvZGVNUDMpOworfQorCisKKworCisKKy8qCisgKiBGb3IgbGFtZV9kZWNvZGU6ICByZXR1cm4gY29kZQorICogIC0xICAgICBlcnJvcgorICogICAwICAgICBvaywgYnV0IG5lZWQgbW9yZSBkYXRhIGJlZm9yZSBvdXRwdXRpbmcgYW55IHNhbXBsZXMKKyAqICAgbiAgICAgbnVtYmVyIG9mIHNhbXBsZXMgb3V0cHV0LiAgV2lsbCBiZSBhdCBtb3N0IG9uZSBmcmFtZSBvZgorICogICAgICAgICBNUEVHIGRhdGEuICAKKyAqLworCitpbnQKK2xhbWVfZGVjb2RlMV9oZWFkZXJzKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHNob3J0IHBjbV9sW10sIHNob3J0IHBjbV9yW10sIG1wM2RhdGFfc3RydWN0ICogbXAzZGF0YSkKK3sKKyAgICBpbnQgICAgIGVuY19kZWxheSwgZW5jX3BhZGRpbmc7CisgICAgcmV0dXJuIGxhbWVfZGVjb2RlMV9oZWFkZXJzQihidWZmZXIsIGxlbiwgcGNtX2wsIHBjbV9yLCBtcDNkYXRhLCAmZW5jX2RlbGF5LCAmZW5jX3BhZGRpbmcpOworfQorCisKK2ludAorbGFtZV9kZWNvZGUxKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgc2hvcnQgcGNtX2xbXSwgc2hvcnQgcGNtX3JbXSkKK3sKKyAgICBtcDNkYXRhX3N0cnVjdCBtcDNkYXRhOworCisgICAgcmV0dXJuIGxhbWVfZGVjb2RlMV9oZWFkZXJzKGJ1ZmZlciwgbGVuLCBwY21fbCwgcGNtX3IsICZtcDNkYXRhKTsKK30KKworCisvKgorICogRm9yIGxhbWVfZGVjb2RlOiAgcmV0dXJuIGNvZGUKKyAqICAtMSAgICAgZXJyb3IKKyAqICAgMCAgICAgb2ssIGJ1dCBuZWVkIG1vcmUgZGF0YSBiZWZvcmUgb3V0cHV0aW5nIGFueSBzYW1wbGVzCisgKiAgIG4gICAgIG51bWJlciBvZiBzYW1wbGVzIG91dHB1dC4gIGEgbXVsdGlwbGUgb2YgNTc2IG9yIDExNTIgZGVwZW5kaW5nIG9uIE1QMyBmaWxlLgorICovCisKK2ludAorbGFtZV9kZWNvZGVfaGVhZGVycyh1bnNpZ25lZCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHNob3J0IHBjbV9sW10sIHNob3J0IHBjbV9yW10sIG1wM2RhdGFfc3RydWN0ICogbXAzZGF0YSkKK3sKKyAgICBpbnQgICAgIHJldDsKKyAgICBpbnQgICAgIHRvdHNpemUgPSAwOyAgICAgLyogbnVtYmVyIG9mIGRlY29kZWQgc2FtcGxlcyBwZXIgY2hhbm5lbCAqLworCisgICAgZm9yICg7OykgeworICAgICAgICBzd2l0Y2ggKHJldCA9IGxhbWVfZGVjb2RlMV9oZWFkZXJzKGJ1ZmZlciwgbGVuLCBwY21fbCArIHRvdHNpemUsIHBjbV9yICsgdG90c2l6ZSwgbXAzZGF0YSkpIHsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybiB0b3RzaXplOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdG90c2l6ZSArPSByZXQ7CisgICAgICAgICAgICBsZW4gPSAwOyAgICAvKiBmdXR1cmUgY2FsbHMgdG8gZGVjb2RlTVAzIGFyZSBqdXN0IHRvIGZsdXNoIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisKK2ludAorbGFtZV9kZWNvZGUodW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBzaG9ydCBwY21fbFtdLCBzaG9ydCBwY21fcltdKQoreworICAgIG1wM2RhdGFfc3RydWN0IG1wM2RhdGE7CisKKyAgICByZXR1cm4gbGFtZV9kZWNvZGVfaGVhZGVycyhidWZmZXIsIGxlbiwgcGNtX2wsIHBjbV9yLCAmbXAzZGF0YSk7Cit9CisKKworCisKK2hpcF90IGhpcF9kZWNvZGVfaW5pdCh2b2lkKQoreworICAgIGhpcF90IGhpcCA9IGNhbGxvYygxLCBzaXplb2YoaGlwX2dsb2JhbF9mbGFncykpOworICAgIEluaXRNUDMoaGlwKTsKKyAgICByZXR1cm4gaGlwOworfQorCisKK2ludCBoaXBfZGVjb2RlX2V4aXQoaGlwX3QgaGlwKQoreworICAgIGlmIChoaXApIHsKKyAgICAgICAgRXhpdE1QMyhoaXApOworICAgICAgICBmcmVlKGhpcCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qIHdlIGZvcmJpZCBpbnB1dCB3aXRoIG1vcmUgdGhhbiAxMTUyIHNhbXBsZXMgcGVyIGNoYW5uZWwgZm9yIG91dHB1dCBpbiB0aGUgdW5jbGlwcGVkIG1vZGUgKi8KKyNkZWZpbmUgT1VUU0laRV9VTkNMSVBQRUQgKDExNTIqMipzaXplb2YoRkxPQVQpKQorCitpbnQKK2hpcF9kZWNvZGUxX3VuY2xpcHBlZChoaXBfdCBoaXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgc2FtcGxlX3QgcGNtX2xbXSwgc2FtcGxlX3QgcGNtX3JbXSkKK3sKKyAgICBzdGF0aWMgY2hhciBvdXRbT1VUU0laRV9VTkNMSVBQRURdOworICAgIG1wM2RhdGFfc3RydWN0IG1wM2RhdGE7CisgICAgaW50ICAgICBlbmNfZGVsYXksIGVuY19wYWRkaW5nOworCisgICAgaWYgKGhpcCkgeworICAgICAgICByZXR1cm4gZGVjb2RlMV9oZWFkZXJzQl9jbGlwY2hvaWNlKGhpcCwgYnVmZmVyLCBsZW4sIChjaGFyICopIHBjbV9sLCAoY2hhciAqKSBwY21fciwgJm1wM2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY19kZWxheSwgJmVuY19wYWRkaW5nLCBvdXQsIE9VVFNJWkVfVU5DTElQUEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGTE9BVCksIGRlY29kZU1QM191bmNsaXBwZWQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZvciBsYW1lX2RlY29kZTogIHJldHVybiBjb2RlCisgKiAgLTEgICAgIGVycm9yCisgKiAgIDAgICAgIG9rLCBidXQgbmVlZCBtb3JlIGRhdGEgYmVmb3JlIG91dHB1dGluZyBhbnkgc2FtcGxlcworICogICBuICAgICBudW1iZXIgb2Ygc2FtcGxlcyBvdXRwdXQuICBXaWxsIGJlIGF0IG1vc3Qgb25lIGZyYW1lIG9mCisgKiAgICAgICAgIE1QRUcgZGF0YS4gIAorICovCisKK2ludAoraGlwX2RlY29kZTFfaGVhZGVycyhoaXBfdCBoaXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIHNob3J0IHBjbV9sW10sIHNob3J0IHBjbV9yW10sIG1wM2RhdGFfc3RydWN0ICogbXAzZGF0YSkKK3sKKyAgICBpbnQgICAgIGVuY19kZWxheSwgZW5jX3BhZGRpbmc7CisgICAgcmV0dXJuIGhpcF9kZWNvZGUxX2hlYWRlcnNCKGhpcCwgYnVmZmVyLCBsZW4sIHBjbV9sLCBwY21fciwgbXAzZGF0YSwgJmVuY19kZWxheSwgJmVuY19wYWRkaW5nKTsKK30KKworCitpbnQKK2hpcF9kZWNvZGUxKGhpcF90IGhpcCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuLCBzaG9ydCBwY21fbFtdLCBzaG9ydCBwY21fcltdKQoreworICAgIG1wM2RhdGFfc3RydWN0IG1wM2RhdGE7CisgICAgcmV0dXJuIGhpcF9kZWNvZGUxX2hlYWRlcnMoaGlwLCBidWZmZXIsIGxlbiwgcGNtX2wsIHBjbV9yLCAmbXAzZGF0YSk7Cit9CisKKworLyoKKyAqIEZvciBoaXBfZGVjb2RlOiAgcmV0dXJuIGNvZGUKKyAqICAtMSAgICAgZXJyb3IKKyAqICAgMCAgICAgb2ssIGJ1dCBuZWVkIG1vcmUgZGF0YSBiZWZvcmUgb3V0cHV0aW5nIGFueSBzYW1wbGVzCisgKiAgIG4gICAgIG51bWJlciBvZiBzYW1wbGVzIG91dHB1dC4gIGEgbXVsdGlwbGUgb2YgNTc2IG9yIDExNTIgZGVwZW5kaW5nIG9uIE1QMyBmaWxlLgorICovCisKK2ludAoraGlwX2RlY29kZV9oZWFkZXJzKGhpcF90IGhpcCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBzaG9ydCBwY21fbFtdLCBzaG9ydCBwY21fcltdLCBtcDNkYXRhX3N0cnVjdCAqIG1wM2RhdGEpCit7CisgICAgaW50ICAgICByZXQ7CisgICAgaW50ICAgICB0b3RzaXplID0gMDsgICAgIC8qIG51bWJlciBvZiBkZWNvZGVkIHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3dpdGNoIChyZXQgPSBoaXBfZGVjb2RlMV9oZWFkZXJzKGhpcCwgYnVmZmVyLCBsZW4sIHBjbV9sICsgdG90c2l6ZSwgcGNtX3IgKyB0b3RzaXplLCBtcDNkYXRhKSkgeworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcmV0dXJuIHRvdHNpemU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0b3RzaXplICs9IHJldDsKKyAgICAgICAgICAgIGxlbiA9IDA7ICAgIC8qIGZ1dHVyZSBjYWxscyB0byBkZWNvZGVNUDMgYXJlIGp1c3QgdG8gZmx1c2ggYnVmZmVycyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworaW50CitoaXBfZGVjb2RlKGhpcF90IGhpcCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuLCBzaG9ydCBwY21fbFtdLCBzaG9ydCBwY21fcltdKQoreworICAgIG1wM2RhdGFfc3RydWN0IG1wM2RhdGE7CisgICAgcmV0dXJuIGhpcF9kZWNvZGVfaGVhZGVycyhoaXAsIGJ1ZmZlciwgbGVuLCBwY21fbCwgcGNtX3IsICZtcDNkYXRhKTsKK30KKworCitpbnQKK2hpcF9kZWNvZGUxX2hlYWRlcnNCKGhpcF90IGhpcCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcGNtX2xbXSwgc2hvcnQgcGNtX3JbXSwgbXAzZGF0YV9zdHJ1Y3QgKiBtcDNkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5jX2RlbGF5LCBpbnQgKmVuY19wYWRkaW5nKQoreworICAgIHN0YXRpYyBjaGFyIG91dFtPVVRTSVpFX0NMSVBQRURdOworICAgIGlmIChoaXApIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZTFfaGVhZGVyc0JfY2xpcGNob2ljZShoaXAsIGJ1ZmZlciwgbGVuLCAoY2hhciAqKSBwY21fbCwgKGNoYXIgKikgcGNtX3IsIG1wM2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2RlbGF5LCBlbmNfcGFkZGluZywgb3V0LCBPVVRTSVpFX0NMSVBQRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZGVjb2RlTVAzKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKK3ZvaWQgaGlwX3NldF9waW5mbyhoaXBfdCBoaXAsIHBsb3R0aW5nX2RhdGEqIHBpbmZvKQoreworICAgIGlmIChoaXApIHsKKyAgICAgICAgaGlwLT5waW5mbyA9IHBpbmZvOworICAgIH0KK30KKworI2VuZGlmCisKKy8qIGVuZCBvZiBtcGdsaWJfaW50ZXJmYWNlLmMgKi8KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvbmV3bWRjdC5jIGIvbGlibXAzbGFtZS9uZXdtZGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0YjUzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbmV3bWRjdC5jCkBAIC0wLDAgKzEsMTAzNyBAQAorLyoKKyAqICAgICAgTVAzIHdpbmRvdyBzdWJiYW5kIC0+IHN1YmJhbmQgZmlsdGVyaW5nIC0+IG1kY3Qgcm91dGluZQorICoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgVGFrZWhpcm8gVG9taW5hZ2EKKyAqCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorICogICAgICAgICBTcGVjaWFsIFRoYW5rcyB0byBQYXRyaWNrIERlIFNtZXQgZm9yIHlvdXIgYWR2aWNlcy4KKyAqLworCisvKiAkSWQ6IG5ld21kY3QuYyx2IDEuMzcgMjAwOC8wNC8yMiAyMzowMToyMiByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJuZXdtZGN0LmgiCisKKworCisjaWZuZGVmIFVTRV9HT0dPX1NVQkJBTkQKK3N0YXRpYyBjb25zdCBGTE9BVCBlbndpbmRvd1tdID0geworICAgIC00Ljc3ZS0wNyAqIDAuNzQwOTUxMTI1MzU0OTU5IC8gMi4zODRlLTA2LCAxLjAzOTUxZS0wNCAqIDAuNzQwOTUxMTI1MzU0OTU5IC8gMi4zODRlLTA2LAorICAgIDkuNTM2NzRlLTA0ICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsIDIuODQxNDczZS0wMyAqIDAuNzQwOTUxMTI1MzU0OTU5IC8gMi4zODRlLTA2LAorICAgIDMuNTc1ODk3MmUtMDIgKiAwLjc0MDk1MTEyNTM1NDk1OSAvIDIuMzg0ZS0wNiwgMy40MDE3NTZlLTAzICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsIDkuODM3MTVlLTA0ICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsIDkuOTE4MmUtMDUgKiAwLjc0MDk1MTEyNTM1NDk1OSAvIDIuMzg0ZS0wNiwgLyogMTUgKi8KKyAgICAxLjIzOThlLTA1ICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsIDEuOTEyMTJlLTA0ICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsCisgICAgMi4yODMwOTZlLTAzICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsIDEuNjk5NDQ3NmUtMDIgKiAwLjc0MDk1MTEyNTM1NDk1OSAvIDIuMzg0ZS0wNiwKKyAgICAtMS44NzU2ODY2ZS0wMiAqIDAuNzQwOTUxMTI1MzU0OTU5IC8gMi4zODRlLTA2LCAtMi42MzA3MTFlLTAzICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsCisgICAgLTIuNDc0NzhlLTA0ICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsIC0xLjQ3ODJlLTA1ICogMC43NDA5NTExMjUzNTQ5NTkgLyAyLjM4NGUtMDYsCisgICAgOS4wNjM0NzE2OTAxOTE0NzFlLTAxLAorICAgIDEuOTYwMzQyODA2NTkxMjEzZS0wMSwKKworCisgICAgLTQuNzdlLTA3ICogMC43NzMwMTA0NTMzNjI3MzcgLyAyLjM4NGUtMDYsIDEuMDU4NThlLTA0ICogMC43NzMwMTA0NTMzNjI3MzcgLyAyLjM4NGUtMDYsCisgICAgOS4zMDc4NmUtMDQgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwgMi41MjE1MTVlLTAzICogMC43NzMwMTA0NTMzNjI3MzcgLyAyLjM4NGUtMDYsCisgICAgMy41Njk0MTIyZS0wMiAqIDAuNzczMDEwNDUzMzYyNzM3IC8gMi4zODRlLTA2LCAzLjY0MzAzNmUtMDMgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwgOS45MTgyMWUtMDQgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwgOS42MzIxZS0wNSAqIDAuNzczMDEwNDUzMzYyNzM3IC8gMi4zODRlLTA2LCAvKiAxNCAqLworICAgIDEuMTQ0NGUtMDUgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwgMS42NTQ2MmUtMDQgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwKKyAgICAyLjExMDAwNGUtMDMgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwgMS42MTEyODA0ZS0wMiAqIDAuNzczMDEwNDUzMzYyNzM3IC8gMi4zODRlLTA2LAorICAgIC0xLjk2MzQyNDdlLTAyICogMC43NzMwMTA0NTMzNjI3MzcgLyAyLjM4NGUtMDYsIC0yLjgwMzMyNmUtMDMgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwKKyAgICAtMi43NzA0MmUtMDQgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwgLTEuNjY4OWUtMDUgKiAwLjc3MzAxMDQ1MzM2MjczNyAvIDIuMzg0ZS0wNiwKKyAgICA4LjIwNjc4NzkwODI4NjYwMmUtMDEsCisgICAgMy45MDE4MDY0NDAzMjI1NjdlLTAxLAorCisKKyAgICAtNC43N2UtMDcgKiAwLjgwMzIwNzUzMTQ4MDY0NSAvIDIuMzg0ZS0wNiwgMS4wNzI4OGUtMDQgKiAwLjgwMzIwNzUzMTQ4MDY0NSAvIDIuMzg0ZS0wNiwKKyAgICA5LjAyNjUzZS0wNCAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LCAyLjE3NDg1NGUtMDMgKiAwLjgwMzIwNzUzMTQ4MDY0NSAvIDIuMzg0ZS0wNiwKKyAgICAzLjU1ODYzNTdlLTAyICogMC44MDMyMDc1MzE0ODA2NDUgLyAyLjM4NGUtMDYsIDMuODU4NTY2ZS0wMyAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LCA5Ljk1MTU5ZS0wNCAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LCA5LjM0NjBlLTA1ICogMC44MDMyMDc1MzE0ODA2NDUgLyAyLjM4NGUtMDYsIC8qIDEzICovCisgICAgMS4wMDE0ZS0wNSAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LCAxLjQwMTkwZS0wNCAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LAorICAgIDEuOTM3Mzg5ZS0wMyAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LCAxLjUyMzM1MTdlLTAyICogMC44MDMyMDc1MzE0ODA2NDUgLyAyLjM4NGUtMDYsCisgICAgLTIuMDUwNjg1OWUtMDIgKiAwLjgwMzIwNzUzMTQ4MDY0NSAvIDIuMzg0ZS0wNiwgLTIuOTc0MDMzZS0wMyAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LAorICAgIC0zLjA3NTYwZS0wNCAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LCAtMS44MTIwZS0wNSAqIDAuODAzMjA3NTMxNDgwNjQ1IC8gMi4zODRlLTA2LAorICAgIDcuNDE2NTA1NDYyNzIwMzUzZS0wMSwKKyAgICA1LjgwNTY5MzU0NTA4OTI0OWUtMDEsCisKKworICAgIC00Ljc3ZS0wNyAqIDAuODMxNDY5NjEyMzAyNTQ1IC8gMi4zODRlLTA2LCAxLjA4MjQyZS0wNCAqIDAuODMxNDY5NjEyMzAyNTQ1IC8gMi4zODRlLTA2LAorICAgIDguNjg3OTdlLTA0ICogMC44MzE0Njk2MTIzMDI1NDUgLyAyLjM4NGUtMDYsIDEuODAwNTM3ZS0wMyAqIDAuODMxNDY5NjEyMzAyNTQ1IC8gMi4zODRlLTA2LAorICAgIDMuNTQzNTIwMGUtMDIgKiAwLjgzMTQ2OTYxMjMwMjU0NSAvIDIuMzg0ZS0wNiwgNC4wNDkzMDFlLTAzICogMC44MzE0Njk2MTIzMDI1NDUgLyAyLjM4NGUtMDYsIDkuOTQyMDVlLTA0ICogMC44MzE0Njk2MTIzMDI1NDUgLyAyLjM4NGUtMDYsIDkuMDU5OWUtMDUgKiAwLjgzMTQ2OTYxMjMwMjU0NSAvIDIuMzg0ZS0wNiwgLyogMTIgKi8KKyAgICA5LjA2MGUtMDYgKiAwLjgzMTQ2OTYxMjMwMjU0NSAvIDIuMzg0ZS0wNiwgMS4xNjM0OGUtMDQgKiAwLjgzMTQ2OTYxMjMwMjU0NSAvIDIuMzg0ZS0wNiwKKyAgICAxLjc2NjY4MmUtMDMgKiAwLjgzMTQ2OTYxMjMwMjU0NSAvIDIuMzg0ZS0wNiwgMS40MzU4NTIxZS0wMiAqIDAuODMxNDY5NjEyMzAyNTQ1IC8gMi4zODRlLTA2LAorICAgIC0yLjEzNzIzMThlLTAyICogMC44MzE0Njk2MTIzMDI1NDUgLyAyLjM4NGUtMDYsIC0zLjE0MTg4ZS0wMyAqIDAuODMxNDY5NjEyMzAyNTQ1IC8gMi4zODRlLTA2LAorICAgIC0zLjM5MDMxZS0wNCAqIDAuODMxNDY5NjEyMzAyNTQ1IC8gMi4zODRlLTA2LCAtMS45NTUwZS0wNSAqIDAuODMxNDY5NjEyMzAyNTQ1IC8gMi4zODRlLTA2LAorICAgIDYuNjgxNzg2Mzc5MTkyOTg5ZS0wMSwKKyAgICA3LjY1MzY2ODY0NzMwMTc5N2UtMDEsCisKKworICAgIC00Ljc3ZS0wNyAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LCAxLjA4NzE5ZS0wNCAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LAorICAgIDguMjkyMjBlLTA0ICogMC44NTc3Mjg2MTAwMDAyNzIgLyAyLjM4NGUtMDYsIDEuMzk5NTE3ZS0wMyAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LAorICAgIDMuNTI0MjA4MWUtMDIgKiAwLjg1NzcyODYxMDAwMDI3MiAvIDIuMzg0ZS0wNiwgNC4yMTUyNDBlLTAzICogMC44NTc3Mjg2MTAwMDAyNzIgLyAyLjM4NGUtMDYsIDkuODk0MzdlLTA0ICogMC44NTc3Mjg2MTAwMDAyNzIgLyAyLjM4NGUtMDYsIDguNzI2MWUtMDUgKiAwLjg1NzcyODYxMDAwMDI3MiAvIDIuMzg0ZS0wNiwgLyogMTEgKi8KKyAgICA4LjEwNmUtMDYgKiAwLjg1NzcyODYxMDAwMDI3MiAvIDIuMzg0ZS0wNiwgOS4zOTM3ZS0wNSAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LAorICAgIDEuNTk3ODgxZS0wMyAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LCAxLjM0ODkyNDZlLTAyICogMC44NTc3Mjg2MTAwMDAyNzIgLyAyLjM4NGUtMDYsCisgICAgLTIuMjIyODcxOGUtMDIgKiAwLjg1NzcyODYxMDAwMDI3MiAvIDIuMzg0ZS0wNiwgLTMuMzA2ODY2ZS0wMyAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LAorICAgIC0zLjcxNDU2ZS0wNCAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LCAtMi4xNDU4ZS0wNSAqIDAuODU3NzI4NjEwMDAwMjcyIC8gMi4zODRlLTA2LAorICAgIDUuOTkzNzY5MzM2ODE5MjM3ZS0wMSwKKyAgICA5LjQyNzkzNDczNjUxOTk1NGUtMDEsCisKKworICAgIC00Ljc3ZS0wNyAqIDAuODgxOTIxMjY0MzQ4MzU1IC8gMi4zODRlLTA2LCAxLjA4NzE5ZS0wNCAqIDAuODgxOTIxMjY0MzQ4MzU1IC8gMi4zODRlLTA2LAorICAgIDcuODM5MmUtMDQgKiAwLjg4MTkyMTI2NDM0ODM1NSAvIDIuMzg0ZS0wNiwgOS43MTMxN2UtMDQgKiAwLjg4MTkyMTI2NDM0ODM1NSAvIDIuMzg0ZS0wNiwKKyAgICAzLjUwMDcwMDBlLTAyICogMC44ODE5MjEyNjQzNDgzNTUgLyAyLjM4NGUtMDYsIDQuMzU3ODE1ZS0wMyAqIDAuODgxOTIxMjY0MzQ4MzU1IC8gMi4zODRlLTA2LCA5LjgwODU0ZS0wNCAqIDAuODgxOTIxMjY0MzQ4MzU1IC8gMi4zODRlLTA2LCA4LjM5MjNlLTA1ICogMC44ODE5MjEyNjQzNDgzNTUgLyAyLjM4NGUtMDYsIC8qIDEwICovCisgICAgNy42MjllLTA2ICogMC44ODE5MjEyNjQzNDgzNTUgLyAyLjM4NGUtMDYsIDcuMjk1NmUtMDUgKiAwLjg4MTkyMTI2NDM0ODM1NSAvIDIuMzg0ZS0wNiwKKyAgICAxLjQzMjQxOWUtMDMgKiAwLjg4MTkyMTI2NDM0ODM1NSAvIDIuMzg0ZS0wNiwgMS4yNjI3NjAyZS0wMiAqIDAuODgxOTIxMjY0MzQ4MzU1IC8gMi4zODRlLTA2LAorICAgIC0yLjMwNzQxNTBlLTAyICogMC44ODE5MjEyNjQzNDgzNTUgLyAyLjM4NGUtMDYsIC0zLjQ2NzA4M2UtMDMgKiAwLjg4MTkyMTI2NDM0ODM1NSAvIDIuMzg0ZS0wNiwKKyAgICAtNC4wNDM1OGUtMDQgKiAwLjg4MTkyMTI2NDM0ODM1NSAvIDIuMzg0ZS0wNiwgLTIuMzM2NWUtMDUgKiAwLjg4MTkyMTI2NDM0ODM1NSAvIDIuMzg0ZS0wNiwKKyAgICA1LjM0NTExMTM1OTUwNzkxNmUtMDEsCisgICAgMS4xMTExNDA0NjYwMzkyMDVlKzAwLAorCisKKyAgICAtOS41NGUtMDcgKiAwLjkwMzk4OTI5MzEyMzQ0MyAvIDIuMzg0ZS0wNiwgMS4wODI0MmUtMDQgKiAwLjkwMzk4OTI5MzEyMzQ0MyAvIDIuMzg0ZS0wNiwKKyAgICA3LjMxOTQ1ZS0wNCAqIDAuOTAzOTg5MjkzMTIzNDQzIC8gMi4zODRlLTA2LCA1LjE1OTM4ZS0wNCAqIDAuOTAzOTg5MjkzMTIzNDQzIC8gMi4zODRlLTA2LAorICAgIDMuNDczMDQzNGUtMDIgKiAwLjkwMzk4OTI5MzEyMzQ0MyAvIDIuMzg0ZS0wNiwgNC40NzcwMjRlLTAzICogMC45MDM5ODkyOTMxMjM0NDMgLyAyLjM4NGUtMDYsIDkuNjg5MzNlLTA0ICogMC45MDM5ODkyOTMxMjM0NDMgLyAyLjM4NGUtMDYsIDguMDU4NWUtMDUgKiAwLjkwMzk4OTI5MzEyMzQ0MyAvIDIuMzg0ZS0wNiwgLyogOSAqLworICAgIDYuNjc2ZS0wNiAqIDAuOTAzOTg5MjkzMTIzNDQzIC8gMi4zODRlLTA2LCA1LjI5MjllLTA1ICogMC45MDM5ODkyOTMxMjM0NDMgLyAyLjM4NGUtMDYsCisgICAgMS4yNjk4MTdlLTAzICogMC45MDM5ODkyOTMxMjM0NDMgLyAyLjM4NGUtMDYsIDEuMTc3NTAxN2UtMDIgKiAwLjkwMzk4OTI5MzEyMzQ0MyAvIDIuMzg0ZS0wNiwKKyAgICAtMi4zOTA3MTg1ZS0wMiAqIDAuOTAzOTg5MjkzMTIzNDQzIC8gMi4zODRlLTA2LCAtMy42MjI1MzJlLTAzICogMC45MDM5ODkyOTMxMjM0NDMgLyAyLjM4NGUtMDYsCisgICAgLTQuMzgyMTNlLTA0ICogMC45MDM5ODkyOTMxMjM0NDMgLyAyLjM4NGUtMDYsIC0yLjUyNzJlLTA1ICogMC45MDM5ODkyOTMxMjM0NDMgLyAyLjM4NGUtMDYsCisgICAgNC43Mjk2NDc3NTg5MTMxOTllLTAxLAorICAgIDEuMjY4Nzg2NTY4MzI3MjkxZSswMCwKKworCisgICAgLTkuNTRlLTA3ICogMC45MjM4Nzk1MzI1MTEyODY3NTYxMyAvIDIuMzg0ZS0wNiwKKyAgICAxLjA2ODEyZS0wNCAqIDAuOTIzODc5NTMyNTExMjg2NzU2MTMgLyAyLjM4NGUtMDYsCisgICAgNi43NDI0OGUtMDQgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIDMuMzM3OWUtMDUgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIDMuNDQxMjg2MWUtMDIgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIDQuNTczODIyZS0wMyAqIDAuOTIzODc5NTMyNTExMjg2NzU2MTMgLyAyLjM4NGUtMDYsCisgICAgOS41NDE1MWUtMDQgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIDcuNjc3MWUtMDUgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIDYuMTk5ZS0wNiAqIDAuOTIzODc5NTMyNTExMjg2NzU2MTMgLyAyLjM4NGUtMDYsIDMuNDMzMmUtMDUgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIDEuMTExMDMxZS0wMyAqIDAuOTIzODc5NTMyNTExMjg2NzU2MTMgLyAyLjM4NGUtMDYsCisgICAgMS4wOTMzMzk5ZS0wMiAqIDAuOTIzODc5NTMyNTExMjg2NzU2MTMgLyAyLjM4NGUtMDYsCisgICAgLTIuNDcyNTQzN2UtMDIgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIC0zLjc3MTc4MmUtMDMgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIC00LjcyNTQ2ZS0wNCAqIDAuOTIzODc5NTMyNTExMjg2NzU2MTMgLyAyLjM4NGUtMDYsCisgICAgLTIuNzY1N2UtMDUgKiAwLjkyMzg3OTUzMjUxMTI4Njc1NjEzIC8gMi4zODRlLTA2LAorICAgIDQuMTQyMTM1NjIzNzMwOTUwNDg3OWUtMDEsIC8qIHRhbihQSS84KSAqLworICAgIDEuNDE0MjEzNTYyMzczMDk1ZSswMCwKKworCisgICAgLTkuNTRlLTA3ICogMC45NDE1NDQwNjUxODMwMjEgLyAyLjM4NGUtMDYsIDEuMDUzODFlLTA0ICogMC45NDE1NDQwNjUxODMwMjEgLyAyLjM4NGUtMDYsCisgICAgNi4xMDM1MmUtMDQgKiAwLjk0MTU0NDA2NTE4MzAyMSAvIDIuMzg0ZS0wNiwgLTQuNzU4ODNlLTA0ICogMC45NDE1NDQwNjUxODMwMjEgLyAyLjM4NGUtMDYsCisgICAgMy40MDU1NzEwZS0wMiAqIDAuOTQxNTQ0MDY1MTgzMDIxIC8gMi4zODRlLTA2LCA0LjY0OTE2MmUtMDMgKiAwLjk0MTU0NDA2NTE4MzAyMSAvIDIuMzg0ZS0wNiwgOS4zNTU1NWUtMDQgKiAwLjk0MTU0NDA2NTE4MzAyMSAvIDIuMzg0ZS0wNiwgNy4zNDMzZS0wNSAqIDAuOTQxNTQ0MDY1MTgzMDIxIC8gMi4zODRlLTA2LCAvKiA3ICovCisgICAgNS4yNDVlLTA2ICogMC45NDE1NDQwNjUxODMwMjEgLyAyLjM4NGUtMDYsIDEuNzE2NmUtMDUgKiAwLjk0MTU0NDA2NTE4MzAyMSAvIDIuMzg0ZS0wNiwKKyAgICA5LjU2NTM1ZS0wNCAqIDAuOTQxNTQ0MDY1MTgzMDIxIC8gMi4zODRlLTA2LCAxLjAxMDM3MDNlLTAyICogMC45NDE1NDQwNjUxODMwMjEgLyAyLjM4NGUtMDYsCisgICAgLTIuNTUyNzAwMGUtMDIgKiAwLjk0MTU0NDA2NTE4MzAyMSAvIDIuMzg0ZS0wNiwgLTMuOTE0MzU2ZS0wMyAqIDAuOTQxNTQ0MDY1MTgzMDIxIC8gMi4zODRlLTA2LAorICAgIC01LjA3MzU1ZS0wNCAqIDAuOTQxNTQ0MDY1MTgzMDIxIC8gMi4zODRlLTA2LCAtMy4wMDQxZS0wNSAqIDAuOTQxNTQ0MDY1MTgzMDIxIC8gMi4zODRlLTA2LAorICAgIDMuNTc4MDU3MjEzMTQ1MjQxZS0wMSwKKyAgICAxLjU0NjAyMDkwNjcyNTQ3NGUrMDAsCisKKworICAgIC05LjU0ZS0wNyAqIDAuOTU2OTQwMzM1NzMyMjA5IC8gMi4zODRlLTA2LCAxLjAyNTIwZS0wNCAqIDAuOTU2OTQwMzM1NzMyMjA5IC8gMi4zODRlLTA2LAorICAgIDUuMzkzMDNlLTA0ICogMC45NTY5NDAzMzU3MzIyMDkgLyAyLjM4NGUtMDYsIC0xLjAxMTg0OGUtMDMgKiAwLjk1Njk0MDMzNTczMjIwOSAvIDIuMzg0ZS0wNiwKKyAgICAzLjM2NTk5MzVlLTAyICogMC45NTY5NDAzMzU3MzIyMDkgLyAyLjM4NGUtMDYsIDQuNzAzMDQ1ZS0wMyAqIDAuOTU2OTQwMzM1NzMyMjA5IC8gMi4zODRlLTA2LCA5LjE1MDUxZS0wNCAqIDAuOTU2OTQwMzM1NzMyMjA5IC8gMi4zODRlLTA2LCA3LjAwOTVlLTA1ICogMC45NTY5NDAzMzU3MzIyMDkgLyAyLjM4NGUtMDYsIC8qIDYgKi8KKyAgICA0Ljc2OGUtMDYgKiAwLjk1Njk0MDMzNTczMjIwOSAvIDIuMzg0ZS0wNiwgOS41NGUtMDcgKiAwLjk1Njk0MDMzNTczMjIwOSAvIDIuMzg0ZS0wNiwKKyAgICA4LjA2ODA4ZS0wNCAqIDAuOTU2OTQwMzM1NzMyMjA5IC8gMi4zODRlLTA2LCA5LjI4NzgzNGUtMDMgKiAwLjk1Njk0MDMzNTczMjIwOSAvIDIuMzg0ZS0wNiwKKyAgICAtMi42MzEwOTIxZS0wMiAqIDAuOTU2OTQwMzM1NzMyMjA5IC8gMi4zODRlLTA2LCAtNC4wNDg4MjRlLTAzICogMC45NTY5NDAzMzU3MzIyMDkgLyAyLjM4NGUtMDYsCisgICAgLTUuNDIxNjRlLTA0ICogMC45NTY5NDAzMzU3MzIyMDkgLyAyLjM4NGUtMDYsIC0zLjI0MjVlLTA1ICogMC45NTY5NDAzMzU3MzIyMDkgLyAyLjM4NGUtMDYsCisgICAgMy4wMzM0NjY4MzYwNzM0MjRlLTAxLAorICAgIDEuNjYyOTM5MjI0NjA1MDkwZSswMCwKKworCisgICAgLTEuNDMxZS0wNiAqIDAuOTcwMDMxMjUzMTk0NTQ0IC8gMi4zODRlLTA2LCA5LjkxODJlLTA1ICogMC45NzAwMzEyNTMxOTQ1NDQgLyAyLjM4NGUtMDYsCisgICAgNC42MjUzMmUtMDQgKiAwLjk3MDAzMTI1MzE5NDU0NCAvIDIuMzg0ZS0wNiwgLTEuNTczNTYzZS0wMyAqIDAuOTcwMDMxMjUzMTk0NTQ0IC8gMi4zODRlLTA2LAorICAgIDMuMzIyNTUzNmUtMDIgKiAwLjk3MDAzMTI1MzE5NDU0NCAvIDIuMzg0ZS0wNiwgNC43MzczNzdlLTAzICogMC45NzAwMzEyNTMxOTQ1NDQgLyAyLjM4NGUtMDYsIDguOTE2ODVlLTA0ICogMC45NzAwMzEyNTMxOTQ1NDQgLyAyLjM4NGUtMDYsIDYuNjI4MGUtMDUgKiAwLjk3MDAzMTI1MzE5NDU0NCAvIDIuMzg0ZS0wNiwgLyogNSAqLworICAgIDQuMjkyZS0wNiAqIDAuOTcwMDMxMjUzMTk0NTQ0IC8gMi4zODRlLTA2LCAtMS4zODI4ZS0wNSAqIDAuOTcwMDMxMjUzMTk0NTQ0IC8gMi4zODRlLTA2LAorICAgIDYuNjE4NTBlLTA0ICogMC45NzAwMzEyNTMxOTQ1NDQgLyAyLjM4NGUtMDYsIDguNDg3MjI1ZS0wMyAqIDAuOTcwMDMxMjUzMTk0NTQ0IC8gMi4zODRlLTA2LAorICAgIC0yLjcwNzM4NjBlLTAyICogMC45NzAwMzEyNTMxOTQ1NDQgLyAyLjM4NGUtMDYsIC00LjE3NDcwOWUtMDMgKiAwLjk3MDAzMTI1MzE5NDU0NCAvIDIuMzg0ZS0wNiwKKyAgICAtNS43Njk3M2UtMDQgKiAwLjk3MDAzMTI1MzE5NDU0NCAvIDIuMzg0ZS0wNiwgLTMuNDgwOWUtMDUgKiAwLjk3MDAzMTI1MzE5NDU0NCAvIDIuMzg0ZS0wNiwKKyAgICAyLjUwNDg2OTYwMTkxMzA1NWUtMDEsCisgICAgMS43NjM4NDI1Mjg2OTY3MTBlKzAwLAorCisKKyAgICAtMS40MzFlLTA2ICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwgOS41MzY3ZS0wNSAqIDAuOTgwNzg1MjgwNDAzMjMgLyAyLjM4NGUtMDYsCisgICAgMy43ODYwOWUtMDQgKiAwLjk4MDc4NTI4MDQwMzIzIC8gMi4zODRlLTA2LCAtMi4xNjE1MDNlLTAzICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwKKyAgICAzLjI3NTQ4OThlLTAyICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwgNC43NTIxNTllLTAzICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwgOC42NjQxM2UtMDQgKiAwLjk4MDc4NTI4MDQwMzIzIC8gMi4zODRlLTA2LCA2LjI5NDNlLTA1ICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwgLyogNCAqLworICAgIDMuODE1ZS0wNiAqIDAuOTgwNzg1MjgwNDAzMjMgLyAyLjM4NGUtMDYsIC0yLjcxOGUtMDUgKiAwLjk4MDc4NTI4MDQwMzIzIC8gMi4zODRlLTA2LAorICAgIDUuMjIxMzdlLTA0ICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwgNy43MDMzMDRlLTAzICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwKKyAgICAtMi43ODE1MzQyZS0wMiAqIDAuOTgwNzg1MjgwNDAzMjMgLyAyLjM4NGUtMDYsIC00LjI5MDU4MWUtMDMgKiAwLjk4MDc4NTI4MDQwMzIzIC8gMi4zODRlLTA2LAorICAgIC02LjExNzgyZS0wNCAqIDAuOTgwNzg1MjgwNDAzMjMgLyAyLjM4NGUtMDYsIC0zLjc2NzBlLTA1ICogMC45ODA3ODUyODA0MDMyMyAvIDIuMzg0ZS0wNiwKKyAgICAxLjk4OTEyMzY3Mzc5NjU4MGUtMDEsCisgICAgMS44NDc3NTkwNjUwMjI1NzNlKzAwLAorCisKKyAgICAtMS45MDdlLTA2ICogMC45ODkxNzY1MDk5NjQ3ODEgLyAyLjM4NGUtMDYsIDkuMDEyMmUtMDUgKiAwLjk4OTE3NjUwOTk2NDc4MSAvIDIuMzg0ZS0wNiwKKyAgICAyLjg4NDg2ZS0wNCAqIDAuOTg5MTc2NTA5OTY0NzgxIC8gMi4zODRlLTA2LCAtMi43NzQyMzllLTAzICogMC45ODkxNzY1MDk5NjQ3ODEgLyAyLjM4NGUtMDYsCisgICAgMy4yMjQ4MDIwZS0wMiAqIDAuOTg5MTc2NTA5OTY0NzgxIC8gMi4zODRlLTA2LCA0Ljc0ODgyMWUtMDMgKiAwLjk4OTE3NjUwOTk2NDc4MSAvIDIuMzg0ZS0wNiwgOC4zODc1N2UtMDQgKiAwLjk4OTE3NjUwOTk2NDc4MSAvIDIuMzg0ZS0wNiwgNS45NjA1ZS0wNSAqIDAuOTg5MTc2NTA5OTY0NzgxIC8gMi4zODRlLTA2LCAvKiAzICovCisgICAgMy4zMzhlLTA2ICogMC45ODkxNzY1MDk5NjQ3ODEgLyAyLjM4NGUtMDYsIC0zLjk1NzdlLTA1ICogMC45ODkxNzY1MDk5NjQ3ODEgLyAyLjM4NGUtMDYsCisgICAgMy44ODE0NWUtMDQgKiAwLjk4OTE3NjUwOTk2NDc4MSAvIDIuMzg0ZS0wNiwgNi45MzcwMjdlLTAzICogMC45ODkxNzY1MDk5NjQ3ODEgLyAyLjM4NGUtMDYsCisgICAgLTIuODUzMjk4MmUtMDIgKiAwLjk4OTE3NjUwOTk2NDc4MSAvIDIuMzg0ZS0wNiwgLTQuMzk1OTYyZS0wMyAqIDAuOTg5MTc2NTA5OTY0NzgxIC8gMi4zODRlLTA2LAorICAgIC02LjQ2NTkxZS0wNCAqIDAuOTg5MTc2NTA5OTY0NzgxIC8gMi4zODRlLTA2LCAtNC4wNTMxZS0wNSAqIDAuOTg5MTc2NTA5OTY0NzgxIC8gMi4zODRlLTA2LAorICAgIDEuNDgzMzU5ODc1MzgzNDc0ZS0wMSwKKyAgICAxLjkxMzg4MDY3MTQ2NDQxOGUrMDAsCisKKworICAgIC0xLjkwN2UtMDYgKiAwLjk5NTE4NDcyNjY3MjE5NyAvIDIuMzg0ZS0wNiwgOC40NDAwZS0wNSAqIDAuOTk1MTg0NzI2NjcyMTk3IC8gMi4zODRlLTA2LAorICAgIDEuOTE2ODllLTA0ICogMC45OTUxODQ3MjY2NzIxOTcgLyAyLjM4NGUtMDYsIC0zLjQxMTI5M2UtMDMgKiAwLjk5NTE4NDcyNjY3MjE5NyAvIDIuMzg0ZS0wNiwKKyAgICAzLjE3MDY4MTBlLTAyICogMC45OTUxODQ3MjY2NzIxOTcgLyAyLjM4NGUtMDYsIDQuNzI4MzE3ZS0wMyAqIDAuOTk1MTg0NzI2NjcyMTk3IC8gMi4zODRlLTA2LAorICAgIDguMDk2NjllLTA0ICogMC45OTUxODQ3MjY2NzIxOTcgLyAyLjM4NGUtMDYsIDUuNTc5ZS0wNSAqIDAuOTk1MTg0NzI2NjcyMTk3IC8gMi4zODRlLTA2LAorICAgIDMuMzM4ZS0wNiAqIDAuOTk1MTg0NzI2NjcyMTk3IC8gMi4zODRlLTA2LCAtNS4wNTQ1ZS0wNSAqIDAuOTk1MTg0NzI2NjcyMTk3IC8gMi4zODRlLTA2LAorICAgIDIuNTk4NzZlLTA0ICogMC45OTUxODQ3MjY2NzIxOTcgLyAyLjM4NGUtMDYsIDYuMTg5MzQ2ZS0wMyAqIDAuOTk1MTg0NzI2NjcyMTk3IC8gMi4zODRlLTA2LAorICAgIC0yLjkyMjQ4NzNlLTAyICogMC45OTUxODQ3MjY2NzIxOTcgLyAyLjM4NGUtMDYsIC00LjQ4OTg5OWUtMDMgKiAwLjk5NTE4NDcyNjY3MjE5NyAvIDIuMzg0ZS0wNiwKKyAgICAtNi44MDkyM2UtMDQgKiAwLjk5NTE4NDcyNjY3MjE5NyAvIDIuMzg0ZS0wNiwgLTQuMzM5MmUtMDUgKiAwLjk5NTE4NDcyNjY3MjE5NyAvIDIuMzg0ZS0wNiwKKyAgICA5Ljg0OTE0MDMzNTcxNjQyNWUtMDIsCisgICAgMS45NjE1NzA1NjA4MDY0NjFlKzAwLAorCisKKyAgICAtMi4zODRlLTA2ICogMC45OTg3OTU0NTYyMDUxNzIgLyAyLjM4NGUtMDYsIDcuNzcyNGUtMDUgKiAwLjk5ODc5NTQ1NjIwNTE3MiAvIDIuMzg0ZS0wNiwKKyAgICA4LjgyMTVlLTA1ICogMC45OTg3OTU0NTYyMDUxNzIgLyAyLjM4NGUtMDYsIC00LjA3MjE4OWUtMDMgKiAwLjk5ODc5NTQ1NjIwNTE3MiAvIDIuMzg0ZS0wNiwKKyAgICAzLjExMzI2OThlLTAyICogMC45OTg3OTU0NTYyMDUxNzIgLyAyLjM4NGUtMDYsIDQuNjkxMTI0ZS0wMyAqIDAuOTk4Nzk1NDU2MjA1MTcyIC8gMi4zODRlLTA2LAorICAgIDcuNzkxNTJlLTA0ICogMC45OTg3OTU0NTYyMDUxNzIgLyAyLjM4NGUtMDYsIDUuMjkyOWUtMDUgKiAwLjk5ODc5NTQ1NjIwNTE3MiAvIDIuMzg0ZS0wNiwKKyAgICAyLjg2MWUtMDYgKiAwLjk5ODc5NTQ1NjIwNTE3MiAvIDIuMzg0ZS0wNiwgLTYuMDU1OGUtMDUgKiAwLjk5ODc5NTQ1NjIwNTE3MiAvIDIuMzg0ZS0wNiwKKyAgICAxLjM3MzI5ZS0wNCAqIDAuOTk4Nzk1NDU2MjA1MTcyIC8gMi4zODRlLTA2LCA1LjQ2MjE3MGUtMDMgKiAwLjk5ODc5NTQ1NjIwNTE3MiAvIDIuMzg0ZS0wNiwKKyAgICAtMi45ODkwMDYwZS0wMiAqIDAuOTk4Nzk1NDU2MjA1MTcyIC8gMi4zODRlLTA2LCAtNC41NzA0ODRlLTAzICogMC45OTg3OTU0NTYyMDUxNzIgLyAyLjM4NGUtMDYsCisgICAgLTcuMTQzMDJlLTA0ICogMC45OTg3OTU0NTYyMDUxNzIgLyAyLjM4NGUtMDYsIC00LjYyNTNlLTA1ICogMC45OTg3OTU0NTYyMDUxNzIgLyAyLjM4NGUtMDYsCisgICAgNC45MTI2ODQ5NzY5NDY3MjVlLTAyLAorICAgIDEuOTkwMzY5NDUzMzQ0Mzk0ZSswMCwKKworCisgICAgMy41NzgwOTA3ZS0wMiAqIFNRUlQyICogMC41IC8gMi4zODRlLTA2LCAxLjc4NzYxNDhlLTAyICogU1FSVDIgKiAwLjUgLyAyLjM4NGUtMDYsCisgICAgMy4xMzQ3MjdlLTAzICogU1FSVDIgKiAwLjUgLyAyLjM4NGUtMDYsIDIuNDU3MTQyZS0wMyAqIFNRUlQyICogMC41IC8gMi4zODRlLTA2LAorICAgIDkuNzEzMTdlLTA0ICogU1FSVDIgKiAwLjUgLyAyLjM4NGUtMDYsIDIuMTg4NjhlLTA0ICogU1FSVDIgKiAwLjUgLyAyLjM4NGUtMDYsCisgICAgMS4wMTU2NmUtMDQgKiBTUVJUMiAqIDAuNSAvIDIuMzg0ZS0wNiwgMS4zODI4ZS0wNSAqIFNRUlQyICogMC41IC8gMi4zODRlLTA2LAorCisgICAgMy4wNTI2NjM4ZS0wMiAvIDIuMzg0ZS0wNiwgNC42MzgxOTVlLTAzIC8gMi4zODRlLTA2LCA3LjQ3MjA0ZS0wNCAvIDIuMzg0ZS0wNiwKKyAgICA0Ljk1OTFlLTA1IC8gMi4zODRlLTA2LAorICAgIDQuNzU2NDUxZS0wMyAvIDIuMzg0ZS0wNiwgMi4xNDU4ZS0wNSAvIDIuMzg0ZS0wNiwgLTYuOTYxOGUtMDUgLyAyLjM4NGUtMDYsIC8qICAgIDIuMzg0ZS0wNi8yLjM4NGUtMDYgKi8KK307CisjZW5kaWYKKworCisjZGVmaW5lIE5TIDEyCisjZGVmaW5lIE5MIDM2CisKK3N0YXRpYyBjb25zdCBGTE9BVCB3aW5bNF1bTkxdID0geworICAgIHsKKyAgICAgMi4zODIxOTE3MzkzNDc5MTNlLTEzLAorICAgICA2LjQyMzMwNTg3MjE0NzgzNGUtMTMsCisgICAgIDkuNDAwODQ5MDk0MDQ5Njg4ZS0xMywKKyAgICAgMS4xMjI0MzUwMjYwOTY1NTZlLTEyLAorICAgICAxLjE4Mzg0MDMyMTI2NzQ4MWUtMTIsCisgICAgIDEuMTIyNDM1MDI2MDk2NTU2ZS0xMiwKKyAgICAgOS40MDA4NDkwOTQwNDk2OTBlLTEzLAorICAgICA2LjQyMzMwNTg3MjE0NzgzOWUtMTMsCisgICAgIDIuMzgyMTkxNzM5MzQ3OTE4ZS0xMywKKworICAgICA1LjQ1NjExNjEwODk0MzQxMmUtMTIsCisgICAgIDQuODc4OTg1MTk5NTY1ODUyZS0xMiwKKyAgICAgNC4yNDA0NDg5OTUwMTczNjdlLTEyLAorICAgICAzLjU1OTkwOTA5NDc1ODI1MmUtMTIsCisgICAgIDIuODU4MDQzMzU5Mjg4MDc1ZS0xMiwKKyAgICAgMi4xNTYxNzc2MjM4MTc4OThlLTEyLAorICAgICAxLjQ3NTYzNzcyMzU1ODc4M2UtMTIsCisgICAgIDguMzcxMDE1MTkwMTAyOTc0ZS0xMywKKyAgICAgMi41OTk3MDYwOTYzMjczNzZlLTEzLAorCisgICAgIC01LjQ1NjExNjEwODk0MzQxMmUtMTIsCisgICAgIC00Ljg3ODk4NTE5OTU2NTg1MmUtMTIsCisgICAgIC00LjI0MDQ0ODk5NTAxNzM2N2UtMTIsCisgICAgIC0zLjU1OTkwOTA5NDc1ODI1MmUtMTIsCisgICAgIC0yLjg1ODA0MzM1OTI4ODA3NmUtMTIsCisgICAgIC0yLjE1NjE3NzYyMzgxNzg5OGUtMTIsCisgICAgIC0xLjQ3NTYzNzcyMzU1ODc4M2UtMTIsCisgICAgIC04LjM3MTAxNTE5MDEwMjk3NWUtMTMsCisgICAgIC0yLjU5OTcwNjA5NjMyNzM3NmUtMTMsCisKKyAgICAgLTIuMzgyMTkxNzM5MzQ3OTIzZS0xMywKKyAgICAgLTYuNDIzMzA1ODcyMTQ3ODQzZS0xMywKKyAgICAgLTkuNDAwODQ5MDk0MDQ5Njk2ZS0xMywKKyAgICAgLTEuMTIyNDM1MDI2MDk2NTU2ZS0xMiwKKyAgICAgLTEuMTgzODQwMzIxMjY3NDgxZS0xMiwKKyAgICAgLTEuMTIyNDM1MDI2MDk2NTU2ZS0xMiwKKyAgICAgLTkuNDAwODQ5MDk0MDQ5Njk0ZS0xMywKKyAgICAgLTYuNDIzMzA1ODcyMTQ3ODQwZS0xMywKKyAgICAgLTIuMzgyMTkxNzM5MzQ3OTE4ZS0xMywKKyAgICAgfSwKKyAgICB7CisgICAgIDIuMzgyMTkxNzM5MzQ3OTEzZS0xMywKKyAgICAgNi40MjMzMDU4NzIxNDc4MzRlLTEzLAorICAgICA5LjQwMDg0OTA5NDA0OTY4OGUtMTMsCisgICAgIDEuMTIyNDM1MDI2MDk2NTU2ZS0xMiwKKyAgICAgMS4xODM4NDAzMjEyNjc0ODFlLTEyLAorICAgICAxLjEyMjQzNTAyNjA5NjU1NmUtMTIsCisgICAgIDkuNDAwODQ5MDk0MDQ5Njg4ZS0xMywKKyAgICAgNi40MjMzMDU4NzIxNDc4NDFlLTEzLAorICAgICAyLjM4MjE5MTczOTM0NzkxOGUtMTMsCisKKyAgICAgNS40NTYxMTYxMDg5NDM0MTNlLTEyLAorICAgICA0Ljg3ODk4NTE5OTU2NTg1MmUtMTIsCisgICAgIDQuMjQwNDQ4OTk1MDE3MzY3ZS0xMiwKKyAgICAgMy41NTk5MDkwOTQ3NTgyNTNlLTEyLAorICAgICAyLjg1ODA0MzM1OTI4ODA3NWUtMTIsCisgICAgIDIuMTU2MTc3NjIzODE3ODk4ZS0xMiwKKyAgICAgMS40NzU2Mzc3MjM1NTg3ODJlLTEyLAorICAgICA4LjM3MTAxNTE5MDEwMjk3NWUtMTMsCisgICAgIDIuNTk5NzA2MDk2MzI3Mzc2ZS0xMywKKworICAgICAtNS40NjEzMTQwNjk4MDk3NTVlLTEyLAorICAgICAtNC45MjEwODU3NzA1MjQwNTVlLTEyLAorICAgICAtNC4zNDM0MDUwMzcwOTE4MzhlLTEyLAorICAgICAtMy43MzI2NjgzNjg3MDc2ODdlLTEyLAorICAgICAtMy4wOTM1MjM4NDAxOTA4ODVlLTEyLAorICAgICAtMi40MzA4MzU3MjczMjk0NjVlLTEyLAorICAgICAtMS43MzQ2NzkwMTAwMDc3NTFlLTEyLAorICAgICAtOS43NDgyNTM2NTY2MDkyODFlLTEzLAorICAgICAtMi43OTc0MzUxMjAxNjgzMjZlLTEzLAorCisgICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKKyAgICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAorICAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCisgICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKKyAgICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAorICAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCisgICAgIC0yLjI4Mzc0ODI0MTc5OTUzMWUtMTMsCisgICAgIC00LjAzNzg1ODg3NDAyMDY4NmUtMTMsCisgICAgIC0yLjE0NjU0NzQ2NDgyNTMyM2UtMTMsCisgICAgIH0sCisgICAgeworICAgICAxLjMxNjUyNDk3NTg3Mzk1OGUtMDEsIC8qIHdpbltTSE9SVF9UWVBFXSAqLworICAgICA0LjE0MjEzNTYyMzczMDk1MGUtMDEsCisgICAgIDcuNjczMjY5ODc5Nzg5NjAyZS0wMSwKKworICAgICAxLjA5MTMwODUwMTA2OTI3MWUrMDAsIC8qIHRhbnRhYl9sICovCisgICAgIDEuMzAzMjI1MzcyODQxMjA2ZSswMCwKKyAgICAgMS41Njk2ODU1NzcxMTc0OTBlKzAwLAorICAgICAxLjkyMDk4MjEyNjk3MTE2NmUrMDAsCisgICAgIDIuNDE0MjEzNTYyMzczMDk0ZSswMCwKKyAgICAgMy4xNzE1OTQ4MDIzNjMyMTJlKzAwLAorICAgICA0LjUxMDcwODUwMzY2MjA1NWUrMDAsCisgICAgIDcuNTk1NzU0MTEyNzI1MTQ2ZSswMCwKKyAgICAgMi4yOTAzNzY1NTQ4NDMxMTVlKzAxLAorCisgICAgIDAuOTg0ODA3NzUzMDEyMjA4MDIwMzIsIC8qIGN4ICovCisgICAgIDAuNjQyNzg3NjA5Njg2NTM5MzYyOTIsCisgICAgIDAuMzQyMDIwMTQzMzI1NjY4ODIzOTMsCisgICAgIDAuOTM5NjkyNjIwNzg1OTA4NDI3OTEsCisgICAgIC0wLjE3MzY0ODE3NzY2NjkzMDMwMzQzLAorICAgICAtMC43NjYwNDQ0NDMxMTg5Nzc5MDI0MywKKyAgICAgMC44NjYwMjU0MDM3ODQ0Mzg3MDc2MSwKKyAgICAgMC41MDAwMDAwMDAwMDAwMDBlKzAwLAorCisgICAgIC01LjE0NDk1NzU1NDI3NTI2NWUtMDEsIC8qIGNhICovCisgICAgIC00LjcxNzMxOTY4NTY0OTcyM2UtMDEsCisgICAgIC0zLjEzMzc3NDU0MjAzOTAxOWUtMDEsCisgICAgIC0xLjgxOTEzMTk5NjEwOTgxMmUtMDEsCisgICAgIC05LjQ1NzQxOTI1MjY0MjA2NGUtMDIsCisgICAgIC00LjA5NjU1ODI4ODUzMDQwNWUtMDIsCisgICAgIC0xLjQxOTg1Njg1NzI0NzExNWUtMDIsCisgICAgIC0zLjY5OTk3NDY3Mzc2MDAzN2UtMDMsCisKKyAgICAgOC41NzQ5MjkyNTcxMjU0NDJlLTAxLCAvKiBjcyAqLworICAgICA4LjgxNzQxOTk3MzE3NzA1MmUtMDEsCisgICAgIDkuNDk2Mjg2NDkxMDI3MzI5ZS0wMSwKKyAgICAgOS44MzMxNDU5MjQ5MTc5MDFlLTAxLAorICAgICA5Ljk1NTE3ODE2MDY3NTg1N2UtMDEsCisgICAgIDkuOTkxNjA1NTgxNzgxNDc1ZS0wMSwKKyAgICAgOS45OTg5OTE5NTI0NDQ0NzBlLTAxLAorICAgICA5Ljk5OTkzMTU1MDcwMjgwMmUtMDEsCisgICAgIH0sCisgICAgeworICAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCisgICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKKyAgICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAorICAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCisgICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKKyAgICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAorICAgICAyLjI4Mzc0ODI0MTc5OTUzMWUtMTMsCisgICAgIDQuMDM3ODU4ODc0MDIwNjg2ZS0xMywKKyAgICAgMi4xNDY1NDc0NjQ4MjUzMjNlLTEzLAorCisgICAgIDUuNDYxMzE0MDY5ODA5NzU1ZS0xMiwKKyAgICAgNC45MjEwODU3NzA1MjQwNTVlLTEyLAorICAgICA0LjM0MzQwNTAzNzA5MTgzOGUtMTIsCisgICAgIDMuNzMyNjY4MzY4NzA3Njg3ZS0xMiwKKyAgICAgMy4wOTM1MjM4NDAxOTA4ODVlLTEyLAorICAgICAyLjQzMDgzNTcyNzMyOTQ2NmUtMTIsCisgICAgIDEuNzM0Njc5MDEwMDA3NzUxZS0xMiwKKyAgICAgOS43NDgyNTM2NTY2MDkyODFlLTEzLAorICAgICAyLjc5NzQzNTEyMDE2ODMyNmUtMTMsCisKKyAgICAgLTUuNDU2MTE2MTA4OTQzNDEzZS0xMiwKKyAgICAgLTQuODc4OTg1MTk5NTY1ODUyZS0xMiwKKyAgICAgLTQuMjQwNDQ4OTk1MDE3MzY3ZS0xMiwKKyAgICAgLTMuNTU5OTA5MDk0NzU4MjUzZS0xMiwKKyAgICAgLTIuODU4MDQzMzU5Mjg4MDc1ZS0xMiwKKyAgICAgLTIuMTU2MTc3NjIzODE3ODk4ZS0xMiwKKyAgICAgLTEuNDc1NjM3NzIzNTU4NzgyZS0xMiwKKyAgICAgLTguMzcxMDE1MTkwMTAyOTc1ZS0xMywKKyAgICAgLTIuNTk5NzA2MDk2MzI3Mzc2ZS0xMywKKworICAgICAtMi4zODIxOTE3MzkzNDc5MTNlLTEzLAorICAgICAtNi40MjMzMDU4NzIxNDc4MzRlLTEzLAorICAgICAtOS40MDA4NDkwOTQwNDk2ODhlLTEzLAorICAgICAtMS4xMjI0MzUwMjYwOTY1NTZlLTEyLAorICAgICAtMS4xODM4NDAzMjEyNjc0ODFlLTEyLAorICAgICAtMS4xMjI0MzUwMjYwOTY1NTZlLTEyLAorICAgICAtOS40MDA4NDkwOTQwNDk2ODhlLTEzLAorICAgICAtNi40MjMzMDU4NzIxNDc4NDFlLTEzLAorICAgICAtMi4zODIxOTE3MzkzNDc5MThlLTEzLAorICAgICB9Cit9OworCisjZGVmaW5lIHRhbnRhYl9sICh3aW5bU0hPUlRfVFlQRV0rMykKKyNkZWZpbmUgY3ggKHdpbltTSE9SVF9UWVBFXSsxMikKKyNkZWZpbmUgY2EgKHdpbltTSE9SVF9UWVBFXSsyMCkKKyNkZWZpbmUgY3MgKHdpbltTSE9SVF9UWVBFXSsyOCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB3aW5kb3dfc3ViYmFuZCgpCisqCisqIFBVUlBPU0U6ICBPdmVybGFwcGluZyB3aW5kb3cgb24gUENNIHNhbXBsZXMKKyoKKyogU0VNQU5USUNTOgorKiAzMiAxNi1iaXQgcGNtIHNhbXBsZXMgYXJlIHNjYWxlZCB0byBmcmFjdGlvbmFsIDIncyBjb21wbGVtZW50IGFuZAorKiBjb25jYXRlbmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgd2luZG93IGJ1ZmZlciAjeCMuIFRoZSB1cGRhdGVkIHdpbmRvdworKiBidWZmZXIgI3gjIGlzIHRoZW4gd2luZG93ZWQgYnkgdGhlIGFuYWx5c2lzIHdpbmRvdyAjYyMgdG8gcHJvZHVjZSB0aGUKKyogd2luZG93ZWQgc2FtcGxlICN6IworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBuZXcgSURDVCByb3V0aW5lIHdyaXR0ZW4gYnkgVGFrZWhpcm8gVE9NSU5BR0EKKyAqLworc3RhdGljIGNvbnN0IGludCBvcmRlcltdID0geworICAgIDAsIDEsIDE2LCAxNywgOCwgOSwgMjQsIDI1LCA0LCA1LCAyMCwgMjEsIDEyLCAxMywgMjgsIDI5LAorICAgIDIsIDMsIDE4LCAxOSwgMTAsIDExLCAyNiwgMjcsIDYsIDcsIDIyLCAyMywgMTQsIDE1LCAzMCwgMzEKK307CisKKworLyogcmV0dXJucyBzdW1faj0wXjMxIGFbal0qY29zKFBJKmoqKGsrMS8yKS8zMiksIDA8PWs8MzIgKi8KK2lubGluZSBzdGF0aWMgdm9pZAord2luZG93X3N1YmJhbmQoY29uc3Qgc2FtcGxlX3QgKiB4MSwgRkxPQVQgYVtTQkxJTUlUXSkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgRkxPQVQgY29uc3QgKndwID0gZW53aW5kb3cgKyAxMDsKKworICAgIGNvbnN0IHNhbXBsZV90ICp4MiA9ICZ4MVsyMzggLSAxNCAtIDI4Nl07CisKKyAgICBmb3IgKGkgPSAtMTU7IGkgPCAwOyBpKyspIHsKKyAgICAgICAgRkxPQVQgICB3LCBzLCB0OworCisgICAgICAgIHcgPSB3cFstMTBdOworICAgICAgICBzID0geDJbLTIyNF0gKiB3OworICAgICAgICB0ID0geDFbMjI0XSAqIHc7CisgICAgICAgIHcgPSB3cFstOV07CisgICAgICAgIHMgKz0geDJbLTE2MF0gKiB3OworICAgICAgICB0ICs9IHgxWzE2MF0gKiB3OworICAgICAgICB3ID0gd3BbLThdOworICAgICAgICBzICs9IHgyWy05Nl0gKiB3OworICAgICAgICB0ICs9IHgxWzk2XSAqIHc7CisgICAgICAgIHcgPSB3cFstN107CisgICAgICAgIHMgKz0geDJbLTMyXSAqIHc7CisgICAgICAgIHQgKz0geDFbMzJdICogdzsKKyAgICAgICAgdyA9IHdwWy02XTsKKyAgICAgICAgcyArPSB4MlszMl0gKiB3OworICAgICAgICB0ICs9IHgxWy0zMl0gKiB3OworICAgICAgICB3ID0gd3BbLTVdOworICAgICAgICBzICs9IHgyWzk2XSAqIHc7CisgICAgICAgIHQgKz0geDFbLTk2XSAqIHc7CisgICAgICAgIHcgPSB3cFstNF07CisgICAgICAgIHMgKz0geDJbMTYwXSAqIHc7CisgICAgICAgIHQgKz0geDFbLTE2MF0gKiB3OworICAgICAgICB3ID0gd3BbLTNdOworICAgICAgICBzICs9IHgyWzIyNF0gKiB3OworICAgICAgICB0ICs9IHgxWy0yMjRdICogdzsKKworICAgICAgICB3ID0gd3BbLTJdOworICAgICAgICBzICs9IHgxWy0yNTZdICogdzsKKyAgICAgICAgdCAtPSB4MlsyNTZdICogdzsKKyAgICAgICAgdyA9IHdwWy0xXTsKKyAgICAgICAgcyArPSB4MVstMTkyXSAqIHc7CisgICAgICAgIHQgLT0geDJbMTkyXSAqIHc7CisgICAgICAgIHcgPSB3cFswXTsKKyAgICAgICAgcyArPSB4MVstMTI4XSAqIHc7CisgICAgICAgIHQgLT0geDJbMTI4XSAqIHc7CisgICAgICAgIHcgPSB3cFsxXTsKKyAgICAgICAgcyArPSB4MVstNjRdICogdzsKKyAgICAgICAgdCAtPSB4Mls2NF0gKiB3OworICAgICAgICB3ID0gd3BbMl07CisgICAgICAgIHMgKz0geDFbMF0gKiB3OworICAgICAgICB0IC09IHgyWzBdICogdzsKKyAgICAgICAgdyA9IHdwWzNdOworICAgICAgICBzICs9IHgxWzY0XSAqIHc7CisgICAgICAgIHQgLT0geDJbLTY0XSAqIHc7CisgICAgICAgIHcgPSB3cFs0XTsKKyAgICAgICAgcyArPSB4MVsxMjhdICogdzsKKyAgICAgICAgdCAtPSB4MlstMTI4XSAqIHc7CisgICAgICAgIHcgPSB3cFs1XTsKKyAgICAgICAgcyArPSB4MVsxOTJdICogdzsKKyAgICAgICAgdCAtPSB4MlstMTkyXSAqIHc7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogdGhpcyBtdWx0aXBseWVyIGNvdWxkIGJlIHJlbW92ZWQsIGJ1dCBpdCBuZWVkcyBtb3JlIDI1NiBGTE9BVCBkYXRhLgorICAgICAgICAgKiB0aGlua2luZyBhYm91dCB0aGUgZGF0YSBjYWNoZSBwZXJmb3JtYW5jZSwgSSB0aGluayB3ZSBzaG91bGQgbm90CisgICAgICAgICAqIHVzZSBzdWNoIGEgaHVnZSB0YWJsZS4gdHQgMjAwMC9PY3QvMjUKKyAgICAgICAgICovCisgICAgICAgIHMgKj0gd3BbNl07CisgICAgICAgIHcgPSB0IC0gczsKKyAgICAgICAgYVszMCArIGkgKiAyXSA9IHQgKyBzOworICAgICAgICBhWzMxICsgaSAqIDJdID0gd3BbN10gKiB3OworICAgICAgICB3cCArPSAxODsKKyAgICAgICAgeDEtLTsKKyAgICAgICAgeDIrKzsKKyAgICB9CisgICAgeworICAgICAgICBGTE9BVCAgIHMsIHQsIHUsIHY7CisgICAgICAgIHQgPSB4MVstMTZdICogd3BbLTEwXTsKKyAgICAgICAgcyA9IHgxWy0zMl0gKiB3cFstMl07CisgICAgICAgIHQgKz0gKHgxWy00OF0gLSB4MVsxNl0pICogd3BbLTldOworICAgICAgICBzICs9IHgxWy05Nl0gKiB3cFstMV07CisgICAgICAgIHQgKz0gKHgxWy04MF0gKyB4MVs0OF0pICogd3BbLThdOworICAgICAgICBzICs9IHgxWy0xNjBdICogd3BbMF07CisgICAgICAgIHQgKz0gKHgxWy0xMTJdIC0geDFbODBdKSAqIHdwWy03XTsKKyAgICAgICAgcyArPSB4MVstMjI0XSAqIHdwWzFdOworICAgICAgICB0ICs9ICh4MVstMTQ0XSArIHgxWzExMl0pICogd3BbLTZdOworICAgICAgICBzIC09IHgxWzMyXSAqIHdwWzJdOworICAgICAgICB0ICs9ICh4MVstMTc2XSAtIHgxWzE0NF0pICogd3BbLTVdOworICAgICAgICBzIC09IHgxWzk2XSAqIHdwWzNdOworICAgICAgICB0ICs9ICh4MVstMjA4XSArIHgxWzE3Nl0pICogd3BbLTRdOworICAgICAgICBzIC09IHgxWzE2MF0gKiB3cFs0XTsKKyAgICAgICAgdCArPSAoeDFbLTI0MF0gLSB4MVsyMDhdKSAqIHdwWy0zXTsKKyAgICAgICAgcyAtPSB4MVsyMjRdOworCisgICAgICAgIHUgPSBzIC0gdDsKKyAgICAgICAgdiA9IHMgKyB0OworCisgICAgICAgIHQgPSBhWzE0XTsKKyAgICAgICAgcyA9IGFbMTVdIC0gdDsKKworICAgICAgICBhWzMxXSA9IHYgKyB0OyAgLyogQTAgKi8KKyAgICAgICAgYVszMF0gPSB1ICsgczsgIC8qIEExICovCisgICAgICAgIGFbMTVdID0gdSAtIHM7ICAvKiBBMiAqLworICAgICAgICBhWzE0XSA9IHYgLSB0OyAgLyogQTMgKi8KKyAgICB9CisgICAgeworICAgICAgICBGTE9BVCAgIHhyOworICAgICAgICB4ciA9IGFbMjhdIC0gYVswXTsKKyAgICAgICAgYVswXSArPSBhWzI4XTsKKyAgICAgICAgYVsyOF0gPSB4ciAqIHdwWy0yICogMTggKyA3XTsKKyAgICAgICAgeHIgPSBhWzI5XSAtIGFbMV07CisgICAgICAgIGFbMV0gKz0gYVsyOV07CisgICAgICAgIGFbMjldID0geHIgKiB3cFstMiAqIDE4ICsgN107CisKKyAgICAgICAgeHIgPSBhWzI2XSAtIGFbMl07CisgICAgICAgIGFbMl0gKz0gYVsyNl07CisgICAgICAgIGFbMjZdID0geHIgKiB3cFstNCAqIDE4ICsgN107CisgICAgICAgIHhyID0gYVsyN10gLSBhWzNdOworICAgICAgICBhWzNdICs9IGFbMjddOworICAgICAgICBhWzI3XSA9IHhyICogd3BbLTQgKiAxOCArIDddOworCisgICAgICAgIHhyID0gYVsyNF0gLSBhWzRdOworICAgICAgICBhWzRdICs9IGFbMjRdOworICAgICAgICBhWzI0XSA9IHhyICogd3BbLTYgKiAxOCArIDddOworICAgICAgICB4ciA9IGFbMjVdIC0gYVs1XTsKKyAgICAgICAgYVs1XSArPSBhWzI1XTsKKyAgICAgICAgYVsyNV0gPSB4ciAqIHdwWy02ICogMTggKyA3XTsKKworICAgICAgICB4ciA9IGFbMjJdIC0gYVs2XTsKKyAgICAgICAgYVs2XSArPSBhWzIyXTsKKyAgICAgICAgYVsyMl0gPSB4ciAqIFNRUlQyOworICAgICAgICB4ciA9IGFbMjNdIC0gYVs3XTsKKyAgICAgICAgYVs3XSArPSBhWzIzXTsKKyAgICAgICAgYVsyM10gPSB4ciAqIFNRUlQyIC0gYVs3XTsKKyAgICAgICAgYVs3XSAtPSBhWzZdOworICAgICAgICBhWzIyXSAtPSBhWzddOworICAgICAgICBhWzIzXSAtPSBhWzIyXTsKKworICAgICAgICB4ciA9IGFbNl07CisgICAgICAgIGFbNl0gPSBhWzMxXSAtIHhyOworICAgICAgICBhWzMxXSA9IGFbMzFdICsgeHI7CisgICAgICAgIHhyID0gYVs3XTsKKyAgICAgICAgYVs3XSA9IGFbMzBdIC0geHI7CisgICAgICAgIGFbMzBdID0gYVszMF0gKyB4cjsKKyAgICAgICAgeHIgPSBhWzIyXTsKKyAgICAgICAgYVsyMl0gPSBhWzE1XSAtIHhyOworICAgICAgICBhWzE1XSA9IGFbMTVdICsgeHI7CisgICAgICAgIHhyID0gYVsyM107CisgICAgICAgIGFbMjNdID0gYVsxNF0gLSB4cjsKKyAgICAgICAgYVsxNF0gPSBhWzE0XSArIHhyOworCisgICAgICAgIHhyID0gYVsyMF0gLSBhWzhdOworICAgICAgICBhWzhdICs9IGFbMjBdOworICAgICAgICBhWzIwXSA9IHhyICogd3BbLTEwICogMTggKyA3XTsKKyAgICAgICAgeHIgPSBhWzIxXSAtIGFbOV07CisgICAgICAgIGFbOV0gKz0gYVsyMV07CisgICAgICAgIGFbMjFdID0geHIgKiB3cFstMTAgKiAxOCArIDddOworCisgICAgICAgIHhyID0gYVsxOF0gLSBhWzEwXTsKKyAgICAgICAgYVsxMF0gKz0gYVsxOF07CisgICAgICAgIGFbMThdID0geHIgKiB3cFstMTIgKiAxOCArIDddOworICAgICAgICB4ciA9IGFbMTldIC0gYVsxMV07CisgICAgICAgIGFbMTFdICs9IGFbMTldOworICAgICAgICBhWzE5XSA9IHhyICogd3BbLTEyICogMTggKyA3XTsKKworICAgICAgICB4ciA9IGFbMTZdIC0gYVsxMl07CisgICAgICAgIGFbMTJdICs9IGFbMTZdOworICAgICAgICBhWzE2XSA9IHhyICogd3BbLTE0ICogMTggKyA3XTsKKyAgICAgICAgeHIgPSBhWzE3XSAtIGFbMTNdOworICAgICAgICBhWzEzXSArPSBhWzE3XTsKKyAgICAgICAgYVsxN10gPSB4ciAqIHdwWy0xNCAqIDE4ICsgN107CisKKyAgICAgICAgeHIgPSAtYVsyMF0gKyBhWzI0XTsKKyAgICAgICAgYVsyMF0gKz0gYVsyNF07CisgICAgICAgIGFbMjRdID0geHIgKiB3cFstMTIgKiAxOCArIDddOworICAgICAgICB4ciA9IC1hWzIxXSArIGFbMjVdOworICAgICAgICBhWzIxXSArPSBhWzI1XTsKKyAgICAgICAgYVsyNV0gPSB4ciAqIHdwWy0xMiAqIDE4ICsgN107CisKKyAgICAgICAgeHIgPSBhWzRdIC0gYVs4XTsKKyAgICAgICAgYVs0XSArPSBhWzhdOworICAgICAgICBhWzhdID0geHIgKiB3cFstMTIgKiAxOCArIDddOworICAgICAgICB4ciA9IGFbNV0gLSBhWzldOworICAgICAgICBhWzVdICs9IGFbOV07CisgICAgICAgIGFbOV0gPSB4ciAqIHdwWy0xMiAqIDE4ICsgN107CisKKyAgICAgICAgeHIgPSBhWzBdIC0gYVsxMl07CisgICAgICAgIGFbMF0gKz0gYVsxMl07CisgICAgICAgIGFbMTJdID0geHIgKiB3cFstNCAqIDE4ICsgN107CisgICAgICAgIHhyID0gYVsxXSAtIGFbMTNdOworICAgICAgICBhWzFdICs9IGFbMTNdOworICAgICAgICBhWzEzXSA9IHhyICogd3BbLTQgKiAxOCArIDddOworICAgICAgICB4ciA9IGFbMTZdIC0gYVsyOF07CisgICAgICAgIGFbMTZdICs9IGFbMjhdOworICAgICAgICBhWzI4XSA9IHhyICogd3BbLTQgKiAxOCArIDddOworICAgICAgICB4ciA9IC1hWzE3XSArIGFbMjldOworICAgICAgICBhWzE3XSArPSBhWzI5XTsKKyAgICAgICAgYVsyOV0gPSB4ciAqIHdwWy00ICogMTggKyA3XTsKKworICAgICAgICB4ciA9IFNRUlQyICogKGFbMl0gLSBhWzEwXSk7CisgICAgICAgIGFbMl0gKz0gYVsxMF07CisgICAgICAgIGFbMTBdID0geHI7CisgICAgICAgIHhyID0gU1FSVDIgKiAoYVszXSAtIGFbMTFdKTsKKyAgICAgICAgYVszXSArPSBhWzExXTsKKyAgICAgICAgYVsxMV0gPSB4cjsKKyAgICAgICAgeHIgPSBTUVJUMiAqICgtYVsxOF0gKyBhWzI2XSk7CisgICAgICAgIGFbMThdICs9IGFbMjZdOworICAgICAgICBhWzI2XSA9IHhyIC0gYVsxOF07CisgICAgICAgIHhyID0gU1FSVDIgKiAoLWFbMTldICsgYVsyN10pOworICAgICAgICBhWzE5XSArPSBhWzI3XTsKKyAgICAgICAgYVsyN10gPSB4ciAtIGFbMTldOworCisgICAgICAgIHhyID0gYVsyXTsKKyAgICAgICAgYVsxOV0gLT0gYVszXTsKKyAgICAgICAgYVszXSAtPSB4cjsKKyAgICAgICAgYVsyXSA9IGFbMzFdIC0geHI7CisgICAgICAgIGFbMzFdICs9IHhyOworICAgICAgICB4ciA9IGFbM107CisgICAgICAgIGFbMTFdIC09IGFbMTldOworICAgICAgICBhWzE4XSAtPSB4cjsKKyAgICAgICAgYVszXSA9IGFbMzBdIC0geHI7CisgICAgICAgIGFbMzBdICs9IHhyOworICAgICAgICB4ciA9IGFbMThdOworICAgICAgICBhWzI3XSAtPSBhWzExXTsKKyAgICAgICAgYVsxOV0gLT0geHI7CisgICAgICAgIGFbMThdID0gYVsxNV0gLSB4cjsKKyAgICAgICAgYVsxNV0gKz0geHI7CisKKyAgICAgICAgeHIgPSBhWzE5XTsKKyAgICAgICAgYVsxMF0gLT0geHI7CisgICAgICAgIGFbMTldID0gYVsxNF0gLSB4cjsKKyAgICAgICAgYVsxNF0gKz0geHI7CisgICAgICAgIHhyID0gYVsxMF07CisgICAgICAgIGFbMTFdIC09IHhyOworICAgICAgICBhWzEwXSA9IGFbMjNdIC0geHI7CisgICAgICAgIGFbMjNdICs9IHhyOworICAgICAgICB4ciA9IGFbMTFdOworICAgICAgICBhWzI2XSAtPSB4cjsKKyAgICAgICAgYVsxMV0gPSBhWzIyXSAtIHhyOworICAgICAgICBhWzIyXSArPSB4cjsKKyAgICAgICAgeHIgPSBhWzI2XTsKKyAgICAgICAgYVsyN10gLT0geHI7CisgICAgICAgIGFbMjZdID0gYVs3XSAtIHhyOworICAgICAgICBhWzddICs9IHhyOworCisgICAgICAgIHhyID0gYVsyN107CisgICAgICAgIGFbMjddID0gYVs2XSAtIHhyOworICAgICAgICBhWzZdICs9IHhyOworCisgICAgICAgIHhyID0gU1FSVDIgKiAoYVswXSAtIGFbNF0pOworICAgICAgICBhWzBdICs9IGFbNF07CisgICAgICAgIGFbNF0gPSB4cjsKKyAgICAgICAgeHIgPSBTUVJUMiAqIChhWzFdIC0gYVs1XSk7CisgICAgICAgIGFbMV0gKz0gYVs1XTsKKyAgICAgICAgYVs1XSA9IHhyOworICAgICAgICB4ciA9IFNRUlQyICogKGFbMTZdIC0gYVsyMF0pOworICAgICAgICBhWzE2XSArPSBhWzIwXTsKKyAgICAgICAgYVsyMF0gPSB4cjsKKyAgICAgICAgeHIgPSBTUVJUMiAqIChhWzE3XSAtIGFbMjFdKTsKKyAgICAgICAgYVsxN10gKz0gYVsyMV07CisgICAgICAgIGFbMjFdID0geHI7CisKKyAgICAgICAgeHIgPSAtU1FSVDIgKiAoYVs4XSAtIGFbMTJdKTsKKyAgICAgICAgYVs4XSArPSBhWzEyXTsKKyAgICAgICAgYVsxMl0gPSB4ciAtIGFbOF07CisgICAgICAgIHhyID0gLVNRUlQyICogKGFbOV0gLSBhWzEzXSk7CisgICAgICAgIGFbOV0gKz0gYVsxM107CisgICAgICAgIGFbMTNdID0geHIgLSBhWzldOworICAgICAgICB4ciA9IC1TUVJUMiAqIChhWzI1XSAtIGFbMjldKTsKKyAgICAgICAgYVsyNV0gKz0gYVsyOV07CisgICAgICAgIGFbMjldID0geHIgLSBhWzI1XTsKKyAgICAgICAgeHIgPSAtU1FSVDIgKiAoYVsyNF0gKyBhWzI4XSk7CisgICAgICAgIGFbMjRdIC09IGFbMjhdOworICAgICAgICBhWzI4XSA9IHhyIC0gYVsyNF07CisKKyAgICAgICAgeHIgPSBhWzI0XSAtIGFbMTZdOworICAgICAgICBhWzI0XSA9IHhyOworICAgICAgICB4ciA9IGFbMjBdIC0geHI7CisgICAgICAgIGFbMjBdID0geHI7CisgICAgICAgIHhyID0gYVsyOF0gLSB4cjsKKyAgICAgICAgYVsyOF0gPSB4cjsKKworICAgICAgICB4ciA9IGFbMjVdIC0gYVsxN107CisgICAgICAgIGFbMjVdID0geHI7CisgICAgICAgIHhyID0gYVsyMV0gLSB4cjsKKyAgICAgICAgYVsyMV0gPSB4cjsKKyAgICAgICAgeHIgPSBhWzI5XSAtIHhyOworICAgICAgICBhWzI5XSA9IHhyOworCisgICAgICAgIHhyID0gYVsxN10gLSBhWzFdOworICAgICAgICBhWzE3XSA9IHhyOworICAgICAgICB4ciA9IGFbOV0gLSB4cjsKKyAgICAgICAgYVs5XSA9IHhyOworICAgICAgICB4ciA9IGFbMjVdIC0geHI7CisgICAgICAgIGFbMjVdID0geHI7CisgICAgICAgIHhyID0gYVs1XSAtIHhyOworICAgICAgICBhWzVdID0geHI7CisgICAgICAgIHhyID0gYVsyMV0gLSB4cjsKKyAgICAgICAgYVsyMV0gPSB4cjsKKyAgICAgICAgeHIgPSBhWzEzXSAtIHhyOworICAgICAgICBhWzEzXSA9IHhyOworICAgICAgICB4ciA9IGFbMjldIC0geHI7CisgICAgICAgIGFbMjldID0geHI7CisKKyAgICAgICAgeHIgPSBhWzFdIC0gYVswXTsKKyAgICAgICAgYVsxXSA9IHhyOworICAgICAgICB4ciA9IGFbMTZdIC0geHI7CisgICAgICAgIGFbMTZdID0geHI7CisgICAgICAgIHhyID0gYVsxN10gLSB4cjsKKyAgICAgICAgYVsxN10gPSB4cjsKKyAgICAgICAgeHIgPSBhWzhdIC0geHI7CisgICAgICAgIGFbOF0gPSB4cjsKKyAgICAgICAgeHIgPSBhWzldIC0geHI7CisgICAgICAgIGFbOV0gPSB4cjsKKyAgICAgICAgeHIgPSBhWzI0XSAtIHhyOworICAgICAgICBhWzI0XSA9IHhyOworICAgICAgICB4ciA9IGFbMjVdIC0geHI7CisgICAgICAgIGFbMjVdID0geHI7CisgICAgICAgIHhyID0gYVs0XSAtIHhyOworICAgICAgICBhWzRdID0geHI7CisgICAgICAgIHhyID0gYVs1XSAtIHhyOworICAgICAgICBhWzVdID0geHI7CisgICAgICAgIHhyID0gYVsyMF0gLSB4cjsKKyAgICAgICAgYVsyMF0gPSB4cjsKKyAgICAgICAgeHIgPSBhWzIxXSAtIHhyOworICAgICAgICBhWzIxXSA9IHhyOworICAgICAgICB4ciA9IGFbMTJdIC0geHI7CisgICAgICAgIGFbMTJdID0geHI7CisgICAgICAgIHhyID0gYVsxM10gLSB4cjsKKyAgICAgICAgYVsxM10gPSB4cjsKKyAgICAgICAgeHIgPSBhWzI4XSAtIHhyOworICAgICAgICBhWzI4XSA9IHhyOworICAgICAgICB4ciA9IGFbMjldIC0geHI7CisgICAgICAgIGFbMjldID0geHI7CisKKyAgICAgICAgeHIgPSBhWzBdOworICAgICAgICBhWzBdICs9IGFbMzFdOworICAgICAgICBhWzMxXSAtPSB4cjsKKyAgICAgICAgeHIgPSBhWzFdOworICAgICAgICBhWzFdICs9IGFbMzBdOworICAgICAgICBhWzMwXSAtPSB4cjsKKyAgICAgICAgeHIgPSBhWzE2XTsKKyAgICAgICAgYVsxNl0gKz0gYVsxNV07CisgICAgICAgIGFbMTVdIC09IHhyOworICAgICAgICB4ciA9IGFbMTddOworICAgICAgICBhWzE3XSArPSBhWzE0XTsKKyAgICAgICAgYVsxNF0gLT0geHI7CisgICAgICAgIHhyID0gYVs4XTsKKyAgICAgICAgYVs4XSArPSBhWzIzXTsKKyAgICAgICAgYVsyM10gLT0geHI7CisgICAgICAgIHhyID0gYVs5XTsKKyAgICAgICAgYVs5XSArPSBhWzIyXTsKKyAgICAgICAgYVsyMl0gLT0geHI7CisgICAgICAgIHhyID0gYVsyNF07CisgICAgICAgIGFbMjRdICs9IGFbN107CisgICAgICAgIGFbN10gLT0geHI7CisgICAgICAgIHhyID0gYVsyNV07CisgICAgICAgIGFbMjVdICs9IGFbNl07CisgICAgICAgIGFbNl0gLT0geHI7CisgICAgICAgIHhyID0gYVs0XTsKKyAgICAgICAgYVs0XSArPSBhWzI3XTsKKyAgICAgICAgYVsyN10gLT0geHI7CisgICAgICAgIHhyID0gYVs1XTsKKyAgICAgICAgYVs1XSArPSBhWzI2XTsKKyAgICAgICAgYVsyNl0gLT0geHI7CisgICAgICAgIHhyID0gYVsyMF07CisgICAgICAgIGFbMjBdICs9IGFbMTFdOworICAgICAgICBhWzExXSAtPSB4cjsKKyAgICAgICAgeHIgPSBhWzIxXTsKKyAgICAgICAgYVsyMV0gKz0gYVsxMF07CisgICAgICAgIGFbMTBdIC09IHhyOworICAgICAgICB4ciA9IGFbMTJdOworICAgICAgICBhWzEyXSArPSBhWzE5XTsKKyAgICAgICAgYVsxOV0gLT0geHI7CisgICAgICAgIHhyID0gYVsxM107CisgICAgICAgIGFbMTNdICs9IGFbMThdOworICAgICAgICBhWzE4XSAtPSB4cjsKKyAgICAgICAgeHIgPSBhWzI4XTsKKyAgICAgICAgYVsyOF0gKz0gYVszXTsKKyAgICAgICAgYVszXSAtPSB4cjsKKyAgICAgICAgeHIgPSBhWzI5XTsKKyAgICAgICAgYVsyOV0gKz0gYVsyXTsKKyAgICAgICAgYVsyXSAtPSB4cjsKKyAgICB9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRnVuY3Rpb246IENhbGN1bGF0aW9uIG9mIHRoZSBNRENUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEluIHRoZSBjYXNlIG9mIGxvbmcgYmxvY2tzICh0eXBlIDAsMSwzKSB0aGVyZSBhcmUgICAgICAgICAgICAgICAqLworLyogICAzNiBjb2VmZmljZW50cyBpbiB0aGUgdGltZSBkb21haW4gYW5kIDE4IGluIHRoZSBmcmVxdWVuY3kgICAgICAgKi8KKy8qICAgZG9tYWluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEluIHRoZSBjYXNlIG9mIHNob3J0IGJsb2NrcyAodHlwZSAyKSB0aGVyZSBhcmUgMyAgICAgICAgICAgICAgICAqLworLyogICB0cmFuc2Zvcm1hdGlvbnMgd2l0aCBzaG9ydCBsZW5ndGguIFRoaXMgbGVhZHMgdG8gMTIgY29lZmZpY2VudHMgKi8KKy8qICAgaW4gdGhlIHRpbWUgYW5kIDYgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4uIEluIHRoaXMgY2FzZSB0aGUgICAgICovCisvKiAgIHJlc3VsdHMgYXJlIHN0b3JlZCBzaWRlIGJ5IHNpZGUgaW4gdGhlIHZlY3RvciBvdXRbXS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTmV3IGxheWVyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW5saW5lIHN0YXRpYyB2b2lkCittZGN0X3Nob3J0KEZMT0FUICogaW5vdXQpCit7CisgICAgaW50ICAgICBsOworICAgIGZvciAobCA9IDA7IGwgPCAzOyBsKyspIHsKKyAgICAgICAgRkxPQVQgICB0YzAsIHRjMSwgdGMyLCB0czAsIHRzMSwgdHMyOworCisgICAgICAgIHRzMCA9IGlub3V0WzIgKiAzXSAqIHdpbltTSE9SVF9UWVBFXVswXSAtIGlub3V0WzUgKiAzXTsKKyAgICAgICAgdGMwID0gaW5vdXRbMCAqIDNdICogd2luW1NIT1JUX1RZUEVdWzJdIC0gaW5vdXRbMyAqIDNdOworICAgICAgICB0YzEgPSB0czAgKyB0YzA7CisgICAgICAgIHRjMiA9IHRzMCAtIHRjMDsKKworICAgICAgICB0czAgPSBpbm91dFs1ICogM10gKiB3aW5bU0hPUlRfVFlQRV1bMF0gKyBpbm91dFsyICogM107CisgICAgICAgIHRjMCA9IGlub3V0WzMgKiAzXSAqIHdpbltTSE9SVF9UWVBFXVsyXSArIGlub3V0WzAgKiAzXTsKKyAgICAgICAgdHMxID0gdHMwICsgdGMwOworICAgICAgICB0czIgPSAtdHMwICsgdGMwOworCisgICAgICAgIHRjMCA9IChpbm91dFsxICogM10gKiB3aW5bU0hPUlRfVFlQRV1bMV0gLSBpbm91dFs0ICogM10pICogMi4wNjk5NzgxMTE5NTMwODllLTExOyAvKiB0cml0YWJfc1sxXSAqLworICAgICAgICB0czAgPSAoaW5vdXRbNCAqIDNdICogd2luW1NIT1JUX1RZUEVdWzFdICsgaW5vdXRbMSAqIDNdKSAqIDIuMDY5OTc4MTExOTUzMDg5ZS0xMTsgLyogdHJpdGFiX3NbMV0gKi8KKworICAgICAgICBpbm91dFszICogMF0gPSB0YzEgKiAxLjkwNzUyNTE5MTczNzI4MGUtMTEgLyogdHJpdGFiX3NbMl0gKi8gICsgdGMwOworICAgICAgICBpbm91dFszICogNV0gPSAtdHMxICogMS45MDc1MjUxOTE3MzcyODBlLTExIC8qIHRyaXRhYl9zWzBdICovICArIHRzMDsKKworICAgICAgICB0YzIgPSB0YzIgKiAwLjg2NjAyNTQwMzc4NDQzODcwNzYxICogMS45MDc1MjUxOTE3MzcyODFlLTExIC8qIHRyaXRhYl9zWzJdICovIDsKKyAgICAgICAgdHMxID0gdHMxICogMC41ICogMS45MDc1MjUxOTE3MzcyODFlLTExICsgdHMwOworICAgICAgICBpbm91dFszICogMV0gPSB0YzIgLSB0czE7CisgICAgICAgIGlub3V0WzMgKiAyXSA9IHRjMiArIHRzMTsKKworICAgICAgICB0YzEgPSB0YzEgKiAwLjUgKiAxLjkwNzUyNTE5MTczNzI4MWUtMTEgLSB0YzA7CisgICAgICAgIHRzMiA9IHRzMiAqIDAuODY2MDI1NDAzNzg0NDM4NzA3NjEgKiAxLjkwNzUyNTE5MTczNzI4MWUtMTEgLyogdHJpdGFiX3NbMF0gKi8gOworICAgICAgICBpbm91dFszICogM10gPSB0YzEgKyB0czI7CisgICAgICAgIGlub3V0WzMgKiA0XSA9IHRjMSAtIHRzMjsKKworICAgICAgICBpbm91dCsrOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyB2b2lkCittZGN0X2xvbmcoRkxPQVQgKiBvdXQsIEZMT0FUIGNvbnN0ICppbikKK3sKKyAgICBGTE9BVCAgIGN0LCBzdDsKKyAgICB7CisgICAgICAgIEZMT0FUICAgdGMxLCB0YzIsIHRjMywgdGM0LCB0czUsIHRzNiwgdHM3LCB0czg7CisgICAgICAgIC8qIDEsMiwgNSw2LCA5LDEwLCAxMywxNCwgMTcgKi8KKyAgICAgICAgdGMxID0gaW5bMTddIC0gaW5bOV07CisgICAgICAgIHRjMyA9IGluWzE1XSAtIGluWzExXTsKKyAgICAgICAgdGM0ID0gaW5bMTRdIC0gaW5bMTJdOworICAgICAgICB0czUgPSBpblswXSArIGluWzhdOworICAgICAgICB0czYgPSBpblsxXSArIGluWzddOworICAgICAgICB0czcgPSBpblsyXSArIGluWzZdOworICAgICAgICB0czggPSBpblszXSArIGluWzVdOworCisgICAgICAgIG91dFsxN10gPSAodHM1ICsgdHM3IC0gdHM4KSAtICh0czYgLSBpbls0XSk7CisgICAgICAgIHN0ID0gKHRzNSArIHRzNyAtIHRzOCkgKiBjeFs3XSArICh0czYgLSBpbls0XSk7CisgICAgICAgIGN0ID0gKHRjMSAtIHRjMyAtIHRjNCkgKiBjeFs2XTsKKyAgICAgICAgb3V0WzVdID0gY3QgKyBzdDsKKyAgICAgICAgb3V0WzZdID0gY3QgLSBzdDsKKworICAgICAgICB0YzIgPSAoaW5bMTZdIC0gaW5bMTBdKSAqIGN4WzZdOworICAgICAgICB0czYgPSB0czYgKiBjeFs3XSArIGluWzRdOworICAgICAgICBjdCA9IHRjMSAqIGN4WzBdICsgdGMyICsgdGMzICogY3hbMV0gKyB0YzQgKiBjeFsyXTsKKyAgICAgICAgc3QgPSAtdHM1ICogY3hbNF0gKyB0czYgLSB0czcgKiBjeFs1XSArIHRzOCAqIGN4WzNdOworICAgICAgICBvdXRbMV0gPSBjdCArIHN0OworICAgICAgICBvdXRbMl0gPSBjdCAtIHN0OworCisgICAgICAgIGN0ID0gdGMxICogY3hbMV0gLSB0YzIgLSB0YzMgKiBjeFsyXSArIHRjNCAqIGN4WzBdOworICAgICAgICBzdCA9IC10czUgKiBjeFs1XSArIHRzNiAtIHRzNyAqIGN4WzNdICsgdHM4ICogY3hbNF07CisgICAgICAgIG91dFs5XSA9IGN0ICsgc3Q7CisgICAgICAgIG91dFsxMF0gPSBjdCAtIHN0OworCisgICAgICAgIGN0ID0gdGMxICogY3hbMl0gLSB0YzIgKyB0YzMgKiBjeFswXSAtIHRjNCAqIGN4WzFdOworICAgICAgICBzdCA9IHRzNSAqIGN4WzNdIC0gdHM2ICsgdHM3ICogY3hbNF0gLSB0czggKiBjeFs1XTsKKyAgICAgICAgb3V0WzEzXSA9IGN0ICsgc3Q7CisgICAgICAgIG91dFsxNF0gPSBjdCAtIHN0OworICAgIH0KKyAgICB7CisgICAgICAgIEZMT0FUICAgdHMxLCB0czIsIHRzMywgdHM0LCB0YzUsIHRjNiwgdGM3LCB0Yzg7CisKKyAgICAgICAgdHMxID0gaW5bOF0gLSBpblswXTsKKyAgICAgICAgdHMzID0gaW5bNl0gLSBpblsyXTsKKyAgICAgICAgdHM0ID0gaW5bNV0gLSBpblszXTsKKyAgICAgICAgdGM1ID0gaW5bMTddICsgaW5bOV07CisgICAgICAgIHRjNiA9IGluWzE2XSArIGluWzEwXTsKKyAgICAgICAgdGM3ID0gaW5bMTVdICsgaW5bMTFdOworICAgICAgICB0YzggPSBpblsxNF0gKyBpblsxMl07CisKKyAgICAgICAgb3V0WzBdID0gKHRjNSArIHRjNyArIHRjOCkgKyAodGM2ICsgaW5bMTNdKTsKKyAgICAgICAgY3QgPSAodGM1ICsgdGM3ICsgdGM4KSAqIGN4WzddIC0gKHRjNiArIGluWzEzXSk7CisgICAgICAgIHN0ID0gKHRzMSAtIHRzMyArIHRzNCkgKiBjeFs2XTsKKyAgICAgICAgb3V0WzExXSA9IGN0ICsgc3Q7CisgICAgICAgIG91dFsxMl0gPSBjdCAtIHN0OworCisgICAgICAgIHRzMiA9IChpbls3XSAtIGluWzFdKSAqIGN4WzZdOworICAgICAgICB0YzYgPSBpblsxM10gLSB0YzYgKiBjeFs3XTsKKyAgICAgICAgY3QgPSB0YzUgKiBjeFszXSAtIHRjNiArIHRjNyAqIGN4WzRdICsgdGM4ICogY3hbNV07CisgICAgICAgIHN0ID0gdHMxICogY3hbMl0gKyB0czIgKyB0czMgKiBjeFswXSArIHRzNCAqIGN4WzFdOworICAgICAgICBvdXRbM10gPSBjdCArIHN0OworICAgICAgICBvdXRbNF0gPSBjdCAtIHN0OworCisgICAgICAgIGN0ID0gLXRjNSAqIGN4WzVdICsgdGM2IC0gdGM3ICogY3hbM10gLSB0YzggKiBjeFs0XTsKKyAgICAgICAgc3QgPSB0czEgKiBjeFsxXSArIHRzMiAtIHRzMyAqIGN4WzJdIC0gdHM0ICogY3hbMF07CisgICAgICAgIG91dFs3XSA9IGN0ICsgc3Q7CisgICAgICAgIG91dFs4XSA9IGN0IC0gc3Q7CisKKyAgICAgICAgY3QgPSAtdGM1ICogY3hbNF0gKyB0YzYgLSB0YzcgKiBjeFs1XSAtIHRjOCAqIGN4WzNdOworICAgICAgICBzdCA9IHRzMSAqIGN4WzBdIC0gdHMyICsgdHMzICogY3hbMV0gLSB0czQgKiBjeFsyXTsKKyAgICAgICAgb3V0WzE1XSA9IGN0ICsgc3Q7CisgICAgICAgIG91dFsxNl0gPSBjdCAtIHN0OworICAgIH0KK30KKworCit2b2lkCittZGN0X3N1YjQ4KGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGNvbnN0IHNhbXBsZV90ICogdzAsIGNvbnN0IHNhbXBsZV90ICogdzEpCit7CisgICAgaW50ICAgICBnciwgaywgY2g7CisgICAgY29uc3Qgc2FtcGxlX3QgKndrOworCisgICAgd2sgPSB3MCArIDI4NjsKKyAgICAvKiB0aGlua2luZyBjYWNoZSBwZXJmb3JtYW5jZSwgY2gtPmdyIGxvb3AgaXMgYmV0dGVyIHRoYW4gZ3ItPmNoIGxvb3AgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgICAgIGludCAgICAgYmFuZDsKKyAgICAgICAgICAgIGdyX2luZm8gKmNvbnN0IGdpID0gJihnZmMtPmwzX3NpZGUudHRbZ3JdW2NoXSk7CisgICAgICAgICAgICBGTE9BVCAgKm1kY3RfZW5jID0gZ2ktPnhyOworICAgICAgICAgICAgRkxPQVQgICpzYW1wID0gZ2ZjLT5zYl9zYW1wbGVbY2hdWzEgLSBncl1bMF07CisKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAxOCAvIDI7IGsrKykgeworICAgICAgICAgICAgICAgIHdpbmRvd19zdWJiYW5kKHdrLCBzYW1wKTsKKyAgICAgICAgICAgICAgICB3aW5kb3dfc3ViYmFuZCh3ayArIDMyLCBzYW1wICsgMzIpOworICAgICAgICAgICAgICAgIHNhbXAgKz0gNjQ7CisgICAgICAgICAgICAgICAgd2sgKz0gNjQ7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDb21wZW5zYXRlIGZvciBpbnZlcnNpb24gaW4gdGhlIGFuYWx5c2lzIGZpbHRlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGZvciAoYmFuZCA9IDE7IGJhbmQgPCAzMjsgYmFuZCArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHNhbXBbYmFuZCAtIDMyXSAqPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBQZXJmb3JtIGltZGN0IG9mIDE4IHByZXZpb3VzIHN1YmJhbmQgc2FtcGxlcworICAgICAgICAgICAgICogKyAxOCBjdXJyZW50IHN1YmJhbmQgc2FtcGxlcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgMzI7IGJhbmQrKywgbWRjdF9lbmMgKz0gMTgpIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIHR5cGUgPSBnaS0+YmxvY2tfdHlwZTsKKyAgICAgICAgICAgICAgICBGTE9BVCBjb25zdCAqY29uc3QgYmFuZDAgPSBnZmMtPnNiX3NhbXBsZVtjaF1bZ3JdWzBdICsgb3JkZXJbYmFuZF07CisgICAgICAgICAgICAgICAgRkxPQVQgICpjb25zdCBiYW5kMSA9IGdmYy0+c2Jfc2FtcGxlW2NoXVsxIC0gZ3JdWzBdICsgb3JkZXJbYmFuZF07CisgICAgICAgICAgICAgICAgaWYgKGdpLT5taXhlZF9ibG9ja19mbGFnICYmIGJhbmQgPCAyKQorICAgICAgICAgICAgICAgICAgICB0eXBlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoZ2ZjLT5hbXBfZmlsdGVyW2JhbmRdIDwgMWUtMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1kY3RfZW5jLCAwLCAxOCAqIHNpemVvZihGTE9BVCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdmYy0+YW1wX2ZpbHRlcltiYW5kXSA8IDEuMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE4OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZDFbayAqIDMyXSAqPSBnZmMtPmFtcF9maWx0ZXJbYmFuZF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU0hPUlRfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gLU5TIC8gNDsgayA8IDA7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUIGNvbnN0IHcgPSB3aW5bU0hPUlRfVFlQRV1bayArIDNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3RfZW5jW2sgKiAzICsgOV0gPSBiYW5kMFsoOSArIGspICogMzJdICogdyAtIGJhbmQwWyg4IC0gaykgKiAzMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjdF9lbmNbayAqIDMgKyAxOF0gPSBiYW5kMFsoMTQgLSBrKSAqIDMyXSAqIHcgKyBiYW5kMFsoMTUgKyBrKSAqIDMyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGN0X2VuY1trICogMyArIDEwXSA9IGJhbmQwWygxNSArIGspICogMzJdICogdyAtIGJhbmQwWygxNCAtIGspICogMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3RfZW5jW2sgKiAzICsgMTldID0gYmFuZDFbKDIgLSBrKSAqIDMyXSAqIHcgKyBiYW5kMVsoMyArIGspICogMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3RfZW5jW2sgKiAzICsgMTFdID0gYmFuZDFbKDMgKyBrKSAqIDMyXSAqIHcgLSBiYW5kMVsoMiAtIGspICogMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3RfZW5jW2sgKiAzICsgMjBdID0gYmFuZDFbKDggLSBrKSAqIDMyXSAqIHcgKyBiYW5kMVsoOSArIGspICogMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbWRjdF9zaG9ydChtZGN0X2VuYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCAgIHdvcmtbMThdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gLU5MIC8gNDsgayA8IDA7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUICAgYSwgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gd2luW3R5cGVdW2sgKyAyN10gKiBiYW5kMVsoayArIDkpICogMzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd2luW3R5cGVdW2sgKyAzNl0gKiBiYW5kMVsoOCAtIGspICogMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB3aW5bdHlwZV1bayArIDldICogYmFuZDBbKGsgKyA5KSAqIDMyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHdpblt0eXBlXVtrICsgMThdICogYmFuZDBbKDggLSBrKSAqIDMyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrW2sgKyA5XSA9IGEgLSBiICogdGFudGFiX2xbayArIDldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtbayArIDE4XSA9IGEgKiB0YW50YWJfbFtrICsgOV0gKyBiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBtZGN0X2xvbmcobWRjdF9lbmMsIHdvcmspOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogUGVyZm9ybSBhbGlhc2luZyByZWR1Y3Rpb24gYnV0dGVyZmx5CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gU0hPUlRfVFlQRSAmJiBiYW5kICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyAtLWspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUICAgYnUsIGJkOworICAgICAgICAgICAgICAgICAgICAgICAgYnUgPSBtZGN0X2VuY1trXSAqIGNhW2tdICsgbWRjdF9lbmNbLTEgLSBrXSAqIGNzW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgYmQgPSBtZGN0X2VuY1trXSAqIGNzW2tdIC0gbWRjdF9lbmNbLTEgLSBrXSAqIGNhW2tdOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZGN0X2VuY1stMSAtIGtdID0gYnU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZGN0X2VuY1trXSA9IGJkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdrID0gdzEgKyAyODY7CisgICAgICAgIGlmIChnZmMtPm1vZGVfZ3IgPT0gMSkgeworICAgICAgICAgICAgbWVtY3B5KGdmYy0+c2Jfc2FtcGxlW2NoXVswXSwgZ2ZjLT5zYl9zYW1wbGVbY2hdWzFdLCA1NzYgKiBzaXplb2YoRkxPQVQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvbmV3bWRjdC5oIGIvbGlibXAzbGFtZS9uZXdtZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0OGQzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvbmV3bWRjdC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKglOZXcgTW9kaWZpZWQgRENUIGluY2x1ZGUgZmlsZQorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OSBUYWtlaGlybyBUT01JTkFHQQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBMQU1FX05FV01EQ1RfSAorI2RlZmluZSBMQU1FX05FV01EQ1RfSAorCit2b2lkICAgIG1kY3Rfc3ViNDgobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgY29uc3Qgc2FtcGxlX3QgKiB3MCwgY29uc3Qgc2FtcGxlX3QgKiB3MSk7CisKKyNlbmRpZiAvKiBMQU1FX05FV01EQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9wcmVzZXRzLmMgYi9saWJtcDNsYW1lL3ByZXNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQwZDMzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9wcmVzZXRzLmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBwcmVzZXRzLmMgLS0gQXBwbHkgcHJlc2V0cworICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMi0yMDA4IEdhYnJpZWwgQm91dmlnbmUKKyAqCUNvcHlyaWdodCAoYykgMjAwNy0yMDA4IFJvYmVydCBIZWdlbWFubgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGFtZS5oIgorI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNpbmNsdWRlICJzZXRfZ2V0LmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJsYW1lX2dsb2JhbF9mbGFncy5oIgorCisjZGVmaW5lIFNFVF9PUFRJT04ob3B0LCB2YWwsIGRlZikgaWYgKGVuZm9yY2UpIFwKKyAgICAodm9pZCkgbGFtZV9zZXRfIyNvcHQoZ2ZwLCB2YWwpOyBcCisgICAgZWxzZSBpZiAoIShmYWJzKGxhbWVfZ2V0XyMjb3B0KGdmcCkgLSBkZWYpID4gMCkpIFwKKyAgICAodm9pZCkgbGFtZV9zZXRfIyNvcHQoZ2ZwLCB2YWwpOworCisjdW5kZWYgTWluCisjdW5kZWYgTWF4CisKK3N0YXRpYyBpbmxpbmUgaW50CittaW5faW50KGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAoYSA8IGIpIHsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIHJldHVybiBiOworfQorCitzdGF0aWMgaW5saW5lIGludAorbWF4X2ludChpbnQgYSwgaW50IGIpCit7CisgICAgaWYgKGEgPiBiKSB7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICByZXR1cm4gYjsKK30KKworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgIHZicl9xOworICAgIGludCAgICAgcXVhbnRfY29tcDsKKyAgICBpbnQgICAgIHF1YW50X2NvbXBfczsKKyAgICBpbnQgICAgIGV4cFk7CisgICAgRkxPQVQgICBzdF9scm07ICAgICAgICAgIC8qc2hvcnQgdGhyZXNob2xkICovCisgICAgRkxPQVQgICBzdF9zOworICAgIEZMT0FUICAgbWFza2luZ19hZGo7CisgICAgRkxPQVQgICBtYXNraW5nX2Fkal9zaG9ydDsKKyAgICBGTE9BVCAgIGF0aF9sb3dlcjsKKyAgICBGTE9BVCAgIGF0aF9jdXJ2ZTsKKyAgICBGTE9BVCAgIGF0aF9zZW5zaXRpdml0eTsKKyAgICBGTE9BVCAgIGludGVyY2g7CisgICAgaW50ICAgICBzYWZlam9pbnQ7CisgICAgaW50ICAgICBzZmIyMW1vZDsKKyAgICBGTE9BVCAgIG1zZml4OworfSB2YnJfcHJlc2V0c190OworCisgICAgLyogKklOREVOVC1PRkYqICovCisgICAgCisgICAgLyogU3dpdGNoIG1hcHBpbmdzIGZvciBWQlIgbW9kZSBWQlJfUkggKi8KKyAgICBzdGF0aWMgY29uc3QgdmJyX3ByZXNldHNfdCB2YnJfb2xkX3N3aXRjaF9tYXBbXSA9IHsKKyAgICAvKnZicl9xICBxY29tcF9sICBxY29tcF9zICBleHBZICBzdF9scm0gICBzdF9zICBtYXNrIGFkal9sICBhZGpfcyAgYXRoX2xvd2VyICBhdGhfY3VydmUgIGF0aF9zZW5zICBpbnRlckNoUiAgc2FmZWpvaW50IHNmYjIxbW9kICBtc2ZpeCAqLworICAgICAgICB7MCwgICAgICAgOSwgICAgICAgOSwgICAgMCwgICA1LjIwLCAxMjUuMCwgICAgICAtNC4yLCAgIC02LjMsICAgICAgIDQuOCwgICAgICAgMSwgICAgICAgICAgMCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAyMSwgIDAuOTd9LAorICAgICAgICB7MSwgICAgICAgOSwgICAgICAgOSwgICAgMCwgICA1LjMwLCAxMjUuMCwgICAgICAtMy42LCAgIC01LjYsICAgICAgIDQuNSwgICAgICAgMS41LCAgICAgICAgMCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAyMSwgIDEuMzV9LAorICAgICAgICB7MiwgICAgICAgOSwgICAgICAgOSwgICAgMCwgICA1LjYwLCAxMjUuMCwgICAgICAtMi4yLCAgIC0zLjUsICAgICAgIDIuOCwgICAgICAgMiwgICAgICAgICAgMCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAyMSwgIDEuNDl9LAorICAgICAgICB7MywgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA1LjgwLCAxMzAuMCwgICAgICAtMS44LCAgIC0yLjgsICAgICAgIDIuNiwgICAgICAgMywgICAgICAgICAtNCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAyMCwgIDEuNjR9LAorICAgICAgICB7NCwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA2LjAwLCAxMzUuMCwgICAgICAtMC43LCAgIC0xLjEsICAgICAgIDEuMSwgICAgICAgMy41LCAgICAgICAtOCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAgMCwgIDEuNzl9LAorICAgICAgICB7NSwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA2LjQwLCAxNDAuMCwgICAgICAgMC41LCAgICAwLjQsICAgICAgLTcuNSwgICAgICAgNCwgICAgICAgIC0xMiwgICAwLjAwMDIsICAgICAgICAgMCwgICAgICAgMCwgIDEuOTV9LAorICAgICAgICB7NiwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA2LjYwLCAxNDUuMCwgICAgICAgMC42NywgICAwLjY1LCAgICAtMTQuNywgICAgICAgNi41LCAgICAgIC0xOSwgICAwLjAwMDQsICAgICAgICAgMCwgICAgICAgMCwgIDIuMzB9LAorICAgICAgICB7NywgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA2LjYwLCAxNDUuMCwgICAgICAgMC44LCAgICAwLjc1LCAgICAtMTkuNywgICAgICAgOCwgICAgICAgIC0yMiwgICAwLjAwMDYsICAgICAgICAgMCwgICAgICAgMCwgIDIuNzB9LAorICAgICAgICB7OCwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA2LjYwLCAxNDUuMCwgICAgICAgMS4yLCAgICAxLjE1LCAgICAtMjcuNSwgICAgICAxMCwgICAgICAgIC0yMywgICAwLjAwMDcsICAgICAgICAgMCwgICAgICAgMCwgIDAgICB9LAorICAgICAgICB7OSwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA2LjYwLCAxNDUuMCwgICAgICAgMS42LCAgICAxLjYsICAgICAtMzYsICAgICAgICAxMSwgICAgICAgIC0yNSwgICAwLjAwMDgsICAgICAgICAgMCwgICAgICAgMCwgIDAgICB9LAorICAgICAgICB7MTAsICAgICAgOSwgICAgICAgOSwgICAgMSwgICA2LjYwLCAxNDUuMCwgICAgICAgMi4wLCAgICAyLjAsICAgICAtMzYsICAgICAgICAxMiwgICAgICAgIC0yNSwgICAwLjAwMDgsICAgICAgICAgMCwgICAgICAgMCwgIDAgICB9CisgICAgfTsKKyAgICAKKyAgICBzdGF0aWMgY29uc3QgdmJyX3ByZXNldHNfdCB2YnJfcHN5X3N3aXRjaF9tYXBbXSA9IHsKKyAgICAvKnZicl9xICBxY29tcF9sICBxY29tcF9zICBleHBZICBzdF9scm0gICBzdF9zICBtYXNrIGFkal9sICBhZGpfcyAgYXRoX2xvd2VyICBhdGhfY3VydmUgIGF0aF9zZW5zICBpbnRlckNoUiAgc2FmZWpvaW50IHNmYjIxbW9kICBtc2ZpeCAqLworICAgICAgICB7MCwgICAgICAgOSwgICAgICAgOSwgICAgMCwgICA0LjIwLCAgMjUuMCwgICAgICAtNy4wLCAgIC00LjAsICAgICAgIDcuNSwgICAgICAgMSwgICAgICAgICAgMCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAyNiwgIDAuOTd9LAorICAgICAgICB7MSwgICAgICAgOSwgICAgICAgOSwgICAgMCwgICA0LjIwLCAgMjUuMCwgICAgICAtNS42LCAgIC0zLjYsICAgICAgIDQuNSwgICAgICAgMS41LCAgICAgICAgMCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAyMSwgIDEuMzV9LAorICAgICAgICB7MiwgICAgICAgOSwgICAgICAgOSwgICAgMCwgICA0LjIwLCAgMjUuMCwgICAgICAtNC40LCAgIC0xLjgsICAgICAgIDIsICAgICAgICAgMiwgICAgICAgICAgMCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAxOCwgIDEuNDl9LAorICAgICAgICB7MywgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAtMy40LCAgIC0xLjI1LCAgICAgIDEuMSwgICAgICAgMywgICAgICAgICAtNCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAxNSwgIDEuNjR9LAorICAgICAgICB7NCwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAtMi4yLCAgICAwLjEsICAgICAgIDAsICAgICAgICAgMy41LCAgICAgICAtOCwgICAwLCAgICAgICAgICAgICAgMiwgICAgICAgMCwgIDEuNzl9LAorICAgICAgICB7NSwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAtMS4wLCAgICAxLjY1LCAgICAgLTcuNywgICAgICAgNCwgICAgICAgIC0xMiwgICAwLjAwMDIsICAgICAgICAgMCwgICAgICAgMCwgIDEuOTV9LAorICAgICAgICB7NiwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAtMC4wLCAgICAyLjQ3LCAgICAgLTcuNywgICAgICAgNi41LCAgICAgIC0xOSwgICAwLjAwMDQsICAgICAgICAgMCwgICAgICAgMCwgIDIgICB9LAorICAgICAgICB7NywgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAgMC41LCAgICAyLjAsICAgICAtMTQuNSwgICAgICAgOCwgICAgICAgIC0yMiwgICAwLjAwMDYsICAgICAgICAgMCwgICAgICAgMCwgIDIgICB9LAorICAgICAgICB7OCwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAgMS4wLCAgICAyLjQsICAgICAtMjIuMCwgICAgICAxMCwgICAgICAgIC0yMywgICAwLjAwMDcsICAgICAgICAgMCwgICAgICAgMCwgIDIgICB9LAorICAgICAgICB7OSwgICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAgMS41LCAgICAyLjk1LCAgICAtMzAuMCwgICAgICAxMSwgICAgICAgIC0yNSwgICAwLjAwMDgsICAgICAgICAgMCwgICAgICAgMCwgIDIgICB9LAorICAgICAgICB7MTAsICAgICAgOSwgICAgICAgOSwgICAgMSwgICA0LjIwLCAgMjUuMCwgICAgICAgMi4wLCAgICAyLjk1LCAgICAtMzYuMCwgICAgICAxMiwgICAgICAgIC0zMCwgICAwLjAwMDgsICAgICAgICAgMCwgICAgICAgMCwgIDIgICB9CisgICAgfTsKKyAgICAKKyAgICAvKiAqSU5ERU5ULU9OKiAqLworCisjZGVmaW5lIE5PT1AobSkgKHZvaWQpcC5tCisjZGVmaW5lIExFUlAobSkgcC5tID0gcC5tICsgeCAqIChxLm0gLSBwLm0pCisKK3N0YXRpYyB2b2lkCithcHBseV92YnJfcHJlc2V0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgYSwgaW50IGVuZm9yY2UpCit7CisgICAgdmJyX3ByZXNldHNfdCBjb25zdCAqdmJyX3ByZXNldCA9IGxhbWVfZ2V0X1ZCUihnZnApID09IHZicl9yaCA/ICZ2YnJfb2xkX3N3aXRjaF9tYXBbMF0KKyAgICAgICAgOiAmdmJyX3BzeV9zd2l0Y2hfbWFwWzBdOworICAgIGZsb2F0ICAgeCA9IGdmcC0+VkJSX3FfZnJhYzsKKyAgICB2YnJfcHJlc2V0c190IHAgPSB2YnJfcHJlc2V0W2FdOworICAgIHZicl9wcmVzZXRzX3QgcSA9IHZicl9wcmVzZXRbYSArIDFdOworICAgIHZicl9wcmVzZXRzX3QgY29uc3QgKnNldCA9ICZwOworCisgICAgTk9PUCh2YnJfcSk7CisgICAgTk9PUChxdWFudF9jb21wKTsKKyAgICBOT09QKHF1YW50X2NvbXBfcyk7CisgICAgTk9PUChleHBZKTsKKyAgICBMRVJQKHN0X2xybSk7CisgICAgTEVSUChzdF9zKTsKKyAgICBMRVJQKG1hc2tpbmdfYWRqKTsKKyAgICBMRVJQKG1hc2tpbmdfYWRqX3Nob3J0KTsKKyAgICBMRVJQKGF0aF9sb3dlcik7CisgICAgTEVSUChhdGhfY3VydmUpOworICAgIExFUlAoYXRoX3NlbnNpdGl2aXR5KTsKKyAgICBMRVJQKGludGVyY2gpOworICAgIE5PT1Aoc2FmZWpvaW50KTsKKyAgICBOT09QKHNmYjIxbW9kKTsKKyAgICBMRVJQKG1zZml4KTsKKworICAgICh2b2lkKSBsYW1lX3NldF9WQlJfcShnZnAsIHNldC0+dmJyX3EpOworICAgIFNFVF9PUFRJT04ocXVhbnRfY29tcCwgc2V0LT5xdWFudF9jb21wLCAtMSk7CisgICAgU0VUX09QVElPTihxdWFudF9jb21wX3Nob3J0LCBzZXQtPnF1YW50X2NvbXBfcywgLTEpOworICAgIGlmIChzZXQtPmV4cFkpIHsKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X2V4cGVyaW1lbnRhbFkoZ2ZwLCBzZXQtPmV4cFkpOworICAgIH0KKyAgICBTRVRfT1BUSU9OKHNob3J0X3RocmVzaG9sZF9scm0sIHNldC0+c3RfbHJtLCAtMSk7CisgICAgU0VUX09QVElPTihzaG9ydF90aHJlc2hvbGRfcywgc2V0LT5zdF9zLCAtMSk7CisgICAgU0VUX09QVElPTihtYXNraW5nYWRqdXN0LCBzZXQtPm1hc2tpbmdfYWRqLCAwKTsKKyAgICBTRVRfT1BUSU9OKG1hc2tpbmdhZGp1c3Rfc2hvcnQsIHNldC0+bWFza2luZ19hZGpfc2hvcnQsIDApOworICAgIFNFVF9PUFRJT04oQVRIbG93ZXIsIHNldC0+YXRoX2xvd2VyLCAwKTsKKyAgICBTRVRfT1BUSU9OKEFUSGN1cnZlLCBzZXQtPmF0aF9jdXJ2ZSwgLTEpOworICAgIFNFVF9PUFRJT04oYXRoYWFfc2Vuc2l0aXZpdHksIHNldC0+YXRoX3NlbnNpdGl2aXR5LCAwKTsKKyAgICBpZiAoc2V0LT5pbnRlcmNoID4gMCkgeworICAgICAgICBTRVRfT1BUSU9OKGludGVyQ2hSYXRpbywgc2V0LT5pbnRlcmNoLCAtMSk7CisgICAgfQorCisgICAgLyogcGFyYW1ldGVycyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gcHJvcGVyIHNldC9nZXQgaW50ZXJmYWNlICovCisgICAgaWYgKHNldC0+c2FmZWpvaW50ID4gMCkgeworICAgICAgICAodm9pZCkgbGFtZV9zZXRfZXhwX25zcHN5dHVuZShnZnAsIGxhbWVfZ2V0X2V4cF9uc3BzeXR1bmUoZ2ZwKSB8IHNldC0+c2FmZWpvaW50KTsKKyAgICB9CisgICAgaWYgKHNldC0+c2ZiMjFtb2QgPiAwKSB7CisgICAgICAgICh2b2lkKSBsYW1lX3NldF9leHBfbnNwc3l0dW5lKGdmcCwgbGFtZV9nZXRfZXhwX25zcHN5dHVuZShnZnApIHwgKHNldC0+c2ZiMjFtb2QgPDwgMjApKTsKKyAgICB9CisgICAgU0VUX09QVElPTihtc2ZpeCwgc2V0LT5tc2ZpeCwgLTEpOworCisgICAgaWYgKGVuZm9yY2UgPT0gMCkgeworICAgICAgICBnZnAtPlZCUl9xID0gYTsKKyAgICAgICAgZ2ZwLT5WQlJfcV9mcmFjID0geDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2FwcGx5X2Ficl9wcmVzZXQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBwcmVzZXQsIGludCBlbmZvcmNlKQoreworICAgIGludCAgICAgazsKKworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50ICAgICBhYnJfa2JwczsKKyAgICAgICAgaW50ICAgICBxdWFudF9jb21wOworICAgICAgICBpbnQgICAgIHF1YW50X2NvbXBfczsKKyAgICAgICAgaW50ICAgICBzYWZlam9pbnQ7CisgICAgICAgIEZMT0FUICAgbnNtc2ZpeDsKKyAgICAgICAgRkxPQVQgICBzdF9scm07ICAgICAgLypzaG9ydCB0aHJlc2hvbGQgKi8KKyAgICAgICAgRkxPQVQgICBzdF9zOworICAgICAgICBGTE9BVCAgIG5zYmFzczsKKyAgICAgICAgRkxPQVQgICBzY2FsZTsKKyAgICAgICAgRkxPQVQgICBtYXNraW5nX2FkajsKKyAgICAgICAgRkxPQVQgICBhdGhfbG93ZXI7CisgICAgICAgIEZMT0FUICAgYXRoX2N1cnZlOworICAgICAgICBGTE9BVCAgIGludGVyY2g7CisgICAgICAgIGludCAgICAgc2ZzY2FsZTsKKyAgICB9IGFicl9wcmVzZXRzX3Q7CisKKworICAgIC8qICpJTkRFTlQtT0ZGKiAqLworCisgICAgLyogCisgICAgICogIFN3aXRjaCBtYXBwaW5ncyBmb3IgQUJSIG1vZGUKKyAgICAgKi8KKyAgICBjb25zdCBhYnJfcHJlc2V0c190IGFicl9zd2l0Y2hfbWFwW10gPSB7ICAgICAgICAKKyAgICAvKiBrYnBzICBxdWFudCBxX3Mgc2FmZWpvaW50IG5zbXNmaXggc3RfbHJtICBzdF9zICBucy1iYXNzIHNjYWxlICAgbXNrIGF0aF9sd3IgYXRoX2N1cnZlICBpbnRlcmNoICwgc2ZzY2FsZSAqLworICAgICAgeyAgOCwgICAgIDksICA5LCAgICAgICAgMCwgICAgICAwLCAgNi42MCwgIDE0NSwgICAgICAgMCwgMC45NSwgICAgMCwgIC0zMC4wLCAgICAgMTEsICAgIDAuMDAxMiwgICAgICAgIDF9LCAvKiAgIDgsIGltcG9zc2libGUgdG8gdXNlIGluIHN0ZXJlbyAqLworICAgICAgeyAxNiwgICAgIDksICA5LCAgICAgICAgMCwgICAgICAwLCAgNi42MCwgIDE0NSwgICAgICAgMCwgMC45NSwgICAgMCwgIC0yNS4wLCAgICAgMTEsICAgIDAuMDAxMCwgICAgICAgIDF9LCAvKiAgMTYgKi8KKyAgICAgIHsgMjQsICAgICA5LCAgOSwgICAgICAgIDAsICAgICAgMCwgIDYuNjAsICAxNDUsICAgICAgIDAsIDAuOTUsICAgIDAsICAtMjAuMCwgICAgIDExLCAgICAwLjAwMTAsICAgICAgICAxfSwgLyogIDI0ICovCisgICAgICB7IDMyLCAgICAgOSwgIDksICAgICAgICAwLCAgICAgIDAsICA2LjYwLCAgMTQ1LCAgICAgICAwLCAwLjk1LCAgICAwLCAgLTE1LjAsICAgICAxMSwgICAgMC4wMDEwLCAgICAgICAgMX0sIC8qICAzMiAqLworICAgICAgeyA0MCwgICAgIDksICA5LCAgICAgICAgMCwgICAgICAwLCAgNi42MCwgIDE0NSwgICAgICAgMCwgMC45NSwgICAgMCwgIC0xMC4wLCAgICAgMTEsICAgIDAuMDAwOSwgICAgICAgIDF9LCAvKiAgNDAgKi8KKyAgICAgIHsgNDgsICAgICA5LCAgOSwgICAgICAgIDAsICAgICAgMCwgIDYuNjAsICAxNDUsICAgICAgIDAsIDAuOTUsICAgIDAsICAtMTAuMCwgICAgIDExLCAgICAwLjAwMDksICAgICAgICAxfSwgLyogIDQ4ICovCisgICAgICB7IDU2LCAgICAgOSwgIDksICAgICAgICAwLCAgICAgIDAsICA2LjYwLCAgMTQ1LCAgICAgICAwLCAwLjk1LCAgICAwLCAgIC02LjAsICAgICAxMSwgICAgMC4wMDA4LCAgICAgICAgMX0sIC8qICA1NiAqLworICAgICAgeyA2NCwgICAgIDksICA5LCAgICAgICAgMCwgICAgICAwLCAgNi42MCwgIDE0NSwgICAgICAgMCwgMC45NSwgICAgMCwgICAtMi4wLCAgICAgMTEsICAgIDAuMDAwOCwgICAgICAgIDF9LCAvKiAgNjQgKi8KKyAgICAgIHsgODAsICAgICA5LCAgOSwgICAgICAgIDAsICAgICAgMCwgIDYuNjAsICAxNDUsICAgICAgIDAsIDAuOTUsICAgIDAsICAgICAuMCwgICAgICA4LCAgICAwLjAwMDcsICAgICAgICAxfSwgLyogIDgwICovCisgICAgICB7IDk2LCAgICAgOSwgIDksICAgICAgICAwLCAgIDIuNTAsICA2LjYwLCAgMTQ1LCAgICAgICAwLCAwLjk1LCAgICAwLCAgICAxLjAsICAgICAgNS41LCAgMC4wMDA2LCAgICAgICAgMX0sIC8qICA5NiAqLworICAgICAgezExMiwgICAgIDksICA5LCAgICAgICAgMCwgICAyLjI1LCAgNi42MCwgIDE0NSwgICAgICAgMCwgMC45NSwgICAgMCwgICAgMi4wLCAgICAgIDQuNSwgIDAuMDAwNSwgICAgICAgIDF9LCAvKiAxMTIgKi8KKyAgICAgIHsxMjgsICAgICA5LCAgOSwgICAgICAgIDAsICAgMS45NSwgIDYuNDAsICAxNDAsICAgICAgIDAsIDAuOTUsICAgIDAsICAgIDMuMCwgICAgICA0LCAgICAwLjAwMDIsICAgICAgICAxfSwgLyogMTI4ICovCisgICAgICB7MTYwLCAgICAgOSwgIDksICAgICAgICAxLCAgIDEuNzksICA2LjAwLCAgMTM1LCAgICAgICAwLCAwLjk1LCAgIC0yLCAgICA1LjAsICAgICAgMy41LCAgMCwgICAgICAgICAgICAgMX0sIC8qIDE2MCAqLworICAgICAgezE5MiwgICAgIDksICA5LCAgICAgICAgMSwgICAxLjQ5LCAgNS42MCwgIDEyNSwgICAgICAgMCwgMC45NywgICAtNCwgICAgNy4wLCAgICAgIDMsICAgIDAsICAgICAgICAgICAgIDB9LCAvKiAxOTIgKi8KKyAgICAgIHsyMjQsICAgICA5LCAgOSwgICAgICAgIDEsICAgMS4yNSwgIDUuMjAsICAxMjUsICAgICAgIDAsIDAuOTgsICAgLTYsICAgIDkuMCwgICAgICAyLCAgICAwLCAgICAgICAgICAgICAwfSwgLyogMjI0ICovCisgICAgICB7MjU2LCAgICAgOSwgIDksICAgICAgICAxLCAgIDAuOTcsICA1LjIwLCAgMTI1LCAgICAgICAwLCAxLjAwLCAgIC04LCAgIDEwLjAsICAgICAgMSwgICAgMCwgICAgICAgICAgICAgMH0sIC8qIDI1NiAqLworICAgICAgezMyMCwgICAgIDksICA5LCAgICAgICAgMSwgICAwLjkwLCAgNS4yMCwgIDEyNSwgICAgICAgMCwgMS4wMCwgIC0xMCwgICAxMi4wLCAgICAgIDAsICAgIDAsICAgICAgICAgICAgIDB9ICAvKiAzMjAgKi8KKyAgICB9OworCisgICAgLyogKklOREVOVC1PTiogKi8KKworICAgIC8qIFZhcmlhYmxlcyBmb3IgdGhlIEFCUiBzdHVmZiAqLworICAgIGludCAgICAgcjsKKyAgICBpbnQgICAgIGFjdHVhbF9iaXRyYXRlID0gcHJlc2V0OworCisgICAgciA9IG5lYXJlc3RCaXRyYXRlRnVsbEluZGV4KHByZXNldCk7CisKKworICAgICh2b2lkKSBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfYWJyKTsKKyAgICAodm9pZCkgbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCwgKGFjdHVhbF9iaXRyYXRlKSk7CisgICAgKHZvaWQpIGxhbWVfc2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyhnZnAsIG1pbl9pbnQobGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCksIDMyMCkpOworICAgICh2b2lkKSBsYW1lX3NldF9WQlJfbWVhbl9iaXRyYXRlX2ticHMoZ2ZwLCBtYXhfaW50KGxhbWVfZ2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyhnZnApLCA4KSk7CisgICAgKHZvaWQpIGxhbWVfc2V0X2JyYXRlKGdmcCwgbGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGdmcCkpOworCisKKyAgICAvKiBwYXJhbWV0ZXJzIGZvciB3aGljaCB0aGVyZSBpcyBubyBwcm9wZXIgc2V0L2dldCBpbnRlcmZhY2UgKi8KKyAgICBpZiAoYWJyX3N3aXRjaF9tYXBbcl0uc2FmZWpvaW50ID4gMCkKKyAgICAgICAgKHZvaWQpIGxhbWVfc2V0X2V4cF9uc3BzeXR1bmUoZ2ZwLCBsYW1lX2dldF9leHBfbnNwc3l0dW5lKGdmcCkgfCAyKTsgLyogc2FmZWpvaW50ICovCisKKyAgICBpZiAoYWJyX3N3aXRjaF9tYXBbcl0uc2ZzY2FsZSA+IDApCisgICAgICAgICh2b2lkKSBsYW1lX3NldF9zZnNjYWxlKGdmcCwgMSk7CisKKyAgICAvKiBucy1iYXNzIHR3ZWFrcyAqLworICAgIGlmIChmYWJzKGFicl9zd2l0Y2hfbWFwW3JdLm5zYmFzcykgPiAwKSB7CisgICAgICAgIGsgPSAoaW50KSAoYWJyX3N3aXRjaF9tYXBbcl0ubnNiYXNzICogNCk7CisgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgIGsgKz0gNjQ7CisgICAgICAgICh2b2lkKSBsYW1lX3NldF9leHBfbnNwc3l0dW5lKGdmcCwgbGFtZV9nZXRfZXhwX25zcHN5dHVuZShnZnApIHwgKGsgPDwgMikpOworICAgIH0KKworCisKKworICAgIFNFVF9PUFRJT04ocXVhbnRfY29tcCwgYWJyX3N3aXRjaF9tYXBbcl0ucXVhbnRfY29tcCwgLTEpOworICAgIFNFVF9PUFRJT04ocXVhbnRfY29tcF9zaG9ydCwgYWJyX3N3aXRjaF9tYXBbcl0ucXVhbnRfY29tcF9zLCAtMSk7CisKKyAgICBTRVRfT1BUSU9OKG1zZml4LCBhYnJfc3dpdGNoX21hcFtyXS5uc21zZml4LCAtMSk7CisKKyAgICBTRVRfT1BUSU9OKHNob3J0X3RocmVzaG9sZF9scm0sIGFicl9zd2l0Y2hfbWFwW3JdLnN0X2xybSwgLTEpOworICAgIFNFVF9PUFRJT04oc2hvcnRfdGhyZXNob2xkX3MsIGFicl9zd2l0Y2hfbWFwW3JdLnN0X3MsIC0xKTsKKworICAgIC8qIEFCUiBzZWVtcyB0byBoYXZlIGJpZyBwcm9ibGVtcyB3aXRoIGNsaXBwaW5nLCBlc3BlY2lhbGx5IGF0IGxvdyBiaXRyYXRlcyAqLworICAgIC8qIHNvIHdlIGNvbXBlbnNhdGUgZm9yIHRoYXQgaGVyZSBieSB1c2luZyBhIHNjYWxlIHZhbHVlIGRlcGVuZGluZyBvbiBiaXRyYXRlICovCisgICAgU0VUX09QVElPTihzY2FsZSwgYWJyX3N3aXRjaF9tYXBbcl0uc2NhbGUsIC0xKTsKKworICAgIFNFVF9PUFRJT04obWFza2luZ2FkanVzdCwgYWJyX3N3aXRjaF9tYXBbcl0ubWFza2luZ19hZGosIDApOworICAgIGlmIChhYnJfc3dpdGNoX21hcFtyXS5tYXNraW5nX2FkaiA+IDApIHsKKyAgICAgICAgU0VUX09QVElPTihtYXNraW5nYWRqdXN0X3Nob3J0LCBhYnJfc3dpdGNoX21hcFtyXS5tYXNraW5nX2FkaiAqIC45LCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFNFVF9PUFRJT04obWFza2luZ2FkanVzdF9zaG9ydCwgYWJyX3N3aXRjaF9tYXBbcl0ubWFza2luZ19hZGogKiAxLjEsIDApOworICAgIH0KKworCisgICAgU0VUX09QVElPTihBVEhsb3dlciwgYWJyX3N3aXRjaF9tYXBbcl0uYXRoX2xvd2VyLCAwKTsKKyAgICBTRVRfT1BUSU9OKEFUSGN1cnZlLCBhYnJfc3dpdGNoX21hcFtyXS5hdGhfY3VydmUsIC0xKTsKKworICAgIFNFVF9PUFRJT04oaW50ZXJDaFJhdGlvLCBhYnJfc3dpdGNoX21hcFtyXS5pbnRlcmNoLCAtMSk7CisKKworICAgIHJldHVybiBwcmVzZXQ7Cit9CisKKworCitpbnQKK2FwcGx5X3ByZXNldChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHByZXNldCwgaW50IGVuZm9yY2UpCit7CisgICAgLyp0cmFuc2xhdGUgbGVnYWN5IHByZXNldHMgKi8KKyAgICBzd2l0Y2ggKHByZXNldCkgeworICAgIGNhc2UgUjNNSVg6CisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXNldCA9IFYzOworICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X1ZCUihnZnAsIHZicl9tdHJoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBNRURJVU06CisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXNldCA9IFY0OworICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X1ZCUihnZnAsIHZicl9yaCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgTUVESVVNX0ZBU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXNldCA9IFY0OworICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X1ZCUihnZnAsIHZicl9tdHJoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBTVEFOREFSRDoKKyAgICAgICAgeworICAgICAgICAgICAgcHJlc2V0ID0gVjI7CisgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfVkJSKGdmcCwgdmJyX3JoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBTVEFOREFSRF9GQVNUOgorICAgICAgICB7CisgICAgICAgICAgICBwcmVzZXQgPSBWMjsKKyAgICAgICAgICAgICh2b2lkKSBsYW1lX3NldF9WQlIoZ2ZwLCB2YnJfbXRyaCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgRVhUUkVNRToKKyAgICAgICAgeworICAgICAgICAgICAgcHJlc2V0ID0gVjA7CisgICAgICAgICAgICAodm9pZCkgbGFtZV9zZXRfVkJSKGdmcCwgdmJyX3JoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBFWFRSRU1FX0ZBU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXNldCA9IFYwOworICAgICAgICAgICAgKHZvaWQpIGxhbWVfc2V0X1ZCUihnZnAsIHZicl9tdHJoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBJTlNBTkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXNldCA9IDMyMDsKKyAgICAgICAgICAgIGdmcC0+cHJlc2V0ID0gcHJlc2V0OworICAgICAgICAgICAgKHZvaWQpIGFwcGx5X2Ficl9wcmVzZXQoZ2ZwLCBwcmVzZXQsIGVuZm9yY2UpOworICAgICAgICAgICAgbGFtZV9zZXRfVkJSKGdmcCwgdmJyX29mZik7CisgICAgICAgICAgICByZXR1cm4gcHJlc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgZ2ZwLT5wcmVzZXQgPSBwcmVzZXQ7CisgICAgeworICAgICAgICBzd2l0Y2ggKHByZXNldCkgeworICAgICAgICBjYXNlIFY5OgorICAgICAgICAgICAgYXBwbHlfdmJyX3ByZXNldChnZnAsIDksIGVuZm9yY2UpOworICAgICAgICAgICAgcmV0dXJuIHByZXNldDsKKyAgICAgICAgY2FzZSBWODoKKyAgICAgICAgICAgIGFwcGx5X3Zicl9wcmVzZXQoZ2ZwLCA4LCBlbmZvcmNlKTsKKyAgICAgICAgICAgIHJldHVybiBwcmVzZXQ7CisgICAgICAgIGNhc2UgVjc6CisgICAgICAgICAgICBhcHBseV92YnJfcHJlc2V0KGdmcCwgNywgZW5mb3JjZSk7CisgICAgICAgICAgICByZXR1cm4gcHJlc2V0OworICAgICAgICBjYXNlIFY2OgorICAgICAgICAgICAgYXBwbHlfdmJyX3ByZXNldChnZnAsIDYsIGVuZm9yY2UpOworICAgICAgICAgICAgcmV0dXJuIHByZXNldDsKKyAgICAgICAgY2FzZSBWNToKKyAgICAgICAgICAgIGFwcGx5X3Zicl9wcmVzZXQoZ2ZwLCA1LCBlbmZvcmNlKTsKKyAgICAgICAgICAgIHJldHVybiBwcmVzZXQ7CisgICAgICAgIGNhc2UgVjQ6CisgICAgICAgICAgICBhcHBseV92YnJfcHJlc2V0KGdmcCwgNCwgZW5mb3JjZSk7CisgICAgICAgICAgICByZXR1cm4gcHJlc2V0OworICAgICAgICBjYXNlIFYzOgorICAgICAgICAgICAgYXBwbHlfdmJyX3ByZXNldChnZnAsIDMsIGVuZm9yY2UpOworICAgICAgICAgICAgcmV0dXJuIHByZXNldDsKKyAgICAgICAgY2FzZSBWMjoKKyAgICAgICAgICAgIGFwcGx5X3Zicl9wcmVzZXQoZ2ZwLCAyLCBlbmZvcmNlKTsKKyAgICAgICAgICAgIHJldHVybiBwcmVzZXQ7CisgICAgICAgIGNhc2UgVjE6CisgICAgICAgICAgICBhcHBseV92YnJfcHJlc2V0KGdmcCwgMSwgZW5mb3JjZSk7CisgICAgICAgICAgICByZXR1cm4gcHJlc2V0OworICAgICAgICBjYXNlIFYwOgorICAgICAgICAgICAgYXBwbHlfdmJyX3ByZXNldChnZnAsIDAsIGVuZm9yY2UpOworICAgICAgICAgICAgcmV0dXJuIHByZXNldDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICg4IDw9IHByZXNldCAmJiBwcmVzZXQgPD0gMzIwKSB7CisgICAgICAgIHJldHVybiBhcHBseV9hYnJfcHJlc2V0KGdmcCwgcHJlc2V0LCBlbmZvcmNlKTsKKyAgICB9CisKKyAgICBnZnAtPnByZXNldCA9IDA7ICAgIC8qbm8gY29ycmVzcG9uZGluZyBwcmVzZXQgZm91bmQgKi8KKyAgICByZXR1cm4gcHJlc2V0OworfQpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9wc3ltb2RlbC5jIGIvbGlibXAzbGFtZS9wc3ltb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTA0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3BzeW1vZGVsLmMKQEAgLTAsMCArMSwyOTk4IEBACisvKgorICogICAgICBwc3ltb2RlbC5jCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBNYXJrIFRheWxvcgorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBOYW9raSBTaGliYXRhCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFRha2VoaXJvIFRvbWluYWdhCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDA4IFJvYmVydCBIZWdlbWFubgorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBHYWJyaWVsIEJvdXZpZ25lCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IEFsZXhhbmRlciBMZWlkaW5nZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogJElkOiBwc3ltb2RlbC5jLHYgMS4xODUuMi4yIDIwMDkvMDEvMTggMTU6NDQ6Mjcgcm9iZXJ0IEV4cCAkICovCisKKworLyoKK1BTWUNITyBBQ09VU1RJQ1MKKworCitUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHBzeWNobyBhY291c3RpY3MsIGRlbGF5ZWQgYnkgb25lIGdyYW51bGUuICAKKworSW5wdXQ6IGJ1ZmZlciBvZiBQQ00gZGF0YSAoMTAyNCBzYW1wbGVzKS4gIAorCitUaGlzIHdpbmRvdyBzaG91bGQgYmUgY2VudGVyZWQgb3ZlciB0aGUgNTc2IHNhbXBsZSBncmFudWxlIHdpbmRvdy4KK1RoZSByb3V0aW5lIHdpbGwgY29tcHV0ZSB0aGUgcHN5Y2hvIGFjb3VzdGljcyBmb3IKK3RoaXMgZ3JhbnVsZSwgYnV0IHJldHVybiB0aGUgcHN5Y2hvIGFjb3VzdGljcyBjb21wdXRlZAorZm9yIHRoZSAqcHJldmlvdXMqIGdyYW51bGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGJsb2NrCit0eXBlIG9mIHRoZSBwcmV2aW91cyBncmFudWxlIGNhbiBvbmx5IGJlIGRldGVybWluZWQKK2FmdGVyIHdlIGhhdmUgY29tcHV0ZWQgdGhlIHBzeWNobyBhY291c3RpY3MgZm9yIHRoZSBmb2xsb3dpbmcKK2dyYW51bGUuICAKKworT3V0cHV0OiAgbWFza2luZ3MgYW5kIGVuZXJnaWVzIGZvciBlYWNoIHNjYWxlZmFjdG9yIGJhbmQuCitibG9jayB0eXBlLCBQRSwgYW5kIHNvbWUgY29ycmVsYXRpb24gbWVhc3VyZXMuICAKK1RoZSBQRSBpcyB1c2VkIGJ5IENCUiBtb2RlcyB0byBkZXRlcm1pbmUgaWYgZXh0cmEgYml0cworZnJvbSB0aGUgYml0IHJlc2Vydm9pciBzaG91bGQgYmUgdXNlZC4gIFRoZSBjb3JyZWxhdGlvbgorbWVhc3VyZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIG1pZC9zaWRlIG9yIHJlZ3VsYXIgc3RlcmVvLgorKi8KKy8qCitOb3RhdGlvbjoKKworYmFya3M6ICBhIG5vbi1saW5lYXIgZnJlcXVlbmN5IHNjYWxlLiAgTWFwcGluZyBmcm9tIGZyZXF1ZW5jeSB0bworICAgICAgICBiYXJrcyBpcyBnaXZlbiBieSBmcmVxMmJhcmsoKQorCitzY2FsZWZhY3RvciBiYW5kczogVGhlIHNwZWN0cnVtIChmcmVxdWVuY2llcykgYXJlIGJyb2tlbiBpbnRvIAorICAgICAgICAgICAgICAgICAgIFNCTUFYICJzY2FsZWZhY3RvciBiYW5kcyIuICBUaGVzIGJhbmRzCisgICAgICAgICAgICAgICAgICAgYXJlIGRldGVybWluZWQgYnkgdGhlIE1QRUcgSVNPIHNwZWMuICBJbgorICAgICAgICAgICAgICAgICAgIHRoZSBub2lzZSBzaGFwaW5nL3F1YW50aXphdGlvbiBjb2RlLCB3ZSBhbGxvY2F0ZQorICAgICAgICAgICAgICAgICAgIGJpdHMgYW1vbmcgdGhlIHBhcnRpdGlvbiBiYW5kcyB0byBhY2hpZXZlIHRoZQorICAgICAgICAgICAgICAgICAgIGJlc3QgcG9zc2libGUgcXVhbGl0eQorCitwYXJ0aXRpb24gYmFuZHM6ICAgVGhlIHNwZWN0cnVtIGlzIGFsc28gYnJva2VuIGludG8gYWJvdXQKKyAgICAgICAgICAgICAgICAgICA2NCAicGFydGl0aW9uIGJhbmRzIi4gIEVhY2ggcGFydGl0aW9uIAorICAgICAgICAgICAgICAgICAgIGJhbmQgaXMgYWJvdXQgLjM0IGJhcmtzIHdpZGUuICBUaGVyZSBhcmUgYWJvdXQgMi01CisgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uIGJhbmRzIGZvciBlYWNoIHNjYWxlZmFjdG9yIGJhbmQuCisKK0xBTUUgY29tcHV0ZXMgYWxsIHBzeWNobyBhY291c3RpYyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBwYXJ0aXRpb24KK2JhbmQuICBUaGVuIGF0IHRoZSBlbmQgb2YgdGhlIGNvbXB1dGF0aW9ucywgdGhpcyBpbmZvcm1hdGlvbgoraXMgbWFwcGVkIHRvIHNjYWxlZmFjdG9yIGJhbmRzLiAgVGhlIGVuZXJneSBpbiBlYWNoIHNjYWxlZmFjdG9yCitiYW5kIGlzIHRha2VuIGFzIHRoZSBzdW0gb2YgdGhlIGVuZXJneSBpbiBhbGwgcGFydGl0aW9uIGJhbmRzCit3aGljaCBvdmVybGFwIHRoZSBzY2FsZWZhY3RvciBiYW5kLiAgVGhlIG1hc2tpbmdzIGNhbiBiZSBjb21wdXRlZAoraW4gdGhlIHNhbWUgd2F5IChhbmQgdGh1cyByZXByZXNlbnQgdGhlIGF2ZXJhZ2UgbWFza2luZyBpbiB0aGF0IGJhbmQpCitvciBieSB0YWtpbmcgdGhlIG1pbm11bSB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YKK3BhcnRpdGlvbiBiYW5kcyB1c2VkICh3aGljaCByZXByZXNlbnRzIGEgbWluaW11bSBtYXNraW5nIGluIHRoYXQgYmFuZCkuCisqLworLyoKK1RoZSBnZW5lcmFsIG91dGxpbmUgaXMgYXMgZm9sbG93czoKKworMS4gY29tcHV0ZSB0aGUgZW5lcmd5IGluIGVhY2ggcGFydGl0aW9uIGJhbmQKKzIuIGNvbXB1dGUgdGhlIHRvbmFsaXR5IGluIGVhY2ggcGFydGl0aW9uIGJhbmQKKzMuIGNvbXB1dGUgdGhlIHN0cmVuZ3RoIG9mIGVhY2ggcGFydGlvbiBiYW5kICJtYXNrZXIiCis0LiBjb21wdXRlIHRoZSBtYXNraW5nICh2aWEgdGhlIHNwcmVhZGluZyBmdW5jdGlvbiBhcHBsaWVkIHRvIGVhY2ggbWFza2VyKQorNS4gTW9kaWZpY2F0aW9ucyBmb3IgbWlkL3NpZGUgbWFza2luZy4gIAorCitFYWNoIHBhcnRpdGlvbiBiYW5kIGlzIGNvbnNpZGllcmVkIGEgIm1hc2tlciIuICBUaGUgc3RyZW5ndGgKK29mIHRoZSBpJ3RoIG1hc2tlciBpbiBiYW5kIGogaXMgZ2l2ZW4gYnk6CisKKyAgICBzMyhiYXJrKGkpLWJhcmsoaikpKnN0cmVuZ3RoKGkpCisKK1RoZSBzdHJlbmd0aCBvZiB0aGUgbWFza2VyIGlzIGEgZnVuY3Rpb24gb2YgdGhlIGVuZXJneSBhbmQgdG9uYWxpdHkuCitUaGUgbW9yZSB0b25hbCwgdGhlIGxlc3MgbWFza2luZy4gIExBTUUgdXNlcyBhIHNpbXBsZSBsaW5lYXIgZm9ybXVsYQorKGNvbnRyb2xsZWQgYnkgTk1UIGFuZCBUTU4pIHdoaWNoIHNheXMgdGhlIHN0cmVuZ3RoIGlzIGdpdmVuIGJ5IHRoZQorZW5lcmd5IGRpdmlkZWQgYnkgYSBsaW5lYXIgZnVuY3Rpb24gb2YgdGhlIHRvbmFsaXR5LgorKi8KKy8qCitzMygpIGlzIHRoZSAic3ByZWFkaW5nIGZ1bmN0aW9uIi4gIEl0IGlzIGdpdmVuIGJ5IGEgZm9ybXVsYQorZGV0ZXJtaW5lZCB2aWEgbGlzdGVuaW5nIHRlc3RzLiAgCisKK1RoZSB0b3RhbCBtYXNraW5nIGluIHRoZSBqJ3RoIHBhcnRpdGlvbiBiYW5kIGlzIHRoZSBzdW0gb3ZlcgorYWxsIG1hc2tpbmdzIGkuICBJdCBpcyB0aHVzIGdpdmVuIGJ5IHRoZSBjb252b2x1dGlvbiBvZgordGhlIHN0cmVuZ3RoIHdpdGggczMoKSwgdGhlICJzcHJlYWRpbmcgZnVuY3Rpb24uIgorCittYXNraW5nKGopID0gc3VtX292ZXJfaSAgczMoaS1qKSpzdHJlbmd0aChpKSAgPSBzMyBvIHN0cmVuZ3RoCisKK3doZXJlICJvIiA9IGNvbnZvbHV0aW9uIG9wZXJhdG9yLiAgczMgaXMgZ2l2ZW4gYnkgYSBmb3JtdWxhIGRldGVybWluZWQKK3ZpYSBsaXN0ZW5pbmcgdGVzdHMuICBJdCBpcyBub3JtYWxpemVkIHNvIHRoYXQgczMgbyAxID0gMS4KKworTm90ZTogaW5zdGVhZCBvZiBhIHNpbXBsZSBjb252b2x1dGlvbiwgTEFNRSBhbHNvIGhhcyB0aGUKK29wdGlvbiBvZiB1c2luZyAiYWRkaXRpdmUgbWFza2luZyIKKworVGhlIG1vc3QgY3JpdGljYWwgcGFydCBpcyBzdGVwIDIsIGNvbXB1dGluZyB0aGUgdG9uYWxpdHkgb2YgZWFjaAorcGFydGl0aW9uIGJhbmQuICBMQU1FIGhhcyB0d28gdG9uYWxpdHkgZXN0aW1hdG9ycy4gIFRoZSBmaXJzdAoraXMgYmFzZWQgb24gdGhlIElTTyBzcGVjLCBhbmQgbWVhc3VyZXMgaG93IHByZWRpY3RpYWJsZSB0aGUKK3NpZ25hbCBpcyBvdmVyIHRpbWUuICBUaGUgbW9yZSBwcmVkaWN0YWJsZSwgdGhlIG1vcmUgdG9uYWwuCitUaGUgc2Vjb25kIG1lYXN1cmUgaXMgYmFzZWQgb24gbG9va2luZyBhdCB0aGUgc3BlY3RydW0gb2YKK2Egc2luZ2xlIGdyYW51bGUuICBUaGUgbW9yZSBwZWFreSB0aGUgc3BlY3RydW0sIHRoZSBtb3JlCit0b25hbC4gIEJ5IG1vc3QgaW5kaWNhdGlvbnMsIHRoZSBsYXR0ZXIgYXBwcm9hY2ggaXMgYmV0dGVyLgorCitGaW5hbGx5LCBpbiBzdGVwIDUsIHRoZSBtYXNraW5ncyBmb3IgdGhlIG1pZCBhbmQgc2lkZQorY2hhbm5lbCBhcmUgcG9zc2libHkgaW5jcmVhc2VkLiAgVW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLAorbm9pc2UgaW4gdGhlIG1pZCAmIHNpZGUgY2hhbm5lbHMgaXMgYXNzdW1lZCB0byBhbHNvCitiZSBtYXNrZWQgYnkgc3Ryb25nIG1hc2tlcnMgaW4gdGhlIEwgb3IgUiBjaGFubmVscy4KKworCitPdGhlciBkYXRhIGNvbXB1dGVkIGJ5IHRoZSBwc3ktbW9kZWw6CisKK21zX3JhdGlvICAgICAgICBzaWRlLWNoYW5uZWwgLyBtaWQtY2hhbm5lbCBtYXNraW5nIHJhdGlvIChmb3IgcHJldmlvdXMgZ3JhbnVsZSkKK21zX3JhdGlvX25leHQgICBzaWRlLWNoYW5uZWwgLyBtaWQtY2hhbm5lbCBtYXNraW5nIHJhdGlvIGZvciB0aGlzIGdyYW51bGUKKworcGVyY2VwX2VudHJvcHlbMl0gICAgIEwgYW5kIFIgdmFsdWVzIChwcmV2IGdyYW51bGUpIG9mIFBFIC0gQSBtZWFzdXJlIG9mIGhvdyAKKyAgICAgICAgICAgICAgICAgICAgICBtdWNoIHByZS1lY2hvIGlzIGluIHRoZSBwcmV2aW91cyBncmFudWxlCitwZXJjZXBfZW50cm9weV9NU1syXSAgbWlkIGFuZCBzaWRlIGNoYW5uZWwgdmFsdWVzIChwcmV2IGdyYW51bGUpIG9mIHBlcmNlcF9lbnRyb3B5CitlbmVyZ3lbNF0gICAgICAgICAgICAgTCxSLE0sUyBlbmVyZ3kgaW4gZWFjaCBjaGFubmVsLCBwcmV2IGdyYW51bGUKK2Jsb2NrdHlwZV9kWzJdICAgICAgICBibG9jayB0eXBlIHRvIHVzZSBmb3IgcHJldmlvdXMgZ3JhbnVsZQorKi8KKworCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJwc3ltb2RlbC5oIgorI2luY2x1ZGUgImxhbWVfZ2xvYmFsX2ZsYWdzLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAibGFtZS1hbmFseXNpcy5oIgorCisKKyNkZWZpbmUgTlNGSVJMRU4gMjEKKworI2lmZGVmIE1fTE4xMAorI2RlZmluZSAgTE5fVE9fTE9HMTAgIChNX0xOMTAvMTApCisjZWxzZQorI2RlZmluZSAgTE5fVE9fTE9HMTAgIDAuMjMwMjU4NTA5MworI2VuZGlmCisKKyNpZmRlZiBOT05fTElORUFSX1BTWQorCitzdGF0aWMgY29uc3QgZmxvYXQgbm9uX2xpbmVhcl9wc3lfY29uc3RhbnQgPSAuMzsKKworI2RlZmluZSBOT05fTElORUFSX1NDQUxFX0lURU0oeCkgICBwb3coKHgpLCBub25fbGluZWFyX3BzeV9jb25zdGFudCkKKyNkZWZpbmUgTk9OX0xJTkVBUl9TQ0FMRV9TVU0oeCkgICAgcG93KCh4KSwgMS9ub25fbGluZWFyX3BzeV9jb25zdGFudCkKKworI2lmIDAKKyNkZWZpbmUgTk9OX0xJTkVBUl9TQ0FMRV9FTkVSR1koeCkgcG93KDEwLCAoeCkvMTApCisjZWxzZQorI2RlZmluZSBOT05fTElORUFSX1NDQUxFX0VORVJHWSh4KSAoeCkKKyNlbmRpZgorCisjZWxzZQorCisjZGVmaW5lIE5PTl9MSU5FQVJfU0NBTEVfSVRFTSh4KSAgICh4KQorI2RlZmluZSBOT05fTElORUFSX1NDQUxFX1NVTSh4KSAgICAoeCkKKyNkZWZpbmUgTk9OX0xJTkVBUl9TQ0FMRV9FTkVSR1koeCkgKHgpCisKKyNlbmRpZgorCisKKy8qCisgICBMM3BzeWNob19hbmFsLiAgQ29tcHV0ZSBwc3ljaG8gYWNvdXN0aWNzLgorCisgICBEYXRhIHJldHVybmVkIHRvIHRoZSBjYWxsaW5nIHByb2dyYW0gbXVzdCBiZSBkZWxheWVkIGJ5IG9uZSAKKyAgIGdyYW51bGUuIAorCisgICBUaGlzIGlzIGRvbmUgaW4gdHdvIHBsYWNlcy4gIAorICAgSWYgd2UgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgYmxvY2t0eXBlLCB0aGUgY29weWluZworICAgY2FuIGJlIGRvbmUgaGVyZSBhdCB0aGUgdG9wIG9mIHRoZSBwcm9ncmFtOiB3ZSBjb3B5IHRoZSBkYXRhIGZvcgorICAgdGhlIGxhc3QgZ3JhbnVsZSAoY29tcHV0ZWQgZHVyaW5nIHRoZSBsYXN0IGNhbGwpIGJlZm9yZSBpdCBpcworICAgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV3IGRhdGEuICBJdCBsb29rcyBsaWtlIHRoaXM6CisgIAorICAgMC4gc3RhdGljIHBzeW1vZGVsX2RhdGEgCisgICAxLiBjYWxsaW5nX3Byb2dyYW1fZGF0YSA9IHBzeW1vZGVsX2RhdGEKKyAgIDIuIGNvbXB1dGUgcHN5bW9kZWxfZGF0YQorICAgIAorICAgRm9yIGRhdGEgd2hpY2ggbmVlZHMgdG8ga25vdyB0aGUgYmxvY2t0eXBlLCB0aGUgY29weWluZyBtdXN0IGJlCisgICBkb25lIGF0IHRoZSBlbmQgb2YgdGhpcyBsb29wLCBhbmQgdGhlIG9sZCB2YWx1ZXMgbXVzdCBiZSBzYXZlZDoKKyAgIAorICAgMC4gc3RhdGljIHBzeW1vZGVsX2RhdGFfb2xkIAorICAgMS4gY29tcHV0ZSBwc3ltb2RlbF9kYXRhCisgICAyLiBjb21wdXRlIHBvc3NpYmxlIGJsb2NrIHR5cGUgb2YgdGhpcyBncmFudWxlCisgICAzLiBjb21wdXRlIGZpbmFsIGJsb2NrIHR5cGUgb2YgcHJldmlvdXMgZ3JhbnVsZSBiYXNlZCBvbiAjMi4KKyAgIDQuIGNhbGxpbmdfcHJvZ3JhbV9kYXRhID0gcHN5bW9kZWxfZGF0YV9vbGQKKyAgIDUuIHBzeW1vZGVsX2RhdGFfb2xkID0gcHN5bW9kZWxfZGF0YQorKi8KKworCisKKworCisvKiBwc3ljaG9fbG91ZG5lc3NfYXBwcm94CisgICBqZCAtIDIwMDEgbWFyIDEyCitpbjogIGVuZXJneSAgIC0gQkxLU0laRS8yIGVsZW1lbnRzIG9mIGZyZXF1ZW5jeSBtYWduaXR1ZGVzIF4gMgorICAgICBnZnAgICAgICAtIHVzZXMgb3V0X3NhbXBsZXJhdGUsIEFUSHR5cGUgKGFsc28gbmVlZGVkIGZvciBBVEhmb3JtdWxhKQorcmV0dXJuczogbG91ZG5lc3NeMiBhcHByb3hpbWF0aW9uLCBhIHBvc2l0aXZlIHZhbHVlIHJvdWdobHkgdHVuZWQgZm9yIGEgdmFsdWUKKyAgICAgICAgIG9mIDEuMCBmb3Igc2lnbmFscyBuZWFyIGNsaXBwaW5nLgorbm90ZXM6ICAgV2hlbiBjYWxpYnJhdGVkLCBmZWVkaW5nIHRoaXMgZnVuY3Rpb24gYmluYXJ5IHdoaXRlIG5vaXNlIGF0IHNhbXBsZQorICAgICAgICAgdmFsdWVzICszMjc2NyBvciAtMzI3Njggc2hvdWxkIHJldHVybiB2YWx1ZXMgdGhhdCBhcHByb2FjaCAzLgorICAgICAgICAgQVRIZm9ybXVsYSBpcyB1c2VkIHRvIGFwcHJveGltYXRlIGFuIGVxdWFsIGxvdWRuZXNzIGN1cnZlLgorZnV0dXJlOiAgRGF0YSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2hhcGUgb2YgdGhlIGVxdWFsIGxvdWRuZXNzIGN1cnZlIHZhcmllcworICAgICAgICAgd2l0aCBpbnRlbnNpdHkuICBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIGltcHJvdmVkIGJ5IHVzaW5nIGFuIGVxdWFsCisgICAgICAgICBsb3VkbmVzcyBjdXJ2ZSBzaGFwZWQgZm9yIHR5cGljYWwgcGxheWJhY2sgbGV2ZWxzIChpbnN0ZWFkIG9mIHRoZQorICAgICAgICAgQVRILCB0aGF0IGlzIHNoYXBlZCBmb3IgdGhlIHRocmVzaG9sZCkuICBBIGZsZXhpYmxlIHJlYWxpemF0aW9uIG1pZ2h0CisgICAgICAgICBzaW1wbHkgYmVuZCB0aGUgZXhpc3RpbmcgQVRIIGN1cnZlIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgc2hhcGUuCisgICAgICAgICBIb3dldmVyLCB0aGUgcG90ZW50aWFsIGdhaW4gbWF5IG5vdCBiZSBlbm91Z2ggdG8ganVzdGlmeSBhbiBlZmZvcnQuCisqLworc3RhdGljICBGTE9BVAorcHN5Y2hvX2xvdWRuZXNzX2FwcHJveChGTE9BVCBjb25zdCAqZW5lcmd5LCBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMpCit7CisgICAgaW50ICAgICBpOworICAgIEZMT0FUICAgbG91ZG5lc3NfcG93ZXI7CisKKyAgICBsb3VkbmVzc19wb3dlciA9IDAuMDsKKyAgICAvKiBhcHBseSB3ZWlnaHRzIHRvIHBvd2VyIGluIGZyZXEuIGJhbmRzICovCisgICAgZm9yIChpID0gMDsgaSA8IEJMS1NJWkUgLyAyOyArK2kpCisgICAgICAgIGxvdWRuZXNzX3Bvd2VyICs9IGVuZXJneVtpXSAqIGdmYy0+QVRILT5lcWxfd1tpXTsKKyAgICBsb3VkbmVzc19wb3dlciAqPSBWT19TQ0FMRTsKKworICAgIHJldHVybiBsb3VkbmVzc19wb3dlcjsKK30KKworc3RhdGljIHZvaWQKK2NvbXB1dGVfZmZ0cyhsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLAorICAgICAgICAgICAgIEZMT0FUIGZmdGVuZXJneVtIQkxLU0laRV0sCisgICAgICAgICAgICAgRkxPQVQoKmZmdGVuZXJneV9zKVtIQkxLU0laRV9zXSwKKyAgICAgICAgICAgICBGTE9BVCgqd3NhbXBfbClbQkxLU0laRV0sCisgICAgICAgICAgICAgRkxPQVQoKndzYW1wX3MpWzNdW0JMS1NJWkVfc10sIGludCBncl9vdXQsIGludCBjaG4sIGNvbnN0IHNhbXBsZV90ICogYnVmZmVyWzJdCisgICAgKQoreworICAgIGludCAgICAgYiwgajsKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmIChjaG4gPCAyKSB7CisgICAgICAgIGZmdF9sb25nKGdmYywgKndzYW1wX2wsIGNobiwgYnVmZmVyKTsKKyAgICAgICAgZmZ0X3Nob3J0KGdmYywgKndzYW1wX3MsIGNobiwgYnVmZmVyKTsKKyAgICB9CisgICAgLyogRkZUIGRhdGEgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsIGlzIGRlcml2ZWQgZnJvbSBMICYgUiAqLworICAgIGVsc2UgaWYgKGNobiA9PSAyKSB7CisgICAgICAgIGZvciAoaiA9IEJMS1NJWkUgLSAxOyBqID49IDA7IC0taikgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgbCA9IHdzYW1wX2xbMF1bal07CisgICAgICAgICAgICBGTE9BVCBjb25zdCByID0gd3NhbXBfbFsxXVtqXTsKKyAgICAgICAgICAgIHdzYW1wX2xbMF1bal0gPSAobCArIHIpICogKEZMT0FUKSAoU1FSVDIgKiAwLjUpOworICAgICAgICAgICAgd3NhbXBfbFsxXVtqXSA9IChsIC0gcikgKiAoRkxPQVQpIChTUVJUMiAqIDAuNSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChiID0gMjsgYiA+PSAwOyAtLWIpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IEJMS1NJWkVfcyAtIDE7IGogPj0gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgRkxPQVQgY29uc3QgbCA9IHdzYW1wX3NbMF1bYl1bal07CisgICAgICAgICAgICAgICAgRkxPQVQgY29uc3QgciA9IHdzYW1wX3NbMV1bYl1bal07CisgICAgICAgICAgICAgICAgd3NhbXBfc1swXVtiXVtqXSA9IChsICsgcikgKiAoRkxPQVQpIChTUVJUMiAqIDAuNSk7CisgICAgICAgICAgICAgICAgd3NhbXBfc1sxXVtiXVtqXSA9IChsIC0gcikgKiAoRkxPQVQpIChTUVJUMiAqIDAuNSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogIGNvbXB1dGUgZW5lcmdpZXMKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZmdGVuZXJneVswXSA9IE5PTl9MSU5FQVJfU0NBTEVfRU5FUkdZKHdzYW1wX2xbMF1bMF0pOworICAgIGZmdGVuZXJneVswXSAqPSBmZnRlbmVyZ3lbMF07CisKKyAgICBmb3IgKGogPSBCTEtTSVpFIC8gMiAtIDE7IGogPj0gMDsgLS1qKSB7CisgICAgICAgIEZMT0FUIGNvbnN0IHJlID0gKCp3c2FtcF9sKVtCTEtTSVpFIC8gMiAtIGpdOworICAgICAgICBGTE9BVCBjb25zdCBpbSA9ICgqd3NhbXBfbClbQkxLU0laRSAvIDIgKyBqXTsKKyAgICAgICAgZmZ0ZW5lcmd5W0JMS1NJWkUgLyAyIC0gal0gPSBOT05fTElORUFSX1NDQUxFX0VORVJHWSgocmUgKiByZSArIGltICogaW0pICogMC41Zik7CisgICAgfQorICAgIGZvciAoYiA9IDI7IGIgPj0gMDsgLS1iKSB7CisgICAgICAgIGZmdGVuZXJneV9zW2JdWzBdID0gKCp3c2FtcF9zKVtiXVswXTsKKyAgICAgICAgZmZ0ZW5lcmd5X3NbYl1bMF0gKj0gZmZ0ZW5lcmd5X3NbYl1bMF07CisgICAgICAgIGZvciAoaiA9IEJMS1NJWkVfcyAvIDIgLSAxOyBqID49IDA7IC0taikgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgcmUgPSAoKndzYW1wX3MpW2JdW0JMS1NJWkVfcyAvIDIgLSBqXTsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IGltID0gKCp3c2FtcF9zKVtiXVtCTEtTSVpFX3MgLyAyICsgal07CisgICAgICAgICAgICBmZnRlbmVyZ3lfc1tiXVtCTEtTSVpFX3MgLyAyIC0gal0gPSBOT05fTElORUFSX1NDQUxFX0VORVJHWSgocmUgKiByZSArIGltICogaW0pICogMC41Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogdG90YWwgZW5lcmd5ICovCisgICAgeworICAgICAgICBGTE9BVCAgIHRvdGFsZW5lcmd5ID0gMC4wOworICAgICAgICBmb3IgKGogPSAxMTsgaiA8IEhCTEtTSVpFOyBqKyspCisgICAgICAgICAgICB0b3RhbGVuZXJneSArPSBmZnRlbmVyZ3lbal07CisKKyAgICAgICAgZ2ZjLT50b3RfZW5lcltjaG5dID0gdG90YWxlbmVyZ3k7CisgICAgfQorCisgICAgaWYgKGdmcC0+YW5hbHlzaXMpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IEhCTEtTSVpFOyBqKyspIHsKKyAgICAgICAgICAgIGdmYy0+cGluZm8tPmVuZXJneVtncl9vdXRdW2Nobl1bal0gPSBnZmMtPnBpbmZvLT5lbmVyZ3lfc2F2ZVtjaG5dW2pdOworICAgICAgICAgICAgZ2ZjLT5waW5mby0+ZW5lcmd5X3NhdmVbY2huXVtqXSA9IGZmdGVuZXJneVtqXTsKKyAgICAgICAgfQorICAgICAgICBnZmMtPnBpbmZvLT5wZVtncl9vdXRdW2Nobl0gPSBnZmMtPnBlW2Nobl07CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIGNvbXB1dGUgbG91ZG5lc3MgYXBwcm94aW1hdGlvbiAodXNlZCBmb3IgQVRIIGF1dG8tbGV2ZWwgYWRqdXN0bWVudCkgCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoZ2ZwLT5hdGhhYV9sb3VkYXBwcm94ID09IDIgJiYgY2huIDwgMikgeyAvKm5vIGxvdWRuZXNzIGZvciBtaWQvc2lkZSBjaCAqLworICAgICAgICBnZmMtPmxvdWRuZXNzX3NxW2dyX291dF1bY2huXSA9IGdmYy0+bG91ZG5lc3Nfc3Ffc2F2ZVtjaG5dOworICAgICAgICBnZmMtPmxvdWRuZXNzX3NxX3NhdmVbY2huXQorICAgICAgICAgICAgPSBwc3ljaG9fbG91ZG5lc3NfYXBwcm94KGZmdGVuZXJneSwgZ2ZjKTsKKyAgICB9Cit9CisKKy8qIG1hc2tfYWRkIG9wdGltaXphdGlvbiAqLworLyogaW5pdCB0aGUgbGltaXQgdmFsdWVzIHVzZWQgdG8gYXZvaWQgY29tcHV0aW5nIGxvZyBpbiBtYXNrX2FkZCB3aGVuIGl0IGlzIG5vdCBuZWNlc3NhcnkgKi8KKworLyogRm9yIGV4YW1wbGUsIHdpdGggaSA9IDEwKmxvZzEwKG0yL20xKS8xMCoxNiAgICAgICAgICg9IGxvZzEwKG0yL20xKSoxNikKKyAqCisgKiBhYnMoaSk+OCBpcyBlcXVpdmFsZW50IChhcyBpIGlzIGFuIGludGVnZXIpIHRvCisgKiBhYnMoaSk+PTkKKyAqIGk+PTkgfHwgaTw9LTkKKyAqIGVxdWl2YWxlbnQgdG8gKGFzIGkgaXMgdGhlIGJpZ2dlc3QgaW50ZWdlciBzbWFsbGVyIHRoYW4gbG9nMTAobTIvbTEpKjE2IAorICogb3IgdGhlIHNtYWxsZXN0IGludGVnZXIgYmlnZ2VyIHRoYW4gbG9nMTAobTIvbTEpKjE2IGRlcGVuZGluZyBvbiB0aGUgc2lnbiBvZiBsb2cxMChtMi9tMSkqMTYpCisgKiBsb2cxMChtMi9tMSk+PTkvMTYgfHwgbG9nMTAobTIvbTEpPD0tOS8xNgorICogZXhwMTAgaXMgc3RyaWN0bHkgaW5jcmVhc2luZyB0aHVzIHRoaXMgaXMgZXF1aXZhbGVudCB0bworICogbTIvbTEgPj0gMTBeKDkvMTYpIHx8IG0yL20xPD0xMF4oLTkvMTYpIHdoaWNoIGFyZSBjb21wYXJpc29ucyB0byBjb25zdGFudHMKKyAqLworCisKKyNkZWZpbmUgSTFMSU1JVCA4ICAgICAgIC8qIGFzIGluIGlmKGk+OCkgICovCisjZGVmaW5lIEkyTElNSVQgMjMgICAgICAvKiBhcyBpbiBpZihpPjI0KSAtPiBjaGFuZ2VkIDIzICovCisjZGVmaW5lIE1MSU1JVCAgMTUgICAgICAvKiBhcyBpbiBpZihtPDE1KSAqLworCitzdGF0aWMgRkxPQVQgbWFfbWF4X2kxOworc3RhdGljIEZMT0FUIG1hX21heF9pMjsKK3N0YXRpYyBGTE9BVCBtYV9tYXhfbTsKKworICAgIC8qVGhpcyBpcyB0aGUgbWFza2luZyB0YWJsZToKKyAgICAgICBBY2NvcmRpbmcgdG8gdG9uYWxpdHksIHZhbHVlcyBhcmUgZ29pbmcgZnJvbSAwZEIgKFRNTikKKyAgICAgICB0byA5LjNkQiAoTk1UKS4KKyAgICAgICBBZnRlciBhZGRpdGl2ZSBtYXNraW5nIGNvbXB1dGF0aW9uLCA4ZEIgYXJlIGFkZGVkLCBzbworICAgICAgIGZpbmFsIHZhbHVlcyBhcmUgZ29pbmcgZnJvbSA4ZEIgdG8gMTcuM2RCCisgICAgICovCitzdGF0aWMgY29uc3QgRkxPQVQgdGFiW10gPSB7CisgICAgMS4wIC8qcG93KDEwLCAtMCkgKi8gLAorICAgIDAuNzk0MzMgLypwb3coMTAsIC0wLjEpICovICwKKyAgICAwLjYzMDk2IC8qcG93KDEwLCAtMC4yKSAqLyAsCisgICAgMC42MzA5NiAvKnBvdygxMCwgLTAuMikgKi8gLAorICAgIDAuNjMwOTYgLypwb3coMTAsIC0wLjIpICovICwKKyAgICAwLjYzMDk2IC8qcG93KDEwLCAtMC4yKSAqLyAsCisgICAgMC42MzA5NiAvKnBvdygxMCwgLTAuMikgKi8gLAorICAgIDAuMjUxMTkgLypwb3coMTAsIC0wLjYpICovICwKKyAgICAwLjExNzQ5ICAgICAgICAgICAgIC8qcG93KDEwLCAtMC45MykgKi8KK307CisKKworCisKK3N0YXRpYyB2b2lkCitpbml0X21hc2tfYWRkX21heF92YWx1ZXModm9pZCkKK3sKKyAgICBtYV9tYXhfaTEgPSBwb3coMTAsIChJMUxJTUlUICsgMSkgLyAxNi4wKTsKKyAgICBtYV9tYXhfaTIgPSBwb3coMTAsIChJMkxJTUlUICsgMSkgLyAxNi4wKTsKKyAgICBtYV9tYXhfbSA9IHBvdygxMCwgKE1MSU1JVCkgLyAxMC4wKTsKK30KKworCisKKworLyogYWRkaXRpb24gb2Ygc2ltdWx0YW5lb3VzIG1hc2tpbmcgICBOYW9raSBTaGliYXRhIDIwMDAvNyAqLworaW5saW5lIHN0YXRpYyBGTE9BVAorbWFza19hZGQoRkxPQVQgbTEsIEZMT0FUIG0yLCBpbnQga2ssIGludCBiLCBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMsIGludCBzaG9ydGJsb2NrKQoreworICAgIHN0YXRpYyBjb25zdCBGTE9BVCB0YWJsZTFbXSA9IHsKKyAgICAgICAgMy4zMjQ2ICogMy4zMjQ2LCAzLjIzODM3ICogMy4yMzgzNywgMy4xNTQzNyAqIDMuMTU0MzcsIDMuMDA0MTIgKiAzLjAwNDEyLCAyLjg2MTAzICogMi44NjEwMywKKyAgICAgICAgMi42NTQwNyAqIDIuNjU0MDcsIDIuNDYyMDkgKiAyLjQ2MjA5LCAyLjI4NCAqIDIuMjg0LAorICAgICAgICAyLjExODc5ICogMi4xMTg3OSwgMS45NjU1MiAqIDEuOTY1NTIsIDEuODIzMzUgKiAxLjgyMzM1LCAxLjY5MTQ2ICogMS42OTE0NiwKKyAgICAgICAgMS41NjkxMSAqIDEuNTY5MTEsIDEuNDY2NTggKiAxLjQ2NjU4LCAxLjM3MDc0ICogMS4zNzA3NCwgMS4zMTAzNiAqIDEuMzEwMzYsCisgICAgICAgIDEuMjUyNjQgKiAxLjI1MjY0LCAxLjIwNjQ4ICogMS4yMDY0OCwgMS4xNjIwMyAqIDEuMTYyMDMsIDEuMTI3NjUgKiAxLjEyNzY1LAorICAgICAgICAxLjA5NDI4ICogMS4wOTQyOCwgMS4wNjU5ICogMS4wNjU5LCAxLjAzODI2ICogMS4wMzgyNiwgMS4wMTg5NSAqIDEuMDE4OTUsCisgICAgICAgIDEKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IEZMT0FUIHRhYmxlMltdID0geworICAgICAgICAxLjMzMzUyICogMS4zMzM1MiwgMS4zNTg3OSAqIDEuMzU4NzksIDEuMzg0NTQgKiAxLjM4NDU0LCAxLjM5NDk3ICogMS4zOTQ5NywKKyAgICAgICAgMS40MDU0OCAqIDEuNDA1NDgsIDEuMzUzNyAqIDEuMzUzNywgMS4zMDM4MiAqIDEuMzAzODIsIDEuMjIzMjEgKiAxLjIyMzIxLAorICAgICAgICAxLjE0NzU4ICogMS4xNDc1OCwKKyAgICAgICAgMQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgRkxPQVQgdGFibGUzW10gPSB7CisgICAgICAgIDIuMzUzNjQgKiAyLjM1MzY0LCAyLjI5MjU5ICogMi4yOTI1OSwgMi4yMzMxMyAqIDIuMjMzMTMsIDIuMTI2NzUgKiAyLjEyNjc1LAorICAgICAgICAyLjAyNTQ1ICogMi4wMjU0NSwgMS44Nzg5NCAqIDEuODc4OTQsIDEuNzQzMDMgKiAxLjc0MzAzLCAxLjYxNjk1ICogMS42MTY5NSwKKyAgICAgICAgMS40OTk5OSAqIDEuNDk5OTksIDEuMzkxNDggKiAxLjM5MTQ4LCAxLjI5MDgzICogMS4yOTA4MywgMS4xOTc0NiAqIDEuMTk3NDYsCisgICAgICAgIDEuMTEwODQgKiAxLjExMDg0LCAxLjAzODI2ICogMS4wMzgyNgorICAgIH07CisKKworICAgIGludCAgICAgaTsKKyAgICBGTE9BVCAgIHJhdGlvOworCisKKyAgICBpZiAobTIgPiBtMSkgeworICAgICAgICBpZiAobTIgPCAobTEgKiBtYV9tYXhfaTIpKQorICAgICAgICAgICAgcmF0aW8gPSBtMiAvIG0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKG0xICsgbTIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKG0xID49IChtMiAqIG1hX21heF9pMikpCisgICAgICAgICAgICByZXR1cm4gKG0xICsgbTIpOworICAgICAgICByYXRpbyA9IG0xIC8gbTI7CisgICAgfQorICAgIC8qaSA9IGFicygxMCpsb2cxMChtMiAvIG0xKS8xMCoxNik7CisgICAgICAgbSA9IDEwKmxvZzEwKChtMSttMikvZ2ZjLT5BVEgtPmNiW2tdKTsgKi8KKworCisgICAgLyogU2hvdWxkIGFsd2F5cyBiZSB0cnVlLCBqdXN0IGNoZWNraW5nICovCisgICAgYXNzZXJ0KG0xID49IDApOworICAgIGFzc2VydChtMiA+PSAwKTsKKworCisgICAgbTEgKz0gbTI7CisKKyAgICBpZiAoKHVuc2lnbmVkIGludCkgKGIgKyAzKSA8PSAzICsgMykgeyAvKiBhcHByb3hpbWF0ZWx5LCAxIGJhcmsgPSAzIHBhcnRpdGlvbnMgKi8KKyAgICAgICAgLyogNjUlIG9mIHRoZSBjYXNlcyAqLworICAgICAgICAvKiBvcmlnaW5hbGx5ICdpZihpID4gOCknICovCisgICAgICAgIGlmIChyYXRpbyA+PSBtYV9tYXhfaTEpIHsKKyAgICAgICAgICAgIC8qIDQzJSBvZiB0aGUgdG90YWwgKi8KKyAgICAgICAgICAgIHJldHVybiBtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIDIyJSBvZiB0aGUgdG90YWwgKi8KKyAgICAgICAgaSA9IChpbnQpIChGQVNUX0xPRzEwX1gocmF0aW8sIDE2LjApKTsKKyAgICAgICAgcmV0dXJuIG0xICogdGFibGUyW2ldOworICAgIH0KKworICAgIC8qIG08MTUgZXF1IGxvZzEwKChtMSttMikvZ2ZjLT5BVEgtPmNiW2tdKTwxLjUKKyAgICAgKiBlcXUgKG0xK20yKS9nZmMtPkFUSC0+Y2Jba108MTBeMS41CisgICAgICogZXF1IChtMSttMik8MTBeMS41ICogZ2ZjLT5BVEgtPmNiW2tdCisgICAgICovCisKKyAgICBpID0gKGludCkgRkFTVF9MT0cxMF9YKHJhdGlvLCAxNi4wKTsKKyAgICBpZiAoc2hvcnRibG9jaykgeworICAgICAgICBtMiA9IGdmYy0+QVRILT5jYl9zW2trXSAqIGdmYy0+QVRILT5hZGp1c3Q7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtMiA9IGdmYy0+QVRILT5jYl9sW2trXSAqIGdmYy0+QVRILT5hZGp1c3Q7CisgICAgfQorICAgIGFzc2VydChtMiA+PSAwKTsKKyAgICBpZiAobTEgPCBtYV9tYXhfbSAqIG0yKSB7CisgICAgICAgIC8qIDMlIG9mIHRoZSB0b3RhbCAqLworICAgICAgICAvKiBPcmlnaW5hbGx5IGlmIChtID4gMCkgeyAqLworICAgICAgICBpZiAobTEgPiBtMikgeworICAgICAgICAgICAgRkxPQVQgICBmLCByOworCisgICAgICAgICAgICBmID0gMS4wOworICAgICAgICAgICAgaWYgKGkgPD0gMTMpCisgICAgICAgICAgICAgICAgZiA9IHRhYmxlM1tpXTsKKworICAgICAgICAgICAgciA9IEZBU1RfTE9HMTBfWChtMSAvIG0yLCAxMC4wIC8gMTUuMCk7CisgICAgICAgICAgICByZXR1cm4gbTEgKiAoKHRhYmxlMVtpXSAtIGYpICogciArIGYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPiAxMykKKyAgICAgICAgICAgIHJldHVybiBtMTsKKworICAgICAgICByZXR1cm4gbTEgKiB0YWJsZTNbaV07CisgICAgfQorCisKKyAgICAvKiAxMCUgb2YgdG90YWwgKi8KKyAgICByZXR1cm4gbTEgKiB0YWJsZTFbaV07Cit9CisKKworLyogYWRkaXRpb24gb2Ygc2ltdWx0YW5lb3VzIG1hc2tpbmcgICBOYW9raSBTaGliYXRhIDIwMDAvNyAqLworaW5saW5lIHN0YXRpYyBGTE9BVAordmJycHN5X21hc2tfYWRkKEZMT0FUIG0xLCBGTE9BVCBtMiwgaW50IGIpCit7CisgICAgc3RhdGljIGNvbnN0IEZMT0FUIHRhYmxlMltdID0geworICAgICAgICAxLjMzMzUyICogMS4zMzM1MiwgMS4zNTg3OSAqIDEuMzU4NzksIDEuMzg0NTQgKiAxLjM4NDU0LCAxLjM5NDk3ICogMS4zOTQ5NywKKyAgICAgICAgMS40MDU0OCAqIDEuNDA1NDgsIDEuMzUzNyAqIDEuMzUzNywgMS4zMDM4MiAqIDEuMzAzODIsIDEuMjIzMjEgKiAxLjIyMzIxLAorICAgICAgICAxLjE0NzU4ICogMS4xNDc1OCwKKyAgICAgICAgMQorICAgIH07CisKKyAgICBGTE9BVCAgIHJhdGlvOworCisgICAgaWYgKG0xIDwgMCkgeworICAgICAgICBtMSA9IDA7CisgICAgfQorICAgIGlmIChtMiA8IDApIHsKKyAgICAgICAgbTIgPSAwOworICAgIH0KKyAgICBpZiAobTEgPD0gMCkgeworICAgICAgICByZXR1cm4gbTI7CisgICAgfQorICAgIGlmIChtMiA8PSAwKSB7CisgICAgICAgIHJldHVybiBtMTsKKyAgICB9CisgICAgaWYgKG0yID4gbTEpIHsKKyAgICAgICAgcmF0aW8gPSBtMiAvIG0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmF0aW8gPSBtMSAvIG0yOworICAgIH0gICAgCisgICAgaWYgKC0yIDw9IGIgJiYgYiA8PSAyKSB7IC8qIGFwcHJveGltYXRlbHksIDEgYmFyayA9IDMgcGFydGl0aW9ucyAqLworICAgICAgICAvKiBvcmlnaW5hbGx5ICdpZihpID4gOCknICovCisgICAgICAgIGlmIChyYXRpbyA+PSBtYV9tYXhfaTEpIHsKKyAgICAgICAgICAgIHJldHVybiBtMSArIG0yOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50ICAgICBpID0gKGludCkgKEZBU1RfTE9HMTBfWChyYXRpbywgMTYuMCkpOworICAgICAgICByZXR1cm4gKG0xICsgbTIpICogdGFibGUyW2ldOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyYXRpbyA8IG1hX21heF9pMikgeworICAgICAgICByZXR1cm4gbTEgKyBtMjsKKyAgICB9CisgICAgaWYgKG0xIDwgbTIpIHsKKyAgICAgICAgbTEgPSBtMjsKKyAgICB9CisgICAgcmV0dXJuIG0xOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBjb21wdXRlIGludGVyY2hhbm5lbCBtYXNraW5nIGVmZmVjdHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorY2FsY19pbnRlcmNoYW5uZWxfbWFza2luZyhsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBGTE9BVCByYXRpbykKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgc2IsIHNibG9jazsKKyAgICBGTE9BVCAgIGwsIHI7CisgICAgaWYgKGdmYy0+Y2hhbm5lbHNfb3V0ID4gMSkgeworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBTQk1BWF9sOyBzYisrKSB7CisgICAgICAgICAgICBsID0gZ2ZjLT50aG1bMF0ubFtzYl07CisgICAgICAgICAgICByID0gZ2ZjLT50aG1bMV0ubFtzYl07CisgICAgICAgICAgICBnZmMtPnRobVswXS5sW3NiXSArPSByICogcmF0aW87CisgICAgICAgICAgICBnZmMtPnRobVsxXS5sW3NiXSArPSBsICogcmF0aW87CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgU0JNQVhfczsgc2IrKykgeworICAgICAgICAgICAgZm9yIChzYmxvY2sgPSAwOyBzYmxvY2sgPCAzOyBzYmxvY2srKykgeworICAgICAgICAgICAgICAgIGwgPSBnZmMtPnRobVswXS5zW3NiXVtzYmxvY2tdOworICAgICAgICAgICAgICAgIHIgPSBnZmMtPnRobVsxXS5zW3NiXVtzYmxvY2tdOworICAgICAgICAgICAgICAgIGdmYy0+dGhtWzBdLnNbc2JdW3NibG9ja10gKz0gciAqIHJhdGlvOworICAgICAgICAgICAgICAgIGdmYy0+dGhtWzFdLnNbc2JdW3NibG9ja10gKz0gbCAqIHJhdGlvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIGNvbXB1dGUgTS9TIHRocmVzaG9sZHMgZnJvbSBKb2huc3RvbiAmIEZlcnJlaXJhIDE5OTIgSUNBU1NQIHBhcGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK21zZml4MShsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjKQoreworICAgIGludCAgICAgc2IsIHNibG9jazsKKyAgICBGTE9BVCAgIHJzaWRlLCBybWlkLCBtbGQ7CisgICAgZm9yIChzYiA9IDA7IHNiIDwgU0JNQVhfbDsgc2IrKykgeworICAgICAgICAvKiB1c2UgdGhpcyBmaXggaWYgTCAmIFIgbWFza2luZyBkaWZmZXJzIGJ5IDJkYiBvciBsZXNzICovCisgICAgICAgIC8qIGlmIGRiID0gMTAqbG9nMTAoeDIveDEpIDwgMiAqLworICAgICAgICAvKiBpZiAoeDIgPCAxLjU4KngxKSB7ICovCisgICAgICAgIGlmIChnZmMtPnRobVswXS5sW3NiXSA+IDEuNTggKiBnZmMtPnRobVsxXS5sW3NiXQorICAgICAgICAgICAgfHwgZ2ZjLT50aG1bMV0ubFtzYl0gPiAxLjU4ICogZ2ZjLT50aG1bMF0ubFtzYl0pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtbGQgPSBnZmMtPm1sZF9sW3NiXSAqIGdmYy0+ZW5bM10ubFtzYl07CisgICAgICAgIHJtaWQgPSBNYXgoZ2ZjLT50aG1bMl0ubFtzYl0sIE1pbihnZmMtPnRobVszXS5sW3NiXSwgbWxkKSk7CisKKyAgICAgICAgbWxkID0gZ2ZjLT5tbGRfbFtzYl0gKiBnZmMtPmVuWzJdLmxbc2JdOworICAgICAgICByc2lkZSA9IE1heChnZmMtPnRobVszXS5sW3NiXSwgTWluKGdmYy0+dGhtWzJdLmxbc2JdLCBtbGQpKTsKKyAgICAgICAgZ2ZjLT50aG1bMl0ubFtzYl0gPSBybWlkOworICAgICAgICBnZmMtPnRobVszXS5sW3NiXSA9IHJzaWRlOworICAgIH0KKworICAgIGZvciAoc2IgPSAwOyBzYiA8IFNCTUFYX3M7IHNiKyspIHsKKyAgICAgICAgZm9yIChzYmxvY2sgPSAwOyBzYmxvY2sgPCAzOyBzYmxvY2srKykgeworICAgICAgICAgICAgaWYgKGdmYy0+dGhtWzBdLnNbc2JdW3NibG9ja10gPiAxLjU4ICogZ2ZjLT50aG1bMV0uc1tzYl1bc2Jsb2NrXQorICAgICAgICAgICAgICAgIHx8IGdmYy0+dGhtWzFdLnNbc2JdW3NibG9ja10gPiAxLjU4ICogZ2ZjLT50aG1bMF0uc1tzYl1bc2Jsb2NrXSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbWxkID0gZ2ZjLT5tbGRfc1tzYl0gKiBnZmMtPmVuWzNdLnNbc2JdW3NibG9ja107CisgICAgICAgICAgICBybWlkID0gTWF4KGdmYy0+dGhtWzJdLnNbc2JdW3NibG9ja10sIE1pbihnZmMtPnRobVszXS5zW3NiXVtzYmxvY2tdLCBtbGQpKTsKKworICAgICAgICAgICAgbWxkID0gZ2ZjLT5tbGRfc1tzYl0gKiBnZmMtPmVuWzJdLnNbc2JdW3NibG9ja107CisgICAgICAgICAgICByc2lkZSA9IE1heChnZmMtPnRobVszXS5zW3NiXVtzYmxvY2tdLCBNaW4oZ2ZjLT50aG1bMl0uc1tzYl1bc2Jsb2NrXSwgbWxkKSk7CisKKyAgICAgICAgICAgIGdmYy0+dGhtWzJdLnNbc2JdW3NibG9ja10gPSBybWlkOworICAgICAgICAgICAgZ2ZjLT50aG1bM10uc1tzYl1bc2Jsb2NrXSA9IHJzaWRlOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQWRqdXN0IE0vUyBtYXNraW5ncyBpZiB1c2VyIHNldCAibXNmaXgiCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTmFva2kgU2hpYmF0YSAyMDAwICovCitzdGF0aWMgdm9pZAorbnNfbXNmaXgobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgRkxPQVQgbXNmaXgsIEZMT0FUIGF0aGFkanVzdCkKK3sKKyAgICBpbnQgICAgIHNiLCBzYmxvY2s7CisgICAgRkxPQVQgICBtc2ZpeDIgPSBtc2ZpeDsKKyAgICBGTE9BVCAgIGF0aGxvd2VyID0gcG93KDEwLCBhdGhhZGp1c3QpOworCisgICAgbXNmaXggKj0gMi4wOworICAgIG1zZml4MiAqPSAyLjA7CisgICAgZm9yIChzYiA9IDA7IHNiIDwgU0JNQVhfbDsgc2IrKykgeworICAgICAgICBGTE9BVCAgIHRobUxSLCB0aG1NLCB0aG1TLCBhdGg7CisgICAgICAgIGF0aCA9IChnZmMtPkFUSC0+Y2JfbFtnZmMtPmJtX2xbc2JdXSkgKiBhdGhsb3dlcjsKKyAgICAgICAgdGhtTFIgPSBNaW4oTWF4KGdmYy0+dGhtWzBdLmxbc2JdLCBhdGgpLCBNYXgoZ2ZjLT50aG1bMV0ubFtzYl0sIGF0aCkpOworICAgICAgICB0aG1NID0gTWF4KGdmYy0+dGhtWzJdLmxbc2JdLCBhdGgpOworICAgICAgICB0aG1TID0gTWF4KGdmYy0+dGhtWzNdLmxbc2JdLCBhdGgpOworICAgICAgICBpZiAodGhtTFIgKiBtc2ZpeCA8IHRobU0gKyB0aG1TKSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBmID0gdGhtTFIgKiBtc2ZpeDIgLyAodGhtTSArIHRobVMpOworICAgICAgICAgICAgdGhtTSAqPSBmOworICAgICAgICAgICAgdGhtUyAqPSBmOworICAgICAgICAgICAgYXNzZXJ0KHRobU0gKyB0aG1TID4gMCk7CisgICAgICAgIH0KKyAgICAgICAgZ2ZjLT50aG1bMl0ubFtzYl0gPSBNaW4odGhtTSwgZ2ZjLT50aG1bMl0ubFtzYl0pOworICAgICAgICBnZmMtPnRobVszXS5sW3NiXSA9IE1pbih0aG1TLCBnZmMtPnRobVszXS5sW3NiXSk7CisgICAgfQorCisgICAgYXRobG93ZXIgKj0gKChGTE9BVCkgQkxLU0laRV9zIC8gQkxLU0laRSk7CisgICAgZm9yIChzYiA9IDA7IHNiIDwgU0JNQVhfczsgc2IrKykgeworICAgICAgICBmb3IgKHNibG9jayA9IDA7IHNibG9jayA8IDM7IHNibG9jaysrKSB7CisgICAgICAgICAgICBGTE9BVCAgIHRobUxSLCB0aG1NLCB0aG1TLCBhdGg7CisgICAgICAgICAgICBhdGggPSAoZ2ZjLT5BVEgtPmNiX3NbZ2ZjLT5ibV9zW3NiXV0pICogYXRobG93ZXI7CisgICAgICAgICAgICB0aG1MUiA9IE1pbihNYXgoZ2ZjLT50aG1bMF0uc1tzYl1bc2Jsb2NrXSwgYXRoKSwgTWF4KGdmYy0+dGhtWzFdLnNbc2JdW3NibG9ja10sIGF0aCkpOworICAgICAgICAgICAgdGhtTSA9IE1heChnZmMtPnRobVsyXS5zW3NiXVtzYmxvY2tdLCBhdGgpOworICAgICAgICAgICAgdGhtUyA9IE1heChnZmMtPnRobVszXS5zW3NiXVtzYmxvY2tdLCBhdGgpOworCisgICAgICAgICAgICBpZiAodGhtTFIgKiBtc2ZpeCA8IHRobU0gKyB0aG1TKSB7CisgICAgICAgICAgICAgICAgRkxPQVQgY29uc3QgZiA9IHRobUxSICogbXNmaXggLyAodGhtTSArIHRobVMpOworICAgICAgICAgICAgICAgIHRobU0gKj0gZjsKKyAgICAgICAgICAgICAgICB0aG1TICo9IGY7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHRobU0gKyB0aG1TID4gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZmMtPnRobVsyXS5zW3NiXVtzYmxvY2tdID0gTWluKGdmYy0+dGhtWzJdLnNbc2JdW3NibG9ja10sIHRobU0pOworICAgICAgICAgICAgZ2ZjLT50aG1bM10uc1tzYl1bc2Jsb2NrXSA9IE1pbihnZmMtPnRobVszXS5zW3NiXVtzYmxvY2tdLCB0aG1TKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogc2hvcnQgYmxvY2sgdGhyZXNob2xkIGNhbGN1bGF0aW9uIChwYXJ0IDIpCisKKyAgICBwYXJ0aXRpb24gYmFuZCBib19zW3NmYl0gaXMgYXQgdGhlIHRyYW5zaXRpb24gZnJvbSBzY2FsZWZhY3RvcgorICAgIGJhbmQgc2ZiIHRvIHRoZSBuZXh0IG9uZSBzZmIrMTsgZW5uIGFuZCB0aG1tIGhhdmUgdG8gYmUgc3BsaXQKKyAgICBiZXR3ZWVuIHRoZW0KKyovCitzdGF0aWMgdm9pZAorY29udmVydF9wYXJ0aXRpb24yc2NhbGVmYWNfcyhsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBGTE9BVCBjb25zdCAqZWIsIEZMT0FUIGNvbnN0ICp0aHIsIGludCBjaG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYmxvY2spCit7CisgICAgRkxPQVQgICBlbm4sIHRobW07CisgICAgaW50ICAgICBzYiwgYjsKKyAgICBlbm4gPSB0aG1tID0gMC4wOworICAgIGZvciAoc2IgPSBiID0gMDsgc2IgPCBTQk1BWF9zOyArK2IsICsrc2IpIHsKKyAgICAgICAgaW50IGNvbnN0IGJvX3Nfc2IgPSBnZmMtPmJvX3Nbc2JdOworICAgICAgICBpbnQgY29uc3QgbnBhcnRfcyA9IGdmYy0+bnBhcnRfczsKKyAgICAgICAgaW50IGNvbnN0IGJfbGltID0gYm9fc19zYiA8IG5wYXJ0X3MgPyBib19zX3NiIDogbnBhcnRfczsKKyAgICAgICAgd2hpbGUgKGIgPCBiX2xpbSkgeworICAgICAgICAgICAgYXNzZXJ0KGViW2JdID49IDApOyAvKiBpZmYgZmFpbGVkLCBpdCBtYXkgaW5kaWNhdGUgc29tZSBpbmRleCBlcnJvciBlbHNld2hlcmUgKi8KKyAgICAgICAgICAgIGFzc2VydCh0aHJbYl0gPj0gMCk7CisgICAgICAgICAgICBlbm4gKz0gZWJbYl07CisgICAgICAgICAgICB0aG1tICs9IHRocltiXTsKKyAgICAgICAgICAgIGIrKzsKKyAgICAgICAgfQorICAgICAgICBnZmMtPmVuW2Nobl0uc1tzYl1bc2Jsb2NrXSA9IGVubjsKKyAgICAgICAgZ2ZjLT50aG1bY2huXS5zW3NiXVtzYmxvY2tdID0gdGhtbTsKKworICAgICAgICBpZiAoYiA+PSBucGFydF9zKSB7CisgICAgICAgICAgICArK3NiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGViW2JdID49IDApOyAvKiBpZmYgZmFpbGVkLCBpdCBtYXkgaW5kaWNhdGUgc29tZSBpbmRleCBlcnJvciBlbHNld2hlcmUgKi8KKyAgICAgICAgYXNzZXJ0KHRocltiXSA+PSAwKTsKKyAgICAgICAgeworICAgICAgICAgICAgLyogYXQgdHJhbnNpdGlvbiBzZmIgLT4gc2ZiKzEgKi8KKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHdfY3VyciA9IGdmYy0+UFNZLT5ib19zX3dlaWdodFtzYl07CisgICAgICAgICAgICBGTE9BVCBjb25zdCB3X25leHQgPSAxLjAgLSB3X2N1cnI7CisgICAgICAgICAgICBlbm4gPSB3X2N1cnIgKiBlYltiXTsKKyAgICAgICAgICAgIHRobW0gPSB3X2N1cnIgKiB0aHJbYl07CisgICAgICAgICAgICBnZmMtPmVuW2Nobl0uc1tzYl1bc2Jsb2NrXSArPSBlbm47CisgICAgICAgICAgICBnZmMtPnRobVtjaG5dLnNbc2JdW3NibG9ja10gKz0gdGhtbTsKKyAgICAgICAgICAgIGVubiA9IHdfbmV4dCAqIGViW2JdOworICAgICAgICAgICAgdGhtbSA9IHdfbmV4dCAqIHRocltiXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiB6ZXJvIGluaXRpYWxpemUgdGhlIHJlc3QgKi8KKyAgICBmb3IgKDsgc2IgPCBTQk1BWF9zOyArK3NiKSB7CisgICAgICAgIGdmYy0+ZW5bY2huXS5zW3NiXVtzYmxvY2tdID0gMDsKKyAgICAgICAgZ2ZjLT50aG1bY2huXS5zW3NiXVtzYmxvY2tdID0gMDsKKyAgICB9Cit9CisKKy8qIGxvbmdibG9jayB0aHJlc2hvbGQgY2FsY3VsYXRpb24gKHBhcnQgMikgKi8KK3N0YXRpYyB2b2lkCitjb252ZXJ0X3BhcnRpdGlvbjJzY2FsZWZhY19sKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIEZMT0FUIGNvbnN0ICplYiwgRkxPQVQgY29uc3QgKnRociwgaW50IGNobikKK3sKKyAgICBGTE9BVCAgIGVubiwgdGhtbTsKKyAgICBpbnQgICAgIHNiLCBiOworICAgIGVubiA9IHRobW0gPSAwLjA7CisgICAgZm9yIChzYiA9IGIgPSAwOyBzYiA8IFNCTUFYX2w7ICsrYiwgKytzYikgeworICAgICAgICBpbnQgY29uc3QgYm9fbF9zYiA9IGdmYy0+Ym9fbFtzYl07CisgICAgICAgIGludCBjb25zdCBucGFydF9sID0gZ2ZjLT5ucGFydF9sOworICAgICAgICBpbnQgY29uc3QgYl9saW0gPSBib19sX3NiIDwgbnBhcnRfbCA/IGJvX2xfc2IgOiBucGFydF9sOworICAgICAgICB3aGlsZSAoYiA8IGJfbGltKSB7CisgICAgICAgICAgICBhc3NlcnQoZWJbYl0gPj0gMCk7IC8qIGlmZiBmYWlsZWQsIGl0IG1heSBpbmRpY2F0ZSBzb21lIGluZGV4IGVycm9yIGVsc2V3aGVyZSAqLworICAgICAgICAgICAgYXNzZXJ0KHRocltiXSA+PSAwKTsKKyAgICAgICAgICAgIGVubiArPSBlYltiXTsKKyAgICAgICAgICAgIHRobW0gKz0gdGhyW2JdOworICAgICAgICAgICAgYisrOworICAgICAgICB9CisgICAgICAgIGdmYy0+ZW5bY2huXS5sW3NiXSA9IGVubjsKKyAgICAgICAgZ2ZjLT50aG1bY2huXS5sW3NiXSA9IHRobW07CisKKyAgICAgICAgaWYgKGIgPj0gbnBhcnRfbCkgeworICAgICAgICAgICAgKytzYjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFzc2VydChlYltiXSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KHRocltiXSA+PSAwKTsKKyAgICAgICAgeworICAgICAgICAgICAgLyogYXQgdHJhbnNpdGlvbiBzZmIgLT4gc2ZiKzEgKi8KKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHdfY3VyciA9IGdmYy0+UFNZLT5ib19sX3dlaWdodFtzYl07CisgICAgICAgICAgICBGTE9BVCBjb25zdCB3X25leHQgPSAxLjAgLSB3X2N1cnI7CisgICAgICAgICAgICBlbm4gPSB3X2N1cnIgKiBlYltiXTsKKyAgICAgICAgICAgIHRobW0gPSB3X2N1cnIgKiB0aHJbYl07CisgICAgICAgICAgICBnZmMtPmVuW2Nobl0ubFtzYl0gKz0gZW5uOworICAgICAgICAgICAgZ2ZjLT50aG1bY2huXS5sW3NiXSArPSB0aG1tOworICAgICAgICAgICAgZW5uID0gd19uZXh0ICogZWJbYl07CisgICAgICAgICAgICB0aG1tID0gd19uZXh0ICogdGhyW2JdOworICAgICAgICB9CisgICAgfQorICAgIC8qIHplcm8gaW5pdGlhbGl6ZSB0aGUgcmVzdCAqLworICAgIGZvciAoOyBzYiA8IFNCTUFYX2w7ICsrc2IpIHsKKyAgICAgICAgZ2ZjLT5lbltjaG5dLmxbc2JdID0gMDsKKyAgICAgICAgZ2ZjLT50aG1bY2huXS5sW3NiXSA9IDA7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitjb21wdXRlX21hc2tpbmdfcyhsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLAorICAgICAgICAgICAgICAgICAgRkxPQVQoKmZmdGVuZXJneV9zKVtIQkxLU0laRV9zXSwgRkxPQVQgKiBlYiwgRkxPQVQgKiB0aHIsIGludCBjaG4sIGludCBzYmxvY2spCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGksIGosIGI7CisKKyAgICBmb3IgKGIgPSBqID0gMDsgYiA8IGdmYy0+bnBhcnRfczsgKytiKSB7CisgICAgICAgIEZMT0FUICAgZWJiID0gMCwgbSA9IDA7CisgICAgICAgIGludCBjb25zdCBuID0gZ2ZjLT5udW1saW5lc19zW2JdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpLCArK2opIHsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IGVsID0gZmZ0ZW5lcmd5X3Nbc2Jsb2NrXVtqXTsKKyAgICAgICAgICAgIGViYiArPSBlbDsKKyAgICAgICAgICAgIGlmIChtIDwgZWwpCisgICAgICAgICAgICAgICAgbSA9IGVsOworICAgICAgICB9CisgICAgICAgIGViW2JdID0gZWJiOworICAgIH0KKyAgICBhc3NlcnQoYiA9PSBnZmMtPm5wYXJ0X3MpOworICAgIGFzc2VydChqID09IDEyOSk7CisgICAgZm9yIChqID0gYiA9IDA7IGIgPCBnZmMtPm5wYXJ0X3M7IGIrKykgeworICAgICAgICBpbnQgICAgIGtrID0gZ2ZjLT5zM2luZF9zW2JdWzBdOworICAgICAgICBGTE9BVCAgIGVjYiA9IGdmYy0+czNfc3NbaisrXSAqIGViW2trXTsKKyAgICAgICAgKytrazsKKyAgICAgICAgd2hpbGUgKGtrIDw9IGdmYy0+czNpbmRfc1tiXVsxXSkgeworICAgICAgICAgICAgZWNiICs9IGdmYy0+czNfc3Nbal0gKiBlYltra107CisgICAgICAgICAgICArK2osICsra2s7CisgICAgICAgIH0KKworICAgICAgICB7ICAgICAgICAgICAgICAgLyogbGltaXQgY2FsY3VsYXRlZCB0aHJlc2hvbGQgYnkgcHJldmlvdXMgZ3JhbnVsZSAqLworICAgICAgICAgICAgRkxPQVQgY29uc3QgeCA9IHJwZWxldl9zICogZ2ZjLT5uYl9zMVtjaG5dW2JdOworICAgICAgICAgICAgdGhyW2JdID0gTWluKGVjYiwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdmYy0+YmxvY2t0eXBlX29sZFtjaG4gJiAxXSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgICAgICAvKiBsaW1pdCBjYWxjdWxhdGVkIHRocmVzaG9sZCBieSBldmVuIG9sZGVyIGdyYW51bGUgKi8KKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHggPSBycGVsZXYyX3MgKiBnZmMtPm5iX3MyW2Nobl1bYl07CisgICAgICAgICAgICBGTE9BVCBjb25zdCB5ID0gdGhyW2JdOworICAgICAgICAgICAgdGhyW2JdID0gTWluKHgsIHkpOworICAgICAgICB9CisKKyAgICAgICAgZ2ZjLT5uYl9zMltjaG5dW2JdID0gZ2ZjLT5uYl9zMVtjaG5dW2JdOworICAgICAgICBnZmMtPm5iX3MxW2Nobl1bYl0gPSBlY2I7CisgICAgICAgIGFzc2VydCh0aHJbYl0gPj0gMCk7CisgICAgfQorICAgIGZvciAoOyBiIDw9IENCQU5EUzsgKytiKSB7CisgICAgICAgIGViW2JdID0gMDsKKyAgICAgICAgdGhyW2JdID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitibG9ja190eXBlX3NldChsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBpbnQgKnVzZWxvbmdibG9jaywgaW50ICpibG9ja3R5cGVfZCwgaW50ICpibG9ja3R5cGUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGNobjsKKworICAgIGlmIChnZnAtPnNob3J0X2Jsb2NrcyA9PSBzaG9ydF9ibG9ja19jb3VwbGVkCisgICAgICAgIC8qIGZvcmNlIGJvdGggY2hhbm5lbHMgdG8gdXNlIHRoZSBzYW1lIGJsb2NrIHR5cGUgKi8KKyAgICAgICAgLyogdGhpcyBpcyBuZWNlc3NhcnkgaWYgdGhlIGZyYW1lIGlzIHRvIGJlIGVuY29kZWQgaW4gbXNfc3RlcmVvLiAgKi8KKyAgICAgICAgLyogQnV0IGV2ZW4gd2l0aG91dCBtc19zdGVyZW8sIEZoRyAgZG9lcyB0aGlzICovCisgICAgICAgICYmICEodXNlbG9uZ2Jsb2NrWzBdICYmIHVzZWxvbmdibG9ja1sxXSkpCisgICAgICAgIHVzZWxvbmdibG9ja1swXSA9IHVzZWxvbmdibG9ja1sxXSA9IDA7CisKKyAgICAvKiB1cGRhdGUgdGhlIGJsb2NrdHlwZSBvZiB0aGUgcHJldmlvdXMgZ3JhbnVsZSwgc2luY2UgaXQgZGVwZW5kcyBvbiB3aGF0CisgICAgICogaGFwcGVuZCBpbiB0aGlzIGdyYW51bGUgKi8KKyAgICBmb3IgKGNobiA9IDA7IGNobiA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaG4rKykgeworICAgICAgICBibG9ja3R5cGVbY2huXSA9IE5PUk1fVFlQRTsKKyAgICAgICAgLyogZGlzYWJsZSBzaG9ydCBibG9ja3MgKi8KKyAgICAgICAgaWYgKGdmcC0+c2hvcnRfYmxvY2tzID09IHNob3J0X2Jsb2NrX2Rpc3BlbnNlZCkKKyAgICAgICAgICAgIHVzZWxvbmdibG9ja1tjaG5dID0gMTsKKyAgICAgICAgaWYgKGdmcC0+c2hvcnRfYmxvY2tzID09IHNob3J0X2Jsb2NrX2ZvcmNlZCkKKyAgICAgICAgICAgIHVzZWxvbmdibG9ja1tjaG5dID0gMDsKKworICAgICAgICBpZiAodXNlbG9uZ2Jsb2NrW2Nobl0pIHsKKyAgICAgICAgICAgIC8qIG5vIGF0dGFjayA6IHVzZSBsb25nIGJsb2NrcyAqLworICAgICAgICAgICAgYXNzZXJ0KGdmYy0+YmxvY2t0eXBlX29sZFtjaG5dICE9IFNUQVJUX1RZUEUpOworICAgICAgICAgICAgaWYgKGdmYy0+YmxvY2t0eXBlX29sZFtjaG5dID09IFNIT1JUX1RZUEUpCisgICAgICAgICAgICAgICAgYmxvY2t0eXBlW2Nobl0gPSBTVE9QX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBhdHRhY2sgOiB1c2Ugc2hvcnQgYmxvY2tzICovCisgICAgICAgICAgICBibG9ja3R5cGVbY2huXSA9IFNIT1JUX1RZUEU7CisgICAgICAgICAgICBpZiAoZ2ZjLT5ibG9ja3R5cGVfb2xkW2Nobl0gPT0gTk9STV9UWVBFKSB7CisgICAgICAgICAgICAgICAgZ2ZjLT5ibG9ja3R5cGVfb2xkW2Nobl0gPSBTVEFSVF9UWVBFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdmYy0+YmxvY2t0eXBlX29sZFtjaG5dID09IFNUT1BfVFlQRSkKKyAgICAgICAgICAgICAgICBnZmMtPmJsb2NrdHlwZV9vbGRbY2huXSA9IFNIT1JUX1RZUEU7CisgICAgICAgIH0KKworICAgICAgICBibG9ja3R5cGVfZFtjaG5dID0gZ2ZjLT5ibG9ja3R5cGVfb2xkW2Nobl07IC8qIHZhbHVlIHJldHVybmVkIHRvIGNhbGxpbmcgcHJvZ3JhbSAqLworICAgICAgICBnZmMtPmJsb2NrdHlwZV9vbGRbY2huXSA9IGJsb2NrdHlwZVtjaG5dOyAvKiBzYXZlIGZvciBuZXh0IGNhbGwgdG8gbDNwc3lfYW5hbCAqLworICAgIH0KK30KKworCitzdGF0aWMgaW5saW5lIEZMT0FUCitOU19JTlRFUlAoRkxPQVQgeCwgRkxPQVQgeSwgRkxPQVQgcikKK3sKKyAgICAvKiB3YXMgcG93KCh4KSwocikpKnBvdygoeSksMS0ocikpICovCisgICAgaWYgKHIgPj0gMS4wKQorICAgICAgICByZXR1cm4geDsgICAgICAgLyogOTkuNyUgb2YgdGhlIHRpbWUgKi8KKyAgICBpZiAociA8PSAwLjApCisgICAgICAgIHJldHVybiB5OworICAgIGlmICh5ID4gMC4wKQorICAgICAgICByZXR1cm4gcG93KHggLyB5LCByKSAqIHk7IC8qIHJlc3Qgb2YgdGhlIHRpbWUgKi8KKyAgICByZXR1cm4gMC4wOyAgICAgICAgIC8qIG5ldmVyIGhhcHBlbnMgKi8KK30KKworCisKK3N0YXRpYyAgRkxPQVQKK3BlY2FsY19zKElJSV9wc3lfcmF0aW8gY29uc3QgKm1yLCBGTE9BVCBtYXNraW5nX2xvd2VyKQoreworICAgIEZMT0FUICAgcGVfczsKKyAgICBzdGF0aWMgY29uc3QgRkxPQVQgcmVnY29lZl9zW10gPSB7CisgICAgICAgIDExLjgsICAgICAgICAgICAvKiB0aGVzZSB2YWx1ZXMgYXJlIHR1bmVkIG9ubHkgZm9yIDQ0LjFrSHouLi4gKi8KKyAgICAgICAgMTMuNiwKKyAgICAgICAgMTcuMiwKKyAgICAgICAgMzIsCisgICAgICAgIDQ2LjUsCisgICAgICAgIDUxLjMsCisgICAgICAgIDU3LjUsCisgICAgICAgIDY3LjEsCisgICAgICAgIDcxLjUsCisgICAgICAgIDg0LjYsCisgICAgICAgIDk3LjYsCisgICAgICAgIDEzMCwKKy8qICAgICAgMjU1LjggKi8KKyAgICB9OworICAgIHVuc2lnbmVkIGludCBzYiwgc2Jsb2NrOworCisgICAgcGVfcyA9IDEyMzYuMjggLyA0OworICAgIGZvciAoc2IgPSAwOyBzYiA8IFNCTUFYX3MgLSAxOyBzYisrKSB7CisgICAgICAgIGZvciAoc2Jsb2NrID0gMDsgc2Jsb2NrIDwgMzsgc2Jsb2NrKyspIHsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHRobSA9IG1yLT50aG0uc1tzYl1bc2Jsb2NrXTsKKyAgICAgICAgICAgIGFzc2VydChzYiA8IGRpbWVuc2lvbl9vZihyZWdjb2VmX3MpKTsKKyAgICAgICAgICAgIGlmICh0aG0gPiAwLjApIHsKKyAgICAgICAgICAgICAgICBGTE9BVCBjb25zdCB4ID0gdGhtICogbWFza2luZ19sb3dlcjsKKyAgICAgICAgICAgICAgICBGTE9BVCBjb25zdCBlbiA9IG1yLT5lbi5zW3NiXVtzYmxvY2tdOworICAgICAgICAgICAgICAgIGlmIChlbiA+IHgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuID4geCAqIDFlMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlX3MgKz0gcmVnY29lZl9zW3NiXSAqICgxMC4wICogTE9HMTApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHggPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlX3MgKz0gcmVnY29lZl9zW3NiXSAqIEZBU1RfTE9HMTAoZW4gLyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwZV9zOworfQorCitzdGF0aWMgIEZMT0FUCitwZWNhbGNfbChJSUlfcHN5X3JhdGlvIGNvbnN0ICptciwgRkxPQVQgbWFza2luZ19sb3dlcikKK3sKKyAgICBGTE9BVCAgIHBlX2w7CisgICAgc3RhdGljIGNvbnN0IEZMT0FUIHJlZ2NvZWZfbFtdID0geworICAgICAgICA2LjgsICAgICAgICAgICAgLyogdGhlc2UgdmFsdWVzIGFyZSB0dW5lZCBvbmx5IGZvciA0NC4xa0h6Li4uICovCisgICAgICAgIDUuOCwKKyAgICAgICAgNS44LAorICAgICAgICA2LjQsCisgICAgICAgIDYuNSwKKyAgICAgICAgOS45LAorICAgICAgICAxMi4xLAorICAgICAgICAxNC40LAorICAgICAgICAxNSwKKyAgICAgICAgMTguOSwKKyAgICAgICAgMjEuNiwKKyAgICAgICAgMjYuOSwKKyAgICAgICAgMzQuMiwKKyAgICAgICAgNDAuMiwKKyAgICAgICAgNDYuOCwKKyAgICAgICAgNTYuNSwKKyAgICAgICAgNjAuNywKKyAgICAgICAgNzMuOSwKKyAgICAgICAgODUuNywKKyAgICAgICAgOTMuNCwKKyAgICAgICAgMTI2LjEsCisvKiAgICAgIDI0MS4zICovCisgICAgfTsKKyAgICB1bnNpZ25lZCBpbnQgc2I7CisKKyAgICBwZV9sID0gMTEyNC4yMyAvIDQ7CisgICAgZm9yIChzYiA9IDA7IHNiIDwgU0JNQVhfbCAtIDE7IHNiKyspIHsKKyAgICAgICAgRkxPQVQgY29uc3QgdGhtID0gbXItPnRobS5sW3NiXTsKKyAgICAgICAgYXNzZXJ0KHNiIDwgZGltZW5zaW9uX29mKHJlZ2NvZWZfbCkpOworICAgICAgICBpZiAodGhtID4gMC4wKSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCB4ID0gdGhtICogbWFza2luZ19sb3dlcjsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IGVuID0gbXItPmVuLmxbc2JdOworICAgICAgICAgICAgaWYgKGVuID4geCkgeworICAgICAgICAgICAgICAgIGlmIChlbiA+IHggKiAxZTEwKSB7CisgICAgICAgICAgICAgICAgICAgIHBlX2wgKz0gcmVnY29lZl9sW3NiXSAqICgxMC4wICogTE9HMTApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHggPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgcGVfbCArPSByZWdjb2VmX2xbc2JdICogRkFTVF9MT0cxMChlbiAvIHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwZV9sOworfQorCisKK3N0YXRpYyB2b2lkCitjYWxjX2VuZXJneShsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMsIEZMT0FUIGNvbnN0ICpmZnRlbmVyZ3ksCisgICAgICAgICAgICBGTE9BVCAqIGViLCBGTE9BVCAqIG1heCwgRkxPQVQgKiBhdmcpCit7CisgICAgaW50ICAgICBiLCBqOworCisgICAgZm9yIChiID0gaiA9IDA7IGIgPCBnZmMtPm5wYXJ0X2w7ICsrYikgeworICAgICAgICBGTE9BVCAgIGViYiA9IDAsIG0gPSAwOworICAgICAgICBpbnQgICAgIGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZmMtPm51bWxpbmVzX2xbYl07ICsraSwgKytqKSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBlbCA9IGZmdGVuZXJneVtqXTsKKyAgICAgICAgICAgIGFzc2VydChlbCA+PSAwKTsKKyAgICAgICAgICAgIGViYiArPSBlbDsKKyAgICAgICAgICAgIGlmIChtIDwgZWwpCisgICAgICAgICAgICAgICAgbSA9IGVsOworICAgICAgICB9CisgICAgICAgIGViW2JdID0gZWJiOworICAgICAgICBtYXhbYl0gPSBtOworICAgICAgICBhdmdbYl0gPSBlYmIgKiBnZmMtPnJudW1saW5lc19sW2JdOworICAgICAgICBhc3NlcnQoZ2ZjLT5ybnVtbGluZXNfbFtiXSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KGViYiA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KGViW2JdID49IDApOworICAgICAgICBhc3NlcnQobWF4W2JdID49IDApOworICAgICAgICBhc3NlcnQoYXZnW2JdID49IDApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorY2FsY19tYXNrX2luZGV4X2wobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqZ2ZjLCBGTE9BVCBjb25zdCAqbWF4LAorICAgICAgICAgICAgICAgICAgRkxPQVQgY29uc3QgKmF2ZywgdW5zaWduZWQgY2hhciAqbWFza19pZHgpCit7CisgICAgRkxPQVQgICBtLCBhOworICAgIGludCAgICAgYiwgazsKKyAgICBpbnQgY29uc3QgbGFzdF90YWJfZW50cnkgPSBzaXplb2YodGFiKSAvIHNpemVvZih0YWJbMF0pIC0gMTsKKyAgICBiID0gMDsKKyAgICBhID0gYXZnW2JdICsgYXZnW2IgKyAxXTsKKyAgICBhc3NlcnQoYSA+PSAwKTsKKyAgICBpZiAoYSA+IDAuMCkgeworICAgICAgICBtID0gbWF4W2JdOworICAgICAgICBpZiAobSA8IG1heFtiICsgMV0pCisgICAgICAgICAgICBtID0gbWF4W2IgKyAxXTsKKyAgICAgICAgYXNzZXJ0KChnZmMtPm51bWxpbmVzX2xbYl0gKyBnZmMtPm51bWxpbmVzX2xbYiArIDFdIC0gMSkgPiAwKTsKKyAgICAgICAgYSA9IDIwLjAgKiAobSAqIDIuMCAtIGEpCisgICAgICAgICAgICAvIChhICogKGdmYy0+bnVtbGluZXNfbFtiXSArIGdmYy0+bnVtbGluZXNfbFtiICsgMV0gLSAxKSk7CisgICAgICAgIGsgPSAoaW50KSBhOworICAgICAgICBpZiAoayA+IGxhc3RfdGFiX2VudHJ5KQorICAgICAgICAgICAgayA9IGxhc3RfdGFiX2VudHJ5OworICAgICAgICBtYXNrX2lkeFtiXSA9IGs7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtYXNrX2lkeFtiXSA9IDA7CisgICAgfQorCisgICAgZm9yIChiID0gMTsgYiA8IGdmYy0+bnBhcnRfbCAtIDE7IGIrKykgeworICAgICAgICBhID0gYXZnW2IgLSAxXSArIGF2Z1tiXSArIGF2Z1tiICsgMV07CisgICAgICAgIGFzc2VydChhID49IDApOworICAgICAgICBpZiAoYSA+IDAuMCkgeworICAgICAgICAgICAgbSA9IG1heFtiIC0gMV07CisgICAgICAgICAgICBpZiAobSA8IG1heFtiXSkKKyAgICAgICAgICAgICAgICBtID0gbWF4W2JdOworICAgICAgICAgICAgaWYgKG0gPCBtYXhbYiArIDFdKQorICAgICAgICAgICAgICAgIG0gPSBtYXhbYiArIDFdOworICAgICAgICAgICAgYXNzZXJ0KChnZmMtPm51bWxpbmVzX2xbYiAtIDFdICsgZ2ZjLT5udW1saW5lc19sW2JdICsgZ2ZjLT5udW1saW5lc19sW2IgKyAxXSAtIDEpID4gMCk7CisgICAgICAgICAgICBhID0gMjAuMCAqIChtICogMy4wIC0gYSkKKyAgICAgICAgICAgICAgICAvIChhICogKGdmYy0+bnVtbGluZXNfbFtiIC0gMV0gKyBnZmMtPm51bWxpbmVzX2xbYl0gKyBnZmMtPm51bWxpbmVzX2xbYiArIDFdIC0gMSkpOworICAgICAgICAgICAgayA9IChpbnQpIGE7CisgICAgICAgICAgICBpZiAoayA+IGxhc3RfdGFiX2VudHJ5KQorICAgICAgICAgICAgICAgIGsgPSBsYXN0X3RhYl9lbnRyeTsKKyAgICAgICAgICAgIG1hc2tfaWR4W2JdID0gazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1hc2tfaWR4W2JdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoYiA+IDApOworICAgIGFzc2VydChiID09IGdmYy0+bnBhcnRfbCAtIDEpOworCisgICAgYSA9IGF2Z1tiIC0gMV0gKyBhdmdbYl07CisgICAgYXNzZXJ0KGEgPj0gMCk7CisgICAgaWYgKGEgPiAwLjApIHsKKyAgICAgICAgbSA9IG1heFtiIC0gMV07CisgICAgICAgIGlmIChtIDwgbWF4W2JdKQorICAgICAgICAgICAgbSA9IG1heFtiXTsKKyAgICAgICAgYXNzZXJ0KChnZmMtPm51bWxpbmVzX2xbYiAtIDFdICsgZ2ZjLT5udW1saW5lc19sW2JdIC0gMSkgPiAwKTsKKyAgICAgICAgYSA9IDIwLjAgKiAobSAqIDIuMCAtIGEpCisgICAgICAgICAgICAvIChhICogKGdmYy0+bnVtbGluZXNfbFtiIC0gMV0gKyBnZmMtPm51bWxpbmVzX2xbYl0gLSAxKSk7CisgICAgICAgIGsgPSAoaW50KSBhOworICAgICAgICBpZiAoayA+IGxhc3RfdGFiX2VudHJ5KQorICAgICAgICAgICAgayA9IGxhc3RfdGFiX2VudHJ5OworICAgICAgICBtYXNrX2lkeFtiXSA9IGs7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtYXNrX2lkeFtiXSA9IDA7CisgICAgfQorICAgIGFzc2VydChiID09IChnZmMtPm5wYXJ0X2wgLSAxKSk7Cit9CisKKworaW50CitMM3BzeWNob19hbmFsX25zKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsCisgICAgICAgICAgICAgICAgIGNvbnN0IHNhbXBsZV90ICogYnVmZmVyWzJdLCBpbnQgZ3Jfb3V0LAorICAgICAgICAgICAgICAgICBJSUlfcHN5X3JhdGlvIG1hc2tpbmdfcmF0aW9bMl1bMl0sCisgICAgICAgICAgICAgICAgIElJSV9wc3lfcmF0aW8gbWFza2luZ19NU19yYXRpb1syXVsyXSwKKyAgICAgICAgICAgICAgICAgRkxPQVQgcGVyY2VwX2VudHJvcHlbMl0sIEZMT0FUIHBlcmNlcF9NU19lbnRyb3B5WzJdLAorICAgICAgICAgICAgICAgICBGTE9BVCBlbmVyZ3lbNF0sIGludCBibG9ja3R5cGVfZFsyXSkKK3sKKy8qIHRvIGdldCBhIGdvb2QgY2FjaGUgcGVyZm9ybWFuY2UsIG9uZSBoYXMgdG8gdGhpbmsgYWJvdXQKKyAqIHRoZSBzZXF1ZW5jZSwgaW4gd2hpY2ggdGhlIHZhcmlhYmxlcyBhcmUgdXNlZC4gIAorICogKE5vdGU6IHRoZXNlIHN0YXRpYyB2YXJpYWJsZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBnZmMtPiBzdHJ1Y3QsCisgKiBhbmQgdGhlaXIgb3JkZXIgaW4gbWVtb3J5IGlzIGxheWVkIG91dCBpbiB1dGlsLmgpCisgKi8KKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworCisgICAgLyogZmZ0IGFuZCBlbmVyZ3kgY2FsY3VsYXRpb24gICAqLworICAgIEZMT0FUICAgd3NhbXBfTFsyXVtCTEtTSVpFXTsKKyAgICBGTE9BVCAgIHdzYW1wX1NbMl1bM11bQkxLU0laRV9zXTsKKworICAgIC8qIGNvbnZvbHV0aW9uICAgKi8KKyAgICBGTE9BVCAgIGViX2xbQ0JBTkRTICsgMV0sIGViX3NbQ0JBTkRTICsgMV07CisgICAgRkxPQVQgICB0aHJbQ0JBTkRTICsgMl07CisKKyAgICAvKiBibG9jayB0eXBlICAqLworICAgIGludCAgICAgYmxvY2t0eXBlWzJdLCB1c2Vsb25nYmxvY2tbMl07CisKKyAgICAvKiB1c3VhbCB2YXJpYWJsZXMgbGlrZSBsb29wIGluZGljZXMsIGV0Yy4uICAgICovCisgICAgaW50ICAgICBudW1jaG4sIGNobjsKKyAgICBpbnQgICAgIGIsIGksIGosIGs7CisgICAgaW50ICAgICBzYiwgc2Jsb2NrOworCisgICAgLyogdmFyaWFibGVzIHVzZWQgZm9yIC0tbnNwc3l0dW5lICovCisgICAgRkxPQVQgICBuc19ocGZzbXBsWzJdWzU3Nl07CisgICAgRkxPQVQgICBwY2ZhY3Q7CisKKyAgICB1bnNpZ25lZCBjaGFyIG1hc2tfaWR4X2xbQ0JBTkRTICsgMl0sIG1hc2tfaWR4X3NbQ0JBTkRTICsgMl07CisKKyAgICBtZW1zZXQobWFza19pZHhfcywgMCwgc2l6ZW9mKG1hc2tfaWR4X3MpKTsKKworICAgIG51bWNobiA9IGdmYy0+Y2hhbm5lbHNfb3V0OworICAgIC8qIGNobj0yIGFuZCAzID0gTWlkIGFuZCBTaWRlIGNoYW5uZWxzICovCisgICAgaWYgKGdmcC0+bW9kZSA9PSBKT0lOVF9TVEVSRU8pCisgICAgICAgIG51bWNobiA9IDQ7CisKKyAgICBpZiAoZ2ZwLT5WQlIgPT0gdmJyX29mZikKKyAgICAgICAgcGNmYWN0ID0gZ2ZjLT5SZXN2TWF4ID09IDAgPyAwIDogKChGTE9BVCkgZ2ZjLT5SZXN2U2l6ZSkgLyBnZmMtPlJlc3ZNYXggKiAwLjU7CisgICAgZWxzZSBpZiAoZ2ZwLT5WQlIgPT0gdmJyX3JoIHx8IGdmcC0+VkJSID09IHZicl9tdHJoIHx8IGdmcC0+VkJSID09IHZicl9tdCkgeworICAgICAgICAvKnN0YXRpYyBjb25zdCBGTE9BVCBwY1Fuc1sxMF09ezEuMCwxLjAsMS4wLDAuOCwwLjYsMC41LDAuNCwwLjMsMC4yLDAuMX07CisgICAgICAgICAgIHBjZmFjdCA9IHBjUW5zW2dmcC0+VkJSX3FdOyAqLworICAgICAgICBwY2ZhY3QgPSAwLjY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcGNmYWN0ID0gMS4wOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiAgQXBwbHkgSFBGIG9mIGZzLzQgdG8gdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgKiAgVGhpcyBpcyB1c2VkIGZvciBhdHRhY2sgZGV0ZWN0aW9uIC8gaGFuZGxpbmcuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRG9uJ3QgY29weSB0aGUgaW5wdXQgYnVmZmVyIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgLyogdW5yb2xsIHRoZSBsb29wIDIgdGltZXMgKi8KKyAgICBmb3IgKGNobiA9IDA7IGNobiA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaG4rKykgeworICAgICAgICBzdGF0aWMgY29uc3QgRkxPQVQgZmlyY29lZltdID0geworICAgICAgICAgICAgLTguNjUxNjNlLTE4ICogMiwgLTAuMDA4NTE1ODYgKiAyLCAtNi43NDc2NGUtMTggKiAyLCAwLjAyMDkwMzYgKiAyLAorICAgICAgICAgICAgLTMuMzY2MzllLTE3ICogMiwgLTAuMDQzODE2MiAqIDIsIC0xLjU0MTc1ZS0xNyAqIDIsIDAuMDkzMTczOCAqIDIsCisgICAgICAgICAgICAtNS41MjIxMmUtMTcgKiAyLCAtMC4zMTM4MTkgKiAyCisgICAgICAgIH07CisgICAgICAgIC8qIGFwcGx5IGhpZ2ggcGFzcyBmaWx0ZXIgb2YgZnMvNCAqLworICAgICAgICBjb25zdCBzYW1wbGVfdCAqY29uc3QgZmlyYnVmID0gJmJ1ZmZlcltjaG5dWzU3NiAtIDM1MCAtIE5TRklSTEVOICsgMTkyXTsKKyAgICAgICAgYXNzZXJ0KHNpemVvZihmaXJjb2VmKSAvIHNpemVvZihmaXJjb2VmWzBdKSA9PSAoKE5TRklSTEVOIC0gMSkgLyAyKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1NzY7IGkrKykgeworICAgICAgICAgICAgRkxPQVQgICBzdW0xLCBzdW0yOworICAgICAgICAgICAgc3VtMSA9IGZpcmJ1ZltpICsgMTBdOworICAgICAgICAgICAgc3VtMiA9IDAuMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoKE5TRklSTEVOIC0gMSkgLyAyKSAtIDE7IGogKz0gMikgeworICAgICAgICAgICAgICAgIHN1bTEgKz0gZmlyY29lZltqXSAqIChmaXJidWZbaSArIGpdICsgZmlyYnVmW2kgKyBOU0ZJUkxFTiAtIGpdKTsKKyAgICAgICAgICAgICAgICBzdW0yICs9IGZpcmNvZWZbaiArIDFdICogKGZpcmJ1ZltpICsgaiArIDFdICsgZmlyYnVmW2kgKyBOU0ZJUkxFTiAtIGogLSAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuc19ocGZzbXBsW2Nobl1baV0gPSBzdW0xICsgc3VtMjsKKyAgICAgICAgfQorICAgICAgICBtYXNraW5nX3JhdGlvW2dyX291dF1bY2huXS5lbiA9IGdmYy0+ZW5bY2huXTsKKyAgICAgICAgbWFza2luZ19yYXRpb1tncl9vdXRdW2Nobl0udGhtID0gZ2ZjLT50aG1bY2huXTsKKyAgICAgICAgaWYgKG51bWNobiA+IDIpIHsKKyAgICAgICAgICAgIC8qIE1TIG1hc2tpbmdzICAqLworICAgICAgICAgICAgLypwZXJjZXBfTVNfZW50cm9weSAgICAgICAgIFtjaG4tMl0gICAgID0gZ2ZjIC0+IHBlICBbY2huXTsgICovCisgICAgICAgICAgICBtYXNraW5nX01TX3JhdGlvW2dyX291dF1bY2huXS5lbiA9IGdmYy0+ZW5bY2huICsgMl07CisgICAgICAgICAgICBtYXNraW5nX01TX3JhdGlvW2dyX291dF1bY2huXS50aG0gPSBnZmMtPnRobVtjaG4gKyAyXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY2huID0gMDsgY2huIDwgbnVtY2huOyBjaG4rKykgeworICAgICAgICBGTE9BVCgqd3NhbXBfbClbQkxLU0laRV07CisgICAgICAgIEZMT0FUKCp3c2FtcF9zKVszXVtCTEtTSVpFX3NdOworICAgICAgICBGTE9BVCAgIGVuX3N1YnNob3J0WzEyXTsKKyAgICAgICAgRkxPQVQgICBlbl9zaG9ydFs0XSA9IHsgMCB9OworICAgICAgICBGTE9BVCAgIGF0dGFja19pbnRlbnNpdHlbMTJdOworICAgICAgICBpbnQgICAgIG5zX3VzZWxvbmdibG9jayA9IDE7CisgICAgICAgIEZMT0FUICAgYXR0YWNrVGhyZXNob2xkOworICAgICAgICBGTE9BVCAgIG1heFtDQkFORFNdLCBhdmdbQ0JBTkRTXTsKKyAgICAgICAgaW50ICAgICBuc19hdHRhY2tzWzRdID0geyAwIH07CisgICAgICAgIEZMT0FUICAgZmZ0ZW5lcmd5W0hCTEtTSVpFXTsKKyAgICAgICAgRkxPQVQgICBmZnRlbmVyZ3lfc1szXVtIQkxLU0laRV9zXTsKKworCisgICAgICAgIC8qICByaCAyMDA0MDMwMTogdGhlIGZvbGxvd2luZyBsb29wcyBkbyBhY2Nlc3Mgb25lIG9mZiB0aGUgbGltaXRzCisgICAgICAgICAqICBzbyBJIGluY3JlYXNlICB0aGUgYXJyYXkgZGltZW5zaW9ucyBieSBvbmUgYW5kIGluaXRpYWxpemUgdGhlCisgICAgICAgICAqICBhY2Nlc3NlZCB2YWx1ZXMgdG8gemVybworICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KGdmYy0+bnBhcnRfcyA8PSBDQkFORFMpOworICAgICAgICBhc3NlcnQoZ2ZjLT5ucGFydF9sIDw9IENCQU5EUyk7CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAqIGRldGVybWluZSB0aGUgYmxvY2sgdHlwZSAod2luZG93IHR5cGUpCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogY2FsY3VsYXRlIGVuZXJnaWVzIG9mIGVhY2ggc3ViLXNob3J0YmxvY2tzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGVuX3N1YnNob3J0W2ldID0gZ2ZjLT5uc1BzeS5sYXN0X2VuX3N1YnNob3J0W2Nobl1baSArIDZdOworICAgICAgICAgICAgYXNzZXJ0KGdmYy0+bnNQc3kubGFzdF9lbl9zdWJzaG9ydFtjaG5dW2kgKyA0XSA+IDApOworICAgICAgICAgICAgYXR0YWNrX2ludGVuc2l0eVtpXQorICAgICAgICAgICAgICAgID0gZW5fc3Vic2hvcnRbaV0gLyBnZmMtPm5zUHN5Lmxhc3RfZW5fc3Vic2hvcnRbY2huXVtpICsgNF07CisgICAgICAgICAgICBlbl9zaG9ydFswXSArPSBlbl9zdWJzaG9ydFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaG4gPT0gMikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDU3NjsgaSsrKSB7CisgICAgICAgICAgICAgICAgRkxPQVQgICBsLCByOworICAgICAgICAgICAgICAgIGwgPSBuc19ocGZzbXBsWzBdW2ldOworICAgICAgICAgICAgICAgIHIgPSBuc19ocGZzbXBsWzFdW2ldOworICAgICAgICAgICAgICAgIG5zX2hwZnNtcGxbMF1baV0gPSBsICsgcjsKKyAgICAgICAgICAgICAgICBuc19ocGZzbXBsWzFdW2ldID0gbCAtIHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgKnBmID0gbnNfaHBmc21wbFtjaG4gJiAxXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgICAgICAgICAgICBGTE9BVCBjb25zdCAqY29uc3QgcGZlID0gcGYgKyA1NzYgLyA5OworICAgICAgICAgICAgICAgIEZMT0FUICAgcCA9IDEuOworICAgICAgICAgICAgICAgIGZvciAoOyBwZiA8IHBmZTsgcGYrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPCBmYWJzKCpwZikpCisgICAgICAgICAgICAgICAgICAgICAgICBwID0gZmFicygqcGYpOworCisgICAgICAgICAgICAgICAgZ2ZjLT5uc1BzeS5sYXN0X2VuX3N1YnNob3J0W2Nobl1baV0gPSBlbl9zdWJzaG9ydFtpICsgM10gPSBwOworICAgICAgICAgICAgICAgIGVuX3Nob3J0WzEgKyBpIC8gM10gKz0gcDsKKyAgICAgICAgICAgICAgICBpZiAocCA+IGVuX3N1YnNob3J0W2kgKyAzIC0gMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGVuX3N1YnNob3J0W2kgKyAzIC0gMl0gPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IHAgLyBlbl9zdWJzaG9ydFtpICsgMyAtIDJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChlbl9zdWJzaG9ydFtpICsgMyAtIDJdID4gcCAqIDEwLjApIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHAgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGVuX3N1YnNob3J0W2kgKyAzIC0gMl0gLyAocCAqIDEwLjApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHAgPSAwLjA7CisgICAgICAgICAgICAgICAgYXR0YWNrX2ludGVuc2l0eVtpICsgM10gPSBwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdmcC0+YW5hbHlzaXMpIHsKKyAgICAgICAgICAgIEZMT0FUICAgeCA9IGF0dGFja19pbnRlbnNpdHlbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTI7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoeCA8IGF0dGFja19pbnRlbnNpdHlbaV0pCisgICAgICAgICAgICAgICAgICAgIHggPSBhdHRhY2tfaW50ZW5zaXR5W2ldOworICAgICAgICAgICAgZ2ZjLT5waW5mby0+ZXJzW2dyX291dF1bY2huXSA9IGdmYy0+cGluZm8tPmVyc19zYXZlW2Nobl07CisgICAgICAgICAgICBnZmMtPnBpbmZvLT5lcnNfc2F2ZVtjaG5dID0geDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbXBhcmUgZW5lcmdpZXMgYmV0d2VlbiBzdWItc2hvcnRibG9ja3MgKi8KKyAgICAgICAgYXR0YWNrVGhyZXNob2xkID0gKGNobiA9PSAzKQorICAgICAgICAgICAgPyBnZmMtPm5zUHN5LmF0dGFja3RocmVfcyA6IGdmYy0+bnNQc3kuYXR0YWNrdGhyZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgICAgICAgICBpZiAoIW5zX2F0dGFja3NbaSAvIDNdICYmIGF0dGFja19pbnRlbnNpdHlbaV0gPiBhdHRhY2tUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgbnNfYXR0YWNrc1tpIC8gM10gPSAoaSAlIDMpICsgMTsKKworICAgICAgICAvKiBzaG91bGQgaGF2ZSBlbmVyZ3kgY2hhbmdlIGJldHdlZW4gc2hvcnQgYmxvY2tzLAorICAgICAgICAgICBpbiBvcmRlciB0byBhdm9pZCBwZXJpb2RpYyBzaWduYWxzICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0ICAgcmF0aW87CisgICAgICAgICAgICBpZiAoZW5fc2hvcnRbaSAtIDFdID4gZW5fc2hvcnRbaV0pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoZW5fc2hvcnRbaV0gPiAwKTsKKyAgICAgICAgICAgICAgICByYXRpbyA9IGVuX3Nob3J0W2kgLSAxXSAvIGVuX3Nob3J0W2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGVuX3Nob3J0W2kgLSAxXSA+IDApOworICAgICAgICAgICAgICAgIHJhdGlvID0gZW5fc2hvcnRbaV0gLyBlbl9zaG9ydFtpIC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmF0aW8gPCAxLjcpIHsKKyAgICAgICAgICAgICAgICBuc19hdHRhY2tzW2ldID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBuc19hdHRhY2tzWzBdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuc19hdHRhY2tzWzBdICYmIGdmYy0+bnNQc3kubGFzdF9hdHRhY2tzW2Nobl0pCisgICAgICAgICAgICBuc19hdHRhY2tzWzBdID0gMDsKKworICAgICAgICBpZiAoZ2ZjLT5uc1BzeS5sYXN0X2F0dGFja3NbY2huXSA9PSAzIHx8CisgICAgICAgICAgICBuc19hdHRhY2tzWzBdICsgbnNfYXR0YWNrc1sxXSArIG5zX2F0dGFja3NbMl0gKyBuc19hdHRhY2tzWzNdKSB7CisgICAgICAgICAgICBuc191c2Vsb25nYmxvY2sgPSAwOworCisgICAgICAgICAgICBpZiAobnNfYXR0YWNrc1sxXSAmJiBuc19hdHRhY2tzWzBdKQorICAgICAgICAgICAgICAgIG5zX2F0dGFja3NbMV0gPSAwOworICAgICAgICAgICAgaWYgKG5zX2F0dGFja3NbMl0gJiYgbnNfYXR0YWNrc1sxXSkKKyAgICAgICAgICAgICAgICBuc19hdHRhY2tzWzJdID0gMDsKKyAgICAgICAgICAgIGlmIChuc19hdHRhY2tzWzNdICYmIG5zX2F0dGFja3NbMl0pCisgICAgICAgICAgICAgICAgbnNfYXR0YWNrc1szXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2huIDwgMikgeworICAgICAgICAgICAgdXNlbG9uZ2Jsb2NrW2Nobl0gPSBuc191c2Vsb25nYmxvY2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobnNfdXNlbG9uZ2Jsb2NrID09IDApIHsKKyAgICAgICAgICAgICAgICB1c2Vsb25nYmxvY2tbMF0gPSB1c2Vsb25nYmxvY2tbMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdGhlcmUgaXMgYSBvbmUgZ3JhbnVsZSBkZWxheS4gIENvcHkgbWFza2luZ3MgY29tcHV0ZWQgbGFzdCBjYWxsCisgICAgICAgICAqIGludG8gbWFza2luZ19yYXRpbyB0byByZXR1cm4gdG8gY2FsbGluZyBwcm9ncmFtLgorICAgICAgICAgKi8KKyAgICAgICAgZW5lcmd5W2Nobl0gPSBnZmMtPnRvdF9lbmVyW2Nobl07CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogIGNvbXB1dGUgRkZUcworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHdzYW1wX3MgPSB3c2FtcF9TICsgKGNobiAmIDEpOworICAgICAgICB3c2FtcF9sID0gd3NhbXBfTCArIChjaG4gJiAxKTsKKyAgICAgICAgY29tcHV0ZV9mZnRzKGdmcCwgZmZ0ZW5lcmd5LCBmZnRlbmVyZ3lfcywgd3NhbXBfbCwgd3NhbXBfcywgZ3Jfb3V0LCBjaG4sIGJ1ZmZlcik7CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICogICAgQ2FsY3VsYXRlIHRoZSBlbmVyZ3kgYW5kIHRoZSB0b25hbGl0eSBvZiBlYWNoIHBhcnRpdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGNhbGNfZW5lcmd5KGdmYywgZmZ0ZW5lcmd5LCBlYl9sLCBtYXgsIGF2Zyk7CisgICAgICAgIGNhbGNfbWFza19pbmRleF9sKGdmYywgbWF4LCBhdmcsIG1hc2tfaWR4X2wpOworCisgICAgICAgIC8qIGNvbXB1dGUgbWFza2luZyB0aHJlc2hvbGRzIGZvciBzaG9ydCBibG9ja3MgKi8KKyAgICAgICAgZm9yIChzYmxvY2sgPSAwOyBzYmxvY2sgPCAzOyBzYmxvY2srKykgeworICAgICAgICAgICAgRkxPQVQgICBlbm4sIHRobW07CisgICAgICAgICAgICBjb21wdXRlX21hc2tpbmdfcyhnZnAsIGZmdGVuZXJneV9zLCBlYl9zLCB0aHIsIGNobiwgc2Jsb2NrKTsKKyAgICAgICAgICAgIGNvbnZlcnRfcGFydGl0aW9uMnNjYWxlZmFjX3MoZ2ZjLCBlYl9zLCB0aHIsIGNobiwgc2Jsb2NrKTsKKworICAgICAgICAgICAgLyoqKiogICBzaG9ydCBibG9jayBwcmUtZWNobyBjb250cm9sICAgKioqKi8KKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IFNCTUFYX3M7IHNiKyspIHsKKyAgICAgICAgICAgICAgICB0aG1tID0gZ2ZjLT50aG1bY2huXS5zW3NiXVtzYmxvY2tdOworCisgICAgICAgICAgICAgICAgdGhtbSAqPSBOU19QUkVFQ0hPX0FUVDA7CisgICAgICAgICAgICAgICAgaWYgKG5zX2F0dGFja3Nbc2Jsb2NrXSA+PSAyIHx8IG5zX2F0dGFja3Nbc2Jsb2NrICsgMV0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29uc3QgaWR4ID0gKHNibG9jayAhPSAwKSA/IHNibG9jayAtIDEgOiAyOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29uc3QgcCA9IE5TX0lOVEVSUChnZmMtPnRobVtjaG5dLnNbc2JdW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRobW0sIE5TX1BSRUVDSE9fQVRUMSAqIHBjZmFjdCk7CisgICAgICAgICAgICAgICAgICAgIHRobW0gPSBNaW4odGhtbSwgcCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5zX2F0dGFja3Nbc2Jsb2NrXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb25zdCBpZHggPSAoc2Jsb2NrICE9IDApID8gc2Jsb2NrIC0gMSA6IDI7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb25zdCBwID0gTlNfSU5URVJQKGdmYy0+dGhtW2Nobl0uc1tzYl1baWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhtbSwgTlNfUFJFRUNIT19BVFQyICogcGNmYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhtbSA9IE1pbih0aG1tLCBwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHNibG9jayAhPSAwICYmIG5zX2F0dGFja3Nbc2Jsb2NrIC0gMV0gPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc2Jsb2NrID09IDAgJiYgZ2ZjLT5uc1BzeS5sYXN0X2F0dGFja3NbY2huXSA9PSAzKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29uc3QgaWR4ID0gKHNibG9jayAhPSAyKSA/IHNibG9jayArIDEgOiAwOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29uc3QgcCA9IE5TX0lOVEVSUChnZmMtPnRobVtjaG5dLnNbc2JdW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRobW0sIE5TX1BSRUVDSE9fQVRUMiAqIHBjZmFjdCk7CisgICAgICAgICAgICAgICAgICAgIHRobW0gPSBNaW4odGhtbSwgcCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcHVsc2UgbGlrZSBzaWduYWwgZGV0ZWN0aW9uIGZvciBmYXRib3kud2F2IGFuZCBzbyBvbiAqLworICAgICAgICAgICAgICAgIGVubiA9IGVuX3N1YnNob3J0W3NibG9jayAqIDMgKyAzXSArIGVuX3N1YnNob3J0W3NibG9jayAqIDMgKyA0XQorICAgICAgICAgICAgICAgICAgICArIGVuX3N1YnNob3J0W3NibG9jayAqIDMgKyA1XTsKKyAgICAgICAgICAgICAgICBpZiAoZW5fc3Vic2hvcnRbc2Jsb2NrICogMyArIDVdICogNiA8IGVubikgeworICAgICAgICAgICAgICAgICAgICB0aG1tICo9IDAuNTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuX3N1YnNob3J0W3NibG9jayAqIDMgKyA0XSAqIDYgPCBlbm4pCisgICAgICAgICAgICAgICAgICAgICAgICB0aG1tICo9IDAuNTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnZmMtPnRobVtjaG5dLnNbc2JdW3NibG9ja10gPSB0aG1tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdmYy0+bnNQc3kubGFzdF9hdHRhY2tzW2Nobl0gPSBuc19hdHRhY2tzWzJdOworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqICAgICAgY29udm9sdmUgdGhlIHBhcnRpdGlvbmVkIGVuZXJneSBhbmQgdW5wcmVkaWN0YWJpbGl0eQorICAqICAgICAgd2l0aCB0aGUgc3ByZWFkaW5nIGZ1bmN0aW9uLCBzM19sW2JdW2tdCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBrID0gMDsKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IGdmYy0+bnBhcnRfbDsgYisrKSB7CisgICAgICAgICAgICAgICAgRkxPQVQgICBlYjI7CisgICAgICAgICAgICAgICAgRkxPQVQgICBlY2I7CisgICAgICAgICAgICAgICAgLyogY29udm9sdmUgdGhlIHBhcnRpdGlvbmVkIGVuZXJneSB3aXRoIHRoZSBzcHJlYWRpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBpbnQgICAgIGtrID0gZ2ZjLT5zM2luZFtiXVswXTsKKyAgICAgICAgICAgICAgICBlYjIgPSBlYl9sW2trXSAqIHRhYlttYXNrX2lkeF9sW2trXV07CisgICAgICAgICAgICAgICAgZWNiID0gZ2ZjLT5zM19sbFtrKytdICogZWIyOworICAgICAgICAgICAgICAgIHdoaWxlICgrK2trIDw9IGdmYy0+czNpbmRbYl1bMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgZWIyID0gZWJfbFtra10gKiB0YWJbbWFza19pZHhfbFtra11dOworICAgICAgICAgICAgICAgICAgICBlY2IgPSBtYXNrX2FkZChlY2IsIGdmYy0+czNfbGxbaysrXSAqIGViMiwga2ssIGtrIC0gYiwgZ2ZjLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWNiICo9IDAuMTU4NDg5MzE5MjQ2MTExOyAvKiBwb3coMTAsLTAuOCkgKi8KKworICAgICAgICAgICAgICAgIC8qKioqICAgbG9uZyBibG9jayBwcmUtZWNobyBjb250cm9sICAgKioqKi8KKyAgICAgICAgICAgICAgICAvKiBkb250IHVzZSBsb25nIGJsb2NrIHByZS1lY2hvIGNvbnRyb2wgaWYgcHJldmlvdXMgZ3JhbnVsZSB3YXMgCisgICAgICAgICAgICAgICAgICogYSBzaG9ydCBibG9jay4gIFRoaXMgaXMgdG8gYXZvaWQgdGhlIHNpdHVhdGlvbjogICAKKyAgICAgICAgICAgICAgICAgKiBmcmFtZTA6ICBxdWlldCAodmVyeSBsb3cgbWFza2luZykgIAorICAgICAgICAgICAgICAgICAqIGZyYW1lMTogIHN1cmdlICAodHJpZ2dlcnMgc2hvcnQgYmxvY2tzKQorICAgICAgICAgICAgICAgICAqIGZyYW1lMjogIHJlZ3VsYXIgZnJhbWUuICBsb29rcyBsaWtlIHByZS1lY2hvIHdoZW4gY29tcGFyZWQgdG8gCisgICAgICAgICAgICAgICAgICogICAgICAgICAgZnJhbWUwLCBidXQgYWxsIHByZS1lY2hvIHdhcyBpbiBmcmFtZTEuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogY2huPTAsMSAgIEwgYW5kIFIgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICBjaG49MiwzICAgUyBhbmQgTSBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGlmIChnZmMtPmJsb2NrdHlwZV9vbGRbY2huICYgMV0gPT0gU0hPUlRfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgdGhyW2JdID0gZWNiOyAvKiBNaW4oZWNiLCBycGVsZXYqZ2ZjLT5uYl8xW2Nobl1bYl0pOyAqLworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyW2JdID0gTlNfSU5URVJQKE1pbihlY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluKHJwZWxldiAqIGdmYy0+bmJfMVtjaG5dW2JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycGVsZXYyICogZ2ZjLT5uYl8yW2Nobl1bYl0pKSwgZWNiLCBwY2ZhY3QpOworCisgICAgICAgICAgICAgICAgZ2ZjLT5uYl8yW2Nobl1bYl0gPSBnZmMtPm5iXzFbY2huXVtiXTsKKyAgICAgICAgICAgICAgICBnZmMtPm5iXzFbY2huXVtiXSA9IGVjYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgYiA8PSBDQkFORFM7ICsrYikgeworICAgICAgICAgICAgZWJfbFtiXSA9IDA7CisgICAgICAgICAgICB0aHJbYl0gPSAwOworICAgICAgICB9CisgICAgICAgIC8qIGNvbXB1dGUgbWFza2luZyB0aHJlc2hvbGRzIGZvciBsb25nIGJsb2NrcyAqLworICAgICAgICBjb252ZXJ0X3BhcnRpdGlvbjJzY2FsZWZhY19sKGdmYywgZWJfbCwgdGhyLCBjaG4pOworCisgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgbG9vcCBvdmVyIGNobiAqLworCisgICAgaWYgKGdmcC0+bW9kZSA9PSBTVEVSRU8gfHwgZ2ZwLT5tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICBpZiAoZ2ZwLT5pbnRlckNoUmF0aW8gPiAwLjApIHsKKyAgICAgICAgICAgIGNhbGNfaW50ZXJjaGFubmVsX21hc2tpbmcoZ2ZwLCBnZnAtPmludGVyQ2hSYXRpbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2ZwLT5tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICBGTE9BVCAgIG1zZml4OworICAgICAgICBtc2ZpeDEoZ2ZjKTsKKyAgICAgICAgbXNmaXggPSBnZnAtPm1zZml4OworICAgICAgICBpZiAoZmFicyhtc2ZpeCkgPiAwLjApCisgICAgICAgICAgICBuc19tc2ZpeChnZmMsIG1zZml4LCBnZnAtPkFUSGxvd2VyICogZ2ZjLT5BVEgtPmFkanVzdCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgKiBkZXRlcm1pbmUgZmluYWwgYmxvY2sgdHlwZQorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgYmxvY2tfdHlwZV9zZXQoZ2ZwLCB1c2Vsb25nYmxvY2ssIGJsb2NrdHlwZV9kLCBibG9ja3R5cGUpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIGNvbXB1dGUgdGhlIHZhbHVlIG9mIFBFIHRvIHJldHVybiAuLi4gbm8gZGVsYXkgYW5kIGFkdmFuY2UKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZvciAoY2huID0gMDsgY2huIDwgbnVtY2huOyBjaG4rKykgeworICAgICAgICBGTE9BVCAgKnBwZTsKKyAgICAgICAgaW50ICAgICB0eXBlOworICAgICAgICBJSUlfcHN5X3JhdGlvIGNvbnN0ICptcjsKKworICAgICAgICBpZiAoY2huID4gMSkgeworICAgICAgICAgICAgcHBlID0gcGVyY2VwX01TX2VudHJvcHkgLSAyOworICAgICAgICAgICAgdHlwZSA9IE5PUk1fVFlQRTsKKyAgICAgICAgICAgIGlmIChibG9ja3R5cGVfZFswXSA9PSBTSE9SVF9UWVBFIHx8IGJsb2NrdHlwZV9kWzFdID09IFNIT1JUX1RZUEUpCisgICAgICAgICAgICAgICAgdHlwZSA9IFNIT1JUX1RZUEU7CisgICAgICAgICAgICBtciA9ICZtYXNraW5nX01TX3JhdGlvW2dyX291dF1bY2huIC0gMl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcGUgPSBwZXJjZXBfZW50cm9weTsKKyAgICAgICAgICAgIHR5cGUgPSBibG9ja3R5cGVfZFtjaG5dOworICAgICAgICAgICAgbXIgPSAmbWFza2luZ19yYXRpb1tncl9vdXRdW2Nobl07CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSA9PSBTSE9SVF9UWVBFKQorICAgICAgICAgICAgcHBlW2Nobl0gPSBwZWNhbGNfcyhtciwgZ2ZjLT5tYXNraW5nX2xvd2VyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHBlW2Nobl0gPSBwZWNhbGNfbChtciwgZ2ZjLT5tYXNraW5nX2xvd2VyKTsKKworCisgICAgICAgIGlmIChnZnAtPmFuYWx5c2lzKQorICAgICAgICAgICAgZ2ZjLT5waW5mby0+cGVbZ3Jfb3V0XVtjaG5dID0gcHBlW2Nobl07CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworc3RhdGljIHZvaWQKK3ZicnBzeV9jb21wdXRlX2ZmdF9sKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIGNvbnN0IHNhbXBsZV90ICogYnVmZmVyWzJdLCBpbnQgY2huLCBpbnQgZ3Jfb3V0LAorICAgICAgICAgICAgICAgICAgICAgRkxPQVQgZmZ0ZW5lcmd5W0hCTEtTSVpFXSwgRkxPQVQoKndzYW1wX2wpW0JMS1NJWkVdKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBqOworCisgICAgaWYgKGNobiA8IDIpIHsKKyAgICAgICAgZmZ0X2xvbmcoZ2ZjLCAqd3NhbXBfbCwgY2huLCBidWZmZXIpOworICAgIH0KKyAgICBlbHNlIGlmIChjaG4gPT0gMikgeworICAgICAgICAvKiBGRlQgZGF0YSBmb3IgbWlkIGFuZCBzaWRlIGNoYW5uZWwgaXMgZGVyaXZlZCBmcm9tIEwgJiBSICovCisgICAgICAgIGZvciAoaiA9IEJMS1NJWkUgLSAxOyBqID49IDA7IC0taikgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgbCA9IHdzYW1wX2xbMF1bal07CisgICAgICAgICAgICBGTE9BVCBjb25zdCByID0gd3NhbXBfbFsxXVtqXTsKKyAgICAgICAgICAgIHdzYW1wX2xbMF1bal0gPSAobCArIHIpICogKEZMT0FUKSAoU1FSVDIgKiAwLjUpOworICAgICAgICAgICAgd3NhbXBfbFsxXVtqXSA9IChsIC0gcikgKiAoRkxPQVQpIChTUVJUMiAqIDAuNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgY29tcHV0ZSBlbmVyZ2llcworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBmZnRlbmVyZ3lbMF0gPSBOT05fTElORUFSX1NDQUxFX0VORVJHWSh3c2FtcF9sWzBdWzBdKTsKKyAgICBmZnRlbmVyZ3lbMF0gKj0gZmZ0ZW5lcmd5WzBdOworCisgICAgZm9yIChqID0gQkxLU0laRSAvIDIgLSAxOyBqID49IDA7IC0taikgeworICAgICAgICBGTE9BVCBjb25zdCByZSA9ICgqd3NhbXBfbClbQkxLU0laRSAvIDIgLSBqXTsKKyAgICAgICAgRkxPQVQgY29uc3QgaW0gPSAoKndzYW1wX2wpW0JMS1NJWkUgLyAyICsgal07CisgICAgICAgIGZmdGVuZXJneVtCTEtTSVpFIC8gMiAtIGpdID0gTk9OX0xJTkVBUl9TQ0FMRV9FTkVSR1koKHJlICogcmUgKyBpbSAqIGltKSAqIDAuNWYpOworICAgIH0KKyAgICAvKiB0b3RhbCBlbmVyZ3kgKi8KKyAgICB7CisgICAgICAgIEZMT0FUICAgdG90YWxlbmVyZ3kgPSAwLjA7CisgICAgICAgIGZvciAoaiA9IDExOyBqIDwgSEJMS1NJWkU7IGorKykKKyAgICAgICAgICAgIHRvdGFsZW5lcmd5ICs9IGZmdGVuZXJneVtqXTsKKworICAgICAgICBnZmMtPnRvdF9lbmVyW2Nobl0gPSB0b3RhbGVuZXJneTsKKyAgICB9CisKKyAgICBpZiAoZ2ZwLT5hbmFseXNpcykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgSEJMS1NJWkU7IGorKykgeworICAgICAgICAgICAgZ2ZjLT5waW5mby0+ZW5lcmd5W2dyX291dF1bY2huXVtqXSA9IGdmYy0+cGluZm8tPmVuZXJneV9zYXZlW2Nobl1bal07CisgICAgICAgICAgICBnZmMtPnBpbmZvLT5lbmVyZ3lfc2F2ZVtjaG5dW2pdID0gZmZ0ZW5lcmd5W2pdOworICAgICAgICB9CisgICAgICAgIGdmYy0+cGluZm8tPnBlW2dyX291dF1bY2huXSA9IGdmYy0+cGVbY2huXTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3ZicnBzeV9jb21wdXRlX2ZmdF9zKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIGNvbnN0IHNhbXBsZV90ICogYnVmZmVyWzJdLCBpbnQgY2huLCBpbnQgc2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgRkxPQVQoKmZmdGVuZXJneV9zKVtIQkxLU0laRV9zXSwgRkxPQVQoKndzYW1wX3MpWzNdW0JMS1NJWkVfc10pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGo7CisKKyAgICBpZiAoc2Jsb2NrID09IDAgJiYgY2huIDwgMikgeworICAgICAgICBmZnRfc2hvcnQoZ2ZjLCAqd3NhbXBfcywgY2huLCBidWZmZXIpOworICAgIH0KKyAgICBpZiAoY2huID09IDIpIHsKKyAgICAgICAgLyogRkZUIGRhdGEgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsIGlzIGRlcml2ZWQgZnJvbSBMICYgUiAqLworICAgICAgICBmb3IgKGogPSBCTEtTSVpFX3MgLSAxOyBqID49IDA7IC0taikgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgbCA9IHdzYW1wX3NbMF1bc2Jsb2NrXVtqXTsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHIgPSB3c2FtcF9zWzFdW3NibG9ja11bal07CisgICAgICAgICAgICB3c2FtcF9zWzBdW3NibG9ja11bal0gPSAobCArIHIpICogKEZMT0FUKSAoU1FSVDIgKiAwLjUpOworICAgICAgICAgICAgd3NhbXBfc1sxXVtzYmxvY2tdW2pdID0gKGwgLSByKSAqIChGTE9BVCkgKFNRUlQyICogMC41KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICBjb21wdXRlIGVuZXJnaWVzCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZmdGVuZXJneV9zW3NibG9ja11bMF0gPSAoKndzYW1wX3MpW3NibG9ja11bMF07CisgICAgZmZ0ZW5lcmd5X3Nbc2Jsb2NrXVswXSAqPSBmZnRlbmVyZ3lfc1tzYmxvY2tdWzBdOworICAgIGZvciAoaiA9IEJMS1NJWkVfcyAvIDIgLSAxOyBqID49IDA7IC0taikgeworICAgICAgICBGTE9BVCBjb25zdCByZSA9ICgqd3NhbXBfcylbc2Jsb2NrXVtCTEtTSVpFX3MgLyAyIC0gal07CisgICAgICAgIEZMT0FUIGNvbnN0IGltID0gKCp3c2FtcF9zKVtzYmxvY2tdW0JMS1NJWkVfcyAvIDIgKyBqXTsKKyAgICAgICAgZmZ0ZW5lcmd5X3Nbc2Jsb2NrXVtCTEtTSVpFX3MgLyAyIC0gal0gPQorICAgICAgICAgICAgTk9OX0xJTkVBUl9TQ0FMRV9FTkVSR1koKHJlICogcmUgKyBpbSAqIGltKSAqIDAuNWYpOworICAgIH0KK30KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogY29tcHV0ZSBsb3VkbmVzcyBhcHByb3hpbWF0aW9uICh1c2VkIGZvciBBVEggYXV0by1sZXZlbCBhZGp1c3RtZW50KSAKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordmJycHN5X2NvbXB1dGVfbG91ZG5lc3NfYXBwcm94aW1hdGlvbl9sKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIGludCBncl9vdXQsIGludCBjaG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgZmZ0ZW5lcmd5W0hCTEtTSVpFXSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGlmIChnZnAtPmF0aGFhX2xvdWRhcHByb3ggPT0gMiAmJiBjaG4gPCAyKSB7IC8qbm8gbG91ZG5lc3MgZm9yIG1pZC9zaWRlIGNoICovCisgICAgICAgIGdmYy0+bG91ZG5lc3Nfc3FbZ3Jfb3V0XVtjaG5dID0gZ2ZjLT5sb3VkbmVzc19zcV9zYXZlW2Nobl07CisgICAgICAgIGdmYy0+bG91ZG5lc3Nfc3Ffc2F2ZVtjaG5dID0gcHN5Y2hvX2xvdWRuZXNzX2FwcHJveChmZnRlbmVyZ3ksIGdmYyk7CisgICAgfQorfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIEFwcGx5IEhQRiBvZiBmcy80IHRvIHRoZSBpbnB1dCBzaWduYWwuCisgICAgKiAgVGhpcyBpcyB1c2VkIGZvciBhdHRhY2sgZGV0ZWN0aW9uIC8gaGFuZGxpbmcuCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit2YnJwc3lfYXR0YWNrX2RldGVjdGlvbihsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBjb25zdCBzYW1wbGVfdCAqIGJ1ZmZlclsyXSwgaW50IGdyX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElJSV9wc3lfcmF0aW8gbWFza2luZ19yYXRpb1syXVsyXSwgSUlJX3BzeV9yYXRpbyBtYXNraW5nX01TX3JhdGlvWzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgZW5lcmd5WzRdLCBGTE9BVCBzdWJfc2hvcnRfZmFjdG9yWzRdWzNdLCBpbnQgbnNfYXR0YWNrc1s0XVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2Vsb25nYmxvY2tbMl0pCit7CisgICAgRkxPQVQgICBuc19ocGZzbXBsWzJdWzU3Nl07CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgY29uc3Qgbl9jaG5fb3V0ID0gZ2ZjLT5jaGFubmVsc19vdXQ7CisgICAgLyogY2huPTIgYW5kIDMgPSBNaWQgYW5kIFNpZGUgY2hhbm5lbHMgKi8KKyAgICBpbnQgY29uc3Qgbl9jaG5fcHN5ID0gKGdmcC0+bW9kZSA9PSBKT0lOVF9TVEVSRU8pID8gNCA6IG5fY2huX291dDsKKyAgICBpbnQgICAgIGNobiwgaSwgajsKKyAgICAvKiBEb24ndCBjb3B5IHRoZSBpbnB1dCBidWZmZXIgaW50byBhIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAvKiB1bnJvbGwgdGhlIGxvb3AgMiB0aW1lcyAqLworICAgIGZvciAoY2huID0gMDsgY2huIDwgbl9jaG5fb3V0OyBjaG4rKykgeworICAgICAgICBzdGF0aWMgY29uc3QgRkxPQVQgZmlyY29lZltdID0geworICAgICAgICAgICAgLTguNjUxNjNlLTE4ICogMiwgLTAuMDA4NTE1ODYgKiAyLCAtNi43NDc2NGUtMTggKiAyLCAwLjAyMDkwMzYgKiAyLAorICAgICAgICAgICAgLTMuMzY2MzllLTE3ICogMiwgLTAuMDQzODE2MiAqIDIsIC0xLjU0MTc1ZS0xNyAqIDIsIDAuMDkzMTczOCAqIDIsCisgICAgICAgICAgICAtNS41MjIxMmUtMTcgKiAyLCAtMC4zMTM4MTkgKiAyCisgICAgICAgIH07CisgICAgICAgIC8qIGFwcGx5IGhpZ2ggcGFzcyBmaWx0ZXIgb2YgZnMvNCAqLworICAgICAgICBjb25zdCBzYW1wbGVfdCAqY29uc3QgZmlyYnVmID0gJmJ1ZmZlcltjaG5dWzU3NiAtIDM1MCAtIE5TRklSTEVOICsgMTkyXTsKKyAgICAgICAgYXNzZXJ0KGRpbWVuc2lvbl9vZihmaXJjb2VmKSA9PSAoKE5TRklSTEVOIC0gMSkgLyAyKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1NzY7IGkrKykgeworICAgICAgICAgICAgRkxPQVQgICBzdW0xLCBzdW0yOworICAgICAgICAgICAgc3VtMSA9IGZpcmJ1ZltpICsgMTBdOworICAgICAgICAgICAgc3VtMiA9IDAuMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoKE5TRklSTEVOIC0gMSkgLyAyKSAtIDE7IGogKz0gMikgeworICAgICAgICAgICAgICAgIHN1bTEgKz0gZmlyY29lZltqXSAqIChmaXJidWZbaSArIGpdICsgZmlyYnVmW2kgKyBOU0ZJUkxFTiAtIGpdKTsKKyAgICAgICAgICAgICAgICBzdW0yICs9IGZpcmNvZWZbaiArIDFdICogKGZpcmJ1ZltpICsgaiArIDFdICsgZmlyYnVmW2kgKyBOU0ZJUkxFTiAtIGogLSAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuc19ocGZzbXBsW2Nobl1baV0gPSBzdW0xICsgc3VtMjsKKyAgICAgICAgfQorICAgICAgICBtYXNraW5nX3JhdGlvW2dyX291dF1bY2huXS5lbiA9IGdmYy0+ZW5bY2huXTsKKyAgICAgICAgbWFza2luZ19yYXRpb1tncl9vdXRdW2Nobl0udGhtID0gZ2ZjLT50aG1bY2huXTsKKyAgICAgICAgaWYgKG5fY2huX3BzeSA+IDIpIHsKKyAgICAgICAgICAgIC8qIE1TIG1hc2tpbmdzICAqLworICAgICAgICAgICAgLypwZXJjZXBfTVNfZW50cm9weSAgICAgICAgIFtjaG4tMl0gICAgID0gZ2ZjIC0+IHBlICBbY2huXTsgICovCisgICAgICAgICAgICBtYXNraW5nX01TX3JhdGlvW2dyX291dF1bY2huXS5lbiA9IGdmYy0+ZW5bY2huICsgMl07CisgICAgICAgICAgICBtYXNraW5nX01TX3JhdGlvW2dyX291dF1bY2huXS50aG0gPSBnZmMtPnRobVtjaG4gKyAyXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNobiA9IDA7IGNobiA8IG5fY2huX3BzeTsgY2huKyspIHsKKyAgICAgICAgRkxPQVQgICBhdHRhY2tfaW50ZW5zaXR5WzEyXTsKKyAgICAgICAgRkxPQVQgICBlbl9zdWJzaG9ydFsxMl07CisgICAgICAgIEZMT0FUICAgZW5fc2hvcnRbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgICAgRkxPQVQgY29uc3QgKnBmID0gbnNfaHBmc21wbFtjaG4gJiAxXTsKKyAgICAgICAgRkxPQVQgY29uc3QgYXR0YWNrVGhyZXNob2xkID0gKGNobiA9PSAzKSA/IGdmYy0+bnNQc3kuYXR0YWNrdGhyZV9zIDogZ2ZjLT5uc1BzeS5hdHRhY2t0aHJlOworICAgICAgICBpbnQgICAgIG5zX3VzZWxvbmdibG9jayA9IDE7CisKKyAgICAgICAgaWYgKGNobiA9PSAyKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gNTc2OyBqID4gMDsgKytpLCAtLWopIHsKKyAgICAgICAgICAgICAgICBGTE9BVCBjb25zdCBsID0gbnNfaHBmc21wbFswXVtpXTsKKyAgICAgICAgICAgICAgICBGTE9BVCBjb25zdCByID0gbnNfaHBmc21wbFsxXVtpXTsKKyAgICAgICAgICAgICAgICBuc19ocGZzbXBsWzBdW2ldID0gbCArIHI7CisgICAgICAgICAgICAgICAgbnNfaHBmc21wbFsxXVtpXSA9IGwgLSByOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgICogZGV0ZXJtaW5lIHRoZSBibG9jayB0eXBlICh3aW5kb3cgdHlwZSkKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBjYWxjdWxhdGUgZW5lcmdpZXMgb2YgZWFjaCBzdWItc2hvcnRibG9ja3MgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgZW5fc3Vic2hvcnRbaV0gPSBnZmMtPm5zUHN5Lmxhc3RfZW5fc3Vic2hvcnRbY2huXVtpICsgNl07CisgICAgICAgICAgICBhc3NlcnQoZ2ZjLT5uc1BzeS5sYXN0X2VuX3N1YnNob3J0W2Nobl1baSArIDRdID4gMCk7CisgICAgICAgICAgICBhdHRhY2tfaW50ZW5zaXR5W2ldCisgICAgICAgICAgICAgICAgPSBlbl9zdWJzaG9ydFtpXSAvIGdmYy0+bnNQc3kubGFzdF9lbl9zdWJzaG9ydFtjaG5dW2kgKyA0XTsKKyAgICAgICAgICAgIGVuX3Nob3J0WzBdICs9IGVuX3N1YnNob3J0W2ldOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgKmNvbnN0IHBmZSA9IHBmICsgNTc2IC8gOTsKKyAgICAgICAgICAgIEZMT0FUICAgcCA9IDEuOworICAgICAgICAgICAgZm9yICg7IHBmIDwgcGZlOyBwZisrKQorICAgICAgICAgICAgICAgIGlmIChwIDwgZmFicygqcGYpKQorICAgICAgICAgICAgICAgICAgICBwID0gZmFicygqcGYpOworCisgICAgICAgICAgICBnZmMtPm5zUHN5Lmxhc3RfZW5fc3Vic2hvcnRbY2huXVtpXSA9IGVuX3N1YnNob3J0W2kgKyAzXSA9IHA7CisgICAgICAgICAgICBlbl9zaG9ydFsxICsgaSAvIDNdICs9IHA7CisgICAgICAgICAgICBpZiAocCA+IGVuX3N1YnNob3J0W2kgKyAzIC0gMl0pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoZW5fc3Vic2hvcnRbaSArIDMgLSAyXSA+IDApOworICAgICAgICAgICAgICAgIHAgPSBwIC8gZW5fc3Vic2hvcnRbaSArIDMgLSAyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGVuX3N1YnNob3J0W2kgKyAzIC0gMl0gPiBwICogMTAuMCkgeworICAgICAgICAgICAgICAgIGFzc2VydChwID4gMCk7CisgICAgICAgICAgICAgICAgcCA9IGVuX3N1YnNob3J0W2kgKyAzIC0gMl0gLyAocCAqIDEwLjApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcCA9IDAuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dGFja19pbnRlbnNpdHlbaSArIDNdID0gcDsKKyAgICAgICAgfQorICAgICAgICAvKiBwdWxzZSBsaWtlIHNpZ25hbCBkZXRlY3Rpb24gZm9yIGZhdGJveS53YXYgYW5kIHNvIG9uICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IGVubiA9CisgICAgICAgICAgICAgICAgZW5fc3Vic2hvcnRbaSAqIDMgKyAzXSArIGVuX3N1YnNob3J0W2kgKiAzICsgNF0gKyBlbl9zdWJzaG9ydFtpICogMyArIDVdOworICAgICAgICAgICAgRkxPQVQgICBmYWN0b3IgPSAxLmY7CisgICAgICAgICAgICBpZiAoZW5fc3Vic2hvcnRbaSAqIDMgKyA1XSAqIDYgPCBlbm4pIHsKKyAgICAgICAgICAgICAgICBmYWN0b3IgKj0gMC41ZjsKKyAgICAgICAgICAgICAgICBpZiAoZW5fc3Vic2hvcnRbaSAqIDMgKyA0XSAqIDYgPCBlbm4pIHsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yICo9IDAuNWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ViX3Nob3J0X2ZhY3RvcltjaG5dW2ldID0gZmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdmcC0+YW5hbHlzaXMpIHsKKyAgICAgICAgICAgIEZMT0FUICAgeCA9IGF0dGFja19pbnRlbnNpdHlbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTI7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh4IDwgYXR0YWNrX2ludGVuc2l0eVtpXSkgeworICAgICAgICAgICAgICAgICAgICB4ID0gYXR0YWNrX2ludGVuc2l0eVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZmMtPnBpbmZvLT5lcnNbZ3Jfb3V0XVtjaG5dID0gZ2ZjLT5waW5mby0+ZXJzX3NhdmVbY2huXTsKKyAgICAgICAgICAgIGdmYy0+cGluZm8tPmVyc19zYXZlW2Nobl0gPSB4OworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcGFyZSBlbmVyZ2llcyBiZXR3ZWVuIHN1Yi1zaG9ydGJsb2NrcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICAgICAgaWYgKCFuc19hdHRhY2tzW2Nobl1baSAvIDNdICYmIGF0dGFja19pbnRlbnNpdHlbaV0gPiBhdHRhY2tUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBuc19hdHRhY2tzW2Nobl1baSAvIDNdID0gKGkgJSAzKSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBzaG91bGQgaGF2ZSBlbmVyZ3kgY2hhbmdlIGJldHdlZW4gc2hvcnQgYmxvY2tzLCBpbiBvcmRlciB0byBhdm9pZCBwZXJpb2RpYyBzaWduYWxzICovCisgICAgICAgIC8qIEdvb2Qgc2FtcGxlcyB0byBzaG93IHRoZSBlZmZlY3QgYXJlIFRydW1wZXQgdGVzdCBzb25ncyAqLworICAgICAgICAvKiBHQjogdHVuZWQgKDEpIHRvIGF2b2lkIHRvbyBtYW55IHNob3J0IGJsb2NrcyBmb3IgdGVzdCBzYW1wbGUgVFJVTVBFVCAqLworICAgICAgICAvKiBSSDogdHVuZWQgKDIpIHRvIGxldCBlbm91Z2ggc2hvcnQgYmxvY2tzIHRocm91Z2ggZm9yIHRlc3Qgc2FtcGxlIEZTT0wgYW5kIFNOQVBTICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHUgPSBlbl9zaG9ydFtpIC0gMV07CisgICAgICAgICAgICBGTE9BVCBjb25zdCB2ID0gZW5fc2hvcnRbaV07CisgICAgICAgICAgICBGTE9BVCBjb25zdCBtID0gTWF4KHUsIHYpOworICAgICAgICAgICAgaWYgKG0gPCA0MDAwMCkgeyAvKiAoMikgKi8KKyAgICAgICAgICAgICAgICBpZiAodSA8IDEuNyAqIHYgJiYgdiA8IDEuNyAqIHUpIHsgLyogKDEpICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEgJiYgbnNfYXR0YWNrc1tjaG5dWzBdIDw9IG5zX2F0dGFja3NbY2huXVtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbnNfYXR0YWNrc1tjaG5dWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuc19hdHRhY2tzW2Nobl1baV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuc19hdHRhY2tzW2Nobl1bMF0gPD0gZ2ZjLT5uc1BzeS5sYXN0X2F0dGFja3NbY2huXSkgeworICAgICAgICAgICAgbnNfYXR0YWNrc1tjaG5dWzBdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZmMtPm5zUHN5Lmxhc3RfYXR0YWNrc1tjaG5dID09IDMgfHwKKyAgICAgICAgICAgIG5zX2F0dGFja3NbY2huXVswXSArIG5zX2F0dGFja3NbY2huXVsxXSArIG5zX2F0dGFja3NbY2huXVsyXSArIG5zX2F0dGFja3NbY2huXVszXSkgeworICAgICAgICAgICAgbnNfdXNlbG9uZ2Jsb2NrID0gMDsKKworICAgICAgICAgICAgaWYgKG5zX2F0dGFja3NbY2huXVsxXSAmJiBuc19hdHRhY2tzW2Nobl1bMF0pIHsKKyAgICAgICAgICAgICAgICBuc19hdHRhY2tzW2Nobl1bMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5zX2F0dGFja3NbY2huXVsyXSAmJiBuc19hdHRhY2tzW2Nobl1bMV0pIHsKKyAgICAgICAgICAgICAgICBuc19hdHRhY2tzW2Nobl1bMl0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5zX2F0dGFja3NbY2huXVszXSAmJiBuc19hdHRhY2tzW2Nobl1bMl0pIHsKKyAgICAgICAgICAgICAgICBuc19hdHRhY2tzW2Nobl1bM10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNobiA8IDIpIHsKKyAgICAgICAgICAgIHVzZWxvbmdibG9ja1tjaG5dID0gbnNfdXNlbG9uZ2Jsb2NrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKG5zX3VzZWxvbmdibG9jayA9PSAwKSB7CisgICAgICAgICAgICAgICAgdXNlbG9uZ2Jsb2NrWzBdID0gdXNlbG9uZ2Jsb2NrWzFdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHRoZXJlIGlzIGEgb25lIGdyYW51bGUgZGVsYXkuICBDb3B5IG1hc2tpbmdzIGNvbXB1dGVkIGxhc3QgY2FsbAorICAgICAgICAgKiBpbnRvIG1hc2tpbmdfcmF0aW8gdG8gcmV0dXJuIHRvIGNhbGxpbmcgcHJvZ3JhbS4KKyAgICAgICAgICovCisgICAgICAgIGVuZXJneVtjaG5dID0gZ2ZjLT50b3RfZW5lcltjaG5dOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAordmJycHN5X3NraXBfbWFza2luZ19zKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGludCBjaG4sIGludCBzYmxvY2spCit7CisgICAgaWYgKHNibG9jayA9PSAwKSB7CisgICAgICAgIGludCAgICAgYjsKKyAgICAgICAgZm9yIChiID0gMDsgYiA8IGdmYy0+bnBhcnRfczsgYisrKSB7CisgICAgICAgICAgICBnZmMtPm5iX3MyW2Nobl1bYl0gPSBnZmMtPm5iX3MxW2Nobl1bYl07CisgICAgICAgICAgICBnZmMtPm5iX3MxW2Nobl1bYl0gPSAwOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit2YnJwc3lfc2tpcF9tYXNraW5nX2wobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgaW50IGNobikKK3sKKyAgICBpbnQgICAgIGI7CisgICAgZm9yIChiID0gMDsgYiA8IGdmYy0+bnBhcnRfbDsgYisrKSB7CisgICAgICAgIGdmYy0+bmJfMltjaG5dW2JdID0gZ2ZjLT5uYl8xW2Nobl1bYl07CisgICAgICAgIGdmYy0+bmJfMVtjaG5dW2JdID0gMDsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3BzeXZicl9jYWxjX21hc2tfaW5kZXhfcyhsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMsIEZMT0FUIGNvbnN0ICptYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgY29uc3QgKmF2ZywgdW5zaWduZWQgY2hhciAqbWFza19pZHgpCit7CisgICAgRkxPQVQgICBtLCBhOworICAgIGludCAgICAgYiwgazsKKyAgICBpbnQgY29uc3QgbGFzdF90YWJfZW50cnkgPSBkaW1lbnNpb25fb2YodGFiKSAtIDE7CisgICAgYiA9IDA7CisgICAgYSA9IGF2Z1tiXSArIGF2Z1tiICsgMV07CisgICAgYXNzZXJ0KGEgPj0gMCk7CisgICAgaWYgKGEgPiAwLjApIHsKKyAgICAgICAgbSA9IG1heFtiXTsKKyAgICAgICAgaWYgKG0gPCBtYXhbYiArIDFdKQorICAgICAgICAgICAgbSA9IG1heFtiICsgMV07CisgICAgICAgIGFzc2VydCgoZ2ZjLT5udW1saW5lc19zW2JdICsgZ2ZjLT5udW1saW5lc19zW2IgKyAxXSAtIDEpID4gMCk7CisgICAgICAgIGEgPSAyMC4wICogKG0gKiAyLjAgLSBhKQorICAgICAgICAgICAgLyAoYSAqIChnZmMtPm51bWxpbmVzX3NbYl0gKyBnZmMtPm51bWxpbmVzX3NbYiArIDFdIC0gMSkpOworICAgICAgICBrID0gKGludCkgYTsKKyAgICAgICAgaWYgKGsgPiBsYXN0X3RhYl9lbnRyeSkKKyAgICAgICAgICAgIGsgPSBsYXN0X3RhYl9lbnRyeTsKKyAgICAgICAgbWFza19pZHhbYl0gPSBrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWFza19pZHhbYl0gPSAwOworICAgIH0KKworICAgIGZvciAoYiA9IDE7IGIgPCBnZmMtPm5wYXJ0X3MgLSAxOyBiKyspIHsKKyAgICAgICAgYSA9IGF2Z1tiIC0gMV0gKyBhdmdbYl0gKyBhdmdbYiArIDFdOworICAgICAgICBhc3NlcnQoYiArIDEgPCBnZmMtPm5wYXJ0X3MpOworICAgICAgICBhc3NlcnQoYSA+PSAwKTsKKyAgICAgICAgaWYgKGEgPiAwLjApIHsKKyAgICAgICAgICAgIG0gPSBtYXhbYiAtIDFdOworICAgICAgICAgICAgaWYgKG0gPCBtYXhbYl0pCisgICAgICAgICAgICAgICAgbSA9IG1heFtiXTsKKyAgICAgICAgICAgIGlmIChtIDwgbWF4W2IgKyAxXSkKKyAgICAgICAgICAgICAgICBtID0gbWF4W2IgKyAxXTsKKyAgICAgICAgICAgIGFzc2VydCgoZ2ZjLT5udW1saW5lc19zW2IgLSAxXSArIGdmYy0+bnVtbGluZXNfc1tiXSArIGdmYy0+bnVtbGluZXNfc1tiICsgMV0gLSAxKSA+IDApOworICAgICAgICAgICAgYSA9IDIwLjAgKiAobSAqIDMuMCAtIGEpCisgICAgICAgICAgICAgICAgLyAoYSAqIChnZmMtPm51bWxpbmVzX3NbYiAtIDFdICsgZ2ZjLT5udW1saW5lc19zW2JdICsgZ2ZjLT5udW1saW5lc19zW2IgKyAxXSAtIDEpKTsKKyAgICAgICAgICAgIGsgPSAoaW50KSBhOworICAgICAgICAgICAgaWYgKGsgPiBsYXN0X3RhYl9lbnRyeSkKKyAgICAgICAgICAgICAgICBrID0gbGFzdF90YWJfZW50cnk7CisgICAgICAgICAgICBtYXNrX2lkeFtiXSA9IGs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtYXNrX2lkeFtiXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KGIgPiAwKTsKKyAgICBhc3NlcnQoYiA9PSBnZmMtPm5wYXJ0X3MgLSAxKTsKKworICAgIGEgPSBhdmdbYiAtIDFdICsgYXZnW2JdOworICAgIGFzc2VydChhID49IDApOworICAgIGlmIChhID4gMC4wKSB7CisgICAgICAgIG0gPSBtYXhbYiAtIDFdOworICAgICAgICBpZiAobSA8IG1heFtiXSkKKyAgICAgICAgICAgIG0gPSBtYXhbYl07CisgICAgICAgIGFzc2VydCgoZ2ZjLT5udW1saW5lc19zW2IgLSAxXSArIGdmYy0+bnVtbGluZXNfc1tiXSAtIDEpID4gMCk7CisgICAgICAgIGEgPSAyMC4wICogKG0gKiAyLjAgLSBhKQorICAgICAgICAgICAgLyAoYSAqIChnZmMtPm51bWxpbmVzX3NbYiAtIDFdICsgZ2ZjLT5udW1saW5lc19zW2JdIC0gMSkpOworICAgICAgICBrID0gKGludCkgYTsKKyAgICAgICAgaWYgKGsgPiBsYXN0X3RhYl9lbnRyeSkKKyAgICAgICAgICAgIGsgPSBsYXN0X3RhYl9lbnRyeTsKKyAgICAgICAgbWFza19pZHhbYl0gPSBrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWFza19pZHhbYl0gPSAwOworICAgIH0KKyAgICBhc3NlcnQoYiA9PSAoZ2ZjLT5ucGFydF9zIC0gMSkpOworfQorCisKK3N0YXRpYyB2b2lkCit2YnJwc3lfY29tcHV0ZV9tYXNraW5nX3MobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgRkxPQVQoKmZmdGVuZXJneV9zKVtIQkxLU0laRV9zXSwgRkxPQVQgKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCAqIHRociwgaW50IGNobiwgaW50IHNibG9jaykKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIEZMT0FUICAgbWF4W0NCQU5EU10sIGF2Z1tDQkFORFNdOworICAgIGludCAgICAgaSwgaiwgYjsKKyAgICB1bnNpZ25lZCBjaGFyIG1hc2tfaWR4X3NbQ0JBTkRTXTsKKworICAgIGZvciAoYiA9IGogPSAwOyBiIDwgZ2ZjLT5ucGFydF9zOyArK2IpIHsKKyAgICAgICAgRkxPQVQgICBlYmIgPSAwLCBtID0gMDsKKyAgICAgICAgaW50IGNvbnN0IG4gPSBnZmMtPm51bWxpbmVzX3NbYl07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2ksICsraikgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgZWwgPSBmZnRlbmVyZ3lfc1tzYmxvY2tdW2pdOworICAgICAgICAgICAgZWJiICs9IGVsOworICAgICAgICAgICAgaWYgKG0gPCBlbCkKKyAgICAgICAgICAgICAgICBtID0gZWw7CisgICAgICAgIH0KKyAgICAgICAgZWJbYl0gPSBlYmI7CisgICAgICAgIGFzc2VydChlYmIgPj0gMCk7CisgICAgICAgIG1heFtiXSA9IG07CisgICAgICAgIGFzc2VydChuID4gMCk7CisgICAgICAgIGF2Z1tiXSA9IGViYiAvIG47CisgICAgICAgIGFzc2VydChhdmdbYl0gPj0gMCk7CisgICAgfQorICAgIGFzc2VydChiID09IGdmYy0+bnBhcnRfcyk7CisgICAgYXNzZXJ0KGogPT0gMTI5KTsKKyAgICBmb3IgKDsgYiA8IENCQU5EUzsgKytiKSB7CisgICAgICAgIG1heFtiXSA9IDA7CisgICAgICAgIGF2Z1tiXSA9IDA7CisgICAgfQorICAgIHBzeXZicl9jYWxjX21hc2tfaW5kZXhfcyhnZmMsIG1heCwgYXZnLCBtYXNrX2lkeF9zKTsKKyAgICBmb3IgKGogPSBiID0gMDsgYiA8IGdmYy0+bnBhcnRfczsgYisrKSB7CisgICAgICAgIGludCAgICAga2sgPSBnZmMtPnMzaW5kX3NbYl1bMF07CisgICAgICAgIGludCBjb25zdCBsYXN0ID0gZ2ZjLT5zM2luZF9zW2JdWzFdOworICAgICAgICBpbnQgICAgIGRkLCBkZF9uOworICAgICAgICBGTE9BVCAgIHgsIGVjYiwgYXZnX21hc2s7CisgICAgICAgIGRkID0gbWFza19pZHhfc1tra107CisgICAgICAgIGRkX24gPSAxOworICAgICAgICBlY2IgPSBnZmMtPnMzX3NzW2pdICogZWJba2tdICogdGFiW21hc2tfaWR4X3Nba2tdXTsKKyAgICAgICAgKytqLCArK2trOworICAgICAgICB3aGlsZSAoa2sgPD0gbGFzdCkgeworICAgICAgICAgICAgZGQgKz0gbWFza19pZHhfc1tra107CisgICAgICAgICAgICBkZF9uICs9IDE7CisgICAgICAgICAgICB4ID0gZ2ZjLT5zM19zc1tqXSAqIGViW2trXSAqIHRhYlttYXNrX2lkeF9zW2trXV07CisgICAgICAgICAgICBlY2IgPSB2YnJwc3lfbWFza19hZGQoZWNiLCB4LCBrayAtIGIpOworICAgICAgICAgICAgKytqLCArK2trOworICAgICAgICB9CisgICAgICAgIGRkID0gKDEgKyAyICogZGQpIC8gKDIgKiBkZF9uKTsKKyAgICAgICAgYXZnX21hc2sgPSB0YWJbZGRdICogMC41OworICAgICAgICBlY2IgKj0gYXZnX21hc2s7CisjaWYgMCAgICAgICAgICAgICAgICAgICAvKiB3ZSBjYW4gZG8gUFJFIEVDSE8gY29udHJvbCBub3cgaGVyZSwgb3IgZG8gaXQgbGF0ZXIgKi8KKyAgICAgICAgaWYgKGdmYy0+YmxvY2t0eXBlX29sZFtjaG4gJiAweDAxXSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgICAgICAvKiBsaW1pdCBjYWxjdWxhdGVkIHRocmVzaG9sZCBieSBldmVuIG9sZGVyIGdyYW51bGUgKi8KKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHQxID0gcnBlbGV2X3MgKiBnZmMtPm5iX3MxW2Nobl1bYl07CisgICAgICAgICAgICBGTE9BVCBjb25zdCB0MiA9IHJwZWxldjJfcyAqIGdmYy0+bmJfczJbY2huXVtiXTsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IHRtID0gKHQyID4gMCkgPyBNaW4oZWNiLCB0MikgOiBlY2I7CisgICAgICAgICAgICB0aHJbYl0gPSAodDEgPiAwKSA/IE5TX0lOVEVSUChNaW4odG0sIHQxKSwgZWNiLCAwLjYpIDogZWNiOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbGltaXQgY2FsY3VsYXRlZCB0aHJlc2hvbGQgYnkgb2xkZXIgZ3JhbnVsZSAqLworICAgICAgICAgICAgRkxPQVQgY29uc3QgdDEgPSBycGVsZXZfcyAqIGdmYy0+bmJfczFbY2huXVtiXTsKKyAgICAgICAgICAgIHRocltiXSA9ICh0MSA+IDApID8gTlNfSU5URVJQKE1pbihlY2IsIHQxKSwgZWNiLCAwLjYpIDogZWNiOworICAgICAgICB9CisjZWxzZSAvKiB3ZSBkbyBpdCBsYXRlciAqLworICAgICAgICB0aHJbYl0gPSBlY2I7CisjZW5kaWYKKyAgICAgICAgZ2ZjLT5uYl9zMltjaG5dW2JdID0gZ2ZjLT5uYl9zMVtjaG5dW2JdOworICAgICAgICBnZmMtPm5iX3MxW2Nobl1bYl0gPSBlY2I7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICBpZiBUSFIgZXhjZWVkcyBFQiwgdGhlIHF1YW50aXphdGlvbiByb3V0aW5lcyB3aWxsIHRha2UgdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgICAgICAqICBmcm9tIG90aGVyIGJhbmRzLiBpbiBjYXNlIG9mIHN0cm9uZyB0b25hbCBzYW1wbGVzICh0b25hbHRlc3Qud2F2KQorICAgICAgICAgICAgICogIHRoaXMgbGVhZHMgdG8gaGVhdnkgZGlzdG9ydGlvbnMuIHRoYXQncyB3aHkgd2UgbGltaXQgVEhSIGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHggPSBtYXhbYl07CisgICAgICAgICAgICB4ICo9IGdmYy0+bWludmFsX3NbYl07CisgICAgICAgICAgICB4ICo9IGF2Z19tYXNrOworICAgICAgICAgICAgaWYgKHRocltiXSA+IHgpIHsKKyAgICAgICAgICAgICAgICB0aHJbYl0gPSB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChnZmMtPm1hc2tpbmdfbG93ZXIgPiAxKSB7CisgICAgICAgICAgICB0aHJbYl0gKj0gZ2ZjLT5tYXNraW5nX2xvd2VyOworICAgICAgICB9CisgICAgICAgIGlmICh0aHJbYl0gPiBlYltiXSkgeworICAgICAgICAgICAgdGhyW2JdID0gZWJbYl07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdmYy0+bWFza2luZ19sb3dlciA8IDEpIHsKKyAgICAgICAgICAgIHRocltiXSAqPSBnZmMtPm1hc2tpbmdfbG93ZXI7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQodGhyW2JdID49IDApOworICAgIH0KKyAgICBmb3IgKDsgYiA8IENCQU5EUzsgKytiKSB7CisgICAgICAgIGViW2JdID0gMDsKKyAgICAgICAgdGhyW2JdID0gMDsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3ZicnBzeV9jb21wdXRlX21hc2tpbmdfbChsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBGTE9BVCBmZnRlbmVyZ3lbSEJMS1NJWkVdLCBGTE9BVCBlYl9sW0NCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgdGhyW0NCQU5EU10sIGludCBjaG4pCit7CisgICAgRkxPQVQgICBtYXhbQ0JBTkRTXSwgYXZnW0NCQU5EU107CisgICAgdW5zaWduZWQgY2hhciBtYXNrX2lkeF9sW0NCQU5EUyArIDJdOworICAgIGludCAgICAgaywgYjsKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICAgIENhbGN1bGF0ZSB0aGUgZW5lcmd5IGFuZCB0aGUgdG9uYWxpdHkgb2YgZWFjaCBwYXJ0aXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGNhbGNfZW5lcmd5KGdmYywgZmZ0ZW5lcmd5LCBlYl9sLCBtYXgsIGF2Zyk7CisgICAgY2FsY19tYXNrX2luZGV4X2woZ2ZjLCBtYXgsIGF2ZywgbWFza19pZHhfbCk7CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgICAgIGNvbnZvbHZlIHRoZSBwYXJ0aXRpb25lZCBlbmVyZ3kgYW5kIHVucHJlZGljdGFiaWxpdHkKKyAgICAqICAgICAgd2l0aCB0aGUgc3ByZWFkaW5nIGZ1bmN0aW9uLCBzM19sW2JdW2tdCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgayA9IDA7CisgICAgZm9yIChiID0gMDsgYiA8IGdmYy0+bnBhcnRfbDsgYisrKSB7CisgICAgICAgIEZMT0FUICAgeCwgZWNiLCBhdmdfbWFzaywgdDsKKyAgICAgICAgLyogY29udm9sdmUgdGhlIHBhcnRpdGlvbmVkIGVuZXJneSB3aXRoIHRoZSBzcHJlYWRpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgaW50ICAgICBrayA9IGdmYy0+czNpbmRbYl1bMF07CisgICAgICAgIGludCBjb25zdCBsYXN0ID0gZ2ZjLT5zM2luZFtiXVsxXTsKKyAgICAgICAgaW50ICAgICBkZCA9IDAsIGRkX24gPSAwOworICAgICAgICBkZCA9IG1hc2tfaWR4X2xba2tdOworICAgICAgICBkZF9uICs9IDE7CisgICAgICAgIGVjYiA9IGdmYy0+czNfbGxba10gKiBlYl9sW2trXSAqIHRhYlttYXNrX2lkeF9sW2trXV07CisgICAgICAgICsraywgKytrazsKKyAgICAgICAgd2hpbGUgKGtrIDw9IGxhc3QpIHsKKyAgICAgICAgICAgIGRkICs9IG1hc2tfaWR4X2xba2tdOworICAgICAgICAgICAgZGRfbiArPSAxOworICAgICAgICAgICAgeCA9IGdmYy0+czNfbGxba10gKiBlYl9sW2trXSAqIHRhYlttYXNrX2lkeF9sW2trXV07CisgICAgICAgICAgICB0ID0gdmJycHN5X21hc2tfYWRkKGVjYiwgeCwga2sgLSBiKTsKKyNpZiAwCisgICAgICAgICAgICBlY2IgKz0gZWJfbFtra107CisgICAgICAgICAgICBpZiAoZWNiID4gdCkgeworICAgICAgICAgICAgICAgIGVjYiA9IHQ7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgZWNiID0gdDsKKyNlbmRpZgorICAgICAgICAgICAgKytrLCArK2trOworICAgICAgICB9CisgICAgICAgIGRkID0gKDEgKyAyICogZGQpIC8gKDIgKiBkZF9uKTsKKyAgICAgICAgYXZnX21hc2sgPSB0YWJbZGRdICogMC41OworICAgICAgICBlY2IgKj0gYXZnX21hc2s7CisKKyAgICAgICAgLyoqKiogICBsb25nIGJsb2NrIHByZS1lY2hvIGNvbnRyb2wgICAqKioqLworICAgICAgICAvKiBkb250IHVzZSBsb25nIGJsb2NrIHByZS1lY2hvIGNvbnRyb2wgaWYgcHJldmlvdXMgZ3JhbnVsZSB3YXMgCisgICAgICAgICAqIGEgc2hvcnQgYmxvY2suICBUaGlzIGlzIHRvIGF2b2lkIHRoZSBzaXR1YXRpb246ICAgCisgICAgICAgICAqIGZyYW1lMDogIHF1aWV0ICh2ZXJ5IGxvdyBtYXNraW5nKSAgCisgICAgICAgICAqIGZyYW1lMTogIHN1cmdlICAodHJpZ2dlcnMgc2hvcnQgYmxvY2tzKQorICAgICAgICAgKiBmcmFtZTI6ICByZWd1bGFyIGZyYW1lLiAgbG9va3MgbGlrZSBwcmUtZWNobyB3aGVuIGNvbXBhcmVkIHRvIAorICAgICAgICAgKiAgICAgICAgICBmcmFtZTAsIGJ1dCBhbGwgcHJlLWVjaG8gd2FzIGluIGZyYW1lMS4KKyAgICAgICAgICovCisgICAgICAgIC8qIGNobj0wLDEgICBMIGFuZCBSIGNoYW5uZWxzCisgICAgICAgICAgIGNobj0yLDMgICBTIGFuZCBNIGNoYW5uZWxzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGdmYy0+YmxvY2t0eXBlX29sZFtjaG4gJiAweDAxXSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBlY2JfbGltaXQgPSBycGVsZXYgKiBnZmMtPm5iXzFbY2huXVtiXTsKKyAgICAgICAgICAgIGlmIChlY2JfbGltaXQgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhyW2JdID0gTWluKGVjYiwgZWNiX2xpbWl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFJvYmVydCAwNzEyMDk6CisgICAgICAgICAgICAgICAgICAgQmVjYXVzZSB3ZSBkb24ndCBjYWxjdWxhdGUgbG9uZyBibG9jayBwc3kgd2hlbiB3ZSBrbm93IGEgZ3JhbnVsZQorICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBvZiBzaG9ydCBibG9ja3MsIHdlIGRvbid0IGhhdmUgYW55IGNsdWUgaG93IHRoZSBncmFudWxlCisgICAgICAgICAgICAgICAgICAgYmVmb3JlIHdvdWxkIGhhdmUgbG9va2VkIGxpa2UgYXMgYSBsb25nIGJsb2NrLiBTbyB3ZSBoYXZlIHRvIGd1ZXNzCisgICAgICAgICAgICAgICAgICAgYSBsaXR0bGUgYml0IGZvciB0aGlzIEVORF9UWVBFIGJsb2NrLgorICAgICAgICAgICAgICAgICAgIE1vc3Qgb2YgdGhlIHRpbWUgd2UgZ2V0IGF3YXkgd2l0aCB0aGlzIHNsb3BweW5lc3MuIChmaW5nZXJzIGNyb3NzZWQgOikKKyAgICAgICAgICAgICAgICAgICBUaGUgc3BlZWQgaW5jcmVhc2UgaXMgd29ydGggaXQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdGhyW2JdID0gTWluKGVjYiwgZWJfbFtiXSAqIE5TX1BSRUVDSE9fQVRUMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBGTE9BVCAgIGVjYl9saW1pdF8yID0gcnBlbGV2MiAqIGdmYy0+bmJfMltjaG5dW2JdOworICAgICAgICAgICAgRkxPQVQgICBlY2JfbGltaXRfMSA9IHJwZWxldiAqIGdmYy0+bmJfMVtjaG5dW2JdOworICAgICAgICAgICAgRkxPQVQgICBlY2JfbGltaXQ7CisgICAgICAgICAgICBpZiAoZWNiX2xpbWl0XzIgPD0gMCkgeworICAgICAgICAgICAgICAgIGVjYl9saW1pdF8yID0gZWNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVjYl9saW1pdF8xIDw9IDApIHsKKyAgICAgICAgICAgICAgICBlY2JfbGltaXRfMSA9IGVjYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZmMtPmJsb2NrdHlwZV9vbGRbY2huICYgMHgwMV0gPT0gTk9STV9UWVBFKSB7CisgICAgICAgICAgICAgICAgZWNiX2xpbWl0ID0gTWluKGVjYl9saW1pdF8xLCBlY2JfbGltaXRfMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBlY2JfbGltaXQgPSBlY2JfbGltaXRfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocltiXSA9IE1pbihlY2IsIGVjYl9saW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgZ2ZjLT5uYl8yW2Nobl1bYl0gPSBnZmMtPm5iXzFbY2huXVtiXTsKKyAgICAgICAgZ2ZjLT5uYl8xW2Nobl1bYl0gPSBlY2I7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICBpZiBUSFIgZXhjZWVkcyBFQiwgdGhlIHF1YW50aXphdGlvbiByb3V0aW5lcyB3aWxsIHRha2UgdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgICAgICAqICBmcm9tIG90aGVyIGJhbmRzLiBpbiBjYXNlIG9mIHN0cm9uZyB0b25hbCBzYW1wbGVzICh0b25hbHRlc3Qud2F2KQorICAgICAgICAgICAgICogIHRoaXMgbGVhZHMgdG8gaGVhdnkgZGlzdG9ydGlvbnMuIHRoYXQncyB3aHkgd2UgbGltaXQgVEhSIGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHggPSBtYXhbYl07CisgICAgICAgICAgICB4ICo9IGdmYy0+bWludmFsX2xbYl07CisgICAgICAgICAgICB4ICo9IGF2Z19tYXNrOworICAgICAgICAgICAgaWYgKHRocltiXSA+IHgpIHsKKyAgICAgICAgICAgICAgICB0aHJbYl0gPSB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChnZmMtPm1hc2tpbmdfbG93ZXIgPiAxKSB7CisgICAgICAgICAgICB0aHJbYl0gKj0gZ2ZjLT5tYXNraW5nX2xvd2VyOworICAgICAgICB9CisgICAgICAgIGlmICh0aHJbYl0gPiBlYl9sW2JdKSB7CisgICAgICAgICAgICB0aHJbYl0gPSBlYl9sW2JdOworICAgICAgICB9CisgICAgICAgIGlmIChnZmMtPm1hc2tpbmdfbG93ZXIgPCAxKSB7CisgICAgICAgICAgICB0aHJbYl0gKj0gZ2ZjLT5tYXNraW5nX2xvd2VyOworICAgICAgICB9CisgICAgICAgIGFzc2VydCh0aHJbYl0gPj0gMCk7CisgICAgfQorICAgIGZvciAoOyBiIDwgQ0JBTkRTOyArK2IpIHsKKyAgICAgICAgZWJfbFtiXSA9IDA7CisgICAgICAgIHRocltiXSA9IDA7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit2YnJwc3lfY29tcHV0ZV9ibG9ja190eXBlKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIGludCAqdXNlbG9uZ2Jsb2NrKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBjaG47CisKKyAgICBpZiAoZ2ZwLT5zaG9ydF9ibG9ja3MgPT0gc2hvcnRfYmxvY2tfY291cGxlZAorICAgICAgICAvKiBmb3JjZSBib3RoIGNoYW5uZWxzIHRvIHVzZSB0aGUgc2FtZSBibG9jayB0eXBlICovCisgICAgICAgIC8qIHRoaXMgaXMgbmVjZXNzYXJ5IGlmIHRoZSBmcmFtZSBpcyB0byBiZSBlbmNvZGVkIGluIG1zX3N0ZXJlby4gICovCisgICAgICAgIC8qIEJ1dCBldmVuIHdpdGhvdXQgbXNfc3RlcmVvLCBGaEcgIGRvZXMgdGhpcyAqLworICAgICAgICAmJiAhKHVzZWxvbmdibG9ja1swXSAmJiB1c2Vsb25nYmxvY2tbMV0pKQorICAgICAgICB1c2Vsb25nYmxvY2tbMF0gPSB1c2Vsb25nYmxvY2tbMV0gPSAwOworCisgICAgZm9yIChjaG4gPSAwOyBjaG4gPCBnZmMtPmNoYW5uZWxzX291dDsgY2huKyspIHsKKyAgICAgICAgLyogZGlzYWJsZSBzaG9ydCBibG9ja3MgKi8KKyAgICAgICAgaWYgKGdmcC0+c2hvcnRfYmxvY2tzID09IHNob3J0X2Jsb2NrX2Rpc3BlbnNlZCkgeworICAgICAgICAgICAgdXNlbG9uZ2Jsb2NrW2Nobl0gPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChnZnAtPnNob3J0X2Jsb2NrcyA9PSBzaG9ydF9ibG9ja19mb3JjZWQpIHsKKyAgICAgICAgICAgIHVzZWxvbmdibG9ja1tjaG5dID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAordmJycHN5X2FwcGx5X2Jsb2NrX3R5cGUobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgaW50IGNvbnN0ICp1c2Vsb25nYmxvY2ssIGludCAqYmxvY2t0eXBlX2QpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGNobjsKKworICAgIC8qIHVwZGF0ZSB0aGUgYmxvY2t0eXBlIG9mIHRoZSBwcmV2aW91cyBncmFudWxlLCBzaW5jZSBpdCBkZXBlbmRzIG9uIHdoYXQKKyAgICAgKiBoYXBwZW5kIGluIHRoaXMgZ3JhbnVsZSAqLworICAgIGZvciAoY2huID0gMDsgY2huIDwgZ2ZjLT5jaGFubmVsc19vdXQ7IGNobisrKSB7CisgICAgICAgIGludCAgICAgYmxvY2t0eXBlID0gTk9STV9UWVBFOworICAgICAgICAvKiBkaXNhYmxlIHNob3J0IGJsb2NrcyAqLworCisgICAgICAgIGlmICh1c2Vsb25nYmxvY2tbY2huXSkgeworICAgICAgICAgICAgLyogbm8gYXR0YWNrIDogdXNlIGxvbmcgYmxvY2tzICovCisgICAgICAgICAgICBhc3NlcnQoZ2ZjLT5ibG9ja3R5cGVfb2xkW2Nobl0gIT0gU1RBUlRfVFlQRSk7CisgICAgICAgICAgICBpZiAoZ2ZjLT5ibG9ja3R5cGVfb2xkW2Nobl0gPT0gU0hPUlRfVFlQRSkKKyAgICAgICAgICAgICAgICBibG9ja3R5cGUgPSBTVE9QX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBhdHRhY2sgOiB1c2Ugc2hvcnQgYmxvY2tzICovCisgICAgICAgICAgICBibG9ja3R5cGUgPSBTSE9SVF9UWVBFOworICAgICAgICAgICAgaWYgKGdmYy0+YmxvY2t0eXBlX29sZFtjaG5dID09IE5PUk1fVFlQRSkgeworICAgICAgICAgICAgICAgIGdmYy0+YmxvY2t0eXBlX29sZFtjaG5dID0gU1RBUlRfVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZmMtPmJsb2NrdHlwZV9vbGRbY2huXSA9PSBTVE9QX1RZUEUpCisgICAgICAgICAgICAgICAgZ2ZjLT5ibG9ja3R5cGVfb2xkW2Nobl0gPSBTSE9SVF9UWVBFOworICAgICAgICB9CisKKyAgICAgICAgYmxvY2t0eXBlX2RbY2huXSA9IGdmYy0+YmxvY2t0eXBlX29sZFtjaG5dOyAvKiB2YWx1ZSByZXR1cm5lZCB0byBjYWxsaW5nIHByb2dyYW0gKi8KKyAgICAgICAgZ2ZjLT5ibG9ja3R5cGVfb2xkW2Nobl0gPSBibG9ja3R5cGU7IC8qIHNhdmUgZm9yIG5leHQgY2FsbCB0byBsM3BzeV9hbmFsICovCisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBjb21wdXRlIE0vUyB0aHJlc2hvbGRzIGZyb20gSm9obnN0b24gJiBGZXJyZWlyYSAxOTkyIElDQVNTUCBwYXBlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK3ZicnBzeV9jb21wdXRlX01TX3RocmVzaG9sZHMoRkxPQVQgZWJbNF1bQ0JBTkRTXSwgRkxPQVQgdGhyWzRdW0NCQU5EU10sIEZMT0FUIGNiX21sZFtDQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCBhdGhfY2JbQ0JBTkRTXSwgRkxPQVQgYXRoYWRqdXN0LCBGTE9BVCBtc2ZpeCwgaW50IG4pCit7CisgICAgRkxPQVQgY29uc3QgbXNmaXgyID0gbXNmaXggKiAyOworICAgIEZMT0FUIGNvbnN0IGF0aGxvd2VyID0gbXNmaXggPiAwID8gcG93KDEwLCBhdGhhZGp1c3QpIDogMTsKKyAgICBGTE9BVCAgIHJzaWRlLCBybWlkOworICAgIGludCAgICAgYjsKKyAgICBmb3IgKGIgPSAwOyBiIDwgbjsgKytiKSB7CisgICAgICAgIEZMT0FUIGNvbnN0IGViTSA9IGViWzJdW2JdOworICAgICAgICBGTE9BVCBjb25zdCBlYlMgPSBlYlszXVtiXTsKKyAgICAgICAgRkxPQVQgY29uc3QgdGhtTCA9IHRoclswXVtiXTsKKyAgICAgICAgRkxPQVQgY29uc3QgdGhtUiA9IHRoclsxXVtiXTsKKyAgICAgICAgRkxPQVQgICB0aG1NID0gdGhyWzJdW2JdOworICAgICAgICBGTE9BVCAgIHRobVMgPSB0aHJbM11bYl07CisKKyAgICAgICAgLyogdXNlIHRoaXMgZml4IGlmIEwgJiBSIG1hc2tpbmcgZGlmZmVycyBieSAyZGIgb3IgbGVzcyAqLworICAgICAgICAvKiBpZiBkYiA9IDEwKmxvZzEwKHgyL3gxKSA8IDIgKi8KKyAgICAgICAgLyogaWYgKHgyIDwgMS41OCp4MSkgeyAqLworICAgICAgICBpZiAodGhtTCA8PSAxLjU4ICogdGhtUiAmJiB0aG1SIDw9IDEuNTggKiB0aG1MKSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBtbGRfbSA9IGNiX21sZFtiXSAqIGViUzsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IG1sZF9zID0gY2JfbWxkW2JdICogZWJNOworICAgICAgICAgICAgcm1pZCA9IE1heCh0aG1NLCBNaW4odGhtUywgbWxkX20pKTsKKyAgICAgICAgICAgIHJzaWRlID0gTWF4KHRobVMsIE1pbih0aG1NLCBtbGRfcykpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcm1pZCA9IHRobU07CisgICAgICAgICAgICByc2lkZSA9IHRobVM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1zZml4ID4gMCkgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIEFkanVzdCBNL1MgbWFza2luZ3MgaWYgdXNlciBzZXQgIm1zZml4IiAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogTmFva2kgU2hpYmF0YSAyMDAwICovCisgICAgICAgICAgICBGTE9BVCAgIHRobUxSLCB0aG1NUzsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IGF0aCA9IGF0aF9jYltiXSAqIGF0aGxvd2VyOworICAgICAgICAgICAgdGhtTFIgPSBNaW4oTWF4KHRobUwsIGF0aCksIE1heCh0aG1SLCBhdGgpKTsKKyAgICAgICAgICAgIHRobU0gPSBNYXgocm1pZCwgYXRoKTsKKyAgICAgICAgICAgIHRobVMgPSBNYXgocnNpZGUsIGF0aCk7CisgICAgICAgICAgICB0aG1NUyA9IHRobU0gKyB0aG1TOworICAgICAgICAgICAgaWYgKHRobU1TID4gMCAmJiAodGhtTFIgKiBtc2ZpeDIpIDwgdGhtTVMpIHsKKyAgICAgICAgICAgICAgICBGTE9BVCBjb25zdCBmID0gdGhtTFIgKiBtc2ZpeDIgLyB0aG1NUzsKKyAgICAgICAgICAgICAgICB0aG1NICo9IGY7CisgICAgICAgICAgICAgICAgdGhtUyAqPSBmOworICAgICAgICAgICAgICAgIGFzc2VydCh0aG1NUyA+IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm1pZCA9IE1pbih0aG1NLCBybWlkKTsKKyAgICAgICAgICAgIHJzaWRlID0gTWluKHRobVMsIHJzaWRlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm1pZCA+IGViTSkgeworICAgICAgICAgICAgcm1pZCA9IGViTTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnNpZGUgPiBlYlMpIHsKKyAgICAgICAgICAgIHJzaWRlID0gZWJTOworICAgICAgICB9CisgICAgICAgIHRoclsyXVtiXSA9IHJtaWQ7CisgICAgICAgIHRoclszXVtiXSA9IHJzaWRlOworICAgIH0KK30KKworCisKKy8qCisgKiBOT1RFOiB0aGUgYml0cmF0ZSByZWR1Y3Rpb24gZnJvbSB0aGUgaW50ZXItY2hhbm5lbCBtYXNraW5nIGVmZmVjdCBpcyBsb3cKKyAqIGNvbXBhcmVkIHRvIHRoZSBjaGFuY2Ugb2YgZ2V0dGluZyBhbm55b2luZyBhcnRlZmFjdHMuIEwzcHN5Y2hvX2FuYWxfdmJyIGRvZXMKKyAqIG5vdCB1c2UgdGhpcyBmZWF0dXJlLiAoUm9iZXJ0IDA3MTIxNikKKyovCisKK2ludAorTDNwc3ljaG9fYW5hbF92YnIobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbXBsZV90ICogYnVmZmVyWzJdLCBpbnQgZ3Jfb3V0LAorICAgICAgICAgICAgICAgICAgSUlJX3BzeV9yYXRpbyBtYXNraW5nX3JhdGlvWzJdWzJdLAorICAgICAgICAgICAgICAgICAgSUlJX3BzeV9yYXRpbyBtYXNraW5nX01TX3JhdGlvWzJdWzJdLAorICAgICAgICAgICAgICAgICAgRkxPQVQgcGVyY2VwX2VudHJvcHlbMl0sIEZMT0FUIHBlcmNlcF9NU19lbnRyb3B5WzJdLAorICAgICAgICAgICAgICAgICAgRkxPQVQgZW5lcmd5WzRdLCBpbnQgYmxvY2t0eXBlX2RbMl0pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworICAgIC8qIGZmdCBhbmQgZW5lcmd5IGNhbGN1bGF0aW9uICAgKi8KKyAgICBGTE9BVCgqd3NhbXBfbClbQkxLU0laRV07CisgICAgRkxPQVQoKndzYW1wX3MpWzNdW0JMS1NJWkVfc107CisgICAgRkxPQVQgICBmZnRlbmVyZ3lbSEJMS1NJWkVdOworICAgIEZMT0FUICAgZmZ0ZW5lcmd5X3NbM11bSEJMS1NJWkVfc107CisgICAgRkxPQVQgICB3c2FtcF9MWzJdW0JMS1NJWkVdOworICAgIEZMT0FUICAgd3NhbXBfU1syXVszXVtCTEtTSVpFX3NdOworICAgIEZMT0FUICAgZWJbNF1bQ0JBTkRTXSwgdGhyWzRdW0NCQU5EU107CisKKyAgICBGTE9BVCAgIHN1Yl9zaG9ydF9mYWN0b3JbNF1bM107CisgICAgRkxPQVQgICB0aG1tOworICAgIEZMT0FUICAgcGNmYWN0ID0gMC42ZjsKKworICAgIC8qIGJsb2NrIHR5cGUgICovCisgICAgaW50ICAgICBuc19hdHRhY2tzWzRdWzRdID0geyB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0gfTsKKyAgICBpbnQgICAgIHVzZWxvbmdibG9ja1syXTsKKworICAgIC8qIHVzdWFsIHZhcmlhYmxlcyBsaWtlIGxvb3AgaW5kaWNlcywgZXRjLi4gICAgKi8KKyAgICBpbnQgICAgIGNobiwgc2IsIHNibG9jazsKKworICAgIC8qIGNobj0yIGFuZCAzID0gTWlkIGFuZCBTaWRlIGNoYW5uZWxzICovCisgICAgaW50IGNvbnN0IG5fY2huX3BzeSA9IChnZnAtPm1vZGUgPT0gSk9JTlRfU1RFUkVPKSA/IDQgOiBnZmMtPmNoYW5uZWxzX291dDsKKworICAgIHZicnBzeV9hdHRhY2tfZGV0ZWN0aW9uKGdmcCwgYnVmZmVyLCBncl9vdXQsIG1hc2tpbmdfcmF0aW8sIG1hc2tpbmdfTVNfcmF0aW8sIGVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfc2hvcnRfZmFjdG9yLCBuc19hdHRhY2tzLCB1c2Vsb25nYmxvY2spOworCisgICAgdmJycHN5X2NvbXB1dGVfYmxvY2tfdHlwZShnZnAsIHVzZWxvbmdibG9jayk7CisKKyAgICAvKiBMT05HIEJMT0NLIENBU0UgKi8KKyAgICB7CisgICAgICAgIGZvciAoY2huID0gMDsgY2huIDwgbl9jaG5fcHN5OyBjaG4rKykgeworICAgICAgICAgICAgaW50IGNvbnN0IGNoMDEgPSBjaG4gJiAweDAxOworCisgICAgICAgICAgICB3c2FtcF9sID0gd3NhbXBfTCArIGNoMDE7CisgICAgICAgICAgICB2YnJwc3lfY29tcHV0ZV9mZnRfbChnZnAsIGJ1ZmZlciwgY2huLCBncl9vdXQsIGZmdGVuZXJneSwgd3NhbXBfbCk7CisgICAgICAgICAgICB2YnJwc3lfY29tcHV0ZV9sb3VkbmVzc19hcHByb3hpbWF0aW9uX2woZ2ZwLCBncl9vdXQsIGNobiwgZmZ0ZW5lcmd5KTsKKworICAgICAgICAgICAgaWYgKHVzZWxvbmdibG9ja1tjaDAxXSkgeworICAgICAgICAgICAgICAgIHZicnBzeV9jb21wdXRlX21hc2tpbmdfbChnZmMsIGZmdGVuZXJneSwgZWJbY2huXSwgdGhyW2Nobl0sIGNobik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YnJwc3lfc2tpcF9tYXNraW5nX2woZ2ZjLCBjaG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgodXNlbG9uZ2Jsb2NrWzBdICsgdXNlbG9uZ2Jsb2NrWzFdKSA9PSAyKSB7CisgICAgICAgICAgICAvKiBNL1MgY2hhbm5lbCAqLworICAgICAgICAgICAgaWYgKGdmcC0+bW9kZSA9PSBKT0lOVF9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICB2YnJwc3lfY29tcHV0ZV9NU190aHJlc2hvbGRzKGViLCB0aHIsIGdmYy0+bWxkX2NiX2wsIGdmYy0+QVRILT5jYl9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ZwLT5BVEhsb3dlciAqIGdmYy0+QVRILT5hZGp1c3QsIGdmcC0+bXNmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZmMtPm5wYXJ0X2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTC9SIGNoYW5uZWwgKi8KKyNpZiAwCisgICAgICAgICAgICBpZiAoZ2ZwLT5tb2RlID09IFNURVJFTyB8fCBnZnAtPm1vZGUgPT0gSk9JTlRfU1RFUkVPKSB7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICAvKiBUT0RPOiBhcHBseSBhZGFwdGl2ZSBBVEggbWFza2luZyBoZXJlID8/ICovCisgICAgICAgIGZvciAoY2huID0gMDsgY2huIDwgbl9jaG5fcHN5OyBjaG4rKykgeworICAgICAgICAgICAgaW50IGNvbnN0IGNoMDEgPSBjaG4gJiAweDAxOworICAgICAgICAgICAgaWYgKHVzZWxvbmdibG9ja1tjaDAxXSkgeworICAgICAgICAgICAgICAgIGNvbnZlcnRfcGFydGl0aW9uMnNjYWxlZmFjX2woZ2ZjLCBlYltjaG5dLCB0aHJbY2huXSwgY2huKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNIT1JUIEJMT0NLUyBDQVNFICovCisgICAgeworICAgICAgICBmb3IgKHNibG9jayA9IDA7IHNibG9jayA8IDM7IHNibG9jaysrKSB7CisgICAgICAgICAgICBmb3IgKGNobiA9IDA7IGNobiA8IG5fY2huX3BzeTsgKytjaG4pIHsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3QgY2gwMSA9IGNobiAmIDB4MDE7CisKKyAgICAgICAgICAgICAgICBpZiAodXNlbG9uZ2Jsb2NrW2NoMDFdKSB7CisgICAgICAgICAgICAgICAgICAgIHZicnBzeV9za2lwX21hc2tpbmdfcyhnZmMsIGNobiwgc2Jsb2NrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWFza2luZyB0aHJlc2hvbGRzIGZvciBzaG9ydCBibG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgd3NhbXBfcyA9IHdzYW1wX1MgKyBjaDAxOworICAgICAgICAgICAgICAgICAgICB2YnJwc3lfY29tcHV0ZV9mZnRfcyhnZnAsIGJ1ZmZlciwgY2huLCBzYmxvY2ssIGZmdGVuZXJneV9zLCB3c2FtcF9zKTsKKyAgICAgICAgICAgICAgICAgICAgdmJycHN5X2NvbXB1dGVfbWFza2luZ19zKGdmcCwgZmZ0ZW5lcmd5X3MsIGViW2Nobl0sIHRocltjaG5dLCBjaG4sIHNibG9jayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh1c2Vsb25nYmxvY2tbMF0gKyB1c2Vsb25nYmxvY2tbMV0pID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBNL1MgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgIGlmIChnZnAtPm1vZGUgPT0gSk9JTlRfU1RFUkVPKSB7CisgICAgICAgICAgICAgICAgICAgIHZicnBzeV9jb21wdXRlX01TX3RocmVzaG9sZHMoZWIsIHRociwgZ2ZjLT5tbGRfY2JfcywgZ2ZjLT5BVEgtPmNiX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ZwLT5BVEhsb3dlciAqIGdmYy0+QVRILT5hZGp1c3QsIGdmcC0+bXNmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ZjLT5ucGFydF9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogTC9SIGNoYW5uZWwgKi8KKyNpZiAwCisgICAgICAgICAgICAgICAgaWYgKGdmcC0+bW9kZSA9PSBTVEVSRU8gfHwgZ2ZwLT5tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogVE9ETzogYXBwbHkgYWRhcHRpdmUgQVRIIG1hc2tpbmcgaGVyZSA/PyAqLworICAgICAgICAgICAgZm9yIChjaG4gPSAwOyBjaG4gPCBuX2Nobl9wc3k7ICsrY2huKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IGNoMDEgPSBjaG4gJiAweDAxOworICAgICAgICAgICAgICAgIGlmICghdXNlbG9uZ2Jsb2NrW2NoMDFdKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRfcGFydGl0aW9uMnNjYWxlZmFjX3MoZ2ZjLCBlYltjaG5dLCB0aHJbY2huXSwgY2huLCBzYmxvY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKioqICAgc2hvcnQgYmxvY2sgcHJlLWVjaG8gY29udHJvbCAgICoqKiovCisgICAgICAgIGZvciAoY2huID0gMDsgY2huIDwgbl9jaG5fcHN5OyBjaG4rKykgeworICAgICAgICAgICAgaW50IGNvbnN0IGNoMDEgPSBjaG4gJiAweDAxOworCisgICAgICAgICAgICBpZiAodXNlbG9uZ2Jsb2NrW2NoMDFdKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBTQk1BWF9zOyBzYisrKSB7CisgICAgICAgICAgICAgICAgRkxPQVQgICBuZXdfdGhtbVszXTsKKyAgICAgICAgICAgICAgICBmb3IgKHNibG9jayA9IDA7IHNibG9jayA8IDM7IHNibG9jaysrKSB7CisgICAgICAgICAgICAgICAgICAgIHRobW0gPSBnZmMtPnRobVtjaG5dLnNbc2JdW3NibG9ja107CisgICAgICAgICAgICAgICAgICAgIHRobW0gKj0gTlNfUFJFRUNIT19BVFQwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuc19hdHRhY2tzW2Nobl1bc2Jsb2NrXSA+PSAyIHx8IG5zX2F0dGFja3NbY2huXVtzYmxvY2sgKyAxXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29uc3QgaWR4ID0gKHNibG9jayAhPSAwKSA/IHNibG9jayAtIDEgOiAyOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvbnN0IHAgPSBOU19JTlRFUlAoZ2ZjLT50aG1bY2huXS5zW3NiXVtpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhtbSwgTlNfUFJFRUNIT19BVFQxICogcGNmYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRobW0gPSBNaW4odGhtbSwgcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobnNfYXR0YWNrc1tjaG5dW3NibG9ja10gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0IGlkeCA9IChzYmxvY2sgIT0gMCkgPyBzYmxvY2sgLSAxIDogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb25zdCBwID0gTlNfSU5URVJQKGdmYy0+dGhtW2Nobl0uc1tzYl1baWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRobW0sIE5TX1BSRUVDSE9fQVRUMiAqIHBjZmFjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aG1tID0gTWluKHRobW0sIHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzYmxvY2sgIT0gMCAmJiBuc19hdHRhY2tzW2Nobl1bc2Jsb2NrIC0gMV0gPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNibG9jayA9PSAwICYmIGdmYy0+bnNQc3kubGFzdF9hdHRhY2tzW2Nobl0gPT0gMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25zdCBpZHggPSAoc2Jsb2NrICE9IDIpID8gc2Jsb2NrICsgMSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29uc3QgcCA9IE5TX0lOVEVSUChnZmMtPnRobVtjaG5dLnNbc2JdW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aG1tLCBOU19QUkVFQ0hPX0FUVDIgKiBwY2ZhY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhtbSA9IE1pbih0aG1tLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIHB1bHNlIGxpa2Ugc2lnbmFsIGRldGVjdGlvbiBmb3IgZmF0Ym95LndhdiBhbmQgc28gb24gKi8KKyAgICAgICAgICAgICAgICAgICAgdGhtbSAqPSBzdWJfc2hvcnRfZmFjdG9yW2Nobl1bc2Jsb2NrXTsKKworICAgICAgICAgICAgICAgICAgICBuZXdfdGhtbVtzYmxvY2tdID0gdGhtbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzYmxvY2sgPSAwOyBzYmxvY2sgPCAzOyBzYmxvY2srKykgeworICAgICAgICAgICAgICAgICAgICBnZmMtPnRobVtjaG5dLnNbc2JdW3NibG9ja10gPSBuZXdfdGhtbVtzYmxvY2tdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNobiA9IDA7IGNobiA8IG5fY2huX3BzeTsgY2huKyspIHsKKyAgICAgICAgZ2ZjLT5uc1BzeS5sYXN0X2F0dGFja3NbY2huXSA9IG5zX2F0dGFja3NbY2huXVsyXTsKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgKiBkZXRlcm1pbmUgZmluYWwgYmxvY2sgdHlwZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB2YnJwc3lfYXBwbHlfYmxvY2tfdHlwZShnZnAsIHVzZWxvbmdibG9jaywgYmxvY2t0eXBlX2QpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogY29tcHV0ZSB0aGUgdmFsdWUgb2YgUEUgdG8gcmV0dXJuIC4uLiBubyBkZWxheSBhbmQgYWR2YW5jZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBmb3IgKGNobiA9IDA7IGNobiA8IG5fY2huX3BzeTsgY2huKyspIHsKKyAgICAgICAgRkxPQVQgICpwcGU7CisgICAgICAgIGludCAgICAgdHlwZTsKKyAgICAgICAgSUlJX3BzeV9yYXRpbyBjb25zdCAqbXI7CisKKyAgICAgICAgaWYgKGNobiA+IDEpIHsKKyAgICAgICAgICAgIHBwZSA9IHBlcmNlcF9NU19lbnRyb3B5IC0gMjsKKyAgICAgICAgICAgIHR5cGUgPSBOT1JNX1RZUEU7CisgICAgICAgICAgICBpZiAoYmxvY2t0eXBlX2RbMF0gPT0gU0hPUlRfVFlQRSB8fCBibG9ja3R5cGVfZFsxXSA9PSBTSE9SVF9UWVBFKQorICAgICAgICAgICAgICAgIHR5cGUgPSBTSE9SVF9UWVBFOworICAgICAgICAgICAgbXIgPSAmbWFza2luZ19NU19yYXRpb1tncl9vdXRdW2NobiAtIDJdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHBlID0gcGVyY2VwX2VudHJvcHk7CisgICAgICAgICAgICB0eXBlID0gYmxvY2t0eXBlX2RbY2huXTsKKyAgICAgICAgICAgIG1yID0gJm1hc2tpbmdfcmF0aW9bZ3Jfb3V0XVtjaG5dOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgPT0gU0hPUlRfVFlQRSkgeworICAgICAgICAgICAgcHBlW2Nobl0gPSBwZWNhbGNfcyhtciwgZ2ZjLT5tYXNraW5nX2xvd2VyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBwZVtjaG5dID0gcGVjYWxjX2wobXIsIGdmYy0+bWFza2luZ19sb3dlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2ZwLT5hbmFseXNpcykgeworICAgICAgICAgICAgZ2ZjLT5waW5mby0+cGVbZ3Jfb3V0XVtjaG5dID0gcHBlW2Nobl07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworc3RhdGljICBGTE9BVAorczNfZnVuY194KEZMT0FUIGJhcmssIEZMT0FUIGhmX3Nsb3BlKQoreworICAgIEZMT0FUICAgdGVtcHggPSBiYXJrLCB0ZW1weTsKKworICAgIGlmICh0ZW1weCA+PSAwKSB7CisgICAgICAgIHRlbXB5ID0gLXRlbXB4ICogMjc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0ZW1weSA9IHRlbXB4ICogaGZfc2xvcGU7CisgICAgfQorICAgIGlmICh0ZW1weSA8PSAtNzIuMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGV4cCh0ZW1weSAqIExOX1RPX0xPRzEwKTsKK30KKworc3RhdGljICBGTE9BVAorbm9ybV9zM19mdW5jX3goRkxPQVQgaGZfc2xvcGUpCit7CisgICAgZG91YmxlICBsaW1fYSA9IDAsIGxpbV9iID0gMDsKKyAgICB7CisgICAgICAgIGRvdWJsZSAgeCA9IDAsIGwsIGg7CisgICAgICAgIGZvciAoeCA9IDA7IHMzX2Z1bmNfeCh4LCBoZl9zbG9wZSkgPiAxZS0yMDsgeCAtPSAxKTsKKyAgICAgICAgbCA9IHg7CisgICAgICAgIGggPSAwOworICAgICAgICB3aGlsZSAoZmFicyhoIC0gbCkgPiAxZS0xMikgeworICAgICAgICAgICAgeCA9IChoICsgbCkgLyAyOworICAgICAgICAgICAgaWYgKHMzX2Z1bmNfeCh4LCBoZl9zbG9wZSkgPiAwKSB7CisgICAgICAgICAgICAgICAgaCA9IHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsID0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsaW1fYSA9IGw7CisgICAgfQorICAgIHsKKyAgICAgICAgZG91YmxlICB4ID0gMCwgbCwgaDsKKyAgICAgICAgZm9yICh4ID0gMDsgczNfZnVuY194KHgsIGhmX3Nsb3BlKSA+IDFlLTIwOyB4ICs9IDEpOworICAgICAgICBsID0gMDsKKyAgICAgICAgaCA9IHg7CisgICAgICAgIHdoaWxlIChmYWJzKGggLSBsKSA+IDFlLTEyKSB7CisgICAgICAgICAgICB4ID0gKGggKyBsKSAvIDI7CisgICAgICAgICAgICBpZiAoczNfZnVuY194KHgsIGhmX3Nsb3BlKSA+IDApIHsKKyAgICAgICAgICAgICAgICBsID0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGggPSB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxpbV9iID0gaDsKKyAgICB9CisgICAgeworICAgICAgICBkb3VibGUgIHN1bSA9IDA7CisgICAgICAgIGludCBjb25zdCBtID0gMTAwMDsKKyAgICAgICAgaW50ICAgICBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG07ICsraSkgeworICAgICAgICAgICAgZG91YmxlICB4ID0gbGltX2EgKyBpICogKGxpbV9iIC0gbGltX2EpIC8gbTsKKyAgICAgICAgICAgIGRvdWJsZSAgeSA9IHMzX2Z1bmNfeCh4LCBoZl9zbG9wZSk7CisgICAgICAgICAgICBzdW0gKz0geTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgIG5vcm0gPSAobSArIDEpIC8gKHN1bSAqIChsaW1fYiAtIGxpbV9hKSk7CisgICAgICAgICAgICAvKnByaW50ZiggIm5vcm0gPSAlbGZcbiIsbm9ybSk7ICovCisgICAgICAgICAgICByZXR1cm4gbm9ybTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKKy8qIAorICogICBUaGUgc3ByZWFkaW5nIGZ1bmN0aW9uLiAgVmFsdWVzIHJldHVybmVkIGluIHVuaXRzIG9mIGVuZXJneQorICovCitzdGF0aWMgIEZMT0FUCitzM19mdW5jKEZMT0FUIGJhcmspCit7CisgICAgRkxPQVQgICB0ZW1weCwgeCwgdGVtcHksIHRlbXA7CisgICAgdGVtcHggPSBiYXJrOworICAgIGlmICh0ZW1weCA+PSAwKQorICAgICAgICB0ZW1weCAqPSAzOworICAgIGVsc2UKKyAgICAgICAgdGVtcHggKj0gMS41OworCisgICAgaWYgKHRlbXB4ID49IDAuNSAmJiB0ZW1weCA8PSAyLjUpIHsKKyAgICAgICAgdGVtcCA9IHRlbXB4IC0gMC41OworICAgICAgICB4ID0gOC4wICogKHRlbXAgKiB0ZW1wIC0gMi4wICogdGVtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgeCA9IDAuMDsKKyAgICB0ZW1weCArPSAwLjQ3NDsKKyAgICB0ZW1weSA9IDE1LjgxMTM4OSArIDcuNSAqIHRlbXB4IC0gMTcuNSAqIHNxcnQoMS4wICsgdGVtcHggKiB0ZW1weCk7CisKKyAgICBpZiAodGVtcHkgPD0gLTYwLjApCisgICAgICAgIHJldHVybiAwLjA7CisKKyAgICB0ZW1weCA9IGV4cCgoeCArIHRlbXB5KSAqIExOX1RPX0xPRzEwKTsKKworICAgIC8qIE5vcm1hbGl6YXRpb24uICBUaGUgc3ByZWFkaW5nIGZ1bmN0aW9uIHNob3VsZCBiZSBub3JtYWxpemVkIHNvIHRoYXQ6CisgICAgICAgK2luZgorICAgICAgIC8KKyAgICAgICB8ICBzMyBbIGJhcmsgXSAgZChiYXJrKSAgID0gIDEKKyAgICAgICAvCisgICAgICAgLWluZgorICAgICAqLworICAgIHRlbXB4IC89IC42NjA5MTkzOworICAgIHJldHVybiB0ZW1weDsKK30KKworI2lmIDAKK3N0YXRpYyAgRkxPQVQKK25vcm1fczNfZnVuYyh2b2lkKQoreworICAgIGRvdWJsZSAgbGltX2EgPSAwLCBsaW1fYiA9IDA7CisgICAgZG91YmxlICB4ID0gMCwgbCwgaDsKKyAgICBmb3IgKHggPSAwOyBzM19mdW5jKHgpID4gMWUtMjA7IHggLT0gMSk7CisgICAgbCA9IHg7CisgICAgaCA9IDA7CisgICAgd2hpbGUgKGZhYnMoaCAtIGwpID4gMWUtMTIpIHsKKyAgICAgICAgeCA9IChoICsgbCkgLyAyOworICAgICAgICBpZiAoczNfZnVuYyh4KSA+IDApIHsKKyAgICAgICAgICAgIGggPSB4OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbCA9IHg7CisgICAgICAgIH0KKyAgICB9CisgICAgbGltX2EgPSBsOworICAgIGZvciAoeCA9IDA7IHMzX2Z1bmMoeCkgPiAxZS0yMDsgeCArPSAxKTsKKyAgICBsID0gMDsKKyAgICBoID0geDsKKyAgICB3aGlsZSAoZmFicyhoIC0gbCkgPiAxZS0xMikgeworICAgICAgICB4ID0gKGggKyBsKSAvIDI7CisgICAgICAgIGlmIChzM19mdW5jKHgpID4gMCkgeworICAgICAgICAgICAgbCA9IHg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBoID0geDsKKyAgICAgICAgfQorICAgIH0KKyAgICBsaW1fYiA9IGg7CisgICAgeworICAgICAgICBkb3VibGUgIHN1bSA9IDA7CisgICAgICAgIGludCBjb25zdCBtID0gMTAwMDsKKyAgICAgICAgaW50ICAgICBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG07ICsraSkgeworICAgICAgICAgICAgZG91YmxlICB4ID0gbGltX2EgKyBpICogKGxpbV9iIC0gbGltX2EpIC8gbTsKKyAgICAgICAgICAgIGRvdWJsZSAgeSA9IHMzX2Z1bmMoeCk7CisgICAgICAgICAgICBzdW0gKz0geTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgIG5vcm0gPSAobSArIDEpIC8gKHN1bSAqIChsaW1fYiAtIGxpbV9hKSk7CisgICAgICAgICAgICAvKnByaW50ZiggIm5vcm0gPSAlbGZcbiIsbm9ybSk7ICovCisgICAgICAgICAgICByZXR1cm4gbm9ybTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50Citpbml0X251bWxpbmUoaW50ICpudW1saW5lcywgaW50ICpibywgaW50ICpibSwKKyAgICAgICAgICAgICBGTE9BVCAqIGJ2YWwsIEZMT0FUICogYnZhbF93aWR0aCwgRkxPQVQgKiBtbGQsIEZMT0FUICogYm9fdywKKyAgICAgICAgICAgICBGTE9BVCBzZnJlcSwgaW50IGJsa3NpemUsIGludCBjb25zdCAqc2NhbGVwb3MsIEZMT0FUIGRlbHRhZnJlcSwgaW50IHNibWF4KQoreworICAgIEZMT0FUICAgYl9mcnFbQ0JBTkRTICsgMV07CisgICAgRkxPQVQgICBmX3RtcDsKKyAgICBGTE9BVCAgIHNhbXBsZV9mcmVxX2ZyYWMgPSBzZnJlcSAvIChzYm1heCA+IDE1ID8gMiAqIDU3NiA6IDIgKiAxOTIpOworICAgIGludCAgICAgcGFydGl0aW9uW0hCTEtTSVpFXSA9IHsgMCB9OworICAgIGludCAgICAgaSwgaiwgaywgbmk7CisgICAgaW50ICAgICBzZmI7CisgICAgc2ZyZXEgLz0gYmxrc2l6ZTsKKyAgICBqID0gMDsKKyAgICBuaSA9IDA7CisgICAgLyogY29tcHV0ZSBudW1saW5lcywgdGhlIG51bWJlciBvZiBzcGVjdHJhbCBsaW5lcyBpbiBlYWNoIHBhcnRpdGlvbiBiYW5kICovCisgICAgLyogZWFjaCBwYXJ0aXRpb24gYmFuZCBzaG91bGQgYmUgYWJvdXQgREVMQkFSSyB3aWRlLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBDQkFORFM7IGkrKykgeworICAgICAgICBGTE9BVCAgIGJhcmsxOworICAgICAgICBpbnQgICAgIGoyOworICAgICAgICBiYXJrMSA9IGZyZXEyYmFyayhzZnJlcSAqIGopOworCisgICAgICAgIGJfZnJxW2ldID0gc2ZyZXEgKiBqOworCisgICAgICAgIGZvciAoajIgPSBqOyBmcmVxMmJhcmsoc2ZyZXEgKiBqMikgLSBiYXJrMSA8IERFTEJBUksgJiYgajIgPD0gYmxrc2l6ZSAvIDI7IGoyKyspOworCisgICAgICAgIG51bWxpbmVzW2ldID0gajIgLSBqOworICAgICAgICBuaSA9IGkgKyAxOworCisgICAgICAgIHdoaWxlIChqIDwgajIpIHsKKyAgICAgICAgICAgIGFzc2VydChqIDwgSEJMS1NJWkUpOworICAgICAgICAgICAgcGFydGl0aW9uW2orK10gPSBpOworICAgICAgICB9CisgICAgICAgIGlmIChqID4gYmxrc2l6ZSAvIDIpIHsKKyAgICAgICAgICAgIGogPSBibGtzaXplIC8gMjsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydChpIDwgQ0JBTkRTKTsKKyAgICBiX2ZycVtpXSA9IHNmcmVxICogajsKKworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2JtYXg7IHNmYisrKSB7CisgICAgICAgIGludCAgICAgaTEsIGkyLCBzdGFydCwgZW5kOworICAgICAgICBGTE9BVCAgIGFyZzsKKyAgICAgICAgc3RhcnQgPSBzY2FsZXBvc1tzZmJdOworICAgICAgICBlbmQgPSBzY2FsZXBvc1tzZmIgKyAxXTsKKworICAgICAgICBpMSA9IGZsb29yKC41ICsgZGVsdGFmcmVxICogKHN0YXJ0IC0gLjUpKTsKKyAgICAgICAgaWYgKGkxIDwgMCkKKyAgICAgICAgICAgIGkxID0gMDsKKyAgICAgICAgaTIgPSBmbG9vciguNSArIGRlbHRhZnJlcSAqIChlbmQgLSAuNSkpOworCisgICAgICAgIGlmIChpMiA+IGJsa3NpemUgLyAyKQorICAgICAgICAgICAgaTIgPSBibGtzaXplIC8gMjsKKworICAgICAgICBibVtzZmJdID0gKHBhcnRpdGlvbltpMV0gKyBwYXJ0aXRpb25baTJdKSAvIDI7CisgICAgICAgIGJvW3NmYl0gPSBwYXJ0aXRpb25baTJdOworCisgICAgICAgIGZfdG1wID0gc2FtcGxlX2ZyZXFfZnJhYyAqIGVuZDsKKyAgICAgICAgLyogY2FsY3VsYXRlIGhvdyBtdWNoIG9mIHRoaXMgYmFuZCBiZWxvbmdzIHRvIGN1cnJlbnQgc2NhbGVmYWN0b3IgYmFuZCAqLworICAgICAgICBib193W3NmYl0gPSAoZl90bXAgLSBiX2ZycVtib1tzZmJdXSkgLyAoYl9mcnFbYm9bc2ZiXSArIDFdIC0gYl9mcnFbYm9bc2ZiXV0pOworICAgICAgICBpZiAoYm9fd1tzZmJdIDwgMCkgeworICAgICAgICAgICAgYm9fd1tzZmJdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChib193W3NmYl0gPiAxKSB7CisgICAgICAgICAgICAgICAgYm9fd1tzZmJdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBzZXR1cCBzdGVyZW8gZGVtYXNraW5nIHRocmVzaG9sZHMgKi8KKyAgICAgICAgLyogZm9ybXVsYSByZXZlcnNlIGVuZ2luZXJyZWQgZnJvbSBwbG90IGluIHBhcGVyICovCisgICAgICAgIGFyZyA9IGZyZXEyYmFyayhzZnJlcSAqIHNjYWxlcG9zW3NmYl0gKiBkZWx0YWZyZXEpOworICAgICAgICBhcmcgPSAoTWluKGFyZywgMTUuNSkgLyAxNS41KTsKKworICAgICAgICBtbGRbc2ZiXSA9IHBvdygxMC4wLCAxLjI1ICogKDEgLSBjb3MoUEkgKiBhcmcpKSAtIDIuNSk7CisgICAgfQorCisgICAgLyogY29tcHV0ZSBiYXJrIHZhbHVlcyBvZiBlYWNoIGNyaXRpY2FsIGJhbmQgKi8KKyAgICBqID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbmk7IGsrKykgeworICAgICAgICBpbnQgY29uc3QgdyA9IG51bWxpbmVzW2tdOworICAgICAgICBGTE9BVCAgIGJhcmsxLCBiYXJrMjsKKworICAgICAgICBiYXJrMSA9IGZyZXEyYmFyayhzZnJlcSAqIChqKSk7CisgICAgICAgIGJhcmsyID0gZnJlcTJiYXJrKHNmcmVxICogKGogKyB3IC0gMSkpOworICAgICAgICBidmFsW2tdID0gLjUgKiAoYmFyazEgKyBiYXJrMik7CisKKyAgICAgICAgYmFyazEgPSBmcmVxMmJhcmsoc2ZyZXEgKiAoaiAtIC41KSk7CisgICAgICAgIGJhcmsyID0gZnJlcTJiYXJrKHNmcmVxICogKGogKyB3IC0gLjUpKTsKKyAgICAgICAgYnZhbF93aWR0aFtrXSA9IGJhcmsyIC0gYmFyazE7CisgICAgICAgIGogKz0gdzsKKyAgICB9CisKKyAgICByZXR1cm4gbmk7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfczNfdmFsdWVzKEZMT0FUICoqIHAsCisgICAgICAgICAgICAgICBpbnQgKCpzM2luZClbMl0sIGludCBucGFydCwgRkxPQVQgY29uc3QgKmJ2YWwsIEZMT0FUIGNvbnN0ICpidmFsX3dpZHRoLAorICAgICAgICAgICAgICAgRkxPQVQgY29uc3QgKm5vcm0sIGludCB1c2Vfb2xkX3MzKQoreworICAgIEZMT0FUICAgczNbQ0JBTkRTXVtDQkFORFNdOworICAgIC8qIFRoZSBzMyBhcnJheSBpcyBub3QgbGluZWFyIGluIHRoZSBiYXJrIHNjYWxlLgorICAgICAqIGJ2YWxbeF0gc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IHRoZSBiYXJrIHZhbHVlLgorICAgICAqLworICAgIGludCAgICAgaSwgaiwgazsKKyAgICBpbnQgICAgIG51bWJlck9mTm9uZVplcm8gPSAwOworCisgICAgLyogc1tpXVtqXSwgdGhlIHZhbHVlIG9mIHRoZSBzcHJlYWRpbmcgZnVuY3Rpb24sCisgICAgICogY2VudGVyZWQgYXQgYmFuZCBqIChtYXNrZXIpLCBmb3IgYmFuZCBpIChtYXNrZWUpCisgICAgICoKKyAgICAgKiBpLmUuOiBzdW0gb3ZlciBqIHRvIHNwcmVhZCBpbnRvIHNpZ25hbCBiYXJrdmFsPWkKKyAgICAgKiBOT1RFOiBpIGFuZCBqIGFyZSB1c2VkIG9wcG9zaXRlIGFzIGluIHRoZSBJU08gZG9jcworICAgICAqLworICAgIGlmICh1c2Vfb2xkX3MzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucGFydDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnBhcnQ7IGorKykgeworICAgICAgICAgICAgICAgIEZMT0FUICAgdiA9IHMzX2Z1bmMoYnZhbFtpXSAtIGJ2YWxbal0pICogYnZhbF93aWR0aFtqXTsKKyAgICAgICAgICAgICAgICBzM1tpXVtqXSA9IHYgKiBub3JtW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnBhcnQ7IGorKykgeworICAgICAgICAgICAgRkxPQVQgICBoZl9zbG9wZSA9IDE1ICsgTWluKDIxIC8gYnZhbFtqXSwgMTIpOworICAgICAgICAgICAgRkxPQVQgICBzM194X25vcm0gPSBub3JtX3MzX2Z1bmNfeChoZl9zbG9wZSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnBhcnQ7IGkrKykgeworICAgICAgICAgICAgICAgIEZMT0FUICAgdiA9IHMzX3hfbm9ybSAqIHMzX2Z1bmNfeChidmFsW2ldIC0gYnZhbFtqXSwgaGZfc2xvcGUpICogYnZhbF93aWR0aFtqXTsKKyAgICAgICAgICAgICAgICBzM1tpXVtqXSA9IHYgKiBub3JtW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBucGFydDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBucGFydDsgaisrKSB7CisgICAgICAgICAgICBpZiAoczNbaV1bal0gPiAwLjBmKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMzaW5kW2ldWzBdID0gajsKKworICAgICAgICBmb3IgKGogPSBucGFydCAtIDE7IGogPiAwOyBqLS0pIHsKKyAgICAgICAgICAgIGlmIChzM1tpXVtqXSA+IDAuMGYpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgczNpbmRbaV1bMV0gPSBqOworICAgICAgICBudW1iZXJPZk5vbmVaZXJvICs9IChzM2luZFtpXVsxXSAtIHMzaW5kW2ldWzBdICsgMSk7CisgICAgfQorICAgICpwID0gbWFsbG9jKHNpemVvZihGTE9BVCkgKiBudW1iZXJPZk5vbmVaZXJvKTsKKyAgICBpZiAoISpwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBrID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnBhcnQ7IGkrKykKKyAgICAgICAgZm9yIChqID0gczNpbmRbaV1bMF07IGogPD0gczNpbmRbaV1bMV07IGorKykKKyAgICAgICAgICAgICgqcClbaysrXSA9IHMzW2ldW2pdOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAgRkxPQVQKK3N0ZXJlb19kZW1hc2soZG91YmxlIGYpCit7CisgICAgLyogc2V0dXAgc3RlcmVvIGRlbWFza2luZyB0aHJlc2hvbGRzICovCisgICAgLyogZm9ybXVsYSByZXZlcnNlIGVuZ2luZXJyZWQgZnJvbSBwbG90IGluIHBhcGVyICovCisgICAgZG91YmxlICBhcmcgPSBmcmVxMmJhcmsoZik7CisgICAgYXJnID0gKE1pbihhcmcsIDE1LjUpIC8gMTUuNSk7CisKKyAgICByZXR1cm4gcG93KDEwLjAsIDEuMjUgKiAoMSAtIGNvcyhQSSAqIGFyZykpIC0gMi41KTsKK30KKworaW50Citwc3ltb2RlbF9pbml0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBpLCBqLCBiLCBzYiwgazsKKyAgICBpbnQgICAgIHVzZV9vbGRfczMgPSAxOworICAgIEZMT0FUICAgYnZsX2EgPSAxMywgYnZsX2IgPSAyNDsKKyAgICBGTE9BVCAgIHNucl9sX2EgPSAwLCBzbnJfbF9iID0gMDsKKyAgICBGTE9BVCAgIHNucl9zX2EgPSAtOC4yNSwgc25yX3NfYiA9IC00LjU7CisKKyAgICBGTE9BVCAgIGJ2YWxbQ0JBTkRTXTsKKyAgICBGTE9BVCAgIGJ2YWxfd2lkdGhbQ0JBTkRTXTsKKyAgICBGTE9BVCAgIG5vcm1bQ0JBTkRTXTsKKyAgICBGTE9BVCBjb25zdCBzZnJlcSA9IGdmcC0+b3V0X3NhbXBsZXJhdGU7CisKKyAgICBzd2l0Y2ggKGdmcC0+ZXhwZXJpbWVudGFsWikgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgICB1c2Vfb2xkX3MzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB1c2Vfb2xkX3MzID0gKGdmcC0+VkJSID09IHZicl9tdHJoIHx8IGdmcC0+VkJSID09IHZicl9tdCkgPyAwIDogMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB1c2Vfb2xkX3MzID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBidmxfYSA9IDg7CisgICAgICAgIHNucl9sX2EgPSAtMS43NTsKKyAgICAgICAgc25yX2xfYiA9IC0wLjAxMjU7CisgICAgICAgIHNucl9zX2EgPSAtOC4yNTsKKyAgICAgICAgc25yX3NfYiA9IC0yLjI1OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZ2ZjLT5tc19lbmVyX3JhdGlvX29sZCA9IC4yNTsKKyAgICBnZmMtPmJsb2NrdHlwZV9vbGRbMF0gPSBnZmMtPmJsb2NrdHlwZV9vbGRbMV0gPSBOT1JNX1RZUEU7IC8qIHRoZSB2YnIgaGVhZGVyIGlzIGxvbmcgYmxvY2tzICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBDQkFORFM7ICsraikgeworICAgICAgICAgICAgZ2ZjLT5uYl8xW2ldW2pdID0gMWUyMDsKKyAgICAgICAgICAgIGdmYy0+bmJfMltpXVtqXSA9IDFlMjA7CisgICAgICAgICAgICBnZmMtPm5iX3MxW2ldW2pdID0gZ2ZjLT5uYl9zMltpXVtqXSA9IDEuMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBTQk1BWF9sOyBzYisrKSB7CisgICAgICAgICAgICBnZmMtPmVuW2ldLmxbc2JdID0gMWUyMDsKKyAgICAgICAgICAgIGdmYy0+dGhtW2ldLmxbc2JdID0gMWUyMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBTQk1BWF9zOyBzYisrKSB7CisgICAgICAgICAgICAgICAgZ2ZjLT5lbltpXS5zW3NiXVtqXSA9IDFlMjA7CisgICAgICAgICAgICAgICAgZ2ZjLT50aG1baV0uc1tzYl1bal0gPSAxZTIwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2ZjLT5uc1BzeS5sYXN0X2F0dGFja3NbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA5OyBqKyspCisgICAgICAgICAgICBnZmMtPm5zUHN5Lmxhc3RfZW5fc3Vic2hvcnRbaV1bal0gPSAxMC47CisgICAgfQorCisKKyAgICAvKiBpbml0LiBmb3IgbG91ZG5lc3MgYXBwcm94LiAtamQgMjAwMSBtYXIgMjcgKi8KKyAgICBnZmMtPmxvdWRuZXNzX3NxX3NhdmVbMF0gPSBnZmMtPmxvdWRuZXNzX3NxX3NhdmVbMV0gPSAwLjA7CisKKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBub3cgY29tcHV0ZSB0aGUgcHN5Y2hvYWNvdXN0aWMgbW9kZWwgc3BlY2lmaWMgY29uc3RhbnRzCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBjb21wdXRlIG51bWxpbmVzLCBibywgYm0sIGJ2YWwsIGJ2YWxfd2lkdGgsIG1sZCAqLworICAgIGdmYy0+bnBhcnRfbAorICAgICAgICA9IGluaXRfbnVtbGluZShnZmMtPm51bWxpbmVzX2wsIGdmYy0+Ym9fbCwgZ2ZjLT5ibV9sLAorICAgICAgICAgICAgICAgICAgICAgICBidmFsLCBidmFsX3dpZHRoLCBnZmMtPm1sZF9sLCBnZmMtPlBTWS0+Ym9fbF93ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNmcmVxLCBCTEtTSVpFLCBnZmMtPnNjYWxlZmFjX2JhbmQubCwgQkxLU0laRSAvICgyLjAgKiA1NzYpLCBTQk1BWF9sKTsKKyAgICBhc3NlcnQoZ2ZjLT5ucGFydF9sIDwgQ0JBTkRTKTsKKyAgICAvKiBjb21wdXRlIHRoZSBzcHJlYWRpbmcgZnVuY3Rpb24gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2ZjLT5ucGFydF9sOyBpKyspIHsKKyAgICAgICAgZG91YmxlICBzbnIgPSBzbnJfbF9hOworICAgICAgICBpZiAoYnZhbFtpXSA+PSBidmxfYSkgeworICAgICAgICAgICAgc25yID0gc25yX2xfYiAqIChidmFsW2ldIC0gYnZsX2EpIC8gKGJ2bF9iIC0gYnZsX2EpCisgICAgICAgICAgICAgICAgKyBzbnJfbF9hICogKGJ2bF9iIC0gYnZhbFtpXSkgLyAoYnZsX2IgLSBidmxfYSk7CisgICAgICAgIH0KKyAgICAgICAgbm9ybVtpXSA9IHBvdygxMC4wLCBzbnIgLyAxMC4wKTsKKyAgICAgICAgaWYgKGdmYy0+bnVtbGluZXNfbFtpXSA+IDApIHsKKyAgICAgICAgICAgIGdmYy0+cm51bWxpbmVzX2xbaV0gPSAxLjAgLyBnZmMtPm51bWxpbmVzX2xbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBnZmMtPnJudW1saW5lc19sW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpID0gaW5pdF9zM192YWx1ZXMoJmdmYy0+czNfbGwsIGdmYy0+czNpbmQsIGdmYy0+bnBhcnRfbCwgYnZhbCwgYnZhbF93aWR0aCwgbm9ybSwgdXNlX29sZF9zMyk7CisgICAgaWYgKGkpCisgICAgICAgIHJldHVybiBpOworCisgICAgLyogY29tcHV0ZSBsb25nIGJsb2NrIHNwZWNpZmljIHZhbHVlcywgQVRIIGFuZCBNSU5WQUwgKi8KKyAgICBqID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2ZjLT5ucGFydF9sOyBpKyspIHsKKyAgICAgICAgZG91YmxlICB4OworCisgICAgICAgIC8qIEFUSCAqLworICAgICAgICB4ID0gRkxPQVRfTUFYOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZ2ZjLT5udW1saW5lc19sW2ldOyBrKyssIGorKykgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgZnJlcSA9IHNmcmVxICogaiAvICgxMDAwLjAgKiBCTEtTSVpFKTsKKyAgICAgICAgICAgIEZMT0FUICAgbGV2ZWw7CisgICAgICAgICAgICAvKiBmcmVxID0gTWluKC4xLGZyZXEpOyAqLyAvKiBBVEggYmVsb3cgMTAwIEh6IGNvbnN0YW50LCBub3QgZnVydGhlciBjbGltYmluZyAqLworICAgICAgICAgICAgbGV2ZWwgPSBBVEhmb3JtdWxhKGZyZXEgKiAxMDAwLCBnZnApIC0gMjA7IC8qIHNjYWxlIHRvIEZGVCB1bml0czsgcmV0dXJuZWQgdmFsdWUgaXMgaW4gZEIgKi8KKyAgICAgICAgICAgIGxldmVsID0gcG93KDEwLiwgMC4xICogbGV2ZWwpOyAvKiBjb252ZXJ0IGZyb20gZEIgLT4gZW5lcmd5ICovCisgICAgICAgICAgICBsZXZlbCAqPSBnZmMtPm51bWxpbmVzX2xbaV07CisgICAgICAgICAgICBpZiAoeCA+IGxldmVsKQorICAgICAgICAgICAgICAgIHggPSBsZXZlbDsKKyAgICAgICAgfQorICAgICAgICBnZmMtPkFUSC0+Y2JfbFtpXSA9IHg7CisKKyAgICAgICAgLyogTUlOVkFMLgorICAgICAgICAgICBGb3IgbG93IGZyZXEsIHRoZSBzdHJlbmd0aCBvZiB0aGUgbWFza2luZyBpcyBsaW1pdGVkIGJ5IG1pbnZhbAorICAgICAgICAgICB0aGlzIGlzIGFuIElTTyBNUEVHMSB0aGluZywgZG9udCBrbm93IGlmIGl0IGlzIHJlYWxseSBuZWVkZWQgKi8KKyAgICAgICAgLyogRklYTUU6IGl0IGRvZXMgd29yayB0byByZWR1Y2UgbG93LWZyZXEgcHJvYmxlbXMgaW4gUzUzLVdpbmQtU2F4CisgICAgICAgICAgIGFuZCBsZWFkLXZvaWNlIHNhbXBsZXMsIGJ1dCBpbnRyb2R1Y2VzIHNvbWUgMyBrYnBzIGJpdCBibG9hdCB0b28uCisgICAgICAgICAgIFRPRE86IEZ1cnRoZXIgcmVmaW5lbWVudCBvZiB0aGUgc2hhcGUgb2YgdGhpcyBoYWNrLgorICAgICAgICAqLworICAgICAgICB4ID0gLTIwICsgYnZhbFtpXSAqIDIwIC8gMTA7CisgICAgICAgIGlmICh4ID4gNikgeworICAgICAgICAgICAgeCA9IDEwMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoeCA8IC0xNSkgeworICAgICAgICAgICAgeCA9IC0xNTsKKyAgICAgICAgfQorICAgICAgICB4IC09IDguOworICAgICAgICBnZmMtPm1pbnZhbF9sW2ldID0gcG93KDEwLjAsIHggLyAxMC4pICogZ2ZjLT5udW1saW5lc19sW2ldOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBkbyB0aGUgc2FtZSB0aGluZ3MgZm9yIHNob3J0IGJsb2NrcworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZ2ZjLT5ucGFydF9zCisgICAgICAgID0gaW5pdF9udW1saW5lKGdmYy0+bnVtbGluZXNfcywgZ2ZjLT5ib19zLCBnZmMtPmJtX3MsCisgICAgICAgICAgICAgICAgICAgICAgIGJ2YWwsIGJ2YWxfd2lkdGgsIGdmYy0+bWxkX3MsIGdmYy0+UFNZLT5ib19zX3dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2ZyZXEsIEJMS1NJWkVfcywgZ2ZjLT5zY2FsZWZhY19iYW5kLnMsIEJMS1NJWkVfcyAvICgyLjAgKiAxOTIpLCBTQk1BWF9zKTsKKyAgICBhc3NlcnQoZ2ZjLT5ucGFydF9zIDwgQ0JBTkRTKTsKKworICAgIC8qIFNOUiBmb3JtdWxhLiBzaG9ydCBibG9jayBpcyBub3JtYWxpemVkIGJ5IFNOUi4gaXMgaXQgc3RpbGwgcmlnaHQgPyAqLworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBnZmMtPm5wYXJ0X3M7IGkrKykgeworICAgICAgICBkb3VibGUgIHg7CisgICAgICAgIGRvdWJsZSAgc25yID0gc25yX3NfYTsKKyAgICAgICAgaWYgKGJ2YWxbaV0gPj0gYnZsX2EpIHsKKyAgICAgICAgICAgIHNuciA9IHNucl9zX2IgKiAoYnZhbFtpXSAtIGJ2bF9hKSAvIChidmxfYiAtIGJ2bF9hKQorICAgICAgICAgICAgICAgICsgc25yX3NfYSAqIChidmxfYiAtIGJ2YWxbaV0pIC8gKGJ2bF9iIC0gYnZsX2EpOworICAgICAgICB9CisgICAgICAgIG5vcm1baV0gPSBwb3coMTAuMCwgc25yIC8gMTAuMCk7CisKKyAgICAgICAgLyogQVRIICovCisgICAgICAgIHggPSBGTE9BVF9NQVg7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBnZmMtPm51bWxpbmVzX3NbaV07IGsrKywgaisrKSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBmcmVxID0gc2ZyZXEgKiBqIC8gKDEwMDAuMCAqIEJMS1NJWkVfcyk7CisgICAgICAgICAgICBGTE9BVCAgIGxldmVsOworICAgICAgICAgICAgLyogZnJlcSA9IE1pbiguMSxmcmVxKTsgKi8gLyogQVRIIGJlbG93IDEwMCBIeiBjb25zdGFudCwgbm90IGZ1cnRoZXIgY2xpbWJpbmcgKi8KKyAgICAgICAgICAgIGxldmVsID0gQVRIZm9ybXVsYShmcmVxICogMTAwMCwgZ2ZwKSAtIDIwOyAvKiBzY2FsZSB0byBGRlQgdW5pdHM7IHJldHVybmVkIHZhbHVlIGlzIGluIGRCICovCisgICAgICAgICAgICBsZXZlbCA9IHBvdygxMC4sIDAuMSAqIGxldmVsKTsgLyogY29udmVydCBmcm9tIGRCIC0+IGVuZXJneSAqLworICAgICAgICAgICAgbGV2ZWwgKj0gZ2ZjLT5udW1saW5lc19zW2ldOworICAgICAgICAgICAgaWYgKHggPiBsZXZlbCkKKyAgICAgICAgICAgICAgICB4ID0gbGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgZ2ZjLT5BVEgtPmNiX3NbaV0gPSB4OworCisgICAgICAgIC8qIE1JTlZBTC4KKyAgICAgICAgICAgRm9yIGxvdyBmcmVxLCB0aGUgc3RyZW5ndGggb2YgdGhlIG1hc2tpbmcgaXMgbGltaXRlZCBieSBtaW52YWwKKyAgICAgICAgICAgdGhpcyBpcyBhbiBJU08gTVBFRzEgdGhpbmcsIGRvbnQga25vdyBpZiBpdCBpcyByZWFsbHkgbmVlZGVkICovCisgICAgICAgIHggPSAoLTcuMCArIGJ2YWxbaV0gKiA3LjAgLyAxMi4wKTsKKyAgICAgICAgaWYgKGJ2YWxbaV0gPiAxMikgeworICAgICAgICAgICAgeCAqPSAxK2xvZygxK3gpKjMuMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnZhbFtpXSA8IDEyKSB7CisgICAgICAgICAgICB4ICo9IDErbG9nKDEteCkqMi4zOworICAgICAgICB9CisgICAgICAgIGlmICh4IDwgLTE1KSB7CisgICAgICAgICAgICB4ID0gLTE1OworICAgICAgICB9CisgICAgICAgIHggLT0gODsKKyAgICAgICAgZ2ZjLT5taW52YWxfc1tpXSA9IHBvdygxMC4wLCB4IC8gMTApICogZ2ZjLT5udW1saW5lc19zW2ldOworICAgIH0KKworICAgIGkgPSBpbml0X3MzX3ZhbHVlcygmZ2ZjLT5zM19zcywgZ2ZjLT5zM2luZF9zLCBnZmMtPm5wYXJ0X3MsIGJ2YWwsIGJ2YWxfd2lkdGgsIG5vcm0sIHVzZV9vbGRfczMpOworICAgIGlmIChpKQorICAgICAgICByZXR1cm4gaTsKKworCisgICAgaW5pdF9tYXNrX2FkZF9tYXhfdmFsdWVzKCk7CisgICAgaW5pdF9mZnQoZ2ZjKTsKKworICAgIC8qIHNldHVwIHRlbXBvcmFsIG1hc2tpbmcgKi8KKyAgICBnZmMtPmRlY2F5ID0gZXhwKC0xLjAgKiBMT0cxMCAvICh0ZW1wb3JhbG1hc2tfc3VzdGFpbl9zZWMgKiBzZnJlcSAvIDE5Mi4wKSk7CisKKyAgICB7CisgICAgICAgIEZMT0FUICAgbXNmaXg7CisgICAgICAgIG1zZml4ID0gTlNfTVNGSVg7CisgICAgICAgIGlmIChnZnAtPmV4cF9uc3BzeXR1bmUgJiAyKQorICAgICAgICAgICAgbXNmaXggPSAxLjA7CisgICAgICAgIGlmIChmYWJzKGdmcC0+bXNmaXgpID4gMC4wKQorICAgICAgICAgICAgbXNmaXggPSBnZnAtPm1zZml4OworICAgICAgICBnZnAtPm1zZml4ID0gbXNmaXg7CisKKyAgICAgICAgLyogc3ByZWFkIG9ubHkgZnJvbSBucGFydF9sIGJhbmRzLiAgTm9ybWFsbHksIHdlIHVzZSB0aGUgc3ByZWFkaW5nCisgICAgICAgICAqIGZ1bmN0aW9uIHRvIGNvbnZvbHZlIGZyb20gbnBhcnRfbCBkb3duIHRvIG5wYXJ0X2wgYmFuZHMgCisgICAgICAgICAqLworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgZ2ZjLT5ucGFydF9sOyBiKyspCisgICAgICAgICAgICBpZiAoZ2ZjLT5zM2luZFtiXVsxXSA+IGdmYy0+bnBhcnRfbCAtIDEpCisgICAgICAgICAgICAgICAgZ2ZjLT5zM2luZFtiXVsxXSA9IGdmYy0+bnBhcnRfbCAtIDE7CisgICAgfQorCisgICAgLyogIHByZXBhcmUgZm9yIEFUSCBhdXRvIGFkanVzdG1lbnQ6CisgICAgICogIHdlIHdhbnQgdG8gZGVjcmVhc2UgdGhlIEFUSCBieSAxMiBkQiBwZXIgc2Vjb25kCisgICAgICovCisjZGVmaW5lICBmcmFtZV9kdXJhdGlvbiAoNTc2LiAqIGdmYy0+bW9kZV9nciAvIHNmcmVxKQorICAgIGdmYy0+QVRILT5kZWNheSA9IHBvdygxMC4sIC0xMi4gLyAxMC4gKiBmcmFtZV9kdXJhdGlvbik7CisgICAgZ2ZjLT5BVEgtPmFkanVzdCA9IDAuMDE7IC8qIG1pbmltdW0sIGZvciBsZWFkaW5nIGxvdyBsb3VkbmVzcyAqLworICAgIGdmYy0+QVRILT5hZGp1c3RfbGltaXQgPSAxLjA7IC8qIG9uIGxlYWQsIGFsbG93IGFkanVzdCB1cCB0byBtYXhpbXVtICovCisjdW5kZWYgIGZyYW1lX2R1cmF0aW9uCisKKyAgICBhc3NlcnQoZ2ZjLT5ib19sW1NCTUFYX2wgLSAxXSA8PSBnZmMtPm5wYXJ0X2wpOworICAgIGFzc2VydChnZmMtPmJvX3NbU0JNQVhfcyAtIDFdIDw9IGdmYy0+bnBhcnRfcyk7CisKKyAgICBpZiAoZ2ZwLT5BVEh0eXBlICE9IC0xKSB7CisgICAgICAgIC8qIGNvbXB1dGUgZXF1YWwgbG91ZG5lc3Mgd2VpZ2h0cyAoZXFsX3cpICovCisgICAgICAgIEZMT0FUICAgZnJlcTsKKyAgICAgICAgRkxPQVQgY29uc3QgZnJlcV9pbmMgPSAoRkxPQVQpIGdmcC0+b3V0X3NhbXBsZXJhdGUgLyAoRkxPQVQpIChCTEtTSVpFKTsKKyAgICAgICAgRkxPQVQgICBlcWxfYmFsYW5jZSA9IDAuMDsKKyAgICAgICAgZnJlcSA9IDAuMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJMS1NJWkUgLyAyOyArK2kpIHsKKyAgICAgICAgICAgIC8qIGNvbnZlcnQgQVRIIGRCIHRvIHJlbGF0aXZlIHBvd2VyIChub3QgZEIpICovCisgICAgICAgICAgICAvKiAgdG8gZGV0ZXJtaW5lIGVxbF93ICovCisgICAgICAgICAgICBmcmVxICs9IGZyZXFfaW5jOworICAgICAgICAgICAgZ2ZjLT5BVEgtPmVxbF93W2ldID0gMS4gLyBwb3coMTAsIEFUSGZvcm11bGEoZnJlcSwgZ2ZwKSAvIDEwKTsKKyAgICAgICAgICAgIGVxbF9iYWxhbmNlICs9IGdmYy0+QVRILT5lcWxfd1tpXTsKKyAgICAgICAgfQorICAgICAgICBlcWxfYmFsYW5jZSA9IDEuMCAvIGVxbF9iYWxhbmNlOworICAgICAgICBmb3IgKGkgPSBCTEtTSVpFIC8gMjsgLS1pID49IDA7KSB7IC8qIHNjYWxlIHdlaWdodHMgKi8KKyAgICAgICAgICAgIGdmYy0+QVRILT5lcWxfd1tpXSAqPSBlcWxfYmFsYW5jZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIGZvciAoYiA9IGogPSAwOyBiIDwgZ2ZjLT5ucGFydF9zOyArK2IpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZmMtPm51bWxpbmVzX3NbYl07ICsraSkgeworICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoaiA9PSAxMjkpOworICAgICAgICBmb3IgKGIgPSBqID0gMDsgYiA8IGdmYy0+bnBhcnRfbDsgKytiKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2ZjLT5udW1saW5lc19sW2JdOyArK2kpIHsKKyAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGogPT0gNTEzKTsKKyAgICB9CisgICAgaiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGdmYy0+bnBhcnRfbDsgaSsrKSB7CisgICAgICAgIEZMT0FUIGNvbnN0IGZyZXEgPSBzZnJlcSAqIChqICsgZ2ZjLT5udW1saW5lc19sW2ldIC8gMikgLyAoMS4wICogQkxLU0laRSk7CisgICAgICAgIGdmYy0+bWxkX2NiX2xbaV0gPSBzdGVyZW9fZGVtYXNrKGZyZXEpOworICAgICAgICBqICs9IGdmYy0+bnVtbGluZXNfbFtpXTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBDQkFORFM7ICsraSkgeworICAgICAgICBnZmMtPm1sZF9jYl9sW2ldID0gMTsKKyAgICB9CisgICAgaiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGdmYy0+bnBhcnRfczsgaSsrKSB7CisgICAgICAgIEZMT0FUIGNvbnN0IGZyZXEgPSBzZnJlcSAqIChqICsgZ2ZjLT5udW1saW5lc19zW2ldIC8gMikgLyAoMS4wICogQkxLU0laRV9zKTsKKyAgICAgICAgZ2ZjLT5tbGRfY2Jfc1tpXSA9IHN0ZXJlb19kZW1hc2soZnJlcSk7CisgICAgICAgIGogKz0gZ2ZjLT5udW1saW5lc19zW2ldOworICAgIH0KKyAgICBmb3IgKDsgaSA8IENCQU5EUzsgKytpKSB7CisgICAgICAgIGdmYy0+bWxkX2NiX3NbaV0gPSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvcHN5bW9kZWwuaCBiL2xpYm1wM2xhbWUvcHN5bW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjUzZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9wc3ltb2RlbC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKglwc3ltb2RlbC5oCisgKgorICoJQ29weXJpZ2h0IChjKSAxOTk5IE1hcmsgVGF5bG9yCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfUFNZTU9ERUxfSAorI2RlZmluZSBMQU1FX1BTWU1PREVMX0gKKworCitpbnQgICAgIEwzcHN5Y2hvX2FuYWxfbnMobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYW1wbGVfdCAqIGJ1ZmZlclsyXSwgaW50IGdyLAorICAgICAgICAgICAgICAgICAgICAgICAgIElJSV9wc3lfcmF0aW8gcmF0aW9bMl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSUlJX3BzeV9yYXRpbyBNU19yYXRpb1syXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCBwZVsyXSwgRkxPQVQgcGVfTVNbMl0sIEZMT0FUIGVuZXJbMl0sIGludCBibG9ja3R5cGVfZFsyXSk7CisKK2ludCAgICAgTDNwc3ljaG9fYW5hbF92YnIobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FtcGxlX3QgKiBidWZmZXJbMl0sIGludCBnciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUlJX3BzeV9yYXRpbyByYXRpb1syXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUlJX3BzeV9yYXRpbyBNU19yYXRpb1syXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgcGVbMl0sIEZMT0FUIHBlX01TWzJdLCBGTE9BVCBlbmVyWzJdLCBpbnQgYmxvY2t0eXBlX2RbMl0pOworCisKK2ludCAgICAgcHN5bW9kZWxfaW5pdChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCk7CisKKworI2RlZmluZSBycGVsZXYgMgorI2RlZmluZSBycGVsZXYyIDE2CisjZGVmaW5lIHJwZWxldl9zIDIKKyNkZWZpbmUgcnBlbGV2Ml9zIDE2CisKKy8qIHNpemUgb2YgZWFjaCBwYXJ0aXRpb24gYmFuZCwgaW4gYmFya3M6ICovCisjZGVmaW5lIERFTEJBUksgLjM0CisjZGVmaW5lIENXX0xPV0VSX0lOREVYIDYKKworCisjaWYgMQorICAgIC8qIEFBQyB2YWx1ZXMsIHJlc3VsdHMgaW4gbW9yZSBtYXNraW5nIG92ZXIgTVAzIHZhbHVlcyAqLworIyBkZWZpbmUgVE1OIDE4CisjIGRlZmluZSBOTVQgNgorI2Vsc2UKKyAgICAvKiBNUDMgdmFsdWVzICovCisjIGRlZmluZSBUTU4gMjkKKyMgZGVmaW5lIE5NVCA2CisjZW5kaWYKKworLyogSVNPIHZhbHVlcyAqLworI2RlZmluZSBDT05WMSAoLS4yOTkpCisjZGVmaW5lIENPTlYyICgtLjQzKQorCisvKiB0dW5lZCBmb3Igb3V0cHV0IGxldmVsIChzZW5zaXRpdmUgdG8gZW5lcmd5IHNjYWxlKSAqLworI2RlZmluZSBWT19TQ0FMRSAoMS4vKCAxNDc1MioxNDc1MiApLyhCTEtTSVpFLzIpKQorCisjZGVmaW5lIHRlbXBvcmFsbWFza19zdXN0YWluX3NlYyAwLjAxCisKKyNkZWZpbmUgTlNfUFJFRUNIT19BVFQwIDAuOAorI2RlZmluZSBOU19QUkVFQ0hPX0FUVDEgMC42CisjZGVmaW5lIE5TX1BSRUVDSE9fQVRUMiAwLjMKKworI2RlZmluZSBOU19NU0ZJWCAzLjUKKyNkZWZpbmUgTlNBVFRBQ0tUSFJFIDQuNAorI2RlZmluZSBOU0FUVEFDS1RIUkVfUyAyNQorCisjZW5kaWYgLyogTEFNRV9QU1lNT0RFTF9IICovCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3F1YW50aXplLmMgYi9saWJtcDNsYW1lL3F1YW50aXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyMDIzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvcXVhbnRpemUuYwpAQCAtMCwwICsxLDIwMjcgQEAKKy8qCisgKiBNUDMgcXVhbnRpemF0aW9uCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBNYXJrIFRheWxvcgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBUYWtlaGlybyBUb21pbmFnYQorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBSb2JlcnQgSGVnZW1hbm4KKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgR2FicmllbCBCb3V2aWduZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gICAgIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IHF1YW50aXplLmMsdiAxLjIwMS4yLjEgMjAwOC8wOC8wNSAxNDoxNjowNyByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJxdWFudGl6ZV9wdnQuaCIKKyNpbmNsdWRlICJsYW1lX2dsb2JhbF9mbGFncy5oIgorI2luY2x1ZGUgInJlc2Vydm9pci5oIgorI2luY2x1ZGUgImJpdHN0cmVhbS5oIgorI2luY2x1ZGUgInZicnF1YW50aXplLmgiCisjaW5jbHVkZSAicXVhbnRpemUuaCIKKyNpZmRlZiBIQVZFX1hNTUlOVFJJTl9ICisjaW5jbHVkZSAidmVjdG9yL2xhbWVfaW50cmluLmgiCisjZW5kaWYKKworCisKKworLyogY29udmVydCBmcm9tIEwvUiA8LT4gTWlkL1NpZGUgKi8KK3N0YXRpYyB2b2lkCittc19jb252ZXJ0KElJSV9zaWRlX2luZm9fdCAqIGwzX3NpZGUsIGludCBncikKK3sKKyAgICBpbnQgICAgIGk7CisgICAgZm9yIChpID0gMDsgaSA8IDU3NjsgKytpKSB7CisgICAgICAgIEZMT0FUICAgbCwgcjsKKyAgICAgICAgbCA9IGwzX3NpZGUtPnR0W2dyXVswXS54cltpXTsKKyAgICAgICAgciA9IGwzX3NpZGUtPnR0W2dyXVsxXS54cltpXTsKKyAgICAgICAgbDNfc2lkZS0+dHRbZ3JdWzBdLnhyW2ldID0gKGwgKyByKSAqIChGTE9BVCkgKFNRUlQyICogMC41KTsKKyAgICAgICAgbDNfc2lkZS0+dHRbZ3JdWzFdLnhyW2ldID0gKGwgLSByKSAqIChGTE9BVCkgKFNRUlQyICogMC41KTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIGluaXRfb3V0ZXJfbG9vcCgpCisgKiAgbXQgNi85OQorICoKKyAqICBpbml0aWFsaXplcyBjb2RfaW5mbywgc2NhbGVmYWMgYW5kIHhycG93CisgKgorICogIHJldHVybnMgMCBpZiBhbGwgZW5lcmdpZXMgaW4geHIgYXJlIHplcm8sIGVsc2UgMQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbml0X3hycG93X2NvcmVfYyhncl9pbmZvICogY29uc3QgY29kX2luZm8sIEZMT0FUIHhycG93WzU3Nl0sIGludCB1cHBlciwgRkxPQVQgKiBzdW0pCit7CisgICAgaW50ICAgICBpOworICAgIEZMT0FUICAgdG1wOworICAgICpzdW0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPD0gdXBwZXI7ICsraSkgeworICAgICAgICB0bXAgPSBmYWJzKGNvZF9pbmZvLT54cltpXSk7CisgICAgICAgICpzdW0gKz0gdG1wOworICAgICAgICB4cnBvd1tpXSA9IHNxcnQodG1wICogc3FydCh0bXApKTsKKworICAgICAgICBpZiAoeHJwb3dbaV0gPiBjb2RfaW5mby0+eHJwb3dfbWF4KQorICAgICAgICAgICAgY29kX2luZm8tPnhycG93X21heCA9IHhycG93W2ldOworICAgIH0KK30KKworCisKKworCit2b2lkCitpbml0X3hycG93X2NvcmVfaW5pdChsYW1lX2ludGVybmFsX2ZsYWdzICogY29uc3QgZ2ZjKQoreworICAgIGdmYy0+aW5pdF94cnBvd19jb3JlID0gaW5pdF94cnBvd19jb3JlX2M7CisKKyNpZiBkZWZpbmVkKEhBVkVfWE1NSU5UUklOX0gpCisgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLlNTRSkKKyAgICAgICAgZ2ZjLT5pbml0X3hycG93X2NvcmUgPSBpbml0X3hycG93X2NvcmVfc3NlOworI2VuZGlmCit9CisKKworCitzdGF0aWMgaW50Citpbml0X3hycG93KGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGdyX2luZm8gKiBjb25zdCBjb2RfaW5mbywgRkxPQVQgeHJwb3dbNTc2XSkKK3sKKyAgICBGTE9BVCAgIHN1bSA9IDA7CisgICAgaW50ICAgICBpOworICAgIGludCBjb25zdCB1cHBlciA9IGNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZjsKKworICAgIGFzc2VydCh4cnBvdyAhPSBOVUxMKTsKKyAgICBjb2RfaW5mby0+eHJwb3dfbWF4ID0gMDsKKworICAgIC8qICBjaGVjayBpZiB0aGVyZSBpcyBzb21lIGVuZXJneSB3ZSBoYXZlIHRvIHF1YW50aXplCisgICAgICogIGFuZCBjYWxjdWxhdGUgeHJwb3cgbWF0Y2hpbmcgb3VyIGZyZXNoIHNjYWxlZmFjdG9ycworICAgICAqLworICAgIGFzc2VydCgwIDw9IHVwcGVyICYmIHVwcGVyIDw9IDU3NSk7CisgICAgbWVtc2V0KCYoeHJwb3dbdXBwZXJdKSwgMCwgKDU3NiAtIHVwcGVyKSAqIHNpemVvZih4cnBvd1swXSkpOworCisKKyAgICBnZmMtPmluaXRfeHJwb3dfY29yZShjb2RfaW5mbywgeHJwb3csIHVwcGVyLCAmc3VtKTsKKworICAgIC8qICByZXR1cm4gMSBpZiB3ZSBoYXZlIHNvbWV0aGluZyB0byBxdWFudGl6ZSwgZWxzZSAwCisgICAgICovCisgICAgaWYgKHN1bSA+IChGTE9BVCkgMUUtMjApIHsKKyAgICAgICAgaW50ICAgICBqID0gMDsKKyAgICAgICAgaWYgKGdmYy0+c3Vic3RlcF9zaGFwaW5nICYgMikKKyAgICAgICAgICAgIGogPSAxOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2RfaW5mby0+cHN5bWF4OyBpKyspCisgICAgICAgICAgICBnZmMtPnBzZXVkb2hhbGZbaV0gPSBqOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG1lbXNldCgmY29kX2luZm8tPmwzX2VuY1swXSwgMCwgc2l6ZW9mKGludCkgKiA1NzYpOworICAgIHJldHVybiAwOworfQorCisKKworCisKK2V4dGVybiBGTE9BVCBhdGhBZGp1c3QoRkxPQVQgYSwgRkxPQVQgeCwgRkxPQVQgYXRoRmxvb3IpOworCisKKworLyoKK0dhYnJpZWwgQm91dmlnbmUgZmViL2FwciAyMDAzCitBbmFsb2cgc2lsZW5jZSBkZXRlY3Rpb24gaW4gcGFydGl0aW9ubmVkIHNmYjIxCitvciBzZmIxMiBmb3Igc2hvcnQgYmxvY2tzCisKK0Zyb20gdG9wIHRvIGJvdHRvbSBvZiBzZmIsIGNoYW5nZXMgdG8gMAorY29lZmZzIHdoaWNoIGFyZSBiZWxvdyBhdGguIEl0IHN0b3BzIG9uIHRoZSBmaXJzdAorY29lZmYgaGlnaGVyIHRoYW4gYXRoLgorKi8KK3N0YXRpYyB2b2lkCitwc2ZiMjFfYW5hbG9nc2lsZW5jZShsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMsIGdyX2luZm8gKiBjb25zdCBjb2RfaW5mbykKK3sKKyAgICBBVEhfdCBjb25zdCAqY29uc3QgQVRIID0gZ2ZjLT5BVEg7CisgICAgRkxPQVQgICpjb25zdCB4ciA9IGNvZF9pbmZvLT54cjsKKworICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFKSB7IC8qIE5PUk0sIFNUQVJUIG9yIFNUT1AgdHlwZSwgYnV0IG5vdCBTSE9SVCBibG9ja3MgKi8KKyAgICAgICAgaW50ICAgICBnc2ZiOworICAgICAgICBpbnQgICAgIHN0b3AgPSAwOworICAgICAgICBmb3IgKGdzZmIgPSBQU0ZCMjEgLSAxOyBnc2ZiID49IDAgJiYgIXN0b3A7IGdzZmItLSkgeworICAgICAgICAgICAgaW50IGNvbnN0IHN0YXJ0ID0gZ2ZjLT5zY2FsZWZhY19iYW5kLnBzZmIyMVtnc2ZiXTsKKyAgICAgICAgICAgIGludCBjb25zdCBlbmQgPSBnZmMtPnNjYWxlZmFjX2JhbmQucHNmYjIxW2dzZmIgKyAxXTsKKyAgICAgICAgICAgIGludCAgICAgajsKKyAgICAgICAgICAgIEZMT0FUICAgYXRoMjE7CisgICAgICAgICAgICBhdGgyMSA9IGF0aEFkanVzdChBVEgtPmFkanVzdCwgQVRILT5wc2ZiMjFbZ3NmYl0sIEFUSC0+Zmxvb3IpOworCisgICAgICAgICAgICBpZiAoZ2ZjLT5uc1BzeS5sb25nZmFjdFsyMV0gPiAxZS0xMmYpCisgICAgICAgICAgICAgICAgYXRoMjEgKj0gZ2ZjLT5uc1BzeS5sb25nZmFjdFsyMV07CisKKyAgICAgICAgICAgIGZvciAoaiA9IGVuZCAtIDE7IGogPj0gc3RhcnQ7IGotLSkgeworICAgICAgICAgICAgICAgIGlmIChmYWJzKHhyW2pdKSA8IGF0aDIxKQorICAgICAgICAgICAgICAgICAgICB4cltqXSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3AgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qbm90ZTogc2hvcnQgYmxvY2tzIGNvZWZmcyBhcmUgcmVvcmRlcmVkICovCisgICAgICAgIGludCAgICAgYmxvY2s7CisgICAgICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDM7IGJsb2NrKyspIHsKKworICAgICAgICAgICAgaW50ICAgICBnc2ZiOworICAgICAgICAgICAgaW50ICAgICBzdG9wID0gMDsKKyAgICAgICAgICAgIGZvciAoZ3NmYiA9IFBTRkIxMiAtIDE7IGdzZmIgPj0gMCAmJiAhc3RvcDsgZ3NmYi0tKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IHN0YXJ0ID0gZ2ZjLT5zY2FsZWZhY19iYW5kLnNbMTJdICogMyArCisgICAgICAgICAgICAgICAgICAgIChnZmMtPnNjYWxlZmFjX2JhbmQuc1sxM10gLSBnZmMtPnNjYWxlZmFjX2JhbmQuc1sxMl0pICogYmxvY2sgKworICAgICAgICAgICAgICAgICAgICAoZ2ZjLT5zY2FsZWZhY19iYW5kLnBzZmIxMltnc2ZiXSAtIGdmYy0+c2NhbGVmYWNfYmFuZC5wc2ZiMTJbMF0pOworICAgICAgICAgICAgICAgIGludCBjb25zdCBlbmQgPQorICAgICAgICAgICAgICAgICAgICBzdGFydCArIChnZmMtPnNjYWxlZmFjX2JhbmQucHNmYjEyW2dzZmIgKyAxXSAtIGdmYy0+c2NhbGVmYWNfYmFuZC5wc2ZiMTJbZ3NmYl0pOworICAgICAgICAgICAgICAgIGludCAgICAgajsKKyAgICAgICAgICAgICAgICBGTE9BVCAgIGF0aDEyOworICAgICAgICAgICAgICAgIGF0aDEyID0gYXRoQWRqdXN0KEFUSC0+YWRqdXN0LCBBVEgtPnBzZmIxMltnc2ZiXSwgQVRILT5mbG9vcik7CisKKyAgICAgICAgICAgICAgICBpZiAoZ2ZjLT5uc1BzeS5zaG9ydGZhY3RbMTJdID4gMWUtMTJmKQorICAgICAgICAgICAgICAgICAgICBhdGgxMiAqPSBnZmMtPm5zUHN5LnNob3J0ZmFjdFsxMl07CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBlbmQgLSAxOyBqID49IHN0YXJ0OyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhYnMoeHJbal0pIDwgYXRoMTIpCisgICAgICAgICAgICAgICAgICAgICAgICB4cltqXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisKKworCisKK3N0YXRpYyB2b2lkCitpbml0X291dGVyX2xvb3AobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqZ2ZjLCBncl9pbmZvICogY29uc3QgY29kX2luZm8pCit7CisgICAgaW50ICAgICBzZmIsIGo7CisgICAgLyogIGluaXRpYWxpemUgZnJlc2ggY29kX2luZm8KKyAgICAgKi8KKyAgICBjb2RfaW5mby0+cGFydDJfM19sZW5ndGggPSAwOworICAgIGNvZF9pbmZvLT5iaWdfdmFsdWVzID0gMDsKKyAgICBjb2RfaW5mby0+Y291bnQxID0gMDsKKyAgICBjb2RfaW5mby0+Z2xvYmFsX2dhaW4gPSAyMTA7CisgICAgY29kX2luZm8tPnNjYWxlZmFjX2NvbXByZXNzID0gMDsKKyAgICAvKiBtaXhlZF9ibG9ja19mbGFnLCBibG9ja190eXBlIHdhcyBzZXQgaW4gcHN5bW9kZWwuYyAqLworICAgIGNvZF9pbmZvLT50YWJsZV9zZWxlY3RbMF0gPSAwOworICAgIGNvZF9pbmZvLT50YWJsZV9zZWxlY3RbMV0gPSAwOworICAgIGNvZF9pbmZvLT50YWJsZV9zZWxlY3RbMl0gPSAwOworICAgIGNvZF9pbmZvLT5zdWJibG9ja19nYWluWzBdID0gMDsKKyAgICBjb2RfaW5mby0+c3ViYmxvY2tfZ2FpblsxXSA9IDA7CisgICAgY29kX2luZm8tPnN1YmJsb2NrX2dhaW5bMl0gPSAwOworICAgIGNvZF9pbmZvLT5zdWJibG9ja19nYWluWzNdID0gMDsgLyogdGhpcyBvbmUgaXMgYWx3YXlzIDAgKi8KKyAgICBjb2RfaW5mby0+cmVnaW9uMF9jb3VudCA9IDA7CisgICAgY29kX2luZm8tPnJlZ2lvbjFfY291bnQgPSAwOworICAgIGNvZF9pbmZvLT5wcmVmbGFnID0gMDsKKyAgICBjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgPSAwOworICAgIGNvZF9pbmZvLT5jb3VudDF0YWJsZV9zZWxlY3QgPSAwOworICAgIGNvZF9pbmZvLT5wYXJ0Ml9sZW5ndGggPSAwOworICAgIGNvZF9pbmZvLT5zZmJfbG1heCA9IFNCUFNZX2w7CisgICAgY29kX2luZm8tPnNmYl9zbWluID0gU0JQU1lfczsKKyAgICBjb2RfaW5mby0+cHN5X2xtYXggPSBnZmMtPnNmYjIxX2V4dHJhID8gU0JNQVhfbCA6IFNCUFNZX2w7CisgICAgY29kX2luZm8tPnBzeW1heCA9IGNvZF9pbmZvLT5wc3lfbG1heDsKKyAgICBjb2RfaW5mby0+c2ZibWF4ID0gY29kX2luZm8tPnNmYl9sbWF4OworICAgIGNvZF9pbmZvLT5zZmJkaXZpZGUgPSAxMTsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IFNCTUFYX2w7IHNmYisrKSB7CisgICAgICAgIGNvZF9pbmZvLT53aWR0aFtzZmJdCisgICAgICAgICAgICA9IGdmYy0+c2NhbGVmYWNfYmFuZC5sW3NmYiArIDFdIC0gZ2ZjLT5zY2FsZWZhY19iYW5kLmxbc2ZiXTsKKyAgICAgICAgY29kX2luZm8tPndpbmRvd1tzZmJdID0gMzsgLyogd2hpY2ggaXMgYWx3YXlzIDAuICovCisgICAgfQorICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgIEZMT0FUICAgaXh3b3JrWzU3Nl07CisgICAgICAgIEZMT0FUICAqaXg7CisKKyAgICAgICAgY29kX2luZm8tPnNmYl9zbWluID0gMDsKKyAgICAgICAgY29kX2luZm8tPnNmYl9sbWF4ID0gMDsKKyAgICAgICAgaWYgKGNvZF9pbmZvLT5taXhlZF9ibG9ja19mbGFnKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIE1QRUctMTogICAgICBzZmJzIDAtNyBsb25nIGJsb2NrLCAzLTEyIHNob3J0IGJsb2NrcworICAgICAgICAgICAgICogIE1QRUctMiguNSk6ICBzZmJzIDAtNSBsb25nIGJsb2NrLCAzLTEyIHNob3J0IGJsb2NrcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb2RfaW5mby0+c2ZiX3NtaW4gPSAzOworICAgICAgICAgICAgY29kX2luZm8tPnNmYl9sbWF4ID0gZ2ZjLT5tb2RlX2dyICogMiArIDQ7CisgICAgICAgIH0KKyAgICAgICAgY29kX2luZm8tPnBzeW1heAorICAgICAgICAgICAgPSBjb2RfaW5mby0+c2ZiX2xtYXgKKyAgICAgICAgICAgICsgMyAqICgoZ2ZjLT5zZmIyMV9leHRyYSA/IFNCTUFYX3MgOiBTQlBTWV9zKSAtIGNvZF9pbmZvLT5zZmJfc21pbik7CisgICAgICAgIGNvZF9pbmZvLT5zZmJtYXggPSBjb2RfaW5mby0+c2ZiX2xtYXggKyAzICogKFNCUFNZX3MgLSBjb2RfaW5mby0+c2ZiX3NtaW4pOworICAgICAgICBjb2RfaW5mby0+c2ZiZGl2aWRlID0gY29kX2luZm8tPnNmYm1heCAtIDE4OworICAgICAgICBjb2RfaW5mby0+cHN5X2xtYXggPSBjb2RfaW5mby0+c2ZiX2xtYXg7CisgICAgICAgIC8qIHJlLW9yZGVyIHRoZSBzaG9ydCBibG9ja3MsIGZvciBtb3JlIGVmZmljaWVudCBlbmNvZGluZyBiZWxvdyAqLworICAgICAgICAvKiBCeSBUYWtlaGlybyBUT01JTkFHQSAqLworICAgICAgICAvKgorICAgICAgICAgICBXaXRoaW4gZWFjaCBzY2FsZWZhY3RvciBiYW5kLCBkYXRhIGlzIGdpdmVuIGZvciBzdWNjZXNzaXZlCisgICAgICAgICAgIHRpbWUgd2luZG93cywgYmVnaW5uaW5nIHdpdGggd2luZG93IDAgYW5kIGVuZGluZyB3aXRoIHdpbmRvdyAyLgorICAgICAgICAgICBXaXRoaW4gZWFjaCB3aW5kb3csIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGFyZSB0aGVuIGFycmFuZ2VkIGluCisgICAgICAgICAgIG9yZGVyIG9mIGluY3JlYXNpbmcgZnJlcXVlbmN5Li4uCisgICAgICAgICAqLworICAgICAgICBpeCA9ICZjb2RfaW5mby0+eHJbZ2ZjLT5zY2FsZWZhY19iYW5kLmxbY29kX2luZm8tPnNmYl9sbWF4XV07CisgICAgICAgIG1lbWNweShpeHdvcmssIGNvZF9pbmZvLT54ciwgNTc2ICogc2l6ZW9mKEZMT0FUKSk7CisgICAgICAgIGZvciAoc2ZiID0gY29kX2luZm8tPnNmYl9zbWluOyBzZmIgPCBTQk1BWF9zOyBzZmIrKykgeworICAgICAgICAgICAgaW50IGNvbnN0IHN0YXJ0ID0gZ2ZjLT5zY2FsZWZhY19iYW5kLnNbc2ZiXTsKKyAgICAgICAgICAgIGludCBjb25zdCBlbmQgPSBnZmMtPnNjYWxlZmFjX2JhbmQuc1tzZmIgKyAxXTsKKyAgICAgICAgICAgIGludCAgICAgd2luZG93LCBsOworICAgICAgICAgICAgZm9yICh3aW5kb3cgPSAwOyB3aW5kb3cgPCAzOyB3aW5kb3crKykgeworICAgICAgICAgICAgICAgIGZvciAobCA9IHN0YXJ0OyBsIDwgZW5kOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKml4KysgPSBpeHdvcmtbMyAqIGwgKyB3aW5kb3ddOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGogPSBjb2RfaW5mby0+c2ZiX2xtYXg7CisgICAgICAgIGZvciAoc2ZiID0gY29kX2luZm8tPnNmYl9zbWluOyBzZmIgPCBTQk1BWF9zOyBzZmIrKykgeworICAgICAgICAgICAgY29kX2luZm8tPndpZHRoW2pdID0gY29kX2luZm8tPndpZHRoW2ogKyAxXSA9IGNvZF9pbmZvLT53aWR0aFtqICsgMl0KKyAgICAgICAgICAgICAgICA9IGdmYy0+c2NhbGVmYWNfYmFuZC5zW3NmYiArIDFdIC0gZ2ZjLT5zY2FsZWZhY19iYW5kLnNbc2ZiXTsKKyAgICAgICAgICAgIGNvZF9pbmZvLT53aW5kb3dbal0gPSAwOworICAgICAgICAgICAgY29kX2luZm8tPndpbmRvd1tqICsgMV0gPSAxOworICAgICAgICAgICAgY29kX2luZm8tPndpbmRvd1tqICsgMl0gPSAyOworICAgICAgICAgICAgaiArPSAzOworICAgICAgICB9CisgICAgfQorCisgICAgY29kX2luZm8tPmNvdW50MWJpdHMgPSAwOworICAgIGNvZF9pbmZvLT5zZmJfcGFydGl0aW9uX3RhYmxlID0gbnJfb2Zfc2ZiX2Jsb2NrWzBdWzBdOworICAgIGNvZF9pbmZvLT5zbGVuWzBdID0gMDsKKyAgICBjb2RfaW5mby0+c2xlblsxXSA9IDA7CisgICAgY29kX2luZm8tPnNsZW5bMl0gPSAwOworICAgIGNvZF9pbmZvLT5zbGVuWzNdID0gMDsKKworICAgIGNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZiA9IDU3NTsKKworICAgIC8qICBmcmVzaCBzY2FsZWZhY3RvcnMgYXJlIGFsbCB6ZXJvCisgICAgICovCisgICAgbWVtc2V0KGNvZF9pbmZvLT5zY2FsZWZhYywgMCwgc2l6ZW9mKGNvZF9pbmZvLT5zY2FsZWZhYykpOworCisgICAgcHNmYjIxX2FuYWxvZ3NpbGVuY2UoZ2ZjLCBjb2RfaW5mbyk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBiaW5fc2VhcmNoX1N0ZXBTaXplKCkKKyAqCisgKiAgYXV0aG9yL2RhdGU/PworICoKKyAqICBiaW5hcnkgc3RlcCBzaXplIHNlYXJjaAorICogIHVzZWQgYnkgb3V0ZXJfbG9vcCB0byBnZXQgYSBxdWFudGl6ZXIgc3RlcCBzaXplIHRvIHN0YXJ0IHdpdGgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0geworICAgIEJJTlNFQVJDSF9OT05FLAorICAgIEJJTlNFQVJDSF9VUCwKKyAgICBCSU5TRUFSQ0hfRE9XTgorfSBiaW5zZWFyY2hEaXJlY3Rpb25fdDsKKworc3RhdGljIGludAorYmluX3NlYXJjaF9TdGVwU2l6ZShsYW1lX2ludGVybmFsX2ZsYWdzICogY29uc3QgZ2ZjLCBncl9pbmZvICogY29uc3QgY29kX2luZm8sCisgICAgICAgICAgICAgICAgICAgIGludCBkZXNpcmVkX3JhdGUsIGNvbnN0IGludCBjaCwgY29uc3QgRkxPQVQgeHJwb3dbNTc2XSkKK3sKKyAgICBpbnQgICAgIG5CaXRzOworICAgIGludCAgICAgQ3VycmVudFN0ZXAgPSBnZmMtPkN1cnJlbnRTdGVwW2NoXTsKKyAgICBpbnQgICAgIGZsYWdfR29uZU92ZXIgPSAwOworICAgIGludCBjb25zdCBzdGFydCA9IGdmYy0+T2xkVmFsdWVbY2hdOworICAgIGJpbnNlYXJjaERpcmVjdGlvbl90IERpcmVjdGlvbiA9IEJJTlNFQVJDSF9OT05FOworICAgIGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA9IHN0YXJ0OworICAgIGRlc2lyZWRfcmF0ZSAtPSBjb2RfaW5mby0+cGFydDJfbGVuZ3RoOworCisgICAgYXNzZXJ0KEN1cnJlbnRTdGVwKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCAgICAgc3RlcDsKKyAgICAgICAgbkJpdHMgPSBjb3VudF9iaXRzKGdmYywgeHJwb3csIGNvZF9pbmZvLCAwKTsKKworICAgICAgICBpZiAoQ3VycmVudFN0ZXAgPT0gMSB8fCBuQml0cyA9PSBkZXNpcmVkX3JhdGUpCisgICAgICAgICAgICBicmVhazsgICAgICAvKiBub3RoaW5nIHRvIGFkanVzdCBhbnltb3JlICovCisKKyAgICAgICAgaWYgKG5CaXRzID4gZGVzaXJlZF9yYXRlKSB7CisgICAgICAgICAgICAvKiBpbmNyZWFzZSBRdWFudGl6ZV9TdGVwU2l6ZSAqLworICAgICAgICAgICAgaWYgKERpcmVjdGlvbiA9PSBCSU5TRUFSQ0hfRE9XTikKKyAgICAgICAgICAgICAgICBmbGFnX0dvbmVPdmVyID0gMTsKKworICAgICAgICAgICAgaWYgKGZsYWdfR29uZU92ZXIpCisgICAgICAgICAgICAgICAgQ3VycmVudFN0ZXAgLz0gMjsKKyAgICAgICAgICAgIERpcmVjdGlvbiA9IEJJTlNFQVJDSF9VUDsKKyAgICAgICAgICAgIHN0ZXAgPSBDdXJyZW50U3RlcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGRlY3JlYXNlIFF1YW50aXplX1N0ZXBTaXplICovCisgICAgICAgICAgICBpZiAoRGlyZWN0aW9uID09IEJJTlNFQVJDSF9VUCkKKyAgICAgICAgICAgICAgICBmbGFnX0dvbmVPdmVyID0gMTsKKworICAgICAgICAgICAgaWYgKGZsYWdfR29uZU92ZXIpCisgICAgICAgICAgICAgICAgQ3VycmVudFN0ZXAgLz0gMjsKKyAgICAgICAgICAgIERpcmVjdGlvbiA9IEJJTlNFQVJDSF9ET1dOOworICAgICAgICAgICAgc3RlcCA9IC1DdXJyZW50U3RlcDsKKyAgICAgICAgfQorICAgICAgICBjb2RfaW5mby0+Z2xvYmFsX2dhaW4gKz0gc3RlcDsKKyAgICAgICAgaWYgKGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA8IDApIHsKKyAgICAgICAgICAgIGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA9IDA7CisgICAgICAgICAgICBmbGFnX0dvbmVPdmVyID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kX2luZm8tPmdsb2JhbF9nYWluID4gMjU1KSB7CisgICAgICAgICAgICBjb2RfaW5mby0+Z2xvYmFsX2dhaW4gPSAyNTU7CisgICAgICAgICAgICBmbGFnX0dvbmVPdmVyID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChjb2RfaW5mby0+Z2xvYmFsX2dhaW4gPj0gMCk7CisgICAgYXNzZXJ0KGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA8IDI1Nik7CisKKyAgICB3aGlsZSAobkJpdHMgPiBkZXNpcmVkX3JhdGUgJiYgY29kX2luZm8tPmdsb2JhbF9nYWluIDwgMjU1KSB7CisgICAgICAgIGNvZF9pbmZvLT5nbG9iYWxfZ2FpbisrOworICAgICAgICBuQml0cyA9IGNvdW50X2JpdHMoZ2ZjLCB4cnBvdywgY29kX2luZm8sIDApOworICAgIH0KKyAgICBnZmMtPkN1cnJlbnRTdGVwW2NoXSA9IChzdGFydCAtIGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA+PSA0KSA/IDQgOiAyOworICAgIGdmYy0+T2xkVmFsdWVbY2hdID0gY29kX2luZm8tPmdsb2JhbF9nYWluOworICAgIGNvZF9pbmZvLT5wYXJ0Ml8zX2xlbmd0aCA9IG5CaXRzOworICAgIHJldHVybiBuQml0czsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgdHJhbmNhdGVfc21hbGxzcGVjdHJ1bXMoKQorICoKKyAqICBUYWtlaGlybyBUT01JTkFHQSAyMDAyLTA3LTIxCisgKgorICogIHRyYW5jYXRlIHNtYWxsZXIgbnVibWVycyBpbnRvIDAgYXMgbG9uZyBhcyB0aGUgbm9pc2UgdGhyZXNob2xkIGlzIGFsbG93ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2Zsb2F0Y29tcGFyZShjb25zdCB2b2lkICp2MSwgY29uc3Qgdm9pZCAqdjIpCit7CisgICAgY29uc3QgRkxPQVQgKmNvbnN0IGEgPSB2MSwgKmNvbnN0IGIgPSB2MjsKKyAgICBpZiAoKmEgPiAqYikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCphIDwgKmIpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZAordHJhbmNhdGVfc21hbGxzcGVjdHJ1bXMobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqZ2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JfaW5mbyAqIGNvbnN0IGdpLCBjb25zdCBGTE9BVCAqIGNvbnN0IGwzX3htaW4sIEZMT0FUICogY29uc3Qgd29yaykKK3sKKyAgICBpbnQgICAgIHNmYiwgaiwgd2lkdGg7CisgICAgRkxPQVQgICBkaXN0b3J0W1NGQk1BWF07CisgICAgY2FsY19ub2lzZV9yZXN1bHQgZHVtbXk7CisKKyAgICBpZiAoKCEoZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgJiA0KSAmJiBnaS0+YmxvY2tfdHlwZSA9PSBTSE9SVF9UWVBFKQorICAgICAgICB8fCBnZmMtPnN1YnN0ZXBfc2hhcGluZyAmIDB4ODApCisgICAgICAgIHJldHVybjsKKyAgICAodm9pZCkgY2FsY19ub2lzZShnaSwgbDNfeG1pbiwgZGlzdG9ydCwgJmR1bW15LCAwKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgNTc2OyBqKyspIHsKKyAgICAgICAgRkxPQVQgICB4ciA9IDAuMDsKKyAgICAgICAgaWYgKGdpLT5sM19lbmNbal0gIT0gMCkKKyAgICAgICAgICAgIHhyID0gZmFicyhnaS0+eHJbal0pOworICAgICAgICB3b3JrW2pdID0geHI7CisgICAgfQorCisgICAgaiA9IDA7CisgICAgc2ZiID0gODsKKyAgICBpZiAoZ2ktPmJsb2NrX3R5cGUgPT0gU0hPUlRfVFlQRSkKKyAgICAgICAgc2ZiID0gNjsKKyAgICBkbyB7CisgICAgICAgIEZMT0FUICAgYWxsb3dlZE5vaXNlLCB0cmFuY2F0ZVRocmVzaG9sZDsKKyAgICAgICAgaW50ICAgICBuc2FtZSwgc3RhcnQ7CisKKyAgICAgICAgd2lkdGggPSBnaS0+d2lkdGhbc2ZiXTsKKyAgICAgICAgaiArPSB3aWR0aDsKKyAgICAgICAgaWYgKGRpc3RvcnRbc2ZiXSA+PSAxLjApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBxc29ydCgmd29ya1tqIC0gd2lkdGhdLCB3aWR0aCwgc2l6ZW9mKEZMT0FUKSwgZmxvYXRjb21wYXJlKTsKKyAgICAgICAgaWYgKEVRKHdvcmtbaiAtIDFdLCAwLjApKQorICAgICAgICAgICAgY29udGludWU7ICAgLyogYWxsIHplcm8gc2ZiICovCisKKyAgICAgICAgYWxsb3dlZE5vaXNlID0gKDEuMCAtIGRpc3RvcnRbc2ZiXSkgKiBsM194bWluW3NmYl07CisgICAgICAgIHRyYW5jYXRlVGhyZXNob2xkID0gMC4wOworICAgICAgICBzdGFydCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIEZMT0FUICAgbm9pc2U7CisgICAgICAgICAgICBmb3IgKG5zYW1lID0gMTsgc3RhcnQgKyBuc2FtZSA8IHdpZHRoOyBuc2FtZSsrKQorICAgICAgICAgICAgICAgIGlmIChORVEod29ya1tzdGFydCArIGogLSB3aWR0aF0sIHdvcmtbc3RhcnQgKyBqICsgbnNhbWUgLSB3aWR0aF0pKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgbm9pc2UgPSB3b3JrW3N0YXJ0ICsgaiAtIHdpZHRoXSAqIHdvcmtbc3RhcnQgKyBqIC0gd2lkdGhdICogbnNhbWU7CisgICAgICAgICAgICBpZiAoYWxsb3dlZE5vaXNlIDwgbm9pc2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdHJhbmNhdGVUaHJlc2hvbGQgPSB3b3JrW3N0YXJ0ICsgaiAtIHdpZHRoIC0gMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbGxvd2VkTm9pc2UgLT0gbm9pc2U7CisgICAgICAgICAgICBzdGFydCArPSBuc2FtZTsKKyAgICAgICAgfSB3aGlsZSAoc3RhcnQgPCB3aWR0aCk7CisgICAgICAgIGlmIChFUSh0cmFuY2F0ZVRocmVzaG9sZCwgMC4wKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisvKiAgICAgIHByaW50ZigiJWUgJWUgJWVcbiIsICovCisvKiAgICAgICAgICAgICB0cmFuY2F0ZVRocmVzaG9sZC9sM194bWluW3NmYl0sICovCisvKiAgICAgICAgICAgICB0cmFuY2F0ZVRocmVzaG9sZC8obDNfeG1pbltzZmJdKnN0YXJ0KSwgKi8KKy8qICAgICAgICAgICAgIHRyYW5jYXRlVGhyZXNob2xkLyhsM194bWluW3NmYl0qKHN0YXJ0K3dpZHRoKSkgKi8KKy8qICAgICAgICAgICk7ICovCisvKiAgICAgIGlmICh0cmFuY2F0ZVRocmVzaG9sZCA+IDEwMDAqbDNfeG1pbltzZmJdKnN0YXJ0KSAqLworLyogICAgICAgICAgdHJhbmNhdGVUaHJlc2hvbGQgPSAxMDAwKmwzX3htaW5bc2ZiXSpzdGFydDsgKi8KKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoZmFicyhnaS0+eHJbaiAtIHdpZHRoXSkgPD0gdHJhbmNhdGVUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgZ2ktPmwzX2VuY1tqIC0gd2lkdGhdID0gMDsKKyAgICAgICAgfSB3aGlsZSAoLS13aWR0aCA+IDApOworICAgIH0gd2hpbGUgKCsrc2ZiIDwgZ2ktPnBzeW1heCk7CisKKyAgICBnaS0+cGFydDJfM19sZW5ndGggPSBub3F1YW50X2NvdW50X2JpdHMoZ2ZjLCBnaSwgMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIGxvb3BfYnJlYWsoKQorICoKKyAqICBhdXRob3IvZGF0ZT8/CisgKgorICogIEZ1bmN0aW9uOiBSZXR1cm5zIHplcm8gaWYgdGhlcmUgaXMgYSBzY2FsZWZhYyB3aGljaCBoYXMgbm90IGJlZW4KKyAqICAgICAgICAgICAgYW1wbGlmaWVkLiBPdGhlcndpc2UgaXQgcmV0dXJucyBvbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2lubGluZSBzdGF0aWMgaW50Citsb29wX2JyZWFrKGNvbnN0IGdyX2luZm8gKiBjb25zdCBjb2RfaW5mbykKK3sKKyAgICBpbnQgICAgIHNmYjsKKworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgY29kX2luZm8tPnNmYm1heDsgc2ZiKyspCisgICAgICAgIGlmIChjb2RfaW5mby0+c2NhbGVmYWNbc2ZiXQorICAgICAgICAgICAgKyBjb2RfaW5mby0+c3ViYmxvY2tfZ2Fpbltjb2RfaW5mby0+d2luZG93W3NmYl1dID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCisKKworCisvKiAgbXQgNS85OTogIEZ1bmN0aW9uOiBJbXByb3ZlZCBjYWxjX25vaXNlIGZvciBhIHNpbmdsZSBjaGFubmVsICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIHF1YW50X2NvbXBhcmUoKQorICoKKyAqICBhdXRob3IvZGF0ZT8/CisgKgorICogIHNldmVyYWwgZGlmZmVyZW50IGNvZGVzIHRvIGRlY2lkZSB3aGljaCBxdWFudGl6YXRpb24gaXMgYmV0dGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBkb3VibGUKK3BlbmFsdGllcyhkb3VibGUgbm9pc2UpCit7CisgICAgcmV0dXJuIEZBU1RfTE9HMTAoMC4zNjggKyAwLjYzMiAqIG5vaXNlICogbm9pc2UgKiBub2lzZSk7Cit9CisKK3N0YXRpYyBkb3VibGUKK2dldF9rbGVtbV9ub2lzZShjb25zdCBGTE9BVCAqIGRpc3RvcnQsIGNvbnN0IGdyX2luZm8gKiBjb25zdCBnaSkKK3sKKyAgICBpbnQgICAgIHNmYjsKKyAgICBkb3VibGUgIGtsZW1tX25vaXNlID0gMUUtMzc7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBnaS0+cHN5bWF4OyBzZmIrKykKKyAgICAgICAga2xlbW1fbm9pc2UgKz0gcGVuYWx0aWVzKGRpc3RvcnRbc2ZiXSk7CisKKyAgICByZXR1cm4gTWF4KDFlLTIwLCBrbGVtbV9ub2lzZSk7Cit9CisKK2lubGluZSBzdGF0aWMgaW50CitxdWFudF9jb21wYXJlKGNvbnN0IGludCBxdWFudF9jb21wLAorICAgICAgICAgICAgICBjb25zdCBjYWxjX25vaXNlX3Jlc3VsdCAqIGNvbnN0IGJlc3QsCisgICAgICAgICAgICAgIGNhbGNfbm9pc2VfcmVzdWx0ICogY29uc3QgY2FsYywgY29uc3QgZ3JfaW5mbyAqIGNvbnN0IGdpLCBjb25zdCBGTE9BVCAqIGRpc3RvcnQpCit7CisgICAgLyoKKyAgICAgICBub2lzZSBpcyBnaXZlbiBpbiBkZWNpYmVscyAoZEIpIHJlbGF0aXZlIHRvIG1hc2tpbmcgdGhlc2hvbGRzLgorCisgICAgICAgb3Zlcl9ub2lzZTogID8/PyAodGhlIHByZXZpb3VzIGNvbW1lbnQgaXMgZnVsbHkgd3JvbmcpCisgICAgICAgdG90X25vaXNlOiAgID8/PyAodGhlIHByZXZpb3VzIGNvbW1lbnQgaXMgZnVsbHkgd3JvbmcpCisgICAgICAgbWF4X25vaXNlOiAgIG1heCBxdWFudGl6YXRpb24gbm9pc2UKKworICAgICAqLworICAgIGludCAgICAgYmV0dGVyOworCisgICAgc3dpdGNoIChxdWFudF9jb21wKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDk6eworICAgICAgICAgICAgaWYgKGJlc3QtPm92ZXJfY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgYXJlIGRpc3RvcnRlZCBzZmIgKi8KKyAgICAgICAgICAgICAgICBiZXR0ZXIgPSBjYWxjLT5vdmVyX1NTRCA8PSBiZXN0LT5vdmVyX1NTRDsKKyAgICAgICAgICAgICAgICBpZiAoY2FsYy0+b3Zlcl9TU0QgPT0gYmVzdC0+b3Zlcl9TU0QpCisgICAgICAgICAgICAgICAgICAgIGJldHRlciA9IGNhbGMtPmJpdHMgPCBiZXN0LT5iaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm8gZGlzdG9ydGVkIHNmYiAqLworICAgICAgICAgICAgICAgIGJldHRlciA9ICgoY2FsYy0+bWF4X25vaXNlIDwgMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChjYWxjLT5tYXhfbm9pc2UgKiAxMCArIGNhbGMtPmJpdHMpIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVzdC0+bWF4X25vaXNlICogMTAgKyBiZXN0LT5iaXRzKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgMDoKKyAgICAgICAgYmV0dGVyID0gY2FsYy0+b3Zlcl9jb3VudCA8IGJlc3QtPm92ZXJfY291bnQKKyAgICAgICAgICAgIHx8IChjYWxjLT5vdmVyX2NvdW50ID09IGJlc3QtPm92ZXJfY291bnQgJiYgY2FsYy0+b3Zlcl9ub2lzZSA8IGJlc3QtPm92ZXJfbm9pc2UpCisgICAgICAgICAgICB8fCAoY2FsYy0+b3Zlcl9jb3VudCA9PSBiZXN0LT5vdmVyX2NvdW50ICYmCisgICAgICAgICAgICAgICAgRVEoY2FsYy0+b3Zlcl9ub2lzZSwgYmVzdC0+b3Zlcl9ub2lzZSkgJiYgY2FsYy0+dG90X25vaXNlIDwgYmVzdC0+dG90X25vaXNlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDg6CisgICAgICAgIGNhbGMtPm1heF9ub2lzZSA9IGdldF9rbGVtbV9ub2lzZShkaXN0b3J0LCBnaSk7CisgICAgICAgIC8qbGludCAtLWZhbGx0aHJvdWdoICovCisgICAgY2FzZSAxOgorICAgICAgICBiZXR0ZXIgPSBjYWxjLT5tYXhfbm9pc2UgPCBiZXN0LT5tYXhfbm9pc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgYmV0dGVyID0gY2FsYy0+dG90X25vaXNlIDwgYmVzdC0+dG90X25vaXNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGJldHRlciA9IChjYWxjLT50b3Rfbm9pc2UgPCBiZXN0LT50b3Rfbm9pc2UpCisgICAgICAgICAgICAmJiAoY2FsYy0+bWF4X25vaXNlIDwgYmVzdC0+bWF4X25vaXNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBiZXR0ZXIgPSAoY2FsYy0+bWF4X25vaXNlIDw9IDAuMCAmJiBiZXN0LT5tYXhfbm9pc2UgPiAwLjIpCisgICAgICAgICAgICB8fCAoY2FsYy0+bWF4X25vaXNlIDw9IDAuMCAmJgorICAgICAgICAgICAgICAgIGJlc3QtPm1heF9ub2lzZSA8IDAuMCAmJgorICAgICAgICAgICAgICAgIGJlc3QtPm1heF9ub2lzZSA+IGNhbGMtPm1heF9ub2lzZSAtIDAuMiAmJiBjYWxjLT50b3Rfbm9pc2UgPCBiZXN0LT50b3Rfbm9pc2UpCisgICAgICAgICAgICB8fCAoY2FsYy0+bWF4X25vaXNlIDw9IDAuMCAmJgorICAgICAgICAgICAgICAgIGJlc3QtPm1heF9ub2lzZSA+IDAuMCAmJgorICAgICAgICAgICAgICAgIGJlc3QtPm1heF9ub2lzZSA+IGNhbGMtPm1heF9ub2lzZSAtIDAuMiAmJgorICAgICAgICAgICAgICAgIGNhbGMtPnRvdF9ub2lzZSA8IGJlc3QtPnRvdF9ub2lzZSArIGJlc3QtPm92ZXJfbm9pc2UpCisgICAgICAgICAgICB8fCAoY2FsYy0+bWF4X25vaXNlID4gMC4wICYmCisgICAgICAgICAgICAgICAgYmVzdC0+bWF4X25vaXNlID4gLTAuMDUgJiYKKyAgICAgICAgICAgICAgICBiZXN0LT5tYXhfbm9pc2UgPiBjYWxjLT5tYXhfbm9pc2UgLSAwLjEgJiYKKyAgICAgICAgICAgICAgICBjYWxjLT50b3Rfbm9pc2UgKyBjYWxjLT5vdmVyX25vaXNlIDwgYmVzdC0+dG90X25vaXNlICsgYmVzdC0+b3Zlcl9ub2lzZSkKKyAgICAgICAgICAgIHx8IChjYWxjLT5tYXhfbm9pc2UgPiAwLjAgJiYKKyAgICAgICAgICAgICAgICBiZXN0LT5tYXhfbm9pc2UgPiAtMC4xICYmCisgICAgICAgICAgICAgICAgYmVzdC0+bWF4X25vaXNlID4gY2FsYy0+bWF4X25vaXNlIC0gMC4xNSAmJgorICAgICAgICAgICAgICAgIGNhbGMtPnRvdF9ub2lzZSArIGNhbGMtPm92ZXJfbm9pc2UgKyBjYWxjLT5vdmVyX25vaXNlIDwKKyAgICAgICAgICAgICAgICBiZXN0LT50b3Rfbm9pc2UgKyBiZXN0LT5vdmVyX25vaXNlICsgYmVzdC0+b3Zlcl9ub2lzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgYmV0dGVyID0gY2FsYy0+b3Zlcl9ub2lzZSA8IGJlc3QtPm92ZXJfbm9pc2UKKyAgICAgICAgICAgIHx8IChFUShjYWxjLT5vdmVyX25vaXNlLCBiZXN0LT5vdmVyX25vaXNlKSAmJiBjYWxjLT50b3Rfbm9pc2UgPCBiZXN0LT50b3Rfbm9pc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIGJldHRlciA9IGNhbGMtPm92ZXJfbm9pc2UgPCBiZXN0LT5vdmVyX25vaXNlCisgICAgICAgICAgICB8fCAoRVEoY2FsYy0+b3Zlcl9ub2lzZSwgYmVzdC0+b3Zlcl9ub2lzZSkgJiYKKyAgICAgICAgICAgICAgICAoY2FsYy0+bWF4X25vaXNlIDwgYmVzdC0+bWF4X25vaXNlCisgICAgICAgICAgICAgICAgIHx8IChFUShjYWxjLT5tYXhfbm9pc2UsIGJlc3QtPm1heF9ub2lzZSkgJiYgY2FsYy0+dG90X25vaXNlIDw9IGJlc3QtPnRvdF9ub2lzZSkKKyAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBiZXR0ZXIgPSBjYWxjLT5vdmVyX2NvdW50IDwgYmVzdC0+b3Zlcl9jb3VudCB8fCBjYWxjLT5vdmVyX25vaXNlIDwgYmVzdC0+b3Zlcl9ub2lzZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICBpZiAoYmVzdC0+b3Zlcl9jb3VudCA9PSAwKSB7CisgICAgICAgIC8qCisgICAgICAgICAgIElmIG5vIGRpc3RvcnRlZCBiYW5kcywgb25seSB1c2UgdGhpcyBxdWFudGl6YXRpb24KKyAgICAgICAgICAgaWYgaXQgaXMgYmV0dGVyLCBhbmQgaWYgaXQgdXNlcyBsZXNzIGJpdHMuCisgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHBhcnQyXzNfbGVuZ3RoIGlzIHNvbWV0aW1lcyBhIHBvb3IKKyAgICAgICAgICAgZXN0aW1hdG9yIG9mIHRoZSBmaW5hbCBzaXplIGF0IGxvdyBiaXRyYXRlcy4KKyAgICAgICAgICovCisgICAgICAgIGJldHRlciA9IGJldHRlciAmJiBjYWxjLT5iaXRzIDwgYmVzdC0+Yml0czsKKyAgICB9CisKKworICAgIHJldHVybiBiZXR0ZXI7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgIGFtcF9zY2FsZWZhY19iYW5kcygpCisgKgorICogIGF1dGhvci9kYXRlPz8KKyAqCisgKiAgQW1wbGlmeSB0aGUgc2NhbGVmYWN0b3IgYmFuZHMgdGhhdCB2aW9sYXRlIHRoZSBtYXNraW5nIHRocmVzaG9sZC4KKyAqICBTZWUgSVNPIDExMTcyLTMgU2VjdGlvbiBDLjEuNS40LjMuNQorICoKKyAqICBkaXN0b3J0W10gPSBub2lzZS9tYXNraW5nCisgKiAgZGlzdG9ydFtdID4gMSAgID09PiBub2lzZSBpcyBub3QgbWFza2VkCisgKiAgZGlzdG9ydFtdIDwgMSAgID09PiBub2lzZSBpcyBtYXNrZWQKKyAqICBtYXhfZGlzdCA9IG1heGltdW0gdmFsdWUgb2YgZGlzdG9ydFtdCisgKgorICogIFRocmVlIGFsZ29yaXRobXM6CisgKiAgbm9pc2Vfc2hhcGluZ19hbXAKKyAqICAgICAgICAwICAgICAgICAgICAgIEFtcGxpZnkgYWxsIGJhbmRzIHdpdGggZGlzdG9ydFtdPjEuCisgKgorICogICAgICAgIDEgICAgICAgICAgICAgQW1wbGlmeSBhbGwgYmFuZHMgd2l0aCBkaXN0b3J0W10gPj0gbWF4X2Rpc3ReKC41KTsKKyAqICAgICAgICAgICAgICAgICAgICAgKCA1MCUgaW4gdGhlIGRiIHNjYWxlKQorICoKKyAqICAgICAgICAyICAgICAgICAgICAgIEFtcGxpZnkgZmlyc3QgYmFuZCB3aXRoIGRpc3RvcnRbXSA+PSBtYXhfZGlzdDsKKyAqCisgKgorICogIEZvciBhbGdvcml0aG1zIDAgYW5kIDEsIGlmIG1heF9kaXN0IDwgMSwgdGhlbiBhbXBsaWZ5IGFsbCBiYW5kcworICogIHdpdGggZGlzdG9ydFtdID49IC45NSptYXhfZGlzdC4gIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cworICogIGFtcGxpZnkgYXQgbGVhc3Qgb25lIGJhbmQuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FtcF9zY2FsZWZhY19iYW5kcyhsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLAorICAgICAgICAgICAgICAgICAgIGdyX2luZm8gKiBjb25zdCBjb2RfaW5mbywgRkxPQVQgY29uc3QgKmRpc3RvcnQsIEZMT0FUIHhycG93WzU3Nl0sIGludCBiUmVmaW5lKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBqLCBzZmI7CisgICAgRkxPQVQgICBpZnFzdGVwMzQsIHRyaWdnZXI7CisgICAgaW50ICAgICBub2lzZV9zaGFwaW5nX2FtcDsKKworICAgIGlmIChjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgPT0gMCkgeworICAgICAgICBpZnFzdGVwMzQgPSAxLjI5NjgzOTU1NDY1MTAwOTY0MDU1OyAvKiAyKiooLjc1Ki41KSAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWZxc3RlcDM0ID0gMS42ODE3OTI4MzA1MDc0MjkyMjYxMjsgLyogMioqKC43NSoxKSAqLworICAgIH0KKworICAgIC8qIGNvbXB1dGUgbWF4aW11bSB2YWx1ZSBvZiBkaXN0b3J0W10gICovCisgICAgdHJpZ2dlciA9IDA7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBjb2RfaW5mby0+c2ZibWF4OyBzZmIrKykgeworICAgICAgICBpZiAodHJpZ2dlciA8IGRpc3RvcnRbc2ZiXSkKKyAgICAgICAgICAgIHRyaWdnZXIgPSBkaXN0b3J0W3NmYl07CisgICAgfQorCisgICAgbm9pc2Vfc2hhcGluZ19hbXAgPSBnZmMtPm5vaXNlX3NoYXBpbmdfYW1wOworICAgIGlmIChub2lzZV9zaGFwaW5nX2FtcCA9PSAzKSB7CisgICAgICAgIGlmIChiUmVmaW5lID09IDEpCisgICAgICAgICAgICBub2lzZV9zaGFwaW5nX2FtcCA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5vaXNlX3NoYXBpbmdfYW1wID0gMTsKKyAgICB9CisgICAgc3dpdGNoIChub2lzZV9zaGFwaW5nX2FtcCkgeworICAgIGNhc2UgMjoKKyAgICAgICAgLyogYW1wbGlmeSBleGFjdGx5IDEgYmFuZCAqLworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgICAgLyogYW1wbGlmeSBiYW5kcyB3aXRoaW4gNTAlIG9mIG1heCAob24gZGIgc2NhbGUpICovCisgICAgICAgIGlmICh0cmlnZ2VyID4gMS4wKQorICAgICAgICAgICAgdHJpZ2dlciA9IHBvdyh0cmlnZ2VyLCAuNSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRyaWdnZXIgKj0gLjk1OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMDoKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBJU08gYWxnb3JpdGhtLiAgYW1wbGlmeSBhbGwgYmFuZHMgd2l0aCBkaXN0b3J0PjEgKi8KKyAgICAgICAgaWYgKHRyaWdnZXIgPiAxLjApCisgICAgICAgICAgICB0cmlnZ2VyID0gMS4wOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0cmlnZ2VyICo9IC45NTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaiA9IDA7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBjb2RfaW5mby0+c2ZibWF4OyBzZmIrKykgeworICAgICAgICBpbnQgY29uc3Qgd2lkdGggPSBjb2RfaW5mby0+d2lkdGhbc2ZiXTsKKyAgICAgICAgaW50ICAgICBsOworICAgICAgICBqICs9IHdpZHRoOworICAgICAgICBpZiAoZGlzdG9ydFtzZmJdIDwgdHJpZ2dlcikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChnZmMtPnN1YnN0ZXBfc2hhcGluZyAmIDIpIHsKKyAgICAgICAgICAgIGdmYy0+cHNldWRvaGFsZltzZmJdID0gIWdmYy0+cHNldWRvaGFsZltzZmJdOworICAgICAgICAgICAgaWYgKCFnZmMtPnBzZXVkb2hhbGZbc2ZiXSAmJiBnZmMtPm5vaXNlX3NoYXBpbmdfYW1wID09IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvZF9pbmZvLT5zY2FsZWZhY1tzZmJdKys7CisgICAgICAgIGZvciAobCA9IC13aWR0aDsgbCA8IDA7IGwrKykgeworICAgICAgICAgICAgeHJwb3dbaiArIGxdICo9IGlmcXN0ZXAzNDsKKyAgICAgICAgICAgIGlmICh4cnBvd1tqICsgbF0gPiBjb2RfaW5mby0+eHJwb3dfbWF4KQorICAgICAgICAgICAgICAgIGNvZF9pbmZvLT54cnBvd19tYXggPSB4cnBvd1tqICsgbF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2ZjLT5ub2lzZV9zaGFwaW5nX2FtcCA9PSAyKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIGluY19zY2FsZWZhY19zY2FsZSgpCisgKgorICogIFRha2VoaXJvIFRvbWluYWdhIDIwMDAteHgteHgKKyAqCisgKiAgdHVybnMgb24gc2NhbGVmYWMgc2NhbGUgYW5kIGFkanVzdHMgc2NhbGVmYWN0b3JzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbmNfc2NhbGVmYWNfc2NhbGUoZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvLCBGTE9BVCB4cnBvd1s1NzZdKQoreworICAgIGludCAgICAgbCwgaiwgc2ZiOworICAgIGNvbnN0IEZMT0FUIGlmcXN0ZXAzNCA9IDEuMjk2ODM5NTU0NjUxMDA5NjQwNTU7CisKKyAgICBqID0gMDsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IGNvZF9pbmZvLT5zZmJtYXg7IHNmYisrKSB7CisgICAgICAgIGludCBjb25zdCB3aWR0aCA9IGNvZF9pbmZvLT53aWR0aFtzZmJdOworICAgICAgICBpbnQgICAgIHMgPSBjb2RfaW5mby0+c2NhbGVmYWNbc2ZiXTsKKyAgICAgICAgaWYgKGNvZF9pbmZvLT5wcmVmbGFnKQorICAgICAgICAgICAgcyArPSBwcmV0YWJbc2ZiXTsKKyAgICAgICAgaiArPSB3aWR0aDsKKyAgICAgICAgaWYgKHMgJiAxKSB7CisgICAgICAgICAgICBzKys7CisgICAgICAgICAgICBmb3IgKGwgPSAtd2lkdGg7IGwgPCAwOyBsKyspIHsKKyAgICAgICAgICAgICAgICB4cnBvd1tqICsgbF0gKj0gaWZxc3RlcDM0OworICAgICAgICAgICAgICAgIGlmICh4cnBvd1tqICsgbF0gPiBjb2RfaW5mby0+eHJwb3dfbWF4KQorICAgICAgICAgICAgICAgICAgICBjb2RfaW5mby0+eHJwb3dfbWF4ID0geHJwb3dbaiArIGxdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvZF9pbmZvLT5zY2FsZWZhY1tzZmJdID0gcyA+PiAxOworICAgIH0KKyAgICBjb2RfaW5mby0+cHJlZmxhZyA9IDA7CisgICAgY29kX2luZm8tPnNjYWxlZmFjX3NjYWxlID0gMTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBpbmNfc3ViYmxvY2tfZ2FpbigpCisgKgorICogIFRha2VoaXJvIFRvbWluYWdhIDIwMDAteHgteHgKKyAqCisgKiAgaW5jcmVhc2VzIHRoZSBzdWJibG9jayBnYWluIGFuZCBhZGp1c3RzIHNjYWxlZmFjdG9ycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitpbmNfc3ViYmxvY2tfZ2Fpbihjb25zdCBsYW1lX2ludGVybmFsX2ZsYWdzICogY29uc3QgZ2ZjLCBncl9pbmZvICogY29uc3QgY29kX2luZm8sIEZMT0FUIHhycG93WzU3Nl0pCit7CisgICAgaW50ICAgICBzZmIsIHdpbmRvdzsKKyAgICBpbnQgICAgKmNvbnN0IHNjYWxlZmFjID0gY29kX2luZm8tPnNjYWxlZmFjOworCisgICAgLyogc3ViYmxvY19nYWluIGNhbid0IGRvIGFueXRoaW5nIGluIHRoZSBsb25nIGJsb2NrIHJlZ2lvbiAqLworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgY29kX2luZm8tPnNmYl9sbWF4OyBzZmIrKykgeworICAgICAgICBpZiAoc2NhbGVmYWNbc2ZiXSA+PSAxNikKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZvciAod2luZG93ID0gMDsgd2luZG93IDwgMzsgd2luZG93KyspIHsKKyAgICAgICAgaW50ICAgICBzMSwgczIsIGwsIGo7CisgICAgICAgIHMxID0gczIgPSAwOworCisgICAgICAgIGZvciAoc2ZiID0gY29kX2luZm8tPnNmYl9sbWF4ICsgd2luZG93OyBzZmIgPCBjb2RfaW5mby0+c2ZiZGl2aWRlOyBzZmIgKz0gMykgeworICAgICAgICAgICAgaWYgKHMxIDwgc2NhbGVmYWNbc2ZiXSkKKyAgICAgICAgICAgICAgICBzMSA9IHNjYWxlZmFjW3NmYl07CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IHNmYiA8IGNvZF9pbmZvLT5zZmJtYXg7IHNmYiArPSAzKSB7CisgICAgICAgICAgICBpZiAoczIgPCBzY2FsZWZhY1tzZmJdKQorICAgICAgICAgICAgICAgIHMyID0gc2NhbGVmYWNbc2ZiXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzMSA8IDE2ICYmIHMyIDwgOCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChjb2RfaW5mby0+c3ViYmxvY2tfZ2Fpblt3aW5kb3ddID49IDcpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAvKiBldmVuIHRob3VnaCB0aGVyZSBpcyBubyBzY2FsZWZhY3RvciBmb3Igc2ZiMTIKKyAgICAgICAgICogc3ViYmxvY2sgZ2FpbiBhZmZlY3RzIHVwcGVyIGZyZXF1ZW5jaWVzIHRvbywgdGhhdCdzIHdoeQorICAgICAgICAgKiB3ZSBoYXZlIHRvIGdvIHVwIHRvIFNCTUFYX3MKKyAgICAgICAgICovCisgICAgICAgIGNvZF9pbmZvLT5zdWJibG9ja19nYWluW3dpbmRvd10rKzsKKyAgICAgICAgaiA9IGdmYy0+c2NhbGVmYWNfYmFuZC5sW2NvZF9pbmZvLT5zZmJfbG1heF07CisgICAgICAgIGZvciAoc2ZiID0gY29kX2luZm8tPnNmYl9sbWF4ICsgd2luZG93OyBzZmIgPCBjb2RfaW5mby0+c2ZibWF4OyBzZmIgKz0gMykgeworICAgICAgICAgICAgRkxPQVQgICBhbXA7CisgICAgICAgICAgICBpbnQgY29uc3Qgd2lkdGggPSBjb2RfaW5mby0+d2lkdGhbc2ZiXTsKKyAgICAgICAgICAgIGludCAgICAgcyA9IHNjYWxlZmFjW3NmYl07CisgICAgICAgICAgICBhc3NlcnQocyA+PSAwKTsKKyAgICAgICAgICAgIHMgPSBzIC0gKDQgPj4gY29kX2luZm8tPnNjYWxlZmFjX3NjYWxlKTsKKyAgICAgICAgICAgIGlmIChzID49IDApIHsKKyAgICAgICAgICAgICAgICBzY2FsZWZhY1tzZmJdID0gczsKKyAgICAgICAgICAgICAgICBqICs9IHdpZHRoICogMzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2NhbGVmYWNbc2ZiXSA9IDA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvbnN0IGdhaW4gPSAyMTAgKyAocyA8PCAoY29kX2luZm8tPnNjYWxlZmFjX3NjYWxlICsgMSkpOworICAgICAgICAgICAgICAgIGFtcCA9IElQT1cyMChnYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGogKz0gd2lkdGggKiAod2luZG93ICsgMSk7CisgICAgICAgICAgICBmb3IgKGwgPSAtd2lkdGg7IGwgPCAwOyBsKyspIHsKKyAgICAgICAgICAgICAgICB4cnBvd1tqICsgbF0gKj0gYW1wOworICAgICAgICAgICAgICAgIGlmICh4cnBvd1tqICsgbF0gPiBjb2RfaW5mby0+eHJwb3dfbWF4KQorICAgICAgICAgICAgICAgICAgICBjb2RfaW5mby0+eHJwb3dfbWF4ID0geHJwb3dbaiArIGxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaiArPSB3aWR0aCAqICgzIC0gd2luZG93IC0gMSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBhbXAgPSBJUE9XMjAoMjAyKTsKKyAgICAgICAgICAgIGogKz0gY29kX2luZm8tPndpZHRoW3NmYl0gKiAod2luZG93ICsgMSk7CisgICAgICAgICAgICBmb3IgKGwgPSAtY29kX2luZm8tPndpZHRoW3NmYl07IGwgPCAwOyBsKyspIHsKKyAgICAgICAgICAgICAgICB4cnBvd1tqICsgbF0gKj0gYW1wOworICAgICAgICAgICAgICAgIGlmICh4cnBvd1tqICsgbF0gPiBjb2RfaW5mby0+eHJwb3dfbWF4KQorICAgICAgICAgICAgICAgICAgICBjb2RfaW5mby0+eHJwb3dfbWF4ID0geHJwb3dbaiArIGxdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBiYWxhbmNlX25vaXNlKCkKKyAqCisgKiAgVGFrZWhpcm8gVG9taW5hZ2EgL2RhdGU/PworICogIFJvYmVydCBIZWdlbWFubiAyMDAwLTA5LTA2OiBtYWRlIGEgZnVuY3Rpb24gb2YgaXQKKyAqCisgKiAgYW1wbGlmaWVzIHNjYWxlZmFjdG9yIGJhbmRzLAorICogICAtIGlmIGFsbCBhcmUgYWxyZWFkeSBhbXBsaWZpZWQgcmV0dXJucyAwCisgKiAgIC0gaWYgc29tZSBiYW5kcyBhcmUgYW1wbGlmaWVkIHRvbyBtdWNoOgorICogICAgICAqIHRyeSB0byBpbmNyZWFzZSBzY2FsZWZhY19zY2FsZQorICogICAgICAqIGlmIGFscmVhZHkgc2NhbGVmYWNfc2NhbGUgd2FzIHNldAorICogICAgICAgICAgdHJ5IG9uIHNob3J0IGJsb2NrcyB0byBpbmNyZWFzZSBzdWJibG9jayBnYWluCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW5saW5lIHN0YXRpYyBpbnQKK2JhbGFuY2Vfbm9pc2UobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmNvbnN0IGdmcCwKKyAgICAgICAgICAgICAgZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvLCBGTE9BVCBjb25zdCAqZGlzdG9ydCwgRkxPQVQgeHJwb3dbNTc2XSwgaW50IGJSZWZpbmUpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIHN0YXR1czsKKworICAgIGFtcF9zY2FsZWZhY19iYW5kcyhnZnAsIGNvZF9pbmZvLCBkaXN0b3J0LCB4cnBvdywgYlJlZmluZSk7CisKKyAgICAvKiBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBub3QgYW1wbGlmaWVkIHRvbyBtdWNoCisgICAgICogbG9vcF9icmVhayByZXR1cm5zIDAgaWYgdGhlcmUgaXMgYW4gdW5hbXBsaWZpZWQgc2NhbGVmYWMKKyAgICAgKiBzY2FsZV9iaXRjb3VudCByZXR1cm5zIDAgaWYgbm8gc2NhbGVmYWN0b3JzIGFyZSB0b28gbGFyZ2UKKyAgICAgKi8KKworICAgIHN0YXR1cyA9IGxvb3BfYnJlYWsoY29kX2luZm8pOworCisgICAgaWYgKHN0YXR1cykKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8qIGFsbCBiYW5kcyBhbXBsaWZpZWQgKi8KKworICAgIC8qIG5vdCBhbGwgc2NhbGVmYWN0b3JzIGhhdmUgYmVlbiBhbXBsaWZpZWQuICBzbyB0aGVzZQorICAgICAqIHNjYWxlZmFjcyBhcmUgcG9zc2libHkgdmFsaWQuICBlbmNvZGUgdGhlbToKKyAgICAgKi8KKyAgICBpZiAoZ2ZjLT5tb2RlX2dyID09IDIpCisgICAgICAgIHN0YXR1cyA9IHNjYWxlX2JpdGNvdW50KGNvZF9pbmZvKTsKKyAgICBlbHNlCisgICAgICAgIHN0YXR1cyA9IHNjYWxlX2JpdGNvdW50X2xzZihnZmMsIGNvZF9pbmZvKTsKKworICAgIGlmICghc3RhdHVzKQorICAgICAgICByZXR1cm4gMTsgICAgICAgLyogYW1wbGlmaWVkIHNvbWUgYmFuZHMgbm90IGV4Y2VlZGluZyBsaW1pdHMgKi8KKworICAgIC8qICBzb21lIHNjYWxlZmFjdG9ycyBhcmUgdG9vIGxhcmdlLgorICAgICAqICBsZXRzIHRyeSBzZXR0aW5nIHNjYWxlZmFjX3NjYWxlPTEKKyAgICAgKi8KKyAgICBpZiAoZ2ZjLT5ub2lzZV9zaGFwaW5nID4gMSkgeworICAgICAgICBtZW1zZXQoJmdmYy0+cHNldWRvaGFsZlswXSwgMCwgc2l6ZW9mKGdmYy0+cHNldWRvaGFsZikpOworICAgICAgICBpZiAoIWNvZF9pbmZvLT5zY2FsZWZhY19zY2FsZSkgeworICAgICAgICAgICAgaW5jX3NjYWxlZmFjX3NjYWxlKGNvZF9pbmZvLCB4cnBvdyk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGNvZF9pbmZvLT5ibG9ja190eXBlID09IFNIT1JUX1RZUEUgJiYgZ2ZjLT5zdWJibG9ja19nYWluID4gMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGluY19zdWJibG9ja19nYWluKGdmYywgY29kX2luZm8sIHhycG93KQorICAgICAgICAgICAgICAgICAgICB8fCBsb29wX2JyZWFrKGNvZF9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIGlmIChnZmMtPm1vZGVfZ3IgPT0gMikKKyAgICAgICAgICAgIHN0YXR1cyA9IHNjYWxlX2JpdGNvdW50KGNvZF9pbmZvKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdHVzID0gc2NhbGVfYml0Y291bnRfbHNmKGdmYywgY29kX2luZm8pOworICAgIH0KKyAgICByZXR1cm4gIXN0YXR1czsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgb3V0ZXJfbG9vcCAoKQorICoKKyAqICBGdW5jdGlvbjogVGhlIG91dGVyIGl0ZXJhdGlvbiBsb29wIGNvbnRyb2xzIHRoZSBtYXNraW5nIGNvbmRpdGlvbnMKKyAqICBvZiBhbGwgc2NhbGVmYWN0b3JiYW5kcy4gSXQgY29tcHV0ZXMgdGhlIGJlc3Qgc2NhbGVmYWMgYW5kCisgKiAgZ2xvYmFsIGdhaW4uIFRoaXMgbW9kdWxlIGNhbGxzIHRoZSBpbm5lciBpdGVyYXRpb24gbG9vcAorICoKKyAqICBtdCA1Lzk5IGNvbXBsZXRlbHkgcmV3cml0dGVuIHRvIGFsbG93IGZvciBiaXQgcmVzZXJ2b2lyIGNvbnRyb2wsCisgKiAgbWlkL3NpZGUgY2hhbm5lbHMgd2l0aCBML1Igb3IgbWlkL3NpZGUgbWFza2luZyB0aHJlc2hvbGRzLAorICogIGFuZCBjaG9vc2VzIGJlc3QgcXVhbnRpemF0aW9uIGluc3RlYWQgb2YgbGFzdCBxdWFudGl6YXRpb24gd2hlbgorICogIG5vIGRpc3RvcnRpb24gZnJlZSBxdWFudGl6YXRpb24gY2FuIGJlIGZvdW5kLgorICoKKyAqICBhZGRlZCBWQlIgc3VwcG9ydCBtdCA1Lzk5CisgKgorICogIHNvbWUgY29kZSBzaHVmZmxlIHJoIDkvMDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK291dGVyX2xvb3AobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvLCBjb25zdCBGTE9BVCAqIGNvbnN0IGwzX3htaW4sIC8qIGFsbG93ZWQgZGlzdG9ydGlvbiAqLworICAgICAgICAgICBGTE9BVCB4cnBvd1s1NzZdLCAvKiBjb2xvdXJlZCBtYWduaXR1ZGVzIG9mIHNwZWN0cmFsICovCisgICAgICAgICAgIGNvbnN0IGludCBjaCwgY29uc3QgaW50IHRhcmdfYml0cykKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gYWxsb3dlZCBiaXRzICovCisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBncl9pbmZvIGNvZF9pbmZvX3c7CisgICAgRkxPQVQgICBzYXZlX3hycG93WzU3Nl07CisgICAgRkxPQVQgICBkaXN0b3J0W1NGQk1BWF07CisgICAgY2FsY19ub2lzZV9yZXN1bHQgYmVzdF9ub2lzZV9pbmZvOworICAgIGludCAgICAgaHVmZl9iaXRzOworICAgIGludCAgICAgYmV0dGVyOworICAgIGludCAgICAgYWdlOworICAgIGNhbGNfbm9pc2VfZGF0YSBwcmV2X25vaXNlOworICAgIGludCAgICAgYmVzdF9wYXJ0Ml8zX2xlbmd0aCA9IDk5OTk5OTk7CisgICAgaW50ICAgICBiRW5kT2ZTZWFyY2ggPSAwOworICAgIGludCAgICAgYlJlZmluZSA9IDA7CisgICAgaW50ICAgICBiZXN0X2dnYWluX3Bhc3MxID0gMDsKKworICAgICh2b2lkKSBiaW5fc2VhcmNoX1N0ZXBTaXplKGdmYywgY29kX2luZm8sIHRhcmdfYml0cywgY2gsIHhycG93KTsKKworICAgIGlmICghZ2ZjLT5ub2lzZV9zaGFwaW5nKQorICAgICAgICAvKiBmYXN0IG1vZGUsIG5vIG5vaXNlIHNoYXBpbmcsIHdlIGFyZSByZWFkeSAqLworICAgICAgICByZXR1cm4gMTAwOyAgICAgLyogZGVmYXVsdCBub2lzZV9pbmZvLm92ZXJfY291bnQgKi8KKworICAgIG1lbXNldCgmcHJldl9ub2lzZSwgMCwgc2l6ZW9mKGNhbGNfbm9pc2VfZGF0YSkpOworCisKKyAgICAvKiBjb21wdXRlIHRoZSBkaXN0b3J0aW9uIGluIHRoaXMgcXVhbnRpemF0aW9uICovCisgICAgLyogY29lZmZpY2llbnRzIGFuZCB0aHJlc2hvbGRzIGJvdGggbC9yIChvciBib3RoIG1pZC9zaWRlKSAqLworICAgICh2b2lkKSBjYWxjX25vaXNlKGNvZF9pbmZvLCBsM194bWluLCBkaXN0b3J0LCAmYmVzdF9ub2lzZV9pbmZvLCAmcHJldl9ub2lzZSk7CisgICAgYmVzdF9ub2lzZV9pbmZvLmJpdHMgPSBjb2RfaW5mby0+cGFydDJfM19sZW5ndGg7CisKKyAgICBjb2RfaW5mb193ID0gKmNvZF9pbmZvOworICAgIGFnZSA9IDA7CisgICAgLyogaWYgKGdmcC0+VkJSID09IHZicl9yaCB8fCBnZnAtPlZCUiA9PSB2YnJfbXRyaCkgKi8KKyAgICBtZW1jcHkoc2F2ZV94cnBvdywgeHJwb3csIHNpemVvZihGTE9BVCkgKiA1NzYpOworCisgICAgd2hpbGUgKCFiRW5kT2ZTZWFyY2gpIHsKKyAgICAgICAgLyogQkVHSU4gTUFJTiBMT09QICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNhbGNfbm9pc2VfcmVzdWx0IG5vaXNlX2luZm87CisgICAgICAgICAgICBpbnQgICAgIHNlYXJjaF9saW1pdDsKKyAgICAgICAgICAgIGludCAgICAgbWF4Z2dhaW4gPSAyNTU7CisKKyAgICAgICAgICAgIC8qIFdoZW4gcXVhbnRpemF0aW9uIHdpdGggbm8gZGlzdG9ydGVkIGJhbmRzIGlzIGZvdW5kLAorICAgICAgICAgICAgICogYWxsb3cgdXAgdG8gWCBuZXcgdW5zdWNjZXNmdWwgdHJpZXMgaW4gc2VyaWFsLiBUaGlzCisgICAgICAgICAgICAgKiBnaXZlcyB1cyBtb3JlIHBvc3NpYmlsaXRpZXMgZm9yIGRpZmZlcmVudCBxdWFudF9jb21wYXJlIG1vZGVzLgorICAgICAgICAgICAgICogTXVjaCBtb3JlIHRoYW4gMyBtYWtlcyBub3QgYSBiaWcgZGlmZmVyZW5jZSwgaXQgaXMgb25seSBzbG93ZXIuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKGdmYy0+c3Vic3RlcF9zaGFwaW5nICYgMikgeworICAgICAgICAgICAgICAgIHNlYXJjaF9saW1pdCA9IDIwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2VhcmNoX2xpbWl0ID0gMzsKKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBsYXN0IHNjYWxlZmFjdG9yIGJhbmQgaXMgZGlzdG9ydGVkLgorICAgICAgICAgICAgICogaW4gVkJSIG1vZGUgd2UgY2FuJ3QgZ2V0IHJpZCBvZiB0aGUgZGlzdG9ydGlvbiwgc28gcXVpdCBub3cKKyAgICAgICAgICAgICAqIGFuZCBWQlIgbW9kZSB3aWxsIHRyeSBhZ2FpbiB3aXRoIG1vcmUgYml0cy4KKyAgICAgICAgICAgICAqIChtYWtlcyBhIDEwJSBzcGVlZCBpbmNyZWFzZSwgdGhlIGZpbGVzIEkgdGVzdGVkIHdlcmUKKyAgICAgICAgICAgICAqIGJpbmFyeSBpZGVudGljYWwsIDIwMDAvMDUvMjAgUm9iZXJ0IEhlZ2VtYW5uKQorICAgICAgICAgICAgICogZGlzdG9ydFtdID4gMSBtZWFucyBub2lzZSA+IGFsbG93ZWQgbm9pc2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGdmYy0+c2ZiMjFfZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzdG9ydFtjb2RfaW5mb193LnNmYm1heF0gPiAxLjApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChjb2RfaW5mb193LmJsb2NrX3R5cGUgPT0gU0hPUlRfVFlQRQorICAgICAgICAgICAgICAgICAgICAmJiAoZGlzdG9ydFtjb2RfaW5mb193LnNmYm1heCArIDFdID4gMS4wCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBkaXN0b3J0W2NvZF9pbmZvX3cuc2ZibWF4ICsgMl0gPiAxLjApKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdHJ5IGEgbmV3IHNjYWxlZmFjdG9yIGNvbmJpbmF0aW9uIG9uIGNvZF9pbmZvX3cgKi8KKyAgICAgICAgICAgIGlmIChiYWxhbmNlX25vaXNlKGdmcCwgJmNvZF9pbmZvX3csIGRpc3RvcnQsIHhycG93LCBiUmVmaW5lKSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGNvZF9pbmZvX3cuc2NhbGVmYWNfc2NhbGUpCisgICAgICAgICAgICAgICAgbWF4Z2dhaW4gPSAyNTQ7CisKKyAgICAgICAgICAgIC8qIGlubmVyX2xvb3Agc3RhcnRzIHdpdGggdGhlIGluaXRpYWwgcXVhbnRpemF0aW9uIHN0ZXAgY29tcHV0ZWQgYWJvdmUKKyAgICAgICAgICAgICAqIGFuZCBzbG93bHkgaW5jcmVhc2VzIHVudGlsIHRoZSBiaXRzIDwgaHVmZl9iaXRzLgorICAgICAgICAgICAgICogVGh1cyBpdCBpcyBpbXBvcnRhbnQgbm90IHRvIHN0YXJ0IHdpdGggdG9vIGxhcmdlIG9mIGFuIGluaXRhbAorICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHN0ZXAuICBUb28gc21hbGwgaXMgb2ssIGJ1dCBpbm5lcl9sb29wIHdpbGwgdGFrZSBsb25nZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaHVmZl9iaXRzID0gdGFyZ19iaXRzIC0gY29kX2luZm9fdy5wYXJ0Ml9sZW5ndGg7CisgICAgICAgICAgICBpZiAoaHVmZl9iaXRzIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qICBpbmNyZWFzZSBxdWFudGl6ZXIgc3RlcHNpemUgdW50aWwgbmVlZGVkIGJpdHMgYXJlIGJlbG93IG1heGltdW0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd2hpbGUgKChjb2RfaW5mb193LnBhcnQyXzNfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgID0gY291bnRfYml0cyhnZmMsIHhycG93LCAmY29kX2luZm9fdywgJnByZXZfbm9pc2UpKSA+IGh1ZmZfYml0cworICAgICAgICAgICAgICAgICAgICYmIGNvZF9pbmZvX3cuZ2xvYmFsX2dhaW4gPD0gbWF4Z2dhaW4pCisgICAgICAgICAgICAgICAgY29kX2luZm9fdy5nbG9iYWxfZ2FpbisrOworCisgICAgICAgICAgICBpZiAoY29kX2luZm9fdy5nbG9iYWxfZ2FpbiA+IG1heGdnYWluKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoYmVzdF9ub2lzZV9pbmZvLm92ZXJfY291bnQgPT0gMCkgeworCisgICAgICAgICAgICAgICAgd2hpbGUgKChjb2RfaW5mb193LnBhcnQyXzNfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICA9IGNvdW50X2JpdHMoZ2ZjLCB4cnBvdywgJmNvZF9pbmZvX3csICZwcmV2X25vaXNlKSkgPiBiZXN0X3BhcnQyXzNfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICYmIGNvZF9pbmZvX3cuZ2xvYmFsX2dhaW4gPD0gbWF4Z2dhaW4pCisgICAgICAgICAgICAgICAgICAgIGNvZF9pbmZvX3cuZ2xvYmFsX2dhaW4rKzsKKworICAgICAgICAgICAgICAgIGlmIChjb2RfaW5mb193Lmdsb2JhbF9nYWluID4gbWF4Z2dhaW4pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjb21wdXRlIHRoZSBkaXN0b3J0aW9uIGluIHRoaXMgcXVhbnRpemF0aW9uICovCisgICAgICAgICAgICAodm9pZCkgY2FsY19ub2lzZSgmY29kX2luZm9fdywgbDNfeG1pbiwgZGlzdG9ydCwgJm5vaXNlX2luZm8sICZwcmV2X25vaXNlKTsKKyAgICAgICAgICAgIG5vaXNlX2luZm8uYml0cyA9IGNvZF9pbmZvX3cucGFydDJfM19sZW5ndGg7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoaXMgcXVhbnRpemF0aW9uIGlzIGJldHRlcgorICAgICAgICAgICAgICogdGhhbiBvdXIgc2F2ZWQgcXVhbnRpemF0aW9uICovCisgICAgICAgICAgICBpZiAoY29kX2luZm8tPmJsb2NrX3R5cGUgIT0gU0hPUlRfVFlQRSkgLyogTk9STSwgU1RBUlQgb3IgU1RPUCB0eXBlICovCisgICAgICAgICAgICAgICAgYmV0dGVyID0gZ2ZwLT5xdWFudF9jb21wOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJldHRlciA9IGdmcC0+cXVhbnRfY29tcF9zaG9ydDsKKworCisgICAgICAgICAgICBiZXR0ZXIgPSBxdWFudF9jb21wYXJlKGJldHRlciwgJmJlc3Rfbm9pc2VfaW5mbywgJm5vaXNlX2luZm8sICZjb2RfaW5mb193LCBkaXN0b3J0KTsKKworCisgICAgICAgICAgICAvKiBzYXZlIGRhdGEgc28gd2UgY2FuIHJlc3RvcmUgdGhpcyBxdWFudGl6YXRpb24gbGF0ZXIgKi8KKyAgICAgICAgICAgIGlmIChiZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICBiZXN0X3BhcnQyXzNfbGVuZ3RoID0gY29kX2luZm8tPnBhcnQyXzNfbGVuZ3RoOworICAgICAgICAgICAgICAgIGJlc3Rfbm9pc2VfaW5mbyA9IG5vaXNlX2luZm87CisgICAgICAgICAgICAgICAgKmNvZF9pbmZvID0gY29kX2luZm9fdzsKKyAgICAgICAgICAgICAgICBhZ2UgPSAwOworICAgICAgICAgICAgICAgIC8qIHNhdmUgZGF0YSBzbyB3ZSBjYW4gcmVzdG9yZSB0aGlzIHF1YW50aXphdGlvbiBsYXRlciAqLworICAgICAgICAgICAgICAgIC8qaWYgKGdmcC0+VkJSID09IHZicl9yaCB8fCBnZnAtPlZCUiA9PSB2YnJfbXRyaCkgKi8gIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgZm9yIGxhdGVyIHJldXNlICovCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzYXZlX3hycG93LCB4cnBvdywgc2l6ZW9mKEZMT0FUKSAqIDU3Nik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZWFybHkgc3RvcD8gKi8KKyAgICAgICAgICAgICAgICBpZiAoZ2ZjLT5mdWxsX291dGVyX2xvb3AgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKythZ2UgPiBzZWFyY2hfbGltaXQgJiYgYmVzdF9ub2lzZV9pbmZvLm92ZXJfY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoKGdmYy0+bm9pc2Vfc2hhcGluZ19hbXAgPT0gMykgJiYgYlJlZmluZSAmJiBhZ2UgPiAzMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoKGdmYy0+bm9pc2Vfc2hhcGluZ19hbXAgPT0gMykgJiYgYlJlZmluZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGNvZF9pbmZvX3cuZ2xvYmFsX2dhaW4gLSBiZXN0X2dnYWluX3Bhc3MxKSA+IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlICgoY29kX2luZm9fdy5nbG9iYWxfZ2FpbiArIGNvZF9pbmZvX3cuc2NhbGVmYWNfc2NhbGUpIDwgMjU1KTsKKworICAgICAgICBpZiAoZ2ZjLT5ub2lzZV9zaGFwaW5nX2FtcCA9PSAzKSB7CisgICAgICAgICAgICBpZiAoIWJSZWZpbmUpIHsKKyAgICAgICAgICAgICAgICAvKiByZWZpbmUgc2VhcmNoICovCisgICAgICAgICAgICAgICAgY29kX2luZm9fdyA9ICpjb2RfaW5mbzsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeHJwb3csIHNhdmVfeHJwb3csIHNpemVvZihGTE9BVCkgKiA1NzYpOworICAgICAgICAgICAgICAgIGFnZSA9IDA7CisgICAgICAgICAgICAgICAgYmVzdF9nZ2Fpbl9wYXNzMSA9IGNvZF9pbmZvX3cuZ2xvYmFsX2dhaW47CisKKyAgICAgICAgICAgICAgICBiUmVmaW5lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHNlYXJjaCBhbHJlYWR5IHJlZmluZWQsIHN0b3AgKi8KKyAgICAgICAgICAgICAgICBiRW5kT2ZTZWFyY2ggPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBiRW5kT2ZTZWFyY2ggPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KChjb2RfaW5mby0+Z2xvYmFsX2dhaW4gKyBjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUpIDw9IDI1NSk7CisgICAgLyogIGZpbmlzaCB1cAorICAgICAqLworICAgIGlmIChnZnAtPlZCUiA9PSB2YnJfcmggfHwgZ2ZwLT5WQlIgPT0gdmJyX210cmgpCisgICAgICAgIC8qIHJlc3RvcmUgZm9yIHJldXNlIG9uIG5leHQgdHJ5ICovCisgICAgICAgIG1lbWNweSh4cnBvdywgc2F2ZV94cnBvdywgc2l6ZW9mKEZMT0FUKSAqIDU3Nik7CisgICAgLyogIGRvIHRoZSAnc3Vic3RlcCBzaGFwaW5nJworICAgICAqLworICAgIGVsc2UgaWYgKGdmYy0+c3Vic3RlcF9zaGFwaW5nICYgMSkKKyAgICAgICAgdHJhbmNhdGVfc21hbGxzcGVjdHJ1bXMoZ2ZjLCBjb2RfaW5mbywgbDNfeG1pbiwgeHJwb3cpOworCisgICAgcmV0dXJuIGJlc3Rfbm9pc2VfaW5mby5vdmVyX2NvdW50OworfQorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIGl0ZXJhdGlvbl9maW5pc2hfb25lKCkKKyAqCisgKiAgUm9iZXJ0IEhlZ2VtYW5uIDIwMDAtMDktMDYKKyAqCisgKiAgdXBkYXRlIHJlc2Vydm9pciBzdGF0dXMgYWZ0ZXIgRklOQUwgcXVhbnRpemF0aW9uL2JpdHJhdGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraXRlcmF0aW9uX2ZpbmlzaF9vbmUobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgaW50IGdyLCBpbnQgY2gpCit7CisgICAgSUlJX3NpZGVfaW5mb190ICpjb25zdCBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKyAgICBncl9pbmZvICpjb25zdCBjb2RfaW5mbyA9ICZsM19zaWRlLT50dFtncl1bY2hdOworCisgICAgLyogIHRyeSBzb21lIGJldHRlciBzY2FsZWZhYyBzdG9yYWdlCisgICAgICovCisgICAgYmVzdF9zY2FsZWZhY19zdG9yZShnZmMsIGdyLCBjaCwgbDNfc2lkZSk7CisKKyAgICAvKiAgYmVzdCBodWZmbWFuX2RpdmlkZSBtYXkgc2F2ZSBzb21lIGJpdHMgdG9vCisgICAgICovCisgICAgaWYgKGdmYy0+dXNlX2Jlc3RfaHVmZm1hbiA9PSAxKQorICAgICAgICBiZXN0X2h1ZmZtYW5fZGl2aWRlKGdmYywgY29kX2luZm8pOworCisgICAgLyogIHVwZGF0ZSByZXNlcnZvaXIgc3RhdHVzIGFmdGVyIEZJTkFMIHF1YW50aXphdGlvbi9iaXRyYXRlCisgICAgICovCisgICAgUmVzdkFkanVzdChnZmMsIGNvZF9pbmZvKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIFZCUl9lbmNvZGVfZ3JhbnVsZSgpCisgKgorICogIDIwMDAtMDktMDQgUm9iZXJ0IEhlZ2VtYW5uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK1ZCUl9lbmNvZGVfZ3JhbnVsZShsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBncl9pbmZvICogY29uc3QgY29kX2luZm8sIGNvbnN0IEZMT0FUICogY29uc3QgbDNfeG1pbiwgLyogYWxsb3dlZCBkaXN0b3J0aW9uIG9mIHRoZSBzY2FsZWZhY3RvciAqLworICAgICAgICAgICAgICAgICAgIEZMT0FUIHhycG93WzU3Nl0sIC8qIGNvbG91cmVkIG1hZ25pdHVkZXMgb2Ygc3BlY3RyYWwgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoLCBpbnQgbWluX2JpdHMsIGludCBtYXhfYml0cykKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGdyX2luZm8gYnN0X2NvZF9pbmZvOworICAgIEZMT0FUICAgYnN0X3hycG93WzU3Nl07CisgICAgaW50IGNvbnN0IE1heF9iaXRzID0gbWF4X2JpdHM7CisgICAgaW50ICAgICByZWFsX2JpdHMgPSBtYXhfYml0cyArIDE7CisgICAgaW50ICAgICB0aGlzX2JpdHMgPSAobWF4X2JpdHMgKyBtaW5fYml0cykgLyAyOworICAgIGludCAgICAgZGJpdHMsIG92ZXIsIGZvdW5kID0gMDsKKyAgICBpbnQgY29uc3Qgc2ZiMjFfZXh0cmEgPSBnZmMtPnNmYjIxX2V4dHJhOworCisgICAgYXNzZXJ0KE1heF9iaXRzIDw9IE1BWF9CSVRTX1BFUl9DSEFOTkVMKTsKKyAgICBtZW1zZXQoYnN0X2NvZF9pbmZvLmwzX2VuYywgMCwgc2l6ZW9mKGJzdF9jb2RfaW5mby5sM19lbmMpKTsKKworICAgIC8qICBzZWFyY2ggd2l0aGluIHJvdW5kIGFib3V0IDQwIGJpdHMgb2Ygb3B0aW1hbAorICAgICAqLworICAgIGRvIHsKKyAgICAgICAgYXNzZXJ0KHRoaXNfYml0cyA+PSBtaW5fYml0cyk7CisgICAgICAgIGFzc2VydCh0aGlzX2JpdHMgPD0gbWF4X2JpdHMpOworICAgICAgICBhc3NlcnQobWluX2JpdHMgPD0gbWF4X2JpdHMpOworCisgICAgICAgIGlmICh0aGlzX2JpdHMgPiBNYXhfYml0cyAtIDQyKQorICAgICAgICAgICAgZ2ZjLT5zZmIyMV9leHRyYSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdmYy0+c2ZiMjFfZXh0cmEgPSBzZmIyMV9leHRyYTsKKworICAgICAgICBvdmVyID0gb3V0ZXJfbG9vcChnZnAsIGNvZF9pbmZvLCBsM194bWluLCB4cnBvdywgY2gsIHRoaXNfYml0cyk7CisKKyAgICAgICAgLyogIGlzIHF1YW50aXphdGlvbiBhcyBnb29kIGFzIHdlIGFyZSBsb29raW5nIGZvciA/CisgICAgICAgICAqICBpbiB0aGlzIGNhc2U6IGlzIG5vIHNjYWxlZmFjdG9yIGJhbmQgZGlzdG9ydGVkPworICAgICAgICAgKi8KKyAgICAgICAgaWYgKG92ZXIgPD0gMCkgeworICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgLyogIG5vdyB3ZSBrbm93IGl0IGNhbiBiZSBkb25lIHdpdGggInJlYWxfYml0cyIKKyAgICAgICAgICAgICAqICBhbmQgbWF5YmUgd2UgY2FuIHNraXAgc29tZSBpdGVyYXRpb25zCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlYWxfYml0cyA9IGNvZF9pbmZvLT5wYXJ0Ml8zX2xlbmd0aDsKKworICAgICAgICAgICAgLyogIHN0b3JlIGJlc3QgcXVhbnRpemF0aW9uIHNvIGZhcgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBic3RfY29kX2luZm8gPSAqY29kX2luZm87CisgICAgICAgICAgICBtZW1jcHkoYnN0X3hycG93LCB4cnBvdywgc2l6ZW9mKEZMT0FUKSAqIDU3Nik7CisKKyAgICAgICAgICAgIC8qICB0cnkgd2l0aCBmZXdlciBiaXRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1heF9iaXRzID0gcmVhbF9iaXRzIC0gMzI7CisgICAgICAgICAgICBkYml0cyA9IG1heF9iaXRzIC0gbWluX2JpdHM7CisgICAgICAgICAgICB0aGlzX2JpdHMgPSAobWF4X2JpdHMgKyBtaW5fYml0cykgLyAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogIHRyeSB3aXRoIG1vcmUgYml0cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBtaW5fYml0cyA9IHRoaXNfYml0cyArIDMyOworICAgICAgICAgICAgZGJpdHMgPSBtYXhfYml0cyAtIG1pbl9iaXRzOworICAgICAgICAgICAgdGhpc19iaXRzID0gKG1heF9iaXRzICsgbWluX2JpdHMpIC8gMjsKKworICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAyOworICAgICAgICAgICAgICAgIC8qICBzdGFydCBhZ2FpbiB3aXRoIGJlc3QgcXVhbnRpemF0aW9uIHNvIGZhcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICpjb2RfaW5mbyA9IGJzdF9jb2RfaW5mbzsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeHJwb3csIGJzdF94cnBvdywgc2l6ZW9mKEZMT0FUKSAqIDU3Nik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChkYml0cyA+IDEyKTsKKworICAgIGdmYy0+c2ZiMjFfZXh0cmEgPSBzZmIyMV9leHRyYTsKKworICAgIC8qICBmb3VuZD0wID0+IG5vdGhpbmcgZm91bmQsIHVzZSBsYXN0IG9uZQorICAgICAqICBmb3VuZD0xID0+IHdlIGp1c3QgZm91bmQgdGhlIGJlc3QgYW5kIGxlZnQgdGhlIGxvb3AKKyAgICAgKiAgZm91bmQ9MiA9PiB3ZSByZXN0b3JlZCBhIGdvb2Qgb25lIGFuZCBoYXZlIG5vdyBsM19lbmMgdG8gcmVzdG9yZSB0b28KKyAgICAgKi8KKyAgICBpZiAoZm91bmQgPT0gMikgeworICAgICAgICBtZW1jcHkoY29kX2luZm8tPmwzX2VuYywgYnN0X2NvZF9pbmZvLmwzX2VuYywgc2l6ZW9mKGludCkgKiA1NzYpOworICAgIH0KKyAgICBhc3NlcnQoY29kX2luZm8tPnBhcnQyXzNfbGVuZ3RoIDw9IE1heF9iaXRzKTsKKworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgZ2V0X2ZyYW1lYml0cygpCisgKgorICogIFJvYmVydCBIZWdlbWFubiAyMDAwLTA5LTA1CisgKgorICogIGNhbGN1bGF0ZXMKKyAqICAqIGhvdyBtYW55IGJpdHMgYXJlIGF2YWlsYWJsZSBmb3IgYW5hbG9nIHNpbGVudCBncmFudWxlcworICogICogaG93IG1hbnkgYml0cyB0byB1c2UgZm9yIHRoZSBsb3dlc3QgYWxsb3dlZCBiaXRyYXRlCisgKiAgKiBob3cgbWFueSBiaXRzIGVhY2ggYml0cmF0ZSB3b3VsZCBwcm92aWRlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2dldF9mcmFtZWJpdHMobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgaW50IGZyYW1lQml0c1sxNV0pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGJpdHNQZXJGcmFtZSwgaTsKKworICAgIC8qICBhbHdheXMgdXNlIGF0IGxlYXN0IHRoaXMgbWFueSBiaXRzIHBlciBncmFudWxlIHBlciBjaGFubmVsCisgICAgICogIHVubGVzcyB3ZSBkZXRlY3QgYW5hbG9nIHNpbGVuY2UsIHNlZSBiZWxvdworICAgICAqLworICAgIGdmYy0+Yml0cmF0ZV9pbmRleCA9IGdmYy0+VkJSX21pbl9iaXRyYXRlOworICAgIGJpdHNQZXJGcmFtZSA9IGdldGZyYW1lYml0cyhnZnApOworCisgICAgLyogIGJpdHMgZm9yIGFuYWxvZyBzaWxlbmNlCisgICAgICovCisgICAgZ2ZjLT5iaXRyYXRlX2luZGV4ID0gMTsKKyAgICBiaXRzUGVyRnJhbWUgPSBnZXRmcmFtZWJpdHMoZ2ZwKTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gZ2ZjLT5WQlJfbWF4X2JpdHJhdGU7IGkrKykgeworICAgICAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSBpOworICAgICAgICBmcmFtZUJpdHNbaV0gPSBSZXN2RnJhbWVCZWdpbihnZnAsICZiaXRzUGVyRnJhbWUpOworICAgIH0KK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIFZCUl9wcmVwYXJlKCkKKyAqCisgKiAgMjAwMC0wOS0wNCBSb2JlcnQgSGVnZW1hbm4KKyAqCisgKiAgKiBjb252ZXJ0cyBMUiB0byBNUyBjb2Rpbmcgd2hlbiBuZWNlc3NhcnkKKyAqICAqIGNhbGN1bGF0ZXMgYWxsb3dlZC9hZGp1c3RlZCBxdWFudGl6YXRpb24gbm9pc2UgYW1vdW50cworICogICogZGV0ZWN0cyBhbmFsb2cgc2lsZW50IGZyYW1lcworICoKKyAqICBzb21lIHJlbWFya3M6CisgKiAgLSBsb3dlciBtYXNraW5nIGRlcGVuZGluZyBvbiBRdWFsaXR5IHNldHRpbmcKKyAqICAtIHF1YWxpdHkgY29udHJvbCB0b2dldGhlciB3aXRoIGFkanVzdGVkIEFUSCBNRENUIHNjYWxpbmcKKyAqICAgIG9uIGxvd2VyIHF1YWxpdHkgc2V0dGluZyBhbGxvY2F0ZSBtb3JlIG5vaXNlIGZyb20KKyAqICAgIEFUSCBtYXNraW5nLCBhbmQgb24gaGlnaGVyIHF1YWxpdHkgc2V0dGluZyBhbGxvY2F0ZQorICogICAgbGVzcyBub2lzZSBmcm9tIEFUSCBtYXNraW5nLgorICogIC0gZXhwZXJpbWVudHMgc2hvdyB0aGF0IGdvaW5nIG1vcmUgdGhhbiAyZEIgb3ZlciBHUFNZQ0hPJ3MKKyAqICAgIGxpbWl0cyBlbmRzIHVwIGluIHZlcnkgYW5ub3lpbmcgYXJ0ZWZhY3RzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkg6IHRoaXMgb25lIG5lZWRzIHRvIGJlIG92ZXJoYXVsZWQgc29tZXRpbWUgKi8KKworc3RhdGljIGludAorVkJSX29sZF9wcmVwYXJlKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsCisgICAgICAgICAgICAgICAgRkxPQVQgcGVbMl1bMl0sIEZMT0FUIGNvbnN0IG1zX2VuZXJfcmF0aW9bMl0sCisgICAgICAgICAgICAgICAgSUlJX3BzeV9yYXRpbyByYXRpb1syXVsyXSwKKyAgICAgICAgICAgICAgICBGTE9BVCBsM194bWluWzJdWzJdW1NGQk1BWF0sCisgICAgICAgICAgICAgICAgaW50IGZyYW1lQml0c1sxNl0sIGludCBtaW5fYml0c1syXVsyXSwgaW50IG1heF9iaXRzWzJdWzJdLCBpbnQgYmFuZHNbMl1bMl0pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKworCisgICAgRkxPQVQgICBtYXNraW5nX2xvd2VyX2RiLCBhZGp1c3QgPSAwLjA7CisgICAgaW50ICAgICBnciwgY2g7CisgICAgaW50ICAgICBhbmFsb2dfc2lsZW5jZSA9IDE7CisgICAgaW50ICAgICBhdmcsIG14YiwgYml0cyA9IDA7CisKKyAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSBnZmMtPlZCUl9tYXhfYml0cmF0ZTsKKyAgICBhdmcgPSBSZXN2RnJhbWVCZWdpbihnZnAsICZhdmcpIC8gZ2ZjLT5tb2RlX2dyOworCisgICAgZ2V0X2ZyYW1lYml0cyhnZnAsIGZyYW1lQml0cyk7CisKKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgbXhiID0gb25fcGUoZ2ZwLCBwZSwgbWF4X2JpdHNbZ3JdLCBhdmcsIGdyLCAwKTsKKyAgICAgICAgaWYgKGdmYy0+bW9kZV9leHQgPT0gTVBHX01EX01TX0xSKSB7CisgICAgICAgICAgICBtc19jb252ZXJ0KCZnZmMtPmwzX3NpZGUsIGdyKTsKKyAgICAgICAgICAgIHJlZHVjZV9zaWRlKG1heF9iaXRzW2dyXSwgbXNfZW5lcl9yYXRpb1tncl0sIGF2ZywgbXhiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgKytjaCkgeworICAgICAgICAgICAgZ3JfaW5mbyAqY29uc3QgY29kX2luZm8gPSAmZ2ZjLT5sM19zaWRlLnR0W2dyXVtjaF07CisKKyAgICAgICAgICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFKSB7IC8qIE5PUk0sIFNUQVJUIG9yIFNUT1AgdHlwZSAqLworICAgICAgICAgICAgICAgIGFkanVzdCA9IDEuMjggLyAoMSArIGV4cCgzLjUgLSBwZVtncl1bY2hdIC8gMzAwLikpIC0gMC4wNTsKKyAgICAgICAgICAgICAgICBtYXNraW5nX2xvd2VyX2RiID0gZ2ZjLT5QU1ktPm1hc2tfYWRqdXN0IC0gYWRqdXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ID0gMi41NiAvICgxICsgZXhwKDMuNSAtIHBlW2dyXVtjaF0gLyAzMDAuKSkgLSAwLjE0OworICAgICAgICAgICAgICAgIG1hc2tpbmdfbG93ZXJfZGIgPSBnZmMtPlBTWS0+bWFza19hZGp1c3Rfc2hvcnQgLSBhZGp1c3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZmMtPm1hc2tpbmdfbG93ZXIgPSBwb3coMTAuMCwgbWFza2luZ19sb3dlcl9kYiAqIDAuMSk7CisKKyAgICAgICAgICAgIGluaXRfb3V0ZXJfbG9vcChnZmMsIGNvZF9pbmZvKTsKKyAgICAgICAgICAgIGJhbmRzW2dyXVtjaF0gPSBjYWxjX3htaW4oZ2ZwLCAmcmF0aW9bZ3JdW2NoXSwgY29kX2luZm8sIGwzX3htaW5bZ3JdW2NoXSk7CisgICAgICAgICAgICBpZiAoYmFuZHNbZ3JdW2NoXSkKKyAgICAgICAgICAgICAgICBhbmFsb2dfc2lsZW5jZSA9IDA7CisKKyAgICAgICAgICAgIG1pbl9iaXRzW2dyXVtjaF0gPSAxMjY7CisKKyAgICAgICAgICAgIGJpdHMgKz0gbWF4X2JpdHNbZ3JdW2NoXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLT5jaGFubmVsc19vdXQ7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChiaXRzID4gZnJhbWVCaXRzW2dmYy0+VkJSX21heF9iaXRyYXRlXSkgeworICAgICAgICAgICAgICAgIG1heF9iaXRzW2dyXVtjaF0gKj0gZnJhbWVCaXRzW2dmYy0+VkJSX21heF9iaXRyYXRlXTsKKyAgICAgICAgICAgICAgICBtYXhfYml0c1tncl1bY2hdIC89IGJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWluX2JpdHNbZ3JdW2NoXSA+IG1heF9iaXRzW2dyXVtjaF0pCisgICAgICAgICAgICAgICAgbWluX2JpdHNbZ3JdW2NoXSA9IG1heF9iaXRzW2dyXVtjaF07CisKKyAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciBjaCAqLworICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yIGdyICovCisKKyAgICByZXR1cm4gYW5hbG9nX3NpbGVuY2U7Cit9CisKK3N0YXRpYyB2b2lkCitiaXRwcmVzc3VyZV9zdHJhdGVneShsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMsCisgICAgICAgICAgICAgICAgICAgICBGTE9BVCBsM194bWluWzJdWzJdW1NGQk1BWF0sIGludCBtaW5fYml0c1syXVsyXSwgaW50IG1heF9iaXRzWzJdWzJdKQoreworICAgIGludCAgICAgZ3IsIGNoLCBzZmI7CisgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICBncl9pbmZvIGNvbnN0ICpjb25zdCBnaSA9ICZnZmMtPmwzX3NpZGUudHRbZ3JdW2NoXTsKKyAgICAgICAgICAgIEZMT0FUICAqcHhtaW4gPSBsM194bWluW2dyXVtjaF07CisgICAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IGdpLT5wc3lfbG1heDsgc2ZiKyspCisgICAgICAgICAgICAgICAgKnB4bWluKysgKj0gMS4gKyAuMDI5ICogc2ZiICogc2ZiIC8gU0JNQVhfbCAvIFNCTUFYX2w7CisKKyAgICAgICAgICAgIGlmIChnaS0+YmxvY2tfdHlwZSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgICAgICAgICAgZm9yIChzZmIgPSBnaS0+c2ZiX3NtaW47IHNmYiA8IFNCTUFYX3M7IHNmYisrKSB7CisgICAgICAgICAgICAgICAgICAgICpweG1pbisrICo9IDEuICsgLjAyOSAqIHNmYiAqIHNmYiAvIFNCTUFYX3MgLyBTQk1BWF9zOworICAgICAgICAgICAgICAgICAgICAqcHhtaW4rKyAqPSAxLiArIC4wMjkgKiBzZmIgKiBzZmIgLyBTQk1BWF9zIC8gU0JNQVhfczsKKyAgICAgICAgICAgICAgICAgICAgKnB4bWluKysgKj0gMS4gKyAuMDI5ICogc2ZiICogc2ZiIC8gU0JNQVhfcyAvIFNCTUFYX3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4X2JpdHNbZ3JdW2NoXSA9IE1heChtaW5fYml0c1tncl1bY2hdLCAwLjkgKiBtYXhfYml0c1tncl1bY2hdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgVkJSX2l0ZXJhdGlvbl9sb29wKCkKKyAqCisgKiAgdHJpZXMgdG8gZmluZCBvdXQgaG93IG1hbnkgYml0cyBhcmUgbmVlZGVkIGZvciBlYWNoIGdyYW51bGUgYW5kIGNoYW5uZWwKKyAqICB0byBnZXQgYW4gYWNjZXB0YWJsZSBxdWFudGl6YXRpb24uIEFuIGFwcHJvcHJpYXRlIGJpdHJhdGUgd2lsbCB0aGVuIGJlCisgKiAgY2hvb3NlZCBmb3IgcXVhbnRpemF0aW9uLiAgcmggOC85OQorICoKKyAqICBSb2JlcnQgSGVnZW1hbm4gMjAwMC0wOS0wNiByZXdyaXRlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorVkJSX29sZF9pdGVyYXRpb25fbG9vcChsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBGTE9BVCBwZVsyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgbXNfZW5lcl9yYXRpb1syXSwgSUlJX3BzeV9yYXRpbyByYXRpb1syXVsyXSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIEZMT0FUICAgbDNfeG1pblsyXVsyXVtTRkJNQVhdOworCisgICAgRkxPQVQgICB4cnBvd1s1NzZdOworICAgIGludCAgICAgYmFuZHNbMl1bMl07CisgICAgaW50ICAgICBmcmFtZUJpdHNbMTVdOworICAgIGludCAgICAgdXNlZF9iaXRzOworICAgIGludCAgICAgYml0czsKKyAgICBpbnQgICAgIG1pbl9iaXRzWzJdWzJdLCBtYXhfYml0c1syXVsyXTsKKyAgICBpbnQgICAgIG1lYW5fYml0czsKKyAgICBpbnQgICAgIGNoLCBnciwgYW5hbG9nX3NpbGVuY2U7CisgICAgSUlJX3NpZGVfaW5mb190ICpjb25zdCBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKworICAgIGFuYWxvZ19zaWxlbmNlID0gVkJSX29sZF9wcmVwYXJlKGdmcCwgcGUsIG1zX2VuZXJfcmF0aW8sIHJhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwzX3htaW4sIGZyYW1lQml0cywgbWluX2JpdHMsIG1heF9iaXRzLCBiYW5kcyk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgZm9yICg7OykgeworCisgICAgICAgIC8qICBxdWFudGl6ZSBncmFudWxlcyB3aXRoIGxvd2VzdCBwb3NzaWJsZSBudW1iZXIgb2YgYml0cworICAgICAgICAgKi8KKworICAgICAgICB1c2VkX2JpdHMgPSAwOworCisgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IGdmYy0+bW9kZV9ncjsgZ3IrKykgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLT5jaGFubmVsc19vdXQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIHJldDsKKyAgICAgICAgICAgICAgICBncl9pbmZvICpjb25zdCBjb2RfaW5mbyA9ICZsM19zaWRlLT50dFtncl1bY2hdOworCisgICAgICAgICAgICAgICAgLyogIGluaXRfb3V0ZXJfbG9vcCBzZXRzIHVwIGNvZF9pbmZvLCBzY2FsZWZhYyBhbmQgeHJwb3cKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXQgPSBpbml0X3hycG93KGdmYywgY29kX2luZm8sIHhycG93KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IDAgfHwgbWF4X2JpdHNbZ3JdW2NoXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qICB4ciBjb250YWlucyBubyBlbmVyZ3kKKyAgICAgICAgICAgICAgICAgICAgICogIGwzX2VuYywgb3VyIGVuY29kaW5nIGRhdGEsIHdpbGwgYmUgcXVhbnRpemVkIHRvIHplcm8KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB3aXRoIG5leHQgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFZCUl9lbmNvZGVfZ3JhbnVsZShnZnAsIGNvZF9pbmZvLCBsM194bWluW2dyXVtjaF0sIHhycG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwgbWluX2JpdHNbZ3JdW2NoXSwgbWF4X2JpdHNbZ3JdW2NoXSk7CisKKyAgICAgICAgICAgICAgICAvKiAgZG8gdGhlICdzdWJzdGVwIHNoYXBpbmcnCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGdmYy0+c3Vic3RlcF9zaGFwaW5nICYgMSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuY2F0ZV9zbWFsbHNwZWN0cnVtcyhnZmMsICZsM19zaWRlLT50dFtncl1bY2hdLCBsM194bWluW2dyXVtjaF0sIHhycG93KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXQgPSBjb2RfaW5mby0+cGFydDJfM19sZW5ndGggKyBjb2RfaW5mby0+cGFydDJfbGVuZ3RoOworICAgICAgICAgICAgICAgIHVzZWRfYml0cyArPSByZXQ7CisgICAgICAgICAgICB9ICAgICAgICAgICAvKiBmb3IgY2ggKi8KKyAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciBnciAqLworCisgICAgICAgIC8qICBmaW5kIGxvd2VzdCBiaXRyYXRlIGFibGUgdG8gaG9sZCB1c2VkIGJpdHMKKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmFsb2dfc2lsZW5jZSAmJiAhZ2ZwLT5WQlJfaGFyZF9taW4pCisgICAgICAgICAgICAvKiAgd2UgZGV0ZWN0ZWQgYW5hbG9nIHNpbGVuY2UgYW5kIHRoZSB1c2VyIGRpZCBub3Qgc3BlY2lmeQorICAgICAgICAgICAgICogIGFueSBoYXJkIGZyYW1lc2l6ZSBsaW1pdCwgc28gc3RhcnQgd2l0aCBzbWFsbGVzdCBwb3NzaWJsZSBmcmFtZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSBnZmMtPlZCUl9taW5fYml0cmF0ZTsKKworICAgICAgICBmb3IgKDsgZ2ZjLT5iaXRyYXRlX2luZGV4IDwgZ2ZjLT5WQlJfbWF4X2JpdHJhdGU7IGdmYy0+Yml0cmF0ZV9pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAodXNlZF9iaXRzIDw9IGZyYW1lQml0c1tnZmMtPmJpdHJhdGVfaW5kZXhdKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJpdHMgPSBSZXN2RnJhbWVCZWdpbihnZnAsICZtZWFuX2JpdHMpOworCisgICAgICAgIGlmICh1c2VkX2JpdHMgPD0gYml0cykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGJpdHByZXNzdXJlX3N0cmF0ZWd5KGdmYywgbDNfeG1pbiwgbWluX2JpdHMsIG1heF9iaXRzKTsKKworICAgIH0gICAgICAgICAgICAgICAgICAgLyogYnJlYWtzIGFkanVzdGVkICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLT5jaGFubmVsc19vdXQ7IGNoKyspIHsKKyAgICAgICAgICAgIGl0ZXJhdGlvbl9maW5pc2hfb25lKGdmYywgZ3IsIGNoKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciBjaCAqLworICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yIGdyICovCisgICAgUmVzdkZyYW1lRW5kKGdmYywgbWVhbl9iaXRzKTsKK30KKworCisKK3N0YXRpYyBpbnQKK1ZCUl9uZXdfcHJlcGFyZShsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLAorICAgICAgICAgICAgICAgIEZMT0FUIHBlWzJdWzJdLCBJSUlfcHN5X3JhdGlvIHJhdGlvWzJdWzJdLAorICAgICAgICAgICAgICAgIEZMT0FUIGwzX3htaW5bMl1bMl1bU0ZCTUFYXSwgaW50IGZyYW1lQml0c1sxNl0sIGludCBtYXhfYml0c1syXVsyXSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworCisgICAgaW50ICAgICBnciwgY2g7CisgICAgaW50ICAgICBhbmFsb2dfc2lsZW5jZSA9IDE7CisgICAgaW50ICAgICBhdmcsIGJpdHMgPSAwOworICAgIGludCAgICAgbWF4aW11bV9mcmFtZWJpdHM7CisKKyAgICBpZiAoIWdmcC0+ZnJlZV9mb3JtYXQpIHsKKyAgICAgICAgZ2ZjLT5iaXRyYXRlX2luZGV4ID0gZ2ZjLT5WQlJfbWF4X2JpdHJhdGU7CisgICAgICAgICh2b2lkKSBSZXN2RnJhbWVCZWdpbihnZnAsICZhdmcpOworCisgICAgICAgIGdldF9mcmFtZWJpdHMoZ2ZwLCBmcmFtZUJpdHMpOworICAgICAgICBtYXhpbXVtX2ZyYW1lYml0cyA9IGZyYW1lQml0c1tnZmMtPlZCUl9tYXhfYml0cmF0ZV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSAwOworICAgICAgICBtYXhpbXVtX2ZyYW1lYml0cyA9IFJlc3ZGcmFtZUJlZ2luKGdmcCwgJmF2Zyk7CisgICAgICAgIGZyYW1lQml0c1swXSA9IG1heGltdW1fZnJhbWViaXRzOworICAgIH0KKworICAgIGZvciAoZ3IgPSAwOyBnciA8IGdmYy0+bW9kZV9ncjsgZ3IrKykgeworICAgICAgICAodm9pZCkgb25fcGUoZ2ZwLCBwZSwgbWF4X2JpdHNbZ3JdLCBhdmcsIGdyLCAwKTsKKyAgICAgICAgaWYgKGdmYy0+bW9kZV9leHQgPT0gTVBHX01EX01TX0xSKSB7CisgICAgICAgICAgICBtc19jb252ZXJ0KCZnZmMtPmwzX3NpZGUsIGdyKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgKytjaCkgeworICAgICAgICAgICAgZ3JfaW5mbyAqY29uc3QgY29kX2luZm8gPSAmZ2ZjLT5sM19zaWRlLnR0W2dyXVtjaF07CisKKyAgICAgICAgICAgIGdmYy0+bWFza2luZ19sb3dlciA9IHBvdygxMC4wLCBnZmMtPlBTWS0+bWFza19hZGp1c3QgKiAwLjEpOworCisgICAgICAgICAgICBpbml0X291dGVyX2xvb3AoZ2ZjLCBjb2RfaW5mbyk7CisgICAgICAgICAgICBpZiAoMCAhPSBjYWxjX3htaW4oZ2ZwLCAmcmF0aW9bZ3JdW2NoXSwgY29kX2luZm8sIGwzX3htaW5bZ3JdW2NoXSkpCisgICAgICAgICAgICAgICAgYW5hbG9nX3NpbGVuY2UgPSAwOworCisgICAgICAgICAgICBiaXRzICs9IG1heF9iaXRzW2dyXVtjaF07CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICBpZiAoYml0cyA+IG1heGltdW1fZnJhbWViaXRzKSB7CisgICAgICAgICAgICAgICAgbWF4X2JpdHNbZ3JdW2NoXSAqPSBtYXhpbXVtX2ZyYW1lYml0czsKKyAgICAgICAgICAgICAgICBtYXhfYml0c1tncl1bY2hdIC89IGJpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciBjaCAqLworICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yIGdyICovCisKKyAgICByZXR1cm4gYW5hbG9nX3NpbGVuY2U7Cit9CisKKworI2lmIDAKK3N0YXRpYyBpbnQKK2dldEZyYW1lc2l6ZUluQnl0ZXNQZXJTZWNvbmQobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgaW50IGJpdHNfdXNlZCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCBjb25zdCB0bXAgPSAoZ2ZwLT52ZXJzaW9uID09IDApID8gNzIgOiAxNDQ7CisgICAgaW50IGNvbnN0IGJ5dGVzX3VzZWQgPSAoYml0c191c2VkICsgNykgLyA4OworICAgIGludCBjb25zdCBieXRlc19wZXJfc2Vjb25kID0KKyAgICAgICAgKGdmcC0+b3V0X3NhbXBsZXJhdGUgKiAoYnl0ZXNfdXNlZCArIGdmYy0+c2lkZWluZm9fbGVuKSArICh0bXAgLSAxKSkgLyB0bXA7CisgICAgcmV0dXJuIGJ5dGVzX3Blcl9zZWNvbmQ7Cit9CisKK3N0YXRpYyBpbnQKK2dldEZyYW1lc2l6ZV9rYnBzKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIGludCBiaXRzX3VzZWQpCit7CisgICAgaW50IGNvbnN0IGJ5dGVzX3Blcl9zZWNvbmQgPSBnZXRGcmFtZXNpemVJbkJ5dGVzUGVyU2Vjb25kKGdmcCwgYml0c191c2VkKTsKKyAgICBpbnQgY29uc3Qga2JwcyA9IChieXRlc19wZXJfc2Vjb25kICsgOTk5KSAvIDEwMDA7CisgICAgcmV0dXJuIGticHM7Cit9CisjZW5kaWYKKworCit2b2lkCitWQlJfbmV3X2l0ZXJhdGlvbl9sb29wKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIEZMT0FUIHBlWzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCBtc19lbmVyX3JhdGlvWzJdLCBJSUlfcHN5X3JhdGlvIHJhdGlvWzJdWzJdKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgRkxPQVQgICBsM194bWluWzJdWzJdW1NGQk1BWF07CisKKyAgICBGTE9BVCAgIHhycG93WzJdWzJdWzU3Nl07CisgICAgaW50ICAgICBmcmFtZUJpdHNbMTVdOworICAgIGludCAgICAgdXNlZF9iaXRzOworICAgIGludCAgICAgbWF4X2JpdHNbMl1bMl07CisgICAgaW50ICAgICBjaCwgZ3IsIGFuYWxvZ19zaWxlbmNlOworICAgIElJSV9zaWRlX2luZm9fdCAqY29uc3QgbDNfc2lkZSA9ICZnZmMtPmwzX3NpZGU7CisKKyAgICAodm9pZCkgbXNfZW5lcl9yYXRpbzsgLyogbm90IHVzZWQgKi8KKworICAgIGFuYWxvZ19zaWxlbmNlID0gVkJSX25ld19wcmVwYXJlKGdmcCwgcGUsIHJhdGlvLCBsM194bWluLCBmcmFtZUJpdHMsIG1heF9iaXRzKTsKKworICAgIGZvciAoZ3IgPSAwOyBnciA8IGdmYy0+bW9kZV9ncjsgZ3IrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgZ3JfaW5mbyAqY29uc3QgY29kX2luZm8gPSAmbDNfc2lkZS0+dHRbZ3JdW2NoXTsKKworICAgICAgICAgICAgLyogIGluaXRfb3V0ZXJfbG9vcCBzZXRzIHVwIGNvZF9pbmZvLCBzY2FsZWZhYyBhbmQgeHJwb3cKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKDAgPT0gaW5pdF94cnBvdyhnZmMsIGNvZF9pbmZvLCB4cnBvd1tncl1bY2hdKSkgeworICAgICAgICAgICAgICAgIG1heF9iaXRzW2dyXVtjaF0gPSAwOyAvKiBzaWxlbnQgZ3JhbnVsZSBuZWVkcyBubyBiaXRzICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgY2ggKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciBnciAqLworCisgICAgLyogIHF1YW50aXplIGdyYW51bGVzIHdpdGggbG93ZXN0IHBvc3NpYmxlIG51bWJlciBvZiBiaXRzCisgICAgICovCisKKyAgICB1c2VkX2JpdHMgPSBWQlJfZW5jb2RlX2ZyYW1lKGdmYywgeHJwb3csIGwzX3htaW4sIG1heF9iaXRzKTsKKworICAgIGlmICghZ2ZwLT5mcmVlX2Zvcm1hdCkgeworICAgICAgICAvKiAgZmluZCBsb3dlc3QgYml0cmF0ZSBhYmxlIHRvIGhvbGQgdXNlZCBiaXRzCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5hbG9nX3NpbGVuY2UgJiYgIWdmcC0+VkJSX2hhcmRfbWluKSB7CisgICAgICAgICAgICAvKiAgd2UgZGV0ZWN0ZWQgYW5hbG9nIHNpbGVuY2UgYW5kIHRoZSB1c2VyIGRpZCBub3Qgc3BlY2lmeQorICAgICAgICAgICAgICogIGFueSBoYXJkIGZyYW1lc2l6ZSBsaW1pdCwgc28gc3RhcnQgd2l0aCBzbWFsbGVzdCBwb3NzaWJsZSBmcmFtZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ2ZjLT5iaXRyYXRlX2luZGV4ID0gZ2ZjLT5WQlJfbWluX2JpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgZ2ZjLT5iaXRyYXRlX2luZGV4IDwgZ2ZjLT5WQlJfbWF4X2JpdHJhdGU7IGdmYy0+Yml0cmF0ZV9pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAodXNlZF9iaXRzIDw9IGZyYW1lQml0c1tnZmMtPmJpdHJhdGVfaW5kZXhdKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChnZmMtPmJpdHJhdGVfaW5kZXggPiBnZmMtPlZCUl9tYXhfYml0cmF0ZSkgeworICAgICAgICAgICAgZ2ZjLT5iaXRyYXRlX2luZGV4ID0gZ2ZjLT5WQlJfbWF4X2JpdHJhdGU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisjaWYgMAorICAgICAgICBzdGF0aWMgaW50IG1tbSA9IDA7CisgICAgICAgIGludCAgICAgZmZmID0gZ2V0RnJhbWVzaXplX2ticHMoZ2ZwLCB1c2VkX2JpdHMpOworICAgICAgICBpbnQgICAgIGhoaCA9IGdldEZyYW1lc2l6ZV9rYnBzKGdmcCwgTUFYX0JJVFNfUEVSX0dSQU5VTEUgKiBnZmMtPm1vZGVfZ3IpOworICAgICAgICBpZiAobW1tIDwgZmZmKQorICAgICAgICAgICAgbW1tID0gZmZmOworICAgICAgICBwcmludGYoImRlbWFuZD0lM2Qga2JwcyAgbWF4PSUzZCBrYnBzICAgbGltaXQ9JTNkIGticHNcbiIsIGZmZiwgbW1tLCBoaGgpOworI2VuZGlmCisgICAgICAgIGdmYy0+Yml0cmF0ZV9pbmRleCA9IDA7CisgICAgfQorICAgIGlmICh1c2VkX2JpdHMgPD0gZnJhbWVCaXRzW2dmYy0+Yml0cmF0ZV9pbmRleF0pIHsKKyAgICAgICAgLyogdXBkYXRlIFJlc2Vydm9pcmUgc3RhdHVzICovCisgICAgICAgIGludCAgICAgbWVhbl9iaXRzLCBmdWxsZnJhbWViaXRzOworICAgICAgICBmdWxsZnJhbWViaXRzID0gUmVzdkZyYW1lQmVnaW4oZ2ZwLCAmbWVhbl9iaXRzKTsKKyAgICAgICAgYXNzZXJ0KHVzZWRfYml0cyA8PSBmdWxsZnJhbWViaXRzKTsKKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgICAgIGdyX2luZm8gY29uc3QgKmNvbnN0IGNvZF9pbmZvID0gJmwzX3NpZGUtPnR0W2dyXVtjaF07CisgICAgICAgICAgICAgICAgUmVzdkFkanVzdChnZmMsIGNvZF9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSZXN2RnJhbWVFbmQoZ2ZjLCBtZWFuX2JpdHMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogU0hPVUxEIE5PVCBIQVBQRU4gSU5URVJOQUwgRVJST1IKKyAgICAgICAgICovCisgICAgICAgIEVSUk9SRihnZmMsICJJTlRFUk5BTCBFUlJPUiBJTiBWQlIgTkVXIENPREUsIHBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRcbiIpOworICAgICAgICBleGl0KC0xKTsKKyAgICB9Cit9CisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGNhbGNfdGFyZ2V0X2JpdHMoKQorICoKKyAqICBjYWxjdWxhdGVzIHRhcmdldCBiaXRzIGZvciBBQlIgZW5jb2RpbmcKKyAqCisgKiAgbXQgMjAwMC8wNS8zMQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2NhbGNfdGFyZ2V0X2JpdHMobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwKKyAgICAgICAgICAgICAgICAgRkxPQVQgcGVbMl1bMl0sCisgICAgICAgICAgICAgICAgIEZMT0FUIGNvbnN0IG1zX2VuZXJfcmF0aW9bMl0sCisgICAgICAgICAgICAgICAgIGludCB0YXJnX2JpdHNbMl1bMl0sIGludCAqYW5hbG9nX3NpbGVuY2VfYml0cywgaW50ICptYXhfZnJhbWVfYml0cykKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIElJSV9zaWRlX2luZm9fdCBjb25zdCAqY29uc3QgbDNfc2lkZSA9ICZnZmMtPmwzX3NpZGU7CisgICAgRkxPQVQgICByZXNfZmFjdG9yOworICAgIGludCAgICAgZ3IsIGNoLCB0b3RiaXRzLCBtZWFuX2JpdHM7CisKKyAgICBnZmMtPmJpdHJhdGVfaW5kZXggPSBnZmMtPlZCUl9tYXhfYml0cmF0ZTsKKyAgICAqbWF4X2ZyYW1lX2JpdHMgPSBSZXN2RnJhbWVCZWdpbihnZnAsICZtZWFuX2JpdHMpOworCisgICAgZ2ZjLT5iaXRyYXRlX2luZGV4ID0gMTsKKyAgICBtZWFuX2JpdHMgPSBnZXRmcmFtZWJpdHMoZ2ZwKSAtIGdmYy0+c2lkZWluZm9fbGVuICogODsKKyAgICAqYW5hbG9nX3NpbGVuY2VfYml0cyA9IG1lYW5fYml0cyAvIChnZmMtPm1vZGVfZ3IgKiBnZmMtPmNoYW5uZWxzX291dCk7CisKKyAgICBtZWFuX2JpdHMgPSBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwcyAqIGdmcC0+ZnJhbWVzaXplICogMTAwMDsKKyAgICBpZiAoZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgJiAxKQorICAgICAgICBtZWFuX2JpdHMgKj0gMS4wOTsKKyAgICBtZWFuX2JpdHMgLz0gZ2ZwLT5vdXRfc2FtcGxlcmF0ZTsKKyAgICBtZWFuX2JpdHMgLT0gZ2ZjLT5zaWRlaW5mb19sZW4gKiA4OworICAgIG1lYW5fYml0cyAvPSAoZ2ZjLT5tb2RlX2dyICogZ2ZjLT5jaGFubmVsc19vdXQpOworCisgICAgLyoKKyAgICAgICByZXNfZmFjdG9yIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZSB0aGF0IHNob3VsZAorICAgICAgIGJlIHVzZWQgb24gYXZlcmFnZS4gIHRoZSByZW1haW5pbmcgYml0cyBhcmUgYWRkZWQgdG8gdGhlCisgICAgICAgYml0cmVzZXJ2b2lyIGFuZCB1c2VkIGZvciBkaWZmaWN1bHQgdG8gZW5jb2RlIGZyYW1lcy4KKworICAgICAgIFNpbmNlIHdlIGFyZSB0cmFja2luZyB0aGUgYXZlcmFnZSBiaXRyYXRlLCB3ZSBzaG91bGQgYWRqdXN0CisgICAgICAgcmVzX2ZhY3RvciAib24gdGhlIGZseSIsIGluY3JlYXNpbmcgaXQgaWYgdGhlIGF2ZXJhZ2UgYml0cmF0ZQorICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGJpdHJhdGUsIGFuZCBkZWNyZWFzaW5nIGl0CisgICAgICAgb3RoZXJ3aXNlLiAgUmVhc29uYWJsZSByYW5nZXMgYXJlIGZyb20gLjkgdG8gMS4wCisKKyAgICAgICBVbnRpbCB3ZSBnZXQgdGhlIGFib3ZlIHN1Z2dlc3Rpb24gd29ya2luZywgd2UgdXNlIHRoZSBmb2xsb3dpbmcKKyAgICAgICB0dW5pbmc6CisgICAgICAgY29tcHJlc3Npb24gcmF0aW8gICAgcmVzX2ZhY3RvcgorICAgICAgIDUuNSAgKDI1NmticHMpICAgICAgICAgMS4wICAgICAgbm8gbmVlZCBmb3IgYml0cmVzZXJ2b2lyCisgICAgICAgMTEgICAoMTI4a2JwcykgICAgICAgICAuOTMgICAgICA3JSBoZWxkIGZvciByZXNlcnZvaXIKKworICAgICAgIHdpdGggbGluZWFyIGludGVycG9sYXRpb24gZm9yIG90aGVyIHZhbHVlcy4KKworICAgICAqLworICAgIHJlc19mYWN0b3IgPSAuOTMgKyAuMDcgKiAoMTEuMCAtIGdmcC0+Y29tcHJlc3Npb25fcmF0aW8pIC8gKDExLjAgLSA1LjUpOworICAgIGlmIChyZXNfZmFjdG9yIDwgLjkwKQorICAgICAgICByZXNfZmFjdG9yID0gLjkwOworICAgIGlmIChyZXNfZmFjdG9yID4gMS4wMCkKKyAgICAgICAgcmVzX2ZhY3RvciA9IDEuMDA7CisKKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKyAgICAgICAgaW50ICAgICBzdW0gPSAwOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgdGFyZ19iaXRzW2dyXVtjaF0gPSByZXNfZmFjdG9yICogbWVhbl9iaXRzOworCisgICAgICAgICAgICBpZiAocGVbZ3JdW2NoXSA+IDcwMCkgeworICAgICAgICAgICAgICAgIGludCAgICAgYWRkX2JpdHMgPSAocGVbZ3JdW2NoXSAtIDcwMCkgLyAxLjQ7CisKKyAgICAgICAgICAgICAgICBncl9pbmZvIGNvbnN0ICpjb25zdCBjb2RfaW5mbyA9ICZsM19zaWRlLT50dFtncl1bY2hdOworICAgICAgICAgICAgICAgIHRhcmdfYml0c1tncl1bY2hdID0gcmVzX2ZhY3RvciAqIG1lYW5fYml0czsKKworICAgICAgICAgICAgICAgIC8qIHNob3J0IGJsb2NrcyB1c2UgYSBsaXR0bGUgZXh0cmEsIG5vIG1hdHRlciB3aGF0IHRoZSBwZSAqLworICAgICAgICAgICAgICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZGRfYml0cyA8IG1lYW5fYml0cyAvIDIpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfYml0cyA9IG1lYW5fYml0cyAvIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGF0IG1vc3QgaW5jcmVhc2UgYml0cyBieSAxLjUqYXZlcmFnZSAqLworICAgICAgICAgICAgICAgIGlmIChhZGRfYml0cyA+IG1lYW5fYml0cyAqIDMgLyAyKQorICAgICAgICAgICAgICAgICAgICBhZGRfYml0cyA9IG1lYW5fYml0cyAqIDMgLyAyOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZF9iaXRzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYWRkX2JpdHMgPSAwOworCisgICAgICAgICAgICAgICAgdGFyZ19iaXRzW2dyXVtjaF0gKz0gYWRkX2JpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGFyZ19iaXRzW2dyXVtjaF0gPiBNQVhfQklUU19QRVJfQ0hBTk5FTCkgeworICAgICAgICAgICAgICAgIHRhcmdfYml0c1tncl1bY2hdID0gTUFYX0JJVFNfUEVSX0NIQU5ORUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW0gKz0gdGFyZ19iaXRzW2dyXVtjaF07CisgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgY2ggKi8KKyAgICAgICAgaWYgKHN1bSA+IE1BWF9CSVRTX1BFUl9HUkFOVUxFKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgKytjaCkgeworICAgICAgICAgICAgICAgIHRhcmdfYml0c1tncl1bY2hdICo9IE1BWF9CSVRTX1BFUl9HUkFOVUxFOworICAgICAgICAgICAgICAgIHRhcmdfYml0c1tncl1bY2hdIC89IHN1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yIGdyICovCisKKyAgICBpZiAoZ2ZjLT5tb2RlX2V4dCA9PSBNUEdfTURfTVNfTFIpCisgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IGdmYy0+bW9kZV9ncjsgZ3IrKykgeworICAgICAgICAgICAgcmVkdWNlX3NpZGUodGFyZ19iaXRzW2dyXSwgbXNfZW5lcl9yYXRpb1tncl0sIG1lYW5fYml0cyAqIGdmYy0+Y2hhbm5lbHNfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0JJVFNfUEVSX0dSQU5VTEUpOworICAgICAgICB9CisKKyAgICAvKiAgc3VtIHRhcmdldCBiaXRzCisgICAgICovCisgICAgdG90Yml0cyA9IDA7CisgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICBpZiAodGFyZ19iaXRzW2dyXVtjaF0gPiBNQVhfQklUU19QRVJfQ0hBTk5FTCkKKyAgICAgICAgICAgICAgICB0YXJnX2JpdHNbZ3JdW2NoXSA9IE1BWF9CSVRTX1BFUl9DSEFOTkVMOworICAgICAgICAgICAgdG90Yml0cyArPSB0YXJnX2JpdHNbZ3JdW2NoXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICByZXBhcnRpb24gdGFyZ2V0IGJpdHMgaWYgbmVlZGVkCisgICAgICovCisgICAgaWYgKHRvdGJpdHMgPiAqbWF4X2ZyYW1lX2JpdHMpIHsKKyAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgY2grKykgeworICAgICAgICAgICAgICAgIHRhcmdfYml0c1tncl1bY2hdICo9ICptYXhfZnJhbWVfYml0czsKKyAgICAgICAgICAgICAgICB0YXJnX2JpdHNbZ3JdW2NoXSAvPSB0b3RiaXRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEFCUl9pdGVyYXRpb25fbG9vcCgpCisgKgorICogIGVuY29kZSBhIGZyYW1lIHdpdGggYSBkaXNpcmVkIGF2ZXJhZ2UgYml0cmF0ZQorICoKKyAqICBtdCAyMDAwLzA1LzMxCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitBQlJfaXRlcmF0aW9uX2xvb3AobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgRkxPQVQgcGVbMl1bMl0sCisgICAgICAgICAgICAgICAgICAgRkxPQVQgbXNfZW5lcl9yYXRpb1syXSwgSUlJX3BzeV9yYXRpbyByYXRpb1syXVsyXSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIEZMT0FUICAgbDNfeG1pbltTRkJNQVhdOworICAgIEZMT0FUICAgeHJwb3dbNTc2XTsKKyAgICBpbnQgICAgIHRhcmdfYml0c1syXVsyXTsKKyAgICBpbnQgICAgIG1lYW5fYml0cywgbWF4X2ZyYW1lX2JpdHM7CisgICAgaW50ICAgICBjaCwgZ3IsIGF0aF9vdmVyOworICAgIGludCAgICAgYW5hbG9nX3NpbGVuY2VfYml0czsKKyAgICBncl9pbmZvICpjb2RfaW5mbzsKKyAgICBJSUlfc2lkZV9pbmZvX3QgKmNvbnN0IGwzX3NpZGUgPSAmZ2ZjLT5sM19zaWRlOworCisgICAgbWVhbl9iaXRzID0gMDsKKworICAgIGNhbGNfdGFyZ2V0X2JpdHMoZ2ZwLCBwZSwgbXNfZW5lcl9yYXRpbywgdGFyZ19iaXRzLCAmYW5hbG9nX3NpbGVuY2VfYml0cywgJm1heF9mcmFtZV9iaXRzKTsKKworICAgIC8qICBlbmNvZGUgZ3JhbnVsZXMKKyAgICAgKi8KKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKworICAgICAgICBpZiAoZ2ZjLT5tb2RlX2V4dCA9PSBNUEdfTURfTVNfTFIpIHsKKyAgICAgICAgICAgIG1zX2NvbnZlcnQoJmdmYy0+bDNfc2lkZSwgZ3IpOworICAgICAgICB9CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICBGTE9BVCAgIGFkanVzdCwgbWFza2luZ19sb3dlcl9kYjsKKyAgICAgICAgICAgIGNvZF9pbmZvID0gJmwzX3NpZGUtPnR0W2dyXVtjaF07CisKKyAgICAgICAgICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFKSB7IC8qIE5PUk0sIFNUQVJUIG9yIFNUT1AgdHlwZSAqLworICAgICAgICAgICAgICAgIC8qIGFkanVzdCA9IDEuMjgvKDErZXhwKDMuNS1wZVtncl1bY2hdLzMwMC4pKS0wLjA1OyAqLworICAgICAgICAgICAgICAgIGFkanVzdCA9IDA7CisgICAgICAgICAgICAgICAgbWFza2luZ19sb3dlcl9kYiA9IGdmYy0+UFNZLT5tYXNrX2FkanVzdCAtIGFkanVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGFkanVzdCA9IDIuNTYvKDErZXhwKDMuNS1wZVtncl1bY2hdLzMwMC4pKS0wLjE0OyAqLworICAgICAgICAgICAgICAgIGFkanVzdCA9IDA7CisgICAgICAgICAgICAgICAgbWFza2luZ19sb3dlcl9kYiA9IGdmYy0+UFNZLT5tYXNrX2FkanVzdF9zaG9ydCAtIGFkanVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdmYy0+bWFza2luZ19sb3dlciA9IHBvdygxMC4wLCBtYXNraW5nX2xvd2VyX2RiICogMC4xKTsKKworCisgICAgICAgICAgICAvKiAgY29kX2luZm8sIHNjYWxlZmFjIGFuZCB4cnBvdyBnZXQgaW5pdGlhbGl6ZWQgaW4gaW5pdF9vdXRlcl9sb29wCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGluaXRfb3V0ZXJfbG9vcChnZmMsIGNvZF9pbmZvKTsKKyAgICAgICAgICAgIGlmIChpbml0X3hycG93KGdmYywgY29kX2luZm8sIHhycG93KSkgeworICAgICAgICAgICAgICAgIC8qICB4ciBjb250YWlucyBlbmVyZ3kgd2Ugd2lsbCBoYXZlIHRvIGVuY29kZQorICAgICAgICAgICAgICAgICAqICBjYWxjdWxhdGUgdGhlIG1hc2tpbmcgYWJpbGl0aWVzCisgICAgICAgICAgICAgICAgICogIGZpbmQgc29tZSBnb29kIHF1YW50aXphdGlvbiBpbiBvdXRlcl9sb29wCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXRoX292ZXIgPSBjYWxjX3htaW4oZ2ZwLCAmcmF0aW9bZ3JdW2NoXSwgY29kX2luZm8sIGwzX3htaW4pOworICAgICAgICAgICAgICAgIGlmICgwID09IGF0aF9vdmVyKSAvKiBhbmFsb2cgc2lsZW5jZSAqLworICAgICAgICAgICAgICAgICAgICB0YXJnX2JpdHNbZ3JdW2NoXSA9IGFuYWxvZ19zaWxlbmNlX2JpdHM7CisKKyAgICAgICAgICAgICAgICAodm9pZCkgb3V0ZXJfbG9vcChnZnAsIGNvZF9pbmZvLCBsM194bWluLCB4cnBvdywgY2gsIHRhcmdfYml0c1tncl1bY2hdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0ZXJhdGlvbl9maW5pc2hfb25lKGdmYywgZ3IsIGNoKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGNoICovCisgICAgfSAgICAgICAgICAgICAgICAgICAvKiBnciAqLworCisgICAgLyogIGZpbmQgYSBiaXRyYXRlIHdoaWNoIGNhbiByZWZpbGwgdGhlIHJlc2V2b2lyIHRvIHBvc2l0aXZlIHNpemUuCisgICAgICovCisgICAgZm9yIChnZmMtPmJpdHJhdGVfaW5kZXggPSBnZmMtPlZCUl9taW5fYml0cmF0ZTsKKyAgICAgICAgIGdmYy0+Yml0cmF0ZV9pbmRleCA8PSBnZmMtPlZCUl9tYXhfYml0cmF0ZTsgZ2ZjLT5iaXRyYXRlX2luZGV4KyspIHsKKyAgICAgICAgaWYgKFJlc3ZGcmFtZUJlZ2luKGdmcCwgJm1lYW5fYml0cykgPj0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhc3NlcnQoZ2ZjLT5iaXRyYXRlX2luZGV4IDw9IGdmYy0+VkJSX21heF9iaXRyYXRlKTsKKworICAgIFJlc3ZGcmFtZUVuZChnZmMsIG1lYW5fYml0cyk7Cit9CisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBDQlJfaXRlcmF0aW9uX2xvb3AoKQorICoKKyAqICBhdXRob3IvZGF0ZT8/CisgKgorICogIGVuY29kZXMgb25lIGZyYW1lIG9mIE1QMyBkYXRhIHdpdGggY29uc3RhbnQgYml0cmF0ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK0NCUl9pdGVyYXRpb25fbG9vcChsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBGTE9BVCBwZVsyXVsyXSwKKyAgICAgICAgICAgICAgICAgICBGTE9BVCBtc19lbmVyX3JhdGlvWzJdLCBJSUlfcHN5X3JhdGlvIHJhdGlvWzJdWzJdKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgRkxPQVQgICBsM194bWluW1NGQk1BWF07CisgICAgRkxPQVQgICB4cnBvd1s1NzZdOworICAgIGludCAgICAgdGFyZ19iaXRzWzJdOworICAgIGludCAgICAgbWVhbl9iaXRzLCBtYXhfYml0czsKKyAgICBpbnQgICAgIGdyLCBjaDsKKyAgICBJSUlfc2lkZV9pbmZvX3QgKmNvbnN0IGwzX3NpZGUgPSAmZ2ZjLT5sM19zaWRlOworICAgIGdyX2luZm8gKmNvZF9pbmZvOworCisgICAgKHZvaWQpIFJlc3ZGcmFtZUJlZ2luKGdmcCwgJm1lYW5fYml0cyk7CisKKyAgICAvKiBxdWFudGl6ZSEgKi8KKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMtPm1vZGVfZ3I7IGdyKyspIHsKKworICAgICAgICAvKiAgY2FsY3VsYXRlIG5lZWRlZCBiaXRzCisgICAgICAgICAqLworICAgICAgICBtYXhfYml0cyA9IG9uX3BlKGdmcCwgcGUsIHRhcmdfYml0cywgbWVhbl9iaXRzLCBnciwgZ3IpOworCisgICAgICAgIGlmIChnZmMtPm1vZGVfZXh0ID09IE1QR19NRF9NU19MUikgeworICAgICAgICAgICAgbXNfY29udmVydCgmZ2ZjLT5sM19zaWRlLCBncik7CisgICAgICAgICAgICByZWR1Y2Vfc2lkZSh0YXJnX2JpdHMsIG1zX2VuZXJfcmF0aW9bZ3JdLCBtZWFuX2JpdHMsIG1heF9iaXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICBGTE9BVCAgIGFkanVzdCwgbWFza2luZ19sb3dlcl9kYjsKKyAgICAgICAgICAgIGNvZF9pbmZvID0gJmwzX3NpZGUtPnR0W2dyXVtjaF07CisKKyAgICAgICAgICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFKSB7IC8qIE5PUk0sIFNUQVJUIG9yIFNUT1AgdHlwZSAqLworICAgICAgICAgICAgICAgIC8qIGFkanVzdCA9IDEuMjgvKDErZXhwKDMuNS1wZVtncl1bY2hdLzMwMC4pKS0wLjA1OyAqLworICAgICAgICAgICAgICAgIGFkanVzdCA9IDA7CisgICAgICAgICAgICAgICAgbWFza2luZ19sb3dlcl9kYiA9IGdmYy0+UFNZLT5tYXNrX2FkanVzdCAtIGFkanVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGFkanVzdCA9IDIuNTYvKDErZXhwKDMuNS1wZVtncl1bY2hdLzMwMC4pKS0wLjE0OyAqLworICAgICAgICAgICAgICAgIGFkanVzdCA9IDA7CisgICAgICAgICAgICAgICAgbWFza2luZ19sb3dlcl9kYiA9IGdmYy0+UFNZLT5tYXNrX2FkanVzdF9zaG9ydCAtIGFkanVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdmYy0+bWFza2luZ19sb3dlciA9IHBvdygxMC4wLCBtYXNraW5nX2xvd2VyX2RiICogMC4xKTsKKworICAgICAgICAgICAgLyogIGluaXRfb3V0ZXJfbG9vcCBzZXRzIHVwIGNvZF9pbmZvLCBzY2FsZWZhYyBhbmQgeHJwb3cKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5pdF9vdXRlcl9sb29wKGdmYywgY29kX2luZm8pOworICAgICAgICAgICAgaWYgKGluaXRfeHJwb3coZ2ZjLCBjb2RfaW5mbywgeHJwb3cpKSB7CisgICAgICAgICAgICAgICAgLyogIHhyIGNvbnRhaW5zIGVuZXJneSB3ZSB3aWxsIGhhdmUgdG8gZW5jb2RlCisgICAgICAgICAgICAgICAgICogIGNhbGN1bGF0ZSB0aGUgbWFza2luZyBhYmlsaXRpZXMKKyAgICAgICAgICAgICAgICAgKiAgZmluZCBzb21lIGdvb2QgcXVhbnRpemF0aW9uIGluIG91dGVyX2xvb3AKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAodm9pZCkgY2FsY194bWluKGdmcCwgJnJhdGlvW2dyXVtjaF0sIGNvZF9pbmZvLCBsM194bWluKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgb3V0ZXJfbG9vcChnZnAsIGNvZF9pbmZvLCBsM194bWluLCB4cnBvdywgY2gsIHRhcmdfYml0c1tjaF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVyYXRpb25fZmluaXNoX29uZShnZmMsIGdyLCBjaCk7CisgICAgICAgICAgICBhc3NlcnQoY29kX2luZm8tPnBhcnQyXzNfbGVuZ3RoIDw9IE1BWF9CSVRTX1BFUl9DSEFOTkVMKTsKKyAgICAgICAgICAgIGFzc2VydChjb2RfaW5mby0+cGFydDJfM19sZW5ndGggPD0gdGFyZ19iaXRzW2NoXSk7CisgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgY2ggKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciBnciAqLworCisgICAgUmVzdkZyYW1lRW5kKGdmYywgbWVhbl9iaXRzKTsKK30KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvcXVhbnRpemUuaCBiL2xpYm1wM2xhbWUvcXVhbnRpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQ5MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9xdWFudGl6ZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBNUDMgcXVhbnRpemF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IE1hcmsgVGF5bG9yCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTEFNRV9RVUFOVElaRV9ICisjZGVmaW5lIExBTUVfUVVBTlRJWkVfSAorCit2b2lkICAgIHRyYW5jYXRlX3NtYWxsc3BlY3RydW1zKGxhbWVfaW50ZXJuYWxfZmxhZ3MgY29uc3QgKiBnZmMsIGdyX2luZm8gKiBjb25zdCBnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkxPQVQgKiBjb25zdCBsM194bWluLCBGTE9BVCAqIGNvbnN0IHdvcmspOworCit2b2lkICAgIENCUl9pdGVyYXRpb25fbG9vcChsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBGTE9BVCBwZVsyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUIG1zX3JhdGlvWzJdLCBJSUlfcHN5X3JhdGlvIHJhdGlvWzJdWzJdKTsKKwordm9pZCAgICBWQlJfb2xkX2l0ZXJhdGlvbl9sb29wKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIEZMT0FUIHBlWzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUIG1zX3JhdGlvWzJdLCBJSUlfcHN5X3JhdGlvIHJhdGlvWzJdWzJdKTsKKwordm9pZCAgICBWQlJfbmV3X2l0ZXJhdGlvbl9sb29wKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIEZMT0FUIHBlWzJdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUIG1zX3JhdGlvWzJdLCBJSUlfcHN5X3JhdGlvIHJhdGlvWzJdWzJdKTsKKwordm9pZCAgICBBQlJfaXRlcmF0aW9uX2xvb3AobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgRkxPQVQgcGVbMl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCBtc19yYXRpb1syXSwgSUlJX3BzeV9yYXRpbyByYXRpb1syXVsyXSk7CisKKworI2VuZGlmIC8qIExBTUVfUVVBTlRJWkVfSCAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS9xdWFudGl6ZV9wdnQuYyBiL2xpYm1wM2xhbWUvcXVhbnRpemVfcHZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2ODBmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvcXVhbnRpemVfcHZ0LmMKQEAgLTAsMCArMSwxMDY3IEBACisvKgorICogICAgICBxdWFudGl6ZV9wdnQgc291cmNlIGZpbGUKKyAqCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFRha2VoaXJvIFRvbWluYWdhCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFJvYmVydCBIZWdlbWFubgorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgTmFva2kgU2hpYmF0YQorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBHYWJyaWVsIEJvdXZpZ25lCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qICRJZDogcXVhbnRpemVfcHZ0LmMsdiAxLjE1My4yLjIgMjAwOS8wMS8xOCAxNTo0NDoyOCByb2JlcnQgRXhwICQgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJxdWFudGl6ZV9wdnQuaCIKKyNpbmNsdWRlICJsYW1lX2dsb2JhbF9mbGFncy5oIgorI2luY2x1ZGUgInJlc2Vydm9pci5oIgorI2luY2x1ZGUgImxhbWUtYW5hbHlzaXMuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisKKyNkZWZpbmUgTlNBVEhTQ0FMRSAxMDAgIC8qIEFzc3VtaW5nIGR5bmFtaWMgcmFuZ2U9OTZkQiwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgOTIgKi8KKworLyoKKyAgVGhlIGZvbGxvd2luZyB0YWJsZSBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgc2NhbGVmYWN0b3IKKyAgcGFydGl0aW9uaW5nIGZvciBNUEVHMiBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbgorICAyLjQuMy4yIG9mIHRoZSBJUy4gVGhlIGluZGV4aW5nIGNvcnJlc3BvbmRzIHRvIHRoZQorICB3YXkgdGhlIHRhYmxlcyBhcmUgcHJlc2VudGVkIGluIHRoZSBJUzoKKworICBbdGFibGVfbnVtYmVyXVtyb3dfaW5fdGFibGVdW2NvbHVtbiBvZiBucl9vZl9zZmJdCisqLworY29uc3QgaW50IG5yX29mX3NmYl9ibG9ja1s2XVszXVs0XSA9IHsKKyAgICB7CisgICAgIHs2LCA1LCA1LCA1fSwKKyAgICAgezksIDksIDksIDl9LAorICAgICB7NiwgOSwgOSwgOX0KKyAgICAgfSwKKyAgICB7CisgICAgIHs2LCA1LCA3LCAzfSwKKyAgICAgezksIDksIDEyLCA2fSwKKyAgICAgezYsIDksIDEyLCA2fQorICAgICB9LAorICAgIHsKKyAgICAgezExLCAxMCwgMCwgMH0sCisgICAgIHsxOCwgMTgsIDAsIDB9LAorICAgICB7MTUsIDE4LCAwLCAwfQorICAgICB9LAorICAgIHsKKyAgICAgezcsIDcsIDcsIDB9LAorICAgICB7MTIsIDEyLCAxMiwgMH0sCisgICAgIHs2LCAxNSwgMTIsIDB9CisgICAgIH0sCisgICAgeworICAgICB7NiwgNiwgNiwgM30sCisgICAgIHsxMiwgOSwgOSwgNn0sCisgICAgIHs2LCAxMiwgOSwgNn0KKyAgICAgfSwKKyAgICB7CisgICAgIHs4LCA4LCA1LCAwfSwKKyAgICAgezE1LCAxMiwgOSwgMH0sCisgICAgIHs2LCAxOCwgOSwgMH0KKyAgICAgfQorfTsKKworCisvKiBUYWJsZSBCLjY6IGxheWVyMyBwcmVlbXBoYXNpcyAqLworY29uc3QgaW50IHByZXRhYltTQk1BWF9sXSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDEsIDEsIDEsIDEsIDIsIDIsIDMsIDMsIDMsIDIsIDAKK307CisKKy8qCisgIEhlcmUgYXJlIE1QRUcxIFRhYmxlIEIuOCBhbmQgTVBFRzIgVGFibGUgQi4xCisgIC0tIExheWVyIElJSSBzY2FsZWZhY3RvciBiYW5kcy4gCisgIEluZGV4IGludG8gdGhpcyB1c2luZyBhIG1ldGhvZCBzdWNoIGFzOgorICAgIGlkeCAgPSBmcl9wcy0+aGVhZGVyLT5zYW1wbGluZ19mcmVxdWVuY3kKKyAgICAgICAgICAgKyAoZnJfcHMtPmhlYWRlci0+dmVyc2lvbiAqIDMpCisqLworCisKK2NvbnN0IHNjYWxlZmFjX3N0cnVjdCBzZkJhbmRJbmRleFs5XSA9IHsKKyAgICB7ICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIEIuMi5iOiAyMi4wNSBrSHogKi8KKyAgICAgezAsIDYsIDEyLCAxOCwgMjQsIDMwLCAzNiwgNDQsIDU0LCA2NiwgODAsIDk2LCAxMTYsIDE0MCwgMTY4LCAyMDAsIDIzOCwgMjg0LCAzMzYsIDM5NiwgNDY0LAorICAgICAgNTIyLCA1NzZ9LAorICAgICB7MCwgNCwgOCwgMTIsIDE4LCAyNCwgMzIsIDQyLCA1NiwgNzQsIDEwMCwgMTMyLCAxNzQsIDE5Mn0KKyAgICAgLCB7MCwgMCwgMCwgMCwgMCwgMCwgMH0gLyogIHNmYjIxIHBzZXVkbyBzdWIgYmFuZHMgKi8KKyAgICAgLCB7MCwgMCwgMCwgMCwgMCwgMCwgMH0gLyogIHNmYjEyIHBzZXVkbyBzdWIgYmFuZHMgKi8KKyAgICAgfSwKKyAgICB7ICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIEIuMi5jOiAyNCBrSHogKi8gLyogZG9jczogMzMyLiBtcGcxMjMoYnJva2VuKTogMzMwICovCisgICAgIHswLCA2LCAxMiwgMTgsIDI0LCAzMCwgMzYsIDQ0LCA1NCwgNjYsIDgwLCA5NiwgMTE0LCAxMzYsIDE2MiwgMTk0LCAyMzIsIDI3OCwgMzMyLCAzOTQsIDQ2NCwKKyAgICAgIDU0MCwgNTc2fSwKKyAgICAgezAsIDQsIDgsIDEyLCAxOCwgMjYsIDM2LCA0OCwgNjIsIDgwLCAxMDQsIDEzNiwgMTgwLCAxOTJ9CisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIyMSBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIxMiBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgIH0sCisgICAgeyAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBCLjIuYTogMTYga0h6ICovCisgICAgIHswLCA2LCAxMiwgMTgsIDI0LCAzMCwgMzYsIDQ0LCA1NCwgNjYsIDgwLCA5NiwgMTE2LCAxNDAsIDE2OCwgMjAwLCAyMzgsIDI4NCwgMzM2LCAzOTYsIDQ2NCwKKyAgICAgIDUyMiwgNTc2fSwKKyAgICAgezAsIDQsIDgsIDEyLCAxOCwgMjYsIDM2LCA0OCwgNjIsIDgwLCAxMDQsIDEzNCwgMTc0LCAxOTJ9CisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIyMSBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIxMiBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgIH0sCisgICAgeyAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBCLjguYjogNDQuMSBrSHogKi8KKyAgICAgezAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAzMCwgMzYsIDQ0LCA1MiwgNjIsIDc0LCA5MCwgMTEwLCAxMzQsIDE2MiwgMTk2LCAyMzgsIDI4OCwgMzQyLCA0MTgsCisgICAgICA1NzZ9LAorICAgICB7MCwgNCwgOCwgMTIsIDE2LCAyMiwgMzAsIDQwLCA1MiwgNjYsIDg0LCAxMDYsIDEzNiwgMTkyfQorICAgICAsIHswLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiAgc2ZiMjEgcHNldWRvIHN1YiBiYW5kcyAqLworICAgICAsIHswLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiAgc2ZiMTIgcHNldWRvIHN1YiBiYW5kcyAqLworICAgICB9LAorICAgIHsgICAgICAgICAgICAgICAgICAgLyogVGFibGUgQi44LmM6IDQ4IGtIeiAqLworICAgICB7MCwgNCwgOCwgMTIsIDE2LCAyMCwgMjQsIDMwLCAzNiwgNDIsIDUwLCA2MCwgNzIsIDg4LCAxMDYsIDEyOCwgMTU2LCAxOTAsIDIzMCwgMjc2LCAzMzAsIDM4NCwKKyAgICAgIDU3Nn0sCisgICAgIHswLCA0LCA4LCAxMiwgMTYsIDIyLCAyOCwgMzgsIDUwLCA2NCwgODAsIDEwMCwgMTI2LCAxOTJ9CisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIyMSBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIxMiBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgIH0sCisgICAgeyAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBCLjguYTogMzIga0h6ICovCisgICAgIHswLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMzAsIDM2LCA0NCwgNTQsIDY2LCA4MiwgMTAyLCAxMjYsIDE1NiwgMTk0LCAyNDAsIDI5NiwgMzY0LCA0NDgsIDU1MCwKKyAgICAgIDU3Nn0sCisgICAgIHswLCA0LCA4LCAxMiwgMTYsIDIyLCAzMCwgNDIsIDU4LCA3OCwgMTA0LCAxMzgsIDE4MCwgMTkyfQorICAgICAsIHswLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiAgc2ZiMjEgcHNldWRvIHN1YiBiYW5kcyAqLworICAgICAsIHswLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiAgc2ZiMTIgcHNldWRvIHN1YiBiYW5kcyAqLworICAgICB9LAorICAgIHsgICAgICAgICAgICAgICAgICAgLyogTVBFRy0yLjUgMTEuMDI1IGtIeiAqLworICAgICB7MCwgNiwgMTIsIDE4LCAyNCwgMzAsIDM2LCA0NCwgNTQsIDY2LCA4MCwgOTYsIDExNiwgMTQwLCAxNjgsIDIwMCwgMjM4LCAyODQsIDMzNiwgMzk2LCA0NjQsCisgICAgICA1MjIsIDU3Nn0sCisgICAgIHswIC8gMywgMTIgLyAzLCAyNCAvIDMsIDM2IC8gMywgNTQgLyAzLCA3OCAvIDMsIDEwOCAvIDMsIDE0NCAvIDMsIDE4NiAvIDMsIDI0MCAvIDMsIDMxMiAvIDMsCisgICAgICA0MDIgLyAzLCA1MjIgLyAzLCA1NzYgLyAzfQorICAgICAsIHswLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiAgc2ZiMjEgcHNldWRvIHN1YiBiYW5kcyAqLworICAgICAsIHswLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiAgc2ZiMTIgcHNldWRvIHN1YiBiYW5kcyAqLworICAgICB9LAorICAgIHsgICAgICAgICAgICAgICAgICAgLyogTVBFRy0yLjUgMTIga0h6ICovCisgICAgIHswLCA2LCAxMiwgMTgsIDI0LCAzMCwgMzYsIDQ0LCA1NCwgNjYsIDgwLCA5NiwgMTE2LCAxNDAsIDE2OCwgMjAwLCAyMzgsIDI4NCwgMzM2LCAzOTYsIDQ2NCwKKyAgICAgIDUyMiwgNTc2fSwKKyAgICAgezAgLyAzLCAxMiAvIDMsIDI0IC8gMywgMzYgLyAzLCA1NCAvIDMsIDc4IC8gMywgMTA4IC8gMywgMTQ0IC8gMywgMTg2IC8gMywgMjQwIC8gMywgMzEyIC8gMywKKyAgICAgIDQwMiAvIDMsIDUyMiAvIDMsIDU3NiAvIDN9CisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIyMSBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgICwgezAsIDAsIDAsIDAsIDAsIDAsIDB9IC8qICBzZmIxMiBwc2V1ZG8gc3ViIGJhbmRzICovCisgICAgIH0sCisgICAgeyAgICAgICAgICAgICAgICAgICAvKiBNUEVHLTIuNSA4IGtIeiAqLworICAgICB7MCwgMTIsIDI0LCAzNiwgNDgsIDYwLCA3MiwgODgsIDEwOCwgMTMyLCAxNjAsIDE5MiwgMjMyLCAyODAsIDMzNiwgNDAwLCA0NzYsIDU2NiwgNTY4LCA1NzAsCisgICAgICA1NzIsIDU3NCwgNTc2fSwKKyAgICAgezAgLyAzLCAyNCAvIDMsIDQ4IC8gMywgNzIgLyAzLCAxMDggLyAzLCAxNTYgLyAzLCAyMTYgLyAzLCAyODggLyAzLCAzNzIgLyAzLCA0ODAgLyAzLCA0ODYgLyAzLAorICAgICAgNDkyIC8gMywgNDk4IC8gMywgNTc2IC8gM30KKyAgICAgLCB7MCwgMCwgMCwgMCwgMCwgMCwgMH0gLyogIHNmYjIxIHBzZXVkbyBzdWIgYmFuZHMgKi8KKyAgICAgLCB7MCwgMCwgMCwgMCwgMCwgMCwgMH0gLyogIHNmYjEyIHBzZXVkbyBzdWIgYmFuZHMgKi8KKyAgICAgfQorfTsKKworCisKK0ZMT0FUICAgcG93MjBbUV9NQVggKyBRX01BWDIgKyAxXTsKK0ZMT0FUICAgaXBvdzIwW1FfTUFYXTsKK0ZMT0FUICAgcG93NDNbUFJFQ0FMQ19TSVpFXTsKKy8qIGluaXRpYWxpemVkIGluIGZpcnN0IGNhbGwgdG8gaXRlcmF0aW9uX2luaXQgKi8KKyNpZmRlZiBUQUtFSElST19JRUVFNzU0X0hBQ0sKK0ZMT0FUICAgYWRqNDNhc21bUFJFQ0FMQ19TSVpFXTsKKyNlbHNlCitGTE9BVCAgIGFkajQzW1BSRUNBTENfU0laRV07CisjZW5kaWYKKworLyogCitjb21wdXRlIHRoZSBBVEggZm9yIGVhY2ggc2NhbGVmYWN0b3IgYmFuZCAKK2NkIHJhbmdlOiAgMC4uOTZkYgorCitJbnB1dDogIDMuM2tIeiBzaWduYWwgIDMyNzY3IGFtcGxpdHVkZSAgKDMuM2tIeiBpcyB3aGVyZSBBVEggaXMgc21hbGxlc3QgPSAtNWRiKQorbG9uZ2Jsb2NrczogIHNmYj0xMiAgIGVuMC9idz0tMTFkYiAgICBtYXhfZW4wID0gMS4zZGIKK3Nob3J0YmxvY2tzOiBzZmI9NSAgICAgICAgICAgLTlkYiAgICAgICAgICAgICAgMGRiCisKK0lucHV0OiAgMSAxIDEgMSAxIDEgMSAtMSAtMSAtMSAtMSAtMSAtMSAtMSAocmVwZWF0ZWQpCitsb25nYmxvY2tzOiAgYW1wPTEgICAgICBzZmI9MTIgICBlbjAvYnc9LTEwMyBkYiAgICAgIG1heF9lbjAgPSAtOTJkYgorICAgICAgICAgICAgYW1wPTMyNzY3ICAgc2ZiPTEyICAgICAgICAgICAtMTIgZGIgICAgICAgICAgICAgICAgIC0xLjRkYiAKKworSW5wdXQ6ICAxIDEgMSAxIDEgMSAxIC0xIC0xIC0xIC0xIC0xIC0xIC0xIChyZXBlYXRlZCkKK3Nob3J0YmxvY2tzOiBhbXA9MSAgICAgIHNmYj01ICAgZW4wL2J3PSAtOTkgICAgICAgICAgICAgICAgICAgIC04NiAKKyAgICAgICAgICAgIGFtcD0zMjc2NyAgIHNmYj01ICAgICAgICAgICAtOSAgZGIgICAgICAgICAgICAgICAgICA0ZGIgCisKKworTUFYIGVuZXJneSBvZiBsYXJnZXN0IHdhdmUgYXQgMy4za0h6ID0gMWRiCitBVkUgZW5lcmd5IG9mIGxhcmdlc3Qgd2F2ZSBhdCAzLjNrSHogPSAtMTFkYgorTGV0J3MgdGFrZSBBVkU6ICAtMTFkYiA9IG1heGltdW0gc2lnbmFsIGluIHNmYj0xMi4gIAorRHluYW1pYyByYW5nZSBvZiBDRDogOTZkYi4gIFRoZXJlZm9yIGVuZXJneSBvZiBzbWFsbGVzdCBhdWRpYmxlIHdhdmUgCitpbiBzZmI9MTIgID0gLTExICAtIDk2ID0gLTEwN2RiID0gQVRIIGF0IDMuM2tIei4gIAorCitBVEggZm9ybXVsYSBmb3IgdGhpcyB3YXZlOiAtNWRiLiAgVG8gYWRqdXN0IHRvIExBTUUgc2NhbGluZywgd2UgbmVlZAorQVRIID0gQVRIX2Zvcm11bGEgIC0gMTAzICAoZGIpCitBVEggPSBBVEggKiAyLjVlLTEwICAgICAgKGVuZXIpCisKKyovCisKK3N0YXRpYyAgRkxPQVQKK0FUSG1kY3QobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgRkxPQVQgZikKK3sKKyAgICBGTE9BVCAgIGF0aDsKKworICAgIGF0aCA9IEFUSGZvcm11bGEoZiwgZ2ZwKTsKKworICAgIGF0aCAtPSBOU0FUSFNDQUxFOworCisgICAgLyogbW9kaWZ5IHRoZSBNRENUIHNjYWxpbmcgZm9yIHRoZSBBVEggYW5kIGNvbnZlcnQgdG8gZW5lcmd5ICovCisgICAgYXRoID0gcG93KDEwLjAsIGF0aCAvIDEwLjAgKyBnZnAtPkFUSGxvd2VyKTsKKyAgICByZXR1cm4gYXRoOworfQorCitzdGF0aWMgdm9pZAorY29tcHV0ZV9hdGgobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgRkxPQVQgICpjb25zdCBBVEhfbCA9IGdmcC0+aW50ZXJuYWxfZmxhZ3MtPkFUSC0+bDsKKyAgICBGTE9BVCAgKmNvbnN0IEFUSF9wc2ZiMjEgPSBnZnAtPmludGVybmFsX2ZsYWdzLT5BVEgtPnBzZmIyMTsKKyAgICBGTE9BVCAgKmNvbnN0IEFUSF9zID0gZ2ZwLT5pbnRlcm5hbF9mbGFncy0+QVRILT5zOworICAgIEZMT0FUICAqY29uc3QgQVRIX3BzZmIxMiA9IGdmcC0+aW50ZXJuYWxfZmxhZ3MtPkFUSC0+cHNmYjEyOworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgY29uc3QgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgaW50ICAgICBzZmIsIGksIHN0YXJ0LCBlbmQ7CisgICAgRkxPQVQgICBBVEhfZjsKKyAgICBGTE9BVCBjb25zdCBzYW1wX2ZyZXEgPSBnZnAtPm91dF9zYW1wbGVyYXRlOworCisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBTQk1BWF9sOyBzZmIrKykgeworICAgICAgICBzdGFydCA9IGdmYy0+c2NhbGVmYWNfYmFuZC5sW3NmYl07CisgICAgICAgIGVuZCA9IGdmYy0+c2NhbGVmYWNfYmFuZC5sW3NmYiArIDFdOworICAgICAgICBBVEhfbFtzZmJdID0gRkxPQVRfTUFYOworICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBmcmVxID0gaSAqIHNhbXBfZnJlcSAvICgyICogNTc2KTsKKyAgICAgICAgICAgIEFUSF9mID0gQVRIbWRjdChnZnAsIGZyZXEpOyAvKiBmcmVxIGluIGtIeiAqLworICAgICAgICAgICAgQVRIX2xbc2ZiXSA9IE1pbihBVEhfbFtzZmJdLCBBVEhfZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IFBTRkIyMTsgc2ZiKyspIHsKKyAgICAgICAgc3RhcnQgPSBnZmMtPnNjYWxlZmFjX2JhbmQucHNmYjIxW3NmYl07CisgICAgICAgIGVuZCA9IGdmYy0+c2NhbGVmYWNfYmFuZC5wc2ZiMjFbc2ZiICsgMV07CisgICAgICAgIEFUSF9wc2ZiMjFbc2ZiXSA9IEZMT0FUX01BWDsKKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgZnJlcSA9IGkgKiBzYW1wX2ZyZXEgLyAoMiAqIDU3Nik7CisgICAgICAgICAgICBBVEhfZiA9IEFUSG1kY3QoZ2ZwLCBmcmVxKTsgLyogZnJlcSBpbiBrSHogKi8KKyAgICAgICAgICAgIEFUSF9wc2ZiMjFbc2ZiXSA9IE1pbihBVEhfcHNmYjIxW3NmYl0sIEFUSF9mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgU0JNQVhfczsgc2ZiKyspIHsKKyAgICAgICAgc3RhcnQgPSBnZmMtPnNjYWxlZmFjX2JhbmQuc1tzZmJdOworICAgICAgICBlbmQgPSBnZmMtPnNjYWxlZmFjX2JhbmQuc1tzZmIgKyAxXTsKKyAgICAgICAgQVRIX3Nbc2ZiXSA9IEZMT0FUX01BWDsKKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgZnJlcSA9IGkgKiBzYW1wX2ZyZXEgLyAoMiAqIDE5Mik7CisgICAgICAgICAgICBBVEhfZiA9IEFUSG1kY3QoZ2ZwLCBmcmVxKTsgLyogZnJlcSBpbiBrSHogKi8KKyAgICAgICAgICAgIEFUSF9zW3NmYl0gPSBNaW4oQVRIX3Nbc2ZiXSwgQVRIX2YpOworICAgICAgICB9CisgICAgICAgIEFUSF9zW3NmYl0gKj0gKGdmYy0+c2NhbGVmYWNfYmFuZC5zW3NmYiArIDFdIC0gZ2ZjLT5zY2FsZWZhY19iYW5kLnNbc2ZiXSk7CisgICAgfQorCisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBQU0ZCMTI7IHNmYisrKSB7CisgICAgICAgIHN0YXJ0ID0gZ2ZjLT5zY2FsZWZhY19iYW5kLnBzZmIxMltzZmJdOworICAgICAgICBlbmQgPSBnZmMtPnNjYWxlZmFjX2JhbmQucHNmYjEyW3NmYiArIDFdOworICAgICAgICBBVEhfcHNmYjEyW3NmYl0gPSBGTE9BVF9NQVg7CisgICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIEZMT0FUIGNvbnN0IGZyZXEgPSBpICogc2FtcF9mcmVxIC8gKDIgKiAxOTIpOworICAgICAgICAgICAgQVRIX2YgPSBBVEhtZGN0KGdmcCwgZnJlcSk7IC8qIGZyZXEgaW4ga0h6ICovCisgICAgICAgICAgICBBVEhfcHNmYjEyW3NmYl0gPSBNaW4oQVRIX3BzZmIxMltzZmJdLCBBVEhfZik7CisgICAgICAgIH0KKyAgICAgICAgLypub3Qgc3VyZSBhYm91dCB0aGUgZm9sbG93aW5nICovCisgICAgICAgIEFUSF9wc2ZiMTJbc2ZiXSAqPSAoZ2ZjLT5zY2FsZWZhY19iYW5kLnNbMTNdIC0gZ2ZjLT5zY2FsZWZhY19iYW5kLnNbMTJdKTsKKyAgICB9CisKKworICAgIC8qICBuby1BVEggbW9kZToKKyAgICAgKiAgcmVkdWNlIEFUSCB0byAtMjAwIGRCCisgICAgICovCisKKyAgICBpZiAoZ2ZwLT5ub0FUSCkgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IFNCTUFYX2w7IHNmYisrKSB7CisgICAgICAgICAgICBBVEhfbFtzZmJdID0gMUUtMjA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBQU0ZCMjE7IHNmYisrKSB7CisgICAgICAgICAgICBBVEhfcHNmYjIxW3NmYl0gPSAxRS0yMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IFNCTUFYX3M7IHNmYisrKSB7CisgICAgICAgICAgICBBVEhfc1tzZmJdID0gMUUtMjA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBQU0ZCMTI7IHNmYisrKSB7CisgICAgICAgICAgICBBVEhfcHNmYjEyW3NmYl0gPSAxRS0yMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICB3b3JrIGluIHByb2dyZXNzLCBkb24ndCByZWx5IG9uIGl0IHRvbyBtdWNoCisgICAgICovCisgICAgZ2ZjLT5BVEgtPmZsb29yID0gMTAuICogbG9nMTAoQVRIbWRjdChnZnAsIC0xLikpOworCisgICAgLyoKKyAgICAgICB7ICAgRkxPQVQgZz0xMDAwMCwgdD0xZTMwLCB4OworICAgICAgIGZvciAoIGYgPSAxMDA7IGYgPCAxMDAwMDsgZisrICkgeworICAgICAgIHggPSBBVEhtZGN0KCBnZnAsIGYgKTsKKyAgICAgICBpZiAoIHQgPiB4ICkgdCA9IHgsIGcgPSBmOworICAgICAgIH0KKyAgICAgICBwcmludGYoIm1pbj0lZ1xuIiwgZyk7CisgICAgICAgfSAqLworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIGluaXRpYWxpemF0aW9uIGZvciBpdGVyYXRpb25fbG9vcCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l0ZXJhdGlvbl9pbml0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmNvbnN0IGdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgSUlJX3NpZGVfaW5mb190ICpjb25zdCBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKyAgICBpbnQgICAgIGk7CisKKyAgICBpZiAoZ2ZjLT5pdGVyYXRpb25faW5pdF9pbml0ID09IDApIHsKKyAgICAgICAgZ2ZjLT5pdGVyYXRpb25faW5pdF9pbml0ID0gMTsKKworICAgICAgICBsM19zaWRlLT5tYWluX2RhdGFfYmVnaW4gPSAwOworICAgICAgICBjb21wdXRlX2F0aChnZnApOworCisgICAgICAgIHBvdzQzWzBdID0gMC4wOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgUFJFQ0FMQ19TSVpFOyBpKyspCisgICAgICAgICAgICBwb3c0M1tpXSA9IHBvdygoRkxPQVQpIGksIDQuMCAvIDMuMCk7CisKKyNpZmRlZiBUQUtFSElST19JRUVFNzU0X0hBQ0sKKyAgICAgICAgYWRqNDNhc21bMF0gPSAwLjA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBQUkVDQUxDX1NJWkU7IGkrKykKKyAgICAgICAgICAgIGFkajQzYXNtW2ldID0gaSAtIDAuNSAtIHBvdygwLjUgKiAocG93NDNbaSAtIDFdICsgcG93NDNbaV0pLCAwLjc1KTsKKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQUkVDQUxDX1NJWkUgLSAxOyBpKyspCisgICAgICAgICAgICBhZGo0M1tpXSA9IChpICsgMSkgLSBwb3coMC41ICogKHBvdzQzW2ldICsgcG93NDNbaSArIDFdKSwgMC43NSk7CisgICAgICAgIGFkajQzW2ldID0gMC41OworI2VuZGlmCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBRX01BWDsgaSsrKQorICAgICAgICAgICAgaXBvdzIwW2ldID0gcG93KDIuMCwgKGRvdWJsZSkgKGkgLSAyMTApICogLTAuMTg3NSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gUV9NQVggKyBRX01BWDI7IGkrKykKKyAgICAgICAgICAgIHBvdzIwW2ldID0gcG93KDIuMCwgKGRvdWJsZSkgKGkgLSAyMTAgLSBRX01BWDIpICogMC4yNSk7CisKKyAgICAgICAgaHVmZm1hbl9pbml0KGdmYyk7CisgICAgICAgIGluaXRfeHJwb3dfY29yZV9pbml0KGdmYyk7CisKKyAgICAgICAgeworICAgICAgICAgICAgRkxPQVQgICBiYXNzLCBhbHRvLCB0cmVibGUsIHNmYjIxOworCisgICAgICAgICAgICBpID0gKGdmcC0+ZXhwX25zcHN5dHVuZSA+PiAyKSAmIDYzOworICAgICAgICAgICAgaWYgKGkgPj0gMzIpCisgICAgICAgICAgICAgICAgaSAtPSA2NDsKKyAgICAgICAgICAgIGJhc3MgPSBwb3coMTAsIGkgLyA0LjAgLyAxMC4wKTsKKworICAgICAgICAgICAgaSA9IChnZnAtPmV4cF9uc3BzeXR1bmUgPj4gOCkgJiA2MzsKKyAgICAgICAgICAgIGlmIChpID49IDMyKQorICAgICAgICAgICAgICAgIGkgLT0gNjQ7CisgICAgICAgICAgICBhbHRvID0gcG93KDEwLCBpIC8gNC4wIC8gMTAuMCk7CisKKyAgICAgICAgICAgIGkgPSAoZ2ZwLT5leHBfbnNwc3l0dW5lID4+IDE0KSAmIDYzOworICAgICAgICAgICAgaWYgKGkgPj0gMzIpCisgICAgICAgICAgICAgICAgaSAtPSA2NDsKKyAgICAgICAgICAgIHRyZWJsZSA9IHBvdygxMCwgaSAvIDQuMCAvIDEwLjApOworCisgICAgICAgICAgICAvKiAgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE5hb2tpJ3Mgb3JpZ2luYWwgY29kZSwgdGhlIG5leHQgNiBiaXRzCisgICAgICAgICAgICAgKiAgZGVmaW5lIG9ubHkgdGhlIGFtb3VudCBvZiBjaGFuZ2luZyB0cmVibGUgZm9yIHNmYjIxICovCisgICAgICAgICAgICBpID0gKGdmcC0+ZXhwX25zcHN5dHVuZSA+PiAyMCkgJiA2MzsKKyAgICAgICAgICAgIGlmIChpID49IDMyKQorICAgICAgICAgICAgICAgIGkgLT0gNjQ7CisgICAgICAgICAgICBzZmIyMSA9IHRyZWJsZSAqIHBvdygxMCwgaSAvIDQuMCAvIDEwLjApOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNCTUFYX2w7IGkrKykgeworICAgICAgICAgICAgICAgIEZMT0FUICAgZjsKKyAgICAgICAgICAgICAgICBpZiAoaSA8PSA2KQorICAgICAgICAgICAgICAgICAgICBmID0gYmFzczsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDw9IDEzKQorICAgICAgICAgICAgICAgICAgICBmID0gYWx0bzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDw9IDIwKQorICAgICAgICAgICAgICAgICAgICBmID0gdHJlYmxlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZiA9IHNmYjIxOworCisgICAgICAgICAgICAgICAgZ2ZjLT5uc1BzeS5sb25nZmFjdFtpXSA9IGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU0JNQVhfczsgaSsrKSB7CisgICAgICAgICAgICAgICAgRkxPQVQgICBmOworICAgICAgICAgICAgICAgIGlmIChpIDw9IDUpCisgICAgICAgICAgICAgICAgICAgIGYgPSBiYXNzOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPD0gMTApCisgICAgICAgICAgICAgICAgICAgIGYgPSBhbHRvOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPD0gMTEpCisgICAgICAgICAgICAgICAgICAgIGYgPSB0cmVibGU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmID0gc2ZiMjE7CisKKyAgICAgICAgICAgICAgICBnZmMtPm5zUHN5LnNob3J0ZmFjdFtpXSA9IGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYWxsb2NhdGUgYml0cyBhbW9uZyAyIGNoYW5uZWxzIGJhc2VkIG9uIFBFCisgKiBtdCA2Lzk5CisgKiBidWdmaXhlcyByaCA4LzAxOiBvZnRlbiBhbGxvY2F0ZWQgbW9yZSB0aGFuIHRoZSBhbGxvd2VkIDQwOTUgYml0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorb25fcGUobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgRkxPQVQgcGVbXVsyXSwKKyAgICAgIGludCB0YXJnX2JpdHNbMl0sIGludCBtZWFuX2JpdHMsIGludCBnciwgaW50IGNicikKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgZXh0cmFfYml0cywgdGJpdHMsIGJpdHM7CisgICAgaW50ICAgICBhZGRfYml0c1syXTsKKyAgICBpbnQgICAgIG1heF9iaXRzOyAgICAgICAgLyogbWF4aW11bSBhbGxvd2VkIGJpdHMgZm9yIHRoaXMgZ3JhbnVsZSAqLworICAgIGludCAgICAgY2g7CisKKyAgICAvKiBhbGxvY2F0ZSB0YXJnX2JpdHMgZm9yIGdyYW51bGUgKi8KKyAgICBSZXN2TWF4Qml0cyhnZnAsIG1lYW5fYml0cywgJnRiaXRzLCAmZXh0cmFfYml0cywgY2JyKTsKKyAgICBtYXhfYml0cyA9IHRiaXRzICsgZXh0cmFfYml0czsKKyAgICBpZiAobWF4X2JpdHMgPiBNQVhfQklUU19QRVJfR1JBTlVMRSkgLyogaGFyZCBsaW1pdCBwZXIgZ3JhbnVsZSAqLworICAgICAgICBtYXhfYml0cyA9IE1BWF9CSVRTX1BFUl9HUkFOVUxFOworCisgICAgZm9yIChiaXRzID0gMCwgY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyArK2NoKSB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICogYWxsb2NhdGUgYml0cyBmb3IgZWFjaCBjaGFubmVsIAorICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICB0YXJnX2JpdHNbY2hdID0gTWluKE1BWF9CSVRTX1BFUl9DSEFOTkVMLCB0Yml0cyAvIGdmYy0+Y2hhbm5lbHNfb3V0KTsKKworICAgICAgICBhZGRfYml0c1tjaF0gPSB0YXJnX2JpdHNbY2hdICogcGVbZ3JdW2NoXSAvIDcwMC4wIC0gdGFyZ19iaXRzW2NoXTsKKworICAgICAgICAvKiBhdCBtb3N0IGluY3JlYXNlIGJpdHMgYnkgMS41KmF2ZXJhZ2UgKi8KKyAgICAgICAgaWYgKGFkZF9iaXRzW2NoXSA+IG1lYW5fYml0cyAqIDMgLyA0KQorICAgICAgICAgICAgYWRkX2JpdHNbY2hdID0gbWVhbl9iaXRzICogMyAvIDQ7CisgICAgICAgIGlmIChhZGRfYml0c1tjaF0gPCAwKQorICAgICAgICAgICAgYWRkX2JpdHNbY2hdID0gMDsKKworICAgICAgICBpZiAoYWRkX2JpdHNbY2hdICsgdGFyZ19iaXRzW2NoXSA+IE1BWF9CSVRTX1BFUl9DSEFOTkVMKQorICAgICAgICAgICAgYWRkX2JpdHNbY2hdID0gTWF4KDAsIE1BWF9CSVRTX1BFUl9DSEFOTkVMIC0gdGFyZ19iaXRzW2NoXSk7CisKKyAgICAgICAgYml0cyArPSBhZGRfYml0c1tjaF07CisgICAgfQorICAgIGlmIChiaXRzID4gZXh0cmFfYml0cykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgKytjaCkgeworICAgICAgICAgICAgYWRkX2JpdHNbY2hdID0gZXh0cmFfYml0cyAqIGFkZF9iaXRzW2NoXSAvIGJpdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMtPmNoYW5uZWxzX291dDsgKytjaCkgeworICAgICAgICB0YXJnX2JpdHNbY2hdICs9IGFkZF9iaXRzW2NoXTsKKyAgICAgICAgZXh0cmFfYml0cyAtPSBhZGRfYml0c1tjaF07CisgICAgfQorCisgICAgZm9yIChiaXRzID0gMCwgY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyArK2NoKSB7CisgICAgICAgIGJpdHMgKz0gdGFyZ19iaXRzW2NoXTsKKyAgICB9CisgICAgaWYgKGJpdHMgPiBNQVhfQklUU19QRVJfR1JBTlVMRSkgeworICAgICAgICBpbnQgICAgIHN1bSA9IDA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyArK2NoKSB7CisgICAgICAgICAgICB0YXJnX2JpdHNbY2hdICo9IE1BWF9CSVRTX1BFUl9HUkFOVUxFOworICAgICAgICAgICAgdGFyZ19iaXRzW2NoXSAvPSBiaXRzOworICAgICAgICAgICAgc3VtICs9IHRhcmdfYml0c1tjaF07CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHN1bSA8PSBNQVhfQklUU19QRVJfR1JBTlVMRSk7CisgICAgfQorCisgICAgcmV0dXJuIG1heF9iaXRzOworfQorCisKKworCit2b2lkCityZWR1Y2Vfc2lkZShpbnQgdGFyZ19iaXRzWzJdLCBGTE9BVCBtc19lbmVyX3JhdGlvLCBpbnQgbWVhbl9iaXRzLCBpbnQgbWF4X2JpdHMpCit7CisgICAgaW50ICAgICBtb3ZlX2JpdHM7CisgICAgRkxPQVQgICBmYWM7CisKKyAgICBhc3NlcnQobWF4X2JpdHMgPD0gTUFYX0JJVFNfUEVSX0dSQU5VTEUpOworICAgIGFzc2VydCh0YXJnX2JpdHNbMF0gKyB0YXJnX2JpdHNbMV0gPD0gTUFYX0JJVFNfUEVSX0dSQU5VTEUpOworCisgICAgLyogIG1zX2VuZXJfcmF0aW8gPSAwOiAgYWxsb2NhdGUgNjYvMzMgIG1pZC9zaWRlICBmYWM9LjMzICAKKyAgICAgKiAgbXNfZW5lcl9yYXRpbyA9LjU6ICBhbGxvY2F0ZSA1MC81MCBtaWQvc2lkZSAgIGZhYz0gMCAqLworICAgIC8qIDc1LzI1IHNwbGl0IGlzIGZhYz0uNSAqLworICAgIC8qIGZsb2F0IGZhYyA9IC41MCooLjUtbXNfZW5lcl9yYXRpb1tncl0pLy41OyAqLworICAgIGZhYyA9IC4zMyAqICguNSAtIG1zX2VuZXJfcmF0aW8pIC8gLjU7CisgICAgaWYgKGZhYyA8IDApCisgICAgICAgIGZhYyA9IDA7CisgICAgaWYgKGZhYyA+IC41KQorICAgICAgICBmYWMgPSAuNTsKKworICAgIC8qIG51bWJlciBvZiBiaXRzIHRvIG1vdmUgZnJvbSBzaWRlIGNoYW5uZWwgdG8gbWlkIGNoYW5uZWwgKi8KKyAgICAvKiAgICBtb3ZlX2JpdHMgPSBmYWMqdGFyZ19iaXRzWzFdOyAgKi8KKyAgICBtb3ZlX2JpdHMgPSBmYWMgKiAuNSAqICh0YXJnX2JpdHNbMF0gKyB0YXJnX2JpdHNbMV0pOworCisgICAgaWYgKG1vdmVfYml0cyA+IE1BWF9CSVRTX1BFUl9DSEFOTkVMIC0gdGFyZ19iaXRzWzBdKSB7CisgICAgICAgIG1vdmVfYml0cyA9IE1BWF9CSVRTX1BFUl9DSEFOTkVMIC0gdGFyZ19iaXRzWzBdOworICAgIH0KKyAgICBpZiAobW92ZV9iaXRzIDwgMCkKKyAgICAgICAgbW92ZV9iaXRzID0gMDsKKworICAgIGlmICh0YXJnX2JpdHNbMV0gPj0gMTI1KSB7CisgICAgICAgIC8qIGRvbnQgcmVkdWNlIHNpZGUgY2hhbm5lbCBiZWxvdyAxMjUgYml0cyAqLworICAgICAgICBpZiAodGFyZ19iaXRzWzFdIC0gbW92ZV9iaXRzID4gMTI1KSB7CisKKyAgICAgICAgICAgIC8qIGlmIG1pZCBjaGFubmVsIGFscmVhZHkgaGFzIDJ4IG1vcmUgdGhhbiBhdmVyYWdlLCBkb250IGJvdGhlciAqLworICAgICAgICAgICAgLyogbWVhbl9iaXRzID0gYml0cyBwZXIgZ3JhbnVsZSAoZm9yIGJvdGggY2hhbm5lbHMpICovCisgICAgICAgICAgICBpZiAodGFyZ19iaXRzWzBdIDwgbWVhbl9iaXRzKQorICAgICAgICAgICAgICAgIHRhcmdfYml0c1swXSArPSBtb3ZlX2JpdHM7CisgICAgICAgICAgICB0YXJnX2JpdHNbMV0gLT0gbW92ZV9iaXRzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGFyZ19iaXRzWzBdICs9IHRhcmdfYml0c1sxXSAtIDEyNTsKKyAgICAgICAgICAgIHRhcmdfYml0c1sxXSA9IDEyNTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1vdmVfYml0cyA9IHRhcmdfYml0c1swXSArIHRhcmdfYml0c1sxXTsKKyAgICBpZiAobW92ZV9iaXRzID4gbWF4X2JpdHMpIHsKKyAgICAgICAgdGFyZ19iaXRzWzBdID0gKG1heF9iaXRzICogdGFyZ19iaXRzWzBdKSAvIG1vdmVfYml0czsKKyAgICAgICAgdGFyZ19iaXRzWzFdID0gKG1heF9iaXRzICogdGFyZ19iaXRzWzFdKSAvIG1vdmVfYml0czsKKyAgICB9CisgICAgYXNzZXJ0KHRhcmdfYml0c1swXSA8PSBNQVhfQklUU19QRVJfQ0hBTk5FTCk7CisgICAgYXNzZXJ0KHRhcmdfYml0c1sxXSA8PSBNQVhfQklUU19QRVJfQ0hBTk5FTCk7CisgICAgYXNzZXJ0KHRhcmdfYml0c1swXSArIHRhcmdfYml0c1sxXSA8PSBNQVhfQklUU19QRVJfR1JBTlVMRSk7Cit9CisKKworLyoqCisgKiAgUm9iZXJ0IEhlZ2VtYW5uIDIwMDEtMDQtMjc6CisgKiAgdGhpcyBhZGp1c3RzIHRoZSBBVEgsIGtlZXBpbmcgdGhlIG9yaWdpbmFsIG5vaXNlIGZsb29yCisgKiAgYWZmZWN0cyB0aGUgaGlnaGVyIGZyZXF1ZW5jaWVzIG1vcmUgdGhhbiB0aGUgbG93ZXIgb25lcworICovCisKK0ZMT0FUCithdGhBZGp1c3QoRkxPQVQgYSwgRkxPQVQgeCwgRkxPQVQgYXRoRmxvb3IpCit7CisgICAgLyogIHdvcmsgaW4gcHJvZ3Jlc3MKKyAgICAgKi8KKyAgICBGTE9BVCBjb25zdCBvID0gOTAuMzA4NzMzNjI7CisgICAgRkxPQVQgY29uc3QgcCA9IDk0LjgyNDQ0ODYzOworICAgIEZMT0FUICAgdSA9IEZBU1RfTE9HMTBfWCh4LCAxMC4wKTsKKyAgICBGTE9BVCBjb25zdCB2ID0gYSAqIGE7CisgICAgRkxPQVQgICB3ID0gMC4wOworICAgIHUgLT0gYXRoRmxvb3I7ICAgICAgLyogdW5kbyBzY2FsaW5nICovCisgICAgaWYgKHYgPiAxRS0yMCkKKyAgICAgICAgdyA9IDEuICsgRkFTVF9MT0cxMF9YKHYsIDEwLjAgLyBvKTsKKyAgICBpZiAodyA8IDApCisgICAgICAgIHcgPSAwLjsKKyAgICB1ICo9IHc7CisgICAgdSArPSBhdGhGbG9vciArIG8gLSBwOyAvKiByZWRvIHNjYWxpbmcgKi8KKworICAgIHJldHVybiBwb3coMTAuLCAwLjEgKiB1KTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICBjYWxjX3htaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgQ2FsY3VsYXRlIHRoZSBhbGxvd2VkIGRpc3RvcnRpb24gZm9yIGVhY2ggc2NhbGVmYWN0b3IgYmFuZCwKKyAgYXMgZGV0ZXJtaW5lZCBieSB0aGUgcHN5Y2hvYWNvdXN0aWMgbW9kZWwuCisgIHhtaW4oc2IpID0gcmF0aW8oc2IpICogZW4oc2IpIC8gYncoc2IpCisKKyAgcmV0dXJucyBudW1iZXIgb2Ygc2ZiJ3Mgd2l0aCBlbmVyZ3kgPiBBVEgKKyovCitpbnQKK2NhbGNfeG1pbihsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLAorICAgICAgICAgIElJSV9wc3lfcmF0aW8gY29uc3QgKmNvbnN0IHJhdGlvLCBncl9pbmZvICogY29uc3QgY29kX2luZm8sIEZMT0FUICogcHhtaW4pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIHNmYiwgZ3NmYiwgaiA9IDAsIGF0aF9vdmVyID0gMCwgazsKKyAgICBBVEhfdCBjb25zdCAqY29uc3QgQVRIID0gZ2ZjLT5BVEg7CisgICAgY29uc3QgRkxPQVQgKmNvbnN0IHhyID0gY29kX2luZm8tPnhyOworICAgIGludCAgICAgbWF4X25vbnplcm87CisgICAgaW50IGNvbnN0IGVuYWJsZV9hdGhhYV9maXggPSAoZ2ZwLT5WQlIgPT0gdmJyX210cmgpID8gMSA6IDA7CisgICAgRkxPQVQgICBtYXNraW5nX2xvd2VyID0gZ2ZjLT5tYXNraW5nX2xvd2VyOworCisgICAgaWYgKGdmcC0+VkJSID09IHZicl9tdHJoIHx8IGdmcC0+VkJSID09IHZicl9tdCkgeworICAgICAgICBtYXNraW5nX2xvd2VyID0gMS4wZjsgLyogd2FzIGFscmVhZHkgZG9uZSBpbiBQU1ktTW9kZWwgKi8KKyAgICB9CisKKyAgICBmb3IgKGdzZmIgPSAwOyBnc2ZiIDwgY29kX2luZm8tPnBzeV9sbWF4OyBnc2ZiKyspIHsKKyAgICAgICAgRkxPQVQgICBlbjAsIHhtaW47CisgICAgICAgIEZMT0FUICAgcmgxLCByaDI7CisgICAgICAgIGludCAgICAgd2lkdGgsIGw7CisKKyAgICAgICAgaWYgKGdmcC0+VkJSID09IHZicl9yaCB8fCBnZnAtPlZCUiA9PSB2YnJfbXRyaCkKKyAgICAgICAgICAgIHhtaW4gPSBhdGhBZGp1c3QoQVRILT5hZGp1c3QsIEFUSC0+bFtnc2ZiXSwgQVRILT5mbG9vcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHhtaW4gPSBBVEgtPmFkanVzdCAqIEFUSC0+bFtnc2ZiXTsKKworICAgICAgICB3aWR0aCA9IGNvZF9pbmZvLT53aWR0aFtnc2ZiXTsKKyAgICAgICAgcmgxID0geG1pbiAvIHdpZHRoOworI2lmZGVmIERCTF9FUFNJTE9OCisgICAgICAgIHJoMiA9IERCTF9FUFNJTE9OOworI2Vsc2UKKyAgICAgICAgcmgyID0gMi4yMjA0NDYwNDkyNTAzMTMxZS0wMTY7CisjZW5kaWYKKyAgICAgICAgbCA9IHdpZHRoID4+IDE7CisgICAgICAgIGVuMCA9IDAuMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgRkxPQVQgICB4YSwgeGI7CisgICAgICAgICAgICB4YSA9IHhyW2pdICogeHJbal07CisgICAgICAgICAgICBlbjAgKz0geGE7CisgICAgICAgICAgICByaDIgKz0gKHhhIDwgcmgxKSA/IHhhIDogcmgxOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgeGIgPSB4cltqXSAqIHhyW2pdOworICAgICAgICAgICAgZW4wICs9IHhiOworICAgICAgICAgICAgcmgyICs9ICh4YiA8IHJoMSkgPyB4YiA6IHJoMTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfSB3aGlsZSAoLS1sID4gMCk7CisgICAgICAgIGlmIChlbjAgPiB4bWluKQorICAgICAgICAgICAgYXRoX292ZXIrKzsKKworICAgICAgICBpZiAoZ3NmYiA9PSBTQlBTWV9sKSB7CisgICAgICAgICAgICBGTE9BVCAgIHggPSB4bWluICogZ2ZjLT5uc1BzeS5sb25nZmFjdFtnc2ZiXTsKKyAgICAgICAgICAgIGlmIChyaDIgPCB4KSB7CisgICAgICAgICAgICAgICAgcmgyID0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZW5hYmxlX2F0aGFhX2ZpeCkgeworICAgICAgICAgICAgeG1pbiA9IHJoMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdmcC0+QVRIb25seSkgeworICAgICAgICAgICAgRkxPQVQgY29uc3QgZSA9IHJhdGlvLT5lbi5sW2dzZmJdOworICAgICAgICAgICAgaWYgKGUgPiAwLjBmKSB7CisgICAgICAgICAgICAgICAgRkxPQVQgICB4OworICAgICAgICAgICAgICAgIHggPSBlbjAgKiByYXRpby0+dGhtLmxbZ3NmYl0gKiBtYXNraW5nX2xvd2VyIC8gZTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlX2F0aGFhX2ZpeCkKKyAgICAgICAgICAgICAgICAgICAgeCAqPSBnZmMtPm5zUHN5LmxvbmdmYWN0W2dzZmJdOworICAgICAgICAgICAgICAgIGlmICh4bWluIDwgeCkKKyAgICAgICAgICAgICAgICAgICAgeG1pbiA9IHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZV9hdGhhYV9maXgpCisgICAgICAgICAgICAqcHhtaW4rKyA9IHhtaW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpweG1pbisrID0geG1pbiAqIGdmYy0+bnNQc3kubG9uZ2ZhY3RbZ3NmYl07CisgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbG9uZyBibG9jayBsb29wICovCisKKworCisKKyAgICAvKnVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgaGlnaGVzdCBub24temVybyBjb2VmZiAqLworICAgIG1heF9ub256ZXJvID0gNTc1OworICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFKSB7IC8qIE5PUk0sIFNUQVJUIG9yIFNUT1AgdHlwZSwgYnV0IG5vdCBTSE9SVCAqLworICAgICAgICBrID0gNTc2OworICAgICAgICB3aGlsZSAoay0tICYmIEVRKHhyW2tdLCAwKSkgeworICAgICAgICAgICAgbWF4X25vbnplcm8gPSBrOworICAgICAgICB9CisgICAgfQorICAgIGNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZiA9IG1heF9ub256ZXJvOworCisKKworICAgIGZvciAoc2ZiID0gY29kX2luZm8tPnNmYl9zbWluOyBnc2ZiIDwgY29kX2luZm8tPnBzeW1heDsgc2ZiKyssIGdzZmIgKz0gMykgeworICAgICAgICBpbnQgICAgIHdpZHRoLCBiOworICAgICAgICBGTE9BVCAgIHRtcEFUSDsKKyAgICAgICAgaWYgKGdmcC0+VkJSID09IHZicl9yaCB8fCBnZnAtPlZCUiA9PSB2YnJfbXRyaCkKKyAgICAgICAgICAgIHRtcEFUSCA9IGF0aEFkanVzdChBVEgtPmFkanVzdCwgQVRILT5zW3NmYl0sIEFUSC0+Zmxvb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXBBVEggPSBBVEgtPmFkanVzdCAqIEFUSC0+c1tzZmJdOworCisgICAgICAgIHdpZHRoID0gY29kX2luZm8tPndpZHRoW2dzZmJdOworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgMzsgYisrKSB7CisgICAgICAgICAgICBGTE9BVCAgIGVuMCA9IDAuMCwgeG1pbjsKKyAgICAgICAgICAgIEZMT0FUICAgcmgxLCByaDI7CisgICAgICAgICAgICBpbnQgICAgIGwgPSB3aWR0aCA+PiAxOworCisgICAgICAgICAgICByaDEgPSB0bXBBVEggLyB3aWR0aDsKKyNpZmRlZiBEQkxfRVBTSUxPTgorICAgICAgICAgICAgcmgyID0gREJMX0VQU0lMT047CisjZWxzZQorICAgICAgICAgICAgcmgyID0gMi4yMjA0NDYwNDkyNTAzMTMxZS0wMTY7CisjZW5kaWYKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBGTE9BVCAgIHhhLCB4YjsKKyAgICAgICAgICAgICAgICB4YSA9IHhyW2pdICogeHJbal07CisgICAgICAgICAgICAgICAgZW4wICs9IHhhOworICAgICAgICAgICAgICAgIHJoMiArPSAoeGEgPCByaDEpID8geGEgOiByaDE7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIHhiID0geHJbal0gKiB4cltqXTsKKyAgICAgICAgICAgICAgICBlbjAgKz0geGI7CisgICAgICAgICAgICAgICAgcmgyICs9ICh4YiA8IHJoMSkgPyB4YiA6IHJoMTsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9IHdoaWxlICgtLWwgPiAwKTsKKyAgICAgICAgICAgIGlmIChlbjAgPiB0bXBBVEgpCisgICAgICAgICAgICAgICAgYXRoX292ZXIrKzsKKyAgICAgICAgICAgIGlmIChzZmIgPT0gU0JQU1lfcykgeworICAgICAgICAgICAgICAgIEZMT0FUICAgeCA9IHRtcEFUSCAqIGdmYy0+bnNQc3kuc2hvcnRmYWN0W3NmYl07CisgICAgICAgICAgICAgICAgaWYgKHJoMiA8IHgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmgyID0geDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5hYmxlX2F0aGFhX2ZpeCkKKyAgICAgICAgICAgICAgICB4bWluID0gcmgyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHhtaW4gPSB0bXBBVEg7CisKKyAgICAgICAgICAgIGlmICghZ2ZwLT5BVEhvbmx5ICYmICFnZnAtPkFUSHNob3J0KSB7CisgICAgICAgICAgICAgICAgRkxPQVQgY29uc3QgZSA9IHJhdGlvLT5lbi5zW3NmYl1bYl07CisgICAgICAgICAgICAgICAgaWYgKGUgPiAwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIEZMT0FUICAgeDsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGVuMCAqIHJhdGlvLT50aG0uc1tzZmJdW2JdICogbWFza2luZ19sb3dlciAvIGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVfYXRoYWFfZml4KQorICAgICAgICAgICAgICAgICAgICAgICAgeCAqPSBnZmMtPm5zUHN5LnNob3J0ZmFjdFtzZmJdOworICAgICAgICAgICAgICAgICAgICBpZiAoeG1pbiA8IHgpCisgICAgICAgICAgICAgICAgICAgICAgICB4bWluID0geDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5hYmxlX2F0aGFhX2ZpeCkKKyAgICAgICAgICAgICAgICAqcHhtaW4rKyA9IHhtaW47CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKnB4bWluKysgPSB4bWluICogZ2ZjLT5uc1BzeS5zaG9ydGZhY3Rbc2ZiXTsKKyAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGIgKi8KKyAgICAgICAgaWYgKGdmcC0+dXNlVGVtcG9yYWwpIHsKKyAgICAgICAgICAgIGlmIChweG1pblstM10gPiBweG1pblstMyArIDFdKQorICAgICAgICAgICAgICAgIHB4bWluWy0zICsgMV0gKz0gKHB4bWluWy0zXSAtIHB4bWluWy0zICsgMV0pICogZ2ZjLT5kZWNheTsKKyAgICAgICAgICAgIGlmIChweG1pblstMyArIDFdID4gcHhtaW5bLTMgKyAyXSkKKyAgICAgICAgICAgICAgICBweG1pblstMyArIDJdICs9IChweG1pblstMyArIDFdIC0gcHhtaW5bLTMgKyAyXSkgKiBnZmMtPmRlY2F5OworICAgICAgICB9CisgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc2hvcnQgYmxvY2sgc2ZiIGxvb3AgKi8KKworICAgIHJldHVybiBhdGhfb3ZlcjsKK30KKworCitzdGF0aWMgIEZMT0FUCitjYWxjX25vaXNlX2NvcmVfYyhjb25zdCBncl9pbmZvICogY29uc3QgY29kX2luZm8sIGludCAqc3RhcnRsaW5lLCBpbnQgbCwgRkxPQVQgc3RlcCkKK3sKKyAgICBGTE9BVCAgIG5vaXNlID0gMDsKKyAgICBpbnQgICAgIGogPSAqc3RhcnRsaW5lOworICAgIGNvbnN0IGludCAqY29uc3QgaXggPSBjb2RfaW5mby0+bDNfZW5jOworCisgICAgaWYgKGogPiBjb2RfaW5mby0+Y291bnQxKSB7CisgICAgICAgIHdoaWxlIChsLS0pIHsKKyAgICAgICAgICAgIEZMT0FUICAgdGVtcDsKKyAgICAgICAgICAgIHRlbXAgPSBjb2RfaW5mby0+eHJbal07CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBub2lzZSArPSB0ZW1wICogdGVtcDsKKyAgICAgICAgICAgIHRlbXAgPSBjb2RfaW5mby0+eHJbal07CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBub2lzZSArPSB0ZW1wICogdGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChqID4gY29kX2luZm8tPmJpZ192YWx1ZXMpIHsKKyAgICAgICAgRkxPQVQgICBpeDAxWzJdOworICAgICAgICBpeDAxWzBdID0gMDsKKyAgICAgICAgaXgwMVsxXSA9IHN0ZXA7CisgICAgICAgIHdoaWxlIChsLS0pIHsKKyAgICAgICAgICAgIEZMT0FUICAgdGVtcDsKKyAgICAgICAgICAgIHRlbXAgPSBmYWJzKGNvZF9pbmZvLT54cltqXSkgLSBpeDAxW2l4W2pdXTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIG5vaXNlICs9IHRlbXAgKiB0ZW1wOworICAgICAgICAgICAgdGVtcCA9IGZhYnMoY29kX2luZm8tPnhyW2pdKSAtIGl4MDFbaXhbal1dOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgbm9pc2UgKz0gdGVtcCAqIHRlbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHdoaWxlIChsLS0pIHsKKyAgICAgICAgICAgIEZMT0FUICAgdGVtcDsKKyAgICAgICAgICAgIHRlbXAgPSBmYWJzKGNvZF9pbmZvLT54cltqXSkgLSBwb3c0M1tpeFtqXV0gKiBzdGVwOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgbm9pc2UgKz0gdGVtcCAqIHRlbXA7CisgICAgICAgICAgICB0ZW1wID0gZmFicyhjb2RfaW5mby0+eHJbal0pIC0gcG93NDNbaXhbal1dICogc3RlcDsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIG5vaXNlICs9IHRlbXAgKiB0ZW1wOworICAgICAgICB9CisgICAgfQorCisgICAgKnN0YXJ0bGluZSA9IGo7CisgICAgcmV0dXJuIG5vaXNlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICBjYWxjX25vaXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogLW9vIGRCICA9PiAgLTEuMDAgKi8KKy8qIC0gNiBkQiAgPT4gIC0wLjk3ICovCisvKiAtIDMgZEIgID0+ICAtMC44MCAqLworLyogLSAyIGRCICA9PiAgLTAuNjQgKi8KKy8qIC0gMSBkQiAgPT4gIC0wLjM4ICovCisvKiAgIDAgZEIgID0+ICAgMC4wMCAqLworLyogKyAxIGRCICA9PiAgKzAuNDkgKi8KKy8qICsgMiBkQiAgPT4gICsxLjA2ICovCisvKiArIDMgZEIgID0+ICArMS42OCAqLworLyogKyA2IGRCICA9PiAgKzMuNjkgKi8KKy8qICsxMCBkQiAgPT4gICs2LjQ1ICovCisKK2ludAorY2FsY19ub2lzZShncl9pbmZvIGNvbnN0ICpjb25zdCBjb2RfaW5mbywKKyAgICAgICAgICAgRkxPQVQgY29uc3QgKmwzX3htaW4sCisgICAgICAgICAgIEZMT0FUICogZGlzdG9ydCwgY2FsY19ub2lzZV9yZXN1bHQgKiBjb25zdCByZXMsIGNhbGNfbm9pc2VfZGF0YSAqIHByZXZfbm9pc2UpCit7CisgICAgaW50ICAgICBzZmIsIGwsIG92ZXIgPSAwOworICAgIEZMT0FUICAgb3Zlcl9ub2lzZV9kYiA9IDA7CisgICAgRkxPQVQgICB0b3Rfbm9pc2VfZGIgPSAwOyAvKiAgICAwIGRCIHJlbGF0aXZlIHRvIG1hc2tpbmcgKi8KKyAgICBGTE9BVCAgIG1heF9ub2lzZSA9IC0yMC4wOyAvKiAtMjAwIGRCIHJlbGF0aXZlIHRvIG1hc2tpbmcgKi8KKyAgICBpbnQgICAgIGogPSAwOworICAgIGNvbnN0IGludCAqc2NhbGVmYWMgPSBjb2RfaW5mby0+c2NhbGVmYWM7CisKKyAgICByZXMtPm92ZXJfU1NEID0gMDsKKworCisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBjb2RfaW5mby0+cHN5bWF4OyBzZmIrKykgeworICAgICAgICBpbnQgY29uc3QgcyA9CisgICAgICAgICAgICBjb2RfaW5mby0+Z2xvYmFsX2dhaW4gLSAoKCgqc2NhbGVmYWMrKykgKyAoY29kX2luZm8tPnByZWZsYWcgPyBwcmV0YWJbc2ZiXSA6IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgKyAxKSkKKyAgICAgICAgICAgIC0gY29kX2luZm8tPnN1YmJsb2NrX2dhaW5bY29kX2luZm8tPndpbmRvd1tzZmJdXSAqIDg7CisgICAgICAgIEZMT0FUICAgbm9pc2UgPSAwLjA7CisKKyAgICAgICAgaWYgKHByZXZfbm9pc2UgJiYgKHByZXZfbm9pc2UtPnN0ZXBbc2ZiXSA9PSBzKSkgeworCisgICAgICAgICAgICAvKiB1c2UgcHJldmlvdXNseSBjb21wdXRlZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgIG5vaXNlID0gcHJldl9ub2lzZS0+bm9pc2Vbc2ZiXTsKKyAgICAgICAgICAgIGogKz0gY29kX2luZm8tPndpZHRoW3NmYl07CisgICAgICAgICAgICAqZGlzdG9ydCsrID0gbm9pc2UgLyAqbDNfeG1pbisrOworCisgICAgICAgICAgICBub2lzZSA9IHByZXZfbm9pc2UtPm5vaXNlX2xvZ1tzZmJdOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBGTE9BVCBjb25zdCBzdGVwID0gUE9XMjAocyk7CisgICAgICAgICAgICBsID0gY29kX2luZm8tPndpZHRoW3NmYl0gPj4gMTsKKworICAgICAgICAgICAgaWYgKChqICsgY29kX2luZm8tPndpZHRoW3NmYl0pID4gY29kX2luZm8tPm1heF9ub256ZXJvX2NvZWZmKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICB1c2VmdWxsc2l6ZTsKKyAgICAgICAgICAgICAgICB1c2VmdWxsc2l6ZSA9IGNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZiAtIGogKyAxOworCisgICAgICAgICAgICAgICAgaWYgKHVzZWZ1bGxzaXplID4gMCkKKyAgICAgICAgICAgICAgICAgICAgbCA9IHVzZWZ1bGxzaXplID4+IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm9pc2UgPSBjYWxjX25vaXNlX2NvcmVfYyhjb2RfaW5mbywgJmosIGwsIHN0ZXApOworCisKKyAgICAgICAgICAgIGlmIChwcmV2X25vaXNlKSB7CisgICAgICAgICAgICAgICAgLyogc2F2ZSBub2lzZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBwcmV2X25vaXNlLT5zdGVwW3NmYl0gPSBzOworICAgICAgICAgICAgICAgIHByZXZfbm9pc2UtPm5vaXNlW3NmYl0gPSBub2lzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm9pc2UgPSAqZGlzdG9ydCsrID0gbm9pc2UgLyAqbDNfeG1pbisrOworCisgICAgICAgICAgICAvKiBtdWx0aXBseWluZyBoZXJlIGlzIGFkZGluZyBpbiBkQiwgYnV0IGNhbiBvdmVyZmxvdyAqLworICAgICAgICAgICAgbm9pc2UgPSBGQVNUX0xPRzEwKE1heChub2lzZSwgMUUtMjApKTsKKworICAgICAgICAgICAgaWYgKHByZXZfbm9pc2UpIHsKKyAgICAgICAgICAgICAgICAvKiBzYXZlIG5vaXNlIHZhbHVlcyAqLworICAgICAgICAgICAgICAgIHByZXZfbm9pc2UtPm5vaXNlX2xvZ1tzZmJdID0gbm9pc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJldl9ub2lzZSkgeworICAgICAgICAgICAgLyogc2F2ZSBub2lzZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgIHByZXZfbm9pc2UtPmdsb2JhbF9nYWluID0gY29kX2luZm8tPmdsb2JhbF9nYWluOzsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyp0b3Rfbm9pc2UgKj0gTWF4KG5vaXNlLCAxRS0yMCk7ICovCisgICAgICAgIHRvdF9ub2lzZV9kYiArPSBub2lzZTsKKworICAgICAgICBpZiAobm9pc2UgPiAwLjApIHsKKyAgICAgICAgICAgIGludCAgICAgdG1wOworCisgICAgICAgICAgICB0bXAgPSBNYXgoKGludCkgKG5vaXNlICogMTAgKyAuNSksIDEpOworICAgICAgICAgICAgcmVzLT5vdmVyX1NTRCArPSB0bXAgKiB0bXA7CisKKyAgICAgICAgICAgIG92ZXIrKzsKKyAgICAgICAgICAgIC8qIG11bHRpcGx5aW5nIGhlcmUgaXMgYWRkaW5nIGluIGRCIC1idXQgY2FuIG92ZXJmbG93ICovCisgICAgICAgICAgICAvKm92ZXJfbm9pc2UgKj0gbm9pc2U7ICovCisgICAgICAgICAgICBvdmVyX25vaXNlX2RiICs9IG5vaXNlOworICAgICAgICB9CisgICAgICAgIG1heF9ub2lzZSA9IE1heChtYXhfbm9pc2UsIG5vaXNlKTsKKworICAgIH0KKworICAgIHJlcy0+b3Zlcl9jb3VudCA9IG92ZXI7CisgICAgcmVzLT50b3Rfbm9pc2UgPSB0b3Rfbm9pc2VfZGI7CisgICAgcmVzLT5vdmVyX25vaXNlID0gb3Zlcl9ub2lzZV9kYjsKKyAgICByZXMtPm1heF9ub2lzZSA9IG1heF9ub2lzZTsKKworICAgIHJldHVybiBvdmVyOworfQorCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgc2V0X3BpbmZvKCkKKyAqCisgKiAgdXBkYXRlcyBwbG90dGluZyBkYXRhICAgIAorICoKKyAqICBNYXJrIFRheWxvciAyMDAwLT8/LT8/ICAgICAgICAgICAgICAgIAorICoKKyAqICBSb2JlcnQgSGVnZW1hbm46IG1vdmVkIG5vaXNlL2Rpc3RvcnRpb24gY2FsYyBpbnRvIGl0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK3NldF9waW5mbyhsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLAorICAgICAgICAgIGdyX2luZm8gKiBjb25zdCBjb2RfaW5mbywgY29uc3QgSUlJX3BzeV9yYXRpbyAqIGNvbnN0IHJhdGlvLCBjb25zdCBpbnQgZ3IsIGNvbnN0IGludCBjaCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgc2ZiLCBzZmIyOworICAgIGludCAgICAgaiwgaSwgbCwgc3RhcnQsIGVuZCwgYnc7CisgICAgRkxPQVQgICBlbjAsIGVuMTsKKyAgICBGTE9BVCBjb25zdCBpZnFzdGVwID0gKGNvZF9pbmZvLT5zY2FsZWZhY19zY2FsZSA9PSAwKSA/IC41IDogMS4wOworICAgIGludCBjb25zdCAqY29uc3Qgc2NhbGVmYWMgPSBjb2RfaW5mby0+c2NhbGVmYWM7CisKKyAgICBGTE9BVCAgIGwzX3htaW5bU0ZCTUFYXSwgeGZzZltTRkJNQVhdOworICAgIGNhbGNfbm9pc2VfcmVzdWx0IG5vaXNlOworCisgICAgKHZvaWQpIGNhbGNfeG1pbihnZnAsIHJhdGlvLCBjb2RfaW5mbywgbDNfeG1pbik7CisgICAgKHZvaWQpIGNhbGNfbm9pc2UoY29kX2luZm8sIGwzX3htaW4sIHhmc2YsICZub2lzZSwgMCk7CisKKyAgICBqID0gMDsKKyAgICBzZmIyID0gY29kX2luZm8tPnNmYl9sbWF4OworICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFICYmICFjb2RfaW5mby0+bWl4ZWRfYmxvY2tfZmxhZykKKyAgICAgICAgc2ZiMiA9IDIyOworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiMjsgc2ZiKyspIHsKKyAgICAgICAgc3RhcnQgPSBnZmMtPnNjYWxlZmFjX2JhbmQubFtzZmJdOworICAgICAgICBlbmQgPSBnZmMtPnNjYWxlZmFjX2JhbmQubFtzZmIgKyAxXTsKKyAgICAgICAgYncgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgZm9yIChlbjAgPSAwLjA7IGogPCBlbmQ7IGorKykKKyAgICAgICAgICAgIGVuMCArPSBjb2RfaW5mby0+eHJbal0gKiBjb2RfaW5mby0+eHJbal07CisgICAgICAgIGVuMCAvPSBidzsKKyAgICAgICAgLyogY29udmVydCB0byBNRENUIHVuaXRzICovCisgICAgICAgIGVuMSA9IDFlMTU7ICAgICAvKiBzY2FsaW5nIHNvIGl0IHNob3dzIHVwIG9uIEZGVCBwbG90ICovCisgICAgICAgIGdmYy0+cGluZm8tPmVuW2dyXVtjaF1bc2ZiXSA9IGVuMSAqIGVuMDsKKyAgICAgICAgZ2ZjLT5waW5mby0+eGZzZltncl1bY2hdW3NmYl0gPSBlbjEgKiBsM194bWluW3NmYl0gKiB4ZnNmW3NmYl0gLyBidzsKKworICAgICAgICBpZiAocmF0aW8tPmVuLmxbc2ZiXSA+IDAgJiYgIWdmcC0+QVRIb25seSkKKyAgICAgICAgICAgIGVuMCA9IGVuMCAvIHJhdGlvLT5lbi5sW3NmYl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVuMCA9IDAuMDsKKworICAgICAgICBnZmMtPnBpbmZvLT50aHJbZ3JdW2NoXVtzZmJdID0gZW4xICogTWF4KGVuMCAqIHJhdGlvLT50aG0ubFtzZmJdLCBnZmMtPkFUSC0+bFtzZmJdKTsKKworICAgICAgICAvKiB0aGVyZSBpcyBubyBzY2FsZWZhY3RvciBiYW5kcyA+PSBTQlBTWV9sICovCisgICAgICAgIGdmYy0+cGluZm8tPkxBTUVzZmJbZ3JdW2NoXVtzZmJdID0gMDsKKyAgICAgICAgaWYgKGNvZF9pbmZvLT5wcmVmbGFnICYmIHNmYiA+PSAxMSkKKyAgICAgICAgICAgIGdmYy0+cGluZm8tPkxBTUVzZmJbZ3JdW2NoXVtzZmJdID0gLWlmcXN0ZXAgKiBwcmV0YWJbc2ZiXTsKKworICAgICAgICBpZiAoc2ZiIDwgU0JQU1lfbCkgeworICAgICAgICAgICAgYXNzZXJ0KHNjYWxlZmFjW3NmYl0gPj0gMCk7IC8qIHNjZnNpIHNob3VsZCBiZSBkZWNvZGVkIGJ5IGNhbGxlciBzaWRlICovCisgICAgICAgICAgICBnZmMtPnBpbmZvLT5MQU1Fc2ZiW2dyXVtjaF1bc2ZiXSAtPSBpZnFzdGVwICogc2NhbGVmYWNbc2ZiXTsKKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yIHNmYiAqLworCisgICAgaWYgKGNvZF9pbmZvLT5ibG9ja190eXBlID09IFNIT1JUX1RZUEUpIHsKKyAgICAgICAgc2ZiMiA9IHNmYjsKKyAgICAgICAgZm9yIChzZmIgPSBjb2RfaW5mby0+c2ZiX3NtaW47IHNmYiA8IFNCTUFYX3M7IHNmYisrKSB7CisgICAgICAgICAgICBzdGFydCA9IGdmYy0+c2NhbGVmYWNfYmFuZC5zW3NmYl07CisgICAgICAgICAgICBlbmQgPSBnZmMtPnNjYWxlZmFjX2JhbmQuc1tzZmIgKyAxXTsKKyAgICAgICAgICAgIGJ3ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChlbjAgPSAwLjAsIGwgPSBzdGFydDsgbCA8IGVuZDsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVuMCArPSBjb2RfaW5mby0+eHJbal0gKiBjb2RfaW5mby0+eHJbal07CisgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW4wID0gTWF4KGVuMCAvIGJ3LCAxZS0yMCk7CisgICAgICAgICAgICAgICAgLyogY29udmVydCB0byBNRENUIHVuaXRzICovCisgICAgICAgICAgICAgICAgZW4xID0gMWUxNTsgLyogc2NhbGluZyBzbyBpdCBzaG93cyB1cCBvbiBGRlQgcGxvdCAqLworCisgICAgICAgICAgICAgICAgZ2ZjLT5waW5mby0+ZW5fc1tncl1bY2hdWzMgKiBzZmIgKyBpXSA9IGVuMSAqIGVuMDsKKyAgICAgICAgICAgICAgICBnZmMtPnBpbmZvLT54ZnNmX3NbZ3JdW2NoXVszICogc2ZiICsgaV0gPSBlbjEgKiBsM194bWluW3NmYjJdICogeGZzZltzZmIyXSAvIGJ3OworICAgICAgICAgICAgICAgIGlmIChyYXRpby0+ZW4uc1tzZmJdW2ldID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZW4wID0gZW4wIC8gcmF0aW8tPmVuLnNbc2ZiXVtpXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVuMCA9IDAuMDsKKyAgICAgICAgICAgICAgICBpZiAoZ2ZwLT5BVEhvbmx5IHx8IGdmcC0+QVRIc2hvcnQpCisgICAgICAgICAgICAgICAgICAgIGVuMCA9IDA7CisKKyAgICAgICAgICAgICAgICBnZmMtPnBpbmZvLT50aHJfc1tncl1bY2hdWzMgKiBzZmIgKyBpXSA9CisgICAgICAgICAgICAgICAgICAgIGVuMSAqIE1heChlbjAgKiByYXRpby0+dGhtLnNbc2ZiXVtpXSwgZ2ZjLT5BVEgtPnNbc2ZiXSk7CisKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSBpcyBubyBzY2FsZWZhY3RvciBiYW5kcyA+PSBTQlBTWV9zICovCisgICAgICAgICAgICAgICAgZ2ZjLT5waW5mby0+TEFNRXNmYl9zW2dyXVtjaF1bMyAqIHNmYiArIGldCisgICAgICAgICAgICAgICAgICAgID0gLTIuMCAqIGNvZF9pbmZvLT5zdWJibG9ja19nYWluW2ldOworICAgICAgICAgICAgICAgIGlmIChzZmIgPCBTQlBTWV9zKSB7CisgICAgICAgICAgICAgICAgICAgIGdmYy0+cGluZm8tPkxBTUVzZmJfc1tncl1bY2hdWzMgKiBzZmIgKyBpXSAtPSBpZnFzdGVwICogc2NhbGVmYWNbc2ZiMl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNmYjIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgLyogYmxvY2sgdHlwZSBzaG9ydCAqLworICAgIGdmYy0+cGluZm8tPkxBTUVxc3NbZ3JdW2NoXSA9IGNvZF9pbmZvLT5nbG9iYWxfZ2FpbjsKKyAgICBnZmMtPnBpbmZvLT5MQU1FbWFpbmJpdHNbZ3JdW2NoXSA9IGNvZF9pbmZvLT5wYXJ0Ml8zX2xlbmd0aCArIGNvZF9pbmZvLT5wYXJ0Ml9sZW5ndGg7CisgICAgZ2ZjLT5waW5mby0+TEFNRXNmYml0c1tncl1bY2hdID0gY29kX2luZm8tPnBhcnQyX2xlbmd0aDsKKworICAgIGdmYy0+cGluZm8tPm92ZXJbZ3JdW2NoXSA9IG5vaXNlLm92ZXJfY291bnQ7CisgICAgZ2ZjLT5waW5mby0+bWF4X25vaXNlW2dyXVtjaF0gPSBub2lzZS5tYXhfbm9pc2UgKiAxMC4wOworICAgIGdmYy0+cGluZm8tPm92ZXJfbm9pc2VbZ3JdW2NoXSA9IG5vaXNlLm92ZXJfbm9pc2UgKiAxMC4wOworICAgIGdmYy0+cGluZm8tPnRvdF9ub2lzZVtncl1bY2hdID0gbm9pc2UudG90X25vaXNlICogMTAuMDsKKyAgICBnZmMtPnBpbmZvLT5vdmVyX1NTRFtncl1bY2hdID0gbm9pc2Uub3Zlcl9TU0Q7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBzZXRfZnJhbWVfcGluZm8oKQorICoKKyAqICB1cGRhdGVzIHBsb3R0aW5nIGRhdGEgZm9yIGEgd2hvbGUgZnJhbWUgIAorICoKKyAqICBSb2JlcnQgSGVnZW1hbm4gMjAwMC0xMC0yMSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorc2V0X2ZyYW1lX3BpbmZvKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIElJSV9wc3lfcmF0aW8gcmF0aW9bMl1bMl0pCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGNoOworICAgIGludCAgICAgZ3I7CisKKyAgICBnZmMtPm1hc2tpbmdfbG93ZXIgPSAxLjA7CisKKyAgICAvKiBmb3IgZXZlcnkgZ3JhbnVsZSBhbmQgY2hhbm5lbCBwYXRjaCBsM19lbmMgYW5kIHNldCBpbmZvCisgICAgICovCisgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLT5tb2RlX2dyOyBncisrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICBncl9pbmZvICpjb25zdCBjb2RfaW5mbyA9ICZnZmMtPmwzX3NpZGUudHRbZ3JdW2NoXTsKKyAgICAgICAgICAgIGludCAgICAgc2NhbGVmYWNfc2F2W1NGQk1BWF07CisgICAgICAgICAgICBtZW1jcHkoc2NhbGVmYWNfc2F2LCBjb2RfaW5mby0+c2NhbGVmYWMsIHNpemVvZihzY2FsZWZhY19zYXYpKTsKKworICAgICAgICAgICAgLyogcmVjb25zdHJ1Y3QgdGhlIHNjYWxlZmFjdG9ycyBpbiBjYXNlIFNDRlNJIHdhcyB1c2VkIAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZ3IgPT0gMSkgeworICAgICAgICAgICAgICAgIGludCAgICAgc2ZiOworICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgY29kX2luZm8tPnNmYl9sbWF4OyBzZmIrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kX2luZm8tPnNjYWxlZmFjW3NmYl0gPCAwKSAvKiBzY2ZzaSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29kX2luZm8tPnNjYWxlZmFjW3NmYl0gPSBnZmMtPmwzX3NpZGUudHRbMF1bY2hdLnNjYWxlZmFjW3NmYl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXRfcGluZm8oZ2ZwLCBjb2RfaW5mbywgJnJhdGlvW2dyXVtjaF0sIGdyLCBjaCk7CisgICAgICAgICAgICBtZW1jcHkoY29kX2luZm8tPnNjYWxlZmFjLCBzY2FsZWZhY19zYXYsIHNpemVvZihzY2FsZWZhY19zYXYpKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciBjaCAqLworICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yIGdyICovCit9CmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3F1YW50aXplX3B2dC5oIGIvbGlibXAzbGFtZS9xdWFudGl6ZV9wdnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTQxMTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9xdWFudGl6ZV9wdnQuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqCXF1YW50aXplX3B2dCBpbmNsdWRlIGZpbGUKKyAqCisgKglDb3B5cmlnaHQgKGMpIDE5OTkgVGFrZWhpcm8gVE9NSU5BR0EKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBMQU1FX1FVQU5USVpFX1BWVF9ICisjZGVmaW5lIExBTUVfUVVBTlRJWkVfUFZUX0gKKworI2RlZmluZSBJWE1BWF9WQUwgODIwNiAgLyogaXggYWx3YXlzIDw9IDgxOTErMTUuICAgIHNlZSBjb3VudF9iaXRzKCkgKi8KKworLyogYnVnZ3kgV2luYW1wIGRlY29kZXIgY2Fubm90IGhhbmRsZSB2YWx1ZXMgPiA4MTkxICovCisvKiAjZGVmaW5lIElYTUFYX1ZBTCA4MTkxICovCisKKyNkZWZpbmUgUFJFQ0FMQ19TSVpFIChJWE1BWF9WQUwrMikKKworCitleHRlcm4gY29uc3QgaW50IG5yX29mX3NmYl9ibG9ja1s2XVszXVs0XTsKK2V4dGVybiBjb25zdCBpbnQgcHJldGFiW1NCTUFYX2xdOworZXh0ZXJuIGNvbnN0IGludCBzbGVuMV90YWJbMTZdOworZXh0ZXJuIGNvbnN0IGludCBzbGVuMl90YWJbMTZdOworCitleHRlcm4gY29uc3Qgc2NhbGVmYWNfc3RydWN0IHNmQmFuZEluZGV4WzldOworCitleHRlcm4gRkxPQVQgcG93NDNbUFJFQ0FMQ19TSVpFXTsKKyNpZmRlZiBUQUtFSElST19JRUVFNzU0X0hBQ0sKK2V4dGVybiBGTE9BVCBhZGo0M2FzbVtQUkVDQUxDX1NJWkVdOworI2Vsc2UKK2V4dGVybiBGTE9BVCBhZGo0M1tQUkVDQUxDX1NJWkVdOworI2VuZGlmCisKKyNkZWZpbmUgUV9NQVggKDI1NisxKQorI2RlZmluZSBRX01BWDIgMTE2ICAgICAgLyogbWluaW11bSBwb3NzaWJsZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC1jb2RfaW5mby0+Z2xvYmFsX2dhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChzY2FsZWZhY1tdICsgKGNvZF9pbmZvLT5wcmVmbGFnID8gcHJldGFiW3NmYl0gOiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29kX2luZm8tPnN1YmJsb2NrX2dhaW5bY29kX2luZm8tPndpbmRvd1tzZmJdXSAqIDg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb25nIGJsb2NrLCAwKygoMTUrMyk8PDIpID0gMTgqNCA9IDcyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2hvcnQgYmxvY2ssIDArKDE1PDwyKSs3KjggPSAxNSo0KzU2ID0gMTE2CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworZXh0ZXJuIEZMT0FUIHBvdzIwW1FfTUFYICsgUV9NQVgyICsgMV07CitleHRlcm4gRkxPQVQgaXBvdzIwW1FfTUFYXTsKK2V4dGVybiBGTE9BVCBpaXBvdzIwW1FfTUFYMiArIDFdOworCit0eXBlZGVmIHN0cnVjdCBjYWxjX25vaXNlX3Jlc3VsdF90IHsKKyAgICBGTE9BVCAgIG92ZXJfbm9pc2U7ICAgICAgLyogc3VtIG9mIHF1YW50aXphdGlvbiBub2lzZSA+IG1hc2tpbmcgKi8KKyAgICBGTE9BVCAgIHRvdF9ub2lzZTsgICAgICAgLyogc3VtIG9mIGFsbCBxdWFudGl6YXRpb24gbm9pc2UgKi8KKyAgICBGTE9BVCAgIG1heF9ub2lzZTsgICAgICAgLyogbWF4IHF1YW50aXphdGlvbiBub2lzZSAqLworICAgIGludCAgICAgb3Zlcl9jb3VudDsgICAgICAvKiBudW1iZXIgb2YgcXVhbnRpemF0aW9uIG5vaXNlID4gbWFza2luZyAqLworICAgIGludCAgICAgb3Zlcl9TU0Q7ICAgICAgICAvKiBTU0QtbGlrZSBjb3N0IG9mIGRpc3RvcnRlZCBiYW5kcyAqLworICAgIGludCAgICAgYml0czsKK30gY2FsY19ub2lzZV9yZXN1bHQ7CisKKworLyoqCisqIGFsbG93cyByZS11c2Ugb2YgcHJldmlvdXNseQorKiBjb21wdXRlZCBub2lzZSB2YWx1ZXMKKyovCit0eXBlZGVmIHN0cnVjdCBjYWxjX25vaXNlX2RhdGFfdCB7CisgICAgaW50ICAgICBnbG9iYWxfZ2FpbjsKKyAgICBpbnQgICAgIHNmYl9jb3VudDE7CisgICAgaW50ICAgICBzdGVwWzM5XTsKKyAgICBGTE9BVCAgIG5vaXNlWzM5XTsKKyAgICBGTE9BVCAgIG5vaXNlX2xvZ1szOV07Cit9IGNhbGNfbm9pc2VfZGF0YTsKKworCitpbnQgICAgIG9uX3BlKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIEZMT0FUIHBlWzJdWzJdLAorICAgICAgICAgICAgICBpbnQgdGFyZ19iaXRzWzJdLCBpbnQgbWVhbl9iaXRzLCBpbnQgZ3IsIGludCBjYnIpOworCit2b2lkICAgIHJlZHVjZV9zaWRlKGludCB0YXJnX2JpdHNbMl0sIEZMT0FUIG1zX2VuZXJfcmF0aW8sIGludCBtZWFuX2JpdHMsIGludCBtYXhfYml0cyk7CisKKwordm9pZCAgICBpdGVyYXRpb25faW5pdChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCk7CisKKworaW50ICAgICBjYWxjX3htaW4obGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwKKyAgICAgICAgICAgICAgICAgIElJSV9wc3lfcmF0aW8gY29uc3QgKmNvbnN0IHJhdGlvLCBncl9pbmZvICogY29uc3QgY29kX2luZm8sIEZMT0FUICogbDNfeG1pbik7CisKK2ludCAgICAgY2FsY19ub2lzZShjb25zdCBncl9pbmZvICogY29uc3QgY29kX2luZm8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRkxPQVQgKiBsM194bWluLAorICAgICAgICAgICAgICAgICAgIEZMT0FUICogZGlzdG9ydCwgY2FsY19ub2lzZV9yZXN1bHQgKiBjb25zdCByZXMsIGNhbGNfbm9pc2VfZGF0YSAqIHByZXZfbm9pc2UpOworCit2b2lkICAgIHNldF9mcmFtZV9waW5mbyhsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBJSUlfcHN5X3JhdGlvIHJhdGlvWzJdWzJdKTsKKworCisKKworLyogdGFrZWhpcm8uYyAqLworCitpbnQgICAgIGNvdW50X2JpdHMobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjLCBjb25zdCBGTE9BVCAqIGNvbnN0IHhyLAorICAgICAgICAgICAgICAgICAgIGdyX2luZm8gKiBjb25zdCBjb2RfaW5mbywgY2FsY19ub2lzZV9kYXRhICogcHJldl9ub2lzZSk7CitpbnQgICAgIG5vcXVhbnRfY291bnRfYml0cyhsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncl9pbmZvICogY29uc3QgY29kX2luZm8sIGNhbGNfbm9pc2VfZGF0YSAqIHByZXZfbm9pc2UpOworCisKK3ZvaWQgICAgYmVzdF9odWZmbWFuX2RpdmlkZShjb25zdCBsYW1lX2ludGVybmFsX2ZsYWdzICogY29uc3QgZ2ZjLCBncl9pbmZvICogY29uc3QgY29kX2luZm8pOworCit2b2lkICAgIGJlc3Rfc2NhbGVmYWNfc3RvcmUoY29uc3QgbGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgY29uc3QgaW50IGdyLCBjb25zdCBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlJX3NpZGVfaW5mb190ICogY29uc3QgbDNfc2lkZSk7CisKK2ludCAgICAgc2NhbGVfYml0Y291bnQoZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvKTsKK2ludCAgICAgc2NhbGVfYml0Y291bnRfbHNmKGNvbnN0IGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZnAsIGdyX2luZm8gKiBjb25zdCBjb2RfaW5mbyk7CisKK3ZvaWQgICAgaHVmZm1hbl9pbml0KGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMpOworCit2b2lkICAgIGluaXRfeHJwb3dfY29yZV9pbml0KGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMpOworCitGTE9BVCAgIGF0aEFkanVzdChGTE9BVCBhLCBGTE9BVCB4LCBGTE9BVCBhdGhGbG9vcik7CisKKyNkZWZpbmUgTEFSR0VfQklUUyAxMDAwMDAKKworI2VuZGlmIC8qIExBTUVfUVVBTlRJWkVfUFZUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvcmVzZXJ2b2lyLmMgYi9saWJtcDNsYW1lL3Jlc2Vydm9pci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDAyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3Jlc2Vydm9pci5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogICAgICBiaXQgcmVzZXJ2b2lyIHNvdXJjZSBmaWxlCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IHJlc2Vydm9pci5jLHYgMS40MC4yLjIgMjAxMC8wMy8yMSAxMjoxMTozMCByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworCisjaW5jbHVkZSAibGFtZS5oIgorI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNpbmNsdWRlICJlbmNvZGVyLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInJlc2Vydm9pci5oIgorCisjaW5jbHVkZSAiYml0c3RyZWFtLmgiCisjaW5jbHVkZSAibGFtZS1hbmFseXNpcy5oIgorI2luY2x1ZGUgImxhbWVfZ2xvYmFsX2ZsYWdzLmgiCisKKy8qCisgIFJlc3ZGcmFtZUJlZ2luOgorICBDYWxsZWQgKHJlcGVhdGVkbHkpIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmcmFtZS4gVXBkYXRlcyB0aGUgbWF4aW11bQorICBzaXplIG9mIHRoZSByZXNlcnZvaXIsIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIG1haW5fZGF0YV9iZWdpbgorICB3YXMgc2V0IHByb3Blcmx5IGJ5IHRoZSBmb3JtYXR0ZXIKKyovCisKKy8qCisgKiAgQmFja2dyb3VuZCBpbmZvcm1hdGlvbjoKKyAqCisgKiAgVGhpcyBpcyB0aGUgb3JpZ2luYWwgdGV4dCBmcm9tIHRoZSBJU08gc3RhbmRhcmQuIEJlY2F1c2Ugb2YKKyAqICBzb29vIG1hbnkgYnVncyBhbmQgaXJyaXRhdGlvbnMgY29ycmVjdGluZyBjb21tZW50cyBhcmUgYWRkZWQKKyAqICBpbiBicmFja2V0cyBbXS4gQSAnXlcnIG1lYW5zIHlvdSBzaG91bGQgcmVtb3ZlIHRoZSBsYXN0IHdvcmQuCisgKgorICogIDEpIFRoZSBmb2xsb3dpbmcgcnVsZSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG1heGltdW0KKyAqICAgICBudW1iZXIgb2YgYml0cyB1c2VkIGZvciBvbmUgZ3JhbnVsZSBbXlcgZnJhbWVdOgorICogICAgIEF0IHRoZSBoaWdoZXN0IHBvc3NpYmxlIGJpdHJhdGUgb2YgTGF5ZXIgSUlJICgzMjAga2JwcworICogICAgIHBlciBzdGVyZW8gc2lnbmFsIFteV15XXlddLCA0OCBrSHopIHRoZSBmcmFtZXMgbXVzdCBiZSBvZgorICogICAgIFteV15XXlcgYXJlIGRlc2lnbmVkIHRvIGhhdmVdIGNvbnN0YW50IGxlbmd0aCwgaS5lLgorICogICAgIG9uZSBidWZmZXIgW15XXlcgdGhlIGZyYW1lXSBsZW5ndGggaXM6CisgKgorICogICAgICAgICAzMjAga2JwcyAqIDExNTIvNDgga0h6ID0gNzY4MCBiaXQgPSA5NjAgYnl0ZQorICoKKyAqICAgICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgdGhlIG1heGltdW0gYnVmZmVyIHBlciBjaGFubmVsIFteV15XXSBhdAorICogICAgIGxvd2VyIGJpdHJhdGVzIFt0aGFuIDMyMCBrYnBzXS4gQXQgNjQga2JwcyBtb25vIG9yIDEyOCBrYnBzCisgKiAgICAgc3RlcmVvIHRoZSBtYWluIGdyYW51bGUgbGVuZ3RoIGlzIDY0IGticHMgKiA1NzYvNDgga0h6ID0gNzY4IGJpdAorICogICAgIFtwZXIgZ3JhbnVsZSBhbmQgY2hhbm5lbF0gYXQgNDgga0h6IHNhbXBsaW5nIGZyZXF1ZW5jeS4KKyAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIGRldmlhdGlvbiAoc2hvcnQgdGltZSBidWZmZXIKKyAqICAgICBbPSByZXNlcnZvaXJdKSBvZiA3NjgwIC0gMioyKjc2OCA9IDQ2MDggYml0cyBpcyBhbGxvd2VkIGF0IDY0IGticHMuCisgKiAgICAgVGhlIGFjdHVhbCBkZXZpYXRpb24gaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBieXRlcyBbd2l0aCB0aGUKKyAqICAgICBtZWFuaW5nIG9mIG9jdGV0c10gZGVub3RlZCBieSB0aGUgbWFpbl9kYXRhX2VuZCBvZmZzZXQgcG9pbnRlci4KKyAqICAgICBUaGUgYWN0dWFsIG1heGltdW0gZGV2aWF0aW9uIGlzICgyXjktMSkqOCBiaXQgPSA0MDg4IGJpdHMKKyAqICAgICBbZm9yIE1QRUctMSBhbmQgKDJeOC0xKSo4IGJpdCBmb3IgTVBFRy0yLCBib3RoIGFyZSBoYXJkIGxpbWl0c10uCisgKiAgICAgLi4uIFRoZSB4Y2hhbmdlIG9mIGJ1ZmZlciBiaXRzIGJldHdlZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwKKyAqICAgICBpcyBhbGxvd2VkIHdpdGhvdXQgcmVzdHJpY3Rpb25zIFtleGNlcHRpb246IGR1YWwgY2hhbm5lbF0uCisgKiAgICAgQmVjYXVzZSBvZiB0aGUgW2NvbnN0cnVjdGVkXSBjb25zdHJhaW50IG9uIHRoZSBidWZmZXIgc2l6ZQorICogICAgIG1haW5fZGF0YV9lbmQgaXMgYWx3YXlzIHNldCB0byAwIGluIHRoZSBjYXNlIG9mIGJpdF9yYXRlX2luZGV4PT0xNCwKKyAqICAgICBpLmUuIGRhdGEgcmF0ZSAzMjAga2JwcyBwZXIgc3RlcmVvIHNpZ25hbCBbXldeV15XXS4gSW4gdGhpcyBjYXNlCisgKiAgICAgYWxsIGRhdGEgYXJlIGFsbG9jYXRlZCBiZXR3ZWVuIGFkamFjZW50IGhlYWRlciBbXlcgc3luY10gd29yZHMKKyAqICAgICBbLCBpLmUuIHRoZXJlIGlzIG5vIGJ1ZmZlcmluZyBhdCBhbGxdLgorICovCisKK2ludAorUmVzdkZyYW1lQmVnaW4obGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwgaW50ICptZWFuX2JpdHMpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGZ1bGxGcmFtZUJpdHM7CisgICAgaW50ICAgICByZXN2TGltaXQ7CisgICAgaW50ICAgICBtYXhtcDNidWY7CisgICAgSUlJX3NpZGVfaW5mb190ICpjb25zdCBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKyAgICBpbnQgICAgIGZyYW1lTGVuZ3RoOworCisgICAgZnJhbWVMZW5ndGggPSBnZXRmcmFtZWJpdHMoZ2ZwKTsKKyAgICAqbWVhbl9iaXRzID0gKGZyYW1lTGVuZ3RoIC0gZ2ZjLT5zaWRlaW5mb19sZW4gKiA4KSAvIGdmYy0+bW9kZV9ncjsKKworLyoKKyAqICBNZWFuaW5nIG9mIHRoZSB2YXJpYWJsZXM6CisgKiAgICAgIHJlc3ZMaW1pdDogKDAsIDgsIC4uLiwgOCoyNTUgKE1QRUctMiksIDgqNTExIChNUEVHLTEpKQorICogICAgICAgICAgTnVtYmVyIG9mIGJpdHMgY2FuIGJlIHN0b3JlZCBpbiBwcmV2aW91cyBmcmFtZShzKSBkdWUgdG8KKyAqICAgICAgICAgIGNvdW50ZXIgc2l6ZSBjb25zdGFpbnRzCisgKiAgICAgIG1heG1wM2J1ZjogKCA/Pz8gLi4uIDgqMTk1MSAoTVBFRy0xIGFuZCAyKSwgOCoyMDQ3IChNUEVHLTIuNSkpCisgKiAgICAgICAgICBOdW1iZXIgb2YgYml0cyBhbGxvd2VkIHRvIGVuY29kZSBvbmUgZnJhbWUgKHlvdSBjYW4gdGFrZSA4KjUxMSBiaXQKKyAqICAgICAgICAgIGZyb20gdGhlIGJpdCByZXNlcnZvaXIgYW5kIGF0IG1vc3QgOCoxNDQwIGJpdCBmcm9tIHRoZSBjdXJyZW50CisgKiAgICAgICAgICBmcmFtZSAoMzIwIGticHMsIDMyIGtIeiksIHNvIDgqMTk1MSBiaXQgaXMgdGhlIGxhcmdlc3QgcG9zc2libGUKKyAqICAgICAgICAgIHZhbHVlIGZvciBNUEVHLTEgYW5kIC0yKQorICoKKyAqICAgICAgICAgIG1heGltdW0gYWxsb3dlZCBncmFudWxlL2NoYW5uZWwgc2l6ZSB0aW1lcyA0ID0gOCoyMDQ3IGJpdHMuLAorICogICAgICAgICAgc28gdGhpcyBpcyB0aGUgYWJzb2x1dGUgbWF4aW11bSBzdXBwb3J0ZWQgYnkgdGhlIGZvcm1hdC4KKyAqCisgKgorICogICAgICBmdWxsRnJhbWVCaXRzOiAgbWF4aW11bSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgZm9yIGVuY29kaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBmcmFtZS4KKyAqCisgKiAgICAgIG1lYW5fYml0czogICAgICB0YXJnZXQgbnVtYmVyIG9mIGJpdHMgcGVyIGdyYW51bGUuCisgKgorICogICAgICBmcmFtZUxlbmd0aDoKKyAqCisgKiAgICAgIGdmYy0+UmVzdk1heDogICBtYXhpbXVtIGFsbG93ZWQgcmVzZXJ2b2lyCisgKgorICogICAgICBnZmMtPlJlc3ZTaXplOiAgY3VycmVudCByZXNlcnZvaXIgc2l6ZQorICoKKyAqICAgICAgbDNfc2lkZS0+cmVzdkRyYWluX3ByZToKKyAqICAgICAgICAgYW5jaWxsYXJ5IGRhdGEgdG8gYmUgYWRkZWQgdG8gcHJldmlvdXMgZnJhbWU6CisgKiAgICAgICAgIChvbmx5IHVzZWZ1bGwgaW4gVkJSIG1vZGVzIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKKyAqICAgICAgICAgbWF4bXAzYnVmIDwgZnVsbEZyYW1lQml0cykpLiAgQ3VycmVudGx5IGRpc2FibGVkLAorICogICAgICAgICBzZWUgI2RlZmluZSBORVdfRFJBSU4KKyAqICAgICAgICAgMjAxMC0wMi0xMzogUkggbm93IGVuYWJsZWQsIGl0IHNlZW1zIHRvIGJlIG5lZWRlZCBmb3IgQ0JSIHRvbywKKyAqICAgICAgICAgICAgICAgICAgICAgYXMgdGhlcmUgZXhpc3RzIG9uZSBleGFtcGxlLCB3aGVyZSB0aGUgRmhHIGRlY29kZXIKKyAqICAgICAgICAgICAgICAgICAgICAgY2FuJ3QgZGVjb2RlIGEgLWIzMjAgQ0JSIGZpbGUgYW55bW9yZS4KKyAqCisgKiAgICAgIGwzX3NpZGUtPnJlc3ZEcmFpbl9wb3N0OgorICogICAgICAgICBhbmNpbGxhcnkgZGF0YSB0byBiZSBhZGRlZCB0byB0aGlzIGZyYW1lOgorICoKKyAqLworCisgICAgLyogbWFpbl9kYXRhX2JlZ2luIGhhcyA5IGJpdHMgaW4gTVBFRy0xLCA4IGJpdHMgTVBFRy0yICovCisgICAgcmVzdkxpbWl0ID0gKDggKiAyNTYpICogZ2ZjLT5tb2RlX2dyIC0gODsKKworICAgIC8qIG1heGltdW0gYWxsb3dlZCBmcmFtZSBzaXplLiAgZG9udCB1c2UgbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mCisgICAgICAgYml0cywgZXZlbiBpZiB0aGUgZnJhbWUgaGFzIHRoZSBzcGFjZSBmb3IgdGhlbTogKi8KKyAgICBpZiAoZ2ZwLT5icmF0ZSA+IDMyMCkgeworICAgICAgICAvKiBpbiBmcmVlZm9ybWF0IHRoZSBidWZmZXIgaXMgY29uc3RhbnQgKi8KKyAgICAgICAgbWF4bXAzYnVmID0KKyAgICAgICAgICAgIDggKiAoKGludCkgKChnZnAtPmJyYXRlICogMTAwMCkgLyAoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSAvIChGTE9BVCkgMTE1MikgLyA4ICsgLjUpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qYWxsIG1wMyBkZWNvZGVycyBzaG91bGQgaGF2ZSBlbm91Z2ggYnVmZmVyIHRvIGhhbmRsZSB0aGlzIHZhbHVlOiBzaXplIG9mIGEgMzIwa2JwcyAzMmtIeiBmcmFtZSAqLworICAgICAgICBtYXhtcDNidWYgPSA4ICogMTQ0MDsKKworICAgICAgICAvKiBCb3V2aWduZSBzdWdnZXN0cyB0aGlzIG1vcmUgbGF4IGludGVycHJldGF0aW9uIG9mIHRoZSBJU08gZG9jCisgICAgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgOCo5NjAuICovCisKKyAgICAgICAgaWYgKGdmcC0+c3RyaWN0X0lTTykgeworICAgICAgICAgICAgbWF4bXAzYnVmID0gOCAqICgoaW50KSAoMzIwMDAwIC8gKGdmcC0+b3V0X3NhbXBsZXJhdGUgLyAoRkxPQVQpIDExNTIpIC8gOCArIC41KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnZmMtPlJlc3ZNYXggPSBtYXhtcDNidWYgLSBmcmFtZUxlbmd0aDsKKyAgICBpZiAoZ2ZjLT5SZXN2TWF4ID4gcmVzdkxpbWl0KQorICAgICAgICBnZmMtPlJlc3ZNYXggPSByZXN2TGltaXQ7CisgICAgaWYgKGdmYy0+UmVzdk1heCA8IDAgfHwgZ2ZwLT5kaXNhYmxlX3Jlc2Vydm9pcikKKyAgICAgICAgZ2ZjLT5SZXN2TWF4ID0gMDsKKworICAgIGZ1bGxGcmFtZUJpdHMgPSAqbWVhbl9iaXRzICogZ2ZjLT5tb2RlX2dyICsgTWluKGdmYy0+UmVzdlNpemUsIGdmYy0+UmVzdk1heCk7CisKKyAgICBpZiAoZnVsbEZyYW1lQml0cyA+IG1heG1wM2J1ZikKKyAgICAgICAgZnVsbEZyYW1lQml0cyA9IG1heG1wM2J1ZjsKKworICAgIGFzc2VydCgwID09IGdmYy0+UmVzdk1heCAlIDgpOworICAgIGFzc2VydChnZmMtPlJlc3ZNYXggPj0gMCk7CisKKyAgICBsM19zaWRlLT5yZXN2RHJhaW5fcHJlID0gMDsKKworICAgIGlmIChnZmMtPnBpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgZ2ZjLT5waW5mby0+bWVhbl9iaXRzID0gKm1lYW5fYml0cyAvIDI7IC8qIGV4cGVjdGVkIGJpdHMgcGVyIGNoYW5uZWwgcGVyIGdyYW51bGUgW2lzIHRoaXMgYWxzbyByaWdodCBmb3IgbW9uby9zdGVyZW8sIE1QRUctMS8yID9dICovCisgICAgICAgIGdmYy0+cGluZm8tPnJlc3ZzaXplID0gZ2ZjLT5SZXN2U2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZnVsbEZyYW1lQml0czsKK30KKworCisvKgorICBSZXN2TWF4Qml0cworICByZXR1cm5zIHRhcmdfYml0czogIHRhcmdldCBudW1iZXIgb2YgYml0cyB0byB1c2UgZm9yIDEgZ3JhbnVsZQorICAgICAgICAgZXh0cmFfYml0czogIGFtb3VudCBleHRyYSBhdmFpbGFibGUgZnJvbSByZXNlcnZvaXIKKyAgTWFyayBUYXlsb3IgNC85OQorKi8KK3ZvaWQKK1Jlc3ZNYXhCaXRzKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIGludCBtZWFuX2JpdHMsIGludCAqdGFyZ19iaXRzLCBpbnQgKmV4dHJhX2JpdHMsIGludCBjYnIpCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqY29uc3QgZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICBpbnQgICAgIGFkZF9iaXRzOworICAgIGludCAgICAgUmVzdlNpemUgPSBnZmMtPlJlc3ZTaXplLCBSZXN2TWF4ID0gZ2ZjLT5SZXN2TWF4OworCisgICAgLyogY29ucGVuc2F0ZSB0aGUgc2F2ZWQgYml0cyB1c2VkIGluIHRoZSAxc3QgZ3JhbnVsZSAqLworICAgIGlmIChjYnIpCisgICAgICAgIFJlc3ZTaXplICs9IG1lYW5fYml0czsKKworICAgIGlmIChnZmMtPnN1YnN0ZXBfc2hhcGluZyAmIDEpCisgICAgICAgIFJlc3ZNYXggKj0gMC45OworCisgICAgKnRhcmdfYml0cyA9IG1lYW5fYml0czsKKworICAgIC8qIGV4dHJhIGJpdHMgaWYgdGhlIHJlc2Vydm9pciBpcyBhbG1vc3QgZnVsbCAqLworICAgIGlmIChSZXN2U2l6ZSAqIDEwID4gUmVzdk1heCAqIDkpIHsKKyAgICAgICAgYWRkX2JpdHMgPSBSZXN2U2l6ZSAtIChSZXN2TWF4ICogOSkgLyAxMDsKKyAgICAgICAgKnRhcmdfYml0cyArPSBhZGRfYml0czsKKyAgICAgICAgZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgfD0gMHg4MDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFkZF9iaXRzID0gMDsKKyAgICAgICAgZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgJj0gMHg3ZjsKKyAgICAgICAgLyogYnVpbGQgdXAgcmVzZXJ2b2lyLiAgdGhpcyBidWlsZHMgdGhlIHJlc2Vydm9pciBhIGxpdHRsZSBzbG93ZXIKKyAgICAgICAgICogdGhhbiBGaEcuICBJdCBjb3VsZCBzaW1wbGUgYmUgbWVhbl9iaXRzLzE1LCBidXQgdGhpcyB3YXMgcmlnZ2VkCisgICAgICAgICAqIHRvIGFsd2F5cyBwcm9kdWNlIDEwMCAodGhlIG9sZCB2YWx1ZSkgYXQgMTI4a2JzICovCisgICAgICAgIC8qICAgICp0YXJnX2JpdHMgLT0gKGludCkgKG1lYW5fYml0cy8xNS4yKTsgKi8KKyAgICAgICAgaWYgKCFnZnAtPmRpc2FibGVfcmVzZXJ2b2lyICYmICEoZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgJiAxKSkKKyAgICAgICAgICAgICp0YXJnX2JpdHMgLT0gLjEgKiBtZWFuX2JpdHM7CisgICAgfQorCisKKyAgICAvKiBhbW91bnQgZnJvbSB0aGUgcmVzZXJ2b2lyIHdlIGFyZSBhbGxvd2VkIHRvIHVzZS4gSVNPIHNheXMgNi8xMCAqLworICAgICpleHRyYV9iaXRzID0gKFJlc3ZTaXplIDwgKGdmYy0+UmVzdk1heCAqIDYpIC8gMTAgPyBSZXN2U2l6ZSA6IChnZmMtPlJlc3ZNYXggKiA2KSAvIDEwKTsKKyAgICAqZXh0cmFfYml0cyAtPSBhZGRfYml0czsKKworICAgIGlmICgqZXh0cmFfYml0cyA8IDApCisgICAgICAgICpleHRyYV9iaXRzID0gMDsKKworCit9CisKKy8qCisgIFJlc3ZBZGp1c3Q6CisgIENhbGxlZCBhZnRlciBhIGdyYW51bGUncyBiaXQgYWxsb2NhdGlvbi4gUmVhZGp1c3RzIHRoZSBzaXplIG9mCisgIHRoZSByZXNlcnZvaXIgdG8gcmVmbGVjdCB0aGUgZ3JhbnVsZSdzIHVzYWdlLgorKi8KK3ZvaWQKK1Jlc3ZBZGp1c3QobGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgZ3JfaW5mbyBjb25zdCAqZ2kpCit7CisgICAgZ2ZjLT5SZXN2U2l6ZSAtPSBnaS0+cGFydDJfM19sZW5ndGggKyBnaS0+cGFydDJfbGVuZ3RoOworfQorCisKKy8qCisgIFJlc3ZGcmFtZUVuZDoKKyAgQ2FsbGVkIGFmdGVyIGFsbCBncmFudWxlcyBpbiBhIGZyYW1lIGhhdmUgYmVlbiBhbGxvY2F0ZWQuIE1ha2VzIHN1cmUKKyAgdGhhdCB0aGUgcmVzZXJ2b2lyIHNpemUgaXMgd2l0aGluIGxpbWl0cywgcG9zc2libHkgYnkgYWRkaW5nIHN0dWZmaW5nCisgIGJpdHMuCisqLwordm9pZAorUmVzdkZyYW1lRW5kKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGludCBtZWFuX2JpdHMpCit7CisgICAgaW50ICAgICBzdHVmZmluZ0JpdHM7CisgICAgaW50ICAgICBvdmVyX2JpdHM7CisgICAgSUlJX3NpZGVfaW5mb190ICpjb25zdCBsM19zaWRlID0gJmdmYy0+bDNfc2lkZTsKKworCisgICAgZ2ZjLT5SZXN2U2l6ZSArPSBtZWFuX2JpdHMgKiBnZmMtPm1vZGVfZ3I7CisgICAgc3R1ZmZpbmdCaXRzID0gMDsKKyAgICBsM19zaWRlLT5yZXN2RHJhaW5fcG9zdCA9IDA7CisgICAgbDNfc2lkZS0+cmVzdkRyYWluX3ByZSA9IDA7CisKKyAgICAvKiB3ZSBtdXN0IGJlIGJ5dGUgYWxpZ25lZCAqLworICAgIGlmICgob3Zlcl9iaXRzID0gZ2ZjLT5SZXN2U2l6ZSAlIDgpICE9IDApCisgICAgICAgIHN0dWZmaW5nQml0cyArPSBvdmVyX2JpdHM7CisKKworICAgIG92ZXJfYml0cyA9IChnZmMtPlJlc3ZTaXplIC0gc3R1ZmZpbmdCaXRzKSAtIGdmYy0+UmVzdk1heDsKKyAgICBpZiAob3Zlcl9iaXRzID4gMCkgeworICAgICAgICBhc3NlcnQoMCA9PSBvdmVyX2JpdHMgJSA4KTsKKyAgICAgICAgYXNzZXJ0KG92ZXJfYml0cyA+PSAwKTsKKyAgICAgICAgc3R1ZmZpbmdCaXRzICs9IG92ZXJfYml0czsKKyAgICB9CisKKyAgICAvKiBOT1RFOiBlbmFibGluZyB0aGUgTkVXX0RSQUlOIGNvZGUgZml4ZXMgc29tZSBwcm9ibGVtcyB3aXRoIEZoRyBkZWNvZGVyCisgICAgICAgICAgICAgc2hpcHBlZCB3aXRoIE1TIFdpbmRvd3Mgb3BlcmF0aW5nIHN5c3RlbXMuIFVzaW5nIHRoaXMsIGl0IGlzIGV2ZW4KKyAgICAgICAgICAgICBwb3NzaWJsZSB0byB1c2UgR2FicmllbCdzIGxheCBidWZmZXIgY29uc2lkZXJhdGlvbiBhZ2Fpbiwgd2hpY2gKKyAgICAgICAgICAgICBhc3N1bWVzLCBhbnkgZGVjb2RlciBzaG91bGQgaGF2ZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2gKKyAgICAgICAgICAgICBmb3IgYSAzMjAga2JwcyBmcmFtZSBhdCAzMiBrSHogc2FtcGxlIHJhdGUuCisKKyAgICAgICBvbGQgZHJhaW4gY29kZToKKyAgICAgICAgICAgICBsYW1lIC1iMzIwIEJsYWNrQmlyZC53YXYgLS0tPiBkb2VzIG5vdCBwbGF5IHdpdGggR3JhcGhFZGl0LmV4ZSB1c2luZyBGaEcgZGVjb2RlciBWMS41IEJ1aWxkIDUwCisKKyAgICAgICBuZXcgZHJhaW4gY29kZToKKyAgICAgICAgICAgICBsYW1lIC1iMzIwIEJsYWNrQmlyZC53YXYgLS0tPiBwbGF5cyBmaW5lIHdpdGggR3JhcGhFZGl0LmV4ZSB1c2luZyBGaEcgZGVjb2RlciBWMS41IEJ1aWxkIDUwCisKKyAgICAgICAgICAgICBSb2JlcnQgSGVnZW1hbm4sIDIwMTAtMDItMTMuCisgICAgICovCisgICAgLyogZHJhaW4gYXMgbWFueSBiaXRzIGFzIHBvc3NpYmxlIGludG8gcHJldmlvdXMgZnJhbWUgYW5jaWxsYXJ5IGRhdGEKKyAgICAgKiBJbiBwYXJ0aWN1bGFyLCBpbiBWQlIgbW9kZSBSZXN2TWF4IG1heSBoYXZlIGNoYW5nZWQsIGFuZCB3ZSBoYXZlCisgICAgICogdG8gbWFrZSBzdXJlIG1haW5fZGF0YV9iZWdpbiBkb2VzIG5vdCBjcmVhdGUgYSByZXNlcnZvaXIgYmlnZ2VyCisgICAgICogdGhhbiBSZXN2TWF4ICBtdCA0LzAwKi8KKyAgICB7CisgICAgICAgIGludCAgICAgbWRiX2J5dGVzID0gTWluKGwzX3NpZGUtPm1haW5fZGF0YV9iZWdpbiAqIDgsIHN0dWZmaW5nQml0cykgLyA4OworICAgICAgICBsM19zaWRlLT5yZXN2RHJhaW5fcHJlICs9IDggKiBtZGJfYnl0ZXM7CisgICAgICAgIHN0dWZmaW5nQml0cyAtPSA4ICogbWRiX2J5dGVzOworICAgICAgICBnZmMtPlJlc3ZTaXplIC09IDggKiBtZGJfYnl0ZXM7CisgICAgICAgIGwzX3NpZGUtPm1haW5fZGF0YV9iZWdpbiAtPSBtZGJfYnl0ZXM7CisgICAgfQorICAgIC8qIGRyYWluIHRoZSByZXN0IGludG8gdGhpcyBmcmFtZXMgYW5jaWxsYXJ5IGRhdGEgKi8KKyAgICBsM19zaWRlLT5yZXN2RHJhaW5fcG9zdCArPSBzdHVmZmluZ0JpdHM7CisgICAgZ2ZjLT5SZXN2U2l6ZSAtPSBzdHVmZmluZ0JpdHM7CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3Jlc2Vydm9pci5oIGIvbGlibXAzbGFtZS9yZXNlcnZvaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzNkOWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS9yZXNlcnZvaXIuaApAQCAtMCwwICsxLDMxIEBACisvKgorICoJYml0IHJlc2Vydm9pciBpbmNsdWRlIGZpbGUKKyAqCisgKglDb3B5cmlnaHQgKGMpIDE5OTkgTWFyayBUYXlsb3IKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBMQU1FX1JFU0VSVk9JUl9ICisjZGVmaW5lIExBTUVfUkVTRVJWT0lSX0gKKworaW50ICAgICBSZXN2RnJhbWVCZWdpbihsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLCBpbnQgKm1lYW5fYml0cyk7Cit2b2lkICAgIFJlc3ZNYXhCaXRzKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsIGludCBtZWFuX2JpdHMsIGludCAqdGFyZ19iaXRzLCBpbnQgKm1heF9iaXRzLAorICAgICAgICAgICAgICAgICAgICBpbnQgY2JyKTsKK3ZvaWQgICAgUmVzdkFkanVzdChsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBncl9pbmZvIGNvbnN0ICpnaSk7Cit2b2lkICAgIFJlc3ZGcmFtZUVuZChsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBpbnQgbWVhbl9iaXRzKTsKKworI2VuZGlmIC8qIExBTUVfUkVTRVJWT0lSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvc2V0X2dldC5jIGIvbGlibXAzbGFtZS9zZXRfZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhM2JmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvc2V0X2dldC5jCkBAIC0wLDAgKzEsMTg4MyBAQAorLyogLSotIG1vZGU6IEM7IG1vZGU6IGZvbGQgLSotICovCisvKgorICogc2V0L2dldCBmdW5jdGlvbnMgZm9yIGxhbWVfZ2xvYmFsX2ZsYWdzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQWxleGFuZGVyIExlaWRpbmdlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiAkSWQ6IHNldF9nZXQuYyx2IDEuODggMjAwOC8wNC8xMiAxODoxODowNyByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIgIC8qIGJlY2F1c2Ugb2YgY29tcHV0ZV9mbHVzaGJpdHMgKi8KKworI2luY2x1ZGUgInNldF9nZXQuaCIKKyNpbmNsdWRlICJsYW1lX2dsb2JhbF9mbGFncy5oIgorCisvKgorICogaW5wdXQgc3RyZWFtIGRlc2NyaXB0aW9uCisgKi8KKworLyogbnVtYmVyIG9mIHNhbXBsZXMgKi8KKy8qIGl0J3MgdW5saWtlbHkgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGFuIGVycm9yICovCitpbnQKK2xhbWVfc2V0X251bV9zYW1wbGVzKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCB1bnNpZ25lZCBsb25nIG51bV9zYW1wbGVzKQoreworICAgIC8qIGRlZmF1bHQgPSAyXjMyLTEgKi8KKworICAgIGdmcC0+bnVtX3NhbXBsZXMgPSBudW1fc2FtcGxlczsKKworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nCitsYW1lX2dldF9udW1fc2FtcGxlcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5udW1fc2FtcGxlczsKK30KKworCisvKiBpbnB1dCBzYW1wbGVyYXRlICovCitpbnQKK2xhbWVfc2V0X2luX3NhbXBsZXJhdGUobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBpbl9zYW1wbGVyYXRlKQoreworICAgIC8qIGlucHV0IHNhbXBsZSByYXRlIGluIEh6LCAgZGVmYXVsdCA9IDQ0MTAwIEh6ICovCisgICAgZ2ZwLT5pbl9zYW1wbGVyYXRlID0gaW5fc2FtcGxlcmF0ZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2luX3NhbXBsZXJhdGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+aW5fc2FtcGxlcmF0ZTsKK30KKworCisvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gaW5wdXQgc3RyZWFtICovCitpbnQKK2xhbWVfc2V0X251bV9jaGFubmVscyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IG51bV9jaGFubmVscykKK3sKKyAgICAvKiBkZWZhdWx0ID0gMiAqLworCisgICAgaWYgKDIgPCBudW1fY2hhbm5lbHMgfHwgMCA9PSBudW1fY2hhbm5lbHMpCisgICAgICAgIHJldHVybiAtMTsgICAgICAvKiB3ZSBkb24ndCBzdXBwb3J0IG1vcmUgdGhhbiAyIGNoYW5uZWxzICovCisKKyAgICBnZnAtPm51bV9jaGFubmVscyA9IG51bV9jaGFubmVsczsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X251bV9jaGFubmVscyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5udW1fY2hhbm5lbHM7Cit9CisKKworLyogc2NhbGUgdGhlIGlucHV0IGJ5IHRoaXMgYW1vdW50IGJlZm9yZSBlbmNvZGluZyAobm90IHVzZWQgZm9yIGRlY29kaW5nKSAqLworaW50CitsYW1lX3NldF9zY2FsZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgZmxvYXQgc2NhbGUpCit7CisgICAgLyogZGVmYXVsdCA9IDAgKi8KKyAgICBnZnAtPnNjYWxlID0gc2NhbGU7CisKKyAgICByZXR1cm4gMDsKK30KKworZmxvYXQKK2xhbWVfZ2V0X3NjYWxlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPnNjYWxlOworfQorCisKKy8qIHNjYWxlIHRoZSBjaGFubmVsIDAgKGxlZnQpIGlucHV0IGJ5IHRoaXMgYW1vdW50IGJlZm9yZSAKKyAgIGVuY29kaW5nIChub3QgdXNlZCBmb3IgZGVjb2RpbmcpICovCitpbnQKK2xhbWVfc2V0X3NjYWxlX2xlZnQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IHNjYWxlKQoreworICAgIC8qIGRlZmF1bHQgPSAwICovCisgICAgZ2ZwLT5zY2FsZV9sZWZ0ID0gc2NhbGU7CisKKyAgICByZXR1cm4gMDsKK30KKworZmxvYXQKK2xhbWVfZ2V0X3NjYWxlX2xlZnQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+c2NhbGVfbGVmdDsKK30KKworCisvKiBzY2FsZSB0aGUgY2hhbm5lbCAxIChyaWdodCkgaW5wdXQgYnkgdGhpcyBhbW91bnQgYmVmb3JlIAorICAgZW5jb2RpbmcgKG5vdCB1c2VkIGZvciBkZWNvZGluZykgKi8KK2ludAorbGFtZV9zZXRfc2NhbGVfcmlnaHQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IHNjYWxlKQoreworICAgIC8qIGRlZmF1bHQgPSAwICovCisgICAgZ2ZwLT5zY2FsZV9yaWdodCA9IHNjYWxlOworCisgICAgcmV0dXJuIDA7Cit9CisKK2Zsb2F0CitsYW1lX2dldF9zY2FsZV9yaWdodChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5zY2FsZV9yaWdodDsKK30KKworCisvKiBvdXRwdXQgc2FtcGxlIHJhdGUgaW4gSHogKi8KK2ludAorbGFtZV9zZXRfb3V0X3NhbXBsZXJhdGUobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBvdXRfc2FtcGxlcmF0ZSkKK3sKKyAgICAvKgorICAgICAqIGRlZmF1bHQgPSAwOiBMQU1FIHBpY2tzIGJlc3QgdmFsdWUgYmFzZWQgb24gdGhlIGFtb3VudAorICAgICAqICAgICAgICAgICAgICBvZiBjb21wcmVzc2lvbgorICAgICAqIE1QRUcgb25seSBhbGxvd3M6CisgICAgICogIE1QRUcxICAgIDMyLCA0NC4xLCAgIDQ4a2h6CisgICAgICogIE1QRUcyICAgIDE2LCAyMi4wNSwgIDI0CisgICAgICogIE1QRUcyLjUgICA4LCAxMS4wMjUsIDEyCisgICAgICoKKyAgICAgKiAobm90IHVzZWQgYnkgZGVjb2Rpbmcgcm91dGluZXMpCisgICAgICovCisgICAgZ2ZwLT5vdXRfc2FtcGxlcmF0ZSA9IG91dF9zYW1wbGVyYXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+b3V0X3NhbXBsZXJhdGU7Cit9CisKKworCisKKy8qCisgKiBnZW5lcmFsIGNvbnRyb2wgcGFyYW1ldGVycworICovCisKKy8qIGNvbGxlY3QgZGF0YSBmb3IgYW4gTVAzIGZyYW1lIGFuYWx6eWVyICovCitpbnQKK2xhbWVfc2V0X2FuYWx5c2lzKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgYW5hbHlzaXMpCit7CisgICAgLyogZGVmYXVsdCA9IDAgKi8KKworICAgIC8qIGVuZm9yY2UgZGlzYWJsZS9lbmFibGUgbWVhbmluZywgaWYgd2UgbmVlZCBtb3JlIHRoYW4gdHdvIHZhbHVlcworICAgICAgIHdlIG5lZWQgdG8gc3dpdGNoIHRvIGFuIGVudW0gdG8gaGF2ZSBhbiBhcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uCisgICAgICAgb2YgdGhlIHBvc3NpYmxlIG1lYW5pbmdzIG9mIHRoZSB2YWx1ZSAqLworICAgIGlmICgwID4gYW5hbHlzaXMgfHwgMSA8IGFuYWx5c2lzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPmFuYWx5c2lzID0gYW5hbHlzaXM7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9hbmFseXNpcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPmFuYWx5c2lzICYmIDEgPj0gZ2ZwLT5hbmFseXNpcyk7CisKKyAgICByZXR1cm4gZ2ZwLT5hbmFseXNpczsKK30KKworCisvKiB3cml0ZSBhIFhpbmcgVkJSIGhlYWRlciBmcmFtZSAqLworaW50CitsYW1lX3NldF9iV3JpdGVWYnJUYWcobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBiV3JpdGVWYnJUYWcpCit7CisgICAgLyogZGVmYXVsdCA9IDEgKG9uKSBmb3IgVkJSL0FCUiBtb2RlcywgMCAob2ZmKSBmb3IgQ0JSIG1vZGUgKi8KKworICAgIC8qIGVuZm9yY2UgZGlzYWJsZS9lbmFibGUgbWVhbmluZywgaWYgd2UgbmVlZCBtb3JlIHRoYW4gdHdvIHZhbHVlcworICAgICAgIHdlIG5lZWQgdG8gc3dpdGNoIHRvIGFuIGVudW0gdG8gaGF2ZSBhbiBhcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uCisgICAgICAgb2YgdGhlIHBvc3NpYmxlIG1lYW5pbmdzIG9mIHRoZSB2YWx1ZSAqLworICAgIGlmICgwID4gYldyaXRlVmJyVGFnIHx8IDEgPCBiV3JpdGVWYnJUYWcpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGdmcC0+YldyaXRlVmJyVGFnID0gYldyaXRlVmJyVGFnOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfYldyaXRlVmJyVGFnKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydCgwIDw9IGdmcC0+YldyaXRlVmJyVGFnICYmIDEgPj0gZ2ZwLT5iV3JpdGVWYnJUYWcpOworCisgICAgcmV0dXJuIGdmcC0+YldyaXRlVmJyVGFnOworfQorCisKKworLyogZGVjb2RlIG9ubHksIHVzZSBsYW1lL21wZ2xpYiB0byBjb252ZXJ0IG1wMyB0byB3YXYgKi8KK2ludAorbGFtZV9zZXRfZGVjb2RlX29ubHkobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBkZWNvZGVfb25seSkKK3sKKyAgICAvKiBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCisKKyAgICAvKiBlbmZvcmNlIGRpc2FibGUvZW5hYmxlIG1lYW5pbmcsIGlmIHdlIG5lZWQgbW9yZSB0aGFuIHR3byB2YWx1ZXMKKyAgICAgICB3ZSBuZWVkIHRvIHN3aXRjaCB0byBhbiBlbnVtIHRvIGhhdmUgYW4gYXByb3ByaWF0ZSByZXByZXNlbnRhdGlvbgorICAgICAgIG9mIHRoZSBwb3NzaWJsZSBtZWFuaW5ncyBvZiB0aGUgdmFsdWUgKi8KKyAgICBpZiAoMCA+IGRlY29kZV9vbmx5IHx8IDEgPCBkZWNvZGVfb25seSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZ2ZwLT5kZWNvZGVfb25seSA9IGRlY29kZV9vbmx5OworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfZGVjb2RlX29ubHkoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgYXNzZXJ0KDAgPD0gZ2ZwLT5kZWNvZGVfb25seSAmJiAxID49IGdmcC0+ZGVjb2RlX29ubHkpOworCisgICAgcmV0dXJuIGdmcC0+ZGVjb2RlX29ubHk7Cit9CisKKworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECisvKiAxPWVuY29kZSBhIFZvcmJpcyAub2dnIGZpbGUuICBkZWZhdWx0PTAgKi8KKy8qIERFUFJFQ0FURUQgKi8KK2ludCBDREVDTCBsYW1lX3NldF9vZ2cobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9vZ2coY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisjZWxzZQorI2VuZGlmCisKKy8qIGVuY29kZSBhIFZvcmJpcyAub2dnIGZpbGUgKi8KKy8qIERFUFJFQ0FURUQgKi8KK2ludAorbGFtZV9zZXRfb2dnKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgb2dnKQoreworICAgICh2b2lkKSBnZnA7CisgICAgKHZvaWQpIG9nZzsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludAorbGFtZV9nZXRfb2dnKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgICh2b2lkKSBnZnA7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEludGVybmFsIGFsZ29yaXRobSBzZWxlY3Rpb24uCisgKiBUcnVlIHF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYml0cmF0ZSBidXQgdGhpcyB2YXJpYWJsZSB3aWxsIGVmZmVjdAorICogcXVhbGl0eSBieSBzZWxlY3RpbmcgZXhwZW5zaXZlIG9yIGNoZWFwIGFsZ29yaXRobXMuCisgKiBxdWFsaXR5PTAuLjkuICAwPWJlc3QgKHZlcnkgc2xvdykuICA5PXdvcnN0LiAgCisgKiByZWNvbW1lbmRlZDogIDMgICAgIG5lYXItYmVzdCBxdWFsaXR5LCBub3QgdG9vIHNsb3cKKyAqICAgICAgICAgICAgICAgNSAgICAgZ29vZCBxdWFsaXR5LCBmYXN0CisgKiAgICAgICAgICAgICAgIDcgICAgIG9rIHF1YWxpdHksIHJlYWxseSBmYXN0CisgKi8KK2ludAorbGFtZV9zZXRfcXVhbGl0eShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHF1YWxpdHkpCit7CisgICAgZ2ZwLT5xdWFsaXR5ID0gcXVhbGl0eTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X3F1YWxpdHkoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+cXVhbGl0eTsKK30KKworCisvKiBtb2RlID0gU1RFUkVPLCBKT0lOVF9TVEVSRU8sIERVQUxfQ0hBTk5FTCAobm90IHN1cHBvcnRlZCksIE1PTk8gKi8KK2ludAorbGFtZV9zZXRfbW9kZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgTVBFR19tb2RlIG1vZGUpCit7CisgICAgaW50ICAgICBtcGdfbW9kZSA9IG1vZGU7CisKKyAgICAvKiBkZWZhdWx0OiBsYW1lIGNob29zZXMgYmFzZWQgb24gY29tcHJlc3Npb24gcmF0aW8gYW5kIGlucHV0IGNoYW5uZWxzICovCisKKyAgICBpZiAobXBnX21vZGUgPCAwIHx8IE1BWF9JTkRJQ0FUT1IgPD0gbXBnX21vZGUpCisgICAgICAgIHJldHVybiAtMTsgICAgICAvKiBVbmtub3duIE1QRUcgbW9kZSEgKi8KKworICAgIGdmcC0+bW9kZSA9IG1vZGU7CisKKyAgICByZXR1cm4gMDsKK30KKworTVBFR19tb2RlCitsYW1lX2dldF9tb2RlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydChnZnAtPm1vZGUgPCBNQVhfSU5ESUNBVE9SKTsKKworICAgIHJldHVybiBnZnAtPm1vZGU7Cit9CisKKworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECisvKgorICBtb2RlX2F1dG9tcy4gIFVzZSBhIE0vUyBtb2RlIHdpdGggYSBzd2l0Y2hpbmcgdGhyZXNob2xkIGJhc2VkIG9uCisgIGNvbXByZXNzaW9uIHJhdGlvCisgIERFUFJFQ0FURUQKKyovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfbW9kZV9hdXRvbXMobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9tb2RlX2F1dG9tcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKyNlbHNlCisjZW5kaWYKKworLyogVXMgYSBNL1MgbW9kZSB3aXRoIGEgc3dpdGNoaW5nIHRocmVzaG9sZCBiYXNlZCBvbiBjb21wcmVzc2lvbiByYXRpbyAqLworLyogREVQUkVDQVRFRCAqLworaW50CitsYW1lX3NldF9tb2RlX2F1dG9tcyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IG1vZGVfYXV0b21zKQoreworICAgIC8qIGRlZmF1bHQgPSAwIChkaXNhYmxlZCkgKi8KKworICAgIC8qIGVuZm9yY2UgZGlzYWJsZS9lbmFibGUgbWVhbmluZywgaWYgd2UgbmVlZCBtb3JlIHRoYW4gdHdvIHZhbHVlcworICAgICAgIHdlIG5lZWQgdG8gc3dpdGNoIHRvIGFuIGVudW0gdG8gaGF2ZSBhbiBhcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uCisgICAgICAgb2YgdGhlIHBvc3NpYmxlIG1lYW5pbmdzIG9mIHRoZSB2YWx1ZSAqLworICAgIGlmICgwID4gbW9kZV9hdXRvbXMgfHwgMSA8IG1vZGVfYXV0b21zKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBsYW1lX3NldF9tb2RlKGdmcCwgSk9JTlRfU1RFUkVPKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X21vZGVfYXV0b21zKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgICh2b2lkKSBnZnA7CisgICAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIEZvcmNlIE0vUyBmb3IgYWxsIGZyYW1lcy4gIEZvciB0ZXN0aW5nIG9ubHkuCisgKiBSZXF1aXJlcyBtb2RlID0gMS4KKyAqLworaW50CitsYW1lX3NldF9mb3JjZV9tcyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGZvcmNlX21zKQoreworICAgIC8qIGRlZmF1bHQgPSAwIChkaXNhYmxlZCkgKi8KKworICAgIC8qIGVuZm9yY2UgZGlzYWJsZS9lbmFibGUgbWVhbmluZywgaWYgd2UgbmVlZCBtb3JlIHRoYW4gdHdvIHZhbHVlcworICAgICAgIHdlIG5lZWQgdG8gc3dpdGNoIHRvIGFuIGVudW0gdG8gaGF2ZSBhbiBhcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uCisgICAgICAgb2YgdGhlIHBvc3NpYmxlIG1lYW5pbmdzIG9mIHRoZSB2YWx1ZSAqLworICAgIGlmICgwID4gZm9yY2VfbXMgfHwgMSA8IGZvcmNlX21zKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPmZvcmNlX21zID0gZm9yY2VfbXM7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9mb3JjZV9tcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPmZvcmNlX21zICYmIDEgPj0gZ2ZwLT5mb3JjZV9tcyk7CisKKyAgICByZXR1cm4gZ2ZwLT5mb3JjZV9tczsKK30KKworCisvKiBVc2UgZnJlZV9mb3JtYXQuICovCitpbnQKK2xhbWVfc2V0X2ZyZWVfZm9ybWF0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgZnJlZV9mb3JtYXQpCit7CisgICAgLyogZGVmYXVsdCA9IDAgKGRpc2FibGVkKSAqLworCisgICAgLyogZW5mb3JjZSBkaXNhYmxlL2VuYWJsZSBtZWFuaW5nLCBpZiB3ZSBuZWVkIG1vcmUgdGhhbiB0d28gdmFsdWVzCisgICAgICAgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYW4gZW51bSB0byBoYXZlIGFuIGFwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICBvZiB0aGUgcG9zc2libGUgbWVhbmluZ3Mgb2YgdGhlIHZhbHVlICovCisgICAgaWYgKDAgPiBmcmVlX2Zvcm1hdCB8fCAxIDwgZnJlZV9mb3JtYXQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGdmcC0+ZnJlZV9mb3JtYXQgPSBmcmVlX2Zvcm1hdDsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2ZyZWVfZm9ybWF0KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydCgwIDw9IGdmcC0+ZnJlZV9mb3JtYXQgJiYgMSA+PSBnZnAtPmZyZWVfZm9ybWF0KTsKKworICAgIHJldHVybiBnZnAtPmZyZWVfZm9ybWF0OworfQorCisKKworLyogUGVyZm9ybSBSZXBsYXlHYWluIGFuYWx5c2lzICovCitpbnQKK2xhbWVfc2V0X2ZpbmRSZXBsYXlHYWluKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgZmluZFJlcGxheUdhaW4pCit7CisgICAgLyogZGVmYXVsdCA9IDAgKGRpc2FibGVkKSAqLworCisgICAgLyogZW5mb3JjZSBkaXNhYmxlL2VuYWJsZSBtZWFuaW5nLCBpZiB3ZSBuZWVkIG1vcmUgdGhhbiB0d28gdmFsdWVzCisgICAgICAgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYW4gZW51bSB0byBoYXZlIGFuIGFwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICBvZiB0aGUgcG9zc2libGUgbWVhbmluZ3Mgb2YgdGhlIHZhbHVlICovCisgICAgaWYgKDAgPiBmaW5kUmVwbGF5R2FpbiB8fCAxIDwgZmluZFJlcGxheUdhaW4pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGdmcC0+ZmluZFJlcGxheUdhaW4gPSBmaW5kUmVwbGF5R2FpbjsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2ZpbmRSZXBsYXlHYWluKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydCgwIDw9IGdmcC0+ZmluZFJlcGxheUdhaW4gJiYgMSA+PSBnZnAtPmZpbmRSZXBsYXlHYWluKTsKKworICAgIHJldHVybiBnZnAtPmZpbmRSZXBsYXlHYWluOworfQorCisKKy8qIERlY29kZSBvbiB0aGUgZmx5LiBGaW5kIHRoZSBwZWFrIHNhbXBsZS4gSWYgUmVwbGF5R2FpbiBhbmFseXNpcyBpcyAKKyAgIGVuYWJsZWQgdGhlbiBwZXJmb3JtIGl0IG9uIHRoZSBkZWNvZGVkIGRhdGEuICovCitpbnQKK2xhbWVfc2V0X2RlY29kZV9vbl90aGVfZmx5KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgZGVjb2RlX29uX3RoZV9mbHkpCit7CisjaWZuZGVmIERFQ09ERV9PTl9USEVfRkxZCisgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICAvKiBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCisKKyAgICAvKiBlbmZvcmNlIGRpc2FibGUvZW5hYmxlIG1lYW5pbmcsIGlmIHdlIG5lZWQgbW9yZSB0aGFuIHR3byB2YWx1ZXMKKyAgICAgICB3ZSBuZWVkIHRvIHN3aXRjaCB0byBhbiBlbnVtIHRvIGhhdmUgYW4gYXByb3ByaWF0ZSByZXByZXNlbnRhdGlvbgorICAgICAgIG9mIHRoZSBwb3NzaWJsZSBtZWFuaW5ncyBvZiB0aGUgdmFsdWUgKi8KKyAgICBpZiAoMCA+IGRlY29kZV9vbl90aGVfZmx5IHx8IDEgPCBkZWNvZGVfb25fdGhlX2ZseSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZ2ZwLT5kZWNvZGVfb25fdGhlX2ZseSA9IGRlY29kZV9vbl90aGVfZmx5OworCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50CitsYW1lX2dldF9kZWNvZGVfb25fdGhlX2ZseShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPmRlY29kZV9vbl90aGVfZmx5ICYmIDEgPj0gZ2ZwLT5kZWNvZGVfb25fdGhlX2ZseSk7CisKKyAgICByZXR1cm4gZ2ZwLT5kZWNvZGVfb25fdGhlX2ZseTsKK30KKworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECisvKiBERVBSRUNBVEVEOiBub3cgZG9lcyB0aGUgc2FtZSBhcyBsYW1lX3NldF9maW5kUmVwbGF5R2FpbigpCisgICBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfUmVwbGF5R2Fpbl9pbnB1dChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X1JlcGxheUdhaW5faW5wdXQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIERFUFJFQ0FURUQ6IG5vdyBkb2VzIHRoZSBzYW1lIGFzCisgICBsYW1lX3NldF9kZWNvZGVfb25fdGhlX2ZseSgpICYmIGxhbWVfc2V0X2ZpbmRSZXBsYXlHYWluKCkKKyAgIGRlZmF1bHQgPSAwIChkaXNhYmxlZCkgKi8KK2ludCBDREVDTCBsYW1lX3NldF9SZXBsYXlHYWluX2RlY29kZShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworaW50IENERUNMIGxhbWVfZ2V0X1JlcGxheUdhaW5fZGVjb2RlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBERVBSRUNBVEVEOiBub3cgZG9lcyB0aGUgc2FtZSBhcyBsYW1lX3NldF9kZWNvZGVfb25fdGhlX2ZseSgpCisgICBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCitpbnQgQ0RFQ0wgbGFtZV9zZXRfZmluZFBlYWtTYW1wbGUobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKK2ludCBDREVDTCBsYW1lX2dldF9maW5kUGVha1NhbXBsZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKyNlbHNlCisjZW5kaWYKKworLyogREVQUkVDQVRFRC4gc2FtZSBhcyBsYW1lX3NldF9kZWNvZGVfb25fdGhlX2ZseSgpICovCitpbnQKK2xhbWVfc2V0X2ZpbmRQZWFrU2FtcGxlKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgYXJnKQoreworICAgIHJldHVybiBsYW1lX3NldF9kZWNvZGVfb25fdGhlX2ZseShnZnAsIGFyZyk7Cit9CisKK2ludAorbGFtZV9nZXRfZmluZFBlYWtTYW1wbGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGxhbWVfZ2V0X2RlY29kZV9vbl90aGVfZmx5KGdmcCk7Cit9CisKKy8qIERFUFJFQ0FURUQuIHNhbWUgYXMgbGFtZV9zZXRfZmluZFJlcGxheUdhaW4oKSAqLworaW50CitsYW1lX3NldF9SZXBsYXlHYWluX2lucHV0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgYXJnKQoreworICAgIHJldHVybiBsYW1lX3NldF9maW5kUmVwbGF5R2FpbihnZnAsIGFyZyk7Cit9CisKK2ludAorbGFtZV9nZXRfUmVwbGF5R2Fpbl9pbnB1dChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gbGFtZV9nZXRfZmluZFJlcGxheUdhaW4oZ2ZwKTsKK30KKworLyogREVQUkVDQVRFRC4gc2FtZSBhcyBsYW1lX3NldF9kZWNvZGVfb25fdGhlX2ZseSgpICYmCisgICBsYW1lX3NldF9maW5kUmVwbGF5R2FpbigpICovCitpbnQKK2xhbWVfc2V0X1JlcGxheUdhaW5fZGVjb2RlKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgYXJnKQoreworICAgIGlmIChsYW1lX3NldF9kZWNvZGVfb25fdGhlX2ZseShnZnAsIGFyZykgPCAwIHx8IGxhbWVfc2V0X2ZpbmRSZXBsYXlHYWluKGdmcCwgYXJnKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X1JlcGxheUdhaW5fZGVjb2RlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGlmIChsYW1lX2dldF9kZWNvZGVfb25fdGhlX2ZseShnZnApID4gMCAmJiBsYW1lX2dldF9maW5kUmVwbGF5R2FpbihnZnApID4gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworCisvKiBzZXQgYW5kIGdldCBzb21lIGdhcGxlc3MgZW5jb2RpbmcgZmxhZ3MgKi8KKworaW50CitsYW1lX3NldF9ub2dhcF90b3RhbChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHRoZV9ub2dhcF90b3RhbCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGdmYy0+bm9nYXBfdG90YWwgPSB0aGVfbm9nYXBfdG90YWw7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfbm9nYXBfdG90YWwoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+aW50ZXJuYWxfZmxhZ3MtPm5vZ2FwX3RvdGFsOworfQorCitpbnQKK2xhbWVfc2V0X25vZ2FwX2N1cnJlbnRpbmRleChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHRoZV9ub2dhcF9pbmRleCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGdmYy0+bm9nYXBfY3VycmVudCA9IHRoZV9ub2dhcF9pbmRleDsKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9ub2dhcF9jdXJyZW50aW5kZXgoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+aW50ZXJuYWxfZmxhZ3MtPm5vZ2FwX2N1cnJlbnQ7Cit9CisKKworLyogbWVzc2FnZSBoYW5kbGVycyAqLworaW50CitsYW1lX3NldF9lcnJvcmYobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIHZvaWQgKCpmdW5jKSAoY29uc3QgY2hhciAqLCB2YV9saXN0KSkKK3sKKyAgICBnZnAtPnJlcG9ydC5lcnJvcmYgPSBmdW5jOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9zZXRfZGVidWdmKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCB2b2lkICgqZnVuYykgKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpCit7CisgICAgZ2ZwLT5yZXBvcnQuZGVidWdmID0gZnVuYzsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfc2V0X21zZ2YobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIHZvaWQgKCpmdW5jKSAoY29uc3QgY2hhciAqLCB2YV9saXN0KSkKK3sKKyAgICBnZnAtPnJlcG9ydC5tc2dmID0gZnVuYzsKKworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBTZXQgb25lIG9mCisgKiAgLSBicmF0ZQorICogIC0gY29tcHJlc3Npb24gcmF0aW8uCisgKgorICogRGVmYXVsdCBpcyBjb21wcmVzc2lvbiByYXRpbyBvZiAxMS4KKyAqLworaW50CitsYW1lX3NldF9icmF0ZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGJyYXRlKQoreworICAgIGdmcC0+YnJhdGUgPSBicmF0ZTsKKworICAgIGlmIChicmF0ZSA+IDMyMCkgeworICAgICAgICBnZnAtPmRpc2FibGVfcmVzZXJ2b2lyID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9icmF0ZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5icmF0ZTsKK30KKworaW50CitsYW1lX3NldF9jb21wcmVzc2lvbl9yYXRpbyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgZmxvYXQgY29tcHJlc3Npb25fcmF0aW8pCit7CisgICAgZ2ZwLT5jb21wcmVzc2lvbl9yYXRpbyA9IGNvbXByZXNzaW9uX3JhdGlvOworCisgICAgcmV0dXJuIDA7Cit9CisKK2Zsb2F0CitsYW1lX2dldF9jb21wcmVzc2lvbl9yYXRpbyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5jb21wcmVzc2lvbl9yYXRpbzsKK30KKworCisKKworLyoKKyAqIGZyYW1lIHBhcmFtZXRlcnMKKyAqLworCisvKiBNYXJrIGFzIGNvcHlyaWdodCBwcm90ZWN0ZWQuICovCitpbnQKK2xhbWVfc2V0X2NvcHlyaWdodChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGNvcHlyaWdodCkKK3sKKyAgICAvKiBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCisKKyAgICAvKiBlbmZvcmNlIGRpc2FibGUvZW5hYmxlIG1lYW5pbmcsIGlmIHdlIG5lZWQgbW9yZSB0aGFuIHR3byB2YWx1ZXMKKyAgICAgICB3ZSBuZWVkIHRvIHN3aXRjaCB0byBhbiBlbnVtIHRvIGhhdmUgYW4gYXByb3ByaWF0ZSByZXByZXNlbnRhdGlvbgorICAgICAgIG9mIHRoZSBwb3NzaWJsZSBtZWFuaW5ncyBvZiB0aGUgdmFsdWUgKi8KKyAgICBpZiAoMCA+IGNvcHlyaWdodCB8fCAxIDwgY29weXJpZ2h0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPmNvcHlyaWdodCA9IGNvcHlyaWdodDsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2NvcHlyaWdodChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPmNvcHlyaWdodCAmJiAxID49IGdmcC0+Y29weXJpZ2h0KTsKKworICAgIHJldHVybiBnZnAtPmNvcHlyaWdodDsKK30KKworCisvKiBNYXJrIGFzIG9yaWdpbmFsLiAqLworaW50CitsYW1lX3NldF9vcmlnaW5hbChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IG9yaWdpbmFsKQoreworICAgIC8qIGRlZmF1bHQgPSAxIChlbmFibGVkKSAqLworCisgICAgLyogZW5mb3JjZSBkaXNhYmxlL2VuYWJsZSBtZWFuaW5nLCBpZiB3ZSBuZWVkIG1vcmUgdGhhbiB0d28gdmFsdWVzCisgICAgICAgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYW4gZW51bSB0byBoYXZlIGFuIGFwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICBvZiB0aGUgcG9zc2libGUgbWVhbmluZ3Mgb2YgdGhlIHZhbHVlICovCisgICAgaWYgKDAgPiBvcmlnaW5hbCB8fCAxIDwgb3JpZ2luYWwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGdmcC0+b3JpZ2luYWwgPSBvcmlnaW5hbDsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X29yaWdpbmFsKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydCgwIDw9IGdmcC0+b3JpZ2luYWwgJiYgMSA+PSBnZnAtPm9yaWdpbmFsKTsKKworICAgIHJldHVybiBnZnAtPm9yaWdpbmFsOworfQorCisKKy8qCisgKiBlcnJvcl9wcm90ZWN0aW9uLgorICogVXNlIDIgYnl0ZXMgZnJvbSBlYWNoIGZyYW1lIGZvciBDUkMgY2hlY2tzdW0uCisgKi8KK2ludAorbGFtZV9zZXRfZXJyb3JfcHJvdGVjdGlvbihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGVycm9yX3Byb3RlY3Rpb24pCit7CisgICAgLyogZGVmYXVsdCA9IDAgKGRpc2FibGVkKSAqLworCisgICAgLyogZW5mb3JjZSBkaXNhYmxlL2VuYWJsZSBtZWFuaW5nLCBpZiB3ZSBuZWVkIG1vcmUgdGhhbiB0d28gdmFsdWVzCisgICAgICAgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYW4gZW51bSB0byBoYXZlIGFuIGFwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICBvZiB0aGUgcG9zc2libGUgbWVhbmluZ3Mgb2YgdGhlIHZhbHVlICovCisgICAgaWYgKDAgPiBlcnJvcl9wcm90ZWN0aW9uIHx8IDEgPCBlcnJvcl9wcm90ZWN0aW9uKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPmVycm9yX3Byb3RlY3Rpb24gPSBlcnJvcl9wcm90ZWN0aW9uOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfZXJyb3JfcHJvdGVjdGlvbihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPmVycm9yX3Byb3RlY3Rpb24gJiYgMSA+PSBnZnAtPmVycm9yX3Byb3RlY3Rpb24pOworCisgICAgcmV0dXJuIGdmcC0+ZXJyb3JfcHJvdGVjdGlvbjsKK30KKworCisjaWYgREVQUkVDQVRFRF9PUl9PQlNPTEVURV9DT0RFX1JFTU9WRUQKKy8qIHBhZGRpbmdfdHlwZS4gMD1wYWQgbm8gZnJhbWVzICAxPXBhZCBhbGwgZnJhbWVzIDI9YWRqdXN0IHBhZGRpbmcoZGVmYXVsdCkgKi8KK2ludCBDREVDTCBsYW1lX3NldF9wYWRkaW5nX3R5cGUobGFtZV9nbG9iYWxfZmxhZ3MgKiwgUGFkZGluZ190eXBlKTsKK1BhZGRpbmdfdHlwZSBDREVDTCBsYW1lX2dldF9wYWRkaW5nX3R5cGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisjZWxzZQorI2VuZGlmCisKKy8qCisgKiBwYWRkaW5nX3R5cGUuCisgKiAgUEFEX05PICAgICA9IHBhZCBubyBmcmFtZXMKKyAqICBQQURfQUxMICAgID0gcGFkIGFsbCBmcmFtZXMKKyAqICBQQURfQURKVVNUID0gYWRqdXN0IHBhZGRpbmcKKyAqLworaW50CitsYW1lX3NldF9wYWRkaW5nX3R5cGUobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIFBhZGRpbmdfdHlwZSBwYWRkaW5nX3R5cGUpCit7CisgICAgKHZvaWQpIGdmcDsKKyAgICAodm9pZCkgcGFkZGluZ190eXBlOworICAgIHJldHVybiAwOworfQorCitQYWRkaW5nX3R5cGUKK2xhbWVfZ2V0X3BhZGRpbmdfdHlwZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICAodm9pZCkgZ2ZwOworICAgIHJldHVybiBQQURfQURKVVNUOworfQorCisKKy8qIE1QMyAncHJpdmF0ZSBleHRlbnNpb24nIGJpdC4gTWVhbmluZ2xlc3MuICovCitpbnQKK2xhbWVfc2V0X2V4dGVuc2lvbihsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGV4dGVuc2lvbikKK3sKKyAgICAvKiBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCisKKyAgICAvKiBlbmZvcmNlIGRpc2FibGUvZW5hYmxlIG1lYW5pbmcsIGlmIHdlIG5lZWQgbW9yZSB0aGFuIHR3byB2YWx1ZXMKKyAgICAgICB3ZSBuZWVkIHRvIHN3aXRjaCB0byBhbiBlbnVtIHRvIGhhdmUgYW4gYXByb3ByaWF0ZSByZXByZXNlbnRhdGlvbgorICAgICAgIG9mIHRoZSBwb3NzaWJsZSBtZWFuaW5ncyBvZiB0aGUgdmFsdWUgKi8KKyAgICBpZiAoMCA+IGV4dGVuc2lvbiB8fCAxIDwgZXh0ZW5zaW9uKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2V4dGVuc2lvbihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPmV4dGVuc2lvbiAmJiAxID49IGdmcC0+ZXh0ZW5zaW9uKTsKKworICAgIHJldHVybiBnZnAtPmV4dGVuc2lvbjsKK30KKworCisvKiBFbmZvcmNlIHN0cmljdCBJU08gY29tcGxpYW5jZS4gKi8KK2ludAorbGFtZV9zZXRfc3RyaWN0X0lTTyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHN0cmljdF9JU08pCit7CisgICAgLyogZGVmYXVsdCA9IDAgKGRpc2FibGVkKSAqLworCisgICAgLyogZW5mb3JjZSBkaXNhYmxlL2VuYWJsZSBtZWFuaW5nLCBpZiB3ZSBuZWVkIG1vcmUgdGhhbiB0d28gdmFsdWVzCisgICAgICAgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYW4gZW51bSB0byBoYXZlIGFuIGFwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICBvZiB0aGUgcG9zc2libGUgbWVhbmluZ3Mgb2YgdGhlIHZhbHVlICovCisgICAgaWYgKDAgPiBzdHJpY3RfSVNPIHx8IDEgPCBzdHJpY3RfSVNPKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPnN0cmljdF9JU08gPSBzdHJpY3RfSVNPOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfc3RyaWN0X0lTTyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPnN0cmljdF9JU08gJiYgMSA+PSBnZnAtPnN0cmljdF9JU08pOworCisgICAgcmV0dXJuIGdmcC0+c3RyaWN0X0lTTzsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBxdWFudGl6YXRpb24vbm9pc2Ugc2hhcGluZyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGlzYWJsZSB0aGUgYml0IHJlc2Vydm9pci4gRm9yIHRlc3Rpbmcgb25seS4gKi8KK2ludAorbGFtZV9zZXRfZGlzYWJsZV9yZXNlcnZvaXIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBkaXNhYmxlX3Jlc2Vydm9pcikKK3sKKyAgICAvKiBkZWZhdWx0ID0gMCAoZGlzYWJsZWQpICovCisKKyAgICAvKiBlbmZvcmNlIGRpc2FibGUvZW5hYmxlIG1lYW5pbmcsIGlmIHdlIG5lZWQgbW9yZSB0aGFuIHR3byB2YWx1ZXMKKyAgICAgICB3ZSBuZWVkIHRvIHN3aXRjaCB0byBhbiBlbnVtIHRvIGhhdmUgYW4gYXByb3ByaWF0ZSByZXByZXNlbnRhdGlvbgorICAgICAgIG9mIHRoZSBwb3NzaWJsZSBtZWFuaW5ncyBvZiB0aGUgdmFsdWUgKi8KKyAgICBpZiAoMCA+IGRpc2FibGVfcmVzZXJ2b2lyIHx8IDEgPCBkaXNhYmxlX3Jlc2Vydm9pcikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZ2ZwLT5kaXNhYmxlX3Jlc2Vydm9pciA9IGRpc2FibGVfcmVzZXJ2b2lyOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfZGlzYWJsZV9yZXNlcnZvaXIoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgYXNzZXJ0KDAgPD0gZ2ZwLT5kaXNhYmxlX3Jlc2Vydm9pciAmJiAxID49IGdmcC0+ZGlzYWJsZV9yZXNlcnZvaXIpOworCisgICAgcmV0dXJuIGdmcC0+ZGlzYWJsZV9yZXNlcnZvaXI7Cit9CisKKworCisKK2ludAorbGFtZV9zZXRfZXhwZXJpbWVudGFsWChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGV4cGVyaW1lbnRhbFgpCit7CisgICAgbGFtZV9zZXRfcXVhbnRfY29tcChnZnAsIGV4cGVyaW1lbnRhbFgpOworICAgIGxhbWVfc2V0X3F1YW50X2NvbXBfc2hvcnQoZ2ZwLCBleHBlcmltZW50YWxYKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2V4cGVyaW1lbnRhbFgoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGxhbWVfZ2V0X3F1YW50X2NvbXAoZ2ZwKTsKK30KKworCisvKiBTZWxlY3QgYSBkaWZmZXJlbnQgImJlc3QgcXVhbnRpemF0aW9uIiBmdW5jdGlvbi4gZGVmYXVsdCA9IDAgKi8KK2ludAorbGFtZV9zZXRfcXVhbnRfY29tcChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHF1YW50X3R5cGUpCit7CisgICAgZ2ZwLT5xdWFudF9jb21wID0gcXVhbnRfdHlwZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X3F1YW50X2NvbXAoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+cXVhbnRfY29tcDsKK30KKworCisvKiBTZWxlY3QgYSBkaWZmZXJlbnQgImJlc3QgcXVhbnRpemF0aW9uIiBmdW5jdGlvbi4gZGVmYXVsdCA9IDAgKi8KK2ludAorbGFtZV9zZXRfcXVhbnRfY29tcF9zaG9ydChsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHF1YW50X3R5cGUpCit7CisgICAgZ2ZwLT5xdWFudF9jb21wX3Nob3J0ID0gcXVhbnRfdHlwZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X3F1YW50X2NvbXBfc2hvcnQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+cXVhbnRfY29tcF9zaG9ydDsKK30KKworCisvKiBBbm90aGVyIGV4cGVyaW1lbnRhbCBvcHRpb24uIEZvciB0ZXN0aW5nIG9ubHkuICovCitpbnQKK2xhbWVfc2V0X2V4cGVyaW1lbnRhbFkobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBleHBlcmltZW50YWxZKQoreworICAgIGdmcC0+ZXhwZXJpbWVudGFsWSA9IGV4cGVyaW1lbnRhbFk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9leHBlcmltZW50YWxZKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPmV4cGVyaW1lbnRhbFk7Cit9CisKKworaW50CitsYW1lX3NldF9leHBlcmltZW50YWxaKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgZXhwZXJpbWVudGFsWikKK3sKKyAgICBnZnAtPmV4cGVyaW1lbnRhbFogPSBleHBlcmltZW50YWxaOworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2V4cGVyaW1lbnRhbFooY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+ZXhwZXJpbWVudGFsWjsKK30KKworCisvKiBOYW9raSdzIHBzeWNobyBhY291c3RpYyBtb2RlbC4gKi8KK2ludAorbGFtZV9zZXRfZXhwX25zcHN5dHVuZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGV4cF9uc3BzeXR1bmUpCit7CisgICAgLyogZGVmYXVsdCA9IDAgKGRpc2FibGVkKSAqLworCisgICAgZ2ZwLT5leHBfbnNwc3l0dW5lID0gZXhwX25zcHN5dHVuZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2V4cF9uc3BzeXR1bmUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+ZXhwX25zcHN5dHVuZTsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWQlIgY29udHJvbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUeXBlcyBvZiBWQlIuICBkZWZhdWx0ID0gdmJyX29mZiA9IENCUiAqLworaW50CitsYW1lX3NldF9WQlIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIHZicl9tb2RlIFZCUikKK3sKKyAgICBpbnQgICAgIHZicl9xID0gVkJSOworCisgICAgaWYgKDAgPiB2YnJfcSB8fCB2YnJfbWF4X2luZGljYXRvciA8PSB2YnJfcSkKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIFVua25vd24gVkJSIG1vZGUhICovCisKKyAgICBnZnAtPlZCUiA9IFZCUjsKKworICAgIHJldHVybiAwOworfQorCit2YnJfbW9kZQorbGFtZV9nZXRfVkJSKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydChnZnAtPlZCUiA8IHZicl9tYXhfaW5kaWNhdG9yKTsKKworICAgIHJldHVybiBnZnAtPlZCUjsKK30KKworCisvKgorICogVkJSIHF1YWxpdHkgbGV2ZWwuCisgKiAgMCA9IGhpZ2hlc3QKKyAqICA5ID0gbG93ZXN0IAorICovCitpbnQKK2xhbWVfc2V0X1ZCUl9xKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgVkJSX3EpCit7CisgICAgaW50ICAgICByZXQgPSAwOworCisgICAgaWYgKDAgPiBWQlJfcSkgeworICAgICAgICByZXQgPSAtMTsgICAgICAgLyogVW5rbm93biBWQlIgcXVhbGl0eSBsZXZlbCEgKi8KKyAgICAgICAgVkJSX3EgPSAwOworICAgIH0KKyAgICBpZiAoOSA8IFZCUl9xKSB7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBWQlJfcSA9IDk7CisgICAgfQorCisgICAgZ2ZwLT5WQlJfcSA9IFZCUl9xOworICAgIGdmcC0+VkJSX3FfZnJhYyA9IDA7CisvKiAgICBsYW1lX3NldF9BVEhjdXJ2ZShnZnAsIFZCUl9xKTsKKyovCisgICAgcmV0dXJuIHJldDsKK30KKworaW50CitsYW1lX2dldF9WQlJfcShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPlZCUl9xICYmIDEwID4gZ2ZwLT5WQlJfcSk7CisKKyAgICByZXR1cm4gZ2ZwLT5WQlJfcTsKK30KKworaW50CitsYW1lX3NldF9WQlJfcXVhbGl0eShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgZmxvYXQgVkJSX3EpCit7CisgICAgaW50ICAgICByZXQgPSAwOworCisgICAgaWYgKDAgPiBWQlJfcSkgeworICAgICAgICByZXQgPSAtMTsgICAgICAgLyogVW5rbm93biBWQlIgcXVhbGl0eSBsZXZlbCEgKi8KKyAgICAgICAgVkJSX3EgPSAwOworICAgIH0KKyAgICBpZiAoOS45OTkgPCBWQlJfcSkgeworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgVkJSX3EgPSA5Ljk5OTsKKyAgICB9CisKKyAgICBnZnAtPlZCUl9xID0gKGludCkgVkJSX3E7CisgICAgZ2ZwLT5WQlJfcV9mcmFjID0gVkJSX3EgLSBnZnAtPlZCUl9xOworCisgICAgcmV0dXJuIHJldDsKK30KKworZmxvYXQKK2xhbWVfZ2V0X1ZCUl9xdWFsaXR5KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPlZCUl9xICsgZ2ZwLT5WQlJfcV9mcmFjOworfQorCisKKy8qIElnbm9yZWQgZXhjZXB0IGZvciBWQlIgPSB2YnJfYWJyIChBQlIgbW9kZSkgKi8KK2ludAorbGFtZV9zZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgVkJSX21lYW5fYml0cmF0ZV9rYnBzKQoreworICAgIGdmcC0+VkJSX21lYW5fYml0cmF0ZV9rYnBzID0gVkJSX21lYW5fYml0cmF0ZV9rYnBzOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfVkJSX21lYW5fYml0cmF0ZV9rYnBzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPlZCUl9tZWFuX2JpdHJhdGVfa2JwczsKK30KKworaW50CitsYW1lX3NldF9WQlJfbWluX2JpdHJhdGVfa2JwcyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IFZCUl9taW5fYml0cmF0ZV9rYnBzKQoreworICAgIGdmcC0+VkJSX21pbl9iaXRyYXRlX2ticHMgPSBWQlJfbWluX2JpdHJhdGVfa2JwczsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X1ZCUl9taW5fYml0cmF0ZV9rYnBzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPlZCUl9taW5fYml0cmF0ZV9rYnBzOworfQorCitpbnQKK2xhbWVfc2V0X1ZCUl9tYXhfYml0cmF0ZV9rYnBzKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgVkJSX21heF9iaXRyYXRlX2ticHMpCit7CisgICAgZ2ZwLT5WQlJfbWF4X2JpdHJhdGVfa2JwcyA9IFZCUl9tYXhfYml0cmF0ZV9rYnBzOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfVkJSX21heF9iaXRyYXRlX2ticHMoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+VkJSX21heF9iaXRyYXRlX2ticHM7Cit9CisKKworLyoKKyAqIFN0cmljdGx5IGVuZm9yY2UgVkJSX21pbl9iaXRyYXRlLgorICogTm9ybWFsbHkgaXQgd2lsbCBiZSB2aW9sYXRlZCBmb3IgYW5hbG9nIHNpbGVuY2UuCisgKi8KK2ludAorbGFtZV9zZXRfVkJSX2hhcmRfbWluKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgVkJSX2hhcmRfbWluKQoreworICAgIC8qIGRlZmF1bHQgPSAwIChkaXNhYmxlZCkgKi8KKworICAgIC8qIGVuZm9yY2UgZGlzYWJsZS9lbmFibGUgbWVhbmluZywgaWYgd2UgbmVlZCBtb3JlIHRoYW4gdHdvIHZhbHVlcworICAgICAgIHdlIG5lZWQgdG8gc3dpdGNoIHRvIGFuIGVudW0gdG8gaGF2ZSBhbiBhcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uCisgICAgICAgb2YgdGhlIHBvc3NpYmxlIG1lYW5pbmdzIG9mIHRoZSB2YWx1ZSAqLworICAgIGlmICgwID4gVkJSX2hhcmRfbWluIHx8IDEgPCBWQlJfaGFyZF9taW4pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGdmcC0+VkJSX2hhcmRfbWluID0gVkJSX2hhcmRfbWluOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfVkJSX2hhcmRfbWluKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydCgwIDw9IGdmcC0+VkJSX2hhcmRfbWluICYmIDEgPj0gZ2ZwLT5WQlJfaGFyZF9taW4pOworCisgICAgcmV0dXJuIGdmcC0+VkJSX2hhcmRfbWluOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmlsdGVyaW5nIGNvbnRyb2wKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZyZXFlbmN5IGluIEh6IHRvIGFwcGx5IGxvd3Bhc3MuCisgKiAgIDAgPSBkZWZhdWx0ID0gbGFtZSBjaG9vc2VzCisgKiAgLTEgPSBkaXNhYmxlZAorICovCitpbnQKK2xhbWVfc2V0X2xvd3Bhc3NmcmVxKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgbG93cGFzc2ZyZXEpCit7CisgICAgZ2ZwLT5sb3dwYXNzZnJlcSA9IGxvd3Bhc3NmcmVxOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfbG93cGFzc2ZyZXEoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+bG93cGFzc2ZyZXE7Cit9CisKKworLyoKKyAqIFdpZHRoIG9mIHRyYW5zaXRpb24gYmFuZCAoaW4gSHopLgorICogIGRlZmF1bHQgPSBvbmUgcG9seXBoYXNlIGZpbHRlciBiYW5kCisgKi8KK2ludAorbGFtZV9zZXRfbG93cGFzc3dpZHRoKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgbG93cGFzc3dpZHRoKQoreworICAgIGdmcC0+bG93cGFzc3dpZHRoID0gbG93cGFzc3dpZHRoOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfbG93cGFzc3dpZHRoKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPmxvd3Bhc3N3aWR0aDsKK30KKworCisvKgorICogRnJlcXVlbmN5IGluIEh6IHRvIGFwcGx5IGhpZ2hwYXNzLgorICogICAwID0gZGVmYXVsdCA9IGxhbWUgY2hvb3NlcworICogIC0xID0gZGlzYWJsZWQKKyAqLworaW50CitsYW1lX3NldF9oaWdocGFzc2ZyZXEobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBoaWdocGFzc2ZyZXEpCit7CisgICAgZ2ZwLT5oaWdocGFzc2ZyZXEgPSBoaWdocGFzc2ZyZXE7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9oaWdocGFzc2ZyZXEoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+aGlnaHBhc3NmcmVxOworfQorCisKKy8qCisgKiBXaWR0aCBvZiB0cmFuc2l0aW9uIGJhbmQgKGluIEh6KS4KKyAqICBkZWZhdWx0ID0gb25lIHBvbHlwaGFzZSBmaWx0ZXIgYmFuZAorICovCitpbnQKK2xhbWVfc2V0X2hpZ2hwYXNzd2lkdGgobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBoaWdocGFzc3dpZHRoKQoreworICAgIGdmcC0+aGlnaHBhc3N3aWR0aCA9IGhpZ2hwYXNzd2lkdGg7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9oaWdocGFzc3dpZHRoKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPmhpZ2hwYXNzd2lkdGg7Cit9CisKKworCisKKy8qCisgKiBwc3ljaG8gYWNvdXN0aWNzIGFuZCBvdGhlciBhcmd1bWVudHMgd2hpY2ggeW91IHNob3VsZCBub3QgY2hhbmdlIAorICogdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworICovCisKKworLyogQWRqdXN0IG1hc2tpbmcgdmFsdWVzLiAqLworaW50CitsYW1lX3NldF9tYXNraW5nYWRqdXN0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBmbG9hdCBhZGp1c3QpCit7CisgICAgZ2ZwLT5tYXNraW5nYWRqdXN0ID0gYWRqdXN0OworICAgIHJldHVybiAwOworfQorCitmbG9hdAorbGFtZV9nZXRfbWFza2luZ2FkanVzdChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5tYXNraW5nYWRqdXN0OworfQorCitpbnQKK2xhbWVfc2V0X21hc2tpbmdhZGp1c3Rfc2hvcnQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IGFkanVzdCkKK3sKKyAgICBnZnAtPm1hc2tpbmdhZGp1c3Rfc2hvcnQgPSBhZGp1c3Q7CisgICAgcmV0dXJuIDA7Cit9CisKK2Zsb2F0CitsYW1lX2dldF9tYXNraW5nYWRqdXN0X3Nob3J0KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPm1hc2tpbmdhZGp1c3Rfc2hvcnQ7Cit9CisKKy8qIE9ubHkgdXNlIEFUSCBmb3IgbWFza2luZy4gKi8KK2ludAorbGFtZV9zZXRfQVRIb25seShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IEFUSG9ubHkpCit7CisgICAgZ2ZwLT5BVEhvbmx5ID0gQVRIb25seTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X0FUSG9ubHkoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+QVRIb25seTsKK30KKworCisvKiBPbmx5IHVzZSBBVEggZm9yIHNob3J0IGJsb2Nrcy4gKi8KK2ludAorbGFtZV9zZXRfQVRIc2hvcnQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBBVEhzaG9ydCkKK3sKKyAgICBnZnAtPkFUSHNob3J0ID0gQVRIc2hvcnQ7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9BVEhzaG9ydChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5BVEhzaG9ydDsKK30KKworCisvKiBEaXNhYmxlIEFUSC4gKi8KK2ludAorbGFtZV9zZXRfbm9BVEgobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBub0FUSCkKK3sKKyAgICBnZnAtPm5vQVRIID0gbm9BVEg7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9ub0FUSChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5ub0FUSDsKK30KKworCisvKiBTZWxlY3QgQVRIIGZvcm11bGEuICovCitpbnQKK2xhbWVfc2V0X0FUSHR5cGUobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBBVEh0eXBlKQoreworICAgIC8qIFhYWDogQVRIdHlwZSBzaG91bGQgYmUgY29udmVydGVkIHRvIGFuIGVudW0uICovCisgICAgZ2ZwLT5BVEh0eXBlID0gQVRIdHlwZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X0FUSHR5cGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+QVRIdHlwZTsKK30KKworCisvKiBTZWxlY3QgQVRIIGZvcm11bGEgNCBzaGFwZS4gKi8KK2ludAorbGFtZV9zZXRfQVRIY3VydmUobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IEFUSGN1cnZlKQoreworICAgIGdmcC0+QVRIY3VydmUgPSBBVEhjdXJ2ZTsKKworICAgIHJldHVybiAwOworfQorCitmbG9hdAorbGFtZV9nZXRfQVRIY3VydmUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+QVRIY3VydmU7Cit9CisKKworLyogTG93ZXIgQVRIIGJ5IHRoaXMgbWFueSBkYi4gKi8KK2ludAorbGFtZV9zZXRfQVRIbG93ZXIobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IEFUSGxvd2VyKQoreworICAgIGdmcC0+QVRIbG93ZXIgPSAtQVRIbG93ZXIgLyAxMC4wOworICAgIHJldHVybiAwOworfQorCitmbG9hdAorbGFtZV9nZXRfQVRIbG93ZXIoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIC1nZnAtPkFUSGxvd2VyICogMTAuMDsKK30KKworCisvKiBTZWxlY3QgQVRIIGFkYXB0aXZlIGFkanVzdG1lbnQgc2NoZW1lLiAqLworaW50CitsYW1lX3NldF9hdGhhYV90eXBlKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgYXRoYWFfdHlwZSkKK3sKKyAgICBnZnAtPmF0aGFhX3R5cGUgPSBhdGhhYV90eXBlOworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2F0aGFhX3R5cGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+YXRoYWFfdHlwZTsKK30KKworCisvKiBTZWxlY3QgdGhlIGxvdWRuZXNzIGFwcHJveGltYXRpb24gdXNlZCBieSB0aGUgQVRIIGFkYXB0aXZlIGF1dG8tbGV2ZWxpbmcuICovCitpbnQKK2xhbWVfc2V0X2F0aGFhX2xvdWRhcHByb3gobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBhdGhhYV9sb3VkYXBwcm94KQoreworICAgICh2b2lkKSBhdGhhYV9sb3VkYXBwcm94OworICAgIEVSUk9SRihnZnAtPmludGVybmFsX2ZsYWdzLCAiLS1hdGhhYS1sb3VkYXBwcm94IGlzIG9ic29sZXRlXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9hdGhhYV9sb3VkYXBwcm94KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgICh2b2lkKSBnZnA7CisgICAgLyogb2Jzb2xldGUsIHRoZSB0eXBlIGtub3duIHVuZGVyIG51bWJlciAyIGlzIHRoZSBvbmx5IHN1cnZpdmFsICovCisgICAgcmV0dXJuIDI7Cit9CisKKworLyogQWRqdXN0IChpbiBkQikgdGhlIHBvaW50IGJlbG93IHdoaWNoIGFkYXB0aXZlIEFUSCBsZXZlbCBhZGp1c3RtZW50IG9jY3Vycy4gKi8KK2ludAorbGFtZV9zZXRfYXRoYWFfc2Vuc2l0aXZpdHkobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IGF0aGFhX3NlbnNpdGl2aXR5KQoreworICAgIGdmcC0+YXRoYWFfc2Vuc2l0aXZpdHkgPSBhdGhhYV9zZW5zaXRpdml0eTsKKworICAgIHJldHVybiAwOworfQorCitmbG9hdAorbGFtZV9nZXRfYXRoYWFfc2Vuc2l0aXZpdHkoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+YXRoYWFfc2Vuc2l0aXZpdHk7Cit9CisKKworLyogUHJlZGljdGFiaWxpdHkgbGltaXQgKElTTyB0b25hbGl0eSBmb3JtdWxhKSAqLworaW50ICAgICBsYW1lX3NldF9jd2xpbWl0KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgY3dsaW1pdCk7CitpbnQgICAgIGxhbWVfZ2V0X2N3bGltaXQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApOworCitpbnQKK2xhbWVfc2V0X2N3bGltaXQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBjd2xpbWl0KQoreworICAgICh2b2lkKSBnZnA7CisgICAgKHZvaWQpIGN3bGltaXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfY3dsaW1pdChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICAodm9pZCkgZ2ZwOworICAgIHJldHVybiAwOworfQorCisKKworLyoKKyAqIEFsbG93IGJsb2NrdHlwZXMgdG8gZGlmZmVyIGJldHdlZW4gY2hhbm5lbHMuCisgKiBkZWZhdWx0OgorICogIDAgZm9yIGpzdGVyZW8gPT4gYmxvY2sgdHlwZXMgY291cGxlZAorICogIDEgZm9yIHN0ZXJlbyAgPT4gYmxvY2sgdHlwZXMgbWF5IGRpZmZlcgorICovCitpbnQKK2xhbWVfc2V0X2FsbG93X2RpZmZfc2hvcnQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBhbGxvd19kaWZmX3Nob3J0KQoreworICAgIGdmcC0+c2hvcnRfYmxvY2tzID0gYWxsb3dfZGlmZl9zaG9ydCA/IHNob3J0X2Jsb2NrX2FsbG93ZWQgOiBzaG9ydF9ibG9ja19jb3VwbGVkOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfYWxsb3dfZGlmZl9zaG9ydChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBpZiAoZ2ZwLT5zaG9ydF9ibG9ja3MgPT0gc2hvcnRfYmxvY2tfYWxsb3dlZCkKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgIC8qIHNob3J0IGJsb2NrcyBhbGxvd2VkIHRvIGRpZmZlciAqLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8qIG5vdCBzZXQsIGRpc3BlbnNlZCwgZm9yY2VkIG9yIGNvdXBsZWQgKi8KK30KKworCisvKiBVc2UgdGVtcG9yYWwgbWFza2luZyBlZmZlY3QgKi8KK2ludAorbGFtZV9zZXRfdXNlVGVtcG9yYWwobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCB1c2VUZW1wb3JhbCkKK3sKKyAgICAvKiBkZWZhdWx0ID0gMSAoZW5hYmxlZCkgKi8KKworICAgIC8qIGVuZm9yY2UgZGlzYWJsZS9lbmFibGUgbWVhbmluZywgaWYgd2UgbmVlZCBtb3JlIHRoYW4gdHdvIHZhbHVlcworICAgICAgIHdlIG5lZWQgdG8gc3dpdGNoIHRvIGFuIGVudW0gdG8gaGF2ZSBhbiBhcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uCisgICAgICAgb2YgdGhlIHBvc3NpYmxlIG1lYW5pbmdzIG9mIHRoZSB2YWx1ZSAqLworICAgIGlmICgwID4gdXNlVGVtcG9yYWwgfHwgMSA8IHVzZVRlbXBvcmFsKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPnVzZVRlbXBvcmFsID0gdXNlVGVtcG9yYWw7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF91c2VUZW1wb3JhbChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPnVzZVRlbXBvcmFsICYmIDEgPj0gZ2ZwLT51c2VUZW1wb3JhbCk7CisKKyAgICByZXR1cm4gZ2ZwLT51c2VUZW1wb3JhbDsKK30KKworCisvKiBVc2UgaW50ZXItY2hhbm5lbCBtYXNraW5nIGVmZmVjdCAqLworaW50CitsYW1lX3NldF9pbnRlckNoUmF0aW8obGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IHJhdGlvKQoreworICAgIC8qIGRlZmF1bHQgPSAwLjAgKG5vIGludGVyLWNoYW5uZWwgbWFza2luKSAqLworICAgIGlmICghKDAgPD0gcmF0aW8gJiYgcmF0aW8gPD0gMS4wKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZ2ZwLT5pbnRlckNoUmF0aW8gPSByYXRpbzsKKworICAgIHJldHVybiAwOworfQorCitmbG9hdAorbGFtZV9nZXRfaW50ZXJDaFJhdGlvKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGFzc2VydCgoMCA8PSBnZnAtPmludGVyQ2hSYXRpbyAmJiBnZnAtPmludGVyQ2hSYXRpbyA8PSAxLjApIHx8IEVRKGdmcC0+aW50ZXJDaFJhdGlvLCAtMSkpOworCisgICAgcmV0dXJuIGdmcC0+aW50ZXJDaFJhdGlvOworfQorCisKKy8qIFVzZSBwc2V1ZG8gc3Vic3RlcCBzaGFwaW5nIG1ldGhvZCAqLworaW50CitsYW1lX3NldF9zdWJzdGVwKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgbWV0aG9kKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgLyogZGVmYXVsdCA9IDAuMCAobm8gc3Vic3RlcCBub2lzZSBzaGFwaW5nKSAqLworICAgIGlmICghKDAgPD0gbWV0aG9kICYmIG1ldGhvZCA8PSA3KSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZ2ZjLT5zdWJzdGVwX3NoYXBpbmcgPSBtZXRob2Q7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfc3Vic3RlcChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGFzc2VydCgwIDw9IGdmYy0+c3Vic3RlcF9zaGFwaW5nICYmIGdmYy0+c3Vic3RlcF9zaGFwaW5nIDw9IDcpOworICAgIHJldHVybiBnZmMtPnN1YnN0ZXBfc2hhcGluZzsKK30KKworLyogc2NhbGVmYWN0b3JzIHNjYWxlICovCitpbnQKK2xhbWVfc2V0X3Nmc2NhbGUobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCB2YWwpCit7CisgICAgaWYgKHZhbCkKKyAgICAgICAgZ2ZwLT5pbnRlcm5hbF9mbGFncy0+bm9pc2Vfc2hhcGluZyA9IDI7CisgICAgZWxzZQorICAgICAgICBnZnAtPmludGVybmFsX2ZsYWdzLT5ub2lzZV9zaGFwaW5nID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9zZnNjYWxlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiAoZ2ZwLT5pbnRlcm5hbF9mbGFncy0+bm9pc2Vfc2hhcGluZyA9PSAyKTsKK30KKworLyogc3ViYmxvY2sgZ2FpbiAqLworaW50CitsYW1lX3NldF9zdWJibG9ja19nYWluKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgc2JnYWluKQoreworICAgIGdmcC0+aW50ZXJuYWxfZmxhZ3MtPnN1YmJsb2NrX2dhaW4gPSBzYmdhaW47CisgICAgcmV0dXJuIHNiZ2FpbjsKK30KKworaW50CitsYW1lX2dldF9zdWJibG9ja19nYWluKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPmludGVybmFsX2ZsYWdzLT5zdWJibG9ja19nYWluOworfQorCisKKy8qIERpc2FibGUgc2hvcnQgYmxvY2tzLiAqLworaW50CitsYW1lX3NldF9ub19zaG9ydF9ibG9ja3MobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBub19zaG9ydF9ibG9ja3MpCit7CisgICAgLyogZW5mb3JjZSBkaXNhYmxlL2VuYWJsZSBtZWFuaW5nLCBpZiB3ZSBuZWVkIG1vcmUgdGhhbiB0d28gdmFsdWVzCisgICAgICAgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYW4gZW51bSB0byBoYXZlIGFuIGFwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICBvZiB0aGUgcG9zc2libGUgbWVhbmluZ3Mgb2YgdGhlIHZhbHVlICovCisgICAgaWYgKDAgPiBub19zaG9ydF9ibG9ja3MgfHwgMSA8IG5vX3Nob3J0X2Jsb2NrcykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZ2ZwLT5zaG9ydF9ibG9ja3MgPSBub19zaG9ydF9ibG9ja3MgPyBzaG9ydF9ibG9ja19kaXNwZW5zZWQgOiBzaG9ydF9ibG9ja19hbGxvd2VkOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbGFtZV9nZXRfbm9fc2hvcnRfYmxvY2tzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHN3aXRjaCAoZ2ZwLT5zaG9ydF9ibG9ja3MpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2Ugc2hvcnRfYmxvY2tfbm90X3NldDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNhc2Ugc2hvcnRfYmxvY2tfZGlzcGVuc2VkOgorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIHNob3J0X2Jsb2NrX2FsbG93ZWQ6CisgICAgY2FzZSBzaG9ydF9ibG9ja19jb3VwbGVkOgorICAgIGNhc2Ugc2hvcnRfYmxvY2tfZm9yY2VkOgorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKworLyogRm9yY2Ugc2hvcnQgYmxvY2tzLiAqLworaW50CitsYW1lX3NldF9mb3JjZV9zaG9ydF9ibG9ja3MobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBzaG9ydF9ibG9ja3MpCit7CisgICAgLyogZW5mb3JjZSBkaXNhYmxlL2VuYWJsZSBtZWFuaW5nLCBpZiB3ZSBuZWVkIG1vcmUgdGhhbiB0d28gdmFsdWVzCisgICAgICAgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYW4gZW51bSB0byBoYXZlIGFuIGFwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24KKyAgICAgICBvZiB0aGUgcG9zc2libGUgbWVhbmluZ3Mgb2YgdGhlIHZhbHVlICovCisgICAgaWYgKDAgPiBzaG9ydF9ibG9ja3MgfHwgMSA8IHNob3J0X2Jsb2NrcykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHNob3J0X2Jsb2NrcyA9PSAxKQorICAgICAgICBnZnAtPnNob3J0X2Jsb2NrcyA9IHNob3J0X2Jsb2NrX2ZvcmNlZDsKKyAgICBlbHNlIGlmIChnZnAtPnNob3J0X2Jsb2NrcyA9PSBzaG9ydF9ibG9ja19mb3JjZWQpCisgICAgICAgIGdmcC0+c2hvcnRfYmxvY2tzID0gc2hvcnRfYmxvY2tfYWxsb3dlZDsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK2xhbWVfZ2V0X2ZvcmNlX3Nob3J0X2Jsb2Nrcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBzd2l0Y2ggKGdmcC0+c2hvcnRfYmxvY2tzKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIHNob3J0X2Jsb2NrX25vdF9zZXQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICBjYXNlIHNob3J0X2Jsb2NrX2Rpc3BlbnNlZDoKKyAgICBjYXNlIHNob3J0X2Jsb2NrX2FsbG93ZWQ6CisgICAgY2FzZSBzaG9ydF9ibG9ja19jb3VwbGVkOgorICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIHNob3J0X2Jsb2NrX2ZvcmNlZDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitpbnQKK2xhbWVfc2V0X3Nob3J0X3RocmVzaG9sZF9scm0obGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGZsb2F0IGxybSkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGdmYy0+bnNQc3kuYXR0YWNrdGhyZSA9IGxybTsKKyAgICByZXR1cm4gMDsKK30KKworZmxvYXQKK2xhbWVfZ2V0X3Nob3J0X3RocmVzaG9sZF9scm0oY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICByZXR1cm4gZ2ZjLT5uc1BzeS5hdHRhY2t0aHJlOworfQorCitpbnQKK2xhbWVfc2V0X3Nob3J0X3RocmVzaG9sZF9zKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBmbG9hdCBzKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgZ2ZjLT5uc1BzeS5hdHRhY2t0aHJlX3MgPSBzOworICAgIHJldHVybiAwOworfQorCitmbG9hdAorbGFtZV9nZXRfc2hvcnRfdGhyZXNob2xkX3MoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICByZXR1cm4gZ2ZjLT5uc1BzeS5hdHRhY2t0aHJlX3M7Cit9CisKK2ludAorbGFtZV9zZXRfc2hvcnRfdGhyZXNob2xkKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBmbG9hdCBscm0sIGZsb2F0IHMpCit7CisgICAgbGFtZV9zZXRfc2hvcnRfdGhyZXNob2xkX2xybShnZnAsIGxybSk7CisgICAgbGFtZV9zZXRfc2hvcnRfdGhyZXNob2xkX3MoZ2ZwLCBzKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogSW5wdXQgUENNIGlzIGVtcGhhc2VkIFBDTQorICogKGZvciBpbnN0YW5jZSBmcm9tIG9uZSBvZiB0aGUgcmFyZWx5IGVtcGhhc2VkIENEcykuCisgKgorICogSXQgaXMgU1RST05HTFkgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzLCBiZWNhdXNlIHBzeWNobyBkb2VzIG5vdAorICogdGFrZSBpdCBpbnRvIGFjY291bnQsIGFuZCBsYXN0IGJ1dCBub3QgbGVhc3QgbWFueSBkZWNvZGVycworICogaWdub3JlIHRoZXNlIGJpdHMKKyAqLworaW50CitsYW1lX3NldF9lbXBoYXNpcyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IGVtcGhhc2lzKQoreworICAgIC8qIFhYWDogZW1waGFzaXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBlbnVtICovCisgICAgaWYgKDAgPiBlbXBoYXNpcyB8fCA0IDw9IGVtcGhhc2lzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBnZnAtPmVtcGhhc2lzID0gZW1waGFzaXM7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitsYW1lX2dldF9lbXBoYXNpcyhjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBhc3NlcnQoMCA8PSBnZnAtPmVtcGhhc2lzICYmIDQgPiBnZnAtPmVtcGhhc2lzKTsKKworICAgIHJldHVybiBnZnAtPmVtcGhhc2lzOworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaW50ZXJuYWwgdmFyaWFibGVzLCBjYW5ub3QgYmUgc2V0Li4uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHByb3ZpZGVkIGJlY2F1c2UgdGhleSBtYXkgYmUgb2YgdXNlIHRvIGNhbGxpbmcgYXBwbGljYXRpb24gICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNUEVHIHZlcnNpb24uCisgKiAgMCA9IE1QRUctMgorICogIDEgPSBNUEVHLTEKKyAqICgyID0gTVBFRy0yLjUpICAgIAorICovCitpbnQKK2xhbWVfZ2V0X3ZlcnNpb24oY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+dmVyc2lvbjsKK30KKworCisvKiBFbmNvZGVyIGRlbGF5LiAqLworaW50CitsYW1lX2dldF9lbmNvZGVyX2RlbGF5KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPmVuY29kZXJfZGVsYXk7Cit9CisKKy8qIHBhZGRpbmcgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgKi8KK2ludAorbGFtZV9nZXRfZW5jb2Rlcl9wYWRkaW5nKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIHJldHVybiBnZnAtPmVuY29kZXJfcGFkZGluZzsKK30KKworCisvKiBTaXplIG9mIE1QRUcgZnJhbWUuICovCitpbnQKK2xhbWVfZ2V0X2ZyYW1lc2l6ZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5mcmFtZXNpemU7Cit9CisKKworLyogTnVtYmVyIG9mIGZyYW1lcyBlbmNvZGVkIHNvIGZhci4gKi8KK2ludAorbGFtZV9nZXRfZnJhbWVOdW0oY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgcmV0dXJuIGdmcC0+ZnJhbWVOdW07Cit9CisKK2ludAorbGFtZV9nZXRfbWZfc2FtcGxlc190b19lbmNvZGUoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyAqZ2ZjID0gZ2ZwLT5pbnRlcm5hbF9mbGFnczsKKyAgICByZXR1cm4gZ2ZjLT5tZl9zYW1wbGVzX3RvX2VuY29kZTsKK30KKworaW50ICAgICBDREVDTAorbGFtZV9nZXRfc2l6ZV9tcDNidWZmZXIoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnApCit7CisgICAgaW50ICAgICBzaXplOworICAgIGNvbXB1dGVfZmx1c2hiaXRzKGdmcCwgJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitpbnQKK2xhbWVfZ2V0X1JhZGlvR2Fpbihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIHJldHVybiBnZmMtPlJhZGlvR2FpbjsKK30KKworaW50CitsYW1lX2dldF9BdWRpb3BoaWxlR2Fpbihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIHJldHVybiBnZmMtPkF1ZGlvcGhpbGVHYWluOworfQorCitmbG9hdAorbGFtZV9nZXRfUGVha1NhbXBsZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIHJldHVybiAoZmxvYXQpIGdmYy0+UGVha1NhbXBsZTsKK30KKworaW50CitsYW1lX2dldF9ub2NsaXBHYWluQ2hhbmdlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgcmV0dXJuIGdmYy0+bm9jbGlwR2FpbkNoYW5nZTsKK30KKworZmxvYXQKK2xhbWVfZ2V0X25vY2xpcFNjYWxlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgKmdmYyA9IGdmcC0+aW50ZXJuYWxfZmxhZ3M7CisgICAgcmV0dXJuIGdmYy0+bm9jbGlwU2NhbGU7Cit9CisKKworLyoKKyAqIExBTUUncyBlc3RpbWF0ZSBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBlbmNvZGVkLgorICogT25seSB2YWxpZCBpZiBjYWxsaW5nIHByb2dyYW0gc2V0IG51bV9zYW1wbGVzLgorICovCitpbnQKK2xhbWVfZ2V0X3RvdGFsZnJhbWVzKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwKQoreworICAgIGludCAgICAgdG90YWxmcmFtZXM7CisgICAgLyogZXN0aW1hdGUgYmFzZWQgb24gdXNlciBzZXQgbnVtX3NhbXBsZXM6ICovCisgICAgdG90YWxmcmFtZXMgPQorICAgICAgICAyICsgKChkb3VibGUpIGdmcC0+bnVtX3NhbXBsZXMgKiBnZnAtPm91dF9zYW1wbGVyYXRlKSAvCisgICAgICAgICgoZG91YmxlKSBnZnAtPmluX3NhbXBsZXJhdGUgKiBnZnAtPmZyYW1lc2l6ZSk7CisKKyAgICAvKiBjaGVjayB0byBzZWUgaWYgd2UgdW5kZXJlc3RpbWF0ZWQgdG90YWxmcmFtZXMgKi8KKyAgICAvKiAgICBpZiAodG90YWxmcmFtZXMgPCBnZnAtPmZyYW1lTnVtKSAqLworICAgIC8qICAgICAgICB0b3RhbGZyYW1lcyA9IGdmcC0+ZnJhbWVOdW07ICovCisKKyAgICByZXR1cm4gdG90YWxmcmFtZXM7Cit9CisKKworCisKKworaW50CitsYW1lX3NldF9wcmVzZXQobGFtZV9nbG9iYWxfZmxhZ3MgKiBnZnAsIGludCBwcmVzZXQpCit7CisgICAgZ2ZwLT5wcmVzZXQgPSBwcmVzZXQ7CisgICAgcmV0dXJuIGFwcGx5X3ByZXNldChnZnAsIHByZXNldCwgMSk7Cit9CisKKworCitpbnQKK2xhbWVfc2V0X2FzbV9vcHRpbWl6YXRpb25zKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBpbnQgb3B0aW0sIGludCBtb2RlKQoreworICAgIG1vZGUgPSAobW9kZSA9PSAxID8gMSA6IDApOworICAgIHN3aXRjaCAob3B0aW0pIHsKKyAgICBjYXNlIE1NWDp7CisgICAgICAgICAgICBnZnAtPmFzbV9vcHRpbWl6YXRpb25zLm1teCA9IG1vZGU7CisgICAgICAgICAgICByZXR1cm4gb3B0aW07CisgICAgICAgIH0KKyAgICBjYXNlIEFNRF8zRE5PVzp7CisgICAgICAgICAgICBnZnAtPmFzbV9vcHRpbWl6YXRpb25zLmFtZDNkbm93ID0gbW9kZTsKKyAgICAgICAgICAgIHJldHVybiBvcHRpbTsKKyAgICAgICAgfQorICAgIGNhc2UgU1NFOnsKKyAgICAgICAgICAgIGdmcC0+YXNtX29wdGltaXphdGlvbnMuc3NlID0gbW9kZTsKKyAgICAgICAgICAgIHJldHVybiBvcHRpbTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBvcHRpbTsKKyAgICB9Cit9CisKKwordm9pZAorbGFtZV9zZXRfd3JpdGVfaWQzdGFnX2F1dG9tYXRpYyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHYpCit7CisgICAgaWYgKGdmcCkgeworICAgICAgICBnZnAtPndyaXRlX2lkM3RhZ19hdXRvbWF0aWMgPSB2OworICAgIH0KK30KKworCitpbnQKK2xhbWVfZ2V0X3dyaXRlX2lkM3RhZ19hdXRvbWF0aWMobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCkKK3sKKyAgICBpZiAoZ2ZwKSB7CisgICAgICAgIHJldHVybiBnZnAtPndyaXRlX2lkM3RhZ19hdXRvbWF0aWM7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisKKy8qCisKK1VORE9DVU1FTlRFRCwgZXhwZXJpbWVudGFsIHNldHRpbmdzLiAgVGhlc2Ugcm91dGluZXMgYXJlIG5vdCBwcm90b3R5cGVkCitpbiBsYW1lLmguICBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhlbSwgdGhleSBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkKK2NoYW5nZS4gIAorCisqLworCisKKy8qCisgKiAganVzdCBhbm90aGVyIGRhaWx5IGNoYW5naW5nIGRldmVsb3BlciBzd2l0Y2ggIAorICovCit2b2lkIENERUNMIGxhbWVfc2V0X3R1bmUobGFtZV9nbG9iYWxfZmxhZ3MgKiwgZmxvYXQpOworCit2b2lkCitsYW1lX3NldF90dW5lKGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBmbG9hdCB2YWwpCit7CisgICAgZ2ZwLT50dW5lX3ZhbHVlX2EgPSB2YWw7CisgICAgZ2ZwLT50dW5lID0gMTsKK30KKworLyogQ3VzdG9tIG1zZml4IGhhY2sgKi8KK3ZvaWQKK2xhbWVfc2V0X21zZml4KGxhbWVfZ2xvYmFsX2ZsYWdzICogZ2ZwLCBkb3VibGUgbXNmaXgpCit7CisgICAgLyogZGVmYXVsdCA9IDAgKi8KKyAgICBnZnAtPm1zZml4ID0gbXNmaXg7Cit9CisKK2Zsb2F0CitsYW1lX2dldF9tc2ZpeChjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCkKK3sKKyAgICByZXR1cm4gZ2ZwLT5tc2ZpeDsKK30KKworI2lmIERFUFJFQ0FURURfT1JfT0JTT0xFVEVfQ09ERV9SRU1PVkVECitpbnQgQ0RFQ0wgbGFtZV9zZXRfcHJlc2V0X2V4cG9wdHMobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKKyNlbHNlCisjZW5kaWYKKworaW50CitsYW1lX3NldF9wcmVzZXRfZXhwb3B0cyhsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHByZXNldF9leHBvcHRzKQoreworICAgICh2b2lkKSBnZnA7CisgICAgKHZvaWQpIHByZXNldF9leHBvcHRzOworICAgIHJldHVybiAwOworfQorCisKK2ludAorbGFtZV9zZXRfcHJlc2V0X25vdHVuZShsYW1lX2dsb2JhbF9mbGFncyAqIGdmcCwgaW50IHByZXNldF9ub3R1bmUpCit7CisgICAgKHZvaWQpIGdmcDsKKyAgICAodm9pZCkgcHJlc2V0X25vdHVuZTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvc2V0X2dldC5oIGIvbGlibXAzbGFtZS9zZXRfZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzOTJiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvc2V0X2dldC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBzZXRfZ2V0LmggLS0gSW50ZXJuYWwgc2V0L2dldCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBHYWJyaWVsIEJvdXZpZ25lIC8gTGFtZSBwcm9qZWN0CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fU0VUX0dFVF9IX18KKyNkZWZpbmUgX19TRVRfR0VUX0hfXworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorI3VuZGVmIENERUNMCisjZGVmaW5lIENERUNMIF9jZGVjbAorI2Vsc2UKKyNkZWZpbmUgQ0RFQ0wKKyNlbmRpZgorCisKKy8qIHNlbGVjdCBwc3ljaG9hY291c3RpYyBtb2RlbCAqLworCisvKiBtYW5hZ2Ugc2hvcnQgYmxvY2tzICovCisgICAgaW50IENERUNMIGxhbWVfc2V0X3Nob3J0X3RocmVzaG9sZChsYW1lX2dsb2JhbF9mbGFncyAqLCBmbG9hdCwgZmxvYXQpOworICAgIGludCBDREVDTCBsYW1lX3NldF9zaG9ydF90aHJlc2hvbGRfbHJtKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGZsb2F0KTsKKyAgICBmbG9hdCBDREVDTCBsYW1lX2dldF9zaG9ydF90aHJlc2hvbGRfbHJtKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworICAgIGludCBDREVDTCBsYW1lX3NldF9zaG9ydF90aHJlc2hvbGRfcyhsYW1lX2dsb2JhbF9mbGFncyAqLCBmbG9hdCk7CisgICAgZmxvYXQgQ0RFQ0wgbGFtZV9nZXRfc2hvcnRfdGhyZXNob2xkX3MoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKworICAgIGludCBDREVDTCBsYW1lX3NldF9tYXNraW5nYWRqdXN0KGxhbWVfZ2xvYmFsX2ZsYWdzICosIGZsb2F0KTsKKyAgICBmbG9hdCBDREVDTCBsYW1lX2dldF9tYXNraW5nYWRqdXN0KGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisgICAgaW50IENERUNMIGxhbWVfc2V0X21hc2tpbmdhZGp1c3Rfc2hvcnQobGFtZV9nbG9iYWxfZmxhZ3MgKiwgZmxvYXQpOworICAgIGZsb2F0IENERUNMIGxhbWVfZ2V0X21hc2tpbmdhZGp1c3Rfc2hvcnQoY29uc3QgbGFtZV9nbG9iYWxfZmxhZ3MgKik7CisKKy8qIHNlbGVjdCBBVEggZm9ybXVsYSA0IHNoYXBlICovCisgICAgaW50IENERUNMIGxhbWVfc2V0X0FUSGN1cnZlKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGZsb2F0KTsKKyAgICBmbG9hdCBDREVDTCBsYW1lX2dldF9BVEhjdXJ2ZShjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworICAgIGludCBDREVDTCBsYW1lX3NldF9wcmVzZXRfbm90dW5lKGxhbWVfZ2xvYmFsX2ZsYWdzICosIGludCk7CisKKy8qIHN1YnN0ZXAgc2hhcGluZyBtZXRob2QgKi8KKyAgICBpbnQgQ0RFQ0wgbGFtZV9zZXRfc3Vic3RlcChsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworICAgIGludCBDREVDTCBsYW1lX2dldF9zdWJzdGVwKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBzY2FsZWZhY3RvcnMgc2NhbGUgKi8KKyAgICBpbnQgQ0RFQ0wgbGFtZV9zZXRfc2ZzY2FsZShsYW1lX2dsb2JhbF9mbGFncyAqLCBpbnQpOworICAgIGludCBDREVDTCBsYW1lX2dldF9zZnNjYWxlKGNvbnN0IGxhbWVfZ2xvYmFsX2ZsYWdzICopOworCisvKiBzdWJibG9jayBnYWluICovCisgICAgaW50IENERUNMIGxhbWVfc2V0X3N1YmJsb2NrX2dhaW4obGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50KTsKKyAgICBpbnQgQ0RFQ0wgbGFtZV9nZXRfc3ViYmxvY2tfZ2Fpbihjb25zdCBsYW1lX2dsb2JhbF9mbGFncyAqKTsKKworCisKKy8qcHJlc2V0cyovCisgICAgaW50ICAgICBhcHBseV9wcmVzZXQobGFtZV9nbG9iYWxfZmxhZ3MgKiwgaW50IHByZXNldCwgaW50IGVuZm9yY2UpOworCisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS90YWJsZXMuYyBiL2xpYm1wM2xhbWUvdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlZGIzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvdGFibGVzLmMKQEAgLTAsMCArMSw1NDUgQEAKKy8qCisgKglNUEVHIGxheWVyIDMgdGFibGVzIHNvdXJjZSBmaWxlCisgKgorICoJQ29weXJpZ2h0IChjKSAxOTk5IEFsYmVydCBMIEZhYmVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qICRJZDogdGFibGVzLmMsdiAxLjI1IDIwMDgvMDQvMTIgMTg6MTg6MDcgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImVuY29kZXIuaCIKKyNpbmNsdWRlICJ0YWJsZXMuaCIKKworCitzdGF0aWMgY29uc3Qgc2hvcnQgdDFIQltdID0geworICAgIDEsIDEsCisgICAgMSwgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQySEJbXSA9IHsKKyAgICAxLCAyLCAxLAorICAgIDMsIDEsIDEsCisgICAgMywgMiwgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQzSEJbXSA9IHsKKyAgICAzLCAyLCAxLAorICAgIDEsIDEsIDEsCisgICAgMywgMiwgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQ1SEJbXSA9IHsKKyAgICAxLCAyLCA2LCA1LAorICAgIDMsIDEsIDQsIDQsCisgICAgNywgNSwgNywgMSwKKyAgICA2LCAxLCAxLCAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdDZIQltdID0geworICAgIDcsIDMsIDUsIDEsCisgICAgNiwgMiwgMywgMiwKKyAgICA1LCA0LCA0LCAxLAorICAgIDMsIDMsIDIsIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0N0hCW10gPSB7CisgICAgMSwgMiwgMTAsIDE5LCAxNiwgMTAsCisgICAgMywgMywgNywgMTAsIDUsIDMsCisgICAgMTEsIDQsIDEzLCAxNywgOCwgNCwKKyAgICAxMiwgMTEsIDE4LCAxNSwgMTEsIDIsCisgICAgNywgNiwgOSwgMTQsIDMsIDEsCisgICAgNiwgNCwgNSwgMywgMiwgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQ4SEJbXSA9IHsKKyAgICAzLCA0LCA2LCAxOCwgMTIsIDUsCisgICAgNSwgMSwgMiwgMTYsIDksIDMsCisgICAgNywgMywgNSwgMTQsIDcsIDMsCisgICAgMTksIDE3LCAxNSwgMTMsIDEwLCA0LAorICAgIDEzLCA1LCA4LCAxMSwgNSwgMSwKKyAgICAxMiwgNCwgNCwgMSwgMSwgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQ5SEJbXSA9IHsKKyAgICA3LCA1LCA5LCAxNCwgMTUsIDcsCisgICAgNiwgNCwgNSwgNSwgNiwgNywKKyAgICA3LCA2LCA4LCA4LCA4LCA1LAorICAgIDE1LCA2LCA5LCAxMCwgNSwgMSwKKyAgICAxMSwgNywgOSwgNiwgNCwgMSwKKyAgICAxNCwgNCwgNiwgMiwgNiwgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQxMEhCW10gPSB7CisgICAgMSwgMiwgMTAsIDIzLCAzNSwgMzAsIDEyLCAxNywKKyAgICAzLCAzLCA4LCAxMiwgMTgsIDIxLCAxMiwgNywKKyAgICAxMSwgOSwgMTUsIDIxLCAzMiwgNDAsIDE5LCA2LAorICAgIDE0LCAxMywgMjIsIDM0LCA0NiwgMjMsIDE4LCA3LAorICAgIDIwLCAxOSwgMzMsIDQ3LCAyNywgMjIsIDksIDMsCisgICAgMzEsIDIyLCA0MSwgMjYsIDIxLCAyMCwgNSwgMywKKyAgICAxNCwgMTMsIDEwLCAxMSwgMTYsIDYsIDUsIDEsCisgICAgOSwgOCwgNywgOCwgNCwgNCwgMiwgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQxMUhCW10gPSB7CisgICAgMywgNCwgMTAsIDI0LCAzNCwgMzMsIDIxLCAxNSwKKyAgICA1LCAzLCA0LCAxMCwgMzIsIDE3LCAxMSwgMTAsCisgICAgMTEsIDcsIDEzLCAxOCwgMzAsIDMxLCAyMCwgNSwKKyAgICAyNSwgMTEsIDE5LCA1OSwgMjcsIDE4LCAxMiwgNSwKKyAgICAzNSwgMzMsIDMxLCA1OCwgMzAsIDE2LCA3LCA1LAorICAgIDI4LCAyNiwgMzIsIDE5LCAxNywgMTUsIDgsIDE0LAorICAgIDE0LCAxMiwgOSwgMTMsIDE0LCA5LCA0LCAxLAorICAgIDExLCA0LCA2LCA2LCA2LCAzLCAyLCAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdDEySEJbXSA9IHsKKyAgICA5LCA2LCAxNiwgMzMsIDQxLCAzOSwgMzgsIDI2LAorICAgIDcsIDUsIDYsIDksIDIzLCAxNiwgMjYsIDExLAorICAgIDE3LCA3LCAxMSwgMTQsIDIxLCAzMCwgMTAsIDcsCisgICAgMTcsIDEwLCAxNSwgMTIsIDE4LCAyOCwgMTQsIDUsCisgICAgMzIsIDEzLCAyMiwgMTksIDE4LCAxNiwgOSwgNSwKKyAgICA0MCwgMTcsIDMxLCAyOSwgMTcsIDEzLCA0LCAyLAorICAgIDI3LCAxMiwgMTEsIDE1LCAxMCwgNywgNCwgMSwKKyAgICAyNywgMTIsIDgsIDEyLCA2LCAzLCAxLCAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdDEzSEJbXSA9IHsKKyAgICAxLCA1LCAxNCwgMjEsIDM0LCA1MSwgNDYsIDcxLCA0MiwgNTIsIDY4LCA1MiwgNjcsIDQ0LCA0MywgMTksCisgICAgMywgNCwgMTIsIDE5LCAzMSwgMjYsIDQ0LCAzMywgMzEsIDI0LCAzMiwgMjQsIDMxLCAzNSwgMjIsIDE0LAorICAgIDE1LCAxMywgMjMsIDM2LCA1OSwgNDksIDc3LCA2NSwgMjksIDQwLCAzMCwgNDAsIDI3LCAzMywgNDIsIDE2LAorICAgIDIyLCAyMCwgMzcsIDYxLCA1NiwgNzksIDczLCA2NCwgNDMsIDc2LCA1NiwgMzcsIDI2LCAzMSwgMjUsIDE0LAorICAgIDM1LCAxNiwgNjAsIDU3LCA5NywgNzUsIDExNCwgOTEsIDU0LCA3MywgNTUsIDQxLCA0OCwgNTMsIDIzLCAyNCwKKyAgICA1OCwgMjcsIDUwLCA5NiwgNzYsIDcwLCA5MywgODQsIDc3LCA1OCwgNzksIDI5LCA3NCwgNDksIDQxLCAxNywKKyAgICA0NywgNDUsIDc4LCA3NCwgMTE1LCA5NCwgOTAsIDc5LCA2OSwgODMsIDcxLCA1MCwgNTksIDM4LCAzNiwgMTUsCisgICAgNzIsIDM0LCA1NiwgOTUsIDkyLCA4NSwgOTEsIDkwLCA4NiwgNzMsIDc3LCA2NSwgNTEsIDQ0LCA0MywgNDIsCisgICAgNDMsIDIwLCAzMCwgNDQsIDU1LCA3OCwgNzIsIDg3LCA3OCwgNjEsIDQ2LCA1NCwgMzcsIDMwLCAyMCwgMTYsCisgICAgNTMsIDI1LCA0MSwgMzcsIDQ0LCA1OSwgNTQsIDgxLCA2NiwgNzYsIDU3LCA1NCwgMzcsIDE4LCAzOSwgMTEsCisgICAgMzUsIDMzLCAzMSwgNTcsIDQyLCA4MiwgNzIsIDgwLCA0NywgNTgsIDU1LCAyMSwgMjIsIDI2LCAzOCwgMjIsCisgICAgNTMsIDI1LCAyMywgMzgsIDcwLCA2MCwgNTEsIDM2LCA1NSwgMjYsIDM0LCAyMywgMjcsIDE0LCA5LCA3LAorICAgIDM0LCAzMiwgMjgsIDM5LCA0OSwgNzUsIDMwLCA1MiwgNDgsIDQwLCA1MiwgMjgsIDE4LCAxNywgOSwgNSwKKyAgICA0NSwgMjEsIDM0LCA2NCwgNTYsIDUwLCA0OSwgNDUsIDMxLCAxOSwgMTIsIDE1LCAxMCwgNywgNiwgMywKKyAgICA0OCwgMjMsIDIwLCAzOSwgMzYsIDM1LCA1MywgMjEsIDE2LCAyMywgMTMsIDEwLCA2LCAxLCA0LCAyLAorICAgIDE2LCAxNSwgMTcsIDI3LCAyNSwgMjAsIDI5LCAxMSwgMTcsIDEyLCAxNiwgOCwgMSwgMSwgMCwgMQorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQxNUhCW10gPSB7CisgICAgNywgMTIsIDE4LCA1MywgNDcsIDc2LCAxMjQsIDEwOCwgODksIDEyMywgMTA4LCAxMTksIDEwNywgODEsIDEyMiwgNjMsCisgICAgMTMsIDUsIDE2LCAyNywgNDYsIDM2LCA2MSwgNTEsIDQyLCA3MCwgNTIsIDgzLCA2NSwgNDEsIDU5LCAzNiwKKyAgICAxOSwgMTcsIDE1LCAyNCwgNDEsIDM0LCA1OSwgNDgsIDQwLCA2NCwgNTAsIDc4LCA2MiwgODAsIDU2LCAzMywKKyAgICAyOSwgMjgsIDI1LCA0MywgMzksIDYzLCA1NSwgOTMsIDc2LCA1OSwgOTMsIDcyLCA1NCwgNzUsIDUwLCAyOSwKKyAgICA1MiwgMjIsIDQyLCA0MCwgNjcsIDU3LCA5NSwgNzksIDcyLCA1NywgODksIDY5LCA0OSwgNjYsIDQ2LCAyNywKKyAgICA3NywgMzcsIDM1LCA2NiwgNTgsIDUyLCA5MSwgNzQsIDYyLCA0OCwgNzksIDYzLCA5MCwgNjIsIDQwLCAzOCwKKyAgICAxMjUsIDMyLCA2MCwgNTYsIDUwLCA5MiwgNzgsIDY1LCA1NSwgODcsIDcxLCA1MSwgNzMsIDUxLCA3MCwgMzAsCisgICAgMTA5LCA1MywgNDksIDk0LCA4OCwgNzUsIDY2LCAxMjIsIDkxLCA3MywgNTYsIDQyLCA2NCwgNDQsIDIxLCAyNSwKKyAgICA5MCwgNDMsIDQxLCA3NywgNzMsIDYzLCA1NiwgOTIsIDc3LCA2NiwgNDcsIDY3LCA0OCwgNTMsIDM2LCAyMCwKKyAgICA3MSwgMzQsIDY3LCA2MCwgNTgsIDQ5LCA4OCwgNzYsIDY3LCAxMDYsIDcxLCA1NCwgMzgsIDM5LCAyMywgMTUsCisgICAgMTA5LCA1MywgNTEsIDQ3LCA5MCwgODIsIDU4LCA1NywgNDgsIDcyLCA1NywgNDEsIDIzLCAyNywgNjIsIDksCisgICAgODYsIDQyLCA0MCwgMzcsIDcwLCA2NCwgNTIsIDQzLCA3MCwgNTUsIDQyLCAyNSwgMjksIDE4LCAxMSwgMTEsCisgICAgMTE4LCA2OCwgMzAsIDU1LCA1MCwgNDYsIDc0LCA2NSwgNDksIDM5LCAyNCwgMTYsIDIyLCAxMywgMTQsIDcsCisgICAgOTEsIDQ0LCAzOSwgMzgsIDM0LCA2MywgNTIsIDQ1LCAzMSwgNTIsIDI4LCAxOSwgMTQsIDgsIDksIDMsCisgICAgMTIzLCA2MCwgNTgsIDUzLCA0NywgNDMsIDMyLCAyMiwgMzcsIDI0LCAxNywgMTIsIDE1LCAxMCwgMiwgMSwKKyAgICA3MSwgMzcsIDM0LCAzMCwgMjgsIDIwLCAxNywgMjYsIDIxLCAxNiwgMTAsIDYsIDgsIDYsIDIsIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0MTZIQltdID0geworICAgIDEsIDUsIDE0LCA0NCwgNzQsIDYzLCAxMTAsIDkzLCAxNzIsIDE0OSwgMTM4LCAyNDIsIDIyNSwgMTk1LCAzNzYsIDE3LAorICAgIDMsIDQsIDEyLCAyMCwgMzUsIDYyLCA1MywgNDcsIDgzLCA3NSwgNjgsIDExOSwgMjAxLCAxMDcsIDIwNywgOSwKKyAgICAxNSwgMTMsIDIzLCAzOCwgNjcsIDU4LCAxMDMsIDkwLCAxNjEsIDcyLCAxMjcsIDExNywgMTEwLCAyMDksIDIwNiwgMTYsCisgICAgNDUsIDIxLCAzOSwgNjksIDY0LCAxMTQsIDk5LCA4NywgMTU4LCAxNDAsIDI1MiwgMjEyLCAxOTksIDM4NywgMzY1LCAyNiwKKyAgICA3NSwgMzYsIDY4LCA2NSwgMTE1LCAxMDEsIDE3OSwgMTY0LCAxNTUsIDI2NCwgMjQ2LCAyMjYsIDM5NSwgMzgyLCAzNjIsIDksCisgICAgNjYsIDMwLCA1OSwgNTYsIDEwMiwgMTg1LCAxNzMsIDI2NSwgMTQyLCAyNTMsIDIzMiwgNDAwLCAzODgsIDM3OCwgNDQ1LCAxNiwKKyAgICAxMTEsIDU0LCA1MiwgMTAwLCAxODQsIDE3OCwgMTYwLCAxMzMsIDI1NywgMjQ0LCAyMjgsIDIxNywgMzg1LCAzNjYsIDcxNSwgMTAsCisgICAgOTgsIDQ4LCA5MSwgODgsIDE2NSwgMTU3LCAxNDgsIDI2MSwgMjQ4LCA0MDcsIDM5NywgMzcyLCAzODAsIDg4OSwgODg0LCA4LAorICAgIDg1LCA4NCwgODEsIDE1OSwgMTU2LCAxNDMsIDI2MCwgMjQ5LCA0MjcsIDQwMSwgMzkyLCAzODMsIDcyNywgNzEzLCA3MDgsIDcsCisgICAgMTU0LCA3NiwgNzMsIDE0MSwgMTMxLCAyNTYsIDI0NSwgNDI2LCA0MDYsIDM5NCwgMzg0LCA3MzUsIDM1OSwgNzEwLCAzNTIsIDExLAorICAgIDEzOSwgMTI5LCA2NywgMTI1LCAyNDcsIDIzMywgMjI5LCAyMTksIDM5MywgNzQzLCA3MzcsIDcyMCwgODg1LCA4ODIsIDQzOSwgNCwKKyAgICAyNDMsIDEyMCwgMTE4LCAxMTUsIDIyNywgMjIzLCAzOTYsIDc0NiwgNzQyLCA3MzYsIDcyMSwgNzEyLCA3MDYsIDIyMywgNDM2LCA2LAorICAgIDIwMiwgMjI0LCAyMjIsIDIxOCwgMjE2LCAzODksIDM4NiwgMzgxLCAzNjQsIDg4OCwgNDQzLCA3MDcsIDQ0MCwgNDM3LCAxNzI4LCA0LAorICAgIDc0NywgMjExLCAyMTAsIDIwOCwgMzcwLCAzNzksIDczNCwgNzIzLCA3MTQsIDE3MzUsIDg4MywgODc3LCA4NzYsIDM0NTksIDg2NSwgMiwKKyAgICAzNzcsIDM2OSwgMTAyLCAxODcsIDcyNiwgNzIyLCAzNTgsIDcxMSwgNzA5LCA4NjYsIDE3MzQsIDg3MSwgMzQ1OCwgODcwLCA0MzQsIDAsCisgICAgMTIsIDEwLCA3LCAxMSwgMTAsIDE3LCAxMSwgOSwgMTMsIDEyLCAxMCwgNywgNSwgMywgMSwgMworfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQyNEhCW10gPSB7CisgICAgMTUsIDEzLCA0NiwgODAsIDE0NiwgMjYyLCAyNDgsIDQzNCwgNDI2LCA2NjksIDY1MywgNjQ5LCA2MjEsIDUxNywgMTAzMiwgODgsCisgICAgMTQsIDEyLCAyMSwgMzgsIDcxLCAxMzAsIDEyMiwgMjE2LCAyMDksIDE5OCwgMzI3LCAzNDUsIDMxOSwgMjk3LCAyNzksIDQyLAorICAgIDQ3LCAyMiwgNDEsIDc0LCA2OCwgMTI4LCAxMjAsIDIyMSwgMjA3LCAxOTQsIDE4MiwgMzQwLCAzMTUsIDI5NSwgNTQxLCAxOCwKKyAgICA4MSwgMzksIDc1LCA3MCwgMTM0LCAxMjUsIDExNiwgMjIwLCAyMDQsIDE5MCwgMTc4LCAzMjUsIDMxMSwgMjkzLCAyNzEsIDE2LAorICAgIDE0NywgNzIsIDY5LCAxMzUsIDEyNywgMTE4LCAxMTIsIDIxMCwgMjAwLCAxODgsIDM1MiwgMzIzLCAzMDYsIDI4NSwgNTQwLCAxNCwKKyAgICAyNjMsIDY2LCAxMjksIDEyNiwgMTE5LCAxMTQsIDIxNCwgMjAyLCAxOTIsIDE4MCwgMzQxLCAzMTcsIDMwMSwgMjgxLCAyNjIsIDEyLAorICAgIDI0OSwgMTIzLCAxMjEsIDExNywgMTEzLCAyMTUsIDIwNiwgMTk1LCAxODUsIDM0NywgMzMwLCAzMDgsIDI5MSwgMjcyLCA1MjAsIDEwLAorICAgIDQzNSwgMTE1LCAxMTEsIDEwOSwgMjExLCAyMDMsIDE5NiwgMTg3LCAzNTMsIDMzMiwgMzEzLCAyOTgsIDI4MywgNTMxLCAzODEsIDE3LAorICAgIDQyNywgMjEyLCAyMDgsIDIwNSwgMjAxLCAxOTMsIDE4NiwgMTc3LCAxNjksIDMyMCwgMzAzLCAyODYsIDI2OCwgNTE0LCAzNzcsIDE2LAorICAgIDMzNSwgMTk5LCAxOTcsIDE5MSwgMTg5LCAxODEsIDE3NCwgMzMzLCAzMjEsIDMwNSwgMjg5LCAyNzUsIDUyMSwgMzc5LCAzNzEsIDExLAorICAgIDY2OCwgMTg0LCAxODMsIDE3OSwgMTc1LCAzNDQsIDMzMSwgMzE0LCAzMDQsIDI5MCwgMjc3LCA1MzAsIDM4MywgMzczLCAzNjYsIDEwLAorICAgIDY1MiwgMzQ2LCAxNzEsIDE2OCwgMTY0LCAzMTgsIDMwOSwgMjk5LCAyODcsIDI3NiwgMjYzLCA1MTMsIDM3NSwgMzY4LCAzNjIsIDYsCisgICAgNjQ4LCAzMjIsIDMxNiwgMzEyLCAzMDcsIDMwMiwgMjkyLCAyODQsIDI2OSwgMjYxLCA1MTIsIDM3NiwgMzcwLCAzNjQsIDM1OSwgNCwKKyAgICA2MjAsIDMwMCwgMjk2LCAyOTQsIDI4OCwgMjgyLCAyNzMsIDI2NiwgNTE1LCAzODAsIDM3NCwgMzY5LCAzNjUsIDM2MSwgMzU3LCAyLAorICAgIDEwMzMsIDI4MCwgMjc4LCAyNzQsIDI2NywgMjY0LCAyNTksIDM4MiwgMzc4LCAzNzIsIDM2NywgMzYzLCAzNjAsIDM1OCwgMzU2LCAwLAorICAgIDQzLCAyMCwgMTksIDE3LCAxNSwgMTMsIDExLCA5LCA3LCA2LCA0LCA3LCA1LCAzLCAxLCAzCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdDMySEJbXSA9IHsKKyAgICAxIDw8IDAsIDUgPDwgMSwgNCA8PCAxLCA1IDw8IDIsIDYgPDwgMSwgNSA8PCAyLCA0IDw8IDIsIDQgPDwgMywKKyAgICA3IDw8IDEsIDMgPDwgMiwgNiA8PCAyLCAwIDw8IDMsIDcgPDwgMiwgMiA8PCAzLCAzIDw8IDMsIDEgPDwgNAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHQzM0hCW10gPSB7CisgICAgMTUgPDwgMCwgMTQgPDwgMSwgMTMgPDwgMSwgMTIgPDwgMiwgMTEgPDwgMSwgMTAgPDwgMiwgOSA8PCAyLCA4IDw8IDMsCisgICAgNyA8PCAxLCA2IDw8IDIsIDUgPDwgMiwgNCA8PCAzLCAzIDw8IDIsIDIgPDwgMywgMSA8PCAzLCAwIDw8IDQKK307CisKKworY29uc3QgY2hhciB0MWxbXSA9IHsKKyAgICAxLCA0LAorICAgIDMsIDUKK307CisKK2NvbnN0IGNoYXIgdDJsW10gPSB7CisgICAgMSwgNCwgNywKKyAgICA0LCA1LCA3LAorICAgIDYsIDcsIDgKK307CisKK2NvbnN0IGNoYXIgdDNsW10gPSB7CisgICAgMiwgMywgNywKKyAgICA0LCA0LCA3LAorICAgIDYsIDcsIDgKK307CisKK2NvbnN0IGNoYXIgdDVsW10gPSB7CisgICAgMSwgNCwgNywgOCwKKyAgICA0LCA1LCA4LCA5LAorICAgIDcsIDgsIDksIDEwLAorICAgIDgsIDgsIDksIDEwCit9OworCitjb25zdCBjaGFyIHQ2bFtdID0geworICAgIDMsIDQsIDYsIDgsCisgICAgNCwgNCwgNiwgNywKKyAgICA1LCA2LCA3LCA4LAorICAgIDcsIDcsIDgsIDkKK307CisKK2NvbnN0IGNoYXIgdDdsW10gPSB7CisgICAgMSwgNCwgNywgOSwgOSwgMTAsCisgICAgNCwgNiwgOCwgOSwgOSwgMTAsCisgICAgNywgNywgOSwgMTAsIDEwLCAxMSwKKyAgICA4LCA5LCAxMCwgMTEsIDExLCAxMSwKKyAgICA4LCA5LCAxMCwgMTEsIDExLCAxMiwKKyAgICA5LCAxMCwgMTEsIDEyLCAxMiwgMTIKK307CisKK2NvbnN0IGNoYXIgdDhsW10gPSB7CisgICAgMiwgNCwgNywgOSwgOSwgMTAsCisgICAgNCwgNCwgNiwgMTAsIDEwLCAxMCwKKyAgICA3LCA2LCA4LCAxMCwgMTAsIDExLAorICAgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwKKyAgICA5LCA5LCAxMCwgMTEsIDEyLCAxMiwKKyAgICAxMCwgMTAsIDExLCAxMSwgMTMsIDEzCit9OworCitjb25zdCBjaGFyIHQ5bFtdID0geworICAgIDMsIDQsIDYsIDcsIDksIDEwLAorICAgIDQsIDUsIDYsIDcsIDgsIDEwLAorICAgIDUsIDYsIDcsIDgsIDksIDEwLAorICAgIDcsIDcsIDgsIDksIDksIDEwLAorICAgIDgsIDgsIDksIDksIDEwLCAxMSwKKyAgICA5LCA5LCAxMCwgMTAsIDExLCAxMQorfTsKKworY29uc3QgY2hhciB0MTBsW10gPSB7CisgICAgMSwgNCwgNywgOSwgMTAsIDEwLCAxMCwgMTEsCisgICAgNCwgNiwgOCwgOSwgMTAsIDExLCAxMCwgMTAsCisgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTEsIDExLAorICAgIDgsIDksIDEwLCAxMSwgMTIsIDEyLCAxMSwgMTIsCisgICAgOSwgMTAsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTAsIDExLCAxMiwgMTIsIDEzLCAxMywgMTIsIDEzLAorICAgIDksIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLAorICAgIDEwLCAxMCwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMworfTsKKworY29uc3QgY2hhciB0MTFsW10gPSB7CisgICAgMiwgNCwgNiwgOCwgOSwgMTAsIDksIDEwLAorICAgIDQsIDUsIDYsIDgsIDEwLCAxMCwgOSwgMTAsCisgICAgNiwgNywgOCwgOSwgMTAsIDExLCAxMCwgMTAsCisgICAgOCwgOCwgOSwgMTEsIDEwLCAxMiwgMTAsIDExLAorICAgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTEsIDEyLAorICAgIDksIDEwLCAxMSwgMTIsIDEyLCAxMywgMTIsIDEzLAorICAgIDksIDksIDksIDEwLCAxMSwgMTIsIDEyLCAxMiwKKyAgICA5LCA5LCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyCit9OworCitjb25zdCBjaGFyIHQxMmxbXSA9IHsKKyAgICA0LCA0LCA2LCA4LCA5LCAxMCwgMTAsIDEwLAorICAgIDQsIDUsIDYsIDcsIDksIDksIDEwLCAxMCwKKyAgICA2LCA2LCA3LCA4LCA5LCAxMCwgOSwgMTAsCisgICAgNywgNywgOCwgOCwgOSwgMTAsIDEwLCAxMCwKKyAgICA4LCA4LCA5LCA5LCAxMCwgMTAsIDEwLCAxMSwKKyAgICA5LCA5LCAxMCwgMTAsIDEwLCAxMSwgMTAsIDExLAorICAgIDksIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIKK307CisKK2NvbnN0IGNoYXIgdDEzbFtdID0geworICAgIDEsIDUsIDcsIDgsIDksIDEwLCAxMCwgMTEsIDEwLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwKKyAgICA0LCA2LCA4LCA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LAorICAgIDcsIDgsIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTUsIDE1LAorICAgIDgsIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE1LCAxNSwKKyAgICA5LCA5LCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTYsCisgICAgMTAsIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxMywgMTUsIDE1LCAxNiwgMTYsCisgICAgMTAsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTYsCisgICAgMTEsIDExLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxOCwgMTgsCisgICAgMTAsIDEwLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE2LCAxNywgMTcsCisgICAgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE1LCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxOCwgMTcsCisgICAgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNCwgMTUsIDE2LCAxNSwgMTYsIDE3LCAxOCwgMTksCisgICAgMTIsIDEyLCAxMiwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNiwgMTcsIDE3LCAxNywgMTgsCisgICAgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsCisgICAgMTMsIDEzLCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTgsIDE3LCAxOCwgMTgsCisgICAgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTcsIDE2LCAxNiwgMTksIDE3LCAxNywgMTcsIDE5LCAxOCwgMTgsCisgICAgMTMsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTcsIDE2LCAxNywgMTcsIDE4LCAxOCwgMjEsIDIwLCAyMSwgMTgKK307CisKK2NvbnN0IGNoYXIgdDE1bFtdID0geworICAgIDMsIDUsIDYsIDgsIDgsIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDE0LAorICAgIDUsIDUsIDcsIDgsIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLAorICAgIDYsIDcsIDcsIDgsIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAorICAgIDksIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE0LAorICAgIDEwLCA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsCisgICAgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsCisgICAgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsCisgICAgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsCisgICAgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNSwgMTQsCisgICAgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsCisgICAgMTIsIDEyLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTUsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUKK307CisKK2NvbnN0IGNoYXIgdDE2XzVsW10gPSB7CisgICAgMSwgNSwgNywgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE0LCAxMSwKKyAgICA0LCA2LCA4LCA5LCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxMywgMTQsIDExLAorICAgIDcsIDgsIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDEyLAorICAgIDksIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxMywKKyAgICAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxMiwKKyAgICAxMCwgMTAsIDExLCAxMSwgMTIsIDEzLCAxMywgMTQsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxMywKKyAgICAxMSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE2LCAxMywKKyAgICAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTcsIDE3LCAxMywKKyAgICAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxMywKKyAgICAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNSwgMTYsIDE1LCAxNCwKKyAgICAxMiwgMTMsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE2LCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxNCwKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNywgMTYsIDE2LCAxNiwgMTYsIDE4LCAxNCwKKyAgICAxNSwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxOCwgMTcsIDE3LCAxNywgMTksIDE3LCAxNCwKKyAgICAxNCwgMTUsIDEzLCAxNCwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNywgMTgsIDE3LCAxOSwgMTcsIDE2LCAxNCwKKyAgICAxMSwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMgorfTsKKworY29uc3QgY2hhciB0MTZsW10gPSB7CisgICAgMSwgNSwgNywgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE0LCAxMCwKKyAgICA0LCA2LCA4LCA5LCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxMywgMTQsIDEwLAorICAgIDcsIDgsIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDExLAorICAgIDksIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxMiwKKyAgICAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxMSwKKyAgICAxMCwgMTAsIDExLCAxMSwgMTIsIDEzLCAxMywgMTQsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxMiwKKyAgICAxMSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE2LCAxMiwKKyAgICAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTcsIDE3LCAxMiwKKyAgICAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNSwgMTYsIDE1LCAxMywKKyAgICAxMiwgMTMsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE2LCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE2LCAxMywKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNywgMTYsIDE2LCAxNiwgMTYsIDE4LCAxMywKKyAgICAxNSwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxOCwgMTcsIDE3LCAxNywgMTksIDE3LCAxMywKKyAgICAxNCwgMTUsIDEzLCAxNCwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxNywgMTgsIDE3LCAxOSwgMTcsIDE2LCAxMywKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMAorfTsKKworY29uc3QgY2hhciB0MjRsW10gPSB7CisgICAgNCwgNSwgNywgOCwgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEwLAorICAgIDUsIDYsIDcsIDgsIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMCwKKyAgICA3LCA3LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgOSwKKyAgICA4LCA4LCA5LCA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDksCisgICAgOSwgOSwgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgOSwKKyAgICAxMCwgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDksCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgOSwKKyAgICAxMSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMCwKKyAgICAxMiwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMCwKKyAgICAxMiwgMTIsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMCwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMCwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMCwKKyAgICAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMCwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCAxMCwgMTAsIDEwLCAxMCwgNgorfTsKKworY29uc3QgY2hhciB0MzJsW10gPSB7CisgICAgMSArIDAsIDQgKyAxLCA0ICsgMSwgNSArIDIsIDQgKyAxLCA2ICsgMiwgNSArIDIsIDYgKyAzLAorICAgIDQgKyAxLCA1ICsgMiwgNSArIDIsIDYgKyAzLCA1ICsgMiwgNiArIDMsIDYgKyAzLCA2ICsgNAorfTsKKworY29uc3QgY2hhciB0MzNsW10gPSB7CisgICAgNCArIDAsIDQgKyAxLCA0ICsgMSwgNCArIDIsIDQgKyAxLCA0ICsgMiwgNCArIDIsIDQgKyAzLAorICAgIDQgKyAxLCA0ICsgMiwgNCArIDIsIDQgKyAzLCA0ICsgMiwgNCArIDMsIDQgKyAzLCA0ICsgNAorfTsKKworCitjb25zdCBzdHJ1Y3QgaHVmZmNvZGV0YWIgaHRbSFROXSA9IHsKKyAgICAvKiB4bGVuLCBsaW5tYXgsIHRhYmxlLCBobGVuICovCisgICAgezAsIDAsIE5VTEwsIE5VTEx9LAorICAgIHsyLCAwLCB0MUhCLCB0MWx9LAorICAgIHszLCAwLCB0MkhCLCB0Mmx9LAorICAgIHszLCAwLCB0M0hCLCB0M2x9LAorICAgIHswLCAwLCBOVUxMLCBOVUxMfSwgLyogQXBwYXJlbnRseSBub3QgdXNlZCAqLworICAgIHs0LCAwLCB0NUhCLCB0NWx9LAorICAgIHs0LCAwLCB0NkhCLCB0Nmx9LAorICAgIHs2LCAwLCB0N0hCLCB0N2x9LAorICAgIHs2LCAwLCB0OEhCLCB0OGx9LAorICAgIHs2LCAwLCB0OUhCLCB0OWx9LAorICAgIHs4LCAwLCB0MTBIQiwgdDEwbH0sCisgICAgezgsIDAsIHQxMUhCLCB0MTFsfSwKKyAgICB7OCwgMCwgdDEySEIsIHQxMmx9LAorICAgIHsxNiwgMCwgdDEzSEIsIHQxM2x9LAorICAgIHswLCAwLCBOVUxMLCB0MTZfNWx9LCAvKiBBcHBhcmVudGx5IG5vdCB1c2VkICovCisgICAgezE2LCAwLCB0MTVIQiwgdDE1bH0sCisKKyAgICB7MSwgMSwgdDE2SEIsIHQxNmx9LAorICAgIHsyLCAzLCB0MTZIQiwgdDE2bH0sCisgICAgezMsIDcsIHQxNkhCLCB0MTZsfSwKKyAgICB7NCwgMTUsIHQxNkhCLCB0MTZsfSwKKyAgICB7NiwgNjMsIHQxNkhCLCB0MTZsfSwKKyAgICB7OCwgMjU1LCB0MTZIQiwgdDE2bH0sCisgICAgezEwLCAxMDIzLCB0MTZIQiwgdDE2bH0sCisgICAgezEzLCA4MTkxLCB0MTZIQiwgdDE2bH0sCisKKyAgICB7NCwgMTUsIHQyNEhCLCB0MjRsfSwKKyAgICB7NSwgMzEsIHQyNEhCLCB0MjRsfSwKKyAgICB7NiwgNjMsIHQyNEhCLCB0MjRsfSwKKyAgICB7NywgMTI3LCB0MjRIQiwgdDI0bH0sCisgICAgezgsIDI1NSwgdDI0SEIsIHQyNGx9LAorICAgIHs5LCA1MTEsIHQyNEhCLCB0MjRsfSwKKyAgICB7MTEsIDIwNDcsIHQyNEhCLCB0MjRsfSwKKyAgICB7MTMsIDgxOTEsIHQyNEhCLCB0MjRsfSwKKworICAgIHswLCAwLCB0MzJIQiwgdDMybH0sCisgICAgezAsIDAsIHQzM0hCLCB0MzNsfSwKK307CisKKworCisKKworLyogIGZvciAoaSA9IDA7IGkgPCAxNioxNjsgaSsrKSB7CisgKiAgICAgIGxhcmdldGJsW2ldID0gKChodFsxNl0uaGxlbltpXSkgPDwgMTYpICsgaHRbMjRdLmhsZW5baV07CisgKiAgfQorICovCitjb25zdCB1bnNpZ25lZCBpbnQgbGFyZ2V0YmxbMTYgKiAxNl0gPSB7CisgICAgMHgwMTAwMDQsIDB4MDUwMDA1LCAweDA3MDAwNywgMHgwOTAwMDgsIDB4MGEwMDA5LCAweDBhMDAwYSwgMHgwYjAwMGEsIDB4MGIwMDBiLAorICAgIDB4MGMwMDBiLCAweDBjMDAwYywgMHgwYzAwMGMsIDB4MGQwMDBjLCAweDBkMDAwYywgMHgwZDAwMGMsIDB4MGUwMDBkLCAweDBhMDAwYSwKKyAgICAweDA0MDAwNSwgMHgwNjAwMDYsIDB4MDgwMDA3LCAweDA5MDAwOCwgMHgwYTAwMDksIDB4MGIwMDBhLCAweDBiMDAwYSwgMHgwYjAwMGIsCisgICAgMHgwYzAwMGIsIDB4MGMwMDBiLCAweDBjMDAwYywgMHgwZDAwMGMsIDB4MGUwMDBjLCAweDBkMDAwYywgMHgwZTAwMGMsIDB4MGEwMDBhLAorICAgIDB4MDcwMDA3LCAweDA4MDAwNywgMHgwOTAwMDgsIDB4MGEwMDA5LCAweDBiMDAwOSwgMHgwYjAwMGEsIDB4MGMwMDBhLCAweDBjMDAwYiwKKyAgICAweDBkMDAwYiwgMHgwYzAwMGIsIDB4MGQwMDBiLCAweDBkMDAwYywgMHgwZDAwMGMsIDB4MGUwMDBjLCAweDBlMDAwZCwgMHgwYjAwMDksCisgICAgMHgwOTAwMDgsIDB4MDkwMDA4LCAweDBhMDAwOSwgMHgwYjAwMDksIDB4MGIwMDBhLCAweDBjMDAwYSwgMHgwYzAwMGEsIDB4MGMwMDBiLAorICAgIDB4MGQwMDBiLCAweDBkMDAwYiwgMHgwZTAwMGIsIDB4MGUwMDBjLCAweDBlMDAwYywgMHgwZjAwMGMsIDB4MGYwMDBjLCAweDBjMDAwOSwKKyAgICAweDBhMDAwOSwgMHgwYTAwMDksIDB4MGIwMDA5LCAweDBiMDAwYSwgMHgwYzAwMGEsIDB4MGMwMDBhLCAweDBkMDAwYSwgMHgwZDAwMGIsCisgICAgMHgwZDAwMGIsIDB4MGUwMDBiLCAweDBlMDAwYywgMHgwZTAwMGMsIDB4MGYwMDBjLCAweDBmMDAwYywgMHgwZjAwMGQsIDB4MGIwMDA5LAorICAgIDB4MGEwMDBhLCAweDBhMDAwOSwgMHgwYjAwMGEsIDB4MGIwMDBhLCAweDBjMDAwYSwgMHgwZDAwMGEsIDB4MGQwMDBiLCAweDBlMDAwYiwKKyAgICAweDBkMDAwYiwgMHgwZTAwMGIsIDB4MGUwMDBjLCAweDBmMDAwYywgMHgwZjAwMGMsIDB4MGYwMDBjLCAweDEwMDAwYywgMHgwYzAwMDksCisgICAgMHgwYjAwMGEsIDB4MGIwMDBhLCAweDBiMDAwYSwgMHgwYzAwMGEsIDB4MGQwMDBhLCAweDBkMDAwYiwgMHgwZDAwMGIsIDB4MGQwMDBiLAorICAgIDB4MGUwMDBiLCAweDBlMDAwYywgMHgwZTAwMGMsIDB4MGUwMDBjLCAweDBmMDAwYywgMHgwZjAwMGMsIDB4MTAwMDBkLCAweDBjMDAwOSwKKyAgICAweDBiMDAwYiwgMHgwYjAwMGEsIDB4MGMwMDBhLCAweDBjMDAwYSwgMHgwZDAwMGIsIDB4MGQwMDBiLCAweDBkMDAwYiwgMHgwZTAwMGIsCisgICAgMHgwZTAwMGMsIDB4MGYwMDBjLCAweDBmMDAwYywgMHgwZjAwMGMsIDB4MGYwMDBjLCAweDExMDAwZCwgMHgxMTAwMGQsIDB4MGMwMDBhLAorICAgIDB4MGIwMDBiLCAweDBjMDAwYiwgMHgwYzAwMGIsIDB4MGQwMDBiLCAweDBkMDAwYiwgMHgwZDAwMGIsIDB4MGUwMDBiLCAweDBlMDAwYiwKKyAgICAweDBmMDAwYiwgMHgwZjAwMGMsIDB4MGYwMDBjLCAweDBmMDAwYywgMHgxMDAwMGMsIDB4MTAwMDBkLCAweDEwMDAwZCwgMHgwYzAwMGEsCisgICAgMHgwYzAwMGIsIDB4MGMwMDBiLCAweDBjMDAwYiwgMHgwZDAwMGIsIDB4MGQwMDBiLCAweDBlMDAwYiwgMHgwZTAwMGIsIDB4MGYwMDBjLAorICAgIDB4MGYwMDBjLCAweDBmMDAwYywgMHgwZjAwMGMsIDB4MTAwMDBjLCAweDBmMDAwZCwgMHgxMDAwMGQsIDB4MGYwMDBkLCAweDBkMDAwYSwKKyAgICAweDBjMDAwYywgMHgwZDAwMGIsIDB4MGMwMDBiLCAweDBkMDAwYiwgMHgwZTAwMGIsIDB4MGUwMDBjLCAweDBlMDAwYywgMHgwZTAwMGMsCisgICAgMHgwZjAwMGMsIDB4MTAwMDBjLCAweDEwMDAwYywgMHgxMDAwMGQsIDB4MTEwMDBkLCAweDExMDAwZCwgMHgxMDAwMGQsIDB4MGMwMDBhLAorICAgIDB4MGQwMDBjLCAweDBkMDAwYywgMHgwZDAwMGIsIDB4MGQwMDBiLCAweDBlMDAwYiwgMHgwZTAwMGMsIDB4MGYwMDBjLCAweDEwMDAwYywKKyAgICAweDEwMDAwYywgMHgxMDAwMGMsIDB4MTAwMDBjLCAweDEwMDAwZCwgMHgxMDAwMGQsIDB4MGYwMDBkLCAweDEwMDAwZCwgMHgwZDAwMGEsCisgICAgMHgwZDAwMGMsIDB4MGUwMDBjLCAweDBlMDAwYywgMHgwZTAwMGMsIDB4MGUwMDBjLCAweDBmMDAwYywgMHgwZjAwMGMsIDB4MGYwMDBjLAorICAgIDB4MGYwMDBjLCAweDExMDAwYywgMHgxMDAwMGQsIDB4MTAwMDBkLCAweDEwMDAwZCwgMHgxMDAwMGQsIDB4MTIwMDBkLCAweDBkMDAwYSwKKyAgICAweDBmMDAwYywgMHgwZTAwMGMsIDB4MGUwMDBjLCAweDBlMDAwYywgMHgwZjAwMGMsIDB4MGYwMDBjLCAweDEwMDAwYywgMHgxMDAwMGMsCisgICAgMHgxMDAwMGQsIDB4MTIwMDBkLCAweDExMDAwZCwgMHgxMTAwMGQsIDB4MTEwMDBkLCAweDEzMDAwZCwgMHgxMTAwMGQsIDB4MGQwMDBhLAorICAgIDB4MGUwMDBkLCAweDBmMDAwYywgMHgwZDAwMGMsIDB4MGUwMDBjLCAweDEwMDAwYywgMHgxMDAwMGMsIDB4MGYwMDBjLCAweDEwMDAwZCwKKyAgICAweDEwMDAwZCwgMHgxMTAwMGQsIDB4MTIwMDBkLCAweDExMDAwZCwgMHgxMzAwMGQsIDB4MTEwMDBkLCAweDEwMDAwZCwgMHgwZDAwMGEsCisgICAgMHgwYTAwMDksIDB4MGEwMDA5LCAweDBhMDAwOSwgMHgwYjAwMDksIDB4MGIwMDA5LCAweDBjMDAwOSwgMHgwYzAwMDksIDB4MGMwMDA5LAorICAgIDB4MGQwMDA5LCAweDBkMDAwOSwgMHgwZDAwMDksIDB4MGQwMDBhLCAweDBkMDAwYSwgMHgwZDAwMGEsIDB4MGQwMDBhLCAweDBhMDAwNgorfTsKKworLyogIGZvciAoaSA9IDA7IGkgPCAzKjM7IGkrKykgeworICogICAgICB0YWJsZTIzW2ldID0gKChodFsyXS5obGVuW2ldKSA8PCAxNikgKyBodFszXS5obGVuW2ldOworICogIH0KKyAqLworY29uc3QgdW5zaWduZWQgaW50IHRhYmxlMjNbMyAqIDNdID0geworICAgIDB4MDEwMDAyLCAweDA0MDAwMywgMHgwNzAwMDcsCisgICAgMHgwNDAwMDQsIDB4MDUwMDA0LCAweDA3MDAwNywKKyAgICAweDA2MDAwNiwgMHgwNzAwMDcsIDB4MDgwMDA4Cit9OworCisvKiAgIGZvciAoaSA9IDA7IGkgPCA0KjQ7IGkrKykgeworICogICAgICAgdGFibGU1NltpXSA9ICgoaHRbNV0uaGxlbltpXSkgPDwgMTYpICsgaHRbNl0uaGxlbltpXTsKKyAqICAgfQorICovCitjb25zdCB1bnNpZ25lZCBpbnQgdGFibGU1Nls0ICogNF0gPSB7CisgICAgMHgwMTAwMDMsIDB4MDQwMDA0LCAweDA3MDAwNiwgMHgwODAwMDgsIDB4MDQwMDA0LCAweDA1MDAwNCwgMHgwODAwMDYsIDB4MDkwMDA3LAorICAgIDB4MDcwMDA1LCAweDA4MDAwNiwgMHgwOTAwMDcsIDB4MGEwMDA4LCAweDA4MDAwNywgMHgwODAwMDcsIDB4MDkwMDA4LCAweDBhMDAwOQorfTsKKworCisKKy8qIAorICogMDogTVBFRy0yIExTRgorICogMTogTVBFRy0xCisgKiAyOiBNUEVHLTIuNSBMU0YgRmhHIGV4dGVudGlvbiAgICAgICAgICAgICAgICAgICgxOTk1LTA3LTExIHNobikKKyAqLworCit0eXBlZGVmIGVudW0geworICAgIE1QRUdfMiA9IDAsCisgICAgTVBFR18xID0gMSwKKyAgICBNUEVHXzI1ID0gMgorfSBNUEVHX3Q7CisKK2NvbnN0IGludCBiaXRyYXRlX3RhYmxlWzNdWzE2XSA9IHsKKyAgICB7MCwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAtMX0sIC8qIE1QRUcgMiAqLworICAgIHswLCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAtMX0sIC8qIE1QRUcgMSAqLworICAgIHswLCA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAvKiBNUEVHIDIuNSAqLworfTsKKworY29uc3QgaW50IHNhbXBsZXJhdGVfdGFibGVbM11bNF0gPSB7CisgICAgezIyMDUwLCAyNDAwMCwgMTYwMDAsIC0xfSwgLyogTVBFRyAyICovCisgICAgezQ0MTAwLCA0ODAwMCwgMzIwMDAsIC0xfSwgLyogTVBFRyAxICovCisgICAgezExMDI1LCAxMjAwMCwgODAwMCwgLTF9LCAvKiBNUEVHIDIuNSAqLworfTsKKworY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmdbM10gPSB7ICIyIiwgIjEiLCAiMi41IiB9OworCitjb25zdCB1bnNpZ25lZCBoZWFkZXJfd29yZFszXSA9IHsgMHhGRkYwMDAwMCwgMHhGRkY4MDAwMCwgMHhGRkUwMDAwMCB9OworCisvKiBUaGlzIGlzIHRoZSBzY2ZzaV9iYW5kIHRhYmxlIGZyb20gMi40LjIuNyBvZiB0aGUgSVMgKi8KK2NvbnN0IGludCBzY2ZzaV9iYW5kWzVdID0geyAwLCA2LCAxMSwgMTYsIDIxIH07CisKKy8qIGVuZCBvZiB0YWJsZXMuYyAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS90YWJsZXMuaCBiL2xpYm1wM2xhbWUvdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1N2YwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvdGFibGVzLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqCU1QRUcgbGF5ZXIgMyB0YWJsZXMgaW5jbHVkZSBmaWxlCisgKgorICoJQ29weXJpZ2h0IChjKSAxOTk5IEFsYmVydCBMIEZhYmVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTEFNRV9UQUJMRVNfSAorI2RlZmluZSBMQU1FX1RBQkxFU19ICisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgbm87CisgICAgdW5zaWduZWQgY2hhciB3aWR0aDsKKyAgICB1bnNpZ25lZCBjaGFyIG1pbnZhbF8yOworICAgIGZsb2F0ICAgcXVpZXRfdGhyOworICAgIGZsb2F0ICAgbm9ybTsKKyAgICBmbG9hdCAgIGJhcms7Cit9IHR5cGUxX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyIG5vOworICAgIHVuc2lnbmVkIGNoYXIgd2lkdGg7CisgICAgZmxvYXQgICBxdWlldF90aHI7CisgICAgZmxvYXQgICBub3JtOworICAgIGZsb2F0ICAgU05SOworICAgIGZsb2F0ICAgYmFyazsKK30gdHlwZTJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBubzo1OworICAgIHVuc2lnbmVkIGludCBjYnc6MzsKKyAgICB1bnNpZ25lZCBpbnQgYnU6NjsKKyAgICB1bnNpZ25lZCBpbnQgYm86NjsKKyAgICB1bnNpZ25lZCBpbnQgdzFfNTc2OjEwOworICAgIHVuc2lnbmVkIGludCB3Ml81NzY6MTA7Cit9IHR5cGUzNF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2l6ZV90ICBsZW4xOworICAgIGNvbnN0IHR5cGUxX3QgKmNvbnN0IHRhYjE7CisgICAgc2l6ZV90ICBsZW4yOworICAgIGNvbnN0IHR5cGUyX3QgKmNvbnN0IHRhYjI7CisgICAgc2l6ZV90ICBsZW4zOworICAgIGNvbnN0IHR5cGUzNF90ICpjb25zdCB0YWIzOworICAgIHNpemVfdCAgbGVuNDsKKyAgICBjb25zdCB0eXBlMzRfdCAqY29uc3QgdGFiNDsKK30gdHlwZTVfdDsKKworZXh0ZXJuIGNvbnN0IHR5cGU1X3QgdGFibGU1WzZdOworCisKKworI2RlZmluZSBIVE4JMzQKKworc3RydWN0IGh1ZmZjb2RldGFiIHsKKyAgICBjb25zdCBpbnQgeGxlbjsgICAgICAgICAgLyogbWF4LiB4LWluZGV4KyAgICovCisgICAgY29uc3QgaW50IGxpbm1heDsgICAgICAgIC8qIG1heCBudW1iZXIgdG8gYmUgc3RvcmVkIGluIGxpbmJpdHMgKi8KKyAgICBjb25zdCBzaG9ydCAqdGFibGU7ICAgICAgLyogcG9pbnRlciB0byBhcnJheVt4bGVuXVt5bGVuXSAgKi8KKyAgICBjb25zdCBjaGFyICpobGVuOyAgICAgICAgLyogcG9pbnRlciB0byBhcnJheVt4bGVuXVt5bGVuXSAgKi8KK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaHVmZmNvZGV0YWIgaHRbSFROXTsKKyAgICAvKiBnbG9iYWwgbWVtb3J5IGJsb2NrICAgKi8KKyAgICAvKiBhcnJheSBvZiBhbGwgaHVmZmNvZHRhYmxlIGhlYWRlcnMgKi8KKyAgICAvKiAwLi4zMSBIdWZmbWFuIGNvZGUgdGFibGUgMC4uMzEgICovCisgICAgLyogMzIsMzMgY291bnQxLXRhYmxlcyAgICovCisKK2V4dGVybiBjb25zdCBjaGFyIHQzMmxbXTsKK2V4dGVybiBjb25zdCBjaGFyIHQzM2xbXTsKKworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBsYXJnZXRibFsxNiAqIDE2XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgdGFibGUyM1szICogM107CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IHRhYmxlNTZbNCAqIDRdOworCitleHRlcm4gY29uc3QgaW50IHNjZnNpX2JhbmRbNV07CisKKyNlbmRpZiAvKiBMQU1FX1RBQkxFU19IICovCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3Rha2VoaXJvLmMgYi9saWJtcDNsYW1lL3Rha2VoaXJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyNDgyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvdGFrZWhpcm8uYwpAQCAtMCwwICsxLDEzNTYgQEAKKy8qCisgKglNUDMgaHVmZm1hbiB0YWJsZSBzZWxlY3RpbmcgYW5kIGJpdCBjb3VudGluZworICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRha2VoaXJvIFRPTUlOQUdBCisgKglDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBHYWJyaWVsIEJvdXZpZ25lCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qICRJZDogdGFrZWhpcm8uYyx2IDEuNzEuMi4yIDIwMDgvMDkvMjIgMjA6MjE6Mzkgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJxdWFudGl6ZV9wdnQuaCIKKyNpbmNsdWRlICJ0YWJsZXMuaCIKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBpbnQgcmVnaW9uMF9jb3VudDsKKyAgICBjb25zdCBpbnQgcmVnaW9uMV9jb3VudDsKK30gc3ViZHZfdGFibGVbMjNdID0geworICAgIHsKKyAgICAwLCAwfSwgICAgICAgICAgICAgIC8qIDAgYmFuZHMgKi8KKyAgICB7CisgICAgMCwgMH0sICAgICAgICAgICAgICAvKiAxIGJhbmRzICovCisgICAgeworICAgIDAsIDB9LCAgICAgICAgICAgICAgLyogMiBiYW5kcyAqLworICAgIHsKKyAgICAwLCAwfSwgICAgICAgICAgICAgIC8qIDMgYmFuZHMgKi8KKyAgICB7CisgICAgMCwgMH0sICAgICAgICAgICAgICAvKiA0IGJhbmRzICovCisgICAgeworICAgIDAsIDF9LCAgICAgICAgICAgICAgLyogNSBiYW5kcyAqLworICAgIHsKKyAgICAxLCAxfSwgICAgICAgICAgICAgIC8qIDYgYmFuZHMgKi8KKyAgICB7CisgICAgMSwgMX0sICAgICAgICAgICAgICAvKiA3IGJhbmRzICovCisgICAgeworICAgIDEsIDJ9LCAgICAgICAgICAgICAgLyogOCBiYW5kcyAqLworICAgIHsKKyAgICAyLCAyfSwgICAgICAgICAgICAgIC8qIDkgYmFuZHMgKi8KKyAgICB7CisgICAgMiwgM30sICAgICAgICAgICAgICAvKiAxMCBiYW5kcyAqLworICAgIHsKKyAgICAyLCAzfSwgICAgICAgICAgICAgIC8qIDExIGJhbmRzICovCisgICAgeworICAgIDMsIDR9LCAgICAgICAgICAgICAgLyogMTIgYmFuZHMgKi8KKyAgICB7CisgICAgMywgNH0sICAgICAgICAgICAgICAvKiAxMyBiYW5kcyAqLworICAgIHsKKyAgICAzLCA0fSwgICAgICAgICAgICAgIC8qIDE0IGJhbmRzICovCisgICAgeworICAgIDQsIDV9LCAgICAgICAgICAgICAgLyogMTUgYmFuZHMgKi8KKyAgICB7CisgICAgNCwgNX0sICAgICAgICAgICAgICAvKiAxNiBiYW5kcyAqLworICAgIHsKKyAgICA0LCA2fSwgICAgICAgICAgICAgIC8qIDE3IGJhbmRzICovCisgICAgeworICAgIDUsIDZ9LCAgICAgICAgICAgICAgLyogMTggYmFuZHMgKi8KKyAgICB7CisgICAgNSwgNn0sICAgICAgICAgICAgICAvKiAxOSBiYW5kcyAqLworICAgIHsKKyAgICA1LCA3fSwgICAgICAgICAgICAgIC8qIDIwIGJhbmRzICovCisgICAgeworICAgIDYsIDd9LCAgICAgICAgICAgICAgLyogMjEgYmFuZHMgKi8KKyAgICB7CisgICAgNiwgN30sICAgICAgICAgICAgICAvKiAyMiBiYW5kcyAqLworfTsKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBub25saW5lYXIgcXVhbnRpemF0aW9uIG9mIHhyIAorICogTW9yZSBhY2N1cmF0ZSBmb3JtdWxhIHRoYW4gdGhlIElTTyBmb3JtdWxhLiAgVGFrZXMgaW50byBhY2NvdW50CisgKiB0aGUgZmFjdCB0aGF0IHdlIGFyZSBxdWFudGl6aW5nIHhyIC0+IGl4LCBidXQgd2Ugd2FudCBpeF40LzMgdG8gYmUgCisgKiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB4XjQvMy4gICh0YWtpbmcgdGhlIG5lYXJlc3QgaW50IHdvdWxkIG1lYW4KKyAqIGl4IGlzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHhyLCB3aGljaCBpcyBkaWZmZXJlbnQuKQorICoKKyAqIEZyb20gU2VnaGVyIEJvZXNzZW5rb29sIDxzZWdoZXJAZWFzdHNpdGUubmw+ICAxMS8xOTk5CisgKgorICogMDkvMjAwMDogQVNNIGNvZGUgcmVtb3ZlZCBpbiBmYXZvciBvZiBJRUVFNzU0IGhhY2sgYnkgVGFrZWhpcm8KKyAqIFRvbWluYWdhLiBJZiB5b3UgbmVlZCB0aGUgQVNNIGNvZGUsIGNoZWNrIENWUyBjaXJjYSBBdWcgMjAwMC4KKyAqCisgKiAwMS8yMDA0OiBPcHRpbWl6YXRpb25zIGJ5IEdhYnJpZWwgQm91dmlnbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisKKworc3RhdGljIHZvaWQKK3F1YW50aXplX2xpbmVzX3hycG93XzAxKGludCBsLCBGTE9BVCBpc3RlcCwgY29uc3QgRkxPQVQgKiB4ciwgaW50ICppeCkKK3sKKyAgICBjb25zdCBGTE9BVCBjb21wYXJldmFsMCA9ICgxLjAgLSAwLjQwNTQpIC8gaXN0ZXA7CisKKyAgICBhc3NlcnQobCA+IDApOworICAgIGwgPSBsID4+IDE7CisgICAgd2hpbGUgKGwtLSkgeworICAgICAgICAqKGl4KyspID0gKGNvbXBhcmV2YWwwID4gKnhyKyspID8gMCA6IDE7CisgICAgICAgICooaXgrKykgPSAoY29tcGFyZXZhbDAgPiAqeHIrKykgPyAwIDogMTsKKyAgICB9Cit9CisKKworCisjaWZkZWYgVEFLRUhJUk9fSUVFRTc1NF9IQUNLCisKK3R5cGVkZWYgdW5pb24geworICAgIGZsb2F0ICAgZjsKKyAgICBpbnQgICAgIGk7Cit9IGZpX3VuaW9uOworCisjZGVmaW5lIE1BR0lDX0ZMT0FUICg2NTUzNiooMTI4KSkKKyNkZWZpbmUgTUFHSUNfSU5UIDB4NGIwMDAwMDAKKworCitzdGF0aWMgdm9pZAorcXVhbnRpemVfbGluZXNfeHJwb3coaW50IGwsIEZMT0FUIGlzdGVwLCBjb25zdCBGTE9BVCAqIHhwLCBpbnQgKnBpKQoreworICAgIGZpX3VuaW9uICpmaTsKKyAgICBpbnQgICAgIHJlbWFpbmluZzsKKworICAgIGFzc2VydChsID4gMCk7CisKKyAgICBmaSA9IChmaV91bmlvbiAqKSBwaTsKKworICAgIGwgPSBsID4+IDE7CisgICAgcmVtYWluaW5nID0gbCAlIDI7CisgICAgbCA9IGwgPj4gMTsKKyAgICB3aGlsZSAobC0tKSB7CisgICAgICAgIGRvdWJsZSAgeDAgPSBpc3RlcCAqIHhwWzBdOworICAgICAgICBkb3VibGUgIHgxID0gaXN0ZXAgKiB4cFsxXTsKKyAgICAgICAgZG91YmxlICB4MiA9IGlzdGVwICogeHBbMl07CisgICAgICAgIGRvdWJsZSAgeDMgPSBpc3RlcCAqIHhwWzNdOworCisgICAgICAgIHgwICs9IE1BR0lDX0ZMT0FUOworICAgICAgICBmaVswXS5mID0geDA7CisgICAgICAgIHgxICs9IE1BR0lDX0ZMT0FUOworICAgICAgICBmaVsxXS5mID0geDE7CisgICAgICAgIHgyICs9IE1BR0lDX0ZMT0FUOworICAgICAgICBmaVsyXS5mID0geDI7CisgICAgICAgIHgzICs9IE1BR0lDX0ZMT0FUOworICAgICAgICBmaVszXS5mID0geDM7CisKKyAgICAgICAgZmlbMF0uZiA9IHgwICsgYWRqNDNhc21bZmlbMF0uaSAtIE1BR0lDX0lOVF07CisgICAgICAgIGZpWzFdLmYgPSB4MSArIGFkajQzYXNtW2ZpWzFdLmkgLSBNQUdJQ19JTlRdOworICAgICAgICBmaVsyXS5mID0geDIgKyBhZGo0M2FzbVtmaVsyXS5pIC0gTUFHSUNfSU5UXTsKKyAgICAgICAgZmlbM10uZiA9IHgzICsgYWRqNDNhc21bZmlbM10uaSAtIE1BR0lDX0lOVF07CisKKyAgICAgICAgZmlbMF0uaSAtPSBNQUdJQ19JTlQ7CisgICAgICAgIGZpWzFdLmkgLT0gTUFHSUNfSU5UOworICAgICAgICBmaVsyXS5pIC09IE1BR0lDX0lOVDsKKyAgICAgICAgZmlbM10uaSAtPSBNQUdJQ19JTlQ7CisgICAgICAgIGZpICs9IDQ7CisgICAgICAgIHhwICs9IDQ7CisgICAgfTsKKyAgICBpZiAocmVtYWluaW5nKSB7CisgICAgICAgIGRvdWJsZSAgeDAgPSBpc3RlcCAqIHhwWzBdOworICAgICAgICBkb3VibGUgIHgxID0gaXN0ZXAgKiB4cFsxXTsKKworICAgICAgICB4MCArPSBNQUdJQ19GTE9BVDsKKyAgICAgICAgZmlbMF0uZiA9IHgwOworICAgICAgICB4MSArPSBNQUdJQ19GTE9BVDsKKyAgICAgICAgZmlbMV0uZiA9IHgxOworCisgICAgICAgIGZpWzBdLmYgPSB4MCArIGFkajQzYXNtW2ZpWzBdLmkgLSBNQUdJQ19JTlRdOworICAgICAgICBmaVsxXS5mID0geDEgKyBhZGo0M2FzbVtmaVsxXS5pIC0gTUFHSUNfSU5UXTsKKworICAgICAgICBmaVswXS5pIC09IE1BR0lDX0lOVDsKKyAgICAgICAgZmlbMV0uaSAtPSBNQUdJQ19JTlQ7CisgICAgfQorCit9CisKKworI2Vsc2UKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWFJQT1dfRlRPSSBpcyBhIG1hY3JvIHRvIGNvbnZlcnQgZmxvYXRzIHRvIGludHMuICAKKyAqIGlmIFhSUE9XX0ZUT0koeCkgPSBuZWFyZXN0X2ludCh4KSwgdGhlbiBRVUFOVEZBQyh4KT1hZGo0M2FzbVt4XQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPVU5ERkFDPSAtMC4wOTQ2CisgKgorICogaWYgWFJQT1dfRlRPSSh4KSA9IGZsb29yKHgpLCB0aGVuIFFVQU5URkFDKHgpPWFzajQzW3hdICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRGQUM9MC40MDU0CisgKgorICogTm90ZTogdXNpbmcgZmxvb3IoKSBvciAoaW50KSBpcyBleHRyZW1lbHkgc2xvdy4gT24gbWFjaGluZXMgd2hlcmUKKyAqIHRoZSBUQUtFSElST19JRUVFNzU0X0hBQ0sgY29kZSBhYm92ZSBkb2VzIG5vdCB3b3JrLCBpdCBpcyB3b3J0aHdpbGUKKyAqIHRvIHdyaXRlIHNvbWUgQVNNIGZvciBYUlBPV19GVE9JKCkuICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFhSUE9XX0ZUT0koc3JjLGRlc3QpICgoZGVzdCkgPSAoaW50KShzcmMpKQorI2RlZmluZSBRVUFOVEZBQyhyeCkgIGFkajQzW3J4XQorI2RlZmluZSBST1VOREZBQyAwLjQwNTQKKworCitzdGF0aWMgdm9pZAorcXVhbnRpemVfbGluZXNfeHJwb3coaW50IGwsIEZMT0FUIGlzdGVwLCBjb25zdCBGTE9BVCAqIHhyLCBpbnQgKml4KQoreworICAgIGludCAgICAgcmVtYWluaW5nOworCisgICAgYXNzZXJ0KGwgPiAwKTsKKworICAgIGwgPSBsID4+IDE7CisgICAgcmVtYWluaW5nID0gbCAlIDI7CisgICAgbCA9IGwgPj4gMTsKKyAgICB3aGlsZSAobC0tKSB7CisgICAgICAgIEZMT0FUICAgeDAsIHgxLCB4MiwgeDM7CisgICAgICAgIGludCAgICAgcngwLCByeDEsIHJ4MiwgcngzOworCisgICAgICAgIHgwID0gKnhyKysgKiBpc3RlcDsKKyAgICAgICAgeDEgPSAqeHIrKyAqIGlzdGVwOworICAgICAgICBYUlBPV19GVE9JKHgwLCByeDApOworICAgICAgICB4MiA9ICp4cisrICogaXN0ZXA7CisgICAgICAgIFhSUE9XX0ZUT0koeDEsIHJ4MSk7CisgICAgICAgIHgzID0gKnhyKysgKiBpc3RlcDsKKyAgICAgICAgWFJQT1dfRlRPSSh4MiwgcngyKTsKKyAgICAgICAgeDAgKz0gUVVBTlRGQUMocngwKTsKKyAgICAgICAgWFJQT1dfRlRPSSh4MywgcngzKTsKKyAgICAgICAgeDEgKz0gUVVBTlRGQUMocngxKTsKKyAgICAgICAgWFJQT1dfRlRPSSh4MCwgKml4KyspOworICAgICAgICB4MiArPSBRVUFOVEZBQyhyeDIpOworICAgICAgICBYUlBPV19GVE9JKHgxLCAqaXgrKyk7CisgICAgICAgIHgzICs9IFFVQU5URkFDKHJ4Myk7CisgICAgICAgIFhSUE9XX0ZUT0koeDIsICppeCsrKTsKKyAgICAgICAgWFJQT1dfRlRPSSh4MywgKml4KyspOworICAgIH07CisgICAgaWYgKHJlbWFpbmluZykgeworICAgICAgICBGTE9BVCAgIHgwLCB4MTsKKyAgICAgICAgaW50ICAgICByeDAsIHJ4MTsKKworICAgICAgICB4MCA9ICp4cisrICogaXN0ZXA7CisgICAgICAgIHgxID0gKnhyKysgKiBpc3RlcDsKKyAgICAgICAgWFJQT1dfRlRPSSh4MCwgcngwKTsKKyAgICAgICAgWFJQT1dfRlRPSSh4MSwgcngxKTsKKyAgICAgICAgeDAgKz0gUVVBTlRGQUMocngwKTsKKyAgICAgICAgeDEgKz0gUVVBTlRGQUMocngxKTsKKyAgICAgICAgWFJQT1dfRlRPSSh4MCwgKml4KyspOworICAgICAgICBYUlBPV19GVE9JKHgxLCAqaXgrKyk7CisgICAgfQorCit9CisKKworCisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFF1YW50aXphdGlvbiBmdW5jdGlvbgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbGVjdCB3aGljaCBsaW5lcyB0byBxdWFudGl6ZSBhbmQgY2FsbCB0aGUKKyAqIHByb3BlciBxdWFudGl6YXRpb24gZnVuY3Rpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitxdWFudGl6ZV94cnBvdyhjb25zdCBGTE9BVCAqIHhwLCBpbnQgKnBpLCBGTE9BVCBpc3RlcCwgZ3JfaW5mbyBjb25zdCAqY29uc3QgY29kX2luZm8sCisgICAgICAgICAgICAgICBjYWxjX25vaXNlX2RhdGEgY29uc3QgKnByZXZfbm9pc2UpCit7CisgICAgLyogcXVhbnRpemUgb24geHJeKDMvNCkgaW5zdGVhZCBvZiB4ciAqLworICAgIGludCAgICAgc2ZiOworICAgIGludCAgICAgc2ZibWF4OworICAgIGludCAgICAgaiA9IDA7CisgICAgaW50ICAgICBwcmV2X2RhdGFfdXNlOworICAgIGludCAgICAqaURhdGE7CisgICAgaW50ICAgICBhY2N1bXVsYXRlID0gMDsKKyAgICBpbnQgICAgIGFjY3VtdWxhdGUwMSA9IDA7CisgICAgaW50ICAgICphY2NfaURhdGE7CisgICAgY29uc3QgRkxPQVQgKmFjY194cDsKKworICAgIGlEYXRhID0gcGk7CisgICAgYWNjX3hwID0geHA7CisgICAgYWNjX2lEYXRhID0gaURhdGE7CisKKworICAgIC8qIFJldXNpbmcgcHJldmlvdXNseSBjb21wdXRlZCBkYXRhIGRvZXMgbm90IHNlZW1zIHRvIHdvcmsgaWYgZ2xvYmFsIGdhaW4KKyAgICAgICBpcyBjaGFuZ2VkLiBGaW5kaW5nIHdoeSBpdCBiZWhhdmVzIHRoaXMgd2F5IHdvdWxkIGFsbG93IHRvIHVzZSBhIGNhY2hlIG9mIAorICAgICAgIHByZXZpb3VzbHkgY29tcHV0ZWQgdmFsdWVzIChsZXQncyAxMCBjYWNoZWQgdmFsdWVzIHBlciBzZmIpIHRoYXQgd291bGQgCisgICAgICAgcHJvYmFibHkgcHJvdmlkZSBhIG5vdGljZWFibGUgc3BlZWR1cCAqLworICAgIHByZXZfZGF0YV91c2UgPSAocHJldl9ub2lzZSAmJiAoY29kX2luZm8tPmdsb2JhbF9nYWluID09IHByZXZfbm9pc2UtPmdsb2JhbF9nYWluKSk7CisKKyAgICBpZiAoY29kX2luZm8tPmJsb2NrX3R5cGUgPT0gU0hPUlRfVFlQRSkKKyAgICAgICAgc2ZibWF4ID0gMzg7CisgICAgZWxzZQorICAgICAgICBzZmJtYXggPSAyMTsKKworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDw9IHNmYm1heDsgc2ZiKyspIHsKKyAgICAgICAgaW50ICAgICBzdGVwID0gLTE7CisKKyAgICAgICAgaWYgKHByZXZfZGF0YV91c2UgfHwgY29kX2luZm8tPmJsb2NrX3R5cGUgPT0gTk9STV9UWVBFKSB7CisgICAgICAgICAgICBzdGVwID0KKyAgICAgICAgICAgICAgICBjb2RfaW5mby0+Z2xvYmFsX2dhaW4KKyAgICAgICAgICAgICAgICAtICgoY29kX2luZm8tPnNjYWxlZmFjW3NmYl0gKyAoY29kX2luZm8tPnByZWZsYWcgPyBwcmV0YWJbc2ZiXSA6IDApKQorICAgICAgICAgICAgICAgICAgIDw8IChjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgKyAxKSkKKyAgICAgICAgICAgICAgICAtIGNvZF9pbmZvLT5zdWJibG9ja19nYWluW2NvZF9pbmZvLT53aW5kb3dbc2ZiXV0gKiA4OworICAgICAgICB9CisgICAgICAgIGFzc2VydChjb2RfaW5mby0+d2lkdGhbc2ZiXSA+PSAwKTsKKyAgICAgICAgaWYgKHByZXZfZGF0YV91c2UgJiYgKHByZXZfbm9pc2UtPnN0ZXBbc2ZiXSA9PSBzdGVwKSkgeworICAgICAgICAgICAgLyogZG8gbm90IHJlY29tcHV0ZSB0aGlzIHBhcnQsCisgICAgICAgICAgICAgICBidXQgY29tcHV0ZSBhY2N1bXVsYXRlZCBsaW5lcyAqLworICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgICAgICAgICBxdWFudGl6ZV9saW5lc194cnBvdyhhY2N1bXVsYXRlLCBpc3RlcCwgYWNjX3hwLCBhY2NfaURhdGEpOworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGUwMSkgeworICAgICAgICAgICAgICAgIHF1YW50aXplX2xpbmVzX3hycG93XzAxKGFjY3VtdWxhdGUwMSwgaXN0ZXAsIGFjY194cCwgYWNjX2lEYXRhKTsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlMDEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgICAgICAgICAvKnNob3VsZCBjb21wdXRlIHRoaXMgcGFydCAqLworICAgICAgICAgICAgaW50ICAgICBsOworICAgICAgICAgICAgbCA9IGNvZF9pbmZvLT53aWR0aFtzZmJdOworCisgICAgICAgICAgICBpZiAoKGogKyBjb2RfaW5mby0+d2lkdGhbc2ZiXSkgPiBjb2RfaW5mby0+bWF4X25vbnplcm9fY29lZmYpIHsKKyAgICAgICAgICAgICAgICAvKmRvIG5vdCBjb21wdXRlIHVwcGVyIHplcm8gcGFydCAqLworICAgICAgICAgICAgICAgIGludCAgICAgdXNlZnVsbHNpemU7CisgICAgICAgICAgICAgICAgdXNlZnVsbHNpemUgPSBjb2RfaW5mby0+bWF4X25vbnplcm9fY29lZmYgLSBqICsgMTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBpW2NvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZl0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogKDU3NiAtIGNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZikpOworICAgICAgICAgICAgICAgIGwgPSB1c2VmdWxsc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBsID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBubyBuZWVkIHRvIGNvbXB1dGUgaGlnaGVyIHNmYiB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBzZmIgPSBzZmJtYXggKyAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKmFjY3VtdWxhdGUgbGluZXMgdG8gcXVhbnRpemUgKi8KKyAgICAgICAgICAgIGlmICghYWNjdW11bGF0ZSAmJiAhYWNjdW11bGF0ZTAxKSB7CisgICAgICAgICAgICAgICAgYWNjX2lEYXRhID0gaURhdGE7CisgICAgICAgICAgICAgICAgYWNjX3hwID0geHA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJldl9ub2lzZSAmJgorICAgICAgICAgICAgICAgIHByZXZfbm9pc2UtPnNmYl9jb3VudDEgPiAwICYmCisgICAgICAgICAgICAgICAgc2ZiID49IHByZXZfbm9pc2UtPnNmYl9jb3VudDEgJiYKKyAgICAgICAgICAgICAgICBwcmV2X25vaXNlLT5zdGVwW3NmYl0gPiAwICYmIHN0ZXAgPj0gcHJldl9ub2lzZS0+c3RlcFtzZmJdKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZV9saW5lc194cnBvdyhhY2N1bXVsYXRlLCBpc3RlcCwgYWNjX3hwLCBhY2NfaURhdGEpOworICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYWNjX2lEYXRhID0gaURhdGE7CisgICAgICAgICAgICAgICAgICAgIGFjY194cCA9IHhwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlMDEgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlMDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVfbGluZXNfeHJwb3dfMDEoYWNjdW11bGF0ZTAxLCBpc3RlcCwgYWNjX3hwLCBhY2NfaURhdGEpOworICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlMDEgPSAwOworICAgICAgICAgICAgICAgICAgICBhY2NfaURhdGEgPSBpRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgYWNjX3hwID0geHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUgKz0gbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGwgPD0gMCkgeworICAgICAgICAgICAgICAgIC8qICByaDogMjAwNDAyMTUKKyAgICAgICAgICAgICAgICAgKiAgbWF5IGhhcHBlbiBkdWUgdG8gInByZXZfZGF0YV91c2UiIG9wdGltaXphdGlvbiAKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYWNjdW11bGF0ZTAxKSB7CisgICAgICAgICAgICAgICAgICAgIHF1YW50aXplX2xpbmVzX3hycG93XzAxKGFjY3VtdWxhdGUwMSwgaXN0ZXAsIGFjY194cCwgYWNjX2lEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZTAxID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVfbGluZXNfeHJwb3coYWNjdW11bGF0ZSwgaXN0ZXAsIGFjY194cCwgYWNjX2lEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7ICAvKiBlbmRzIGZvci1sb29wICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNmYiA8PSBzZmJtYXgpIHsKKyAgICAgICAgICAgIGlEYXRhICs9IGNvZF9pbmZvLT53aWR0aFtzZmJdOworICAgICAgICAgICAgeHAgKz0gY29kX2luZm8tPndpZHRoW3NmYl07CisgICAgICAgICAgICBqICs9IGNvZF9pbmZvLT53aWR0aFtzZmJdOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhY2N1bXVsYXRlKSB7ICAgLypsYXN0IGRhdGEgcGFydCAqLworICAgICAgICBxdWFudGl6ZV9saW5lc194cnBvdyhhY2N1bXVsYXRlLCBpc3RlcCwgYWNjX3hwLCBhY2NfaURhdGEpOworICAgICAgICBhY2N1bXVsYXRlID0gMDsKKyAgICB9CisgICAgaWYgKGFjY3VtdWxhdGUwMSkgeyAvKmxhc3QgZGF0YSBwYXJ0ICovCisgICAgICAgIHF1YW50aXplX2xpbmVzX3hycG93XzAxKGFjY3VtdWxhdGUwMSwgaXN0ZXAsIGFjY194cCwgYWNjX2lEYXRhKTsKKyAgICAgICAgYWNjdW11bGF0ZTAxID0gMDsKKyAgICB9CisKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICAgICBpeF9tYXgJCQkJCQkJICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAoraXhfbWF4KGNvbnN0IGludCAqaXgsIGNvbnN0IGludCAqZW5kKQoreworICAgIGludCAgICAgbWF4MSA9IDAsIG1heDIgPSAwOworCisgICAgZG8geworICAgICAgICBpbnQgY29uc3QgeDEgPSAqaXgrKzsKKyAgICAgICAgaW50IGNvbnN0IHgyID0gKml4Kys7CisgICAgICAgIGlmIChtYXgxIDwgeDEpCisgICAgICAgICAgICBtYXgxID0geDE7CisKKyAgICAgICAgaWYgKG1heDIgPCB4MikKKyAgICAgICAgICAgIG1heDIgPSB4MjsKKyAgICB9IHdoaWxlIChpeCA8IGVuZCk7CisgICAgaWYgKG1heDEgPCBtYXgyKQorICAgICAgICBtYXgxID0gbWF4MjsKKyAgICByZXR1cm4gbWF4MTsKK30KKworCisKKworCisKKworCitzdGF0aWMgaW50Citjb3VudF9iaXRfRVNDKGNvbnN0IGludCAqaXgsIGNvbnN0IGludCAqY29uc3QgZW5kLCBpbnQgdDEsIGNvbnN0IGludCB0MiwgaW50ICpjb25zdCBzKQoreworICAgIC8qIEVTQy10YWJsZSBpcyB1c2VkICovCisgICAgaW50IGNvbnN0IGxpbmJpdHMgPSBodFt0MV0ueGxlbiAqIDY1NTM2ICsgaHRbdDJdLnhsZW47CisgICAgaW50ICAgICBzdW0gPSAwLCBzdW0yOworCisgICAgZG8geworICAgICAgICBpbnQgICAgIHggPSAqaXgrKzsKKyAgICAgICAgaW50ICAgICB5ID0gKml4Kys7CisKKyAgICAgICAgaWYgKHggIT0gMCkgeworICAgICAgICAgICAgaWYgKHggPiAxNCkgeworICAgICAgICAgICAgICAgIHggPSAxNTsKKyAgICAgICAgICAgICAgICBzdW0gKz0gbGluYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggKj0gMTY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoeSA+IDE0KSB7CisgICAgICAgICAgICAgICAgeSA9IDE1OworICAgICAgICAgICAgICAgIHN1bSArPSBsaW5iaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeCArPSB5OworICAgICAgICB9CisKKyAgICAgICAgc3VtICs9IGxhcmdldGJsW3hdOworICAgIH0gd2hpbGUgKGl4IDwgZW5kKTsKKworICAgIHN1bTIgPSBzdW0gJiAweGZmZmY7CisgICAgc3VtID4+PSAxNjsKKworICAgIGlmIChzdW0gPiBzdW0yKSB7CisgICAgICAgIHN1bSA9IHN1bTI7CisgICAgICAgIHQxID0gdDI7CisgICAgfQorCisgICAgKnMgKz0gc3VtOworICAgIHJldHVybiB0MTsKK30KKworCitpbmxpbmUgc3RhdGljIGludAorY291bnRfYml0X25vRVNDKGNvbnN0IGludCAqaXgsIGNvbnN0IGludCAqY29uc3QgZW5kLCBpbnQgKmNvbnN0IHMpCit7CisgICAgLyogTm8gRVNDLXdvcmRzICovCisgICAgaW50ICAgICBzdW0xID0gMDsKKyAgICBjb25zdCBjaGFyICpjb25zdCBobGVuMSA9IGh0WzFdLmhsZW47CisKKyAgICBkbyB7CisgICAgICAgIGludCBjb25zdCB4ID0gaXhbMF0gKiAyICsgaXhbMV07CisgICAgICAgIGl4ICs9IDI7CisgICAgICAgIHN1bTEgKz0gaGxlbjFbeF07CisgICAgfSB3aGlsZSAoaXggPCBlbmQpOworCisgICAgKnMgKz0gc3VtMTsKKyAgICByZXR1cm4gMTsKK30KKworCisKK2lubGluZSBzdGF0aWMgaW50Citjb3VudF9iaXRfbm9FU0NfZnJvbTIoY29uc3QgaW50ICppeCwgY29uc3QgaW50ICpjb25zdCBlbmQsIGludCB0MSwgaW50ICpjb25zdCBzKQoreworICAgIC8qIE5vIEVTQy13b3JkcyAqLworICAgIHVuc2lnbmVkIGludCBzdW0gPSAwLCBzdW0yOworICAgIGNvbnN0IGludCB4bGVuID0gaHRbdDFdLnhsZW47CisgICAgY29uc3QgdW5zaWduZWQgaW50ICpobGVuOworICAgIGlmICh0MSA9PSAyKQorICAgICAgICBobGVuID0gdGFibGUyMzsKKyAgICBlbHNlCisgICAgICAgIGhsZW4gPSB0YWJsZTU2OworCisgICAgZG8geworICAgICAgICBpbnQgY29uc3QgeCA9IGl4WzBdICogeGxlbiArIGl4WzFdOworICAgICAgICBpeCArPSAyOworICAgICAgICBzdW0gKz0gaGxlblt4XTsKKyAgICB9IHdoaWxlIChpeCA8IGVuZCk7CisKKyAgICBzdW0yID0gc3VtICYgMHhmZmZmOworICAgIHN1bSA+Pj0gMTY7CisKKyAgICBpZiAoc3VtID4gc3VtMikgeworICAgICAgICBzdW0gPSBzdW0yOworICAgICAgICB0MSsrOworICAgIH0KKworICAgICpzICs9IHN1bTsKKyAgICByZXR1cm4gdDE7Cit9CisKKworaW5saW5lIHN0YXRpYyBpbnQKK2NvdW50X2JpdF9ub0VTQ19mcm9tMyhjb25zdCBpbnQgKml4LCBjb25zdCBpbnQgKmNvbnN0IGVuZCwgaW50IHQxLCBpbnQgKmNvbnN0IHMpCit7CisgICAgLyogTm8gRVNDLXdvcmRzICovCisgICAgaW50ICAgICBzdW0xID0gMDsKKyAgICBpbnQgICAgIHN1bTIgPSAwOworICAgIGludCAgICAgc3VtMyA9IDA7CisgICAgY29uc3QgaW50IHhsZW4gPSBodFt0MV0ueGxlbjsKKyAgICBjb25zdCBjaGFyICpjb25zdCBobGVuMSA9IGh0W3QxXS5obGVuOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGhsZW4yID0gaHRbdDEgKyAxXS5obGVuOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGhsZW4zID0gaHRbdDEgKyAyXS5obGVuOworICAgIGludCAgICAgdDsKKworICAgIGRvIHsKKyAgICAgICAgaW50IGNvbnN0IHggPSBpeFswXSAqIHhsZW4gKyBpeFsxXTsKKyAgICAgICAgaXggKz0gMjsKKyAgICAgICAgc3VtMSArPSBobGVuMVt4XTsKKyAgICAgICAgc3VtMiArPSBobGVuMlt4XTsKKyAgICAgICAgc3VtMyArPSBobGVuM1t4XTsKKyAgICB9IHdoaWxlIChpeCA8IGVuZCk7CisKKyAgICB0ID0gdDE7CisgICAgaWYgKHN1bTEgPiBzdW0yKSB7CisgICAgICAgIHN1bTEgPSBzdW0yOworICAgICAgICB0Kys7CisgICAgfQorICAgIGlmIChzdW0xID4gc3VtMykgeworICAgICAgICBzdW0xID0gc3VtMzsKKyAgICAgICAgdCA9IHQxICsgMjsKKyAgICB9CisgICAgKnMgKz0gc3VtMTsKKworICAgIHJldHVybiB0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICAgICAgY2hvb3NlIHRhYmxlCQkJCQkJICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgQ2hvb3NlIHRoZSBIdWZmbWFuIHRhYmxlIHRoYXQgd2lsbCBlbmNvZGUgaXhbYmVnaW4uLmVuZF0gd2l0aAorICB0aGUgZmV3ZXN0IGJpdHMuCisKKyAgTm90ZTogVGhpcyBjb2RlIGNvbnRhaW5zIGtub3dsZWRnZSBhYm91dCB0aGUgc2l6ZXMgYW5kIGNoYXJhY3RlcmlzdGljcworICBvZiB0aGUgSHVmZm1hbiB0YWJsZXMgYXMgZGVmaW5lZCBpbiB0aGUgSVMgKFRhYmxlIEIuNyksIGFuZCB3aWxsIG5vdCB3b3JrCisgIHdpdGggYW55IGFyYml0cmFyeSB0YWJsZXMuCisqLworCitzdGF0aWMgaW50CitjaG9vc2VfdGFibGVfbm9uTU1YKGNvbnN0IGludCAqaXgsIGNvbnN0IGludCAqY29uc3QgZW5kLCBpbnQgKmNvbnN0IHMpCit7CisgICAgaW50ICAgICBtYXg7CisgICAgaW50ICAgICBjaG9pY2UsIGNob2ljZTI7CisgICAgc3RhdGljIGNvbnN0IGludCBodWZfdGJsX25vRVNDW10gPSB7CisgICAgICAgIDEsIDIsIDUsIDcsIDcsIDEwLCAxMCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzCisgICAgfTsKKworICAgIG1heCA9IGl4X21heChpeCwgZW5kKTsKKworICAgIHN3aXRjaCAobWF4KSB7CisgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gbWF4OworCisgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gY291bnRfYml0X25vRVNDKGl4LCBlbmQsIHMpOworCisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIGNvdW50X2JpdF9ub0VTQ19mcm9tMihpeCwgZW5kLCBodWZfdGJsX25vRVNDW21heCAtIDFdLCBzKTsKKworICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OgorICAgIGNhc2UgNzoKKyAgICBjYXNlIDg6CisgICAgY2FzZSA5OgorICAgIGNhc2UgMTA6CisgICAgY2FzZSAxMToKKyAgICBjYXNlIDEyOgorICAgIGNhc2UgMTM6CisgICAgY2FzZSAxNDoKKyAgICBjYXNlIDE1OgorICAgICAgICByZXR1cm4gY291bnRfYml0X25vRVNDX2Zyb20zKGl4LCBlbmQsIGh1Zl90Ymxfbm9FU0NbbWF4IC0gMV0sIHMpOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogdHJ5IHRhYmxlcyB3aXRoIGxpbmJpdHMgKi8KKyAgICAgICAgaWYgKG1heCA+IElYTUFYX1ZBTCkgeworICAgICAgICAgICAgKnMgPSBMQVJHRV9CSVRTOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1heCAtPSAxNTsKKyAgICAgICAgZm9yIChjaG9pY2UyID0gMjQ7IGNob2ljZTIgPCAzMjsgY2hvaWNlMisrKSB7CisgICAgICAgICAgICBpZiAoaHRbY2hvaWNlMl0ubGlubWF4ID49IG1heCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChjaG9pY2UgPSBjaG9pY2UyIC0gODsgY2hvaWNlIDwgMjQ7IGNob2ljZSsrKSB7CisgICAgICAgICAgICBpZiAoaHRbY2hvaWNlXS5saW5tYXggPj0gbWF4KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50X2JpdF9FU0MoaXgsIGVuZCwgY2hvaWNlLCBjaG9pY2UyLCBzKTsKKyAgICB9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgICAgIGNvdW50X2JpdAkJCQkJCQkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50Citub3F1YW50X2NvdW50X2JpdHMobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjLAorICAgICAgICAgICAgICAgICAgIGdyX2luZm8gKiBjb25zdCBnaSwgY2FsY19ub2lzZV9kYXRhICogcHJldl9ub2lzZSkKK3sKKyAgICBpbnQgICAgIGJpdHMgPSAwOworICAgIGludCAgICAgaSwgYTEsIGEyOworICAgIGludCBjb25zdCAqY29uc3QgaXggPSBnaS0+bDNfZW5jOworCisgICAgaSA9IE1pbig1NzYsICgoZ2ktPm1heF9ub256ZXJvX2NvZWZmICsgMikgPj4gMSkgPDwgMSk7CisKKyAgICBpZiAocHJldl9ub2lzZSkKKyAgICAgICAgcHJldl9ub2lzZS0+c2ZiX2NvdW50MSA9IDA7CisKKyAgICAvKiBEZXRlcm1pbmUgY291bnQxIHJlZ2lvbiAqLworICAgIGZvciAoOyBpID4gMTsgaSAtPSAyKQorICAgICAgICBpZiAoaXhbaSAtIDFdIHwgaXhbaSAtIDJdKQorICAgICAgICAgICAgYnJlYWs7CisgICAgZ2ktPmNvdW50MSA9IGk7CisKKyAgICAvKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYml0cyB0byBlbmNvZGUgdGhlIHF1YWRydXBsZXMuICovCisgICAgYTEgPSBhMiA9IDA7CisgICAgZm9yICg7IGkgPiAzOyBpIC09IDQpIHsKKyAgICAgICAgaW50ICAgICBwOworICAgICAgICAvKiBoYWNrIHRvIGNoZWNrIGlmIGFsbCB2YWx1ZXMgPD0gMSAqLworICAgICAgICBpZiAoKHVuc2lnbmVkIGludCkgKGl4W2kgLSAxXSB8IGl4W2kgLSAyXSB8IGl4W2kgLSAzXSB8IGl4W2kgLSA0XSkgPiAxKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcCA9ICgoaXhbaSAtIDRdICogMiArIGl4W2kgLSAzXSkgKiAyICsgaXhbaSAtIDJdKSAqIDIgKyBpeFtpIC0gMV07CisgICAgICAgIGExICs9IHQzMmxbcF07CisgICAgICAgIGEyICs9IHQzM2xbcF07CisgICAgfQorCisgICAgYml0cyA9IGExOworICAgIGdpLT5jb3VudDF0YWJsZV9zZWxlY3QgPSAwOworICAgIGlmIChhMSA+IGEyKSB7CisgICAgICAgIGJpdHMgPSBhMjsKKyAgICAgICAgZ2ktPmNvdW50MXRhYmxlX3NlbGVjdCA9IDE7CisgICAgfQorCisgICAgZ2ktPmNvdW50MWJpdHMgPSBiaXRzOworICAgIGdpLT5iaWdfdmFsdWVzID0gaTsKKyAgICBpZiAoaSA9PSAwKQorICAgICAgICByZXR1cm4gYml0czsKKworICAgIGlmIChnaS0+YmxvY2tfdHlwZSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgIGExID0gMyAqIGdmYy0+c2NhbGVmYWNfYmFuZC5zWzNdOworICAgICAgICBpZiAoYTEgPiBnaS0+YmlnX3ZhbHVlcykKKyAgICAgICAgICAgIGExID0gZ2ktPmJpZ192YWx1ZXM7CisgICAgICAgIGEyID0gZ2ktPmJpZ192YWx1ZXM7CisKKyAgICB9CisgICAgZWxzZSBpZiAoZ2ktPmJsb2NrX3R5cGUgPT0gTk9STV9UWVBFKSB7CisgICAgICAgIGFzc2VydChpIDw9IDU3Nik7IC8qIGJ2X3NjZiBoYXMgNTc2IGVudHJpZXMgKDAuLjU3NSkgKi8KKyAgICAgICAgYTEgPSBnaS0+cmVnaW9uMF9jb3VudCA9IGdmYy0+YnZfc2NmW2kgLSAyXTsKKyAgICAgICAgYTIgPSBnaS0+cmVnaW9uMV9jb3VudCA9IGdmYy0+YnZfc2NmW2kgLSAxXTsKKworICAgICAgICBhc3NlcnQoYTEgKyBhMiArIDIgPCBTQlBTWV9sKTsKKyAgICAgICAgYTIgPSBnZmMtPnNjYWxlZmFjX2JhbmQubFthMSArIGEyICsgMl07CisgICAgICAgIGExID0gZ2ZjLT5zY2FsZWZhY19iYW5kLmxbYTEgKyAxXTsKKyAgICAgICAgaWYgKGEyIDwgaSkKKyAgICAgICAgICAgIGdpLT50YWJsZV9zZWxlY3RbMl0gPSBnZmMtPmNob29zZV90YWJsZShpeCArIGEyLCBpeCArIGksICZiaXRzKTsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ2ktPnJlZ2lvbjBfY291bnQgPSA3OworICAgICAgICAvKmdpLT5yZWdpb24xX2NvdW50ID0gU0JQU1lfbCAtIDcgLSAxOyAqLworICAgICAgICBnaS0+cmVnaW9uMV9jb3VudCA9IFNCTUFYX2wgLSAxIC0gNyAtIDE7CisgICAgICAgIGExID0gZ2ZjLT5zY2FsZWZhY19iYW5kLmxbNyArIDFdOworICAgICAgICBhMiA9IGk7CisgICAgICAgIGlmIChhMSA+IGEyKSB7CisgICAgICAgICAgICBhMSA9IGEyOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBoYXZlIHRvIGFsbG93IGZvciB0aGUgY2FzZSB3aGVuIGJpZ3ZhbHVlcyA8IHJlZ2lvbjAgPCByZWdpb24xICovCisgICAgLyogKGFuZCByZWdpb24wLCByZWdpb24xIGFyZSBpZ25vcmVkKSAqLworICAgIGExID0gTWluKGExLCBpKTsKKyAgICBhMiA9IE1pbihhMiwgaSk7CisKKyAgICBhc3NlcnQoYTEgPj0gMCk7CisgICAgYXNzZXJ0KGEyID49IDApOworCisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBiaXRzIG5lY2Vzc2FyeSB0byBjb2RlIHRoZSBiaWd2YWx1ZXMgcmVnaW9uLiAqLworICAgIGlmICgwIDwgYTEpCisgICAgICAgIGdpLT50YWJsZV9zZWxlY3RbMF0gPSBnZmMtPmNob29zZV90YWJsZShpeCwgaXggKyBhMSwgJmJpdHMpOworICAgIGlmIChhMSA8IGEyKQorICAgICAgICBnaS0+dGFibGVfc2VsZWN0WzFdID0gZ2ZjLT5jaG9vc2VfdGFibGUoaXggKyBhMSwgaXggKyBhMiwgJmJpdHMpOworICAgIGlmIChnZmMtPnVzZV9iZXN0X2h1ZmZtYW4gPT0gMikgeworICAgICAgICBnaS0+cGFydDJfM19sZW5ndGggPSBiaXRzOworICAgICAgICBiZXN0X2h1ZmZtYW5fZGl2aWRlKGdmYywgZ2kpOworICAgICAgICBiaXRzID0gZ2ktPnBhcnQyXzNfbGVuZ3RoOworICAgIH0KKworCisgICAgaWYgKHByZXZfbm9pc2UpIHsKKyAgICAgICAgaWYgKGdpLT5ibG9ja190eXBlID09IE5PUk1fVFlQRSkgeworICAgICAgICAgICAgaW50ICAgICBzZmIgPSAwOworICAgICAgICAgICAgd2hpbGUgKGdmYy0+c2NhbGVmYWNfYmFuZC5sW3NmYl0gPCBnaS0+YmlnX3ZhbHVlcykgeworICAgICAgICAgICAgICAgIHNmYisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9ub2lzZS0+c2ZiX2NvdW50MSA9IHNmYjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXRzOworfQorCitpbnQKK2NvdW50X2JpdHMobGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjLAorICAgICAgICAgICBjb25zdCBGTE9BVCAqIGNvbnN0IHhyLCBncl9pbmZvICogY29uc3QgZ2ksIGNhbGNfbm9pc2VfZGF0YSAqIHByZXZfbm9pc2UpCit7CisgICAgaW50ICAgICpjb25zdCBpeCA9IGdpLT5sM19lbmM7CisKKyAgICAvKiBzaW5jZSBxdWFudGl6ZV94cnBvdyB1c2VzIHRhYmxlIGxvb2t1cCwgd2UgbmVlZCB0byBjaGVjayB0aGlzIGZpcnN0OiAqLworICAgIEZMT0FUIGNvbnN0IHcgPSAoSVhNQVhfVkFMKSAvIElQT1cyMChnaS0+Z2xvYmFsX2dhaW4pOworCisgICAgaWYgKGdpLT54cnBvd19tYXggPiB3KQorICAgICAgICByZXR1cm4gTEFSR0VfQklUUzsKKworICAgIHF1YW50aXplX3hycG93KHhyLCBpeCwgSVBPVzIwKGdpLT5nbG9iYWxfZ2FpbiksIGdpLCBwcmV2X25vaXNlKTsKKworICAgIGlmIChnZmMtPnN1YnN0ZXBfc2hhcGluZyAmIDIpIHsKKyAgICAgICAgaW50ICAgICBzZmIsIGogPSAwOworICAgICAgICAvKiAwLjYzNDUyMTY4MjI0MjQzOSA9IDAuNTk0NioyKiooLjUqMC4xODc1KSAqLworICAgICAgICBpbnQgY29uc3QgZ2FpbiA9IGdpLT5nbG9iYWxfZ2FpbiArIGdpLT5zY2FsZWZhY19zY2FsZTsKKyAgICAgICAgY29uc3QgRkxPQVQgcm91bmRmYWMgPSAwLjYzNDUyMTY4MjI0MjQzOSAvIElQT1cyMChnYWluKTsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBnaS0+c2ZibWF4OyBzZmIrKykgeworICAgICAgICAgICAgaW50IGNvbnN0IHdpZHRoID0gZ2ktPndpZHRoW3NmYl07CisgICAgICAgICAgICBhc3NlcnQod2lkdGggPj0gMCk7CisgICAgICAgICAgICBpZiAoIWdmYy0+cHNldWRvaGFsZltzZmJdKSB7CisgICAgICAgICAgICAgICAgaiArPSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCAgICAgazsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSBqLCBqICs9IHdpZHRoOyBrIDwgajsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgIGl4W2tdID0gKHhyW2tdID49IHJvdW5kZmFjKSA/IGl4W2tdIDogMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5vcXVhbnRfY291bnRfYml0cyhnZmMsIGdpLCBwcmV2X25vaXNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIHJlLWNhbGN1bGF0ZSB0aGUgYmVzdCBzY2FsZWZhY19jb21wcmVzcyB1c2luZyBzY2ZzaQorICB0aGUgc2F2ZWQgYml0cyBhcmUga2VwdCBpbiB0aGUgYml0IHJlc2Vydm9pci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2lubGluZSBzdGF0aWMgdm9pZAorcmVjYWxjX2RpdmlkZV9pbml0KGNvbnN0IGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMsCisgICAgICAgICAgICAgICAgICAgZ3JfaW5mbyBjb25zdCAqY29kX2luZm8sCisgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0ICpjb25zdCBpeCwgaW50IHIwMV9iaXRzW10sIGludCByMDFfZGl2W10sIGludCByMF90YmxbXSwgaW50IHIxX3RibFtdKQoreworICAgIGludCAgICAgcjAsIHIxLCBiaWd2LCByMHQsIHIxdCwgYml0czsKKworICAgIGJpZ3YgPSBjb2RfaW5mby0+YmlnX3ZhbHVlczsKKworICAgIGZvciAocjAgPSAwOyByMCA8PSA3ICsgMTU7IHIwKyspIHsKKyAgICAgICAgcjAxX2JpdHNbcjBdID0gTEFSR0VfQklUUzsKKyAgICB9CisKKyAgICBmb3IgKHIwID0gMDsgcjAgPCAxNjsgcjArKykgeworICAgICAgICBpbnQgY29uc3QgYTEgPSBnZmMtPnNjYWxlZmFjX2JhbmQubFtyMCArIDFdOworICAgICAgICBpbnQgICAgIHIwYml0czsKKyAgICAgICAgaWYgKGExID49IGJpZ3YpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcjBiaXRzID0gMDsKKyAgICAgICAgcjB0ID0gZ2ZjLT5jaG9vc2VfdGFibGUoaXgsIGl4ICsgYTEsICZyMGJpdHMpOworCisgICAgICAgIGZvciAocjEgPSAwOyByMSA8IDg7IHIxKyspIHsKKyAgICAgICAgICAgIGludCBjb25zdCBhMiA9IGdmYy0+c2NhbGVmYWNfYmFuZC5sW3IwICsgcjEgKyAyXTsKKyAgICAgICAgICAgIGlmIChhMiA+PSBiaWd2KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBiaXRzID0gcjBiaXRzOworICAgICAgICAgICAgcjF0ID0gZ2ZjLT5jaG9vc2VfdGFibGUoaXggKyBhMSwgaXggKyBhMiwgJmJpdHMpOworICAgICAgICAgICAgaWYgKHIwMV9iaXRzW3IwICsgcjFdID4gYml0cykgeworICAgICAgICAgICAgICAgIHIwMV9iaXRzW3IwICsgcjFdID0gYml0czsKKyAgICAgICAgICAgICAgICByMDFfZGl2W3IwICsgcjFdID0gcjA7CisgICAgICAgICAgICAgICAgcjBfdGJsW3IwICsgcjFdID0gcjB0OworICAgICAgICAgICAgICAgIHIxX3RibFtyMCArIHIxXSA9IHIxdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaW5saW5lIHN0YXRpYyB2b2lkCityZWNhbGNfZGl2aWRlX3N1Yihjb25zdCBsYW1lX2ludGVybmFsX2ZsYWdzICogY29uc3QgZ2ZjLAorICAgICAgICAgICAgICAgICAgY29uc3QgZ3JfaW5mbyAqIGNvZF9pbmZvMiwKKyAgICAgICAgICAgICAgICAgIGdyX2luZm8gKiBjb25zdCBnaSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqY29uc3QgaXgsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcjAxX2JpdHNbXSwgY29uc3QgaW50IHIwMV9kaXZbXSwgY29uc3QgaW50IHIwX3RibFtdLCBjb25zdCBpbnQgcjFfdGJsW10pCit7CisgICAgaW50ICAgICBiaXRzLCByMiwgYTIsIGJpZ3YsIHIydDsKKworICAgIGJpZ3YgPSBjb2RfaW5mbzItPmJpZ192YWx1ZXM7CisKKyAgICBmb3IgKHIyID0gMjsgcjIgPCBTQk1BWF9sICsgMTsgcjIrKykgeworICAgICAgICBhMiA9IGdmYy0+c2NhbGVmYWNfYmFuZC5sW3IyXTsKKyAgICAgICAgaWYgKGEyID49IGJpZ3YpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBiaXRzID0gcjAxX2JpdHNbcjIgLSAyXSArIGNvZF9pbmZvMi0+Y291bnQxYml0czsKKyAgICAgICAgaWYgKGdpLT5wYXJ0Ml8zX2xlbmd0aCA8PSBiaXRzKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcjJ0ID0gZ2ZjLT5jaG9vc2VfdGFibGUoaXggKyBhMiwgaXggKyBiaWd2LCAmYml0cyk7CisgICAgICAgIGlmIChnaS0+cGFydDJfM19sZW5ndGggPD0gYml0cykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG1lbWNweShnaSwgY29kX2luZm8yLCBzaXplb2YoZ3JfaW5mbykpOworICAgICAgICBnaS0+cGFydDJfM19sZW5ndGggPSBiaXRzOworICAgICAgICBnaS0+cmVnaW9uMF9jb3VudCA9IHIwMV9kaXZbcjIgLSAyXTsKKyAgICAgICAgZ2ktPnJlZ2lvbjFfY291bnQgPSByMiAtIDIgLSByMDFfZGl2W3IyIC0gMl07CisgICAgICAgIGdpLT50YWJsZV9zZWxlY3RbMF0gPSByMF90YmxbcjIgLSAyXTsKKyAgICAgICAgZ2ktPnRhYmxlX3NlbGVjdFsxXSA9IHIxX3RibFtyMiAtIDJdOworICAgICAgICBnaS0+dGFibGVfc2VsZWN0WzJdID0gcjJ0OworICAgIH0KK30KKworCisKKwordm9pZAorYmVzdF9odWZmbWFuX2RpdmlkZShjb25zdCBsYW1lX2ludGVybmFsX2ZsYWdzICogY29uc3QgZ2ZjLCBncl9pbmZvICogY29uc3QgZ2kpCit7CisgICAgaW50ICAgICBpLCBhMSwgYTI7CisgICAgZ3JfaW5mbyBjb2RfaW5mbzI7CisgICAgaW50IGNvbnN0ICpjb25zdCBpeCA9IGdpLT5sM19lbmM7CisKKyAgICBpbnQgICAgIHIwMV9iaXRzWzcgKyAxNSArIDFdOworICAgIGludCAgICAgcjAxX2Rpdls3ICsgMTUgKyAxXTsKKyAgICBpbnQgICAgIHIwX3RibFs3ICsgMTUgKyAxXTsKKyAgICBpbnQgICAgIHIxX3RibFs3ICsgMTUgKyAxXTsKKworCisgICAgLyogU0hPUlQgQkxPQ0sgc3R1ZmYgZmFpbHMgZm9yIE1QRUcyICovCisgICAgaWYgKGdpLT5ibG9ja190eXBlID09IFNIT1JUX1RZUEUgJiYgZ2ZjLT5tb2RlX2dyID09IDEpCisgICAgICAgIHJldHVybjsKKworCisgICAgbWVtY3B5KCZjb2RfaW5mbzIsIGdpLCBzaXplb2YoZ3JfaW5mbykpOworICAgIGlmIChnaS0+YmxvY2tfdHlwZSA9PSBOT1JNX1RZUEUpIHsKKyAgICAgICAgcmVjYWxjX2RpdmlkZV9pbml0KGdmYywgZ2ksIGl4LCByMDFfYml0cywgcjAxX2RpdiwgcjBfdGJsLCByMV90YmwpOworICAgICAgICByZWNhbGNfZGl2aWRlX3N1YihnZmMsICZjb2RfaW5mbzIsIGdpLCBpeCwgcjAxX2JpdHMsIHIwMV9kaXYsIHIwX3RibCwgcjFfdGJsKTsKKyAgICB9CisKKyAgICBpID0gY29kX2luZm8yLmJpZ192YWx1ZXM7CisgICAgaWYgKGkgPT0gMCB8fCAodW5zaWduZWQgaW50KSAoaXhbaSAtIDJdIHwgaXhbaSAtIDFdKSA+IDEpCisgICAgICAgIHJldHVybjsKKworICAgIGkgPSBnaS0+Y291bnQxICsgMjsKKyAgICBpZiAoaSA+IDU3NikKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBxdWFkcnVwbGVzLiAqLworICAgIG1lbWNweSgmY29kX2luZm8yLCBnaSwgc2l6ZW9mKGdyX2luZm8pKTsKKyAgICBjb2RfaW5mbzIuY291bnQxID0gaTsKKyAgICBhMSA9IGEyID0gMDsKKworICAgIGFzc2VydChpIDw9IDU3Nik7CisKKyAgICBmb3IgKDsgaSA+IGNvZF9pbmZvMi5iaWdfdmFsdWVzOyBpIC09IDQpIHsKKyAgICAgICAgaW50IGNvbnN0IHAgPSAoKGl4W2kgLSA0XSAqIDIgKyBpeFtpIC0gM10pICogMiArIGl4W2kgLSAyXSkgKiAyICsgaXhbaSAtIDFdOworICAgICAgICBhMSArPSB0MzJsW3BdOworICAgICAgICBhMiArPSB0MzNsW3BdOworICAgIH0KKyAgICBjb2RfaW5mbzIuYmlnX3ZhbHVlcyA9IGk7CisKKyAgICBjb2RfaW5mbzIuY291bnQxdGFibGVfc2VsZWN0ID0gMDsKKyAgICBpZiAoYTEgPiBhMikgeworICAgICAgICBhMSA9IGEyOworICAgICAgICBjb2RfaW5mbzIuY291bnQxdGFibGVfc2VsZWN0ID0gMTsKKyAgICB9CisKKyAgICBjb2RfaW5mbzIuY291bnQxYml0cyA9IGExOworCisgICAgaWYgKGNvZF9pbmZvMi5ibG9ja190eXBlID09IE5PUk1fVFlQRSkKKyAgICAgICAgcmVjYWxjX2RpdmlkZV9zdWIoZ2ZjLCAmY29kX2luZm8yLCBnaSwgaXgsIHIwMV9iaXRzLCByMDFfZGl2LCByMF90YmwsIHIxX3RibCk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gY29kZSB0aGUgYmlndmFsdWVzIHJlZ2lvbi4gKi8KKyAgICAgICAgY29kX2luZm8yLnBhcnQyXzNfbGVuZ3RoID0gYTE7CisgICAgICAgIGExID0gZ2ZjLT5zY2FsZWZhY19iYW5kLmxbNyArIDFdOworICAgICAgICBpZiAoYTEgPiBpKSB7CisgICAgICAgICAgICBhMSA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGExID4gMCkKKyAgICAgICAgICAgIGNvZF9pbmZvMi50YWJsZV9zZWxlY3RbMF0gPQorICAgICAgICAgICAgICAgIGdmYy0+Y2hvb3NlX3RhYmxlKGl4LCBpeCArIGExLCAoaW50ICopICZjb2RfaW5mbzIucGFydDJfM19sZW5ndGgpOworICAgICAgICBpZiAoaSA+IGExKQorICAgICAgICAgICAgY29kX2luZm8yLnRhYmxlX3NlbGVjdFsxXSA9CisgICAgICAgICAgICAgICAgZ2ZjLT5jaG9vc2VfdGFibGUoaXggKyBhMSwgaXggKyBpLCAoaW50ICopICZjb2RfaW5mbzIucGFydDJfM19sZW5ndGgpOworICAgICAgICBpZiAoZ2ktPnBhcnQyXzNfbGVuZ3RoID4gY29kX2luZm8yLnBhcnQyXzNfbGVuZ3RoKQorICAgICAgICAgICAgbWVtY3B5KGdpLCAmY29kX2luZm8yLCBzaXplb2YoZ3JfaW5mbykpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGludCBzbGVuMV9uWzE2XSA9IHsgMSwgMSwgMSwgMSwgOCwgMiwgMiwgMiwgNCwgNCwgNCwgOCwgOCwgOCwgMTYsIDE2IH07CitzdGF0aWMgY29uc3QgaW50IHNsZW4yX25bMTZdID0geyAxLCAyLCA0LCA4LCAxLCAyLCA0LCA4LCAyLCA0LCA4LCAyLCA0LCA4LCA0LCA4IH07Citjb25zdCBpbnQgc2xlbjFfdGFiWzE2XSA9IHsgMCwgMCwgMCwgMCwgMywgMSwgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgNCwgNCB9OworY29uc3QgaW50IHNsZW4yX3RhYlsxNl0gPSB7IDAsIDEsIDIsIDMsIDAsIDEsIDIsIDMsIDEsIDIsIDMsIDEsIDIsIDMsIDIsIDMgfTsKKworc3RhdGljIHZvaWQKK3NjZnNpX2NhbGMoaW50IGNoLCBJSUlfc2lkZV9pbmZvX3QgKiBsM19zaWRlKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIGludCAgICAgczEsIHMyLCBjMSwgYzI7CisgICAgaW50ICAgICBzZmI7CisgICAgZ3JfaW5mbyAqY29uc3QgZ2kgPSAmbDNfc2lkZS0+dHRbMV1bY2hdOworICAgIGdyX2luZm8gY29uc3QgKmNvbnN0IGcwID0gJmwzX3NpZGUtPnR0WzBdW2NoXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHNjZnNpX2JhbmQpIC8gc2l6ZW9mKGludCkpIC0gMTsgaSsrKSB7CisgICAgICAgIGZvciAoc2ZiID0gc2Nmc2lfYmFuZFtpXTsgc2ZiIDwgc2Nmc2lfYmFuZFtpICsgMV07IHNmYisrKSB7CisgICAgICAgICAgICBpZiAoZzAtPnNjYWxlZmFjW3NmYl0gIT0gZ2ktPnNjYWxlZmFjW3NmYl0KKyAgICAgICAgICAgICAgICAmJiBnaS0+c2NhbGVmYWNbc2ZiXSA+PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzZmIgPT0gc2Nmc2lfYmFuZFtpICsgMV0pIHsKKyAgICAgICAgICAgIGZvciAoc2ZiID0gc2Nmc2lfYmFuZFtpXTsgc2ZiIDwgc2Nmc2lfYmFuZFtpICsgMV07IHNmYisrKSB7CisgICAgICAgICAgICAgICAgZ2ktPnNjYWxlZmFjW3NmYl0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGwzX3NpZGUtPnNjZnNpW2NoXVtpXSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzMSA9IGMxID0gMDsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IDExOyBzZmIrKykgeworICAgICAgICBpZiAoZ2ktPnNjYWxlZmFjW3NmYl0gPT0gLTEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYzErKzsKKyAgICAgICAgaWYgKHMxIDwgZ2ktPnNjYWxlZmFjW3NmYl0pCisgICAgICAgICAgICBzMSA9IGdpLT5zY2FsZWZhY1tzZmJdOworICAgIH0KKworICAgIHMyID0gYzIgPSAwOworICAgIGZvciAoOyBzZmIgPCBTQlBTWV9sOyBzZmIrKykgeworICAgICAgICBpZiAoZ2ktPnNjYWxlZmFjW3NmYl0gPT0gLTEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYzIrKzsKKyAgICAgICAgaWYgKHMyIDwgZ2ktPnNjYWxlZmFjW3NmYl0pCisgICAgICAgICAgICBzMiA9IGdpLT5zY2FsZWZhY1tzZmJdOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGlmIChzMSA8IHNsZW4xX25baV0gJiYgczIgPCBzbGVuMl9uW2ldKSB7CisgICAgICAgICAgICBpbnQgY29uc3QgYyA9IHNsZW4xX3RhYltpXSAqIGMxICsgc2xlbjJfdGFiW2ldICogYzI7CisgICAgICAgICAgICBpZiAoZ2ktPnBhcnQyX2xlbmd0aCA+IGMpIHsKKyAgICAgICAgICAgICAgICBnaS0+cGFydDJfbGVuZ3RoID0gYzsKKyAgICAgICAgICAgICAgICBnaS0+c2NhbGVmYWNfY29tcHJlc3MgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorRmluZCB0aGUgb3B0aW1hbCB3YXkgdG8gc3RvcmUgdGhlIHNjYWxlZmFjdG9ycy4KK09ubHkgY2FsbCB0aGlzIHJvdXRpbmUgYWZ0ZXIgZmluYWwgc2NhbGVmYWN0b3JzIGhhdmUgYmVlbgorY2hvc2VuIGFuZCB0aGUgY2hhbm5lbC9ncmFudWxlIHdpbGwgbm90IGJlIHJlLWVuY29kZWQuCisgKi8KK3ZvaWQKK2Jlc3Rfc2NhbGVmYWNfc3RvcmUoY29uc3QgbGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyLCBjb25zdCBpbnQgY2gsIElJSV9zaWRlX2luZm9fdCAqIGNvbnN0IGwzX3NpZGUpCit7CisgICAgLyogdXNlIHNjYWxlZmFjX3NjYWxlIGlmIHdlIGNhbiAqLworICAgIGdyX2luZm8gKmNvbnN0IGdpID0gJmwzX3NpZGUtPnR0W2dyXVtjaF07CisgICAgaW50ICAgICBzZmIsIGksIGosIGw7CisgICAgaW50ICAgICByZWNhbGMgPSAwOworCisgICAgLyogcmVtb3ZlIHNjYWxlZmFjcyBmcm9tIGJhbmRzIHdpdGggaXg9MC4gIFRoaXMgaWRlYSBjb21lcworICAgICAqIGZyb20gdGhlIEFBQyBJU08gZG9jcy4gIGFkZGVkIG10IDMvMDAgKi8KKyAgICAvKiBjaGVjayBpZiBsM19lbmM9MCAqLworICAgIGogPSAwOworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgZ2ktPnNmYm1heDsgc2ZiKyspIHsKKyAgICAgICAgaW50IGNvbnN0IHdpZHRoID0gZ2ktPndpZHRoW3NmYl07CisgICAgICAgIGFzc2VydCh3aWR0aCA+PSAwKTsKKyAgICAgICAgaiArPSB3aWR0aDsKKyAgICAgICAgZm9yIChsID0gLXdpZHRoOyBsIDwgMDsgbCsrKSB7CisgICAgICAgICAgICBpZiAoZ2ktPmwzX2VuY1tsICsgal0gIT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobCA9PSAwKQorICAgICAgICAgICAgZ2ktPnNjYWxlZmFjW3NmYl0gPSByZWNhbGMgPSAtMjsgLyogYW55dGhpbmcgZ29lcy4gKi8KKyAgICAgICAgLyogIG9ubHkgYmVzdF9zY2FsZWZhY19zdG9yZSBhbmQgY2FsY19zY2ZzaSAKKyAgICAgICAgICogIGtub3ctLWFuZCBvbmx5IHRoZXkgc2hvdWxkIGtub3ctLWFib3V0IHRoZSBtYWdpYyBudW1iZXIgLTIuIAorICAgICAgICAgKi8KKyAgICB9CisKKyAgICBpZiAoIWdpLT5zY2FsZWZhY19zY2FsZSAmJiAhZ2ktPnByZWZsYWcpIHsKKyAgICAgICAgaW50ICAgICBzID0gMDsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBnaS0+c2ZibWF4OyBzZmIrKykKKyAgICAgICAgICAgIGlmIChnaS0+c2NhbGVmYWNbc2ZiXSA+IDApCisgICAgICAgICAgICAgICAgcyB8PSBnaS0+c2NhbGVmYWNbc2ZiXTsKKworICAgICAgICBpZiAoIShzICYgMSkgJiYgcyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IGdpLT5zZmJtYXg7IHNmYisrKQorICAgICAgICAgICAgICAgIGlmIChnaS0+c2NhbGVmYWNbc2ZiXSA+IDApCisgICAgICAgICAgICAgICAgICAgIGdpLT5zY2FsZWZhY1tzZmJdID4+PSAxOworCisgICAgICAgICAgICBnaS0+c2NhbGVmYWNfc2NhbGUgPSByZWNhbGMgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFnaS0+cHJlZmxhZyAmJiBnaS0+YmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFICYmIGdmYy0+bW9kZV9nciA9PSAyKSB7CisgICAgICAgIGZvciAoc2ZiID0gMTE7IHNmYiA8IFNCUFNZX2w7IHNmYisrKQorICAgICAgICAgICAgaWYgKGdpLT5zY2FsZWZhY1tzZmJdIDwgcHJldGFiW3NmYl0gJiYgZ2ktPnNjYWxlZmFjW3NmYl0gIT0gLTIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzZmIgPT0gU0JQU1lfbCkgeworICAgICAgICAgICAgZm9yIChzZmIgPSAxMTsgc2ZiIDwgU0JQU1lfbDsgc2ZiKyspCisgICAgICAgICAgICAgICAgaWYgKGdpLT5zY2FsZWZhY1tzZmJdID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZ2ktPnNjYWxlZmFjW3NmYl0gLT0gcHJldGFiW3NmYl07CisKKyAgICAgICAgICAgIGdpLT5wcmVmbGFnID0gcmVjYWxjID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGwzX3NpZGUtPnNjZnNpW2NoXVtpXSA9IDA7CisKKyAgICBpZiAoZ2ZjLT5tb2RlX2dyID09IDIgJiYgZ3IgPT0gMQorICAgICAgICAmJiBsM19zaWRlLT50dFswXVtjaF0uYmxvY2tfdHlwZSAhPSBTSE9SVF9UWVBFCisgICAgICAgICYmIGwzX3NpZGUtPnR0WzFdW2NoXS5ibG9ja190eXBlICE9IFNIT1JUX1RZUEUpIHsKKyAgICAgICAgc2Nmc2lfY2FsYyhjaCwgbDNfc2lkZSk7CisgICAgICAgIHJlY2FsYyA9IDA7CisgICAgfQorICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgZ2ktPnNmYm1heDsgc2ZiKyspIHsKKyAgICAgICAgaWYgKGdpLT5zY2FsZWZhY1tzZmJdID09IC0yKSB7CisgICAgICAgICAgICBnaS0+c2NhbGVmYWNbc2ZiXSA9IDA7IC8qIGlmIGFueXRoaW5nIGdvZXMsIHRoZW4gMCBpcyBhIGdvb2QgY2hvaWNlICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlY2FsYykgeworICAgICAgICBpZiAoZ2ZjLT5tb2RlX2dyID09IDIpIHsKKyAgICAgICAgICAgICh2b2lkKSBzY2FsZV9iaXRjb3VudChnaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAodm9pZCkgc2NhbGVfYml0Y291bnRfbHNmKGdmYywgZ2kpOworICAgICAgICB9CisgICAgfQorfQorCisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgaW50CithbGxfc2NhbGVmYWN0b3JzX25vdF9uZWdhdGl2ZShpbnQgY29uc3QgKnNjYWxlZmFjLCBpbnQgbikKK3sKKyAgICBpbnQgICAgIGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpZiAoc2NhbGVmYWNbaV0gPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorI2VuZGlmCisKKworLyogbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBlbmNvZGUgc2NhbGVmYWNzICovCisKKy8qIDE4KnNsZW4xX3RhYltpXSArIDE4KnNsZW4yX3RhYltpXSAqLworc3RhdGljIGNvbnN0IGludCBzY2FsZV9zaG9ydFsxNl0gPSB7CisgICAgMCwgMTgsIDM2LCA1NCwgNTQsIDM2LCA1NCwgNzIsIDU0LCA3MiwgOTAsIDcyLCA5MCwgMTA4LCAxMDgsIDEyNgorfTsKKworLyogMTcqc2xlbjFfdGFiW2ldICsgMTgqc2xlbjJfdGFiW2ldICovCitzdGF0aWMgY29uc3QgaW50IHNjYWxlX21peGVkWzE2XSA9IHsKKyAgICAwLCAxOCwgMzYsIDU0LCA1MSwgMzUsIDUzLCA3MSwgNTIsIDcwLCA4OCwgNjksIDg3LCAxMDUsIDEwNCwgMTIyCit9OworCisvKiAxMSpzbGVuMV90YWJbaV0gKyAxMCpzbGVuMl90YWJbaV0gKi8KK3N0YXRpYyBjb25zdCBpbnQgc2NhbGVfbG9uZ1sxNl0gPSB7CisgICAgMCwgMTAsIDIwLCAzMCwgMzMsIDIxLCAzMSwgNDEsIDMyLCA0MiwgNTIsIDQzLCA1MywgNjMsIDY0LCA3NAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgc2NhbGVfYml0Y291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFsc28gY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIGNvZGUgdGhlIHNjYWxlZmFjdG9ycy4gKi8KKworaW50CitzY2FsZV9iaXRjb3VudChncl9pbmZvICogY29uc3QgY29kX2luZm8pCit7CisgICAgaW50ICAgICBrLCBzZmIsIG1heF9zbGVuMSA9IDAsIG1heF9zbGVuMiA9IDA7CisKKyAgICAvKiBtYXhpbXVtIHZhbHVlcyAqLworICAgIGNvbnN0IGludCAqdGFiOworICAgIGludCAgICAqY29uc3Qgc2NhbGVmYWMgPSBjb2RfaW5mby0+c2NhbGVmYWM7CisKKyAgICBhc3NlcnQoYWxsX3NjYWxlZmFjdG9yc19ub3RfbmVnYXRpdmUoc2NhbGVmYWMsIGNvZF9pbmZvLT5zZmJtYXgpKTsKKworICAgIGlmIChjb2RfaW5mby0+YmxvY2tfdHlwZSA9PSBTSE9SVF9UWVBFKSB7CisgICAgICAgIHRhYiA9IHNjYWxlX3Nob3J0OworICAgICAgICBpZiAoY29kX2luZm8tPm1peGVkX2Jsb2NrX2ZsYWcpCisgICAgICAgICAgICB0YWIgPSBzY2FsZV9taXhlZDsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAvKiBibG9ja190eXBlID09IDEsMixvciAzICovCisgICAgICAgIHRhYiA9IHNjYWxlX2xvbmc7CisgICAgICAgIGlmICghY29kX2luZm8tPnByZWZsYWcpIHsKKyAgICAgICAgICAgIGZvciAoc2ZiID0gMTE7IHNmYiA8IFNCUFNZX2w7IHNmYisrKQorICAgICAgICAgICAgICAgIGlmIChzY2FsZWZhY1tzZmJdIDwgcHJldGFiW3NmYl0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoc2ZiID09IFNCUFNZX2wpIHsKKyAgICAgICAgICAgICAgICBjb2RfaW5mby0+cHJlZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgZm9yIChzZmIgPSAxMTsgc2ZiIDwgU0JQU1lfbDsgc2ZiKyspCisgICAgICAgICAgICAgICAgICAgIHNjYWxlZmFjW3NmYl0gLT0gcHJldGFiW3NmYl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IGNvZF9pbmZvLT5zZmJkaXZpZGU7IHNmYisrKQorICAgICAgICBpZiAobWF4X3NsZW4xIDwgc2NhbGVmYWNbc2ZiXSkKKyAgICAgICAgICAgIG1heF9zbGVuMSA9IHNjYWxlZmFjW3NmYl07CisKKyAgICBmb3IgKDsgc2ZiIDwgY29kX2luZm8tPnNmYm1heDsgc2ZiKyspCisgICAgICAgIGlmIChtYXhfc2xlbjIgPCBzY2FsZWZhY1tzZmJdKQorICAgICAgICAgICAgbWF4X3NsZW4yID0gc2NhbGVmYWNbc2ZiXTsKKworICAgIC8qIGZyb20gVGFrZWhpcm8gVE9NSU5BR0EgPHRvbWluYWdhQGlzb3Rlcm5ldC5vcmc+IDEwLzk5CisgICAgICogbG9vcCBvdmVyICphbGwqIHBvc2libGUgdmFsdWVzIG9mIHNjYWxlZmFjX2NvbXByZXNzIHRvIGZpbmQgdGhlCisgICAgICogb25lIHdoaWNoIHVzZXMgdGhlIHNtYWxsZXN0IG51bWJlciBvZiBiaXRzLiAgSVNPIHdvdWxkIHN0b3AKKyAgICAgKiBhdCBmaXJzdCB2YWxpZCBpbmRleCAqLworICAgIGNvZF9pbmZvLT5wYXJ0Ml9sZW5ndGggPSBMQVJHRV9CSVRTOworICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKSB7CisgICAgICAgIGlmIChtYXhfc2xlbjEgPCBzbGVuMV9uW2tdICYmIG1heF9zbGVuMiA8IHNsZW4yX25ba10KKyAgICAgICAgICAgICYmIGNvZF9pbmZvLT5wYXJ0Ml9sZW5ndGggPiB0YWJba10pIHsKKyAgICAgICAgICAgIGNvZF9pbmZvLT5wYXJ0Ml9sZW5ndGggPSB0YWJba107CisgICAgICAgICAgICBjb2RfaW5mby0+c2NhbGVmYWNfY29tcHJlc3MgPSBrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb2RfaW5mby0+cGFydDJfbGVuZ3RoID09IExBUkdFX0JJVFM7Cit9CisKKworCisvKgorICB0YWJsZSBvZiBsYXJnZXN0IHNjYWxlZmFjdG9yIHZhbHVlcyBmb3IgTVBFRzIKKyovCitzdGF0aWMgY29uc3QgaW50IG1heF9yYW5nZV9zZmFjX3RhYls2XVs0XSA9IHsKKyAgICB7MTUsIDE1LCA3LCA3fSwKKyAgICB7MTUsIDE1LCA3LCAwfSwKKyAgICB7NywgMywgMCwgMH0sCisgICAgezE1LCAzMSwgMzEsIDB9LAorICAgIHs3LCA3LCA3LCAwfSwKKyAgICB7MywgMywgMCwgMH0KK307CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICBzY2FsZV9iaXRjb3VudF9sc2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWxzbyBjb3VudHMgdGhlIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgc2NhbGVmYWNzIGJ1dCBmb3IgTVBFRyAyICovCisvKiBMb3dlciBzYW1wbGluZyBmcmVxdWVuY2llcyAgKDI0LCAyMi4wNSBhbmQgMTYga0h6LikgICAgICAgICAgICAgICAgICAgKi8KKworLyogIFRoaXMgaXMgcmV2ZXJzZS1lbmdpbmVlcmVkIGZyb20gc2VjdGlvbiAyLjQuMy4yIG9mIHRoZSBNUEVHMiBJUywgICAgICovCisvKiAiQXVkaW8gRGVjb2RpbmcgTGF5ZXIgSUlJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50CitzY2FsZV9iaXRjb3VudF9sc2YoY29uc3QgbGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvKQoreworICAgIGludCAgICAgdGFibGVfbnVtYmVyLCByb3dfaW5fdGFibGUsIHBhcnRpdGlvbiwgbnJfc2ZiLCB3aW5kb3csIG92ZXI7CisgICAgaW50ICAgICBpLCBzZmIsIG1heF9zZmFjWzRdOworICAgIGNvbnN0IGludCAqcGFydGl0aW9uX3RhYmxlOworICAgIGludCBjb25zdCAqY29uc3Qgc2NhbGVmYWMgPSBjb2RfaW5mby0+c2NhbGVmYWM7CisKKyAgICAvKgorICAgICAgIFNldCBwYXJ0aXRpb24gdGFibGUuIE5vdGUgdGhhdCBzaG91bGQgdHJ5IHRvIHVzZSB0YWJsZSBvbmUsCisgICAgICAgYnV0IGRvIG5vdCB5ZXQuLi4KKyAgICAgKi8KKyAgICBpZiAoY29kX2luZm8tPnByZWZsYWcpCisgICAgICAgIHRhYmxlX251bWJlciA9IDI7CisgICAgZWxzZQorICAgICAgICB0YWJsZV9udW1iZXIgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgbWF4X3NmYWNbaV0gPSAwOworCisgICAgaWYgKGNvZF9pbmZvLT5ibG9ja190eXBlID09IFNIT1JUX1RZUEUpIHsKKyAgICAgICAgcm93X2luX3RhYmxlID0gMTsKKyAgICAgICAgcGFydGl0aW9uX3RhYmxlID0gJm5yX29mX3NmYl9ibG9ja1t0YWJsZV9udW1iZXJdW3Jvd19pbl90YWJsZV1bMF07CisgICAgICAgIGZvciAoc2ZiID0gMCwgcGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgNDsgcGFydGl0aW9uKyspIHsKKyAgICAgICAgICAgIG5yX3NmYiA9IHBhcnRpdGlvbl90YWJsZVtwYXJ0aXRpb25dIC8gMzsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9zZmI7IGkrKywgc2ZiKyspCisgICAgICAgICAgICAgICAgZm9yICh3aW5kb3cgPSAwOyB3aW5kb3cgPCAzOyB3aW5kb3crKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlZmFjW3NmYiAqIDMgKyB3aW5kb3ddID4gbWF4X3NmYWNbcGFydGl0aW9uXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zZmFjW3BhcnRpdGlvbl0gPSBzY2FsZWZhY1tzZmIgKiAzICsgd2luZG93XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcm93X2luX3RhYmxlID0gMDsKKyAgICAgICAgcGFydGl0aW9uX3RhYmxlID0gJm5yX29mX3NmYl9ibG9ja1t0YWJsZV9udW1iZXJdW3Jvd19pbl90YWJsZV1bMF07CisgICAgICAgIGZvciAoc2ZiID0gMCwgcGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgNDsgcGFydGl0aW9uKyspIHsKKyAgICAgICAgICAgIG5yX3NmYiA9IHBhcnRpdGlvbl90YWJsZVtwYXJ0aXRpb25dOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5yX3NmYjsgaSsrLCBzZmIrKykKKyAgICAgICAgICAgICAgICBpZiAoc2NhbGVmYWNbc2ZiXSA+IG1heF9zZmFjW3BhcnRpdGlvbl0pCisgICAgICAgICAgICAgICAgICAgIG1heF9zZmFjW3BhcnRpdGlvbl0gPSBzY2FsZWZhY1tzZmJdOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChvdmVyID0gMCwgcGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgNDsgcGFydGl0aW9uKyspIHsKKyAgICAgICAgaWYgKG1heF9zZmFjW3BhcnRpdGlvbl0gPiBtYXhfcmFuZ2Vfc2ZhY190YWJbdGFibGVfbnVtYmVyXVtwYXJ0aXRpb25dKQorICAgICAgICAgICAgb3ZlcisrOworICAgIH0KKyAgICBpZiAoIW92ZXIpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgU2luY2Ugbm8gYmFuZHMgaGF2ZSBiZWVuIG92ZXItYW1wbGlmaWVkLCB3ZSBjYW4gc2V0IHNjYWxlZmFjX2NvbXByZXNzCisgICAgICAgICAgIGFuZCBzbGVuW10gZm9yIHRoZSBmb3JtYXR0ZXIKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbG9nMnRhYltdID0geyAwLCAxLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0IH07CisKKyAgICAgICAgaW50ICAgICBzbGVuMSwgc2xlbjIsIHNsZW4zLCBzbGVuNDsKKworICAgICAgICBjb2RfaW5mby0+c2ZiX3BhcnRpdGlvbl90YWJsZSA9IG5yX29mX3NmYl9ibG9ja1t0YWJsZV9udW1iZXJdW3Jvd19pbl90YWJsZV07CisgICAgICAgIGZvciAocGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgNDsgcGFydGl0aW9uKyspCisgICAgICAgICAgICBjb2RfaW5mby0+c2xlbltwYXJ0aXRpb25dID0gbG9nMnRhYlttYXhfc2ZhY1twYXJ0aXRpb25dXTsKKworICAgICAgICAvKiBzZXQgc2NhbGVmYWNfY29tcHJlc3MgKi8KKyAgICAgICAgc2xlbjEgPSBjb2RfaW5mby0+c2xlblswXTsKKyAgICAgICAgc2xlbjIgPSBjb2RfaW5mby0+c2xlblsxXTsKKyAgICAgICAgc2xlbjMgPSBjb2RfaW5mby0+c2xlblsyXTsKKyAgICAgICAgc2xlbjQgPSBjb2RfaW5mby0+c2xlblszXTsKKworICAgICAgICBzd2l0Y2ggKHRhYmxlX251bWJlcikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjb2RfaW5mby0+c2NhbGVmYWNfY29tcHJlc3MgPSAoKChzbGVuMSAqIDUpICsgc2xlbjIpIDw8IDQpCisgICAgICAgICAgICAgICAgKyAoc2xlbjMgPDwgMikKKyAgICAgICAgICAgICAgICArIHNsZW40OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY29kX2luZm8tPnNjYWxlZmFjX2NvbXByZXNzID0gNDAwICsgKCgoc2xlbjEgKiA1KSArIHNsZW4yKSA8PCAyKQorICAgICAgICAgICAgICAgICsgc2xlbjM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjb2RfaW5mby0+c2NhbGVmYWNfY29tcHJlc3MgPSA1MDAgKyAoc2xlbjEgKiAzKSArIHNsZW4yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVSUk9SRihnZmMsICJpbnRlbnNpdHkgc3RlcmVvIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAob3ZlcikKKyAgICAgICAgRVJST1JGKGdmYywgIi0tLVdBUk5JTkcgISEgQW1wbGlmaWNhdGlvbiBvZiBzb21lIGJhbmRzIG92ZXIgbGltaXRzXG4iKTsKKyNlbmRpZgorICAgIGlmICghb3ZlcikgeworICAgICAgICBhc3NlcnQoY29kX2luZm8tPnNmYl9wYXJ0aXRpb25fdGFibGUpOworICAgICAgICBjb2RfaW5mby0+cGFydDJfbGVuZ3RoID0gMDsKKyAgICAgICAgZm9yIChwYXJ0aXRpb24gPSAwOyBwYXJ0aXRpb24gPCA0OyBwYXJ0aXRpb24rKykKKyAgICAgICAgICAgIGNvZF9pbmZvLT5wYXJ0Ml9sZW5ndGggKz0KKyAgICAgICAgICAgICAgICBjb2RfaW5mby0+c2xlbltwYXJ0aXRpb25dICogY29kX2luZm8tPnNmYl9wYXJ0aXRpb25fdGFibGVbcGFydGl0aW9uXTsKKyAgICB9CisgICAgcmV0dXJuIG92ZXI7Cit9CisKKworI2lmZGVmIE1NWF9jaG9vc2VfdGFibGUKK2V4dGVybiBpbnQgY2hvb3NlX3RhYmxlX01NWChjb25zdCBpbnQgKml4LCBjb25zdCBpbnQgKmNvbnN0IGVuZCwgaW50ICpjb25zdCBzKTsKKyNlbmRpZgorCit2b2lkCitodWZmbWFuX2luaXQobGFtZV9pbnRlcm5hbF9mbGFncyAqIGNvbnN0IGdmYykKK3sKKyAgICBpbnQgICAgIGk7CisKKyAgICBnZmMtPmNob29zZV90YWJsZSA9IGNob29zZV90YWJsZV9ub25NTVg7CisKKyNpZmRlZiBNTVhfY2hvb3NlX3RhYmxlCisgICAgaWYgKGdmYy0+Q1BVX2ZlYXR1cmVzLk1NWCkgeworICAgICAgICBnZmMtPmNob29zZV90YWJsZSA9IGNob29zZV90YWJsZV9NTVg7CisgICAgfQorI2VuZGlmCisKKyAgICBmb3IgKGkgPSAyOyBpIDw9IDU3NjsgaSArPSAyKSB7CisgICAgICAgIGludCAgICAgc2NmYl9hbnogPSAwLCBidl9pbmRleDsKKyAgICAgICAgd2hpbGUgKGdmYy0+c2NhbGVmYWNfYmFuZC5sWysrc2NmYl9hbnpdIDwgaSk7CisKKyAgICAgICAgYnZfaW5kZXggPSBzdWJkdl90YWJsZVtzY2ZiX2Fuel0ucmVnaW9uMF9jb3VudDsKKyAgICAgICAgd2hpbGUgKGdmYy0+c2NhbGVmYWNfYmFuZC5sW2J2X2luZGV4ICsgMV0gPiBpKQorICAgICAgICAgICAgYnZfaW5kZXgtLTsKKworICAgICAgICBpZiAoYnZfaW5kZXggPCAwKSB7CisgICAgICAgICAgICAvKiB0aGlzIGlzIGFuIGluZGljYXRpb24gdGhhdCBldmVyeXRoaW5nIGlzIGdvaW5nIHRvCisgICAgICAgICAgICAgICBiZSBlbmNvZGVkIGFzIHJlZ2lvbjA6ICBiaWd2YWx1ZXMgPCByZWdpb24wIDwgcmVnaW9uMQorICAgICAgICAgICAgICAgc28gbGV0cyBzZXQgcmVnaW9uMCwgcmVnaW9uMSB0byBzb21lIHZhbHVlIGxhcmdlcgorICAgICAgICAgICAgICAgdGhhbiBiaWd2YWx1ZXMgKi8KKyAgICAgICAgICAgIGJ2X2luZGV4ID0gc3ViZHZfdGFibGVbc2NmYl9hbnpdLnJlZ2lvbjBfY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBnZmMtPmJ2X3NjZltpIC0gMl0gPSBidl9pbmRleDsKKworICAgICAgICBidl9pbmRleCA9IHN1YmR2X3RhYmxlW3NjZmJfYW56XS5yZWdpb24xX2NvdW50OworICAgICAgICB3aGlsZSAoZ2ZjLT5zY2FsZWZhY19iYW5kLmxbYnZfaW5kZXggKyBnZmMtPmJ2X3NjZltpIC0gMl0gKyAyXSA+IGkpCisgICAgICAgICAgICBidl9pbmRleC0tOworCisgICAgICAgIGlmIChidl9pbmRleCA8IDApIHsKKyAgICAgICAgICAgIGJ2X2luZGV4ID0gc3ViZHZfdGFibGVbc2NmYl9hbnpdLnJlZ2lvbjFfY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBnZmMtPmJ2X3NjZltpIC0gMV0gPSBidl9pbmRleDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3V0aWwuYyBiL2xpYm1wM2xhbWUvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTVkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3V0aWwuYwpAQCAtMCwwICsxLDk5MiBAQAorLyoKKyAqCWxhbWUgdXRpbGl0eSBsaWJyYXJ5IHNvdXJjZSBmaWxlCisgKgorICoJQ29weXJpZ2h0IChjKSAxOTk5IEFsYmVydCBMIEZhYmVyCisgKglDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBBbGV4YW5kZXIgTGVpZGluZ2VyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qICRJZDogdXRpbC5jLHYgMS4xNDAuMi40IDIwMTAvMDMvMjEgMTI6MTU6NTYgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImVuY29kZXIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAibGFtZV9nbG9iYWxfZmxhZ3MuaCIKKworI2RlZmluZSBQUkVDT01QVVRFCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgIWRlZmluZWQoX19hbHBoYV9fKQorIyBpbmNsdWRlIDxtYWNoaW5lL2Zsb2F0aW5ncG9pbnQuaD4KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgR2xvYmFsIEZ1bmN0aW9uIERlZmluaXRpb25zCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qZW1wdHkgYW5kIGNsb3NlIG1hbGxvY3MgaW4gZ2ZjICovCisKK3ZvaWQKK2ZyZWVfaWQzdGFnKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMpCit7CisgICAgaWYgKGdmYy0+dGFnX3NwZWMudGl0bGUgIT0gMCkgeworICAgICAgICBmcmVlKGdmYy0+dGFnX3NwZWMudGl0bGUpOworICAgICAgICBnZmMtPnRhZ19zcGVjLnRpdGxlID0gMDsKKyAgICB9CisgICAgaWYgKGdmYy0+dGFnX3NwZWMuYXJ0aXN0ICE9IDApIHsKKyAgICAgICAgZnJlZShnZmMtPnRhZ19zcGVjLmFydGlzdCk7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuYXJ0aXN0ID0gMDsKKyAgICB9CisgICAgaWYgKGdmYy0+dGFnX3NwZWMuYWxidW0gIT0gMCkgeworICAgICAgICBmcmVlKGdmYy0+dGFnX3NwZWMuYWxidW0pOworICAgICAgICBnZmMtPnRhZ19zcGVjLmFsYnVtID0gMDsKKyAgICB9CisgICAgaWYgKGdmYy0+dGFnX3NwZWMuY29tbWVudCAhPSAwKSB7CisgICAgICAgIGZyZWUoZ2ZjLT50YWdfc3BlYy5jb21tZW50KTsKKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5jb21tZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoZ2ZjLT50YWdfc3BlYy5hbGJ1bWFydCAhPSAwKSB7CisgICAgICAgIGZyZWUoZ2ZjLT50YWdfc3BlYy5hbGJ1bWFydCk7CisgICAgICAgIGdmYy0+dGFnX3NwZWMuYWxidW1hcnQgPSAwOworICAgICAgICBnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0X3NpemUgPSAwOworICAgICAgICBnZmMtPnRhZ19zcGVjLmFsYnVtYXJ0X21pbWV0eXBlID0gTUlNRVRZUEVfTk9ORTsKKyAgICB9CisgICAgaWYgKGdmYy0+dGFnX3NwZWMudmFsdWVzICE9IDApIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZmMtPnRhZ19zcGVjLm51bV92YWx1ZXM7ICsraSkgeworICAgICAgICAgICAgZnJlZShnZmMtPnRhZ19zcGVjLnZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShnZmMtPnRhZ19zcGVjLnZhbHVlcyk7CisgICAgICAgIGdmYy0+dGFnX3NwZWMudmFsdWVzID0gMDsKKyAgICAgICAgZ2ZjLT50YWdfc3BlYy5udW1fdmFsdWVzID0gMDsKKyAgICB9CisgICAgaWYgKGdmYy0+dGFnX3NwZWMudjJfaGVhZCAhPSAwKSB7CisgICAgICAgIEZyYW1lRGF0YU5vZGUgKm5vZGUgPSBnZmMtPnRhZ19zcGVjLnYyX2hlYWQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHZvaWQgICAqcCA9IG5vZGUtPmRzYy5wdHIuYjsKKyAgICAgICAgICAgIHZvaWQgICAqcSA9IG5vZGUtPnR4dC5wdHIuYjsKKyAgICAgICAgICAgIHZvaWQgICAqciA9IG5vZGU7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bnh0OworICAgICAgICAgICAgZnJlZShwKTsKKyAgICAgICAgICAgIGZyZWUocSk7CisgICAgICAgICAgICBmcmVlKHIpOworICAgICAgICB9IHdoaWxlIChub2RlICE9IDApOworICAgICAgICBnZmMtPnRhZ19zcGVjLnYyX2hlYWQgPSAwOworICAgICAgICBnZmMtPnRhZ19zcGVjLnYyX3RhaWwgPSAwOworICAgIH0KK30KKworCit2b2lkCitmcmVlZ2ZjKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMpCit7ICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgc3RyZWFtIHN0cnVjdHVyZSAqLworICAgIGludCAgICAgaTsKKworCisgICAgZm9yIChpID0gMDsgaSA8PSAyICogQlBDOyBpKyspCisgICAgICAgIGlmIChnZmMtPmJsYWNrZmlsdFtpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGdmYy0+YmxhY2tmaWx0W2ldKTsKKyAgICAgICAgICAgIGdmYy0+YmxhY2tmaWx0W2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIGlmIChnZmMtPmluYnVmX29sZFswXSkgeworICAgICAgICBmcmVlKGdmYy0+aW5idWZfb2xkWzBdKTsKKyAgICAgICAgZ2ZjLT5pbmJ1Zl9vbGRbMF0gPSBOVUxMOworICAgIH0KKyAgICBpZiAoZ2ZjLT5pbmJ1Zl9vbGRbMV0pIHsKKyAgICAgICAgZnJlZShnZmMtPmluYnVmX29sZFsxXSk7CisgICAgICAgIGdmYy0+aW5idWZfb2xkWzFdID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZ2ZjLT5icy5idWYgIT0gTlVMTCkgeworICAgICAgICBmcmVlKGdmYy0+YnMuYnVmKTsKKyAgICAgICAgZ2ZjLT5icy5idWYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChnZmMtPlZCUl9zZWVrX3RhYmxlLmJhZykgeworICAgICAgICBmcmVlKGdmYy0+VkJSX3NlZWtfdGFibGUuYmFnKTsKKyAgICAgICAgZ2ZjLT5WQlJfc2Vla190YWJsZS5iYWcgPSBOVUxMOworICAgICAgICBnZmMtPlZCUl9zZWVrX3RhYmxlLnNpemUgPSAwOworICAgIH0KKyAgICBpZiAoZ2ZjLT5BVEgpIHsKKyAgICAgICAgZnJlZShnZmMtPkFUSCk7CisgICAgfQorICAgIGlmIChnZmMtPlBTWSkgeworICAgICAgICBmcmVlKGdmYy0+UFNZKTsKKyAgICB9CisgICAgaWYgKGdmYy0+cmdkYXRhKSB7CisgICAgICAgIGZyZWUoZ2ZjLT5yZ2RhdGEpOworICAgIH0KKyAgICBpZiAoZ2ZjLT5zM19sbCkgeworICAgICAgICAvKiBYWFggYWxsb2NhdGVkIGluIHBzeW1vZGVsX2luaXQoKSAqLworICAgICAgICBmcmVlKGdmYy0+czNfbGwpOworICAgIH0KKyAgICBpZiAoZ2ZjLT5zM19zcykgeworICAgICAgICAvKiBYWFggYWxsb2NhdGVkIGluIHBzeW1vZGVsX2luaXQoKSAqLworICAgICAgICBmcmVlKGdmYy0+czNfc3MpOworICAgIH0KKyAgICBpZiAoZ2ZjLT5pbl9idWZmZXJfMCkgeworICAgICAgICBmcmVlKGdmYy0+aW5fYnVmZmVyXzApOworICAgIH0KKyAgICBpZiAoZ2ZjLT5pbl9idWZmZXJfMSkgeworICAgICAgICBmcmVlKGdmYy0+aW5fYnVmZmVyXzEpOworICAgIH0KKyAgICBmcmVlX2lkM3RhZyhnZmMpOworI2lmZGVmIERFQ09ERV9PTl9USEVfRkxZCisgICAgaWYgKGdmYy0+aGlwKSB7CisgICAgICAgIGhpcF9kZWNvZGVfZXhpdChnZmMtPmhpcCk7CisgICAgICAgIGdmYy0+aGlwID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBmcmVlKGdmYyk7Cit9CisKK3ZvaWQKK21hbGxvY19hbGlnbmVkKGFsaWduZWRfcG9pbnRlcl90ICogcHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworICAgIGlmIChwdHIpIHsKKyAgICAgICAgaWYgKCFwdHItPnBvaW50ZXIpIHsKKyAgICAgICAgICAgIHB0ci0+cG9pbnRlciA9IG1hbGxvYyhzaXplICsgYnl0ZXMpOworICAgICAgICAgICAgaWYgKGJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgIHB0ci0+YWxpZ25lZCA9ICh2b2lkICopICgoKChzaXplX3QpIHB0ci0+cG9pbnRlciArIGJ5dGVzIC0gMSkgLyBieXRlcykgKiBieXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdHItPmFsaWduZWQgPSBwdHItPnBvaW50ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK2ZyZWVfYWxpZ25lZChhbGlnbmVkX3BvaW50ZXJfdCAqIHB0cikKK3sKKyAgICBpZiAocHRyKSB7CisgICAgICAgIGlmIChwdHItPnBvaW50ZXIpIHsKKyAgICAgICAgICAgIGZyZWUocHRyLT5wb2ludGVyKTsKKyAgICAgICAgICAgIHB0ci0+cG9pbnRlciA9IDA7CisgICAgICAgICAgICBwdHItPmFsaWduZWQgPSAwOworICAgICAgICB9CisgICAgfQorfQorCisvKnRob3NlIEFUSCBmb3JtdWxhcyBhcmUgcmV0dXJuaW5nCit0aGVpciBtaW5pbXVtIHZhbHVlIGZvciBpbnB1dCA9IC0xKi8KKworc3RhdGljICBGTE9BVAorQVRIZm9ybXVsYV9HQihGTE9BVCBmLCBGTE9BVCB2YWx1ZSkKK3sKKyAgICAvKiBmcm9tIFBhaW50ZXIgJiBTcGFuaWFzCisgICAgICAgbW9kaWZpZWQgYnkgR2FicmllbCBCb3V2aWduZSB0byBiZXR0ZXIgZml0IHRoZSByZWFsaXR5CisgICAgICAgYXRoID0gICAgMy42NDAgKiBwb3coZiwtMC44KQorICAgICAgIC0gNi44MDAgKiBleHAoLTAuNipwb3coZi0zLjQsMi4wKSkKKyAgICAgICArIDYuMDAwICogZXhwKC0wLjE1KnBvdyhmLTguNywyLjApKQorICAgICAgICsgMC42KiAwLjAwMSAqIHBvdyhmLDQuMCk7CisKKworICAgICAgIEluIHRoZSBwYXN0IExBTUUgd2FzIHVzaW5nIHRoZSBQYWludGVyICZTcGFuaWFzIGZvcm11bGEuCisgICAgICAgQnV0IHdlIGhhZCBzb21lIHJlY3VycmVudCBwcm9ibGVtcyB3aXRoIEhGIGNvbnRlbnQuCisgICAgICAgV2UgbWVhc3VyZWQgcmVhbCBBVEggdmFsdWVzLCBhbmQgZm91bmQgdGhlIG9sZGVyIGZvcm11bGEKKyAgICAgICB0byBiZSBpbmFjdXJhdGUgaW4gdGhlIGhpZ2hlciBwYXJ0LiBTbyB3ZSBtYWRlIHRoaXMgbmV3CisgICAgICAgZm9ybXVsYSBhbmQgdGhpcyBzb2x2ZWQgbW9zdCBvZiBIRiBwcm9ibGVtYXRpYyB0ZXN0Y2FzZXMuCisgICAgICAgVGhlIHRyYWRlb2ZmIGlzIHRoYXQgaW4gVkJSIG1vZGUgaXQgaW5jcmVhc2VzIGEgbG90IHRoZQorICAgICAgIGJpdHJhdGUuICovCisKKworLyp0aGlzIGN1cnZlIGNhbiBiZSB1ZGp1c3RlZCBhY2NvcmRpbmcgdG8gdGhlIFZCUiBzY2FsZToKK2l0IGFkanVzdHMgZnJvbSBzb21ldGhpbmcgY2xvc2UgdG8gUGFpbnRlciAmIFNwYW5pYXMKK29uIFY5IHVwIHRvIEJvdXZpZ25lJ3MgZm9ybXVsYSBmb3IgVjAuIFRoaXMgd2F5IHRoZSBWQlIKK2JpdHJhdGUgaXMgbW9yZSBiYWxhbmNlZCBhY2NvcmRpbmcgdG8gdGhlIC1WIHZhbHVlLiovCisKKyAgICBGTE9BVCAgIGF0aDsKKworICAgIC8qIHRoZSBmb2xsb3dpbmcgSGFjayBhbGxvd3MgdG8gYXNrIGZvciB0aGUgbG93ZXN0IHZhbHVlICovCisgICAgaWYgKGYgPCAtLjMpCisgICAgICAgIGYgPSAzNDEwOworCisgICAgZiAvPSAxMDAwOyAgICAgICAgICAvKiBjb252ZXJ0IHRvIGtoeiAqLworICAgIGYgPSBNYXgoMC4xLCBmKTsKKy8qICBmICA9IE1pbigyMS4wLCBmKTsKKyovCisgICAgYXRoID0gMy42NDAgKiBwb3coZiwgLTAuOCkKKyAgICAgICAgLSA2LjgwMCAqIGV4cCgtMC42ICogcG93KGYgLSAzLjQsIDIuMCkpCisgICAgICAgICsgNi4wMDAgKiBleHAoLTAuMTUgKiBwb3coZiAtIDguNywgMi4wKSkKKyAgICAgICAgKyAoMC42ICsgMC4wNCAqIHZhbHVlKSAqIDAuMDAxICogcG93KGYsIDQuMCk7CisgICAgcmV0dXJuIGF0aDsKK30KKworCisKK0ZMT0FUCitBVEhmb3JtdWxhKEZMT0FUIGYsIGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnApCit7CisgICAgRkxPQVQgICBhdGg7CisgICAgc3dpdGNoIChnZnAtPkFUSHR5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGF0aCA9IEFUSGZvcm11bGFfR0IoZiwgOSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgYXRoID0gQVRIZm9ybXVsYV9HQihmLCAtMSk7IC8qb3ZlciBzZW5zaXRpdmUsIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgYXRoID0gQVRIZm9ybXVsYV9HQihmLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBhdGggPSBBVEhmb3JtdWxhX0dCKGYsIDEpICsgNjsgLyptb2RpZmljYXRpb24gb2YgR0IgZm9ybXVsYSBieSBSb2VsICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgYXRoID0gQVRIZm9ybXVsYV9HQihmLCBnZnAtPkFUSGN1cnZlKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXRoID0gQVRIZm9ybXVsYV9HQihmLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBhdGg7Cit9CisKKy8qIHNlZSBmb3IgZXhhbXBsZSAiWndpY2tlcjogUHN5Y2hvYWt1c3RpaywgMTk4MjsgSVNCTiAzLTU0MC0xMTQwMS03ICovCitGTE9BVAorZnJlcTJiYXJrKEZMT0FUIGZyZXEpCit7CisgICAgLyogaW5wdXQ6IGZyZXEgaW4gaHogIG91dHB1dDogYmFya3MgKi8KKyAgICBpZiAoZnJlcSA8IDApCisgICAgICAgIGZyZXEgPSAwOworICAgIGZyZXEgPSBmcmVxICogMC4wMDE7CisgICAgcmV0dXJuIDEzLjAgKiBhdGFuKC43NiAqIGZyZXEpICsgMy41ICogYXRhbihmcmVxICogZnJlcSAvICg3LjUgKiA3LjUpKTsKK30KKworLyogc2VlIGZvciBleGFtcGxlICJad2lja2VyOiBQc3ljaG9ha3VzdGlrLCAxOTgyOyBJU0JOIDMtNTQwLTExNDAxLTcgKi8KK0ZMT0FUCitmcmVxMmNidyhGTE9BVCBmcmVxKQoreworICAgIC8qIGlucHV0OiBmcmVxIGluIGh6ICBvdXRwdXQ6IGNyaXRpY2FsIGJhbmQgd2lkdGggKi8KKyAgICBmcmVxID0gZnJlcSAqIDAuMDAxOworICAgIHJldHVybiAyNSArIDc1ICogcG93KDEgKyAxLjQgKiAoZnJlcSAqIGZyZXEpLCAwLjY5KTsKK30KKworCisKKworCisKKyNkZWZpbmUgQUJTKEEpICgoKEEpPjApID8gKEEpIDogLShBKSkKKworaW50CitGaW5kTmVhcmVzdEJpdHJhdGUoaW50IGJSYXRlLCAvKiBsZWdhbCByYXRlcyBmcm9tIDggdG8gMzIwICovCisgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24sIGludCBzYW1wbGVyYXRlKQoreyAgICAgICAgICAgICAgICAgICAgICAgLyogTVBFRy0xIG9yIE1QRUctMiBMU0YgKi8KKyAgICBpbnQgICAgIGJpdHJhdGU7CisgICAgaW50ICAgICBpOworCisgICAgaWYgKHNhbXBsZXJhdGUgPCAxNjAwMCkKKyAgICAgICAgdmVyc2lvbiA9IDI7CisKKyAgICBiaXRyYXRlID0gYml0cmF0ZV90YWJsZVt2ZXJzaW9uXVsxXTsKKworICAgIGZvciAoaSA9IDI7IGkgPD0gMTQ7IGkrKykgeworICAgICAgICBpZiAoYml0cmF0ZV90YWJsZVt2ZXJzaW9uXVtpXSA+IDApIHsKKyAgICAgICAgICAgIGlmIChBQlMoYml0cmF0ZV90YWJsZVt2ZXJzaW9uXVtpXSAtIGJSYXRlKSA8IEFCUyhiaXRyYXRlIC0gYlJhdGUpKQorICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBiaXRyYXRlX3RhYmxlW3ZlcnNpb25dW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaXRyYXRlOworfQorCisKKworCisKKyNpZm5kZWYgTWluCisjZGVmaW5lICAgICAgICAgTWluKEEsIEIpICAgICAgICgoQSkgPCAoQikgPyAoQSkgOiAoQikpCisjZW5kaWYKKyNpZm5kZWYgTWF4CisjZGVmaW5lICAgICAgICAgTWF4KEEsIEIpICAgICAgICgoQSkgPiAoQikgPyAoQSkgOiAoQikpCisjZW5kaWYKKworCisvKiBVc2VkIHRvIGZpbmQgdGFibGUgaW5kZXggd2hlbgorICogd2UgbmVlZCBiaXRyYXRlLWJhc2VkIHZhbHVlcworICogZGV0ZXJtaW5lZCB1c2luZyB0YWJsZXMKKyAqCisgKiBiaXRyYXRlIGluIGticHMKKyAqCisgKiBHYWJyaWVsIEJvdXZpZ25lIDIwMDItMTEtMDMKKyAqLworaW50CituZWFyZXN0Qml0cmF0ZUZ1bGxJbmRleChjb25zdCBpbnQgYml0cmF0ZSkKK3sKKyAgICAvKiBib3Jyb3dlZCBmcm9tIERNIGFiciBwcmVzZXRzICovCisKKyAgICBjb25zdCBpbnQgZnVsbF9iaXRyYXRlX3RhYmxlW10gPQorICAgICAgICB7IDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCB9OworCisKKyAgICBpbnQgICAgIGxvd2VyX3JhbmdlID0gMCwgbG93ZXJfcmFuZ2Vfa2JwcyA9IDAsIHVwcGVyX3JhbmdlID0gMCwgdXBwZXJfcmFuZ2Vfa2JwcyA9IDA7CisKKworICAgIGludCAgICAgYjsKKworCisgICAgLyogV2UgYXNzdW1lIHNwZWNpZmllZCBiaXRyYXRlIHdpbGwgYmUgMzIwa2JwcyAqLworICAgIHVwcGVyX3JhbmdlX2ticHMgPSBmdWxsX2JpdHJhdGVfdGFibGVbMTZdOworICAgIHVwcGVyX3JhbmdlID0gMTY7CisgICAgbG93ZXJfcmFuZ2Vfa2JwcyA9IGZ1bGxfYml0cmF0ZV90YWJsZVsxNl07CisgICAgbG93ZXJfcmFuZ2UgPSAxNjsKKworICAgIC8qIERldGVybWluZSB3aGljaCBzaWduaWZpY2FudCBiaXRyYXRlcyB0aGUgdmFsdWUgc3BlY2lmaWVkIGZhbGxzIGJldHdlZW4sCisgICAgICogaWYgbG9vcCBlbmRzIHdpdGhvdXQgYnJlYWtpbmcgdGhlbiB3ZSB3ZXJlIGNvcnJlY3QgYWJvdmUgdGhhdCB0aGUgdmFsdWUgd2FzIDMyMAorICAgICAqLworICAgIGZvciAoYiA9IDA7IGIgPCAxNjsgYisrKSB7CisgICAgICAgIGlmICgoTWF4KGJpdHJhdGUsIGZ1bGxfYml0cmF0ZV90YWJsZVtiICsgMV0pKSAhPSBiaXRyYXRlKSB7CisgICAgICAgICAgICB1cHBlcl9yYW5nZV9rYnBzID0gZnVsbF9iaXRyYXRlX3RhYmxlW2IgKyAxXTsKKyAgICAgICAgICAgIHVwcGVyX3JhbmdlID0gYiArIDE7CisgICAgICAgICAgICBsb3dlcl9yYW5nZV9rYnBzID0gZnVsbF9iaXRyYXRlX3RhYmxlW2JdOworICAgICAgICAgICAgbG93ZXJfcmFuZ2UgPSAoYik7CisgICAgICAgICAgICBicmVhazsgICAgICAvKiBXZSBmb3VuZCB1cHBlciByYW5nZSAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogRGV0ZXJtaW5lIHdoaWNoIHJhbmdlIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgY2xvc2VyIHRvICovCisgICAgaWYgKCh1cHBlcl9yYW5nZV9rYnBzIC0gYml0cmF0ZSkgPiAoYml0cmF0ZSAtIGxvd2VyX3JhbmdlX2ticHMpKSB7CisgICAgICAgIHJldHVybiBsb3dlcl9yYW5nZTsKKyAgICB9CisgICAgcmV0dXJuIHVwcGVyX3JhbmdlOworfQorCisKKworCisKKy8qIG1hcCBmcmVxdWVuY3kgdG8gYSB2YWxpZCBNUDMgc2FtcGxlIGZyZXF1ZW5jeQorICoKKyAqIFJvYmVydCBIZWdlbWFubiAyMDAwLTA3LTAxCisgKi8KK2ludAorbWFwMk1QM0ZyZXF1ZW5jeShpbnQgZnJlcSkKK3sKKyAgICBpZiAoZnJlcSA8PSA4MDAwKQorICAgICAgICByZXR1cm4gODAwMDsKKyAgICBpZiAoZnJlcSA8PSAxMTAyNSkKKyAgICAgICAgcmV0dXJuIDExMDI1OworICAgIGlmIChmcmVxIDw9IDEyMDAwKQorICAgICAgICByZXR1cm4gMTIwMDA7CisgICAgaWYgKGZyZXEgPD0gMTYwMDApCisgICAgICAgIHJldHVybiAxNjAwMDsKKyAgICBpZiAoZnJlcSA8PSAyMjA1MCkKKyAgICAgICAgcmV0dXJuIDIyMDUwOworICAgIGlmIChmcmVxIDw9IDI0MDAwKQorICAgICAgICByZXR1cm4gMjQwMDA7CisgICAgaWYgKGZyZXEgPD0gMzIwMDApCisgICAgICAgIHJldHVybiAzMjAwMDsKKyAgICBpZiAoZnJlcSA8PSA0NDEwMCkKKyAgICAgICAgcmV0dXJuIDQ0MTAwOworCisgICAgcmV0dXJuIDQ4MDAwOworfQorCitpbnQKK0JpdHJhdGVJbmRleChpbnQgYlJhdGUsICAgICAgLyogbGVnYWwgcmF0ZXMgZnJvbSAzMiB0byA0NDgga2JwcyAqLworICAgICAgICAgICAgIGludCB2ZXJzaW9uLCAgICAvKiBNUEVHLTEgb3IgTVBFRy0yLzIuNSBMU0YgKi8KKyAgICAgICAgICAgICBpbnQgc2FtcGxlcmF0ZSkKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgYml0cmF0ZSBpbiBrYnBzIHRvIGluZGV4ICovCisgICAgaW50ICAgICBpOworICAgIGlmIChzYW1wbGVyYXRlIDwgMTYwMDApCisgICAgICAgIHZlcnNpb24gPSAyOworICAgIGZvciAoaSA9IDA7IGkgPD0gMTQ7IGkrKykgeworICAgICAgICBpZiAoYml0cmF0ZV90YWJsZVt2ZXJzaW9uXVtpXSA+IDApIHsKKyAgICAgICAgICAgIGlmIChiaXRyYXRlX3RhYmxlW3ZlcnNpb25dW2ldID09IGJSYXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKiBjb252ZXJ0IHNhbXAgZnJlcSBpbiBIeiB0byBpbmRleCAqLworCitpbnQKK1NtcEZycUluZGV4KGludCBzYW1wbGVfZnJlcSwgaW50ICpjb25zdCB2ZXJzaW9uKQoreworICAgIHN3aXRjaCAoc2FtcGxlX2ZyZXEpIHsKKyAgICBjYXNlIDQ0MTAwOgorICAgICAgICAqdmVyc2lvbiA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgNDgwMDA6CisgICAgICAgICp2ZXJzaW9uID0gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgICAgKnZlcnNpb24gPSAxOworICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIDIyMDUwOgorICAgICAgICAqdmVyc2lvbiA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgMjQwMDA6CisgICAgICAgICp2ZXJzaW9uID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgKnZlcnNpb24gPSAwOworICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIDExMDI1OgorICAgICAgICAqdmVyc2lvbiA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgMTIwMDA6CisgICAgICAgICp2ZXJzaW9uID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSA4MDAwOgorICAgICAgICAqdmVyc2lvbiA9IDA7CisgICAgICAgIHJldHVybiAyOworICAgIGRlZmF1bHQ6CisgICAgICAgICp2ZXJzaW9uID0gMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogIEVuZCBvZiBiaXRfc3RyZWFtLmMgcGFja2FnZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisKKworCisKKworCisKKy8qIHJlc2FtcGxpbmcgdmlhIEZJUiBmaWx0ZXIsIGJsYWNrbWFuIHdpbmRvdyAqLworaW5saW5lIHN0YXRpYyBGTE9BVAorYmxhY2ttYW4oRkxPQVQgeCwgRkxPQVQgZmNuLCBpbnQgbCkKK3sKKyAgICAvKiBUaGlzIGFsZ29yaXRobSBmcm9tOgorICAgICAgIFNJR05BTCBQUk9DRVNTSU5HIEFMR09SSVRITVMgSU4gRk9SVFJBTiBBTkQgQworICAgICAgIFMuRC4gU3RlYXJucyBhbmQgUi5BLiBEYXZpZCwgUHJlbnRpY2UtSGFsbCwgMTk5MgorICAgICAqLworICAgIEZMT0FUICAgYmt3biwgeDI7CisgICAgRkxPQVQgY29uc3Qgd2NuID0gKFBJICogZmNuKTsKKworICAgIHggLz0gbDsKKyAgICBpZiAoeCA8IDApCisgICAgICAgIHggPSAwOworICAgIGlmICh4ID4gMSkKKyAgICAgICAgeCA9IDE7CisgICAgeDIgPSB4IC0gLjU7CisKKyAgICBia3duID0gMC40MiAtIDAuNSAqIGNvcygyICogeCAqIFBJKSArIDAuMDggKiBjb3MoNCAqIHggKiBQSSk7CisgICAgaWYgKGZhYnMoeDIpIDwgMWUtOSkKKyAgICAgICAgcmV0dXJuIHdjbiAvIFBJOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChia3duICogc2luKGwgKiB3Y24gKiB4MikgLyAoUEkgKiBsICogeDIpKTsKKworCit9CisKKy8qIGdjZCAtIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yICovCisvKiBKb2ludCB3b3JrIG9mIEV1Y2xpZCBhbmQgTS4gSGVuZHJ5ICovCisKK3N0YXRpYyBpbnQKK2djZChpbnQgaSwgaW50IGopCit7CisvKiAgICBhc3NlcnQgKCBpID4gMCAgJiYgIGogPiAwICk7ICovCisgICAgcmV0dXJuIGogPyBnY2QoaiwgaSAlIGopIDogaTsKK30KKworCisKKy8qIGNvcHkgaW4gbmV3IHNhbXBsZXMgZnJvbSBpbl9idWZmZXIgaW50byBtZmJ1Ziwgd2l0aCByZXNhbXBsaW5nCisgICBpZiBuZWNlc3NhcnkuICBuX2luID0gbnVtYmVyIG9mIHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIHRoYXQKKyAgIHdlcmUgdXNlZC4gIG5fb3V0ID0gbnVtYmVyIG9mIHNhbXBsZXMgY29waWVkIGludG8gbWZidWYgICovCisKK3ZvaWQKK2ZpbGxfYnVmZmVyKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsCisgICAgICAgICAgICBzYW1wbGVfdCAqIG1mYnVmWzJdLCBzYW1wbGVfdCBjb25zdCAqaW5fYnVmZmVyWzJdLCBpbnQgbnNhbXBsZXMsIGludCAqbl9pbiwgaW50ICpuX291dCkKK3sKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzIGNvbnN0ICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgY2gsIGk7CisKKyAgICAvKiBjb3B5IGluIG5ldyBzYW1wbGVzIGludG8gbWZidWYsIHdpdGggcmVzYW1wbGluZyBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoKGdmYy0+cmVzYW1wbGVfcmF0aW8gPCAuOTk5OSkgfHwgKGdmYy0+cmVzYW1wbGVfcmF0aW8gPiAxLjAwMDEpKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy0+Y2hhbm5lbHNfb3V0OyBjaCsrKSB7CisgICAgICAgICAgICAqbl9vdXQgPQorICAgICAgICAgICAgICAgIGZpbGxfYnVmZmVyX3Jlc2FtcGxlKGdmcCwgJm1mYnVmW2NoXVtnZmMtPm1mX3NpemVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdmcC0+ZnJhbWVzaXplLCBpbl9idWZmZXJbY2hdLCBuc2FtcGxlcywgbl9pbiwgY2gpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqbl9vdXQgPSBNaW4oZ2ZwLT5mcmFtZXNpemUsIG5zYW1wbGVzKTsKKyAgICAgICAgKm5faW4gPSAqbl9vdXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbl9vdXQ7ICsraSkgeworICAgICAgICAgICAgbWZidWZbMF1bZ2ZjLT5tZl9zaXplICsgaV0gPSBpbl9idWZmZXJbMF1baV07CisgICAgICAgICAgICBpZiAoZ2ZjLT5jaGFubmVsc19vdXQgPT0gMikKKyAgICAgICAgICAgICAgICBtZmJ1ZlsxXVtnZmMtPm1mX3NpemUgKyBpXSA9IGluX2J1ZmZlclsxXVtpXTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKKworaW50CitmaWxsX2J1ZmZlcl9yZXNhbXBsZShsYW1lX2dsb2JhbF9mbGFncyBjb25zdCAqZ2ZwLAorICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3QgKiBvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzaXJlZF9sZW4sIHNhbXBsZV90IGNvbnN0ICppbmJ1ZiwgaW50IGxlbiwgaW50ICpudW1fdXNlZCwgaW50IGNoKQoreworCisKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpjb25zdCBnZmMgPSBnZnAtPmludGVybmFsX2ZsYWdzOworICAgIGludCAgICAgQkxBQ0tTSVpFOworICAgIEZMT0FUICAgb2Zmc2V0LCB4dmFsdWU7CisgICAgaW50ICAgICBpLCBqID0gMCwgazsKKyAgICBpbnQgICAgIGZpbHRlcl9sOworICAgIEZMT0FUICAgZmNuLCBpbnRyYXRpbzsKKyAgICBGTE9BVCAgKmluYnVmX29sZDsKKyAgICBpbnQgICAgIGJwYzsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvbnZvbHV0aW9uIGZ1bmN0aW9ucyB0byBwcmUtY29tcHV0ZSAqLworICAgIGJwYyA9IGdmcC0+b3V0X3NhbXBsZXJhdGUgLyBnY2QoZ2ZwLT5vdXRfc2FtcGxlcmF0ZSwgZ2ZwLT5pbl9zYW1wbGVyYXRlKTsKKyAgICBpZiAoYnBjID4gQlBDKQorICAgICAgICBicGMgPSBCUEM7CisKKyAgICBpbnRyYXRpbyA9IChmYWJzKGdmYy0+cmVzYW1wbGVfcmF0aW8gLSBmbG9vciguNSArIGdmYy0+cmVzYW1wbGVfcmF0aW8pKSA8IC4wMDAxKTsKKyAgICBmY24gPSAxLjAwIC8gZ2ZjLT5yZXNhbXBsZV9yYXRpbzsKKyAgICBpZiAoZmNuID4gMS4wMCkKKyAgICAgICAgZmNuID0gMS4wMDsKKyAgICBmaWx0ZXJfbCA9IDMxOworICAgIGlmICgwID09IGZpbHRlcl9sICUgMikKKyAgICAgICAgLS1maWx0ZXJfbDsgICAgIC8qIG11c3QgYmUgb2RkICovCisgICAgZmlsdGVyX2wgKz0gaW50cmF0aW87IC8qIHVubGVzcyByZXNhbXBsZV9yYXRpbz1pbnQsIGl0IG11c3QgYmUgZXZlbiAqLworCisKKyAgICBCTEFDS1NJWkUgPSBmaWx0ZXJfbCArIDE7IC8qIHNpemUgb2YgZGF0YSBuZWVkZWQgZm9yIEZJUiAqLworCisgICAgaWYgKGdmYy0+ZmlsbF9idWZmZXJfcmVzYW1wbGVfaW5pdCA9PSAwKSB7CisgICAgICAgIGdmYy0+aW5idWZfb2xkWzBdID0gY2FsbG9jKEJMQUNLU0laRSwgc2l6ZW9mKGdmYy0+aW5idWZfb2xkWzBdWzBdKSk7CisgICAgICAgIGdmYy0+aW5idWZfb2xkWzFdID0gY2FsbG9jKEJMQUNLU0laRSwgc2l6ZW9mKGdmYy0+aW5idWZfb2xkWzBdWzBdKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gMiAqIGJwYzsgKytpKQorICAgICAgICAgICAgZ2ZjLT5ibGFja2ZpbHRbaV0gPSBjYWxsb2MoQkxBQ0tTSVpFLCBzaXplb2YoZ2ZjLT5ibGFja2ZpbHRbMF1bMF0pKTsKKworICAgICAgICBnZmMtPml0aW1lWzBdID0gMDsKKyAgICAgICAgZ2ZjLT5pdGltZVsxXSA9IDA7CisKKyAgICAgICAgLyogcHJlY29tcHV0ZSBibGFja21hbiBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gMiAqIGJwYzsgaisrKSB7CisgICAgICAgICAgICBGTE9BVCAgIHN1bSA9IDAuOworICAgICAgICAgICAgb2Zmc2V0ID0gKGogLSBicGMpIC8gKDIuICogYnBjKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gZmlsdGVyX2w7IGkrKykKKyAgICAgICAgICAgICAgICBzdW0gKz0gZ2ZjLT5ibGFja2ZpbHRbal1baV0gPSBibGFja21hbihpIC0gb2Zmc2V0LCBmY24sIGZpbHRlcl9sKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gZmlsdGVyX2w7IGkrKykKKyAgICAgICAgICAgICAgICBnZmMtPmJsYWNrZmlsdFtqXVtpXSAvPSBzdW07CisgICAgICAgIH0KKyAgICAgICAgZ2ZjLT5maWxsX2J1ZmZlcl9yZXNhbXBsZV9pbml0ID0gMTsKKyAgICB9CisKKyAgICBpbmJ1Zl9vbGQgPSBnZmMtPmluYnVmX29sZFtjaF07CisKKyAgICAvKiB0aW1lIG9mIGondGggZWxlbWVudCBpbiBpbmJ1ZiA9IGl0aW1lICsgai9pZnJlcTsgKi8KKyAgICAvKiB0aW1lIG9mIGsndGggZWxlbWVudCBpbiBvdXRidWYgICA9ICBqL29mcmVxICovCisgICAgZm9yIChrID0gMDsgayA8IGRlc2lyZWRfbGVuOyBrKyspIHsKKyAgICAgICAgZG91YmxlICB0aW1lMDsKKyAgICAgICAgaW50ICAgICBqb2ZmOworCisgICAgICAgIHRpbWUwID0gayAqIGdmYy0+cmVzYW1wbGVfcmF0aW87IC8qIHRpbWUgb2Ygayd0aCBvdXRwdXQgc2FtcGxlICovCisgICAgICAgIGogPSBmbG9vcih0aW1lMCAtIGdmYy0+aXRpbWVbY2hdKTsKKworICAgICAgICAvKiBjaGVjayBpZiB3ZSBuZWVkIG1vcmUgaW5wdXQgZGF0YSAqLworICAgICAgICBpZiAoKGZpbHRlcl9sICsgaiAtIGZpbHRlcl9sIC8gMikgPj0gbGVuKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogYmxhY2ttYW4gZmlsdGVyLiAgYnkgZGVmYXVsdCwgd2luZG93IGNlbnRlcmVkIGF0IGorLjUoZmlsdGVyX2wlMikgKi8KKyAgICAgICAgLyogYnV0IHdlIHdhbnQgYSB3aW5kb3cgY2VudGVyZWQgYXQgdGltZTAuICAgKi8KKyAgICAgICAgb2Zmc2V0ID0gKHRpbWUwIC0gZ2ZjLT5pdGltZVtjaF0gLSAoaiArIC41ICogKGZpbHRlcl9sICUgMikpKTsKKyAgICAgICAgYXNzZXJ0KGZhYnMob2Zmc2V0KSA8PSAuNTAxKTsKKworICAgICAgICAvKiBmaW5kIHRoZSBjbG9zZXN0IHByZWNvbXB1dGVkIHdpbmRvdyBmb3IgdGhpcyBvZmZzZXQ6ICovCisgICAgICAgIGpvZmYgPSBmbG9vcigob2Zmc2V0ICogMiAqIGJwYykgKyBicGMgKyAuNSk7CisKKyAgICAgICAgeHZhbHVlID0gMC47CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gZmlsdGVyX2w7ICsraSkgeworICAgICAgICAgICAgaW50IGNvbnN0IGoyID0gaSArIGogLSBmaWx0ZXJfbCAvIDI7CisgICAgICAgICAgICBzYW1wbGVfdCB5OworICAgICAgICAgICAgYXNzZXJ0KGoyIDwgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChqMiArIEJMQUNLU0laRSA+PSAwKTsKKyAgICAgICAgICAgIHkgPSAoajIgPCAwKSA/IGluYnVmX29sZFtCTEFDS1NJWkUgKyBqMl0gOiBpbmJ1ZltqMl07CisjaWZkZWYgUFJFQ09NUFVURQorICAgICAgICAgICAgeHZhbHVlICs9IHkgKiBnZmMtPmJsYWNrZmlsdFtqb2ZmXVtpXTsKKyNlbHNlCisgICAgICAgICAgICB4dmFsdWUgKz0geSAqIGJsYWNrbWFuKGkgLSBvZmZzZXQsIGZjbiwgZmlsdGVyX2wpOyAvKiB2ZXJ5IHNsb3chICovCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBvdXRidWZba10gPSB4dmFsdWU7CisgICAgfQorCisKKyAgICAvKiBrID0gbnVtYmVyIG9mIHNhbXBsZXMgYWRkZWQgdG8gb3V0YnVmICovCisgICAgLyogbGFzdCBrIHNhbXBsZSB1c2VkIGRhdGEgZnJvbSBbai1maWx0ZXJfbC8yLGorZmlsdGVyX2wtZmlsdGVyX2wvMl0gICovCisKKyAgICAvKiBob3cgbWFueSBzYW1wbGVzIG9mIGlucHV0IGRhdGEgd2VyZSB1c2VkOiAgKi8KKyAgICAqbnVtX3VzZWQgPSBNaW4obGVuLCBmaWx0ZXJfbCArIGogLSBmaWx0ZXJfbCAvIDIpOworCisgICAgLyogYWRqdXN0IG91ciBpbnB1dCB0aW1lIGNvdW50ZXIuICBJbmNyaW1lbnQgYnkgdGhlIG51bWJlciBvZiBzYW1wbGVzIHVzZWQsCisgICAgICogdGhlbiBub3JtYWxpemUgc28gdGhhdCBuZXh0IG91dHB1dCBzYW1wbGUgaXMgYXQgdGltZSAwLCBuZXh0CisgICAgICogaW5wdXQgYnVmZmVyIGlzIGF0IHRpbWUgaXRpbWVbY2hdICovCisgICAgZ2ZjLT5pdGltZVtjaF0gKz0gKm51bV91c2VkIC0gayAqIGdmYy0+cmVzYW1wbGVfcmF0aW87CisKKyAgICAvKiBzYXZlIHRoZSBsYXN0IEJMQUNLU0laRSBzYW1wbGVzIGludG8gdGhlIGluYnVmX29sZCBidWZmZXIgKi8KKyAgICBpZiAoKm51bV91c2VkID49IEJMQUNLU0laRSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQkxBQ0tTSVpFOyBpKyspCisgICAgICAgICAgICBpbmJ1Zl9vbGRbaV0gPSBpbmJ1ZlsqbnVtX3VzZWQgKyBpIC0gQkxBQ0tTSVpFXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIHNoaWZ0IGluICpudW1fdXNlZCBzYW1wbGVzIGludG8gaW5idWZfb2xkICAqLworICAgICAgICBpbnQgY29uc3Qgbl9zaGlmdCA9IEJMQUNLU0laRSAtICpudW1fdXNlZDsgLyogbnVtYmVyIG9mIHNhbXBsZXMgdG8gc2hpZnQgKi8KKworICAgICAgICAvKiBzaGlmdCBuX3NoaWZ0IHNhbXBsZXMgYnkgKm51bV91c2VkLCB0byBtYWtlIHJvb20gZm9yIHRoZQorICAgICAgICAgKiBudW1fdXNlZCBuZXcgc2FtcGxlcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9zaGlmdDsgKytpKQorICAgICAgICAgICAgaW5idWZfb2xkW2ldID0gaW5idWZfb2xkW2kgKyAqbnVtX3VzZWRdOworCisgICAgICAgIC8qIHNoaWZ0IGluIHRoZSAqbnVtX3VzZWQgc2FtcGxlcyAqLworICAgICAgICBmb3IgKGogPSAwOyBpIDwgQkxBQ0tTSVpFOyArK2ksICsraikKKyAgICAgICAgICAgIGluYnVmX29sZFtpXSA9IGluYnVmW2pdOworCisgICAgICAgIGFzc2VydChqID09ICpudW1fdXNlZCk7CisgICAgfQorICAgIHJldHVybiBrOyAgICAgICAgICAgLyogcmV0dXJuIHRoZSBudW1iZXIgc2FtcGxlcyBjcmVhdGVkIGF0IHRoZSBuZXcgc2FtcGxlcmF0ZSAqLworfQorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgTWVzc2FnZSBPdXRwdXQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorbGFtZV9kZWJ1Z2YoY29uc3QgbGFtZV9pbnRlcm5hbF9mbGFncyAqIGdmYywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKworICAgIGlmIChnZmMtPnJlcG9ydC5kZWJ1Z2YgIT0gTlVMTCkgeworICAgICAgICBnZmMtPnJlcG9ydC5kZWJ1Z2YoZm9ybWF0LCBhcmdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICh2b2lkKSB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXJncyk7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOyAvKiBhbiBkZWJ1ZyBmdW5jdGlvbiBzaG91bGQgZmx1c2ggaW1tZWRpYXRlbHkgKi8KKyAgICB9CisKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKwordm9pZAorbGFtZV9tc2dmKGNvbnN0IGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgICBpZiAoZ2ZjLT5yZXBvcnQubXNnZiAhPSBOVUxMKSB7CisgICAgICAgIGdmYy0+cmVwb3J0Lm1zZ2YoZm9ybWF0LCBhcmdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICh2b2lkKSB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXJncyk7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOyAvKiB3ZSBwcmludCB0byBzdGRlcnIsIHNvIG1lIG1heSB3YW50IHRvIGZsdXNoICovCisgICAgfQorCisgICAgdmFfZW5kKGFyZ3MpOworfQorCisKK3ZvaWQKK2xhbWVfZXJyb3JmKGNvbnN0IGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgICBpZiAoZ2ZjLT5yZXBvcnQuZXJyb3JmICE9IE5VTEwpIHsKKyAgICAgICAgZ2ZjLT5yZXBvcnQuZXJyb3JmKGZvcm1hdCwgYXJncyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAodm9pZCkgdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsgLyogYW4gZXJyb3IgZnVuY3Rpb24gc2hvdWxkIGZsdXNoIGltbWVkaWF0ZWx5ICovCisgICAgfQorCisgICAgdmFfZW5kKGFyZ3MpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICByb3V0aW5lcyB0byBkZXRlY3QgQ1BVIHNwZWNpZmljIGZlYXR1cmVzIGxpa2UgM0ROb3csIE1NWCwgU1NFCisgKgorICogIGRvbmF0ZWQgYnkgRnJhbmsgS2xlbW0KKyAqICBhZGRlZCBSb2JlcnQgSGVnZW1hbm4gMjAwMC0xMC0xMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEhBVkVfTkFTTQorZXh0ZXJuIGludCBoYXNfTU1YX25hc20odm9pZCk7CitleHRlcm4gaW50IGhhc18zRE5vd19uYXNtKHZvaWQpOworZXh0ZXJuIGludCBoYXNfU1NFX25hc20odm9pZCk7CitleHRlcm4gaW50IGhhc19TU0UyX25hc20odm9pZCk7CisjZW5kaWYKKworaW50CitoYXNfTU1YKHZvaWQpCit7CisjaWZkZWYgSEFWRV9OQVNNCisgICAgcmV0dXJuIGhhc19NTVhfbmFzbSgpOworI2Vsc2UKKyAgICByZXR1cm4gMDsgICAgICAgICAgIC8qIGRvbid0IGtub3csIGFzc3VtZSBub3QgKi8KKyNlbmRpZgorfQorCitpbnQKK2hhc18zRE5vdyh2b2lkKQoreworI2lmZGVmIEhBVkVfTkFTTQorICAgIHJldHVybiBoYXNfM0ROb3dfbmFzbSgpOworI2Vsc2UKKyAgICByZXR1cm4gMDsgICAgICAgICAgIC8qIGRvbid0IGtub3csIGFzc3VtZSBub3QgKi8KKyNlbmRpZgorfQorCitpbnQKK2hhc19TU0Uodm9pZCkKK3sKKyNpZmRlZiBIQVZFX05BU00KKyAgICByZXR1cm4gaGFzX1NTRV9uYXNtKCk7CisjZWxzZQorI2lmZGVmIF9NX1g2NAorICAgIHJldHVybiAxOworI2Vsc2UKKyAgICByZXR1cm4gMDsgICAgICAgICAgIC8qIGRvbid0IGtub3csIGFzc3VtZSBub3QgKi8KKyNlbmRpZgorI2VuZGlmCit9CisKK2ludAoraGFzX1NTRTIodm9pZCkKK3sKKyNpZmRlZiBIQVZFX05BU00KKyAgICByZXR1cm4gaGFzX1NTRTJfbmFzbSgpOworI2Vsc2UKKyNpZmRlZiBfTV9YNjQKKyAgICByZXR1cm4gMTsKKyNlbHNlCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAvKiBkb24ndCBrbm93LCBhc3N1bWUgbm90ICovCisjZW5kaWYKKyNlbmRpZgorfQorCit2b2lkCitkaXNhYmxlX0ZQRSh2b2lkKQoreworLyogZXh0cmVtbHkgc3lzdGVtIGRlcGVuZGVudCBzdHVmZiwgbW92ZSB0byBhIGxpYiB0byBtYWtlIHRoZSBjb2RlIHJlYWRhYmxlICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKyAgICAvKgorICAgICAqICBEaXNhYmxlIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMKKyAgICAgKi8KKworCisKKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fYWxwaGFfXykKKyAgICB7CisgICAgICAgIC8qIHNlZXQgZmxvYXRpbmcgcG9pbnQgbWFzayB0byB0aGUgTGludXggZGVmYXVsdCAqLworICAgICAgICBmcF9leGNlcHRfdCBtYXNrOworICAgICAgICBtYXNrID0gZnBnZXRtYXNrKCk7CisgICAgICAgIC8qIGlmIGJpdCBpcyBzZXQsIHdlIGdldCBTSUdGUEUgb24gdGhhdCBlcnJvciEgKi8KKyAgICAgICAgZnBzZXRtYXNrKG1hc2sgJiB+KEZQX1hfSU5WIHwgRlBfWF9EWikpOworICAgICAgICAvKiAgREVCVUdGKCJGcmVlQlNEIG1hc2sgaXMgMHgleFxuIixtYXNrKTsgKi8KKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19yaXNjb3NfXykgJiYgIWRlZmluZWQoQUJPUlRGUCkKKyAgICAvKiBEaXNhYmxlIEZQRSdzIHVuZGVyIFJJU0MgT1MgKi8KKyAgICAvKiBpZiBiaXQgaXMgc2V0LCB3ZSBkaXNhYmxlIHRyYXBwaW5nIHRoYXQgZXJyb3IhICovCisgICAgLyogICBfRlBFX0lWTyA6IGludmFsaWQgb3BlcmF0aW9uICovCisgICAgLyogICBfRlBFX0RWWiA6IGRpdmlkZSBieSB6ZXJvICovCisgICAgLyogICBfRlBFX09GTCA6IG92ZXJmbG93ICovCisgICAgLyogICBfRlBFX1VGTCA6IHVuZGVyZmxvdyAqLworICAgIC8qICAgX0ZQRV9JTlggOiBpbmV4YWN0ICovCisgICAgRGlzYWJsZUZQRVRyYXBzKF9GUEVfSVZPIHwgX0ZQRV9EVlogfCBfRlBFX09GTCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogIERlYnVnZ2luZyBzdHVmZgorICAgICAqICBUaGUgZGVmYXVsdCBpcyB0byBpZ25vcmUgRlBFJ3MsIHVubGVzcyBjb21waWxlZCB3aXRoIC1EQUJPUlRGUAorICAgICAqICBzbyBhZGQgY29kZSBiZWxvdyB0byBFTkFCTEUgRlBFJ3MuCisgICAgICovCisKKyNpZiBkZWZpbmVkKEFCT1JURlApCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICB7CisjaWYgMAorICAgICAgICAvKiByaCAwNjEyMDcKKyAgICAgICAgICAgdGhlIGZvbGxvd2luZyBmaXggc2VlbXMgdG8gYmUgYSB3b3JrYXJvdW5kIGZvciBhIHByb2JsZW0gaW4gdGhlCisgICAgICAgICAgIHBhcmVudCBwcm9jZXNzIGNhbGxpbmcgTEFNRS4gSXQgd291bGQgYmUgYmV0dGVyIHRvIGZpeCB0aGUgYnJva2VuCisgICAgICAgICAgIGFwcGxpY2F0aW9uID0+IGNvZGUgZGlzYWJsZWQuCisgICAgICAgICAqLworCisgICAgICAgIC8qIHNldCBhZmZpbml0eSB0byBhIHNpbmdsZSBDUFUuICBGaXggZm9yIEVBQy9sYW1lIG9uIFNNUCBzeXN0ZW1zIGZyb20KKyAgICAgICAgICAgIlRvZGQgUmljaG1vbmQiIDx0b2RkLnJpY2htb25kQG9wZW53YXZlLmNvbT4gKi8KKyAgICAgICAgU1lTVEVNX0lORk8gc2k7CisgICAgICAgIEdldFN5c3RlbUluZm8oJnNpKTsKKyAgICAgICAgU2V0UHJvY2Vzc0FmZmluaXR5TWFzayhHZXRDdXJyZW50UHJvY2VzcygpLCBzaS5kd0FjdGl2ZVByb2Nlc3Nvck1hc2spOworI2VuZGlmCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyAgICAgICAgdW5zaWduZWQgaW50IG1hc2s7CisgICAgICAgIG1hc2sgPSBfY29udHJvbGZwKDAsIDApOworICAgICAgICBtYXNrICY9IH4oX0VNX09WRVJGTE9XIHwgX0VNX1VOREVSRkxPVyB8IF9FTV9aRVJPRElWSURFIHwgX0VNX0lOVkFMSUQpOworICAgICAgICBtYXNrID0gX2NvbnRyb2xmcChtYXNrLCBfTUNXX0VNKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICBkZWZpbmUgX0ZQVV9HRVRDVyhjdykgX19hc21fXyAoImZuc3RjdyAlMCIgOiAiPW0iICgqJmN3KSkKKyMgIGRlZmluZSBfRlBVX1NFVENXKGN3KSBfX2FzbV9fICgiZmxkY3cgJTAiIDogOiAibSIgKComY3cpKQorCisjICBkZWZpbmUgX0VNX0lORVhBQ1QgICAgIDB4MDAwMDAwMjAgLyogaW5leGFjdCAocHJlY2lzaW9uKSAqLworIyAgZGVmaW5lIF9FTV9VTkRFUkZMT1cgICAweDAwMDAwMDEwIC8qIHVuZGVyZmxvdyAqLworIyAgZGVmaW5lIF9FTV9PVkVSRkxPVyAgICAweDAwMDAwMDA4IC8qIG92ZXJmbG93ICovCisjICBkZWZpbmUgX0VNX1pFUk9ESVZJREUgIDB4MDAwMDAwMDQgLyogemVybyBkaXZpZGUgKi8KKyMgIGRlZmluZSBfRU1fSU5WQUxJRCAgICAgMHgwMDAwMDAwMSAvKiBpbnZhbGlkICovCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgbWFzazsKKyAgICAgICAgX0ZQVV9HRVRDVyhtYXNrKTsKKyAgICAgICAgLyogU2V0IHRoZSBGUFUgY29udHJvbCB3b3JkIHRvIGFib3J0IG9uIG1vc3QgRlBFcyAqLworICAgICAgICBtYXNrICY9IH4oX0VNX09WRVJGTE9XIHwgX0VNX1pFUk9ESVZJREUgfCBfRU1fSU5WQUxJRCk7CisgICAgICAgIF9GUFVfU0VUQ1cobWFzayk7CisgICAgfQorIyBlbGlmIGRlZmluZWQoX19saW51eF9fKQorICAgIHsKKworIyAgaW5jbHVkZSA8ZnB1X2NvbnRyb2wuaD4KKyMgIGlmbmRlZiBfRlBVX0dFVENXCisjICBkZWZpbmUgX0ZQVV9HRVRDVyhjdykgX19hc21fXyAoImZuc3RjdyAlMCIgOiAiPW0iICgqJmN3KSkKKyMgIGVuZGlmCisjICBpZm5kZWYgX0ZQVV9TRVRDVworIyAgZGVmaW5lIF9GUFVfU0VUQ1coY3cpIF9fYXNtX18gKCJmbGRjdyAlMCIgOiA6ICJtIiAoKiZjdykpCisjICBlbmRpZgorCisgICAgICAgIC8qIAorICAgICAgICAgKiBTZXQgdGhlIExpbnV4IG1hc2sgdG8gYWJvcnQgb24gbW9zdCBGUEUncworICAgICAgICAgKiBpZiBiaXQgaXMgc2V0LCB3ZSBfbWFza18gU0lHRlBFIG9uIHRoYXQgZXJyb3IhCisgICAgICAgICAqICBtYXNrICY9IH4oIF9GUFVfTUFTS19JTSB8IF9GUFVfTUFTS19aTSB8IF9GUFVfTUFTS19PTSB8IF9GUFVfTUFTS19VTSApOworICAgICAgICAgKi8KKworICAgICAgICB1bnNpZ25lZCBpbnQgbWFzazsKKyAgICAgICAgX0ZQVV9HRVRDVyhtYXNrKTsKKyAgICAgICAgbWFzayAmPSB+KF9GUFVfTUFTS19JTSB8IF9GUFVfTUFTS19aTSB8IF9GUFVfTUFTS19PTSk7CisgICAgICAgIF9GUFVfU0VUQ1cobWFzayk7CisgICAgfQorI2VuZGlmCisjZW5kaWYgLyogQUJPUlRGUCAqLworfQorCisKKworCisKKyNpZmRlZiBVU0VfRkFTVF9MT0cKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZhc3QgTG9nIEFwcHJveGltYXRpb24gZm9yIGxvZzIsIHVzZWQgdG8gYXBwcm94aW1hdGUgZXZlcnkgb3RoZXIgbG9nCisgKiAobG9nMTAgYW5kIGxvZykKKyAqIG1heGltdW0gYWJzb2x1dGUgZXJyb3IgZm9yIGxvZzEwIGlzIGFyb3VuZCAxMC02CisgKiBtYXhpbXVtICpyZWxhdGl2ZSogZXJyb3IgY2FuIGJlIGhpZ2ggd2hlbiB4IGlzIGFsbW9zdCAxIGJlY2F1c2UgZXJyb3IvbG9nMTAoeCkgdGVuZHMgdG93YXJkIHgvZQorICoKKyAqIHVzZSBpdCBpZiB0eXBpY2FsIFJFU1VMVCB2YWx1ZXMgYXJlID4gMWUtNSAoZm9yIGV4YW1wbGUgaWYgeD4xLjAwMDAxIG9yIHg8MC45OTk5OSkKKyAqIG9yIGlmIHRoZSByZWxhdGl2ZSBwcmVjaXNpb24gaW4gdGhlIGRvbWFpbiBhcm91bmQgMSBpcyBub3QgaW1wb3J0YW50IChyZXN1bHQgaW4gMSBpcyBleGFjdCBhbmQgMCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBMT0cyX1NJWkUgICAgICAgKDUxMikKKyNkZWZpbmUgTE9HMl9TSVpFX0wyICAgICg5KQorCitzdGF0aWMgaWVlZTc1NF9mbG9hdDMyX3QgbG9nX3RhYmxlW0xPRzJfU0laRSArIDFdOworCisKKwordm9pZAoraW5pdF9sb2dfdGFibGUodm9pZCkKK3sKKyAgICBpbnQgICAgIGo7CisgICAgc3RhdGljIGludCBpbml0ID0gMDsKKworICAgIC8qIFJhbmdlIGZvciBsb2cyKHgpIG92ZXIgWzEsMlsgaXMgWzAsMVsgKi8KKyAgICBhc3NlcnQoKDEgPDwgTE9HMl9TSVpFX0wyKSA9PSBMT0cyX1NJWkUpOworCisgICAgaWYgKCFpbml0KSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBMT0cyX1NJWkUgKyAxOyBqKyspCisgICAgICAgICAgICBsb2dfdGFibGVbal0gPSBsb2coMS4wZiArIGogLyAoaWVlZTc1NF9mbG9hdDMyX3QpIExPRzJfU0laRSkgLyBsb2coMi4wZik7CisgICAgfQorICAgIGluaXQgPSAxOworfQorCisKKworaWVlZTc1NF9mbG9hdDMyX3QKK2Zhc3RfbG9nMihpZWVlNzU0X2Zsb2F0MzJfdCB4KQoreworICAgIGllZWU3NTRfZmxvYXQzMl90IGxvZzJ2YWwsIHBhcnRpYWw7CisgICAgdW5pb24geworICAgICAgICBpZWVlNzU0X2Zsb2F0MzJfdCBmOworICAgICAgICBpbnQgICAgIGk7CisgICAgfSBmaTsKKyAgICBpbnQgICAgIG1hbnRpc3NlOworICAgIGZpLmYgPSB4OworICAgIG1hbnRpc3NlID0gZmkuaSAmIDB4N2ZmZmZmOworICAgIGxvZzJ2YWwgPSAoKGZpLmkgPj4gMjMpICYgMHhGRikgLSAweDdmOworICAgIHBhcnRpYWwgPSAobWFudGlzc2UgJiAoKDEgPDwgKDIzIC0gTE9HMl9TSVpFX0wyKSkgLSAxKSk7CisgICAgcGFydGlhbCAqPSAxLjBmIC8gKCgxIDw8ICgyMyAtIExPRzJfU0laRV9MMikpKTsKKworCisgICAgbWFudGlzc2UgPj49ICgyMyAtIExPRzJfU0laRV9MMik7CisKKyAgICAvKiBsb2cydmFsICs9IGxvZ190YWJsZVttYW50aXNzZV07ICB3aXRob3V0IGludGVycG9sYXRpb24gdGhlIHJlc3VsdHMgYXJlIG5vdCBnb29kICovCisgICAgbG9nMnZhbCArPSBsb2dfdGFibGVbbWFudGlzc2VdICogKDEuMGYgLSBwYXJ0aWFsKSArIGxvZ190YWJsZVttYW50aXNzZSArIDFdICogcGFydGlhbDsKKworICAgIHJldHVybiBsb2cydmFsOworfQorCisjZWxzZSAvKiBEb24ndCB1c2UgRkFTVF9MT0cgKi8KKworCit2b2lkCitpbml0X2xvZ190YWJsZSh2b2lkKQoreworfQorCisKKyNlbmRpZgorCisvKiBlbmQgb2YgdXRpbC5jICovCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3V0aWwuaCBiL2xpYm1wM2xhbWUvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODA5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3V0aWwuaApAQCAtMCwwICsxLDU0NiBAQAorLyoKKyAqICAgICAgbGFtZSB1dGlsaXR5IGxpYnJhcnkgaW5jbHVkZSBmaWxlCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgQWxiZXJ0IEwgRmFiZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBMQU1FX1VUSUxfSAorI2RlZmluZSBMQU1FX1VUSUxfSAorCisjaW5jbHVkZSAibDNzaWRlLmgiCisjaW5jbHVkZSAiaWQzdGFnLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgR2xvYmFsIERlZmluaXRpb25zCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSAgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAoIUZBTFNFKQorI2VuZGlmCisKKyNpZmRlZiBVSU5UX01BWAorIyBkZWZpbmUgICAgICAgICBNQVhfVV8zMl9OVU0gICAgICAgICAgICBVSU5UX01BWAorI2Vsc2UKKyMgZGVmaW5lICAgICAgICAgTUFYX1VfMzJfTlVNICAgICAgICAgICAgMHhGRkZGRkZGRgorI2VuZGlmCisKKyNpZm5kZWYgUEkKKyMgaWZkZWYgTV9QSQorIyAgZGVmaW5lICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgIE1fUEkKKyMgZWxzZQorIyAgZGVmaW5lICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBNX0xOMgorIyBkZWZpbmUgICAgICAgIExPRzIgICAgICAgICAgICAgICAgICAgIE1fTE4yCisjZWxzZQorIyBkZWZpbmUgICAgICAgIExPRzIgICAgICAgICAgICAgICAgICAgIDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDIKKyNlbmRpZgorCisjaWZkZWYgTV9MTjEwCisjIGRlZmluZSAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgTV9MTjEwCisjZWxzZQorIyBkZWZpbmUgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgIDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDIKKyNlbmRpZgorCisKKyNpZmRlZiBNX1NRUlQyCisjIGRlZmluZSAgICAgICAgU1FSVDIgICAgICAgICAgICAgICAgICAgTV9TUVJUMgorI2Vsc2UKKyMgZGVmaW5lICAgICAgICBTUVJUMiAgICAgICAgICAgICAgICAgICAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwCisjZW5kaWYKKworCisjZGVmaW5lICAgICAgICAgSEFOX1NJWkUgICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lICAgICAgICAgQ1JDMTZfUE9MWU5PTUlBTCAgICAgICAgMHg4MDA1CisgICAgCisjZGVmaW5lIE1BWF9CSVRTX1BFUl9DSEFOTkVMIDQwOTUKKyNkZWZpbmUgTUFYX0JJVFNfUEVSX0dSQU5VTEUgNzY4MAorCisvKiAiYml0X3N0cmVhbS5oIiBEZWZpbml0aW9ucyAqLworI2RlZmluZSAgICAgICAgIEJVRkZFUl9TSVpFICAgICBMQU1FX01BWE1QM0JVRkZFUgorCisjZGVmaW5lICAgICAgICAgTWluKEEsIEIpICAgICAgICgoQSkgPCAoQikgPyAoQSkgOiAoQikpCisjZGVmaW5lICAgICAgICAgTWF4KEEsIEIpICAgICAgICgoQSkgPiAoQikgPyAoQSkgOiAoQikpCisKKy8qIGxvZy9sb2cxMCBhcHByb3hpbWF0aW9ucyAqLworI2lmZGVmIFVTRV9GQVNUX0xPRworI2RlZmluZSAgICAgICAgIEZBU1RfTE9HMTAoeCkgICAgICAgKGZhc3RfbG9nMih4KSooTE9HMi9MT0cxMCkpCisjZGVmaW5lICAgICAgICAgRkFTVF9MT0coeCkgICAgICAgICAoZmFzdF9sb2cyKHgpKkxPRzIpCisjZGVmaW5lICAgICAgICAgRkFTVF9MT0cxMF9YKHgseSkgICAoZmFzdF9sb2cyKHgpKihMT0cyL0xPRzEwKih5KSkpCisjZGVmaW5lICAgICAgICAgRkFTVF9MT0dfWCh4LHkpICAgICAoZmFzdF9sb2cyKHgpKihMT0cyKih5KSkpCisjZWxzZQorI2RlZmluZSAgICAgICAgIEZBU1RfTE9HMTAoeCkgICAgICAgbG9nMTAoeCkKKyNkZWZpbmUgICAgICAgICBGQVNUX0xPRyh4KSAgICAgICAgIGxvZyh4KQorI2RlZmluZSAgICAgICAgIEZBU1RfTE9HMTBfWCh4LHkpICAgKGxvZzEwKHgpKih5KSkKKyNkZWZpbmUgICAgICAgICBGQVNUX0xPR19YKHgseSkgICAgIChsb2coeCkqKHkpKQorI2VuZGlmCisKKworICAgIHN0cnVjdCByZXBsYXlnYWluX2RhdGE7CisjaWZuZGVmIHJlcGxheWdhaW5fZGF0YV9kZWZpbmVkCisjZGVmaW5lIHJlcGxheWdhaW5fZGF0YV9kZWZpbmVkCisgICAgdHlwZWRlZiBzdHJ1Y3QgcmVwbGF5Z2Fpbl9kYXRhIHJlcGxheWdhaW5fdDsKKyNlbmRpZgorICAgIHN0cnVjdCBwbG90dGluZ19kYXRhOworI2lmbmRlZiBwbG90dGluZ19kYXRhX2RlZmluZWQKKyNkZWZpbmUgcGxvdHRpbmdfZGF0YV9kZWZpbmVkCisgICAgdHlwZWRlZiBzdHJ1Y3QgcGxvdHRpbmdfZGF0YSBwbG90dGluZ19kYXRhOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgR2xvYmFsIFR5cGUgRGVmaW5pdGlvbnMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB2b2lkICAgKmFsaWduZWQ7ICAgICAvKiBwb2ludGVyIHRvIGllLiAxMjggYml0IGFsaWduZWQgbWVtb3J5ICovCisgICAgICAgIHZvaWQgICAqcG9pbnRlcjsgICAgIC8qIHRvIHVzZSB3aXRoIG1hbGxvYy9mcmVlICovCisgICAgfSBhbGlnbmVkX3BvaW50ZXJfdDsKKworICAgIHZvaWQgICAgbWFsbG9jX2FsaWduZWQoYWxpZ25lZF9wb2ludGVyX3QgKiBwdHIsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgYnl0ZXMpOworICAgIHZvaWQgICAgZnJlZV9hbGlnbmVkKGFsaWduZWRfcG9pbnRlcl90ICogcHRyKTsKKworCisKKyAgICB0eXBlZGVmIHZvaWQgKCppdGVyYXRpb25fbG9vcF90KSAobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKiBnZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUIHBlWzJdWzJdLCBGTE9BVCBtc19yYXRpb1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlJX3BzeV9yYXRpbyByYXRpb1syXVsyXSk7CisKKworICAgIC8qICJiaXRfc3RyZWFtLmgiIFR5cGUgRGVmaW5pdGlvbnMgKi8KKworICAgIHR5cGVkZWYgc3RydWN0IGJpdF9zdHJlYW1fc3RydWMgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpidWY7ICAvKiBiaXQgc3RyZWFtIGJ1ZmZlciAqLworICAgICAgICBpbnQgICAgIGJ1Zl9zaXplOyAgICAvKiBzaXplIG9mIGJ1ZmZlciAoaW4gbnVtYmVyIG9mIGJ5dGVzKSAqLworICAgICAgICBpbnQgICAgIHRvdGJpdDsgICAgICAvKiBiaXQgY291bnRlciBvZiBiaXQgc3RyZWFtICovCisgICAgICAgIGludCAgICAgYnVmX2J5dGVfaWR4OyAvKiBwb2ludGVyIHRvIHRvcCBieXRlIGluIGJ1ZmZlciAqLworICAgICAgICBpbnQgICAgIGJ1Zl9iaXRfaWR4OyAvKiBwb2ludGVyIHRvIHRvcCBiaXQgb2YgdG9wIGJ5dGUgaW4gYnVmZmVyICovCisKKyAgICAgICAgLyogZm9ybWF0IG9mIGZpbGUgaW4gcmQgbW9kZSAoQklOQVJZL0FTQ0lJKSAqLworICAgIH0gQml0X3N0cmVhbV9zdHJ1YzsKKworCisKKyAgICAvKiB2YXJpYWJsZXMgdXNlZCBmb3IgLS1uc3BzeXR1bmUgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIC8qIHZhcmlhYmxlcyBmb3IgbnNwc3l0dW5lICovCisgICAgICAgIEZMT0FUICAgbGFzdF9lbl9zdWJzaG9ydFs0XVs5XTsKKyAgICAgICAgaW50ICAgICBsYXN0X2F0dGFja3NbNF07CisgICAgICAgIEZMT0FUICAgcGVmaXJidWZbMTldOworICAgICAgICBGTE9BVCAgIGxvbmdmYWN0W1NCTUFYX2xdOworICAgICAgICBGTE9BVCAgIHNob3J0ZmFjdFtTQk1BWF9zXTsKKworICAgICAgICAvKiBzaG9ydCBibG9jayB0dW5pbmcgKi8KKyAgICAgICAgRkxPQVQgICBhdHRhY2t0aHJlOworICAgICAgICBGTE9BVCAgIGF0dGFja3RocmVfczsKKyAgICB9IG5zUHN5X3Q7CisKKworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50ICAgICBzdW07ICAgICAgICAgLyogd2hhdCB3ZSBoYXZlIHNlZW4gc28gZmFyICovCisgICAgICAgIGludCAgICAgc2VlbjsgICAgICAgIC8qIGhvdyBtYW55IGZyYW1lcyB3ZSBoYXZlIHNlZW4gaW4gdGhpcyBjaHVuayAqLworICAgICAgICBpbnQgICAgIHdhbnQ7ICAgICAgICAvKiBob3cgbWFueSBmcmFtZXMgd2Ugd2FudCB0byBjb2xsZWN0IGludG8gb25lIGNodW5rICovCisgICAgICAgIGludCAgICAgcG9zOyAgICAgICAgIC8qIGFjdHVhbCBwb3NpdGlvbiBpbiBvdXIgYmFnICovCisgICAgICAgIGludCAgICAgc2l6ZTsgICAgICAgIC8qIHNpemUgb2Ygb3VyIGJhZyAqLworICAgICAgICBpbnQgICAgKmJhZzsgICAgICAgICAvKiBwb2ludGVyIHRvIG91ciBiYWcgKi8KKyAgICAJdW5zaWduZWQgaW50IG5WYnJOdW1GcmFtZXM7CisJdW5zaWduZWQgbG9uZyBuQnl0ZXNXcml0dGVuOworICAgICAgICAvKiBWQlIgdGFnIGRhdGEgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IFRvdGFsRnJhbWVTaXplOworICAgIH0gVkJSX3NlZWtfaW5mb190OworCisKKyAgICAvKioKKyAgICAgKiAgQVRIIHJlbGF0ZWQgc3R1ZmYsIGlmIHNvbWV0aGluZyBuZXcgQVRIIHJlbGF0ZWQgaGFzIHRvIGJlIGFkZGVkLAorICAgICAqICBwbGVhc2UgcGx1Z2cgaXQgaGVyZSBpbnRvIHRoZSBBVEhfdCBzdHJ1Y3QKKyAgICAgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludCAgICAgdXNlX2FkanVzdDsgIC8qIG1ldGhvZCBmb3IgdGhlIGF1dG8gYWRqdXN0bWVudCAgKi8KKyAgICAgICAgRkxPQVQgICBhYV9zZW5zaXRpdml0eV9wOyAvKiBmYWN0b3IgZm9yIHR1bmluZyB0aGUgKHNhbXBsZSBwb3dlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCBiZWxvdyB3aGljaCBhZGFwdGl2ZSB0aHJlc2hvbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBoZWFyaW5nIGFkanVzdG1lbnQgb2NjdXJzICovCisgICAgICAgIEZMT0FUICAgYWRqdXN0OyAgICAgIC8qIGxvd2VyaW5nIGJhc2VkIG9uIHBlYWsgdm9sdW1lLCAxID0gbm8gbG93ZXJpbmcgKi8KKyAgICAgICAgRkxPQVQgICBhZGp1c3RfbGltaXQ7IC8qIGxpbWl0IGZvciBkeW5hbWljIEFUSCBhZGp1c3QgKi8KKyAgICAgICAgRkxPQVQgICBkZWNheTsgICAgICAgLyogZGV0ZXJtaW5lZCB0byBsb3dlciB4IGRCIGVhY2ggc2Vjb25kICovCisgICAgICAgIEZMT0FUICAgZmxvb3I7ICAgICAgIC8qIGxvd2VzdCBBVEggdmFsdWUgKi8KKyAgICAgICAgRkxPQVQgICBsW1NCTUFYX2xdOyAgLyogQVRIIGZvciBzZmJzIGluIGxvbmcgYmxvY2tzICovCisgICAgICAgIEZMT0FUICAgc1tTQk1BWF9zXTsgIC8qIEFUSCBmb3Igc2ZicyBpbiBzaG9ydCBibG9ja3MgKi8KKyAgICAgICAgRkxPQVQgICBwc2ZiMjFbUFNGQjIxXTsgLyogQVRIIGZvciBwYXJ0aXRpb25uZWQgc2ZiMjEgaW4gbG9uZyBibG9ja3MgKi8KKyAgICAgICAgRkxPQVQgICBwc2ZiMTJbUFNGQjEyXTsgLyogQVRIIGZvciBwYXJ0aXRpb25uZWQgc2ZiMTIgaW4gc2hvcnQgYmxvY2tzICovCisgICAgICAgIEZMT0FUICAgY2JfbFtDQkFORFNdOyAvKiBBVEggZm9yIGxvbmcgYmxvY2sgY29udm9sdXRpb24gYmFuZHMgKi8KKyAgICAgICAgRkxPQVQgICBjYl9zW0NCQU5EU107IC8qIEFUSCBmb3Igc2hvcnQgYmxvY2sgY29udm9sdXRpb24gYmFuZHMgKi8KKyAgICAgICAgRkxPQVQgICBlcWxfd1tCTEtTSVpFIC8gMl07IC8qIGVxdWFsIGxvdWRuZXNzIHdlaWdodHMgKGJhc2VkIG9uIEFUSCkgKi8KKyAgICB9IEFUSF90OworCisgICAgLyoqCisgICAgICogIFBTWSBNb2RlbCByZWxhdGVkIHN0dWZmCisgICAgICovCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBGTE9BVCAgIG1hc2tfYWRqdXN0OyAvKiB0aGUgZGJRIHN0dWZmICovCisgICAgICAgIEZMT0FUICAgbWFza19hZGp1c3Rfc2hvcnQ7IC8qIHRoZSBkYlEgc3R1ZmYgKi8gICAgICAgIAorICAgICAgICAvKiBhdCB0cmFuc2l0aW9uIGZyb20gb25lIHNjYWxlZmFjdG9yIGJhbmQgdG8gbmV4dCAqLworICAgICAgICBGTE9BVCAgIGJvX2xfd2VpZ2h0W1NCTUFYX2xdOyAvKiBiYW5kIHdlaWdodCBsb25nIHNjYWxlZmFjdG9yIGJhbmRzICovCisgICAgICAgIEZMT0FUICAgYm9fc193ZWlnaHRbU0JNQVhfc107IC8qIGJhbmQgd2VpZ2h0IHNob3J0IHNjYWxlZmFjdG9yIGJhbmRzICovCisgICAgfSBQU1lfdDsKKworCisjZGVmaW5lIE1BWF9DSEFOTkVMUyAgMgorCisKKworICAgIHN0cnVjdCBsYW1lX2ludGVybmFsX2ZsYWdzIHsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogaW50ZXJuYWwgdmFyaWFibGVzIE5PVCBzZXQgYnkgY2FsbGluZyBwcm9ncmFtLCBhbmQgc2hvdWxkIG5vdCBiZSAqCisgICAqIG1vZGlmaWVkIGJ5IHRoZSBjYWxsaW5nIHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU29tZSByZW1hcmtzIHRvIHRoZSBDbGFzc19JRCBmaWVsZDoKKyAgICAgICAgICogVGhlIENsYXNzIElEIGlzIGFuIElkZW50aWZpZXIgZm9yIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdC4KKyAgICAgICAgICogSXQgaXMgdmVyeSB1bmxpa2VseSB0aGF0IGEgcG9pbnRlciB0byBsYW1lX2dsb2JhbF9mbGFncyBoYXMgdGhlIHNhbWUgMzIgYml0cworICAgICAgICAgKiBpbiBpdCdzIHN0cnVjdHVyZSAobGFyZ2UgYW5kIG90aGVyIHNwZWNpYWwgcHJvcGVydGllcywgZm9yIGluc3RhbmNlIHByaW1lKS4KKyAgICAgICAgICoKKyAgICAgICAgICogVG8gdGVzdCB0aGF0IHRoZSBzdHJ1Y3R1cmUgaXMgcmlnaHQgYW5kIGluaXRpYWxpemVkLCB1c2U6CisgICAgICAgICAqICAgICBpZiAoIGdmYyAtPiBDbGFzc19JRCA9PSBMQU1FX0lEICkgLi4uCisgICAgICAgICAqIE90aGVyIHJlbWFyazoKKyAgICAgICAgICogICAgIElmIHlvdSBzZXQgYSBmbGFnIHRvIDAgZm9yIHVuaW5pdCBkYXRhIGFuZCAxIGZvciBpbml0IGRhdGEsIHRoZSByaWdodCB0ZXN0CisgICAgICAgICAqICAgICBzaG91bGQgYmUgImlmIChmbGFnID09IDEpIiBhbmQgTk9UICJpZiAoZmxhZykiLiBVbmludGVuZGVkIG1vZGlmaWNhdGlvbgorICAgICAgICAgKiAgICAgb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgb3RoZXJ3aXNlIG1pc2ludGVycHJldGVkIGFzIGFuIGluaXQuCisgICAgICAgICAqLworIyAgZGVmaW5lICBMQU1FX0lEICAgMHhGRkY4OEUzQgorICAgICAgICB1bnNpZ25lZCBsb25nIENsYXNzX0lEOworCisgICAgICAgIGludCAgICAgbGFtZV9lbmNvZGVfZnJhbWVfaW5pdDsKKyAgICAgICAgaW50ICAgICBpdGVyYXRpb25faW5pdF9pbml0OworICAgICAgICBpbnQgICAgIGZpbGxfYnVmZmVyX3Jlc2FtcGxlX2luaXQ7CisKKyNpZm5kZWYgIE1GU0laRQorIyBkZWZpbmUgTUZTSVpFICAoIDMqMTE1MiArIEVOQ0RFTEFZIC0gTURDVERFTEFZICkKKyNlbmRpZgorICAgICAgICBzYW1wbGVfdCBtZmJ1ZlsyXVtNRlNJWkVdOworCisKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHZvaWQgICAgKCptc2dmKSAoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKKyAgICAgICAgICAgIHZvaWQgICAgKCpkZWJ1Z2YpIChjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworICAgICAgICAgICAgdm9pZCAgICAoKmVycm9yZikgKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisgICAgICAgIH0gcmVwb3J0OworCisgICAgICAgIGludCAgICAgbW9kZV9ncjsgICAgIC8qIGdyYW51bGVzIHBlciBmcmFtZSAqLworICAgICAgICBpbnQgICAgIGNoYW5uZWxzX2luOyAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGlucHV0IGRhdGEgc3RyZWFtIChQQ00gb3IgZGVjb2RlZCBQQ00pICovCisgICAgICAgIGludCAgICAgY2hhbm5lbHNfb3V0OyAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIG91dHB1dCBkYXRhIHN0cmVhbSAobm90IHVzZWQgZm9yIGRlY29kaW5nKSAqLworICAgICAgICBkb3VibGUgIHJlc2FtcGxlX3JhdGlvOyAvKiBpbnB1dF9zYW1wX3JhdGUvb3V0cHV0X3NhbXBfcmF0ZSAqLworCisgICAgICAgIGludCAgICAgbWZfc2FtcGxlc190b19lbmNvZGU7CisgICAgICAgIGludCAgICAgbWZfc2l6ZTsKKyAgICAgICAgaW50ICAgICBWQlJfbWluX2JpdHJhdGU7IC8qIG1pbiBiaXRyYXRlIGluZGV4ICovCisgICAgICAgIGludCAgICAgVkJSX21heF9iaXRyYXRlOyAvKiBtYXggYml0cmF0ZSBpbmRleCAqLworICAgICAgICBpbnQgICAgIGJpdHJhdGVfaW5kZXg7CisgICAgICAgIGludCAgICAgc2FtcGxlcmF0ZV9pbmRleDsKKyAgICAgICAgaW50ICAgICBtb2RlX2V4dDsKKworCisgICAgICAgIC8qIGxvd3Bhc3MgYW5kIGhpZ2hwYXNzIGZpbHRlciBjb250cm9sICovCisgICAgICAgIEZMT0FUICAgbG93cGFzczEsIGxvd3Bhc3MyOyAvKiBub3JtYWxpemVkIGZyZXF1ZW5jeSBib3VuZHMgb2YgcGFzc2JhbmQgKi8KKyAgICAgICAgRkxPQVQgICBoaWdocGFzczEsIGhpZ2hwYXNzMjsgLyogbm9ybWFsaXplZCBmcmVxdWVuY3kgYm91bmRzIG9mIHBhc3NiYW5kICovCisKKyAgICAgICAgaW50ICAgICBub2lzZV9zaGFwaW5nOyAvKiAwID0gbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBJU08gQUFDIG1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IGFsbG93IHNjYWxlZmFjX3NlbGVjdD0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgaW50ICAgICBub2lzZV9zaGFwaW5nX2FtcDsgLyogIDAgPSBJU08gbW9kZWw6IGFtcGxpZnkgYWxsIGRpc3RvcnRlZCBiYW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gYW1wbGlmeSB3aXRoaW4gNTAlIG9mIG1heCAob24gZGIgc2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSBhbXBsaWZ5IG9ubHkgbW9zdCBkaXN0b3J0ZWQgYmFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gbWV0aG9kIDEgYW5kIHJlZmluZSB3aXRoIG1ldGhvZCAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpbnQgICAgIHN1YnN0ZXBfc2hhcGluZzsgLyogMCA9IG5vIHN1YnN0ZXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSB1c2Ugc3Vic3RlcCBzaGFwaW5nIGF0IGxhc3Qgc3RlcChWQlIgb25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgaW1wbGVtZW50ZWQgeWV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IHVzZSBzdWJzdGVwIGluc2lkZSBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gdXNlIHN1YnN0ZXAgaW5zaWRlIGxvb3AgYW5kIGxhc3Qgc3RlcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgaW50ICAgICBwc3ltb2RlbDsgICAgLyogMSA9IGdwc3ljaG8uIDAgPSBub25lICovCisgICAgICAgIGludCAgICAgbm9pc2Vfc2hhcGluZ19zdG9wOyAvKiAwID0gc3RvcCBhdCBvdmVyPTAsIGFsbCBzY2FsZWZhY3MgYW1wbGlmaWVkIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNjYWxlZmFjIGhhcyByZWFjaGVkIG1heCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IHN0b3Agd2hlbiBhbGwgc2NhbGVmYWNzIGFtcGxpZmllZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzY2FsZWZhYyBoYXMgcmVhY2hlZCBtYXggdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSBzdG9wIHdoZW4gYWxsIHNjYWxlZmFjcyBhbXBsaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIGludCAgICAgc3ViYmxvY2tfZ2FpbjsgLyogIDAgPSBubywgMSA9IHllcyAqLworICAgICAgICBpbnQgICAgIHVzZV9iZXN0X2h1ZmZtYW47IC8qIDAgPSBuby4gIDE9b3V0c2lkZSBsb29wICAyPWluc2lkZSBsb29wKHNsb3cpICovCisKKyAgICAgICAgaW50ICAgICBmdWxsX291dGVyX2xvb3A7IC8qIDAgPSBzdG9wIGVhcmx5IGFmdGVyIDAgZGlzdG9ydGlvbiBmb3VuZC4gMSA9IGZ1bGwgc2VhcmNoICovCisKKworICAgICAgICAvKiB2YXJpYWJsZXMgdXNlZCBieSBsYW1lLmMgKi8KKyAgICAgICAgQml0X3N0cmVhbV9zdHJ1YyBiczsKKyAgICAgICAgSUlJX3NpZGVfaW5mb190IGwzX3NpZGU7CisgICAgICAgIEZMT0FUICAgbXNfcmF0aW9bMl07CisKKyAgICAgICAgLyogdXNlZCBmb3IgcGFkZGluZyAqLworICAgICAgICBpbnQgICAgIHBhZGRpbmc7ICAgICAvKiBwYWRkaW5nIGZvciB0aGUgY3VycmVudCBmcmFtZT8gKi8KKyAgICAgICAgaW50ICAgICBmcmFjX1NwRjsKKyAgICAgICAgaW50ICAgICBzbG90X2xhZzsKKworCisgICAgICAgIC8qIG9wdGlvbmFsIElEMyB0YWdzLCB1c2VkIGluIGlkM3RhZy5jICAqLworICAgICAgICBzdHJ1Y3QgaWQzdGFnX3NwZWMgdGFnX3NwZWM7CisgICAgICAgIHVpbnQxNl90IG5NdXNpY0NSQzsKKworCisgICAgICAgIC8qIHZhcmlhYmxlcyB1c2VkIGJ5IHF1YW50aXplLmMgKi8KKyAgICAgICAgaW50ICAgICBPbGRWYWx1ZVsyXTsKKyAgICAgICAgaW50ICAgICBDdXJyZW50U3RlcFsyXTsKKworICAgICAgICBGTE9BVCAgIG1hc2tpbmdfbG93ZXI7CisgICAgICAgIGNoYXIgICAgYnZfc2NmWzU3Nl07CisgICAgICAgIGludCAgICAgcHNldWRvaGFsZltTRkJNQVhdOworCisgICAgICAgIGludCAgICAgc2ZiMjFfZXh0cmE7IC8qIHdpbGwgYmUgc2V0IGluIGxhbWVfaW5pdF9wYXJhbXMgKi8KKworICAgICAgICAvKiB2YXJpYWJsZXMgdXNlZCBieSB1dGlsLmMgKi8KKyAgICAgICAgLyogQlBDID0gbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyIGNvbnZvbHV0aW9uIHdpbmRvd3MgdG8gcHJlY29tcHV0ZSAqLworI2RlZmluZSBCUEMgMzIwCisgICAgICAgIHNhbXBsZV90ICppbmJ1Zl9vbGRbMl07CisgICAgICAgIHNhbXBsZV90ICpibGFja2ZpbHRbMiAqIEJQQyArIDFdOworICAgICAgICBkb3VibGUgIGl0aW1lWzJdOworICAgICAgICBpbnQgICAgIHNpZGVpbmZvX2xlbjsKKworICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIG5ld21kY3QuYyAqLworICAgICAgICBGTE9BVCAgIHNiX3NhbXBsZVsyXVsyXVsxOF1bU0JMSU1JVF07CisgICAgICAgIEZMT0FUICAgYW1wX2ZpbHRlclszMl07CisKKyAgICAgICAgLyogdmFyaWFibGVzIGZvciBiaXRzdHJlYW0uYyAqLworICAgICAgICAvKiBtcGVnMTogYnVmZmVyPTUxMSBieXRlcyAgc21hbGxlc3QgZnJhbWU6IDk2LTM4KHNpZGVpbmZvKT01OAorICAgICAgICAgKiBtYXggbnVtYmVyIG9mIGZyYW1lcyBpbiByZXNlcnZvaXI6ICA4CisgICAgICAgICAqIG1wZWcyOiBidWZmZXI9MjU1IGJ5dGVzLiAgc21hbGxlc3QgZnJhbWU6IDI0LTIzYnl0ZXM9MQorICAgICAgICAgKiB3aXRoIFZCUiwgaWYgeW91IGFyZSBlbmNvZGluZyBhbGwgc2lsZW5jZSwgaXQgaXMgcG9zc2libGUgdG8KKyAgICAgICAgICogaGF2ZSA4a2JzLzI0a2h6IGZyYW1lcyB3aXRoIDFieXRlIG9mIGRhdGEgZWFjaCwgd2hpY2ggbWVhbnMgd2UgbmVlZAorICAgICAgICAgKiB0byBidWZmZXIgdXAgdG8gMjU1IGhlYWRlcnMhICovCisgICAgICAgIC8qIGFsc28sIG1heF9oZWFkZXJfYnVmIGhhcyB0byBiZSBhIHBvd2VyIG9mIHR3byAqLworI2RlZmluZSBNQVhfSEVBREVSX0JVRiAyNTYKKyNkZWZpbmUgTUFYX0hFQURFUl9MRU4gNDAgICAgLyogbWF4IHNpemUgb2YgaGVhZGVyIGlzIDM4ICovCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBpbnQgICAgIHdyaXRlX3RpbWluZzsKKyAgICAgICAgICAgIGludCAgICAgcHRyOworICAgICAgICAgICAgY2hhciAgICBidWZbTUFYX0hFQURFUl9MRU5dOworICAgICAgICB9IGhlYWRlcltNQVhfSEVBREVSX0JVRl07CisKKyAgICAgICAgaW50ICAgICBoX3B0cjsKKyAgICAgICAgaW50ICAgICB3X3B0cjsKKyAgICAgICAgaW50ICAgICBhbmNpbGxhcnlfZmxhZzsKKworICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJlc2Vydm9pci5jICovCisgICAgICAgIGludCAgICAgUmVzdlNpemU7ICAgIC8qIGluIGJpdHMgKi8KKyAgICAgICAgaW50ICAgICBSZXN2TWF4OyAgICAgLyogaW4gYml0cyAqLworCisgICAgICAgIHNjYWxlZmFjX3N0cnVjdCBzY2FsZWZhY19iYW5kOworCisgICAgICAgIC8qIERBVEEgRlJPTSBQU1lNT0RFTC5DICovCisvKiBUaGUgc3RhdGljIHZhcmlhYmxlcyAiciIsICJwaGlfc2F2IiwgIm5ldyIsICJvbGQiIGFuZCAib2xkZXN0IiBoYXZlICAgICovCisvKiB0byBiZSByZW1lbWJlcmVkIGZvciB0aGUgdW5wcmVkaWN0YWJpbGl0eSBtZWFzdXJlLiAgRm9yICJyIiBhbmQgICAgICAgICovCisvKiAicGhpX3NhdiIsIHRoZSBmaXJzdCBpbmRleCBmcm9tIHRoZSBsZWZ0IGlzIHRoZSBjaGFubmVsIHNlbGVjdCBhbmQgICAgICovCisvKiB0aGUgc2Vjb25kIGluZGV4IGlzIHRoZSAiYWdlIiBvZiB0aGUgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIEZMT0FUICAgbWludmFsX2xbQ0JBTkRTXTsKKyAgICAgICAgRkxPQVQgICBtaW52YWxfc1tDQkFORFNdOworICAgICAgICBGTE9BVCAgIG5iXzFbNF1bQ0JBTkRTXSwgbmJfMls0XVtDQkFORFNdOworICAgICAgICBGTE9BVCAgIG5iX3MxWzRdW0NCQU5EU10sIG5iX3MyWzRdW0NCQU5EU107CisgICAgICAgIEZMT0FUICAqczNfc3M7CisgICAgICAgIEZMT0FUICAqczNfbGw7CisgICAgICAgIEZMT0FUICAgZGVjYXk7CisKKyAgICAgICAgSUlJX3BzeV94bWluIHRobVs0XTsKKyAgICAgICAgSUlJX3BzeV94bWluIGVuWzRdOworCisgICAgICAgIC8qIGZmdCBhbmQgZW5lcmd5IGNhbGN1bGF0aW9uICAgICovCisgICAgICAgIEZMT0FUICAgdG90X2VuZXJbNF07CisKKyAgICAgICAgLyogbG91ZG5lc3MgY2FsY3VsYXRpb24gKGZvciBhZGFwdGl2ZSB0aHJlc2hvbGQgb2YgaGVhcmluZykgKi8KKyAgICAgICAgRkxPQVQgICBsb3VkbmVzc19zcVsyXVsyXTsgLyogbG91ZG5lc3NeMiBhcHByb3guIHBlciBncmFudWxlIGFuZCBjaGFubmVsICovCisgICAgICAgIEZMT0FUICAgbG91ZG5lc3Nfc3Ffc2F2ZVsyXTsgLyogYWNjb3VudCBmb3IgZ3JhbnVsZSBkZWxheSBvZiBMM3BzeWNob19hbmFsICovCisKKworICAgICAgICAvKiBTY2FsZSBGYWN0b3IgQmFuZHMgICAgKi8KKyAgICAgICAgRkxPQVQgICBtbGRfbFtTQk1BWF9sXSwgbWxkX3NbU0JNQVhfc107CisgICAgICAgIGludCAgICAgYm1fbFtTQk1BWF9sXSwgYm9fbFtTQk1BWF9sXTsKKyAgICAgICAgaW50ICAgICBibV9zW1NCTUFYX3NdLCBib19zW1NCTUFYX3NdOworICAgICAgICBpbnQgICAgIG5wYXJ0X2wsIG5wYXJ0X3M7CisKKyAgICAgICAgaW50ICAgICBzM2luZFtDQkFORFNdWzJdOworICAgICAgICBpbnQgICAgIHMzaW5kX3NbQ0JBTkRTXVsyXTsKKworICAgICAgICBpbnQgICAgIG51bWxpbmVzX3NbQ0JBTkRTXTsKKyAgICAgICAgaW50ICAgICBudW1saW5lc19sW0NCQU5EU107CisgICAgICAgIEZMT0FUICAgcm51bWxpbmVzX2xbQ0JBTkRTXTsKKyAgICAgICAgRkxPQVQgICBtbGRfY2JfbFtDQkFORFNdLCBtbGRfY2Jfc1tDQkFORFNdOworICAgICAgICBpbnQgICAgIG51bWxpbmVzX3NfbnVtMTsKKyAgICAgICAgaW50ICAgICBudW1saW5lc19sX251bTE7CisKKyAgICAgICAgLyogcmF0aW9zICAqLworICAgICAgICBGTE9BVCAgIHBlWzRdOworICAgICAgICBGTE9BVCAgIG1zX3JhdGlvX3Nfb2xkLCBtc19yYXRpb19sX29sZDsKKyAgICAgICAgRkxPQVQgICBtc19lbmVyX3JhdGlvX29sZDsKKworICAgICAgICAvKiBibG9jayB0eXBlICovCisgICAgICAgIGludCAgICAgYmxvY2t0eXBlX29sZFsyXTsKKworICAgICAgICAvKiBDUFUgZmVhdHVyZXMgKi8KKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBNTVg6MTsgLyogUGVudGl1bSBNTVgsIFBlbnRpdW0gSUkuLi5JViwgSzYsIEs2LTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEs2LUlJSSwgQXRobG9uICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQU1EXzNETm93OjE7IC8qIEs2LTIsIEs2LUlJSSwgQXRobG9uICAgICAgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBTU0U6MTsgLyogUGVudGl1bSBJSUksIFBlbnRpdW0gNCAgICAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IFNTRTI6MTsgLyogUGVudGl1bSA0LCBLOCAgICAgICAgICAgICAqLworICAgICAgICB9IENQVV9mZWF0dXJlczsKKworICAgICAgICAvKiBmdW5jdGlvbnMgdG8gcmVwbGFjZSB3aXRoIENQVSBmZWF0dXJlIG9wdGltaXplZCB2ZXJzaW9ucyBpbiB0YWtlaGlyby5jICovCisgICAgICAgIGludCAgICAgKCpjaG9vc2VfdGFibGUpIChjb25zdCBpbnQgKml4LCBjb25zdCBpbnQgKmNvbnN0IGVuZCwgaW50ICpjb25zdCBzKTsKKyAgICAgICAgdm9pZCAgICAoKmZmdF9maHQpIChGTE9BVCAqLCBpbnQpOworICAgICAgICB2b2lkICAgICgqaW5pdF94cnBvd19jb3JlKSAoZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvLCBGTE9BVCB4cnBvd1s1NzZdLCBpbnQgdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCAqIHN1bSk7CisKKworCisgICAgICAgIG5zUHN5X3QgbnNQc3k7ICAgICAgIC8qIHZhcmlhYmxlcyB1c2VkIGZvciAtLW5zcHN5dHVuZSAqLworCisgICAgICAgIFZCUl9zZWVrX2luZm9fdCBWQlJfc2Vla190YWJsZTsgLyogdXNlZCBmb3IgWGluZyBWQlIgaGVhZGVyICovCisKKyAgICAgICAgQVRIX3QgICpBVEg7ICAgICAgICAgLyogYWxsIEFUSCByZWxhdGVkIHN0dWZmICovCisgICAgICAgIFBTWV90ICAqUFNZOworCisgICAgICAgIGludCAgICAgbm9nYXBfdG90YWw7CisgICAgICAgIGludCAgICAgbm9nYXBfY3VycmVudDsKKworCisgICAgICAgIC8qIFJlcGxheUdhaW4gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGRlY29kZV9vbl90aGVfZmx5OjE7CisgICAgICAgIHVuc2lnbmVkIGludCBmaW5kUmVwbGF5R2FpbjoxOworICAgICAgICB1bnNpZ25lZCBpbnQgZmluZFBlYWtTYW1wbGU6MTsKKyAgICAgICAgc2FtcGxlX3QgUGVha1NhbXBsZTsKKyAgICAgICAgaW50ICAgICBSYWRpb0dhaW47CisgICAgICAgIGludCAgICAgQXVkaW9waGlsZUdhaW47CisgICAgICAgIHJlcGxheWdhaW5fdCAqcmdkYXRhOworCisgICAgICAgIGludCAgICAgbm9jbGlwR2FpbkNoYW5nZTsgLyogZ2FpbiBjaGFuZ2UgcmVxdWlyZWQgZm9yIHByZXZlbnRpbmcgY2xpcHBpbmcgKi8KKyAgICAgICAgRkxPQVQgICBub2NsaXBTY2FsZTsgLyogdXNlci1zcGVjaWZpZWQgc2NhbGUgZmFjdG9yIHJlcXVpcmVkIGZvciBwcmV2ZW50aW5nIGNsaXBwaW5nICovCisKKworICAgICAgICAvKiBzaW1wbGUgc3RhdGlzdGljcyAqLworICAgICAgICBpbnQgICAgIGJpdHJhdGVfc3RlcmVvTW9kZV9IaXN0WzE2XVs0ICsgMV07CisgICAgICAgIGludCAgICAgYml0cmF0ZV9ibG9ja1R5cGVfSGlzdFsxNl1bNCArIDEgKyAxXTsgLypub3JtL3N0YXJ0L3Nob3J0L3N0b3AvbWl4ZWQoc2hvcnQpL3N1bSAqLworCisgICAgICAgIC8qIHVzZWQgYnkgdGhlIGZyYW1lIGFuYWx5emVyICovCisgICAgICAgIHBsb3R0aW5nX2RhdGEgKnBpbmZvOworICAgICAgICBoaXBfdCBoaXA7CisKKyAgICAgICAgaW50ICAgICBpbl9idWZmZXJfbnNhbXBsZXM7CisgICAgICAgIHNhbXBsZV90ICppbl9idWZmZXJfMDsKKyAgICAgICAgc2FtcGxlX3QgKmluX2J1ZmZlcl8xOworCisgICAgICAgIGl0ZXJhdGlvbl9sb29wX3QgaXRlcmF0aW9uX2xvb3A7CisgICAgfTsKKworI2lmbmRlZiBsYW1lX2ludGVybmFsX2ZsYWdzX2RlZmluZWQKKyNkZWZpbmUgbGFtZV9pbnRlcm5hbF9mbGFnc19kZWZpbmVkCisgICAgdHlwZWRlZiBzdHJ1Y3QgbGFtZV9pbnRlcm5hbF9mbGFncyBsYW1lX2ludGVybmFsX2ZsYWdzOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlIERlY2xhcmF0aW9ucworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdm9pZCAgICBmcmVlZ2ZjKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBjb25zdCBnZmMpOworICAgIHZvaWQgICAgZnJlZV9pZDN0YWcobGFtZV9pbnRlcm5hbF9mbGFncyAqIGNvbnN0IGdmYyk7CisgICAgZXh0ZXJuIGludCBCaXRyYXRlSW5kZXgoaW50LCBpbnQsIGludCk7CisgICAgZXh0ZXJuIGludCBGaW5kTmVhcmVzdEJpdHJhdGUoaW50LCBpbnQsIGludCk7CisgICAgZXh0ZXJuIGludCBtYXAyTVAzRnJlcXVlbmN5KGludCBmcmVxKTsKKyAgICBleHRlcm4gaW50IFNtcEZycUluZGV4KGludCwgaW50ICpjb25zdCk7CisgICAgZXh0ZXJuIGludCBuZWFyZXN0Qml0cmF0ZUZ1bGxJbmRleChjb25zdCBpbnQgYnJhdGUpOworICAgIGV4dGVybiBGTE9BVCBBVEhmb3JtdWxhKEZMT0FUIGZyZXEsIGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnApOworICAgIGV4dGVybiBGTE9BVCBmcmVxMmJhcmsoRkxPQVQgZnJlcSk7CisgICAgZXh0ZXJuIEZMT0FUIGZyZXEyY2J3KEZMT0FUIGZyZXEpOworICAgIHZvaWQgICAgZGlzYWJsZV9GUEUodm9pZCk7CisKKy8qIGxvZy9sb2cxMCBhcHByb3hpbWF0aW9ucyAqLworICAgIGV4dGVybiB2b2lkIGluaXRfbG9nX3RhYmxlKHZvaWQpOworICAgIGV4dGVybiBpZWVlNzU0X2Zsb2F0MzJfdCBmYXN0X2xvZzIoaWVlZTc1NF9mbG9hdDMyX3QgeCk7CisKKworICAgIHZvaWQgICAgZmlsbF9idWZmZXIobGFtZV9nbG9iYWxfZmxhZ3MgY29uc3QgKmdmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV90ICogbWZidWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfdCBjb25zdCAqaW5fYnVmZmVyWzJdLCBpbnQgbnNhbXBsZXMsIGludCAqbl9pbiwgaW50ICpuX291dCk7CisKKyAgICBpbnQgICAgIGZpbGxfYnVmZmVyX3Jlc2FtcGxlKGxhbWVfZ2xvYmFsX2ZsYWdzIGNvbnN0ICpnZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfdCAqIG91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNpcmVkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV90IGNvbnN0ICppbmJ1ZiwgaW50IGxlbiwgaW50ICpudW1fdXNlZCwgaW50IGNoYW5uZWxzKTsKKworLyogc2FtZSBhcyBoaXBfZGVjb2RlMSAobG9vayBpbiBsYW1lLmgpLCBidXQgcmV0dXJucworICAgdW5jbGlwcGVkIHJhdyBmbG9hdGluZy1wb2ludCBzYW1wbGVzLiBJdCBpcyBkZWNsYXJlZAorICAgaGVyZSwgbm90IGluIGxhbWUuaCwgYmVjYXVzZSBpdCByZXR1cm5zIExBTUUncworICAgaW50ZXJuYWwgdHlwZSBzYW1wbGVfdC4gTm8gbW9yZSB0aGFuIDExNTIgc2FtcGxlcworICAgcGVyIGNoYW5uZWwgYXJlIGFsbG93ZWQuICovCisgICAgaW50ICAgICBoaXBfZGVjb2RlMV91bmNsaXBwZWQoaGlwX3QgaGlwLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgc2FtcGxlX3QgcGNtX2xbXSwgc2FtcGxlX3QgcGNtX3JbXSk7CisKKworICAgIGV4dGVybiBpbnQgaGFzX01NWCh2b2lkKTsKKyAgICBleHRlcm4gaW50IGhhc18zRE5vdyh2b2lkKTsKKyAgICBleHRlcm4gaW50IGhhc19TU0Uodm9pZCk7CisgICAgZXh0ZXJuIGludCBoYXNfU1NFMih2b2lkKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgTWFjcm9zIGFib3V0IE1lc3NhZ2UgUHJpbnRpbmcgYW5kIEV4aXQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGV4dGVybiB2b2lkIGxhbWVfZXJyb3JmKGNvbnN0IGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyAgICBleHRlcm4gdm9pZCBsYW1lX2RlYnVnZihjb25zdCBsYW1lX2ludGVybmFsX2ZsYWdzICogZ2ZjLCBjb25zdCBjaGFyICosIC4uLik7CisgICAgZXh0ZXJuIHZvaWQgbGFtZV9tc2dmKGNvbnN0IGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyNkZWZpbmUgREVCVUdGICBsYW1lX2RlYnVnZgorI2RlZmluZSBFUlJPUkYgIGxhbWVfZXJyb3JmCisjZGVmaW5lIE1TR0YgICAgbGFtZV9tc2dmCisKKyAgICBleHRlcm4gdm9pZCBoaXBfc2V0X3BpbmZvKGhpcF90IGhpcCwgcGxvdHRpbmdfZGF0YSogcGluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAvKiBMQU1FX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS92YnJxdWFudGl6ZS5jIGIvbGlibXAzbGFtZS92YnJxdWFudGl6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYWNlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3ZicnF1YW50aXplLmMKQEAgLTAsMCArMSwxNTkyIEBACisvKgorICoJTVAzIHF1YW50aXphdGlvbgorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OS0yMDAwIE1hcmsgVGF5bG9yCisgKglDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBSb2JlcnQgSGVnZW1hbm4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogJElkOiB2YnJxdWFudGl6ZS5jLHYgMS4xMzIuMi4xIDIwMDgvMDgvMDUgMTQ6MTY6MDcgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImVuY29kZXIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAidmJycXVhbnRpemUuaCIKKyNpbmNsdWRlICJxdWFudGl6ZV9wdnQuaCIKKworCisKKworc3RydWN0IGFsZ29fczsKK3R5cGVkZWYgc3RydWN0IGFsZ29fcyBhbGdvX3Q7CisKK3R5cGVkZWYgdm9pZCAoKmFsbG9jX3NmX2YpIChjb25zdCBhbGdvX3QgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBpbnQpOworCitzdHJ1Y3QgYWxnb19zIHsKKyAgICBhbGxvY19zZl9mIGFsbG9jOworICAgIGNvbnN0IEZMT0FUICp4cjM0b3JpZzsKKyAgICBsYW1lX2ludGVybmFsX2ZsYWdzICpnZmM7CisgICAgZ3JfaW5mbyAqY29kX2luZm87CisgICAgaW50ICAgICBtaW5nYWluX2w7CisgICAgaW50ICAgICBtaW5nYWluX3NbM107Cit9OworCisKKworLyogIFJlbWFya3Mgb24gb3B0aW1pemluZyBjb21waWxlcnM6CisgKgorICogIHRoZSBNU1ZDIGNvbXBpbGVyIG1heSBnZXQgaW50byBhbGlhc2luZyBwcm9ibGVtcyB3aGVuIGFjY2Vzc2luZworICogIG1lbW9yeSB0aHJvdWdoIHRoZSBmaV91bmlvbi4gZGVjbGFyaW5nIGl0IHZvbGF0aWxlIGRvZXMgdGhlIHRyaWNrIGhlcmUKKyAqCisgKiAgdGhlIGNhbGNfc2ZiX25vaXNlXyogZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCBiZWNhdXNlIHRoZSBpbnRlbCBjb21waWxlcgorICogIG9wdGltaXplZCBleGVjdXRlYWJsZXMgd29uJ3Qgd29yayBhcyBleHBlY3RlZCBhbnltb3JlCisgKi8KKworI2lmZGVmIF9NU0NfVkVSCisjICBkZWZpbmUgVk9MQVRJTEUgdm9sYXRpbGUKKyNlbHNlCisjICBkZWZpbmUgVk9MQVRJTEUKKyNlbmRpZgorCit0eXBlZGVmIFZPTEFUSUxFIHVuaW9uIHsKKyAgICBmbG9hdCAgIGY7CisgICAgaW50ICAgICBpOworfSBmaV91bmlvbjsKKworCisKKyNkZWZpbmUgRE9VQkxFWCBkb3VibGUKKworI2RlZmluZSBNQUdJQ19GTE9BVF9kZWYgKDY1NTM2KigxMjgpKQorI2RlZmluZSBNQUdJQ19JTlRfZGVmICAgIDB4NGIwMDAwMDAKKworI2lmZGVmIFRBS0VISVJPX0lFRUU3NTRfSEFDSworIyAgZGVmaW5lIFJPVU5ERkFDX2RlZiAtMC4wOTQ2ZgorI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFhSUE9XX0ZUT0kgaXMgYSBtYWNybyB0byBjb252ZXJ0IGZsb2F0cyB0byBpbnRzLgorICogaWYgWFJQT1dfRlRPSSh4KSA9IG5lYXJlc3RfaW50KHgpLCB0aGVuIFFVQU5URkFDKHgpPWFkajQzYXNtW3hdCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRGQUM9IC0wLjA5NDYKKyAqCisgKiBpZiBYUlBPV19GVE9JKHgpID0gZmxvb3IoeCksIHRoZW4gUVVBTlRGQUMoeCk9YXNqNDNbeF0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1VOREZBQz0wLjQwNTQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjICBkZWZpbmUgUVVBTlRGQUMocngpICBhZGo0M1tyeF0KKyMgIGRlZmluZSBST1VOREZBQ19kZWYgMC40MDU0ZgorIyAgZGVmaW5lIFhSUE9XX0ZUT0koc3JjLGRlc3QpICgoZGVzdCkgPSAoaW50KShzcmMpKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY29uc3QgTUFHSUNfSU5UID0gTUFHSUNfSU5UX2RlZjsKKyNpZm5kZWYgVEFLRUhJUk9fSUVFRTc1NF9IQUNLCitzdGF0aWMgRE9VQkxFWCBjb25zdCBST1VOREZBQyA9IFJPVU5ERkFDX2RlZjsKKyNlbmRpZgorc3RhdGljIERPVUJMRVggY29uc3QgTUFHSUNfRkxPQVQgPSBNQUdJQ19GTE9BVF9kZWY7CisKKworCisKK3N0YXRpYyAgRkxPQVQKK21heF94MzQoY29uc3QgRkxPQVQgKiB4cjM0LCB1bnNpZ25lZCBpbnQgYncpCit7CisgICAgRkxPQVQgICB4ZnNmID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaiA9IGJ3ID4+IDE7CisgICAgdW5zaWduZWQgaW50IGNvbnN0IHJlbWFpbmluZyA9IChqICYgMHgwMXUpOworCisgICAgZm9yIChqID4+PSAxOyBqID4gMDsgLS1qKSB7CisgICAgICAgIGlmICh4ZnNmIDwgeHIzNFswXSkgeworICAgICAgICAgICAgeGZzZiA9IHhyMzRbMF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhmc2YgPCB4cjM0WzFdKSB7CisgICAgICAgICAgICB4ZnNmID0geHIzNFsxXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeGZzZiA8IHhyMzRbMl0pIHsKKyAgICAgICAgICAgIHhmc2YgPSB4cjM0WzJdOworICAgICAgICB9CisgICAgICAgIGlmICh4ZnNmIDwgeHIzNFszXSkgeworICAgICAgICAgICAgeGZzZiA9IHhyMzRbM107CisgICAgICAgIH0KKyAgICAgICAgeHIzNCArPSA0OworICAgIH0KKyAgICBpZiAocmVtYWluaW5nKSB7CisgICAgICAgIGlmICh4ZnNmIDwgeHIzNFswXSkgeworICAgICAgICAgICAgeGZzZiA9IHhyMzRbMF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhmc2YgPCB4cjM0WzFdKSB7CisgICAgICAgICAgICB4ZnNmID0geHIzNFsxXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4geGZzZjsKK30KKworCisKK3N0YXRpYyAgdWludDhfdAorZmluZF9sb3dlc3Rfc2NhbGVmYWMoY29uc3QgRkxPQVQgeHIzNCkKK3sKKyAgICB1aW50OF90IHNmX29rID0gMjU1OworICAgIHVpbnQ4X3Qgc2YgPSAxMjgsIGRlbHNmID0gNjQ7CisgICAgdWludDhfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgRkxPQVQgY29uc3QgeGZzZiA9IGlwb3cyMFtzZl0gKiB4cjM0OworICAgICAgICBpZiAoeGZzZiA8PSBJWE1BWF9WQUwpIHsKKyAgICAgICAgICAgIHNmX29rID0gc2Y7CisgICAgICAgICAgICBzZiAtPSBkZWxzZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNmICs9IGRlbHNmOworICAgICAgICB9CisgICAgICAgIGRlbHNmID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gc2Zfb2s7Cit9CisKKworc3RhdGljIGludAorYmVsb3dfbm9pc2VfZmxvb3IoY29uc3QgRkxPQVQgKiB4ciwgRkxPQVQgbDN4bWluLCB1bnNpZ25lZCBpbnQgYncpCit7CisgICAgRkxPQVQgICBzdW0gPSAwLjA7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgZm9yIChpID0gMCwgaiA9IGJ3OyBqID4gMDsgKytpLCAtLWopIHsKKyAgICAgICAgRkxPQVQgY29uc3QgeCA9IHhyW2ldOworICAgICAgICBzdW0gKz0geCAqIHg7CisgICAgfQorICAgIHJldHVybiAobDN4bWluIC0gc3VtKSA+PSAtMUUtMjAgPyAxIDogMDsKK30KKworCitzdGF0aWMgdm9pZAora18zNF80KERPVUJMRVggeFs0XSwgaW50IGwzWzRdKQoreworI2lmZGVmIFRBS0VISVJPX0lFRUU3NTRfSEFDSworICAgIGZpX3VuaW9uIGZpWzRdOworCisgICAgYXNzZXJ0KHhbMF0gPD0gSVhNQVhfVkFMICYmIHhbMV0gPD0gSVhNQVhfVkFMICYmIHhbMl0gPD0gSVhNQVhfVkFMICYmIHhbM10gPD0gSVhNQVhfVkFMKTsKKyAgICB4WzBdICs9IE1BR0lDX0ZMT0FUOworICAgIGZpWzBdLmYgPSB4WzBdOworICAgIHhbMV0gKz0gTUFHSUNfRkxPQVQ7CisgICAgZmlbMV0uZiA9IHhbMV07CisgICAgeFsyXSArPSBNQUdJQ19GTE9BVDsKKyAgICBmaVsyXS5mID0geFsyXTsKKyAgICB4WzNdICs9IE1BR0lDX0ZMT0FUOworICAgIGZpWzNdLmYgPSB4WzNdOworICAgIGZpWzBdLmYgPSB4WzBdICsgYWRqNDNhc21bZmlbMF0uaSAtIE1BR0lDX0lOVF07CisgICAgZmlbMV0uZiA9IHhbMV0gKyBhZGo0M2FzbVtmaVsxXS5pIC0gTUFHSUNfSU5UXTsKKyAgICBmaVsyXS5mID0geFsyXSArIGFkajQzYXNtW2ZpWzJdLmkgLSBNQUdJQ19JTlRdOworICAgIGZpWzNdLmYgPSB4WzNdICsgYWRqNDNhc21bZmlbM10uaSAtIE1BR0lDX0lOVF07CisgICAgbDNbMF0gPSBmaVswXS5pIC0gTUFHSUNfSU5UOworICAgIGwzWzFdID0gZmlbMV0uaSAtIE1BR0lDX0lOVDsKKyAgICBsM1syXSA9IGZpWzJdLmkgLSBNQUdJQ19JTlQ7CisgICAgbDNbM10gPSBmaVszXS5pIC0gTUFHSUNfSU5UOworI2Vsc2UKKyAgICBhc3NlcnQoeFswXSA8PSBJWE1BWF9WQUwgJiYgeFsxXSA8PSBJWE1BWF9WQUwgJiYgeFsyXSA8PSBJWE1BWF9WQUwgJiYgeFszXSA8PSBJWE1BWF9WQUwpOworICAgIFhSUE9XX0ZUT0koeFswXSwgbDNbMF0pOworICAgIFhSUE9XX0ZUT0koeFsxXSwgbDNbMV0pOworICAgIFhSUE9XX0ZUT0koeFsyXSwgbDNbMl0pOworICAgIFhSUE9XX0ZUT0koeFszXSwgbDNbM10pOworICAgIHhbMF0gKz0gUVVBTlRGQUMobDNbMF0pOworICAgIHhbMV0gKz0gUVVBTlRGQUMobDNbMV0pOworICAgIHhbMl0gKz0gUVVBTlRGQUMobDNbMl0pOworICAgIHhbM10gKz0gUVVBTlRGQUMobDNbM10pOworICAgIFhSUE9XX0ZUT0koeFswXSwgbDNbMF0pOworICAgIFhSUE9XX0ZUT0koeFsxXSwgbDNbMV0pOworICAgIFhSUE9XX0ZUT0koeFsyXSwgbDNbMl0pOworICAgIFhSUE9XX0ZUT0koeFszXSwgbDNbM10pOworI2VuZGlmCit9CisKKworCitzdGF0aWMgdm9pZAora18zNF8yKERPVUJMRVggeFsyXSwgaW50IGwzWzJdKQoreworI2lmZGVmIFRBS0VISVJPX0lFRUU3NTRfSEFDSworICAgIGZpX3VuaW9uIGZpWzJdOworCisgICAgYXNzZXJ0KHhbMF0gPD0gSVhNQVhfVkFMICYmIHhbMV0gPD0gSVhNQVhfVkFMKTsKKyAgICB4WzBdICs9IE1BR0lDX0ZMT0FUOworICAgIGZpWzBdLmYgPSB4WzBdOworICAgIHhbMV0gKz0gTUFHSUNfRkxPQVQ7CisgICAgZmlbMV0uZiA9IHhbMV07CisgICAgZmlbMF0uZiA9IHhbMF0gKyBhZGo0M2FzbVtmaVswXS5pIC0gTUFHSUNfSU5UXTsKKyAgICBmaVsxXS5mID0geFsxXSArIGFkajQzYXNtW2ZpWzFdLmkgLSBNQUdJQ19JTlRdOworICAgIGwzWzBdID0gZmlbMF0uaSAtIE1BR0lDX0lOVDsKKyAgICBsM1sxXSA9IGZpWzFdLmkgLSBNQUdJQ19JTlQ7CisjZWxzZQorICAgIGFzc2VydCh4WzBdIDw9IElYTUFYX1ZBTCAmJiB4WzFdIDw9IElYTUFYX1ZBTCk7CisgICAgWFJQT1dfRlRPSSh4WzBdLCBsM1swXSk7CisgICAgWFJQT1dfRlRPSSh4WzFdLCBsM1sxXSk7CisgICAgeFswXSArPSBRVUFOVEZBQyhsM1swXSk7CisgICAgeFsxXSArPSBRVUFOVEZBQyhsM1sxXSk7CisgICAgWFJQT1dfRlRPSSh4WzBdLCBsM1swXSk7CisgICAgWFJQT1dfRlRPSSh4WzFdLCBsM1sxXSk7CisjZW5kaWYKK30KKworCisKKy8qICBkbyBjYWxsIHRoZSBjYWxjX3NmYl9ub2lzZV8qIGZ1bmN0aW9ucyBvbmx5IHdpdGggc2YgdmFsdWVzCisgKiAgZm9yIHdoaWNoIGhvbGRzOiBzZnBvdzM0KnhyMzQgPD0gSVhNQVhfVkFMCisgKi8KKworc3RhdGljICBGTE9BVAorY2FsY19zZmJfbm9pc2VfeDM0KGNvbnN0IEZMT0FUICogeHIsIGNvbnN0IEZMT0FUICogeHIzNCwgdW5zaWduZWQgaW50IGJ3LCB1aW50OF90IHNmKQoreworICAgIERPVUJMRVggeFs0XTsKKyAgICBpbnQgICAgIGwzWzRdOworICAgIGNvbnN0IEZMT0FUIHNmcG93ID0gcG93MjBbc2YgKyBRX01BWDJdOyAvKnBvdygyLjAsc2YvNC4wKTsgKi8KKyAgICBjb25zdCBGTE9BVCBzZnBvdzM0ID0gaXBvdzIwW3NmXTsgLypwb3coc2Zwb3csLTMuMC80LjApOyAqLworCisgICAgRkxPQVQgICB4ZnNmID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaiA9IGJ3ID4+IDE7CisgICAgdW5zaWduZWQgaW50IGNvbnN0IHJlbWFpbmluZyA9IChqICYgMHgwMXUpOworCisgICAgZm9yIChqID4+PSAxOyBqID4gMDsgLS1qKSB7CisgICAgICAgIHhbMF0gPSBzZnBvdzM0ICogeHIzNFswXTsKKyAgICAgICAgeFsxXSA9IHNmcG93MzQgKiB4cjM0WzFdOworICAgICAgICB4WzJdID0gc2Zwb3czNCAqIHhyMzRbMl07CisgICAgICAgIHhbM10gPSBzZnBvdzM0ICogeHIzNFszXTsKKworICAgICAgICBrXzM0XzQoeCwgbDMpOworCisgICAgICAgIHhbMF0gPSBmYWJzKHhyWzBdKSAtIHNmcG93ICogcG93NDNbbDNbMF1dOworICAgICAgICB4WzFdID0gZmFicyh4clsxXSkgLSBzZnBvdyAqIHBvdzQzW2wzWzFdXTsKKyAgICAgICAgeFsyXSA9IGZhYnMoeHJbMl0pIC0gc2Zwb3cgKiBwb3c0M1tsM1syXV07CisgICAgICAgIHhbM10gPSBmYWJzKHhyWzNdKSAtIHNmcG93ICogcG93NDNbbDNbM11dOworICAgICAgICB4ZnNmICs9ICh4WzBdICogeFswXSArIHhbMV0gKiB4WzFdKSArICh4WzJdICogeFsyXSArIHhbM10gKiB4WzNdKTsKKworICAgICAgICB4ciArPSA0OworICAgICAgICB4cjM0ICs9IDQ7CisgICAgfQorICAgIGlmIChyZW1haW5pbmcpIHsKKyAgICAgICAgeFswXSA9IHNmcG93MzQgKiB4cjM0WzBdOworICAgICAgICB4WzFdID0gc2Zwb3czNCAqIHhyMzRbMV07CisKKyAgICAgICAga18zNF8yKHgsIGwzKTsKKworICAgICAgICB4WzBdID0gZmFicyh4clswXSkgLSBzZnBvdyAqIHBvdzQzW2wzWzBdXTsKKyAgICAgICAgeFsxXSA9IGZhYnMoeHJbMV0pIC0gc2Zwb3cgKiBwb3c0M1tsM1sxXV07CisgICAgICAgIHhmc2YgKz0geFswXSAqIHhbMF0gKyB4WzFdICogeFsxXTsKKyAgICB9CisgICAgcmV0dXJuIHhmc2Y7Cit9CisKKworCitzdHJ1Y3QgY2FsY19ub2lzZV9jYWNoZSB7CisgICAgaW50ICAgICB2YWxpZDsKKyAgICBGTE9BVCAgIHZhbHVlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgY2FsY19ub2lzZV9jYWNoZSBjYWxjX25vaXNlX2NhY2hlX3Q7CisKKworc3RhdGljICB1aW50OF90Cit0cmlfY2FsY19zZmJfbm9pc2VfeDM0KGNvbnN0IEZMT0FUICogeHIsIGNvbnN0IEZMT0FUICogeHIzNCwgRkxPQVQgbDNfeG1pbiwgdW5zaWduZWQgaW50IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNmLCBjYWxjX25vaXNlX2NhY2hlX3QgKiBkaWRfaXQpCit7CisgICAgaWYgKGRpZF9pdFtzZl0udmFsaWQgPT0gMCkgeworICAgICAgICBkaWRfaXRbc2ZdLnZhbGlkID0gMTsKKyAgICAgICAgZGlkX2l0W3NmXS52YWx1ZSA9IGNhbGNfc2ZiX25vaXNlX3gzNCh4ciwgeHIzNCwgYncsIHNmKTsKKyAgICB9CisgICAgaWYgKGwzX3htaW4gPCBkaWRfaXRbc2ZdLnZhbHVlKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoc2YgPCAyNTUpIHsKKyAgICAgICAgdWludDhfdCBjb25zdCBzZl94ID0gc2YgKyAxOworICAgICAgICBpZiAoZGlkX2l0W3NmX3hdLnZhbGlkID09IDApIHsKKyAgICAgICAgICAgIGRpZF9pdFtzZl94XS52YWxpZCA9IDE7CisgICAgICAgICAgICBkaWRfaXRbc2ZfeF0udmFsdWUgPSBjYWxjX3NmYl9ub2lzZV94MzQoeHIsIHhyMzQsIGJ3LCBzZl94KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobDNfeG1pbiA8IGRpZF9pdFtzZl94XS52YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNmID4gMCkgeworICAgICAgICB1aW50OF90IGNvbnN0IHNmX3ggPSBzZiAtIDE7CisgICAgICAgIGlmIChkaWRfaXRbc2ZfeF0udmFsaWQgPT0gMCkgeworICAgICAgICAgICAgZGlkX2l0W3NmX3hdLnZhbGlkID0gMTsKKyAgICAgICAgICAgIGRpZF9pdFtzZl94XS52YWx1ZSA9IGNhbGNfc2ZiX25vaXNlX3gzNCh4ciwgeHIzNCwgYncsIHNmX3gpOworICAgICAgICB9CisgICAgICAgIGlmIChsM194bWluIDwgZGlkX2l0W3NmX3hdLnZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmIDAKKy8qKgorICogIFJvYmVydCBIZWdlbWFubiAyMDAxLTA1LTAxCisgKiAgY2FsY3VsYXRlcyBxdWFudGl6YXRpb24gc3RlcCBzaXplIGRldGVybWluZWQgYnkgYWxsb3dlZCBtYXNraW5nCisgKi8KK3N0YXRpYyBpbnQKK2NhbGNfc2NhbGVmYWMoRkxPQVQ4IGwzX3htaW4sIGludCBidykKK3sKKyAgICBGTE9BVDggY29uc3QgYyA9IDUuNzk5MTQyNDQ2OyAvKiAxMCAqIDEwXigyLzMpICogbG9nMTAoNC8zKSAqLworICAgIHJldHVybiAyMTAgKyAoaW50KSAoYyAqIGxvZzEwKGwzX3htaW4gLyBidykgLSAuNSk7Cit9CisjZW5kaWYKKworLyogdGhlIGZpbmRfc2NhbGVmYWMqIHJvdXRpbmVzIGNhbGN1bGF0ZQorICogYSBxdWFudGl6YXRpb24gc3RlcCBzaXplIHdoaWNoIHdvdWxkCisgKiBpbnRyb2R1Y2UgYXMgbXVjaCBub2lzZSBhcyBpcyBhbGxvd2VkLgorICogVGhlIGxhcmdlciB0aGUgc3RlcCBzaXplIHRoZSBtb3JlCisgKiBxdWFudGl6YXRpb24gbm9pc2Ugd2UnbGwgZ2V0LiBUaGUKKyAqIHNjYWxlZmFjdG9ycyBhcmUgdGhlcmUgdG8gbG93ZXIgdGhlCisgKiBnbG9iYWwgc3RlcCBzaXplLCBhbGxvd2luZyBsaW1pdGVkCisgKiBkaWZmZXJlbmNlcyBpbiBxdWFudGl6YXRpb24gc3RlcCBzaXplcworICogcGVyIGJhbmQgKHNoYXBpbmcgdGhlIG5vaXNlKS4KKyAqLworCitzdGF0aWMgIHVpbnQ4X3QKK2ZpbmRfc2NhbGVmYWNfeDM0KGNvbnN0IEZMT0FUICogeHIsIGNvbnN0IEZMT0FUICogeHIzNCwgRkxPQVQgbDNfeG1pbiwgdW5zaWduZWQgaW50IGJ3LAorICAgICAgICAgICAgICAgICAgdWludDhfdCBzZl9taW4pCit7CisgICAgY2FsY19ub2lzZV9jYWNoZV90IGRpZF9pdFsyNTZdOworICAgIHVpbnQ4X3Qgc2YgPSAxMjgsIHNmX29rID0gMjU1LCBkZWxzZiA9IDEyOCwgc2Vlbl9nb29kX29uZSA9IDAsIGk7CisgICAgbWVtc2V0KGRpZF9pdCwgMCwgc2l6ZW9mKGRpZF9pdCkpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgZGVsc2YgPj49IDE7CisgICAgICAgIGlmIChzZiA8PSBzZl9taW4pIHsKKyAgICAgICAgICAgIHNmICs9IGRlbHNmOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBjb25zdCBiYWQgPSB0cmlfY2FsY19zZmJfbm9pc2VfeDM0KHhyLCB4cjM0LCBsM194bWluLCBidywgc2YsIGRpZF9pdCk7CisgICAgICAgICAgICBpZiAoYmFkKSB7ICAvKiBkaXN0b3J0aW9uLiAgdHJ5IGEgc21hbGxlciBzY2FsZWZhY3RvciAqLworICAgICAgICAgICAgICAgIHNmIC09IGRlbHNmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2Zfb2sgPSBzZjsKKyAgICAgICAgICAgICAgICBzZiArPSBkZWxzZjsKKyAgICAgICAgICAgICAgICBzZWVuX2dvb2Rfb25lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiAgcmV0dXJuaW5nIGEgc2NhbGVmYWMgd2l0aG91dCBkaXN0b3J0aW9uLCBpZiBwb3NzaWJsZQorICAgICAqLworICAgIGlmIChzZWVuX2dvb2Rfb25lID4gMCkgeworICAgICAgICByZXR1cm4gc2Zfb2s7CisgICAgfQorICAgIGlmIChzZiA8PSBzZl9taW4pIHsKKyAgICAgICAgcmV0dXJuIHNmX21pbjsKKyAgICB9CisgICAgcmV0dXJuIHNmOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBjYWxjX3Nob3J0X2Jsb2NrX3Zicl9zZigpCisgKiAgICAgIGNhbGNfbG9uZ19ibG9ja192YnJfc2YoKQorICoKKyAqICBNYXJrIFRheWxvciAyMDAwLT8/LT8/CisgKiAgUm9iZXJ0IEhlZ2VtYW5uIDIwMDAtMTAtMjUgbWFkZSBmdW5jdGlvbnMgb2YgaXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGEgdmFyaWF0aW9uIGZvciB2YnItbXRyaCAqLworc3RhdGljIGludAorYmxvY2tfc2YoYWxnb190ICogdGhhdCwgY29uc3QgRkxPQVQgbDNfeG1pbltTRkJNQVhdLCBpbnQgdmJyc2ZbU0ZCTUFYXSwgaW50IHZicnNmbWluW1NGQk1BWF0pCit7CisgICAgRkxPQVQgICBtYXhfeHIzNDsKKyAgICBjb25zdCBGTE9BVCAqY29uc3QgeHIgPSAmdGhhdC0+Y29kX2luZm8tPnhyWzBdOworICAgIGNvbnN0IEZMT0FUICpjb25zdCB4cjM0X29yaWcgPSAmdGhhdC0+eHIzNG9yaWdbMF07CisgICAgY29uc3QgaW50ICpjb25zdCB3aWR0aCA9ICZ0aGF0LT5jb2RfaW5mby0+d2lkdGhbMF07CisgICAgdW5zaWduZWQgaW50IGNvbnN0IG1heF9ub256ZXJvX2NvZWZmID0gKHVuc2lnbmVkIGludCkgdGhhdC0+Y29kX2luZm8tPm1heF9ub256ZXJvX2NvZWZmOworICAgIHVpbnQ4X3QgbWF4c2YgPSAwOworICAgIGludCAgICAgc2ZiID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaiA9IDAsIGkgPSAwOworICAgIGludCBjb25zdCBwc3ltYXggPSB0aGF0LT5jb2RfaW5mby0+cHN5bWF4OworCisgICAgYXNzZXJ0KHRoYXQtPmNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZiA+PSAwKTsKKworICAgIHRoYXQtPm1pbmdhaW5fbCA9IDA7CisgICAgdGhhdC0+bWluZ2Fpbl9zWzBdID0gMDsKKyAgICB0aGF0LT5taW5nYWluX3NbMV0gPSAwOworICAgIHRoYXQtPm1pbmdhaW5fc1syXSA9IDA7CisgICAgd2hpbGUgKGogPD0gbWF4X25vbnplcm9fY29lZmYpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IHcgPSAodW5zaWduZWQgaW50KSB3aWR0aFtzZmJdOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgbSA9ICh1bnNpZ25lZCBpbnQpIChtYXhfbm9uemVyb19jb2VmZiAtIGogKyAxKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGwgPSB3OworICAgICAgICB1aW50OF90IG0xLCBtMjsKKyAgICAgICAgaWYgKGwgPiBtKSB7CisgICAgICAgICAgICBsID0gbTsKKyAgICAgICAgfQorICAgICAgICBtYXhfeHIzNCA9IG1heF94MzQoJnhyMzRfb3JpZ1tqXSwgbCk7CisKKyAgICAgICAgbTEgPSBmaW5kX2xvd2VzdF9zY2FsZWZhYyhtYXhfeHIzNCk7CisgICAgICAgIHZicnNmbWluW3NmYl0gPSBtMTsKKyAgICAgICAgaWYgKHRoYXQtPm1pbmdhaW5fbCA8IG0xKSB7CisgICAgICAgICAgICB0aGF0LT5taW5nYWluX2wgPSBtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhhdC0+bWluZ2Fpbl9zW2ldIDwgbTEpIHsKKyAgICAgICAgICAgIHRoYXQtPm1pbmdhaW5fc1tpXSA9IG0xOworICAgICAgICB9CisgICAgICAgIGlmICgrK2kgPiAyKSB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2ZiIDwgcHN5bWF4KSB7CisgICAgICAgICAgICBpZiAoYmVsb3dfbm9pc2VfZmxvb3IoJnhyW2pdLCBsM194bWluW3NmYl0sIGwpID09IDApIHsKKyAgICAgICAgICAgICAgICBtMiA9IGZpbmRfc2NhbGVmYWNfeDM0KCZ4cltqXSwgJnhyMzRfb3JpZ1tqXSwgbDNfeG1pbltzZmJdLCBsLCBtMSk7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmICgwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBSb2JlcnQgSGVnZW1hbm4gMjAwNy0wOS0yOToKKyAgICAgICAgICAgICAgICAgICAgICogIEl0IHNlZW1zIGhlcmUgaXMgc29tZSBtb3JlIHBvdGVudGlhbCBmb3Igc3BlZWQgaW1wcm92ZW1lbnRzLgorICAgICAgICAgICAgICAgICAgICAgKiAgQ3VycmVudCBmaW5kIG1ldGhvZCBkb2VzIDExLTE4IHF1YW50aXphdGlvbiBjYWxjdWxhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAqICBVc2luZyBhICJnb29kIGd1ZXNzIiBtYXkgaGVscCB0byByZWR1Y2UgdGhpcyBhbW91bnQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGd1ZXNzID0gY2FsY19zY2FsZWZhYyhsM194bWluW3NmYl0sIGwpOworICAgICAgICAgICAgICAgICAgICBERUJVR0YodGhhdC0+Z2ZjLCAic2ZiPSUzZCBndWVzcz0lM2QgZm91bmQ9JTNkIGRpZmY9JTNkXG4iLCBzZmIsIGd1ZXNzLCBtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG0yIC0gZ3Vlc3MpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChtYXhzZiA8IG0yKSB7CisgICAgICAgICAgICAgICAgICAgIG1heHNmID0gbTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbTIgPSAyNTU7CisgICAgICAgICAgICAgICAgbWF4c2YgPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobWF4c2YgPCBtMSkgeworICAgICAgICAgICAgICAgIG1heHNmID0gbTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtMiA9IG1heHNmOworICAgICAgICB9CisgICAgICAgIHZicnNmW3NmYl0gPSBtMjsKKyAgICAgICAgKytzZmI7CisgICAgICAgIGogKz0gdzsKKyAgICB9CisgICAgZm9yICg7IHNmYiA8IFNGQk1BWDsgKytzZmIpIHsKKyAgICAgICAgdmJyc2Zbc2ZiXSA9IG1heHNmOworICAgICAgICB2YnJzZm1pbltzZmJdID0gMDsKKyAgICB9CisgICAgcmV0dXJuIG1heHNmOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHF1YW50aXplIHhyMzQgYmFzZWQgb24gc2NhbGVmYWN0b3JzCisgKgorICogIGJsb2NrX3hyMzQKKyAqCisgKiAgTWFyayBUYXlsb3IgMjAwMC0/Py0/PworICogIFJvYmVydCBIZWdlbWFubiAyMDAwLTEwLTIwIG1hZGUgZnVuY3Rpb25zIG9mIHRoZW0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitxdWFudGl6ZV94MzQoY29uc3QgYWxnb190ICogdGhhdCkKK3sKKyAgICBET1VCTEVYIHhbNF07CisgICAgY29uc3QgRkxPQVQgKnhyMzRfb3JpZyA9IHRoYXQtPnhyMzRvcmlnOworICAgIGdyX2luZm8gKmNvbnN0IGNvZF9pbmZvID0gdGhhdC0+Y29kX2luZm87CisgICAgaW50IGNvbnN0IGlmcXN0ZXAgPSAoY29kX2luZm8tPnNjYWxlZmFjX3NjYWxlID09IDApID8gMiA6IDQ7CisgICAgaW50ICAgICpsMyA9IGNvZF9pbmZvLT5sM19lbmM7CisgICAgdW5zaWduZWQgaW50IGogPSAwLCBzZmIgPSAwOworICAgIHVuc2lnbmVkIGludCBjb25zdCBtYXhfbm9uemVyb19jb2VmZiA9ICh1bnNpZ25lZCBpbnQpIGNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZjsKKworICAgIGFzc2VydChjb2RfaW5mby0+bWF4X25vbnplcm9fY29lZmYgPj0gMCk7CisgICAgYXNzZXJ0KGNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZiA8IDU3Nik7CisKKyAgICB3aGlsZSAoaiA8PSBtYXhfbm9uemVyb19jb2VmZikgeworICAgICAgICBpbnQgY29uc3QgcyA9CisgICAgICAgICAgICAoY29kX2luZm8tPnNjYWxlZmFjW3NmYl0gKyAoY29kX2luZm8tPnByZWZsYWcgPyBwcmV0YWJbc2ZiXSA6IDApKSAqIGlmcXN0ZXAKKyAgICAgICAgICAgICsgY29kX2luZm8tPnN1YmJsb2NrX2dhaW5bY29kX2luZm8tPndpbmRvd1tzZmJdXSAqIDg7CisgICAgICAgIHVpbnQ4X3QgY29uc3Qgc2ZhYyA9ICh1aW50OF90KSAoY29kX2luZm8tPmdsb2JhbF9nYWluIC0gcyk7CisgICAgICAgIEZMT0FUIGNvbnN0IHNmcG93MzQgPSBpcG93MjBbc2ZhY107CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCB3ID0gKHVuc2lnbmVkIGludCkgY29kX2luZm8tPndpZHRoW3NmYl07CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtID0gKHVuc2lnbmVkIGludCkgKG1heF9ub256ZXJvX2NvZWZmIC0gaiArIDEpOworICAgICAgICB1bnNpZ25lZCBpbnQgbCA9IHc7CisgICAgICAgIHVuc2lnbmVkIGludCByZW1haW5pbmc7CisKKyAgICAgICAgYXNzZXJ0KChjb2RfaW5mby0+Z2xvYmFsX2dhaW4gLSBzKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KGNvZF9pbmZvLT53aWR0aFtzZmJdID49IDApOworCisgICAgICAgIGlmIChsID4gbSkgeworICAgICAgICAgICAgbCA9IG07CisgICAgICAgIH0KKyAgICAgICAgaiArPSB3OworICAgICAgICArK3NmYjsKKyAgICAgICAgbCA+Pj0gMTsKKyAgICAgICAgcmVtYWluaW5nID0gKGwgJiAxKTsKKworICAgICAgICBmb3IgKGwgPj49IDE7IGwgPiAwOyAtLWwpIHsKKyAgICAgICAgICAgIHhbMF0gPSBzZnBvdzM0ICogeHIzNF9vcmlnWzBdOworICAgICAgICAgICAgeFsxXSA9IHNmcG93MzQgKiB4cjM0X29yaWdbMV07CisgICAgICAgICAgICB4WzJdID0gc2Zwb3czNCAqIHhyMzRfb3JpZ1syXTsKKyAgICAgICAgICAgIHhbM10gPSBzZnBvdzM0ICogeHIzNF9vcmlnWzNdOworCisgICAgICAgICAgICBrXzM0XzQoeCwgbDMpOworCisgICAgICAgICAgICBsMyArPSA0OworICAgICAgICAgICAgeHIzNF9vcmlnICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbWFpbmluZykgeworICAgICAgICAgICAgeFswXSA9IHNmcG93MzQgKiB4cjM0X29yaWdbMF07CisgICAgICAgICAgICB4WzFdID0gc2Zwb3czNCAqIHhyMzRfb3JpZ1sxXTsKKworICAgICAgICAgICAga18zNF8yKHgsIGwzKTsKKworICAgICAgICAgICAgbDMgKz0gMjsKKyAgICAgICAgICAgIHhyMzRfb3JpZyArPSAyOworICAgICAgICB9CisgICAgfQorfQorCisKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWF4X3JhbmdlX3Nob3J0W1NCTUFYX3MgKiAzXSA9IHsKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgMCwgMCwgMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWF4X3JhbmdlX2xvbmdbU0JNQVhfbF0gPSB7CisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtYXhfcmFuZ2VfbG9uZ19sc2ZfcHJldGFiW1NCTUFYX2xdID0geworICAgIDcsIDcsIDcsIDcsIDcsIDcsIDMsIDMsIDMsIDMsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKworCisvKgorICAgIHNmYj0wLi41ICBzY2FsZWZhYyA8IDE2CisgICAgc2ZiPjUgICAgIHNjYWxlZmFjIDwgOAorCisgICAgaWZxc3RlcCA9ICggY29kX2luZm8tPnNjYWxlZmFjX3NjYWxlID09IDAgKSA/IDIgOiA0OworICAgIG9sX3NmID0gIChjb2RfaW5mby0+Z2xvYmFsX2dhaW4tMjEwLjApOworICAgIG9sX3NmIC09IDgqY29kX2luZm8tPnN1YmJsb2NrX2dhaW5baV07CisgICAgb2xfc2YgLT0gaWZxc3RlcCpzY2FsZWZhY1tncl1bY2hdLnNbc2ZiXVtpXTsKKyovCisKK3N0YXRpYyB2b2lkCitzZXRfc3ViYmxvY2tfZ2Fpbihncl9pbmZvICogY29kX2luZm8sIGNvbnN0IGludCBtaW5nYWluX3NbM10sIGludCBzZltdKQoreworICAgIGNvbnN0IGludCBtYXhyYW5nZTEgPSAxNSwgbWF4cmFuZ2UyID0gNzsKKyAgICBjb25zdCBpbnQgaWZxc3RlcFNoaWZ0ID0gKGNvZF9pbmZvLT5zY2FsZWZhY19zY2FsZSA9PSAwKSA/IDEgOiAyOworICAgIGludCAgICAqY29uc3Qgc2JnID0gY29kX2luZm8tPnN1YmJsb2NrX2dhaW47CisgICAgdW5zaWduZWQgaW50IGNvbnN0IHBzeW1heCA9ICh1bnNpZ25lZCBpbnQpIGNvZF9pbmZvLT5wc3ltYXg7CisgICAgdW5zaWduZWQgaW50IHBzeWRpdiA9IDE4OworICAgIGludCAgICAgc2JnMCwgc2JnMSwgc2JnMjsKKyAgICB1bnNpZ25lZCBpbnQgc2ZiLCBpOworICAgIGludCAgICAgbWluX3NiZyA9IDc7CisKKyAgICBpZiAocHN5ZGl2ID4gcHN5bWF4KSB7CisgICAgICAgIHBzeWRpdiA9IHBzeW1heDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBpbnQgICAgIG1heHNmMSA9IDAsIG1heHNmMiA9IDAsIG1pbnNmID0gMTAwMDsKKyAgICAgICAgLyogc2VlIGlmIHdlIHNob3VsZCB1c2Ugc3ViYmxvY2sgZ2FpbiAqLworICAgICAgICBmb3IgKHNmYiA9IGk7IHNmYiA8IHBzeWRpdjsgc2ZiICs9IDMpIHsgLyogcGFydCAxICovCisgICAgICAgICAgICBpbnQgY29uc3QgdiA9IC1zZltzZmJdOworICAgICAgICAgICAgaWYgKG1heHNmMSA8IHYpIHsKKyAgICAgICAgICAgICAgICBtYXhzZjEgPSB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1pbnNmID4gdikgeworICAgICAgICAgICAgICAgIG1pbnNmID0gdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgc2ZiIDwgU0ZCTUFYOyBzZmIgKz0gMykgeyAvKiBwYXJ0IDIgKi8KKyAgICAgICAgICAgIGludCBjb25zdCB2ID0gLXNmW3NmYl07CisgICAgICAgICAgICBpZiAobWF4c2YyIDwgdikgeworICAgICAgICAgICAgICAgIG1heHNmMiA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWluc2YgPiB2KSB7CisgICAgICAgICAgICAgICAgbWluc2YgPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYm9vc3Qgc3ViYmxvY2sgZ2FpbiBhcyBsaXR0bGUgYXMgcG9zc2libGUgc28gd2UgY2FuCisgICAgICAgICAqIHJlYWNoIG1heHNmMSB3aXRoIHNjYWxlZmFjdG9ycworICAgICAgICAgKiA4KnNiZyA+PSBtYXhzZjEKKyAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb25zdCBtMSA9IG1heHNmMSAtIChtYXhyYW5nZTEgPDwgaWZxc3RlcFNoaWZ0KTsKKyAgICAgICAgICAgIGludCBjb25zdCBtMiA9IG1heHNmMiAtIChtYXhyYW5nZTIgPDwgaWZxc3RlcFNoaWZ0KTsKKworICAgICAgICAgICAgbWF4c2YxID0gTWF4KG0xLCBtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pbnNmID4gMCkgeworICAgICAgICAgICAgc2JnW2ldID0gbWluc2YgPj4gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNiZ1tpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heHNmMSA+IDApIHsKKyAgICAgICAgICAgIGludCBjb25zdCBtMSA9IHNiZ1tpXTsKKyAgICAgICAgICAgIGludCBjb25zdCBtMiA9IChtYXhzZjEgKyA3KSA+PiAzOworICAgICAgICAgICAgc2JnW2ldID0gTWF4KG0xLCBtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNiZ1tpXSA+IDAgJiYgbWluZ2Fpbl9zW2ldID4gKGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiAtIHNiZ1tpXSAqIDgpKSB7CisgICAgICAgICAgICBzYmdbaV0gPSAoY29kX2luZm8tPmdsb2JhbF9nYWluIC0gbWluZ2Fpbl9zW2ldKSA+PiAzOworICAgICAgICB9CisgICAgICAgIGlmIChzYmdbaV0gPiA3KSB7CisgICAgICAgICAgICBzYmdbaV0gPSA3OworICAgICAgICB9CisgICAgICAgIGlmIChtaW5fc2JnID4gc2JnW2ldKSB7CisgICAgICAgICAgICBtaW5fc2JnID0gc2JnW2ldOworICAgICAgICB9CisgICAgfQorICAgIHNiZzAgPSBzYmdbMF0gKiA4OworICAgIHNiZzEgPSBzYmdbMV0gKiA4OworICAgIHNiZzIgPSBzYmdbMl0gKiA4OworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgU0ZCTUFYOyBzZmIgKz0gMykgeworICAgICAgICBzZltzZmIgKyAwXSArPSBzYmcwOworICAgICAgICBzZltzZmIgKyAxXSArPSBzYmcxOworICAgICAgICBzZltzZmIgKyAyXSArPSBzYmcyOworICAgIH0KKyAgICBpZiAobWluX3NiZyA+IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgc2JnW2ldIC09IG1pbl9zYmc7CisgICAgICAgIH0KKyAgICAgICAgY29kX2luZm8tPmdsb2JhbF9nYWluIC09IG1pbl9zYmcgKiA4OworICAgIH0KK30KKworCisKKy8qCisJICBpZnFzdGVwID0gKCBjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgPT0gMCApID8gMiA6IDQ7CisJICBvbF9zZiA9ICAoY29kX2luZm8tPmdsb2JhbF9nYWluLTIxMC4wKTsKKwkgIG9sX3NmIC09IGlmcXN0ZXAqc2NhbGVmYWNbZ3JdW2NoXS5sW3NmYl07CisJICBpZiAoY29kX2luZm8tPnByZWZsYWcgJiYgc2ZiPj0xMSkKKwkgIG9sX3NmIC09IGlmcXN0ZXAqcHJldGFiW3NmYl07CisqLworc3RhdGljIHZvaWQKK3NldF9zY2FsZWZhY3MoZ3JfaW5mbyAqIGNvZF9pbmZvLCBjb25zdCBpbnQgKnZicnNmbWluLCBpbnQgc2ZbXSwgY29uc3QgdWludDhfdCAqIG1heF9yYW5nZSkKK3sKKyAgICBjb25zdCBpbnQgaWZxc3RlcCA9IChjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgPT0gMCkgPyAyIDogNDsKKyAgICBjb25zdCBpbnQgaWZxc3RlcFNoaWZ0ID0gKGNvZF9pbmZvLT5zY2FsZWZhY19zY2FsZSA9PSAwKSA/IDEgOiAyOworICAgIGludCAgICAqY29uc3Qgc2NhbGVmYWMgPSBjb2RfaW5mby0+c2NhbGVmYWM7CisgICAgaW50IGNvbnN0IHNmYm1heCA9IGNvZF9pbmZvLT5zZmJtYXg7CisgICAgaW50ICAgICBzZmI7CisgICAgaW50IGNvbnN0ICpjb25zdCBzYmcgPSBjb2RfaW5mby0+c3ViYmxvY2tfZ2FpbjsKKyAgICBpbnQgY29uc3QgKmNvbnN0IHdpbmRvdyA9IGNvZF9pbmZvLT53aW5kb3c7CisgICAgaW50IGNvbnN0IHByZWZsYWcgPSBjb2RfaW5mby0+cHJlZmxhZzsKKworICAgIGlmIChwcmVmbGFnKSB7CisgICAgICAgIGZvciAoc2ZiID0gMTE7IHNmYiA8IHNmYm1heDsgKytzZmIpIHsKKyAgICAgICAgICAgIHNmW3NmYl0gKz0gcHJldGFiW3NmYl0gKiBpZnFzdGVwOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZibWF4OyArK3NmYikgeworICAgICAgICBpbnQgY29uc3QgZ2FpbiA9IGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiAtIChzYmdbd2luZG93W3NmYl1dICogOCkKKyAgICAgICAgICAgIC0gKChwcmVmbGFnID8gcHJldGFiW3NmYl0gOiAwKSAqIGlmcXN0ZXApOworCisgICAgICAgIGlmIChzZltzZmJdIDwgMCkgeworICAgICAgICAgICAgaW50IGNvbnN0IG0gPSBnYWluIC0gdmJyc2ZtaW5bc2ZiXTsKKyAgICAgICAgICAgIC8qIGlmcXN0ZXAqc2NhbGVmYWMgPj0gLXNmW3NmYl0sIHNvIHJvdW5kIFVQICovCisgICAgICAgICAgICBzY2FsZWZhY1tzZmJdID0gKGlmcXN0ZXAgLSAxIC0gc2Zbc2ZiXSkgPj4gaWZxc3RlcFNoaWZ0OworCisgICAgICAgICAgICBpZiAoc2NhbGVmYWNbc2ZiXSA+IG1heF9yYW5nZVtzZmJdKSB7CisgICAgICAgICAgICAgICAgc2NhbGVmYWNbc2ZiXSA9IG1heF9yYW5nZVtzZmJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjYWxlZmFjW3NmYl0gPiAwICYmIChzY2FsZWZhY1tzZmJdIDw8IGlmcXN0ZXBTaGlmdCkgPiBtKSB7CisgICAgICAgICAgICAgICAgc2NhbGVmYWNbc2ZiXSA9IG0gPj4gaWZxc3RlcFNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2NhbGVmYWNbc2ZiXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yICg7IHNmYiA8IFNGQk1BWDsgKytzZmIpIHsKKyAgICAgICAgc2NhbGVmYWNbc2ZiXSA9IDA7IC8qIHNmYjIxICovCisgICAgfQorfQorCisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgaW50CitjaGVja1NjYWxlZmFjdG9yKGNvbnN0IGdyX2luZm8gKiBjb2RfaW5mbywgY29uc3QgaW50IHZicnNmbWluW1NGQk1BWF0pCit7CisgICAgaW50IGNvbnN0IGlmcXN0ZXAgPSBjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgPT0gMCA/IDIgOiA0OworICAgIGludCAgICAgc2ZiOworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgY29kX2luZm8tPnBzeW1heDsgKytzZmIpIHsKKyAgICAgICAgY29uc3QgaW50IHMgPQorICAgICAgICAgICAgKChjb2RfaW5mby0+c2NhbGVmYWNbc2ZiXSArCisgICAgICAgICAgICAgIChjb2RfaW5mby0+cHJlZmxhZyA/IHByZXRhYltzZmJdIDogMCkpICogaWZxc3RlcCkgKworICAgICAgICAgICAgY29kX2luZm8tPnN1YmJsb2NrX2dhaW5bY29kX2luZm8tPndpbmRvd1tzZmJdXSAqIDg7CisKKyAgICAgICAgaWYgKChjb2RfaW5mby0+Z2xvYmFsX2dhaW4gLSBzKSA8IHZicnNmbWluW3NmYl0pIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJzZiAlZFxuIiwgc2ZiICk7CisgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJtaW4gJWRcbiIsIHZicnNmbWluW3NmYl0gKTsKKyAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgImdnYWluICVkXG4iLCBjb2RfaW5mby0+Z2xvYmFsX2dhaW4gKTsKKyAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgInNjYWxlZmFjICVkXG4iLCBjb2RfaW5mby0+c2NhbGVmYWNbc2ZiXSApOworICAgICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAicHJldGFiICVkXG4iLCAoY29kX2luZm8tPnByZWZsYWcgPyBwcmV0YWJbc2ZiXSA6IDApICk7CisgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJzY2FsZSAlZFxuIiwgKGNvZF9pbmZvLT5zY2FsZWZhY19zY2FsZSArIDEpICk7CisgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJzdWJnYWluICVkXG4iLCBjb2RfaW5mby0+c3ViYmxvY2tfZ2Fpbltjb2RfaW5mby0+d2luZG93W3NmYl1dICogOCApOworICAgICAgICAgICAgICAgZmZsdXNoKCBzdGRvdXQgKTsKKyAgICAgICAgICAgICAgIGV4aXQoLTEpOworICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgc2hvcnQgYmxvY2sgc2NhbGVmYWNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK3Nob3J0X2Jsb2NrX2NvbnN0cmFpbihjb25zdCBhbGdvX3QgKiB0aGF0LCBjb25zdCBpbnQgdmJyc2ZbU0ZCTUFYXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdmJyc2ZtaW5bU0ZCTUFYXSwgaW50IHZicm1heCkKK3sKKyAgICBncl9pbmZvICpjb25zdCBjb2RfaW5mbyA9IHRoYXQtPmNvZF9pbmZvOworICAgIGxhbWVfaW50ZXJuYWxfZmxhZ3MgY29uc3QgKmNvbnN0IGdmYyA9IHRoYXQtPmdmYzsKKyAgICBpbnQgY29uc3QgbWF4bWluc2ZiID0gdGhhdC0+bWluZ2Fpbl9sOworICAgIGludCAgICAgbW92ZXIsIG1heG92ZXIwID0gMCwgbWF4b3ZlcjEgPSAwLCBkZWx0YSA9IDA7CisgICAgaW50ICAgICB2LCB2MCwgdjE7CisgICAgaW50ICAgICBzZmI7CisgICAgaW50IGNvbnN0IHBzeW1heCA9IGNvZF9pbmZvLT5wc3ltYXg7CisKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeW1heDsgKytzZmIpIHsKKyAgICAgICAgYXNzZXJ0KHZicnNmW3NmYl0gPj0gdmJyc2ZtaW5bc2ZiXSk7CisgICAgICAgIHYgPSB2YnJtYXggLSB2YnJzZltzZmJdOworICAgICAgICBpZiAoZGVsdGEgPCB2KSB7CisgICAgICAgICAgICBkZWx0YSA9IHY7CisgICAgICAgIH0KKyAgICAgICAgdjAgPSB2IC0gKDQgKiAxNCArIDIgKiBtYXhfcmFuZ2Vfc2hvcnRbc2ZiXSk7CisgICAgICAgIHYxID0gdiAtICg0ICogMTQgKyA0ICogbWF4X3JhbmdlX3Nob3J0W3NmYl0pOworICAgICAgICBpZiAobWF4b3ZlcjAgPCB2MCkgeworICAgICAgICAgICAgbWF4b3ZlcjAgPSB2MDsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4b3ZlcjEgPCB2MSkgeworICAgICAgICAgICAgbWF4b3ZlcjEgPSB2MTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZ2ZjLT5ub2lzZV9zaGFwaW5nID09IDIpIHsKKyAgICAgICAgLyogYWxsb3cgc2NhbGVmYWNfc2NhbGU9MSAqLworICAgICAgICBtb3ZlciA9IE1pbihtYXhvdmVyMCwgbWF4b3ZlcjEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbW92ZXIgPSBtYXhvdmVyMDsKKyAgICB9CisgICAgaWYgKGRlbHRhID4gbW92ZXIpIHsKKyAgICAgICAgZGVsdGEgPSBtb3ZlcjsKKyAgICB9CisgICAgdmJybWF4IC09IGRlbHRhOworICAgIG1heG92ZXIwIC09IG1vdmVyOworICAgIG1heG92ZXIxIC09IG1vdmVyOworCisgICAgaWYgKG1heG92ZXIwID09IDApIHsKKyAgICAgICAgY29kX2luZm8tPnNjYWxlZmFjX3NjYWxlID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAobWF4b3ZlcjEgPT0gMCkgeworICAgICAgICBjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgPSAxOworICAgIH0KKyAgICBpZiAodmJybWF4IDwgbWF4bWluc2ZiKSB7CisgICAgICAgIHZicm1heCA9IG1heG1pbnNmYjsKKyAgICB9CisgICAgY29kX2luZm8tPmdsb2JhbF9nYWluID0gdmJybWF4OworCisgICAgaWYgKGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA8IDApIHsKKyAgICAgICAgY29kX2luZm8tPmdsb2JhbF9nYWluID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoY29kX2luZm8tPmdsb2JhbF9nYWluID4gMjU1KSB7CisgICAgICAgIGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA9IDI1NTsKKyAgICB9CisgICAgeworICAgICAgICBpbnQgICAgIHNmX3RlbXBbU0ZCTUFYXTsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBTRkJNQVg7ICsrc2ZiKSB7CisgICAgICAgICAgICBzZl90ZW1wW3NmYl0gPSB2YnJzZltzZmJdIC0gdmJybWF4OworICAgICAgICB9CisgICAgICAgIHNldF9zdWJibG9ja19nYWluKGNvZF9pbmZvLCAmdGhhdC0+bWluZ2Fpbl9zWzBdLCBzZl90ZW1wKTsKKyAgICAgICAgc2V0X3NjYWxlZmFjcyhjb2RfaW5mbywgdmJyc2ZtaW4sIHNmX3RlbXAsIG1heF9yYW5nZV9zaG9ydCk7CisgICAgfQorICAgIGFzc2VydChjaGVja1NjYWxlZmFjdG9yKGNvZF9pbmZvLCB2YnJzZm1pbikpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBsb25nIGJsb2NrIHNjYWxlZmFjcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitsb25nX2Jsb2NrX2NvbnN0cmFpbihjb25zdCBhbGdvX3QgKiB0aGF0LCBjb25zdCBpbnQgdmJyc2ZbU0ZCTUFYXSwgY29uc3QgaW50IHZicnNmbWluW1NGQk1BWF0sCisgICAgICAgICAgICAgICAgICAgICBpbnQgdmJybWF4KQoreworICAgIGdyX2luZm8gKmNvbnN0IGNvZF9pbmZvID0gdGhhdC0+Y29kX2luZm87CisgICAgbGFtZV9pbnRlcm5hbF9mbGFncyBjb25zdCAqY29uc3QgZ2ZjID0gdGhhdC0+Z2ZjOworICAgIHVpbnQ4X3QgY29uc3QgKm1heF9yYW5nZXA7CisgICAgaW50IGNvbnN0IG1heG1pbnNmYiA9IHRoYXQtPm1pbmdhaW5fbDsKKyAgICBpbnQgICAgIHNmYjsKKyAgICBpbnQgICAgIG1heG92ZXIwLCBtYXhvdmVyMSwgbWF4b3ZlcjBwLCBtYXhvdmVyMXAsIG1vdmVyLCBkZWx0YSA9IDA7CisgICAgaW50ICAgICB2LCB2MCwgdjEsIHYwcCwgdjFwLCB2bTBwID0gMSwgdm0xcCA9IDE7CisgICAgaW50IGNvbnN0IHBzeW1heCA9IGNvZF9pbmZvLT5wc3ltYXg7CisKKyAgICBtYXhfcmFuZ2VwID0gZ2ZjLT5tb2RlX2dyID09IDIgPyBtYXhfcmFuZ2VfbG9uZyA6IG1heF9yYW5nZV9sb25nX2xzZl9wcmV0YWI7CisKKyAgICBtYXhvdmVyMCA9IDA7CisgICAgbWF4b3ZlcjEgPSAwOworICAgIG1heG92ZXIwcCA9IDA7ICAgICAgLyogcHJldGFiICovCisgICAgbWF4b3ZlcjFwID0gMDsgICAgICAvKiBwcmV0YWIgKi8KKworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5bWF4OyArK3NmYikgeworICAgICAgICBhc3NlcnQodmJyc2Zbc2ZiXSA+PSB2YnJzZm1pbltzZmJdKTsKKyAgICAgICAgdiA9IHZicm1heCAtIHZicnNmW3NmYl07CisgICAgICAgIGlmIChkZWx0YSA8IHYpIHsKKyAgICAgICAgICAgIGRlbHRhID0gdjsKKyAgICAgICAgfQorICAgICAgICB2MCA9IHYgLSAyICogbWF4X3JhbmdlX2xvbmdbc2ZiXTsKKyAgICAgICAgdjEgPSB2IC0gNCAqIG1heF9yYW5nZV9sb25nW3NmYl07CisgICAgICAgIHYwcCA9IHYgLSAyICogKG1heF9yYW5nZXBbc2ZiXSArIHByZXRhYltzZmJdKTsKKyAgICAgICAgdjFwID0gdiAtIDQgKiAobWF4X3JhbmdlcFtzZmJdICsgcHJldGFiW3NmYl0pOworICAgICAgICBpZiAobWF4b3ZlcjAgPCB2MCkgeworICAgICAgICAgICAgbWF4b3ZlcjAgPSB2MDsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4b3ZlcjEgPCB2MSkgeworICAgICAgICAgICAgbWF4b3ZlcjEgPSB2MTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4b3ZlcjBwIDwgdjBwKSB7CisgICAgICAgICAgICBtYXhvdmVyMHAgPSB2MHA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heG92ZXIxcCA8IHYxcCkgeworICAgICAgICAgICAgbWF4b3ZlcjFwID0gdjFwOworICAgICAgICB9CisgICAgfQorICAgIGlmICh2bTBwID09IDEpIHsKKyAgICAgICAgaW50ICAgICBnYWluID0gdmJybWF4IC0gbWF4b3ZlcjBwOworICAgICAgICBpZiAoZ2FpbiA8IG1heG1pbnNmYikgeworICAgICAgICAgICAgZ2FpbiA9IG1heG1pbnNmYjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeW1heDsgKytzZmIpIHsKKyAgICAgICAgICAgIGludCBjb25zdCBhID0gKGdhaW4gLSB2YnJzZm1pbltzZmJdKSAtIDIgKiBwcmV0YWJbc2ZiXTsKKyAgICAgICAgICAgIGlmIChhIDw9IDApIHsKKyAgICAgICAgICAgICAgICB2bTBwID0gMDsKKyAgICAgICAgICAgICAgICB2bTFwID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodm0xcCA9PSAxKSB7CisgICAgICAgIGludCAgICAgZ2FpbiA9IHZicm1heCAtIG1heG92ZXIxcDsKKyAgICAgICAgaWYgKGdhaW4gPCBtYXhtaW5zZmIpIHsKKyAgICAgICAgICAgIGdhaW4gPSBtYXhtaW5zZmI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3ltYXg7ICsrc2ZiKSB7CisgICAgICAgICAgICBpbnQgY29uc3QgYiA9IChnYWluIC0gdmJyc2ZtaW5bc2ZiXSkgLSA0ICogcHJldGFiW3NmYl07CisgICAgICAgICAgICBpZiAoYiA8PSAwKSB7CisgICAgICAgICAgICAgICAgdm0xcCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHZtMHAgPT0gMCkgeworICAgICAgICBtYXhvdmVyMHAgPSBtYXhvdmVyMDsKKyAgICB9CisgICAgaWYgKHZtMXAgPT0gMCkgeworICAgICAgICBtYXhvdmVyMXAgPSBtYXhvdmVyMTsKKyAgICB9CisgICAgaWYgKGdmYy0+bm9pc2Vfc2hhcGluZyAhPSAyKSB7CisgICAgICAgIG1heG92ZXIxID0gbWF4b3ZlcjA7CisgICAgICAgIG1heG92ZXIxcCA9IG1heG92ZXIwcDsKKyAgICB9CisgICAgbW92ZXIgPSBNaW4obWF4b3ZlcjAsIG1heG92ZXIwcCk7CisgICAgbW92ZXIgPSBNaW4obW92ZXIsIG1heG92ZXIxKTsKKyAgICBtb3ZlciA9IE1pbihtb3ZlciwgbWF4b3ZlcjFwKTsKKworICAgIGlmIChkZWx0YSA+IG1vdmVyKSB7CisgICAgICAgIGRlbHRhID0gbW92ZXI7CisgICAgfQorICAgIHZicm1heCAtPSBkZWx0YTsKKyAgICBpZiAodmJybWF4IDwgbWF4bWluc2ZiKSB7CisgICAgICAgIHZicm1heCA9IG1heG1pbnNmYjsKKyAgICB9CisgICAgbWF4b3ZlcjAgLT0gbW92ZXI7CisgICAgbWF4b3ZlcjBwIC09IG1vdmVyOworICAgIG1heG92ZXIxIC09IG1vdmVyOworICAgIG1heG92ZXIxcCAtPSBtb3ZlcjsKKworICAgIGlmIChtYXhvdmVyMCA9PSAwKSB7CisgICAgICAgIGNvZF9pbmZvLT5zY2FsZWZhY19zY2FsZSA9IDA7CisgICAgICAgIGNvZF9pbmZvLT5wcmVmbGFnID0gMDsKKyAgICAgICAgbWF4X3JhbmdlcCA9IG1heF9yYW5nZV9sb25nOworICAgIH0KKyAgICBlbHNlIGlmIChtYXhvdmVyMHAgPT0gMCkgeworICAgICAgICBjb2RfaW5mby0+c2NhbGVmYWNfc2NhbGUgPSAwOworICAgICAgICBjb2RfaW5mby0+cHJlZmxhZyA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKG1heG92ZXIxID09IDApIHsKKyAgICAgICAgY29kX2luZm8tPnNjYWxlZmFjX3NjYWxlID0gMTsKKyAgICAgICAgY29kX2luZm8tPnByZWZsYWcgPSAwOworICAgICAgICBtYXhfcmFuZ2VwID0gbWF4X3JhbmdlX2xvbmc7CisgICAgfQorICAgIGVsc2UgaWYgKG1heG92ZXIxcCA9PSAwKSB7CisgICAgICAgIGNvZF9pbmZvLT5zY2FsZWZhY19zY2FsZSA9IDE7CisgICAgICAgIGNvZF9pbmZvLT5wcmVmbGFnID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydCgwKTsgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCisgICAgfQorICAgIGNvZF9pbmZvLT5nbG9iYWxfZ2FpbiA9IHZicm1heDsKKyAgICBpZiAoY29kX2luZm8tPmdsb2JhbF9nYWluIDwgMCkgeworICAgICAgICBjb2RfaW5mby0+Z2xvYmFsX2dhaW4gPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChjb2RfaW5mby0+Z2xvYmFsX2dhaW4gPiAyNTUpIHsKKyAgICAgICAgY29kX2luZm8tPmdsb2JhbF9nYWluID0gMjU1OworICAgIH0KKyAgICB7CisgICAgICAgIGludCAgICAgc2ZfdGVtcFtTRkJNQVhdOworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IFNGQk1BWDsgKytzZmIpIHsKKyAgICAgICAgICAgIHNmX3RlbXBbc2ZiXSA9IHZicnNmW3NmYl0gLSB2YnJtYXg7CisgICAgICAgIH0KKyAgICAgICAgc2V0X3NjYWxlZmFjcyhjb2RfaW5mbywgdmJyc2ZtaW4sIHNmX3RlbXAsIG1heF9yYW5nZXApOworICAgIH0KKyAgICBhc3NlcnQoY2hlY2tTY2FsZWZhY3Rvcihjb2RfaW5mbywgdmJyc2ZtaW4pKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitiaXRjb3VudChjb25zdCBhbGdvX3QgKiB0aGF0KQoreworICAgIGludCAgICAgcmM7CisKKyAgICBpZiAodGhhdC0+Z2ZjLT5tb2RlX2dyID09IDIpIHsKKyAgICAgICAgcmMgPSBzY2FsZV9iaXRjb3VudCh0aGF0LT5jb2RfaW5mbyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByYyA9IHNjYWxlX2JpdGNvdW50X2xzZih0aGF0LT5nZmMsIHRoYXQtPmNvZF9pbmZvKTsKKyAgICB9CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiAgdGhpcyBzaG91bGQgbm90IGhhcHBlbiBkdWUgdG8gdGhlIHdheSB0aGUgc2NhbGVmYWN0b3JzIGFyZSBzZWxlY3RlZCAgKi8KKyAgICBFUlJPUkYodGhhdC0+Z2ZjLCAiSU5URVJOQUwgRVJST1IgSU4gVkJSIE5FVyBDT0RFICg5ODYpLCBwbGVhc2Ugc2VuZCBidWcgcmVwb3J0XG4iKTsKKyAgICBleGl0KC0xKTsKK30KKworCisKK3N0YXRpYyBpbnQKK3F1YW50aXplQW5kQ291bnRCaXRzKGNvbnN0IGFsZ29fdCAqIHRoYXQpCit7CisgICAgcXVhbnRpemVfeDM0KHRoYXQpOworICAgIHRoYXQtPmNvZF9pbmZvLT5wYXJ0Ml8zX2xlbmd0aCA9IG5vcXVhbnRfY291bnRfYml0cyh0aGF0LT5nZmMsIHRoYXQtPmNvZF9pbmZvLCAwKTsKKyAgICByZXR1cm4gdGhhdC0+Y29kX2luZm8tPnBhcnQyXzNfbGVuZ3RoOworfQorCisKKworCisKK3N0YXRpYyBpbnQKK3RyeUdsb2JhbFN0ZXBzaXplKGNvbnN0IGFsZ29fdCAqIHRoYXQsIGNvbnN0IGludCBzZndvcmtbU0ZCTUFYXSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB2YnJzZm1pbltTRkJNQVhdLCBpbnQgZGVsdGEpCit7CisgICAgRkxPQVQgY29uc3QgeHJwb3dfbWF4ID0gdGhhdC0+Y29kX2luZm8tPnhycG93X21heDsKKyAgICBpbnQgICAgIHNmdGVtcFtTRkJNQVhdLCBpLCBuYml0czsKKyAgICBpbnQgICAgIGdhaW4sIHZicm1heCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IFNGQk1BWDsgKytpKSB7CisgICAgICAgIGdhaW4gPSBzZndvcmtbaV0gKyBkZWx0YTsKKyAgICAgICAgaWYgKGdhaW4gPCB2YnJzZm1pbltpXSkgeworICAgICAgICAgICAgZ2FpbiA9IHZicnNmbWluW2ldOworICAgICAgICB9CisgICAgICAgIGlmIChnYWluID4gMjU1KSB7CisgICAgICAgICAgICBnYWluID0gMjU1OworICAgICAgICB9CisgICAgICAgIGlmICh2YnJtYXggPCBnYWluKSB7CisgICAgICAgICAgICB2YnJtYXggPSBnYWluOworICAgICAgICB9CisgICAgICAgIHNmdGVtcFtpXSA9IGdhaW47CisgICAgfQorICAgIHRoYXQtPmFsbG9jKHRoYXQsIHNmdGVtcCwgdmJyc2ZtaW4sIHZicm1heCk7CisgICAgYml0Y291bnQodGhhdCk7CisgICAgbmJpdHMgPSBxdWFudGl6ZUFuZENvdW50Qml0cyh0aGF0KTsKKyAgICB0aGF0LT5jb2RfaW5mby0+eHJwb3dfbWF4ID0geHJwb3dfbWF4OworICAgIHJldHVybiBuYml0czsKK30KKworCisKK3N0YXRpYyB2b2lkCitzZWFyY2hHbG9iYWxTdGVwc2l6ZU1heChjb25zdCBhbGdvX3QgKiB0aGF0LCBjb25zdCBpbnQgc2Z3b3JrW1NGQk1BWF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdmJyc2ZtaW5bU0ZCTUFYXSwgaW50IHRhcmdldCkKK3sKKyAgICBncl9pbmZvIGNvbnN0ICpjb25zdCBjb2RfaW5mbyA9IHRoYXQtPmNvZF9pbmZvOworICAgIGNvbnN0IGludCBnYWluID0gY29kX2luZm8tPmdsb2JhbF9nYWluOworICAgIGludCAgICAgY3VyciA9IGdhaW47CisgICAgaW50ICAgICBnYWluX29rID0gMTAyNDsKKyAgICBpbnQgICAgIG5iaXRzID0gTEFSR0VfQklUUzsKKyAgICBpbnQgICAgIGwgPSBnYWluLCByID0gNTEyOworCisgICAgYXNzZXJ0KGdhaW4gPj0gMCk7CisgICAgd2hpbGUgKGwgPD0gcikgeworICAgICAgICBjdXJyID0gKGwgKyByKSA+PiAxOworICAgICAgICBuYml0cyA9IHRyeUdsb2JhbFN0ZXBzaXplKHRoYXQsIHNmd29yaywgdmJyc2ZtaW4sIGN1cnIgLSBnYWluKTsKKyAgICAgICAgaWYgKG5iaXRzID09IDAgfHwgKG5iaXRzICsgY29kX2luZm8tPnBhcnQyX2xlbmd0aCkgPCB0YXJnZXQpIHsKKyAgICAgICAgICAgIHIgPSBjdXJyIC0gMTsKKyAgICAgICAgICAgIGdhaW5fb2sgPSBjdXJyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbCA9IGN1cnIgKyAxOworICAgICAgICAgICAgaWYgKGdhaW5fb2sgPT0gMTAyNCkgeworICAgICAgICAgICAgICAgIGdhaW5fb2sgPSBjdXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChnYWluX29rICE9IGN1cnIpIHsKKyAgICAgICAgY3VyciA9IGdhaW5fb2s7CisgICAgICAgIG5iaXRzID0gdHJ5R2xvYmFsU3RlcHNpemUodGhhdCwgc2Z3b3JrLCB2YnJzZm1pbiwgY3VyciAtIGdhaW4pOworICAgIH0KK30KKworCisKK3N0YXRpYyBpbnQKK3NmRGVwdGgoY29uc3QgaW50IHNmd29ya1tTRkJNQVhdKQoreworICAgIGludCAgICAgbSA9IDA7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgZm9yIChqID0gU0ZCTUFYLCBpID0gMDsgaiA+IDA7IC0taiwgKytpKSB7CisgICAgICAgIGludCBjb25zdCBkaSA9IDI1NSAtIHNmd29ya1tpXTsKKyAgICAgICAgaWYgKG0gPCBkaSkgeworICAgICAgICAgICAgbSA9IGRpOworICAgICAgICB9CisgICAgICAgIGFzc2VydChzZndvcmtbaV0gPj0gMCk7CisgICAgICAgIGFzc2VydChzZndvcmtbaV0gPD0gMjU1KTsKKyAgICB9CisgICAgYXNzZXJ0KG0gPj0gMCk7CisgICAgYXNzZXJ0KG0gPD0gMjU1KTsKKyAgICByZXR1cm4gbTsKK30KKworCitzdGF0aWMgdm9pZAorY3V0RGlzdHJpYnV0aW9uKGNvbnN0IGludCBzZndvcmtbU0ZCTUFYXSwgaW50IHNmX291dFtTRkJNQVhdLCBpbnQgY3V0KQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIGZvciAoaiA9IFNGQk1BWCwgaSA9IDA7IGogPiAwOyAtLWosICsraSkgeworICAgICAgICBpbnQgY29uc3QgeCA9IHNmd29ya1tpXTsKKyAgICAgICAgc2Zfb3V0W2ldID0geCA8IGN1dCA/IHggOiBjdXQ7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQKK2ZsYXR0ZW5EaXN0cmlidXRpb24oY29uc3QgaW50IHNmd29ya1tTRkJNQVhdLCBpbnQgc2Zfb3V0W1NGQk1BWF0sIGludCBkbSwgaW50IGssIGludCBwKQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIGludCAgICAgeCwgc2ZtYXggPSAwOworICAgIGlmIChkbSA+IDApIHsKKyAgICAgICAgZm9yIChqID0gU0ZCTUFYLCBpID0gMDsgaiA+IDA7IC0taiwgKytpKSB7CisgICAgICAgICAgICBpbnQgY29uc3QgZGkgPSBwIC0gc2Z3b3JrW2ldOworICAgICAgICAgICAgeCA9IHNmd29ya1tpXSArIChrICogZGkpIC8gZG07CisgICAgICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh4ID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAyNTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Zfb3V0W2ldID0geDsKKyAgICAgICAgICAgIGlmIChzZm1heCA8IHgpIHsKKyAgICAgICAgICAgICAgICBzZm1heCA9IHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaiA9IFNGQk1BWCwgaSA9IDA7IGogPiAwOyAtLWosICsraSkgeworICAgICAgICAgICAgeCA9IHNmd29ya1tpXTsKKyAgICAgICAgICAgIHNmX291dFtpXSA9IHg7CisgICAgICAgICAgICBpZiAoc2ZtYXggPCB4KSB7CisgICAgICAgICAgICAgICAgc2ZtYXggPSB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZm1heDsKK30KKworCitzdGF0aWMgaW50Cit0cnlUaGF0T25lKGFsZ29fdCAqIHRoYXQsIGludCBzZnRlbXBbU0ZCTUFYXSwgY29uc3QgaW50IHZicnNmbWluW1NGQk1BWF0sIGludCB2YnJtYXgpCit7CisgICAgRkxPQVQgY29uc3QgeHJwb3dfbWF4ID0gdGhhdC0+Y29kX2luZm8tPnhycG93X21heDsKKyAgICBpbnQgICAgIG5iaXRzID0gTEFSR0VfQklUUzsKKyAgICB0aGF0LT5hbGxvYyh0aGF0LCBzZnRlbXAsIHZicnNmbWluLCB2YnJtYXgpOworICAgIGJpdGNvdW50KHRoYXQpOworICAgIG5iaXRzID0gcXVhbnRpemVBbmRDb3VudEJpdHModGhhdCk7CisgICAgbmJpdHMgKz0gdGhhdC0+Y29kX2luZm8tPnBhcnQyX2xlbmd0aDsKKyAgICB0aGF0LT5jb2RfaW5mby0+eHJwb3dfbWF4ID0geHJwb3dfbWF4OworICAgIHJldHVybiBuYml0czsKK30KKworCitzdGF0aWMgdm9pZAorb3V0T2ZCaXRzU3RyYXRlZ3koYWxnb190ICogdGhhdCwgY29uc3QgaW50IHNmd29ya1tTRkJNQVhdLCBjb25zdCBpbnQgdmJyc2ZtaW5bU0ZCTUFYXSwgaW50IHRhcmdldCkKK3sKKyAgICBpbnQgICAgIHdya1tTRkJNQVhdOworICAgIGludCBjb25zdCBkbSA9IHNmRGVwdGgoc2Z3b3JrKTsKKyAgICBpbnQgY29uc3QgcCA9IHRoYXQtPmNvZF9pbmZvLT5nbG9iYWxfZ2FpbjsKKyAgICBpbnQgICAgIG5iaXRzOworCisgICAgLyogUEFSVCAxICovCisgICAgeworICAgICAgICBpbnQgICAgIGJpID0gZG0gLyAyOworICAgICAgICBpbnQgICAgIGJpX29rID0gLTE7CisgICAgICAgIGludCAgICAgYnUgPSAwOworICAgICAgICBpbnQgICAgIGJvID0gZG07CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGludCBjb25zdCBzZm1heCA9IGZsYXR0ZW5EaXN0cmlidXRpb24oc2Z3b3JrLCB3cmssIGRtLCBiaSwgcCk7CisgICAgICAgICAgICBuYml0cyA9IHRyeVRoYXRPbmUodGhhdCwgd3JrLCB2YnJzZm1pbiwgc2ZtYXgpOworICAgICAgICAgICAgaWYgKG5iaXRzIDw9IHRhcmdldCkgeworICAgICAgICAgICAgICAgIGJpX29rID0gYmk7CisgICAgICAgICAgICAgICAgYm8gPSBiaSAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBidSA9IGJpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidSA8PSBibykgeworICAgICAgICAgICAgICAgIGJpID0gKGJ1ICsgYm8pIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChiaV9vayA+PSAwKSB7CisgICAgICAgICAgICBpZiAoYmkgIT0gYmlfb2spIHsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3Qgc2ZtYXggPSBmbGF0dGVuRGlzdHJpYnV0aW9uKHNmd29yaywgd3JrLCBkbSwgYmlfb2ssIHApOworICAgICAgICAgICAgICAgIG5iaXRzID0gdHJ5VGhhdE9uZSh0aGF0LCB3cmssIHZicnNmbWluLCBzZm1heCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQQVJUIDI6ICovCisgICAgeworICAgICAgICBpbnQgICAgIGJpID0gKDI1NSArIHApIC8gMjsKKyAgICAgICAgaW50ICAgICBiaV9vayA9IC0xOworICAgICAgICBpbnQgICAgIGJ1ID0gcDsKKyAgICAgICAgaW50ICAgICBibyA9IDI1NTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaW50IGNvbnN0IHNmbWF4ID0gZmxhdHRlbkRpc3RyaWJ1dGlvbihzZndvcmssIHdyaywgZG0sIGRtLCBiaSk7CisgICAgICAgICAgICBuYml0cyA9IHRyeVRoYXRPbmUodGhhdCwgd3JrLCB2YnJzZm1pbiwgc2ZtYXgpOworICAgICAgICAgICAgaWYgKG5iaXRzIDw9IHRhcmdldCkgeworICAgICAgICAgICAgICAgIGJpX29rID0gYmk7CisgICAgICAgICAgICAgICAgYm8gPSBiaSAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBidSA9IGJpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidSA8PSBibykgeworICAgICAgICAgICAgICAgIGJpID0gKGJ1ICsgYm8pIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChiaV9vayA+PSAwKSB7CisgICAgICAgICAgICBpZiAoYmkgIT0gYmlfb2spIHsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3Qgc2ZtYXggPSBmbGF0dGVuRGlzdHJpYnV0aW9uKHNmd29yaywgd3JrLCBkbSwgZG0sIGJpX29rKTsKKyAgICAgICAgICAgICAgICBuYml0cyA9IHRyeVRoYXRPbmUodGhhdCwgd3JrLCB2YnJzZm1pbiwgc2ZtYXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZmFsbCBiYWNrIHRvIG9sZCBjb2RlLCBsaWtlbHkgdG8gYmUgbmV2ZXIgY2FsbGVkICovCisgICAgc2VhcmNoR2xvYmFsU3RlcHNpemVNYXgodGhhdCwgd3JrLCB2YnJzZm1pbiwgdGFyZ2V0KTsKK30KKworCitzdGF0aWMgaW50CityZWR1Y2VfYml0X3VzYWdlKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIGludCBnciwgaW50IGNoCisjaWYgMAorICAgICAgICAgICAgICAgICAsIGNvbnN0IEZMT0FUIHhyMzRvcmlnWzU3Nl0sIGNvbnN0IEZMT0FUIGwzX3htaW5bU0ZCTUFYXSwgaW50IG1heGJpdHMKKyNlbmRpZgorICAgICkKK3sKKyAgICBncl9pbmZvICpjb25zdCBjb2RfaW5mbyA9ICZnZmMtPmwzX3NpZGUudHRbZ3JdW2NoXTsKKyAgICAvKiAgdHJ5IHNvbWUgYmV0dGVyIHNjYWxlZmFjIHN0b3JhZ2UKKyAgICAgKi8KKyAgICBiZXN0X3NjYWxlZmFjX3N0b3JlKGdmYywgZ3IsIGNoLCAmZ2ZjLT5sM19zaWRlKTsKKworICAgIC8qICBiZXN0IGh1ZmZtYW5fZGl2aWRlIG1heSBzYXZlIHNvbWUgYml0cyB0b28KKyAgICAgKi8KKyAgICBpZiAoZ2ZjLT51c2VfYmVzdF9odWZmbWFuID09IDEpCisgICAgICAgIGJlc3RfaHVmZm1hbl9kaXZpZGUoZ2ZjLCBjb2RfaW5mbyk7CisjaWYgMAorICAgIC8qIHRydW5jYXRlIHNtYWxsIHNwZWN0cnVtIHNlZW1zIHRvIGludHJvZHVjZSBwb3BzLCBkaXNhYmxlZChSSCAwNTA5MTgpICovCisgICAgaWYgKGdmYy0+c3Vic3RlcF9zaGFwaW5nICYgMSkgeworICAgICAgICB0cmFuY2F0ZV9zbWFsbHNwZWN0cnVtcyhnZmMsIGNvZF9pbmZvLCBsM194bWluLCB4cjM0b3JpZyk7CisgICAgfQorICAgIGVsc2UgaWYgKGNvZF9pbmZvLT5wYXJ0Ml8zX2xlbmd0aCA+IG1heGJpdHMgLSBjb2RfaW5mby0+cGFydDJfbGVuZ3RoKSB7CisgICAgICAgIHRyYW5jYXRlX3NtYWxsc3BlY3RydW1zKGdmYywgY29kX2luZm8sIGwzX3htaW4sIHhyMzRvcmlnKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gY29kX2luZm8tPnBhcnQyXzNfbGVuZ3RoICsgY29kX2luZm8tPnBhcnQyX2xlbmd0aDsKK30KKworCisKKworaW50CitWQlJfZW5jb2RlX2ZyYW1lKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIEZMT0FUIHhyMzRvcmlnWzJdWzJdWzU3Nl0sCisgICAgICAgICAgICAgICAgIEZMT0FUIGwzX3htaW5bMl1bMl1bU0ZCTUFYXSwgaW50IG1heF9iaXRzWzJdWzJdKQoreworICAgIGludCAgICAgc2Z3b3JrX1syXVsyXVtTRkJNQVhdOworICAgIGludCAgICAgdmJyc2ZtaW5fWzJdWzJdW1NGQk1BWF07CisgICAgYWxnb190ICB0aGF0X1syXVsyXTsKKyAgICBpbnQgY29uc3QgbmdyID0gZ2ZjLT5tb2RlX2dyOworICAgIGludCBjb25zdCBuY2ggPSBnZmMtPmNoYW5uZWxzX291dDsKKyAgICBpbnQgICAgIG1heF9uYml0c19jaFsyXVsyXTsKKyAgICBpbnQgICAgIG1heF9uYml0c19nclsyXTsKKyAgICBpbnQgICAgIG1heF9uYml0c19mciA9IDA7CisgICAgaW50ICAgICB1c2VfbmJpdHNfY2hbMl1bMl07CisgICAgaW50ICAgICB1c2VfbmJpdHNfZ3JbMl07CisgICAgaW50ICAgICB1c2VfbmJpdHNfZnIgPSAwOworICAgIGludCAgICAgZ3IsIGNoOworICAgIGludCAgICAgb2ssIHN1bV9mcjsKKworICAgIC8qIHNldCB1cCBzb21lIGVuY29kaW5nIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBmb3IgKGdyID0gMDsgZ3IgPCBuZ3I7ICsrZ3IpIHsKKyAgICAgICAgbWF4X25iaXRzX2dyW2dyXSA9IDA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5jaDsgKytjaCkgeworICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVtjaF0gPSBtYXhfYml0c1tncl1bY2hdOworICAgICAgICAgICAgdXNlX25iaXRzX2NoW2dyXVtjaF0gPSAwOworICAgICAgICAgICAgbWF4X25iaXRzX2dyW2dyXSArPSBtYXhfYml0c1tncl1bY2hdOworICAgICAgICAgICAgbWF4X25iaXRzX2ZyICs9IG1heF9iaXRzW2dyXVtjaF07CisgICAgICAgICAgICB0aGF0X1tncl1bY2hdLmdmYyA9IGdmYzsKKyAgICAgICAgICAgIHRoYXRfW2dyXVtjaF0uY29kX2luZm8gPSAmZ2ZjLT5sM19zaWRlLnR0W2dyXVtjaF07CisgICAgICAgICAgICB0aGF0X1tncl1bY2hdLnhyMzRvcmlnID0geHIzNG9yaWdbZ3JdW2NoXTsKKyAgICAgICAgICAgIGlmICh0aGF0X1tncl1bY2hdLmNvZF9pbmZvLT5ibG9ja190eXBlID09IFNIT1JUX1RZUEUpIHsKKyAgICAgICAgICAgICAgICB0aGF0X1tncl1bY2hdLmFsbG9jID0gc2hvcnRfYmxvY2tfY29uc3RyYWluOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGhhdF9bZ3JdW2NoXS5hbGxvYyA9IGxvbmdfYmxvY2tfY29uc3RyYWluOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgLyogZm9yIGNoICovCisgICAgfQorCisgICAgLyogc2VhcmNoZXMgc2NhbGVmYWN0b3JzCisgICAgICovCisgICAgZm9yIChnciA9IDA7IGdyIDwgbmdyOyArK2dyKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5jaDsgKytjaCkgeworICAgICAgICAgICAgaWYgKG1heF9iaXRzW2dyXVtjaF0gPiAwKSB7CisgICAgICAgICAgICAgICAgYWxnb190ICp0aGF0ID0gJnRoYXRfW2dyXVtjaF07CisgICAgICAgICAgICAgICAgaW50ICAgICpzZndvcmsgPSBzZndvcmtfW2dyXVtjaF07CisgICAgICAgICAgICAgICAgaW50ICAgICp2YnJzZm1pbiA9IHZicnNmbWluX1tncl1bY2hdOworICAgICAgICAgICAgICAgIGludCAgICAgdmJybWF4OworCisgICAgICAgICAgICAgICAgdmJybWF4ID0gYmxvY2tfc2YodGhhdCwgbDNfeG1pbltncl1bY2hdLCBzZndvcmssIHZicnNmbWluKTsKKyAgICAgICAgICAgICAgICB0aGF0LT5hbGxvYyh0aGF0LCBzZndvcmssIHZicnNmbWluLCB2YnJtYXgpOworICAgICAgICAgICAgICAgIGJpdGNvdW50KHRoYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogIHhyIGNvbnRhaW5zIG5vIGVuZXJneSAKKyAgICAgICAgICAgICAgICAgKiAgbDNfZW5jLCBvdXIgZW5jb2RpbmcgZGF0YSwgd2lsbCBiZSBxdWFudGl6ZWQgdG8gemVybworICAgICAgICAgICAgICAgICAqICBjb250aW51ZSB3aXRoIG5leHQgY2hhbm5lbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgLyogZm9yIGNoICovCisgICAgfQorCisgICAgLyogZW5jb2RlICdhcyBpcycKKyAgICAgKi8KKyAgICB1c2VfbmJpdHNfZnIgPSAwOworICAgIGZvciAoZ3IgPSAwOyBnciA8IG5ncjsgKytncikgeworICAgICAgICB1c2VfbmJpdHNfZ3JbZ3JdID0gMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmNoOyArK2NoKSB7CisgICAgICAgICAgICBhbGdvX3QgKnRoYXQgPSAmdGhhdF9bZ3JdW2NoXTsKKyAgICAgICAgICAgIGlmIChtYXhfYml0c1tncl1bY2hdID4gMCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtYXhfbm9uemVyb19jb2VmZiA9CisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHRoYXQtPmNvZF9pbmZvLT5tYXhfbm9uemVyb19jb2VmZjsKKworICAgICAgICAgICAgICAgIGFzc2VydChtYXhfbm9uemVyb19jb2VmZiA8IDU3Nik7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ0aGF0LT5jb2RfaW5mby0+bDNfZW5jW21heF9ub256ZXJvX2NvZWZmXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKDU3NnUgLSBtYXhfbm9uemVyb19jb2VmZikgKiBzaXplb2YodGhhdC0+Y29kX2luZm8tPmwzX2VuY1swXSkpOworCisgICAgICAgICAgICAgICAgKHZvaWQpIHF1YW50aXplQW5kQ291bnRCaXRzKHRoYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogIHhyIGNvbnRhaW5zIG5vIGVuZXJneSAKKyAgICAgICAgICAgICAgICAgKiAgbDNfZW5jLCBvdXIgZW5jb2RpbmcgZGF0YSwgd2lsbCBiZSBxdWFudGl6ZWQgdG8gemVybworICAgICAgICAgICAgICAgICAqICBjb250aW51ZSB3aXRoIG5leHQgY2hhbm5lbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNlX25iaXRzX2NoW2dyXVtjaF0gPSByZWR1Y2VfYml0X3VzYWdlKGdmYywgZ3IsIGNoKTsKKyAgICAgICAgICAgIHVzZV9uYml0c19ncltncl0gKz0gdXNlX25iaXRzX2NoW2dyXVtjaF07CisgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgY2ggKi8KKyAgICAgICAgdXNlX25iaXRzX2ZyICs9IHVzZV9uYml0c19ncltncl07CisgICAgfQorCisgICAgLyogY2hlY2sgYml0IGNvbnN0cmFpbnMKKyAgICAgKi8KKyAgICBpZiAodXNlX25iaXRzX2ZyIDw9IG1heF9uYml0c19mcikgeworICAgICAgICBvayA9IDE7CisgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IG5ncjsgKytncikgeworICAgICAgICAgICAgaWYgKHVzZV9uYml0c19ncltncl0gPiBNQVhfQklUU19QRVJfR1JBTlVMRSkgeworICAgICAgICAgICAgICAgIC8qIHZpb2xhdGVzIHRoZSBydWxlIHRoYXQgZXZlcnkgZ3JhbnVsZSBoYXMgdG8gdXNlIG5vIG1vcmUKKyAgICAgICAgICAgICAgICAgKiBiaXRzIHRoYW4gTUFYX0JJVFNfUEVSX0dSQU5VTEUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuY2g7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICBpZiAodXNlX25iaXRzX2NoW2dyXVtjaF0gPiBNQVhfQklUU19QRVJfQ0hBTk5FTCkgeworICAgICAgICAgICAgICAgICAgICAvKiB2aW9sYXRlcyB0aGUgcnVsZSB0aGF0IGV2ZXJ5IGdyX2NoIGhhcyB0byB1c2Ugbm8gbW9yZQorICAgICAgICAgICAgICAgICAgICAgKiBiaXRzIHRoYW4gTUFYX0JJVFNfUEVSX0NIQU5ORUwKKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpc24ndCBleHBsaWNpdGx5IHN0YXRlZCBpbiB0aGUgSVNPIGRvY3MsIGJ1dCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogcGFydDJfM19sZW5ndGggZmllbGQgaGFzIG9ubHkgMTIgYml0cywgdGhhdCBtYWtlcyBpdAorICAgICAgICAgICAgICAgICAgICAgKiB1cCB0byBhIG1heGltdW0gc2l6ZSBvZiA0MDk1IGJpdHMhISEKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIG9rID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICByZXR1cm4gdXNlX25iaXRzX2ZyOworICAgICAgICB9CisgICAgfQorCisgICAgLyogT0ssIHdlIGFyZSBpbiB0cm91YmxlIGFuZCBoYXZlIHRvIGRlZmluZSBob3cgbWFueSBiaXRzIGFyZQorICAgICAqIHRvIGJlIHVzZWQgZm9yIGVhY2ggZ3JhbnVsZQorICAgICAqLworICAgIHsKKyAgICAgICAgb2sgPSAxOworICAgICAgICBzdW1fZnIgPSAwOworCisgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IG5ncjsgKytncikgeworICAgICAgICAgICAgbWF4X25iaXRzX2dyW2dyXSA9IDA7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuY2g7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICBpZiAodXNlX25iaXRzX2NoW2dyXVtjaF0gPiBNQVhfQklUU19QRVJfQ0hBTk5FTCkgeworICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdW2NoXSA9IE1BWF9CSVRTX1BFUl9DSEFOTkVMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVtjaF0gPSB1c2VfbmJpdHNfY2hbZ3JdW2NoXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF4X25iaXRzX2dyW2dyXSArPSBtYXhfbmJpdHNfY2hbZ3JdW2NoXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhfbmJpdHNfZ3JbZ3JdID4gTUFYX0JJVFNfUEVSX0dSQU5VTEUpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCAgIGZbMl0sIHMgPSAwOworICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5jaDsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2NoW2dyXVtjaF0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmW2NoXSA9IHNxcnQoc3FydChtYXhfbmJpdHNfY2hbZ3JdW2NoXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcyArPSBmW2NoXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZbY2hdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuY2g7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdW2NoXSA9IE1BWF9CSVRTX1BFUl9HUkFOVUxFICogZltjaF0gLyBzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVtjaF0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuY2ggPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXhfbmJpdHNfY2hbZ3JdWzBdID4gdXNlX25iaXRzX2NoW2dyXVswXSArIDMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdWzFdICs9IG1heF9uYml0c19jaFtncl1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdWzFdIC09IHVzZV9uYml0c19jaFtncl1bMF0gKyAzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19jaFtncl1bMF0gPSB1c2VfbmJpdHNfY2hbZ3JdWzBdICsgMzI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heF9uYml0c19jaFtncl1bMV0gPiB1c2VfbmJpdHNfY2hbZ3JdWzFdICsgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19jaFtncl1bMF0gKz0gbWF4X25iaXRzX2NoW2dyXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19jaFtncl1bMF0gLT0gdXNlX25iaXRzX2NoW2dyXVsxXSArIDMyOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVsxXSA9IHVzZV9uYml0c19jaFtncl1bMV0gKyAzMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2NoW2dyXVswXSA+IE1BWF9CSVRTX1BFUl9DSEFOTkVMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdWzBdID0gTUFYX0JJVFNfUEVSX0NIQU5ORUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heF9uYml0c19jaFtncl1bMV0gPiBNQVhfQklUU19QRVJfQ0hBTk5FTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVsxXSA9IE1BWF9CSVRTX1BFUl9DSEFOTkVMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1heF9uYml0c19ncltncl0gPSAwOworICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5jaDsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfZ3JbZ3JdICs9IG1heF9uYml0c19jaFtncl1bY2hdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1bV9mciArPSBtYXhfbmJpdHNfZ3JbZ3JdOworICAgICAgICB9CisgICAgICAgIGlmIChzdW1fZnIgPiBtYXhfbmJpdHNfZnIpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCAgIGZbMl0sIHMgPSAwOworICAgICAgICAgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IG5ncjsgKytncikgeworICAgICAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2dyW2dyXSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZbZ3JdID0gc3FydChtYXhfbmJpdHNfZ3JbZ3JdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gZltncl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmW2dyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgbmdyOyArK2dyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2dyW2dyXSA9IG1heF9uYml0c19mciAqIGZbZ3JdIC8gczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19ncltncl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5nciA+IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2dyWzBdID4gdXNlX25iaXRzX2dyWzBdICsgMTI1KSB7CisgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19nclsxXSArPSBtYXhfbmJpdHNfZ3JbMF07CisgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19nclsxXSAtPSB1c2VfbmJpdHNfZ3JbMF0gKyAxMjU7CisgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19nclswXSA9IHVzZV9uYml0c19nclswXSArIDEyNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1heF9uYml0c19nclsxXSA+IHVzZV9uYml0c19nclsxXSArIDEyNSkgeworICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfZ3JbMF0gKz0gbWF4X25iaXRzX2dyWzFdOworICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfZ3JbMF0gLT0gdXNlX25iaXRzX2dyWzFdICsgMTI1OworICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfZ3JbMV0gPSB1c2VfbmJpdHNfZ3JbMV0gKyAxMjU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IG5ncjsgKytncikgeworICAgICAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2dyW2dyXSA+IE1BWF9CSVRTX1BFUl9HUkFOVUxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfZ3JbZ3JdID0gTUFYX0JJVFNfUEVSX0dSQU5VTEU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBuZ3I7ICsrZ3IpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCAgIGZbMl0sIHMgPSAwOworICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5jaDsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2NoW2dyXVtjaF0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmW2NoXSA9IHNxcnQobWF4X25iaXRzX2NoW2dyXVtjaF0pOworICAgICAgICAgICAgICAgICAgICAgICAgcyArPSBmW2NoXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZbY2hdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuY2g7ICsrY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdW2NoXSA9IG1heF9uYml0c19ncltncl0gKiBmW2NoXSAvIHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdW2NoXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5jaCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heF9uYml0c19jaFtncl1bMF0gPiB1c2VfbmJpdHNfY2hbZ3JdWzBdICsgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19jaFtncl1bMV0gKz0gbWF4X25iaXRzX2NoW2dyXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19jaFtncl1bMV0gLT0gdXNlX25iaXRzX2NoW2dyXVswXSArIDMyOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVswXSA9IHVzZV9uYml0c19jaFtncl1bMF0gKyAzMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2NoW2dyXVsxXSA+IHVzZV9uYml0c19jaFtncl1bMV0gKyAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVswXSArPSBtYXhfbmJpdHNfY2hbZ3JdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25iaXRzX2NoW2dyXVswXSAtPSB1c2VfbmJpdHNfY2hbZ3JdWzFdICsgMzI7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdWzFdID0gdXNlX25iaXRzX2NoW2dyXVsxXSArIDMyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5jaDsgKytjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heF9uYml0c19jaFtncl1bY2hdID4gTUFYX0JJVFNfUEVSX0NIQU5ORUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmJpdHNfY2hbZ3JdW2NoXSA9IE1BWF9CSVRTX1BFUl9DSEFOTkVMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgICAgICBzdW1fZnIgPSAwOworICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBuZ3I7ICsrZ3IpIHsKKyAgICAgICAgICAgIGludCAgICAgc3VtX2dyID0gMDsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5jaDsgKytjaCkgeworICAgICAgICAgICAgICAgIHN1bV9nciArPSBtYXhfbmJpdHNfY2hbZ3JdW2NoXTsKKyAgICAgICAgICAgICAgICBpZiAobWF4X25iaXRzX2NoW2dyXVtjaF0gPiBNQVhfQklUU19QRVJfQ0hBTk5FTCkgeworICAgICAgICAgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VtX2ZyICs9IHN1bV9ncjsKKyAgICAgICAgICAgIGlmIChzdW1fZ3IgPiBNQVhfQklUU19QRVJfR1JBTlVMRSkgeworICAgICAgICAgICAgICAgIG9rID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3VtX2ZyID4gbWF4X25iaXRzX2ZyKSB7CisgICAgICAgICAgICBvayA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgLyogd2UgbXVzdCBoYXZlIGRvbmUgc29tZXRoaW5nIHdyb25nLCBmYWxsYmFjayB0byAnb25fcGUnIGJhc2VkIGNvbnN0cmFpbiAqLworICAgICAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgbmdyOyArK2dyKSB7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmNoOyArK2NoKSB7CisgICAgICAgICAgICAgICAgICAgIG1heF9uYml0c19jaFtncl1bY2hdID0gbWF4X2JpdHNbZ3JdW2NoXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3ZSBhbHJlYWR5IGNhbGxlZCB0aGUgJ2Jlc3Rfc2NhbGVmYWNfc3RvcmUnIGZ1bmN0aW9uLCBzbyB3ZSBuZWVkIHRvIHJlc2V0IHNvbWUKKyAgICAgKiB2YXJpYWJsZXMgYmVmb3JlIHdlIGNhbiBkbyBpdCBhZ2Fpbi4KKyAgICAgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuY2g7ICsrY2gpIHsKKyAgICAgICAgZ2ZjLT5sM19zaWRlLnNjZnNpW2NoXVswXSA9IDA7CisgICAgICAgIGdmYy0+bDNfc2lkZS5zY2ZzaVtjaF1bMV0gPSAwOworICAgICAgICBnZmMtPmwzX3NpZGUuc2Nmc2lbY2hdWzJdID0gMDsKKyAgICAgICAgZ2ZjLT5sM19zaWRlLnNjZnNpW2NoXVszXSA9IDA7CisgICAgfQorICAgIGZvciAoZ3IgPSAwOyBnciA8IG5ncjsgKytncikgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuY2g7ICsrY2gpIHsKKyAgICAgICAgICAgIGdmYy0+bDNfc2lkZS50dFtncl1bY2hdLnNjYWxlZmFjX2NvbXByZXNzID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGFsdGVyIG91ciBlbmNvZGVkIGRhdGEsIHVudGlsIGl0IGZpdHMgaW50byB0aGUgdGFyZ2V0IGJpdHJhdGUKKyAgICAgKi8KKyAgICB1c2VfbmJpdHNfZnIgPSAwOworICAgIGZvciAoZ3IgPSAwOyBnciA8IG5ncjsgKytncikgeworICAgICAgICB1c2VfbmJpdHNfZ3JbZ3JdID0gMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmNoOyArK2NoKSB7CisgICAgICAgICAgICBhbGdvX3QgKnRoYXQgPSAmdGhhdF9bZ3JdW2NoXTsKKyAgICAgICAgICAgIHVzZV9uYml0c19jaFtncl1bY2hdID0gMDsKKyAgICAgICAgICAgIGlmIChtYXhfYml0c1tncl1bY2hdID4gMCkgeworICAgICAgICAgICAgICAgIGludCAgICAqc2Z3b3JrID0gc2Z3b3JrX1tncl1bY2hdOworICAgICAgICAgICAgICAgIGludCAgICAqdmJyc2ZtaW4gPSB2YnJzZm1pbl9bZ3JdW2NoXTsKKyAgICAgICAgICAgICAgICBjdXREaXN0cmlidXRpb24oc2Z3b3JrLCBzZndvcmssIHRoYXQtPmNvZF9pbmZvLT5nbG9iYWxfZ2Fpbik7CisgICAgICAgICAgICAgICAgb3V0T2ZCaXRzU3RyYXRlZ3kodGhhdCwgc2Z3b3JrLCB2YnJzZm1pbiwgbWF4X25iaXRzX2NoW2dyXVtjaF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNlX25iaXRzX2NoW2dyXVtjaF0gPSByZWR1Y2VfYml0X3VzYWdlKGdmYywgZ3IsIGNoKTsKKyAgICAgICAgICAgIGFzc2VydCh1c2VfbmJpdHNfY2hbZ3JdW2NoXSA8PSBtYXhfbmJpdHNfY2hbZ3JdW2NoXSk7CisgICAgICAgICAgICB1c2VfbmJpdHNfZ3JbZ3JdICs9IHVzZV9uYml0c19jaFtncl1bY2hdOworICAgICAgICB9ICAgICAgICAgICAgICAgLyogZm9yIGNoICovCisgICAgICAgIHVzZV9uYml0c19mciArPSB1c2VfbmJpdHNfZ3JbZ3JdOworICAgIH0KKworICAgIC8qIGNoZWNrIGJpdCBjb25zdHJhaW5zLCBidXQgaXQgc2hvdWxkIGFsd2F5cyBiZSBvaywgaWZmIHRoZXJlIGFyZSBubyBidWdzIDstKQorICAgICAqLworICAgIGlmICh1c2VfbmJpdHNfZnIgPD0gbWF4X25iaXRzX2ZyKSB7CisgICAgICAgIHJldHVybiB1c2VfbmJpdHNfZnI7CisgICAgfQorCisgICAgRVJST1JGKGdmYywgIklOVEVSTkFMIEVSUk9SIElOIFZCUiBORVcgQ09ERSAoMTMxMyksIHBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRcbiIKKyAgICAgICAgICAgIm1heGJpdHM9JWQgdXNlZGJpdHM9JWRcbiIsIG1heF9uYml0c19mciwgdXNlX25iaXRzX2ZyKTsKKyAgICBleGl0KC0xKTsKK30KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvdmJycXVhbnRpemUuaCBiL2xpYm1wM2xhbWUvdmJycXVhbnRpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhlZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS92YnJxdWFudGl6ZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBNUDMgVkJSIHF1YW50aXphdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBNYXJrIFRheWxvcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfVkJSUVVBTlRJWkVfSAorI2RlZmluZSBMQU1FX1ZCUlFVQU5USVpFX0gKKworaW50ICAgICBWQlJfZW5jb2RlX2ZyYW1lKGxhbWVfaW50ZXJuYWxfZmxhZ3MgKiBnZmMsIEZMT0FUIHhyMzRvcmlnWzJdWzJdWzU3Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgbDNfeG1pblsyXVsyXVtTRkJNQVhdLCBpbnQgbWF4Yml0c1syXVsyXSk7CisKKyNlbmRpZiAvKiBMQU1FX1ZCUlFVQU5USVpFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm1wM2xhbWUvdmVjdG9yL01ha2VmaWxlLmFtIGIvbGlibXAzbGFtZS92ZWN0b3IvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1OTViMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1wM2xhbWUvdmVjdG9yL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDkgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjEgMjAwNy8wMS8wOSAxMDoxNTo1MyBhbGVpZGluZ2VyIEV4cCAkCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKKworaWYgV0lUSF9YTU0KK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmxhbWV2ZWN0b3Jyb3V0aW5lcy5sYQorZW5kaWYKKworIyNsaWJsYW1lY3B1cm91dGluZXNfbGFfTElCQUREID0gCisjI2xpYmxhbWVjcHVyb3V0aW5lc19sYV9MREZMQUdTID0KKworSU5DTFVERVMgPSBASU5DTFVERVNAIFwKKwktSSQodG9wX3NyY2RpcikvbGlibXAzbGFtZSBcCisJLUkkKHRvcF9zcmNkaXIpL21wZ2xpYiBcCisJLUkkKHRvcF9idWlsZGRpcikKKworREVGUyA9IEBERUZTQCBAQ09ORklHX0RFRlNACisKK3htbV9zb3VyY2VzID0geG1tX3F1YW50aXplX3N1Yi5jCisKK2lmIFdJVEhfWE1NCitsaWJsYW1ldmVjdG9ycm91dGluZXNfbGFfU09VUkNFUyA9ICQoeG1tX3NvdXJjZXMpCitlbmRpZgorCitub2luc3RfSEVBREVSUyA9IGxhbWVfaW50cmluLmgKKworRVhUUkFfbGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX1NPVVJDRVMgPSAkKHhtbV9zb3VyY2VzKQorCitDTEVBTkZJTEVTID0gbGNsaW50LnR4dAorCitMQ0xJTlRGTEFHUz0gXAorCStwb3NpeGxpYiBcCisJK3Nob3dzdW1tYXJ5IFwKKwkrc2hvd2FsbHVzZXMgXAorCSt3aGljaGxpYiBcCisJK2ZvcmNlaGludHMgXAorCS1maXhlZGZvcm1hbGFycmF5IFwKKwkrbWF0Y2hhbnlpbnRlZ3JhbCBcCisJLURsaW50CisKK2xjbGludC50eHQ6ICR7bGlibGFtZWNwdXJvdXRpbmVzX2xhX1NPVVJDRVN9ICR7bm9pbnN0X0hFQURFUlN9CisJQGxjbGludCAke0xDTElOVEZMQUdTfSAke0lOQ0xVREVTfSAke0RFRlN9ICR7bGlibGFtZWNwdXJvdXRpbmVzX2xhX1NPVVJDRVN9IDI+JjEgPmxjbGludC50eHQgfHwgdHJ1ZQorCitsY2xpbnQ6IGxjbGludC50eHQKKwltb3JlIGxjbGludC50eHQKKworIyQoT0JKRUNUUyk6IGxpYnRvb2wKKyNsaWJ0b29sOiAkKExJQlRPT0xfREVQUykKKyMJJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3ZlY3Rvci9NYWtlZmlsZS5pbiBiL2xpYm1wM2xhbWUvdmVjdG9yL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTA1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3ZlY3Rvci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDUxMyBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKyMgZ2xvYmFsIHNlY3Rpb24gZm9yIGV2ZXJ5IE1ha2VmaWxlLmFtCisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0FOU0kyS05SID0gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRElTVF9DT01NT04gPSAkKG5vaW5zdF9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorc3ViZGlyID0gbGlibXAzbGFtZS92ZWN0b3IKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4KK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitMVExJQlJBUklFUyA9ICQobm9pbnN0X0xUTElCUkFSSUVTKQorbGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX0xJQkFERCA9CithbV9fbGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX1NPVVJDRVNfRElTVCA9IHhtbV9xdWFudGl6ZV9zdWIuYworYW1fX29iamVjdHNfMSA9IHhtbV9xdWFudGl6ZV9zdWIkVS5sbworQFdJVEhfWE1NX1RSVUVAYW1fbGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzEpCitsaWJsYW1ldmVjdG9ycm91dGluZXNfbGFfT0JKRUNUUyA9ICBcCisJJChhbV9saWJsYW1ldmVjdG9ycm91dGluZXNfbGFfT0JKRUNUUykKK0BXSVRIX1hNTV9UUlVFQGFtX2xpYmxhbWV2ZWN0b3Jyb3V0aW5lc19sYV9ycGF0aCA9CitERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJCh0b3BfYnVpbGRkaXIpQGFtX19pc3JjQAorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChsaWJsYW1ldmVjdG9ycm91dGluZXNfbGFfU09VUkNFUykgXAorCSQoRVhUUkFfbGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGFtX19saWJsYW1ldmVjdG9ycm91dGluZXNfbGFfU09VUkNFU19ESVNUKSBcCisJJChFWFRSQV9saWJsYW1ldmVjdG9ycm91dGluZXNfbGFfU09VUkNFUykKK0hFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AgQENPTkZJR19ERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AgXAorCS1JJCh0b3Bfc3JjZGlyKS9saWJtcDNsYW1lIFwKKwktSSQodG9wX3NyY2RpcikvbXBnbGliIFwKKwktSSQodG9wX2J1aWxkZGlyKQorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IDEuOSBmb3JlaWduICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK0BXSVRIX1hNTV9UUlVFQG5vaW5zdF9MVExJQlJBUklFUyA9IGxpYmxhbWV2ZWN0b3Jyb3V0aW5lcy5sYQoreG1tX3NvdXJjZXMgPSB4bW1fcXVhbnRpemVfc3ViLmMKK0BXSVRIX1hNTV9UUlVFQGxpYmxhbWV2ZWN0b3Jyb3V0aW5lc19sYV9TT1VSQ0VTID0gJCh4bW1fc291cmNlcykKK25vaW5zdF9IRUFERVJTID0gbGFtZV9pbnRyaW4uaAorRVhUUkFfbGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX1NPVVJDRVMgPSAkKHhtbV9zb3VyY2VzKQorQ0xFQU5GSUxFUyA9IGxjbGludC50eHQKK0xDTElOVEZMQUdTID0gXAorCStwb3NpeGxpYiBcCisJK3Nob3dzdW1tYXJ5IFwKKwkrc2hvd2FsbHVzZXMgXAorCSt3aGljaGxpYiBcCisJK2ZvcmNlaGludHMgXAorCS1maXhlZGZvcm1hbGFycmF5IFwKKwkrbWF0Y2hhbnlpbnRlZ3JhbCBcCisJLURsaW50CisKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGxpYm1wM2xhbWUvdmVjdG9yL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduICBsaWJtcDNsYW1lL3ZlY3Rvci9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCitjbGVhbi1ub2luc3RMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MVExJQlJBUklFUykKKwlAbGlzdD0nJChub2luc3RfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCisJICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKKwkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKKwkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKKwlkb25lCitsaWJsYW1ldmVjdG9ycm91dGluZXMubGE6ICQobGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX09CSkVDVFMpICQobGlibGFtZXZlY3RvcnJvdXRpbmVzX2xhX0RFUEVOREVOQ0lFUykgCisJJChMSU5LKSAkKGFtX2xpYmxhbWV2ZWN0b3Jyb3V0aW5lc19sYV9ycGF0aCkgJChsaWJsYW1ldmVjdG9ycm91dGluZXNfbGFfT0JKRUNUUykgJChsaWJsYW1ldmVjdG9ycm91dGluZXNfbGFfTElCQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCiskKHRvcF9zcmNkaXIpL2Fuc2kya25yOgorCWNkICQodG9wX3NyY2RpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgLi9hbnNpMmtucgorCittb3N0bHljbGVhbi1rcjoKKwktdGVzdCAiJFUiID0gIiIgfHwgcm0gLWYgKl8uYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveG1tX3F1YW50aXplX3N1YiRVLlBsb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAoreG1tX3F1YW50aXplX3N1Yl8uYzogeG1tX3F1YW50aXplX3N1Yi5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikveG1tX3F1YW50aXplX3N1Yi5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3htbV9xdWFudGl6ZV9zdWIuYzsgZWxzZSBlY2hvIHhtbV9xdWFudGl6ZV9zdWIuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoreG1tX3F1YW50aXplX3N1Yl8uJChPQkpFWFQpIHhtbV9xdWFudGl6ZV9zdWJfLmxvIDogJChBTlNJMktOUikKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICQkdGFncyAkJHVuaXF1ZTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChMVExJQlJBUklFUykgJChIRUFERVJTKQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMVExJQlJBUklFUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisKK2xjbGludC50eHQ6ICR7bGlibGFtZWNwdXJvdXRpbmVzX2xhX1NPVVJDRVN9ICR7bm9pbnN0X0hFQURFUlN9CisJQGxjbGludCAke0xDTElOVEZMQUdTfSAke0lOQ0xVREVTfSAke0RFRlN9ICR7bGlibGFtZWNwdXJvdXRpbmVzX2xhX1NPVVJDRVN9IDI+JjEgPmxjbGludC50eHQgfHwgdHJ1ZQorCitsY2xpbnQ6IGxjbGludC50eHQKKwltb3JlIGxjbGludC50eHQKKworIyQoT0JKRUNUUyk6IGxpYnRvb2wKKyNsaWJ0b29sOiAkKExJQlRPT0xfREVQUykKKyMJJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3ZlY3Rvci9sYW1lX2ludHJpbi5oIGIvbGlibXAzbGFtZS92ZWN0b3IvbGFtZV9pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTAwYTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS92ZWN0b3IvbGFtZV9pbnRyaW4uaApAQCAtMCwwICsxLDMyIEBACisvKgorICogICAgICBsYW1lX2ludHJpbi5oIGluY2x1ZGUgZmlsZQorICoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IEdhYnJpZWwgQm91dmlnbmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworCisjaWZuZGVmIExBTUVfSU5UUklOX0gKKyNkZWZpbmUgTEFNRV9JTlRSSU5fSAorCisKK3ZvaWQKK2luaXRfeHJwb3dfY29yZV9zc2UoZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvLCBGTE9BVCB4cnBvd1s1NzZdLCBpbnQgdXBwZXIsIEZMT0FUICogc3VtKTsKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS92ZWN0b3IveG1tX3F1YW50aXplX3N1Yi5jIGIvbGlibXAzbGFtZS92ZWN0b3IveG1tX3F1YW50aXplX3N1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDQyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3ZlY3Rvci94bW1fcXVhbnRpemVfc3ViLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIE1QMyBxdWFudGl6YXRpb24sIGludHJpbnNpY3MgZnVuY3Rpb25zCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBHYWJyaWVsIEJvdXZpZ25lCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgICAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJsYW1lX2ludHJpbi5oIgorCisKKworI2lmZGVmIEhBVkVfWE1NSU5UUklOX0gKKworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorCit0eXBlZGVmIHVuaW9uIHsKKyAgICBfX20xMjggIF9tMTI4OworICAgIGZsb2F0ICAgX2Zsb2F0WzRdOworfSB2ZWNmbG9hdF91bmlvbjsKKworCisKK3ZvaWQKK2luaXRfeHJwb3dfY29yZV9zc2UoZ3JfaW5mbyAqIGNvbnN0IGNvZF9pbmZvLCBGTE9BVCB4cnBvd1s1NzZdLCBpbnQgdXBwZXIsIEZMT0FUICogc3VtKQoreworICAgIGludCAgICAgaTsKKyAgICBGTE9BVCAgIHRtcDsKKyAgICBpbnQgICAgIHVwcGVyNCA9ICh1cHBlciAvIDQpICogNDsKKworCisgICAgY29uc3QgaW50IGZhYnNfbWFza1s0XSA9IHsgMHg3RkZGRkZGRiwgMHg3RkZGRkZGRiwgMHg3RkZGRkZGRiwgMHg3RkZGRkZGRiB9OworICAgIGNvbnN0IF9fbTEyOCB2ZWNfZmFic19tYXNrID0gX21tX2xvYWR1X3BzKChmbG9hdCBjb25zdCopICZmYWJzX21hc2tbMF0pOworICAgIHZlY2Zsb2F0X3VuaW9uIHZlY194cnBvd19tYXg7CisgICAgdmVjZmxvYXRfdW5pb24gdmVjX3N1bTsKKworICAgIF9tbV9wcmVmZXRjaCgoY2hhciAqKSBjb2RfaW5mby0+eHIsIF9NTV9ISU5UX1QwKTsKKyAgICBfbW1fcHJlZmV0Y2goKGNoYXIgKikgeHJwb3csIF9NTV9ISU5UX1QwKTsKKworICAgIHZlY194cnBvd19tYXguX20xMjggPSBfbW1fc2V0X3BzMSgwKTsKKyAgICB2ZWNfc3VtLl9tMTI4ID0gX21tX3NldF9wczEoMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdXBwZXI0OyBpICs9IDQpIHsKKyAgICAgICAgX19tMTI4ICB2ZWNfdG1wOworCisgICAgICAgIHZlY190bXAgPSBfbW1fbG9hZHVfcHMoJihjb2RfaW5mby0+eHJbaV0pKTsgLyogbG9hZCAqLworICAgICAgICB2ZWNfdG1wID0gX21tX2FuZF9wcyh2ZWNfdG1wLCB2ZWNfZmFic19tYXNrKTsgLyogZmFicyAqLworCisgICAgICAgIHZlY19zdW0uX20xMjggPSBfbW1fYWRkX3BzKHZlY19zdW0uX20xMjgsIHZlY190bXApOworCisgICAgICAgIHZlY190bXAgPSBfbW1fc3FydF9wcyhfbW1fbXVsX3BzKHZlY190bXAsIF9tbV9zcXJ0X3BzKHZlY190bXApKSk7CisKKyAgICAgICAgX21tX3N0b3JldV9wcygmKHhycG93W2ldKSwgdmVjX3RtcCk7IC8qIHN0b3JlIGludG8geHJwb3dbXSAqLworCisgICAgICAgIHZlY194cnBvd19tYXguX20xMjggPSBfbW1fbWF4X3BzKHZlY194cnBvd19tYXguX20xMjgsIHZlY190bXApOyAvKiByZXRyaWV2ZSBtYXggKi8KKyAgICB9CisKKyAgICAqc3VtID0gdmVjX3N1bS5fZmxvYXRbMF0gKyB2ZWNfc3VtLl9mbG9hdFsxXSArIHZlY19zdW0uX2Zsb2F0WzJdICsgdmVjX3N1bS5fZmxvYXRbM107CisgICAgY29kX2luZm8tPnhycG93X21heCA9IE1heCh2ZWNfeHJwb3dfbWF4Ll9mbG9hdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCh2ZWNfeHJwb3dfbWF4Ll9mbG9hdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXgodmVjX3hycG93X21heC5fZmxvYXRbMl0sIHZlY194cnBvd19tYXguX2Zsb2F0WzNdKSkpOworCisKKworICAgIGZvciAoaSA9IHVwcGVyNDsgaSA8PSB1cHBlcjsgKytpKSB7CisgICAgICAgIHRtcCA9IGZhYnMoY29kX2luZm8tPnhyW2ldKTsKKyAgICAgICAgKnN1bSArPSB0bXA7CisgICAgICAgIHhycG93W2ldID0gc3FydCh0bXAgKiBzcXJ0KHRtcCkpOworCisgICAgICAgIGlmICh4cnBvd1tpXSA+IGNvZF9pbmZvLT54cnBvd19tYXgpCisgICAgICAgICAgICBjb2RfaW5mby0+eHJwb3dfbWF4ID0geHJwb3dbaV07CisgICAgfQorfQorCisjZW5kaWYJLyogSEFWRV9YTU1JTlRSSU5fSCAqLworCmRpZmYgLS1naXQgYS9saWJtcDNsYW1lL3ZlcnNpb24uYyBiL2xpYm1wM2xhbWUvdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWZlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtcDNsYW1lL3ZlcnNpb24uYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqICAgICAgVmVyc2lvbiBudW1iZXJpbmcgZm9yIExBTUUuCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgQS5MLiBGYWJlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKiEKKyAgXGZpbGUgICB2ZXJzaW9uLmMKKyAgXGJyaWVmICBWZXJzaW9uIG51bWJlcmluZyBmb3IgTEFNRS4KKworICBDb250YWlucyBmdW5jdGlvbnMgd2hpY2ggZGVzY3JpYmUgdGhlIHZlcnNpb24gb2YgTEFNRS4KKworICBcYXV0aG9yIEEuTC4gRmFiZXIKKyAgXHZlcnNpb24gXCRJZDogdmVyc2lvbi5jLHYgMS4yOS4yLjEgMjAwOC8xMC8xMiAxOTozMzowOSByb2JlcnQgRXhwICQKKyAgXGluZ3JvdXAgbGlibXAzbGFtZQorKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorCisjaW5jbHVkZSAidmVyc2lvbi5oIiAgICAvKiBtYWNyb3Mgb2YgdmVyc2lvbiBudW1iZXJzICovCisKKworCisKKworLyohIEdldCB0aGUgTEFNRSB2ZXJzaW9uIHN0cmluZy4gKi8KKy8qIQorICBccGFyYW0gdm9pZAorICBccmV0dXJuIGEgcG9pbnRlciB0byBhIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIHZlcnNpb24gb2YgTEFNRS4KKyovCitjb25zdCBjaGFyICoKK2dldF9sYW1lX3ZlcnNpb24odm9pZCkKK3sgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW1hcnkgdG8gd3JpdGUgc2NyZWVuIHJlcG9ydHMgKi8KKyAgICAvKiBIZXJlIHdlIGNhbiBhbHNvIGFkZCBpbmZvcm1hdGlvbnMgYWJvdXQgY29tcGlsZSB0aW1lIGNvbmZpZ3VyYXRpb25zICovCisKKyNpZiAgIExBTUVfQUxQSEFfVkVSU0lPTgorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgU1RSKExBTUVfTUFKT1JfVkVSU0lPTikgIi4iIFNUUihMQU1FX01JTk9SX1ZFUlNJT04pICIgIgorICAgICAgICAiKGFscGhhICIgU1RSKExBTUVfUEFUQ0hfVkVSU0lPTikgIiwgIiBfX0RBVEVfXyAiICIgX19USU1FX18gIikiOworI2VsaWYgTEFNRV9CRVRBX1ZFUlNJT04KKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSAiICIKKyAgICAgICAgIihiZXRhICIgU1RSKExBTUVfUEFUQ0hfVkVSU0lPTikgIiwgIiBfX0RBVEVfXyAiKSI7CisjZWxpZiBMQU1FX1JFTEVBU0VfVkVSU0lPTiAmJiAoTEFNRV9QQVRDSF9WRVJTSU9OID4gMCkKKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSAiLiIgU1RSKExBTUVfUEFUQ0hfVkVSU0lPTik7CisjZWxzZQorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgU1RSKExBTUVfTUFKT1JfVkVSU0lPTikgIi4iIFNUUihMQU1FX01JTk9SX1ZFUlNJT04pOworI2VuZGlmCisKKyAgICByZXR1cm4gc3RyOworfQorCisKKy8qISBHZXQgdGhlIHNob3J0IExBTUUgdmVyc2lvbiBzdHJpbmcuICovCisvKiEKKyAgSXQncyBtYWlubHkgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBNUDMgc3RyZWFtLgorCisgIFxwYXJhbSB2b2lkICAgCisgIFxyZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzaG9ydCB2ZXJzaW9uIG9mIHRoZSBMQU1FIHZlcnNpb24gc3RyaW5nLgorKi8KK2NvbnN0IGNoYXIgKgorZ2V0X2xhbWVfc2hvcnRfdmVyc2lvbih2b2lkKQoreworICAgIC8qIGFkZGluZyBkYXRlIGFuZCB0aW1lIHRvIHZlcnNpb24gc3RyaW5nIG1ha2VzIGl0IGhhcmRlciBmb3Igb3V0cHV0CisgICAgICAgdmFsaWRhdGlvbiAqLworCisjaWYgICBMQU1FX0FMUEhBX1ZFUlNJT04KKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSAiIChhbHBoYSkiOworI2VsaWYgTEFNRV9CRVRBX1ZFUlNJT04KKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSAiIChiZXRhKSI7CisjZWxpZiBMQU1FX1JFTEVBU0VfVkVSU0lPTiAmJiAoTEFNRV9QQVRDSF9WRVJTSU9OID4gMCkKKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSAiLiIgU1RSKExBTUVfUEFUQ0hfVkVSU0lPTik7CisjZWxzZQorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgU1RSKExBTUVfTUFKT1JfVkVSU0lPTikgIi4iIFNUUihMQU1FX01JTk9SX1ZFUlNJT04pOworI2VuZGlmCisKKyAgICByZXR1cm4gc3RyOworfQorCisvKiEgR2V0IHRoZSBfdmVyeV8gc2hvcnQgTEFNRSB2ZXJzaW9uIHN0cmluZy4gKi8KKy8qIQorICBJdCdzIHVzZWQgaW4gdGhlIExBTUUgVkJSIHRhZyBvbmx5LgorCisgIFxwYXJhbSB2b2lkICAgCisgIFxyZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzaG9ydCB2ZXJzaW9uIG9mIHRoZSBMQU1FIHZlcnNpb24gc3RyaW5nLgorKi8KK2NvbnN0IGNoYXIgKgorZ2V0X2xhbWVfdmVyeV9zaG9ydF92ZXJzaW9uKHZvaWQpCit7CisgICAgLyogYWRkaW5nIGRhdGUgYW5kIHRpbWUgdG8gdmVyc2lvbiBzdHJpbmcgbWFrZXMgaXQgaGFyZGVyIGZvciBvdXRwdXQKKyAgICAgICB2YWxpZGF0aW9uICovCisKKyNpZiAgIExBTUVfQUxQSEFfVkVSU0lPTgorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgIkxBTUUiIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSAiYSI7CisjZWxpZiBMQU1FX0JFVEFfVkVSU0lPTgorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgIkxBTUUiIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSAiYiI7CisjZWxpZiBMQU1FX1JFTEVBU0VfVkVSU0lPTiAmJiAoTEFNRV9QQVRDSF9WRVJTSU9OID4gMCkKKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgICJMQU1FIiBTVFIoTEFNRV9NQUpPUl9WRVJTSU9OKSAiLiIgU1RSKExBTUVfTUlOT1JfVkVSU0lPTikgInIiOworI2Vsc2UKKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgICJMQU1FIiBTVFIoTEFNRV9NQUpPUl9WRVJTSU9OKSAiLiIgU1RSKExBTUVfTUlOT1JfVkVSU0lPTikgIiAiOworI2VuZGlmCisKKyAgICByZXR1cm4gc3RyOworfQorCisvKiEgR2V0IHRoZSB2ZXJzaW9uIHN0cmluZyBmb3IgR1BTWUNITy4gKi8KKy8qIQorICBccGFyYW0gdm9pZAorICBccmV0dXJuIGEgcG9pbnRlciB0byBhIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIHZlcnNpb24gb2YgR1BTWUNITy4KKyovCitjb25zdCBjaGFyICoKK2dldF9wc3lfdmVyc2lvbih2b2lkKQoreworI2lmICAgUFNZX0FMUEhBX1ZFUlNJT04gPiAwCisgICAgc3RhdGljIC8qQG9ic2VydmVyQCAqLyBjb25zdCBjaGFyICpjb25zdCBzdHIgPQorICAgICAgICBTVFIoUFNZX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoUFNZX01JTk9SX1ZFUlNJT04pCisgICAgICAgICIgKGFscGhhICIgU1RSKFBTWV9BTFBIQV9WRVJTSU9OKSAiLCAiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiKSI7CisjZWxpZiBQU1lfQkVUQV9WRVJTSU9OID4gMAorICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyID0KKyAgICAgICAgU1RSKFBTWV9NQUpPUl9WRVJTSU9OKSAiLiIgU1RSKFBTWV9NSU5PUl9WRVJTSU9OKQorICAgICAgICAiIChiZXRhICIgU1RSKFBTWV9CRVRBX1ZFUlNJT04pICIsICIgX19EQVRFX18gIikiOworI2Vsc2UKKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0ciA9CisgICAgICAgIFNUUihQU1lfTUFKT1JfVkVSU0lPTikgIi4iIFNUUihQU1lfTUlOT1JfVkVSU0lPTik7CisjZW5kaWYKKworICAgIHJldHVybiBzdHI7Cit9CisKKworLyohIEdldCB0aGUgVVJMIGZvciB0aGUgTEFNRSB3ZWJzaXRlLiAqLworLyohCisgIFxwYXJhbSB2b2lkCisgIFxyZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIHdoaWNoIGlzIGEgVVJMIGZvciB0aGUgTEFNRSB3ZWJzaXRlLgorKi8KK2NvbnN0IGNoYXIgKgorZ2V0X2xhbWVfdXJsKHZvaWQpCit7CisgICAgc3RhdGljIC8qQG9ic2VydmVyQCAqLyBjb25zdCBjaGFyICpjb25zdCBzdHIgPSBMQU1FX1VSTDsKKworICAgIHJldHVybiBzdHI7Cit9CisKKworLyohIEdldCB0aGUgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZXJzaW9uLiAqLworLyohCisgIFdyaXRlcyB0aGUgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZXJzaW9uIG9mIExBTUUgYW5kCisgIEdQU1lDSE8gaW50byBsdnAuCisKKyAgXHBhcmFtIGx2cCAgICAKKyovCit2b2lkCitnZXRfbGFtZV92ZXJzaW9uX251bWVyaWNhbChsYW1lX3ZlcnNpb25fdCAqIGx2cCkKK3sKKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IGZlYXR1cmVzID0gIiI7IC8qIG9ic29sZXRlICovCisKKyAgICAvKiBnZW5lcmljIHZlcnNpb24gKi8KKyAgICBsdnAtPm1ham9yID0gTEFNRV9NQUpPUl9WRVJTSU9OOworICAgIGx2cC0+bWlub3IgPSBMQU1FX01JTk9SX1ZFUlNJT047CisjaWYgTEFNRV9BTFBIQV9WRVJTSU9OCisgICAgbHZwLT5hbHBoYSA9IExBTUVfUEFUQ0hfVkVSU0lPTjsKKyAgICBsdnAtPmJldGEgPSAwOworI2VsaWYgTEFNRV9CRVRBX1ZFUlNJT04KKyAgICBsdnAtPmFscGhhID0gMDsKKyAgICBsdnAtPmJldGEgPSBMQU1FX1BBVENIX1ZFUlNJT047CisjZWxzZQorICAgIGx2cC0+YWxwaGEgPSAwOworICAgIGx2cC0+YmV0YSA9IDA7CisjZW5kaWYKKworICAgIC8qIHBzeSB2ZXJzaW9uICovCisgICAgbHZwLT5wc3lfbWFqb3IgPSBQU1lfTUFKT1JfVkVSU0lPTjsKKyAgICBsdnAtPnBzeV9taW5vciA9IFBTWV9NSU5PUl9WRVJTSU9OOworICAgIGx2cC0+cHN5X2FscGhhID0gUFNZX0FMUEhBX1ZFUlNJT047CisgICAgbHZwLT5wc3lfYmV0YSA9IFBTWV9CRVRBX1ZFUlNJT047CisKKyAgICAvKiBjb21waWxlIHRpbWUgZmVhdHVyZXMgKi8KKyAgICAvKkAtbXVzdGZyZWVAICovCisgICAgbHZwLT5mZWF0dXJlcyA9IGZlYXR1cmVzOworICAgIC8qQD1tdXN0ZnJlZUAgKi8KK30KKworCitjb25zdCBjaGFyICoKK2dldF9sYW1lX29zX2JpdG5lc3Modm9pZCkKK3sKKyAgICBzdGF0aWMgLypAb2JzZXJ2ZXJAICovIGNvbnN0IGNoYXIgKmNvbnN0IHN0clhYID0gIiI7CisgICAgc3RhdGljIC8qQG9ic2VydmVyQCAqLyBjb25zdCBjaGFyICpjb25zdCBzdHIzMiA9ICIzMmJpdHMiOworICAgIHN0YXRpYyAvKkBvYnNlcnZlckAgKi8gY29uc3QgY2hhciAqY29uc3Qgc3RyNjQgPSAiNjRiaXRzIjsKKworICAgIHN3aXRjaCAoc2l6ZW9mKHZvaWQgKikpIHsKKyAgICBjYXNlIDQ6CisgICAgICAgIHJldHVybiBzdHIzMjsKKworICAgIGNhc2UgODoKKyAgICAgICAgcmV0dXJuIHN0cjY0OworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHN0clhYOworICAgIH0KK30KKworLyogZW5kIG9mIHZlcnNpb24uYyAqLwpkaWZmIC0tZ2l0IGEvbGlibXAzbGFtZS92ZXJzaW9uLmggYi9saWJtcDNsYW1lL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWNjN2QwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibXAzbGFtZS92ZXJzaW9uLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICAgICAgVmVyc2lvbiBudW1iZXJpbmcgZm9yIExBTUUuCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgQS5MLiBGYWJlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIExBTUVfVkVSU0lPTl9ICisjZGVmaW5lIExBTUVfVkVSU0lPTl9ICisKKworLyoKKyAqIFRvIG1ha2UgYSBzdHJpbmcgZnJvbSBhIHRva2VuLCB1c2UgdGhlICMgb3BlcmF0b3I6CisgKi8KKyNpZm5kZWYgU1RSCisjIGRlZmluZSBfX1NUUih4KSAgI3gKKyMgZGVmaW5lIFNUUih4KSAgICBfX1NUUih4KQorI2VuZGlmCisKKyMgZGVmaW5lIExBTUVfVVJMICAgICAgICAgICAgICAiaHR0cDovL3d3dy5tcDNkZXYub3JnLyIKKworCisjIGRlZmluZSBMQU1FX01BSk9SX1ZFUlNJT04gICAgICAzIC8qIE1ham9yIHZlcnNpb24gbnVtYmVyICovCisjIGRlZmluZSBMQU1FX01JTk9SX1ZFUlNJT04gICAgIDk4IC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyICovCisjIGRlZmluZSBMQU1FX1RZUEVfVkVSU0lPTiAgICAgICAyIC8qIDA6YWxwaGEgMTpiZXRhIDI6cmVsZWFzZSAqLworIyBkZWZpbmUgTEFNRV9QQVRDSF9WRVJTSU9OICAgICAgNCAvKiBQYXRjaCBsZXZlbCAqLworIyBkZWZpbmUgTEFNRV9BTFBIQV9WRVJTSU9OICAgICAoTEFNRV9UWVBFX1ZFUlNJT049PTApCisjIGRlZmluZSBMQU1FX0JFVEFfVkVSU0lPTiAgICAgIChMQU1FX1RZUEVfVkVSU0lPTj09MSkKKyMgZGVmaW5lIExBTUVfUkVMRUFTRV9WRVJTSU9OICAgKExBTUVfVFlQRV9WRVJTSU9OPT0yKQorCisjIGRlZmluZSBQU1lfTUFKT1JfVkVSU0lPTiAgICAgICAwIC8qIE1ham9yIHZlcnNpb24gbnVtYmVyICovCisjIGRlZmluZSBQU1lfTUlOT1JfVkVSU0lPTiAgICAgIDkzIC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyICovCisjIGRlZmluZSBQU1lfQUxQSEFfVkVSU0lPTiAgICAgICAwIC8qIFNldCBudW1iZXIgaWYgdGhpcyBpcyBhbiBhbHBoYSB2ZXJzaW9uLCBvdGhlcndpc2UgemVybyAqLworIyBkZWZpbmUgUFNZX0JFVEFfVkVSU0lPTiAgICAgICAgMCAvKiBTZXQgbnVtYmVyIGlmIHRoaXMgaXMgYSBiZXRhIHZlcnNpb24sIG90aGVyd2lzZSB6ZXJvICovCisKKyNpZiBMQU1FX0FMUEhBX1ZFUlNJT04KKyNkZWZpbmUgTEFNRV9QQVRDSF9MRVZFTF9TVFJJTkcgIiBhbHBoYSAiIFNUUihMQU1FX1BBVENIX1ZFUlNJT04pCisjZW5kaWYKKyNpZiBMQU1FX0JFVEFfVkVSU0lPTgorI2RlZmluZSBMQU1FX1BBVENIX0xFVkVMX1NUUklORyAiIGJldGEgIiBTVFIoTEFNRV9QQVRDSF9WRVJTSU9OKQorI2VuZGlmCisjaWYgTEFNRV9SRUxFQVNFX1ZFUlNJT04KKyNpZiBMQU1FX1BBVENIX1ZFUlNJT04KKyNkZWZpbmUgTEFNRV9QQVRDSF9MRVZFTF9TVFJJTkcgIiByZWxlYXNlICIgU1RSKExBTUVfUEFUQ0hfVkVSU0lPTikKKyNlbHNlCisjZGVmaW5lIExBTUVfUEFUQ0hfTEVWRUxfU1RSSU5HICIiCisjZW5kaWYKKyNlbmRpZgorCisjIGRlZmluZSBMQU1FX1ZFUlNJT05fU1RSSU5HIFNUUihMQU1FX01BSk9SX1ZFUlNJT04pICIuIiBTVFIoTEFNRV9NSU5PUl9WRVJTSU9OKSBMQU1FX1BBVENIX0xFVkVMX1NUUklORworCisjZW5kaWYgLyogTEFNRV9WRVJTSU9OX0ggKi8KKworLyogRW5kIG9mIHZlcnNpb24uaCAqLwpkaWZmIC0tZ2l0IGEvbHRtYWluLnNoIGIvbHRtYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Njk4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9sdG1haW4uc2gKQEAgLTAsMCArMSw2OTg2IEBACisjIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBjb25maWd1cmUuCisjCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwKKyMgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2Jhc2VuYW1lPSJzLF4uKi8sLGciCisKKyMgV29yayBhcm91bmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSBvbiBJUklYIDYuNS4gT24gSVJJWCA2LjQrLCBzaAorIyBpcyBrc2ggYnV0IHdoZW4gdGhlIHNoZWxsIGlzIGludm9rZWQgYXMgInNoIiBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YKKyMgdGhlIF9YUEcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIDEgKG9uZSksIHRoZSBzcGVjaWFsCisjIHBvc2l0aW9uYWwgcGFyYW1ldGVyICQwLCB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsLCBpcyB0aGUgbmFtZSBvZiB0aGUKKyMgZnVuY3Rpb24uCitwcm9ncGF0aD0iJDAiCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgorcHJvZ25hbWU9YGVjaG8gIiRwcm9ncGF0aCIgfCAkU0VEICRiYXNlbmFtZWAKK21vZGVuYW1lPSIkcHJvZ25hbWUiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK0VYSVRfU1VDQ0VTUz0wCitFWElUX0ZBSUxVUkU9MQorCitQUk9HUkFNPWx0bWFpbi5zaAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPTEuNS4yNAorVElNRVNUQU1QPSIgKDEuMTIyMC4yLjQ1NSAyMDA3LzA2LzI0IDAyOjEzOjI5KSIKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZSAodGFrZW4gZnJvbSBBdXRvY29uZjpfQVNfQk9VUk5FX0NPTVBBVElCTEUpLgoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCitmaQorQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgoraWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCisgIGV4ZWMgJFNIRUxMICIkcHJvZ3BhdGgiIC0tbm8tcmVleGVjICR7MSsiJEAifQorZmkKKworaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCiskKgorRU9GCisgIGV4aXQgJEVYSVRfU1VDQ0VTUworZmkKKworZGVmYXVsdF9tb2RlPQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWtkaXI9Im1rZGlyIgorbXY9Im12IC1mIgorcm09InJtIC1mIgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIFNQMk5MPSd0ciBcMDQwIFwwMTInCisgIE5MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgU1AyTkw9J3RyIFwxMDAgXG4nCisgIE5MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgorIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKKyMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCitmb3IgbHRfdmFyIGluIExBTkcgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKK2RvCisgIGV2YWwgImlmIHRlc3QgXCJcJHskbHRfdmFyK3NldH1cIiA9IHNldDsgdGhlbgorCSAgc2F2ZV8kbHRfdmFyPVwkJGx0X3ZhcgorCSAgJGx0X3Zhcj1DCisJICBleHBvcnQgJGx0X3ZhcgorCWZpIgorZG9uZQorCisjIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAorbHRfbmw9JworJworSUZTPSIgCSRsdF9ubCIKKworaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiIDE+JjIKKyAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgIGV4aXQgJEVYSVRfRkFJTFVSRQorZmkKKworIyBHbG9iYWwgdmFyaWFibGVzLgorbW9kZT0kZGVmYXVsdF9tb2RlCitub25vcHQ9CitwcmV2PQorcHJldm9wdD0KK3J1bj0KK3Nob3c9IiRlY2hvIgorc2hvd19oZWxwPQorZXhlY3V0ZV9kbGZpbGVzPQorZHVwbGljYXRlX2RlcHM9bm8KK3ByZXNlcnZlX2FyZ3M9CitsbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCitvMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCitleHRyYWN0ZWRfYXJjaGl2ZXM9CitleHRyYWN0ZWRfc2VyaWFsPTAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTaGVsbCBmdW5jdGlvbiBkZWZpbml0aW9uczoKKyMgVGhpcyBzZWVtcyB0byBiZSB0aGUgYmVzdCBwbGFjZSBmb3IgdGhlbQorCisjIGZ1bmNfbWt0ZW1wZGlyIFtzdHJpbmddCisjIE1ha2UgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd29uJ3QgY2xhc2ggd2l0aCBvdGhlciBydW5uaW5nCisjIGxpYnRvb2wgcHJvY2Vzc2VzLCBhbmQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucyBpZiBwb3NzaWJsZS4gIElmCisjIGdpdmVuLCBTVFJJTkcgaXMgdGhlIGJhc2VuYW1lIGZvciB0aGF0IGRpcmVjdG9yeS4KK2Z1bmNfbWt0ZW1wZGlyICgpCit7CisgICAgbXlfdGVtcGxhdGU9IiR7VE1QRElSLS90bXB9LyR7MS0kcHJvZ25hbWV9IgorCisgICAgaWYgdGVzdCAiJHJ1biIgPSAiOiI7IHRoZW4KKyAgICAgICMgUmV0dXJuIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCBkb24ndCBjcmVhdGUgaXQgaW4gZHJ5LXJ1biBtb2RlCisgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSQkIgorICAgIGVsc2UKKworICAgICAgIyBJZiBta3RlbXAgd29ya3MsIHVzZSB0aGF0IGZpcnN0IGFuZCBmb3JlbW9zdAorICAgICAgbXlfdG1wZGlyPWBta3RlbXAgLWQgIiR7bXlfdGVtcGxhdGV9LVhYWFhYWFhYIiAyPi9kZXYvbnVsbGAKKworICAgICAgaWYgdGVzdCAhIC1kICIkbXlfdG1wZGlyIjsgdGhlbgorCSMgRmFpbGluZyB0aGF0LCBhdCBsZWFzdCB0cnkgYW5kIHVzZSAkUkFORE9NIHRvIGF2b2lkIGEgcmFjZQorCW15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJHtSQU5ET00tMH0kJCIKKworCXNhdmVfbWt0ZW1wZGlyX3VtYXNrPWB1bWFza2AKKwl1bWFzayAwMDc3CisJJG1rZGlyICIkbXlfdG1wZGlyIgorCXVtYXNrICRzYXZlX21rdGVtcGRpcl91bWFzaworICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gZHJ5LXJ1biBtb2RlLCBib21iIG91dCBvbiBmYWlsdXJlCisgICAgICB0ZXN0IC1kICIkbXlfdG1wZGlyIiB8fCB7CisgICAgICAgICRlY2hvICJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkbXlfdG1wZGlyJyIgMT4mMgorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgfQorICAgIGZpCisKKyAgICAkZWNobyAiWCRteV90bXBkaXIiIHwgJFhzZWQKK30KKworCisjIGZ1bmNfd2luMzJfbGliaWQgYXJnCisjIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKKyMKKyMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicworIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKKyMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgorZnVuY193aW4zMl9saWJpZCAoKQoreworICB3aW4zMl9saWJpZF90eXBlPSJ1bmtub3duIgorICB3aW4zMl9maWxlcmVzPWBmaWxlIC1MICQxIDI+L2Rldi9udWxsYAorICBjYXNlICR3aW4zMl9maWxlcmVzIGluCisgICphclwgYXJjaGl2ZVwgaW1wb3J0XCBsaWJyYXJ5KikgIyBkZWZpbml0ZWx5IGltcG9ydAorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCIKKyAgICA7OworICAqYXJcIGFyY2hpdmUqKSAjIGNvdWxkIGJlIGFuIGltcG9ydCwgb3Igc3RhdGljCisgICAgaWYgZXZhbCAkT0JKRFVNUCAtZiAkMSB8ICRTRUQgLWUgJzEwcScgMj4vZGV2L251bGwgfCBcCisgICAgICAkRUdSRVAgLWUgJ2ZpbGUgZm9ybWF0IHBlLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSAkMSB8IFwKKwkkU0VEIC1uIC1lICcxLDEwMHsKKwkJLyBJIC97CisJCQlzLC4qLGltcG9ydCwKKwkJCXAKKwkJCXEKKwkJCX0KKwkJfSdgCisgICAgICBjYXNlICR3aW4zMl9ubXJlcyBpbgorICAgICAgaW1wb3J0KikgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCI7OworICAgICAgKikgICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIHN0YXRpYyI7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgKkRMTCopCisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICA7OworICAqZXhlY3V0YWJsZSopICMgYnV0IHNoZWxsIHNjcmlwdHMgYXJlICJleGVjdXRhYmxlIiB0b28uLi4KKyAgICBjYXNlICR3aW4zMl9maWxlcmVzIGluCisgICAgKk1TXCBXaW5kb3dzXCBQRVwgSW50ZWwqKQorICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgJGVjaG8gJHdpbjMyX2xpYmlkX3R5cGUKK30KKworCisjIGZ1bmNfaW5mZXJfdGFnIGFyZworIyBJbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiB0byB1c2UgaWYgYW55IGFyZSBhdmFpbGFibGUgYW5kCisjIGlmIG9uZSB3YXNuJ3QgY2hvc2VuIHZpYSB0aGUgIi0tdGFnIiBjb21tYW5kIGxpbmUgb3B0aW9uLgorIyBPbmx5IGF0dGVtcHQgdGhpcyBpZiB0aGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZQorIyBjb21tYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgY29tcGlsZXIuCisjIGFyZyBpcyB1c3VhbGx5IG9mIHRoZSBmb3JtICdnY2MgLi4uJworZnVuY19pbmZlcl90YWcgKCkKK3sKKyAgICAjIEZyZWVCU0Qtc3BlY2lmaWM6IHdoZXJlIHdlIGluc3RhbGwgY29tcGlsZXJzIHdpdGggbm9uLXN0YW5kYXJkIG5hbWVzCisgICAgdGFnX2NvbXBpbGVyc19DQz0iKmNjIGNjKiAqZ2NjIGdjYyoiCisgICAgdGFnX2NvbXBpbGVyc19DWFg9IipjKysgYysrKiAqZysrIGcrKyoiCisgICAgYmFzZV9jb21waWxlcj1gc2V0IC0tICIkQCI7IGVjaG8gJDFgCisKKyAgICAjIElmICR0YWduYW1lIGlzbid0IHNldCwgdGhlbiB0cnkgdG8gaW5mZXIgaWYgdGhlIGRlZmF1bHQgIkNDIiB0YWcgYXBwbGllcworICAgIGlmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorICAgICAgZm9yIHpwIGluICR0YWdfY29tcGlsZXJzX0NDOyBkbworICAgICAgICBjYXNlICRiYXNlX2NvbXBpbGVyIGluCisJICR6cCkgdGFnbmFtZT0iQ0MiOyBicmVhazs7CisJZXNhYworICAgICAgZG9uZQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorICAgICAgQ0NfcXVvdGVkPQorICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJY2FzZSAkYXJnIGluCisJICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKwlDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGFyZyIKKyAgICAgIGRvbmUKKyAgICAgIGNhc2UgJEAgaW4KKyAgICAgICMgQmxhbmtzIGluIHRoZSBjb21tYW5kIG1heSBoYXZlIGJlZW4gc3RyaXBwZWQgYnkgdGhlIGNhbGxpbmcgc2hlbGwsCisgICAgICAjIGJ1dCBub3QgZnJvbSB0aGUgQ0MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBjb25maWd1cmUgd2FzIHJ1bi4KKyAgICAgICIgJENDICIqIHwgIiRDQyAiKiB8ICIgYCRlY2hvICRDQ2AgIiogfCAiYCRlY2hvICRDQ2AgIiogfCAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiBgJGVjaG8gJENDX3F1b3RlZGAgIiogfCAiYCRlY2hvICRDQ19xdW90ZWRgICIqKSA7OworICAgICAgIyBCbGFua3MgYXQgdGhlIHN0YXJ0IG9mICRiYXNlX2NvbXBpbGUgd2lsbCBjYXVzZSB0aGlzIHRvIGZhaWwKKyAgICAgICMgaWYgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0gYXMgd2VsbC4KKyAgICAgICopCisJZm9yIHogaW4gJGF2YWlsYWJsZV90YWdzOyBkbworCSAgaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHokIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCisJICAgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC9wJyA8ICRwcm9ncGF0aGAiCisJICAgIENDX3F1b3RlZD0KKwkgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICAgY2FzZSAkYXJnIGluCisJICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgICAgYXJnPSJcIiRhcmdcIiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIENDX3F1b3RlZD0iJENDX3F1b3RlZCAkYXJnIgorCSAgZG9uZQorCSAgICBjYXNlICIkQCAiIGluCisJICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJGVjaG8gJENDYCAiKiB8ICJgJGVjaG8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkZWNobyAkQ0NfcXVvdGVkYCAiKiB8ICJgJGVjaG8gJENDX3F1b3RlZGAgIiopCisJICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKKwkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgorCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCisJICAgICAgdGFnbmFtZT0kegorCSAgICAgIGJyZWFrCisJICAgICAgOzsKKwkgICAgZXNhYworCisJICAgICMgRnJlZUJTRC1zcGVjaWZpYzogdHJ5IGNvbXBpbGVycyBiYXNlZCBvbiBpbmZlcnJlZCB0YWcKKwkgICAgaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisJICAgICAgZXZhbCAidGFnX2NvbXBpbGVycz1cJHRhZ19jb21waWxlcnNfJHt6fSIKKwkgICAgICBpZiB0ZXN0IC1uICIkdGFnX2NvbXBpbGVycyI7IHRoZW4KKwkJZm9yIHpwIGluICR0YWdfY29tcGlsZXJzOyBkbworCQkgIGNhc2UgJGJhc2VfY29tcGlsZXIgaW4gICAKKwkJICAgICR6cCkgdGFnbmFtZT0kejsgYnJlYWs7OworCQkgIGVzYWMKKwkJZG9uZQorCQlpZiB0ZXN0IC1uICIkdGFnbmFtZSI7IHRoZW4KKwkJICBicmVhaworCQlmaQorCSAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisJZG9uZQorCSMgSWYgJHRhZ25hbWUgc3RpbGwgaXNuJ3Qgc2V0LCB0aGVuIG5vIHRhZ2dlZCBjb25maWd1cmF0aW9uCisJIyB3YXMgZm91bmQgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdGhlICItLXRhZyIgY29tbWFuZAorCSMgbGluZSBvcHRpb24gbXVzdCBiZSB1c2VkLgorCWlmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCSAgJGVjaG8gIiRtb2RlbmFtZTogc3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCitmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQoreworICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0CisgICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgorCisgICAgJHNob3cgIihjZCAkZl9leF9hbl9hcl9kaXIgJiYgJEFSIHggJGZfZXhfYW5fYXJfb2xkbGliKSIKKyAgICAkcnVuIGV2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwkZl9leF9hbl9hcl9vbGRsaWIpIiB8fCBleGl0ICQ/CisgICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgOgorICAgIGVsc2UKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IEVSUk9SOiBvYmplY3QgbmFtZSBjb25mbGljdHM6ICRmX2V4X2FuX2FyX2Rpci8kZl9leF9hbl9hcl9vbGRsaWIiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCit9CisKKyMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCitmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKK3sKKyAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKKyAgICBteV9vbGRsaWJzPSR7MSsiJEAifQorICAgIG15X29sZG9ianM9IiIKKyAgICBteV94bGliPSIiCisgICAgbXlfeGFicz0iIgorICAgIG15X3hkaXI9IiIKKyAgICBteV9zdGF0dXM9IiIKKworICAgICRzaG93ICIke3JtfXIgJG15X2dlbnRvcCIKKyAgICAkcnVuICR7cm19ciAiJG15X2dlbnRvcCIKKyAgICAkc2hvdyAiJG1rZGlyICRteV9nZW50b3AiCisgICAgJHJ1biAkbWtkaXIgIiRteV9nZW50b3AiCisgICAgbXlfc3RhdHVzPSQ/CisgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkbXlfZ2VudG9wIjsgdGhlbgorICAgICAgZXhpdCAkbXlfc3RhdHVzCisgICAgZmkKKworICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbworICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorICAgICAgY2FzZSAkbXlfeGxpYiBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7CisJKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7CisgICAgICBlc2FjCisgICAgICBteV94bGliPWAkZWNobyAiWCRteV94bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICBteV94bGliX3U9JG15X3hsaWIKKyAgICAgIHdoaWxlIDo7IGRvCisgICAgICAgIGNhc2UgIiAkZXh0cmFjdGVkX2FyY2hpdmVzICIgaW4KKwkqIiAkbXlfeGxpYl91ICIqKQorCSAgZXh0cmFjdGVkX3NlcmlhbD1gZXhwciAkZXh0cmFjdGVkX3NlcmlhbCArIDFgCisJICBteV94bGliX3U9bHQkZXh0cmFjdGVkX3NlcmlhbC0kbXlfeGxpYiA7OworCSopIGJyZWFrIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZXh0cmFjdGVkX2FyY2hpdmVzPSIkZXh0cmFjdGVkX2FyY2hpdmVzICRteV94bGliX3UiCisgICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliX3UiCisKKyAgICAgICRzaG93ICIke3JtfXIgJG15X3hkaXIiCisgICAgICAkcnVuICR7cm19ciAiJG15X3hkaXIiCisgICAgICAkc2hvdyAiJG1rZGlyICRteV94ZGlyIgorICAgICAgJHJ1biAkbWtkaXIgIiRteV94ZGlyIgorICAgICAgZXhpdF9zdGF0dXM9JD8KKyAgICAgIGlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkbXlfeGRpciI7IHRoZW4KKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotZGFyd2luKikKKwkkc2hvdyAiRXh0cmFjdGluZyAkbXlfeGFicyIKKwkjIERvIG5vdCBib3RoZXIgZG9pbmcgYW55dGhpbmcgaWYganVzdCBhIGRyeSBydW4KKwlpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSAgZGFyd2luX29yaWdfZGlyPWBwd2RgCisJICBjZCAkbXlfeGRpciB8fCBleGl0ICQ/CisJICBkYXJ3aW5fYXJjaGl2ZT0kbXlfeGFicworCSAgZGFyd2luX2N1cmRpcj1gcHdkYAorCSAgZGFyd2luX2Jhc2VfYXJjaGl2ZT1gJGVjaG8gIlgkZGFyd2luX2FyY2hpdmUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgIGRhcndpbl9hcmNoZXM9YGxpcG8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkRUdSRVAgQXJjaGl0ZWN0dXJlcyAyPi9kZXYvbnVsbGAKKwkgIGlmIHRlc3QgLW4gIiRkYXJ3aW5fYXJjaGVzIjsgdGhlbiAKKwkgICAgZGFyd2luX2FyY2hlcz1gZWNobyAiJGRhcndpbl9hcmNoZXMiIHwgJFNFRCAtZSAncy8uKmFyZTovLydgCisJICAgIGRhcndpbl9hcmNoPQorCSAgICAkc2hvdyAiJGRhcndpbl9iYXNlX2FyY2hpdmUgaGFzIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgJGRhcndpbl9hcmNoZXMiCisJICAgIGZvciBkYXJ3aW5fYXJjaCBpbiAgJGRhcndpbl9hcmNoZXMgOyBkbworCSAgICAgIG1rZGlyIC1wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGxpcG8gLXRoaW4gJGRhcndpbl9hcmNoIC1vdXRwdXQgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIgIiR7ZGFyd2luX2FyY2hpdmV9IgorCSAgICAgIGNkICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICJgcHdkYCIgIiR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCisJICAgICAgY2QgIiRkYXJ3aW5fY3VyZGlyIgorCSAgICAgICRybSAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICBkb25lICMgJGRhcndpbl9hcmNoZXMKKyAgICAgICMjIE9rYXkgbm93IHdlIGhhdmUgYSBidW5jaCBvZiB0aGluIG9iamVjdHMsIGdvdHRhIGZhdHRlbiB0aGVtIHVwIDopCisJICAgIGRhcndpbl9maWxlbGlzdD1gZmluZCB1bmZhdC0kJCAtdHlwZSBmIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludHwgeGFyZ3MgYmFzZW5hbWUgfCBzb3J0IC11IHwgJE5MMlNQYAorCSAgICBkYXJ3aW5fZmlsZT0KKwkgICAgZGFyd2luX2ZpbGVzPQorCSAgICBmb3IgZGFyd2luX2ZpbGUgaW4gJGRhcndpbl9maWxlbGlzdDsgZG8KKwkgICAgICBkYXJ3aW5fZmlsZXM9YGZpbmQgdW5mYXQtJCQgLW5hbWUgJGRhcndpbl9maWxlIC1wcmludCB8ICROTDJTUGAKKwkgICAgICBsaXBvIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCisJICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0CisJICAgICR7cm19ciB1bmZhdC0kJAorCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKKwkgIGVsc2UKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisgCSAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKKwkgIGZpICMgJGRhcndpbl9hcmNoZXMKKwlmaSAjICRydW4KKwk7OworICAgICAgKikKKyAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICBteV9vbGRvYmpzPSIkbXlfb2xkb2JqcyAiYGZpbmQgJG15X3hkaXIgLW5hbWUgXCouJG9iamV4dCAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAorICAgIGRvbmUKKyAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0PSIkbXlfb2xkb2JqcyIKK30KKyMgRW5kIG9mIFNoZWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRGFyd2luIHN1Y2tzCitldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCitkaXNhYmxlX2xpYnM9bm8KKworIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KK3doaWxlIHRlc3QgIiQjIiAtZ3QgMAorZG8KKyAgYXJnPSIkMSIKKyAgc2hpZnQKKworICBjYXNlICRhcmcgaW4KKyAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBvcHRhcmc9IDs7CisgIGVzYWMKKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgY2FzZSAkcHJldiBpbgorICAgIGV4ZWN1dGVfZGxmaWxlcykKKyAgICAgIGV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkYXJnIgorICAgICAgOzsKKyAgICB0YWcpCisgICAgICB0YWduYW1lPSIkYXJnIgorICAgICAgcHJlc2VydmVfYXJncz0iJHtwcmVzZXJ2ZV9hcmdzfT0kYXJnIgorCisgICAgICAjIENoZWNrIHdoZXRoZXIgdGFnbmFtZSBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgICpbIS1fQS1aYS16MC05LC9dKikKKwkkZWNobyAiJHByb2duYW1lOiBpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIgMT4mMgorCWV4aXQgJEVYSVRfRkFJTFVSRQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgIENDKQorCSMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdywgaXQncyB0aGVyZSwgYnV0CisJIyBub3Qgc3BlY2lhbGx5IG1hcmtlZC4KKwk7OworICAgICAgKikKKwlpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KKwkgIHRhZ2xpc3Q9IiR0YWdsaXN0ICR0YWduYW1lIgorCSAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KKwkgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHRhZ25hbWUnJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHRhZ25hbWUnJC9wJyA8ICRwcm9ncGF0aGAiCisJZWxzZQorCSAgJGVjaG8gIiRwcm9nbmFtZTogaWdub3JpbmcgdW5rbm93biB0YWcgJHRhZ25hbWUiIDE+JjIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICopCisgICAgICBldmFsICIkcHJldj1cJGFyZyIKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgcHJldj0KKyAgICBwcmV2b3B0PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PworICBjYXNlICRhcmcgaW4KKyAgLS1oZWxwKQorICAgIHNob3dfaGVscD15ZXMKKyAgICA7OworCisgIC0tdmVyc2lvbikKKyAgICBlY2hvICJcCiskUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiRUSU1FU1RBTVAKKworQ29weXJpZ2h0IChDKSAyMDA3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLS1jb25maWcpCisgICAgJHtTRUR9IC1lICcxLC9eIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcvZCcgLWUgJy9eIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJHByb2dwYXRoCisgICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KKyAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KKyAgICAgICR7U0VEfSAtbiAtZSAiL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQvcCIgPCAiJHByb2dwYXRoIgorICAgIGRvbmUKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtLWRlYnVnKQorICAgICRlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCisgICAgc2V0IC14CisgICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJGFyZyIKKyAgICA7OworCisgIC0tZHJ5LXJ1biB8IC1uKQorICAgIHJ1bj06CisgICAgOzsKKworICAtLWZlYXR1cmVzKQorICAgICRlY2hvICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgJGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgICRlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAkZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgJGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7CisKKyAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OworICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKKworICAtLXByZXNlcnZlLWR1cC1kZXBzKSBkdXBsaWNhdGVfZGVwcz0ieWVzIiA7OworCisgIC0tcXVpZXQgfCAtLXNpbGVudCkKKyAgICBzaG93PToKKyAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkYXJnIgorICAgIDs7CisKKyAgLS10YWcpCisgICAgcHJldm9wdD0iLS10YWciCisgICAgcHJldj10YWcKKyAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAtLXRhZyIKKyAgICA7OworICAtLXRhZz0qKQorICAgIHNldCB0YWcgIiRvcHRhcmciICR7MSsiJEAifQorICAgIHNoaWZ0CisgICAgcHJldj10YWcKKyAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAtLXRhZyIKKyAgICA7OworCisgIC1kbG9wZW4pCisgICAgcHJldm9wdD0iLWRsb3BlbiIKKyAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcworICAgIDs7CisKKyAgLSopCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgOzsKKworICAqKQorICAgIG5vbm9wdD0iJGFyZyIKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCisgICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCitjYXNlICRkaXNhYmxlX2xpYnMgaW4KK25vKSAKKyAgOzsKK3NoYXJlZCkKKyAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisgIGJ1aWxkX29sZF9saWJzPXllcworICA7Oworc3RhdGljKQorICBidWlsZF9vbGRfbGlicz1gY2FzZSAkYnVpbGRfbGlidG9vbF9saWJzIGluIHllcykgZWNobyBubzs7ICopIGVjaG8geWVzOzsgZXNhY2AKKyAgOzsKK2VzYWMKKworIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0CisjIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKKyMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KK2V4ZWNfY21kPQorCitpZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgorCisgICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgorICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKyAgICAkZWNobyAiKioqIFdhcm5pbmc6IGluZmVycmluZyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gaXMgZGVwcmVjYXRlZC4iIDE+JjIKKyAgICAkZWNobyAiKioqIEZ1dHVyZSB2ZXJzaW9ucyBvZiBMaWJ0b29sIHdpbGwgcmVxdWlyZSAtLW1vZGU9TU9ERSBiZSBzcGVjaWZpZWQuIiAxPiYyCisgICAgY2FzZSAkbm9ub3B0IGluCisgICAgKmNjIHwgY2MqIHwgKisrIHwgZ2NjKiB8ICotZ2NjKiB8IGcrKyogfCB4bGMqKQorICAgICAgbW9kZT1saW5rCisgICAgICBmb3IgYXJnCisgICAgICBkbworCWNhc2UgJGFyZyBpbgorCS1jKQorCSAgIG1vZGU9Y29tcGlsZQorCSAgIGJyZWFrCisJICAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQorICAgICAgbW9kZT1leGVjdXRlCisgICAgICA7OworICAgICppbnN0YWxsKnxjcHxtdikKKyAgICAgIG1vZGU9aW5zdGFsbAorICAgICAgOzsKKyAgICAqcm0pCisgICAgICBtb2RlPXVuaW5zdGFsbAorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KKyAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQorCisgICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgorICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCisJaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCisgICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCisgIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIGZpCisKKyAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgorICBnZW5lcmljX2hlbHA9IiRoZWxwIgorICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisgICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgorICBjYXNlICRtb2RlIGluCisgICMgbGlidG9vbCBjb21waWxlIG1vZGUKKyAgY29tcGlsZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgorICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKKyAgICBzdXBwcmVzc19vcHQ9eWVzCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorICAgIGFyZ19tb2RlPW5vcm1hbAorICAgIGxpYm9iaj0KKyAgICBsYXRlcj0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnX21vZGUgaW4KKyAgICAgIGFyZyAgKQorCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKKwlsYXN0YXJnPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCTs7CisKKyAgICAgIHRhcmdldCApCisJbGlib2JqPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCWNvbnRpbnVlCisJOzsKKworICAgICAgbm9ybWFsICkKKwkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisJY2FzZSAkYXJnIGluCisJLW8pCisJICBpZiB0ZXN0IC1uICIkbGlib2JqIiA7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgIGFyZ19tb2RlPXRhcmdldAorCSAgY29udGludWUKKwkgIDs7CisKKwktc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCisJICBsYXRlcj0iJGxhdGVyICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1uby1zdXBwcmVzcykKKwkgIHN1cHByZXNzX29wdD1ubworCSAgY29udGludWUKKwkgIDs7CisKKwktWGNvbXBpbGVyKQorCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAorCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKKwkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCisKKwktV2MsKikKKwkgIGFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eLVdjLC8vImAKKwkgIGxhc3Rhcmc9CisJICBzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKyAJICBmb3IgYXJnIGluICRhcmdzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKworCSAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisJICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisJICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisJICAgIGNhc2UgJGFyZyBpbgorCSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICAgIGFyZz0iXCIkYXJnXCIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBsYXN0YXJnPSIkbGFzdGFyZyAkYXJnIgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAorCisJICAjIEFkZCB0aGUgYXJndW1lbnRzIHRvIGJhc2VfY29tcGlsZS4KKwkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJKiApCisJICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCisJICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KKwkgICMKKwkgIGxhc3Rhcmc9IiRzcmNmaWxlIgorCSAgc3JjZmlsZT0iJGFyZyIKKwkgIDs7CisJZXNhYyAgIyAgY2FzZSAkYXJnCisJOzsKKyAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKyAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisgICAgICBjYXNlICRsYXN0YXJnIGluCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIGFuZCBzb21lIFN1bk9TIGtzaCBtaXN0cmVhdCBiYWNrc2xhc2gtZXNjYXBpbmcKKyAgICAgICMgaW4gc2NhbiBzZXRzICh3b3JrZWQgYXJvdW5kIHdpdGggdmFyaWFibGUgZXhwYW5zaW9uKSwKKyAgICAgICMgYW5kIGZ1cnRoZXJtb3JlIGNhbm5vdCBoYW5kbGUgJ3wnICcmJyAnKCcgJyknIGluIHNjYW4gc2V0cyAKKyAgICAgICMgYXQgYWxsLCBzbyB3ZSBzcGVjaWZ5IHRoZW0gc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKKwk7OworICAgICAgZXNhYworCisgICAgICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCisgICAgZG9uZSAjIGZvciBhcmcKKworICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgYXJnKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICA7OworICAgIHRhcmdldCkKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICA7OworICAgICopCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICBbIC16ICIkbGlib2JqIiBdICYmIGxpYm9iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgeGZvcm09J1tjQ0ZTaWZtc29dJworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKKyAgICAqLmFkYikgeGZvcm09YWRiIDs7CisgICAgKi5hZHMpIHhmb3JtPWFkcyA7OworICAgICouYXNtKSB4Zm9ybT1hc20gOzsKKyAgICAqLmMrKykgeGZvcm09YysrIDs7CisgICAgKi5jYykgeGZvcm09Y2MgOzsKKyAgICAqLmlpKSB4Zm9ybT1paSA7OworICAgICouY2xhc3MpIHhmb3JtPWNsYXNzIDs7CisgICAgKi5jcHApIHhmb3JtPWNwcCA7OworICAgICouY3h4KSB4Zm9ybT1jeHggOzsKKyAgICAqLltmRl1bMDldPykgeGZvcm09W2ZGXVswOV0uIDs7CisgICAgKi5mb3IpIHhmb3JtPWZvciA7OworICAgICouamF2YSkgeGZvcm09amF2YSA7OworICAgICoub2JqKSB4Zm9ybT1vYmogOzsKKyAgICBlc2FjCisKKyAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCisKKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OworICAgICopCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgZm9yIGFyZyBpbiAkbGF0ZXI7IGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zdGF0aWMpCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLXBpYykKKwlwaWNfbW9kZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItbm9uLXBpYykKKwlwaWNfbW9kZT1ubworCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBxbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgIGNhc2UgJHFsaWJvYmogaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCXFsaWJvYmo9IlwiJHFsaWJvYmpcIiIgOzsKKyAgICBlc2FjCisgICAgdGVzdCAiWCRsaWJvYmoiICE9ICJYJHFsaWJvYmoiIFwKKwkmJiAkZWNobyAiWCRsaWJvYmoiIHwgZ3JlcCAnW11+I14qe307PD4/IiciJyInIAkmKCl8YCRbXScgXAorCSYmICRlY2hvICIkbW9kZW5hbWU6IGxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCisgICAgb2JqbmFtZT1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgeGRpcj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KKyAgICAgIHhkaXI9CisgICAgZWxzZQorICAgICAgeGRpcj0keGRpci8KKyAgICBmaQorICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKKworICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICByZW1vdmVsaXN0PSIkb2JqICRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBlbHNlCisgICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCisgICAgZmkKKworICAgICRydW4gJHJtICRyZW1vdmVsaXN0CisgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKyAgICAjIE9uIEN5Z3dpbiB0aGVyZSdzIG5vICJyZWFsIiBQSUMgZmxhZyBzbyB3ZSBtdXN0IGJ1aWxkIGJvdGggb2JqZWN0IHR5cGVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgICA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICIkcGljX21vZGUiID0gbm8gJiYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorICAgICAgIyBub24tUElDIGNvZGUgaW4gc2hhcmVkIGxpYnJhcmllcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgZmkKKworICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCisgICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCisgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgorICAgICAgb3V0cHV0X29iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzJVwuW14uXSokJSUnYC4ke29iamV4dH0KKyAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgorICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmogJGxvY2tmaWxlIgorICAgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisgICAgZWxzZQorICAgICAgb3V0cHV0X29iaj0KKyAgICAgIG5lZWRfbG9ja3M9bm8KKyAgICAgIGxvY2tmaWxlPQorICAgIGZpCisKKyAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAorICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KKyAgICAgIHVudGlsICRydW4gbG4gIiRwcm9ncGF0aCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCisJJHNob3cgIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KKwkkZWNobyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgICAkZWNobyAiJHNyY2ZpbGUiID4gIiRsb2NrZmlsZSIKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCisgICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCisgICAgZmkKKyAgICBxc3JjZmlsZT1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgY2FzZSAkcXNyY2ZpbGUgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgcXNyY2ZpbGU9IlwiJHFzcmNmaWxlXCIiIDs7CisgICAgZXNhYworCisgICAgJHJ1biAkcm0gIiRsaWJvYmoiICIke2xpYm9ian1UIgorCisgICAgIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKKyAgICAjIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgorICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+ICR7bGlib2JqfVQgPDxFT0YKKyMgJGxpYm9iaiAtIGEgbGlidG9vbCBvYmplY3QgZmlsZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIE5hbWUgb2YgdGhlIFBJQyBvYmplY3QuCitFT0YKKworICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgorICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCisKKyAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0gbm87IHRoZW4KKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBlbHNlCisJIyBEb24ndCBidWlsZCBQSUMgY29kZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAhIC1kICIke3hkaXJ9JG9iamRpciI7IHRoZW4KKwkkc2hvdyAiJG1rZGlyICR7eGRpcn0kb2JqZGlyIgorCSRydW4gJG1rZGlyICR7eGRpcn0kb2JqZGlyCisJZXhpdF9zdGF0dXM9JD8KKwlpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJHt4ZGlyfSRvYmpkaXIiOyB0aGVuCisJICBleGl0ICRleGl0X3N0YXR1cworCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KKwkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKKwljb21tYW5kPSIkY29tbWFuZCAtbyAkbG9iaiIKKyAgICAgIGZpCisKKyAgICAgICRydW4gJHJtICIkbG9iaiIgIiRvdXRwdXRfb2JqIgorCisgICAgICAkc2hvdyAiJGNvbW1hbmQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6CisgICAgICBlbHNlCisJdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCisJJGVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCisJJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkbG9iaiIKKwlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkbG9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgUElDIG9iamVjdCB0byB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCitwaWNfb2JqZWN0PSckb2JqZGlyLyRvYmpuYW1lJworCitFT0YKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgaWYgdGVzdCAiJHN1cHByZXNzX29wdCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJworICAgICAgZmkKKyAgICBlbHNlCisgICAgICAjIE5vIFBJQyBvYmplY3Qgc28gaW5kaWNhdGUgaXQgZG9lc24ndCBleGlzdCBpbiB0aGUgbGlidG9vbAorICAgICAgIyBvYmplY3QgZmlsZS4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCitwaWNfb2JqZWN0PW5vbmUKKworRU9GCisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKKyAgICAgIGVsc2UKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgorICAgICAgZmkKKworICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCisgICAgICAkcnVuICRybSAiJG9iaiIgIiRvdXRwdXRfb2JqIgorICAgICAgJHNob3cgIiRjb21tYW5kIgorICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgorICAgICAgZWxzZQorCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCisJJGVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KKwkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRvYmoiCisJaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJG9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCisgICAgICAjIE9ubHkgYXBwZW5kIGlmIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlIGV4aXN0cy4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Lgorbm9uX3BpY19vYmplY3Q9JyRvYmpuYW1lJworCitFT0YKKyAgICBlbHNlCisgICAgICAjIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUuCisgICAgICAjIE9ubHkgYXBwZW5kIGlmIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlIGV4aXN0cy4KKyAgICAgIHRlc3QgLXogIiRydW4iICYmIGNhdCA+PiAke2xpYm9ian1UIDw8RU9GCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Lgorbm9uX3BpY19vYmplY3Q9bm9uZQorCitFT0YKKyAgICBmaQorCisgICAgJHJ1biAkbXYgIiR7bGlib2JqfVQiICIke2xpYm9ian0iCisKKyAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICAgICAkcnVuICRybSAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICA7OworCisgICMgbGlidG9vbCBsaW5rIG1vZGUKKyAgbGluayB8IHJlbGluaykKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgorICAgIGNhc2UgJGhvc3QgaW4KKyAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKyAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKKyAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKKyAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKKyAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZvY2F0aW9uLgorICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KKworICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCisgICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAorICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKKyAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgorICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIGxpYnRvb2xfYXJncz0iJG5vbm9wdCIKKyAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCisgICAgY29tcGlsZV9jb21tYW5kPSIkbm9ub3B0IgorICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRub25vcHQiCisKKyAgICBjb21waWxlX3JwYXRoPQorICAgIGZpbmFsaXplX3JwYXRoPQorICAgIGNvbXBpbGVfc2hsaWJwYXRoPQorICAgIGZpbmFsaXplX3NobGlicGF0aD0KKyAgICBjb252ZW5pZW5jZT0KKyAgICBvbGRfY29udmVuaWVuY2U9CisgICAgZGVwbGlicz0KKyAgICBvbGRfZGVwbGlicz0KKyAgICBjb21waWxlcl9mbGFncz0KKyAgICBsaW5rZXJfZmxhZ3M9CisgICAgZGxsc2VhcmNocGF0aD0KKyAgICBsaWJfc2VhcmNoX3BhdGg9YHB3ZGAKKyAgICBpbnN0X3ByZWZpeF9kaXI9CisKKyAgICBhdm9pZF92ZXJzaW9uPW5vCisgICAgZGxmaWxlcz0KKyAgICBkbHByZWZpbGVzPQorICAgIGRsc2VsZj1ubworICAgIGV4cG9ydF9keW5hbWljPW5vCisgICAgZXhwb3J0X3N5bWJvbHM9CisgICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9CisgICAgZ2VuZXJhdGVkPQorICAgIGxpYm9ianM9CisgICAgbHRsaWJzPQorICAgIG1vZHVsZT1ubworICAgIG5vX2luc3RhbGw9bm8KKyAgICBvYmpzPQorICAgIG5vbl9waWNfb2JqZWN0cz0KKyAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBwcmVjaW91c19maWxlc19yZWdleD0KKyAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KKyAgICBwcmVsb2FkPW5vCisgICAgcHJldj0KKyAgICBwcmV2YXJnPQorICAgIHJlbGVhc2U9CisgICAgcnBhdGg9CisgICAgeHJwYXRoPQorICAgIHBlcm1fcnBhdGg9CisgICAgdGVtcF9ycGF0aD0KKyAgICB0aHJlYWRfc2FmZT1ubworICAgIHZpbmZvPQorICAgIHZpbmZvX251bWJlcj1ubworCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMgfCAtc3RhdGljLWxpYnRvb2wtbGlicykKKwljYXNlICRhcmcgaW4KKwktYWxsLXN0YXRpYykKKwkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIgMT4mMgorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCSAgOzsKKwktc3RhdGljKQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz1idWlsdAorCSAgOzsKKwktc3RhdGljLWxpYnRvb2wtbGlicykKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJICA7OworCWVzYWMKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwlicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIHdoaWxlIHRlc3QgIiQjIiAtZ3QgMDsgZG8KKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgICAgY2FzZSAkYXJnIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwlxYXJnPVwiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgXCIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJOzsKKyAgICAgICopIHFhcmc9JGFyZyA7OworICAgICAgZXNhYworICAgICAgbGlidG9vbF9hcmdzPSIkbGlidG9vbF9hcmdzICRxYXJnIgorCisgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCWNhc2UgJHByZXYgaW4KKwlvdXRwdXQpCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcHJldiBpbgorCWRsZmlsZXN8ZGxwcmVmaWxlcykKKwkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAU1lNRklMRUAiCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBTWU1GSUxFQCIKKwkgICAgcHJlbG9hZD15ZXMKKwkgIGZpCisJICBjYXNlICRhcmcgaW4KKwkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCisJICBmb3JjZSkKKwkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbHNlCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWV4cHN5bXMpCisJICBleHBvcnRfc3ltYm9scz0iJGFyZyIKKwkgIGlmIHRlc3QgISAtZiAiJGFyZyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogc3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWV4cHN5bXNfcmVnZXgpCisJICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlpbnN0X3ByZWZpeCkKKwkgIGluc3RfcHJlZml4X2Rpcj0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlwcmVjaW91c19yZWdleCkKKwkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlvYmplY3RsaXN0KQorCSAgaWYgdGVzdCAtZiAiJGFyZyI7IHRoZW4KKwkgICAgc2F2ZV9hcmc9JGFyZworCSAgICBtb3JlYXJncz0KKwkgICAgZm9yIGZpbCBpbiBgY2F0ICRzYXZlX2FyZ2AKKwkgICAgZG8KKyMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgorCSAgICAgIGFyZz0kZmlsCisJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJICAgICAgaWYgKCR7U0VEfSAtZSAnMnEnICRhcmcgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlwaWNfb2JqZWN0PQorCQlub25fcGljX29iamVjdD0KKworCQkjIFJlYWQgdGhlIC5sbyBmaWxlCisJCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCQljYXNlICRhcmcgaW4KKwkJKi8qIHwgKlxcKikgLiAkYXJnIDs7CisJCSopIC4gLi8kYXJnIDs7CisJCWVzYWMKKworCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgXAorCQkgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8CisJCSAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAorCQkgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgorCQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIiAxPiYyCisJCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJCWZpCisKKwkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCisJCSAgeGRpcj0KKwkJZWxzZQorCQkgIHhkaXI9IiR4ZGlyLyIKKwkJZmkKKworCQlpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KKwkJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJHBpY19vYmplY3QiCisJCSAgICAgIHByZXY9CisJCSAgICAgIGNvbnRpbnVlCisJCSAgICBlbHNlCisJCSAgICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCSAgICAgIHByZXY9ZGxwcmVmaWxlcworCQkgICAgZmkKKwkJICBmaQorCisJCSAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJCSAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKKwkJICAgIHByZXY9CisJCSAgZmkKKworCQkgICMgQSBQSUMgb2JqZWN0LgorCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgorCQkgIGFyZz0iJHBpY19vYmplY3QiCisJCWZpCisKKwkJIyBOb24tUElDIG9iamVjdC4KKwkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKKwkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCQkgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJCSAgZmkKKwkJZWxzZQorCQkgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkJICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCisJCSAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZWxzZQorCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KKwkJaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCisJCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJCWVsc2UKKwkJICAjIERyeS1ydW4gY2FzZS4KKworCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KKwkJICAgIHhkaXI9CisJCSAgZWxzZQorCQkgICAgeGRpcj0iJHhkaXIvIgorCQkgIGZpCisKKwkJICBwaWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke29iamRpcn0vJHthcmd9IiB8ICRYc2VkIC1lICIkbG8ybyJgCisJCSAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCQkgIGxpYm9ianM9IiRsaWJvYmpzICRwaWNfb2JqZWN0IgorCQkgIG5vbl9waWNfb2JqZWN0cz0iJG5vbl9waWNfb2JqZWN0cyAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBsaW5rIGlucHV0IGZpbGUgXGAkc2F2ZV9hcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBhcmc9JHNhdmVfYXJnCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcnBhdGggfCB4cnBhdGgpCisJICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkgIGNhc2UgJGFyZyBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSAgKikKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgorCSAgICBjYXNlICIkcnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGVsc2UKKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OworCSAgICBlc2FjCisJICBmaQorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhjb21waWxlcikKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBwcmV2PQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4bGlua2VyKQorCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRxYXJnIgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkcWFyZyIKKwkgIHByZXY9CisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHdsJHFhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkd2wkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhjY2xpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBwcmV2PQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRxYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwlzaHJleHQpCisgIAkgIHNocmV4dF9jbWRzPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWRhcndpbl9mcmFtZXdvcmt8ZGFyd2luX2ZyYW1ld29ya19za2lwKQorCSAgdGVzdCAiJHByZXYiID0gImRhcndpbl9mcmFtZXdvcmsiICYmIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1hdm9pZC12ZXJzaW9uKQorCWF2b2lkX3ZlcnNpb249eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxvcGVuKQorCXByZXY9ZGxmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRscHJlb3BlbikKKwlwcmV2PWRscHJlZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtZHluYW1pYykKKwlleHBvcnRfZHluYW1pYz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IG1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmt8LWFyY2h8LWlzeXNyb290KQorCWNhc2UgIiAkQ0MgIiBpbgorCSAgKiIgJHthcmd9ICR7MX0gIiogfCAqIiAke2FyZ30JJHsxfSAiKikgCisJCXByZXY9ZGFyd2luX2ZyYW1ld29ya19za2lwIDs7CisJICAqKSBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisJICAgICBwcmV2PWRhcndpbl9mcmFtZXdvcmsgOzsKKwllc2FjCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tTC8vJ2AKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJKikKKwkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgorCSAgICBhYnNkaXI9IiRkaXIiCisJICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkZGlyIgorCSAgZmkKKwkgIGRpcj0iJGFic2RpciIKKwkgIDs7CisJZXNhYworCWNhc2UgIiRkZXBsaWJzICIgaW4KKwkqIiAtTCRkaXIgIiopIDs7CisJKikKKwkgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciIKKwkgIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorCSAgdGVzdGJpbmRpcj1gJGVjaG8gIlgkZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbCopCisJaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLW9zMiopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAgICMgUmhhcHNvZHkgQyBhbmQgbWF0aCBsaWJyYXJpZXMgYXJlIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgorCSBjYXNlICRob3N0IGluCisJICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KKwkgICBjb250aW51ZQorCSAgIDs7CisJIGVzYWMKKwlmaQorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJY29udGludWUKKwk7OworCisgICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCisgICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgICAtbW9kZWwpCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKKwljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKwlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW1vZHVsZSkKKwltb2R1bGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAjIC02NCwgLW1pcHNbMC05XSBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAtclswLTldWzAtOV0qIHNwZWNpZmllcyB0aGUgcHJvY2Vzc29yIG9uIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIG9uIHRoZSBTdW4gY29tcGlsZXIKKyAgICAgICMgK0RBKiwgK0REKiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIEhQIGNvbXBpbGVyCisgICAgICAjIC1xKiBwYXNzIHRocm91Z2ggY29tcGlsZXIgYXJncyBmb3IgdGhlIElCTSBjb21waWxlcgorICAgICAgIyAtbSogcGFzcyB0aHJvdWdoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb21waWxlciBhcmdzIGZvciBHQ0MKKyAgICAgICMgLW0qLCAtdFs0NV0qLCAtdHhzY2FsZSogcGFzcyB0aHJvdWdoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYworICAgICAgIyBjb21waWxlciBhcmdzIGZvciBHQ0MKKyAgICAgICMgLXAsIC1wZywgLS1jb3ZlcmFnZSwgLWZwcm9maWxlLSogcGFzcyB0aHJvdWdoIHByb2ZpbGluZyBmbGFnIGZvciBHQ0MKKyAgICAgICMgLUYvcGF0aCBnaXZlcyBwYXRoIHRvIHVuaW5zdGFsbGVkIGZyYW1ld29ya3MsIGdjYyBvbiBkYXJ3aW4KKyAgICAgICMgQGZpbGUgR0NDIHJlc3BvbnNlIGZpbGVzCisgICAgICAtNjR8LW1pcHNbMC05XXwtclswLTldWzAtOV0qfC14YXJjaD0qfC14dGFyZ2V0PSp8K0RBKnwrREQqfC1xKnwtbSp8IFwKKyAgICAgIC10WzQ1XSp8LXR4c2NhbGUqfC1wfC1wZ3wtLWNvdmVyYWdlfC1mcHJvZmlsZS0qfC1GKnxAKikKKworCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgJGFyZyBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorICAgICAgICBjb250aW51ZQorICAgICAgICA7OworCisgICAgICAtc2hyZXh0KQorCXByZXY9c2hyZXh0CisJY29udGludWUKKwk7OworCisgICAgICAtbm8tZmFzdC1pbnN0YWxsKQorCWZhc3RfaW5zdGFsbD1ubworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLWluc3RhbGwpCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWRhcndpbiopCisJICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKKwkgICMgYW5kIERhcndpbiBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIgMT4mMgorCSAgZmFzdF9pbnN0YWxsPW5vCisJICA7OworCSopIG5vX2luc3RhbGw9eWVzIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLXVuZGVmaW5lZCkKKwlhbGxvd191bmRlZmluZWQ9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vYmplY3RsaXN0KQorCXByZXY9b2JqZWN0bGlzdAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW8pIHByZXY9b3V0cHV0IDs7CisKKyAgICAgIC1wcmVjaW91cy1maWxlcy1yZWdleCkKKwlwcmV2PXByZWNpb3VzX3JlZ2V4CisJY29udGludWUKKwk7OworCisgICAgICAtcmVsZWFzZSkKKwlwcmV2PXJlbGVhc2UKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1ycGF0aCkKKwlwcmV2PXJwYXRoCisJY29udGludWUKKwk7OworCisgICAgICAtUikKKwlwcmV2PXhycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIqKQorCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisgICAgICAtdmVyc2lvbi1udW1iZXIpCisJcHJldj12aW5mbworCXZpbmZvX251bWJlcj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1XYywqKQorCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XYywvLydgCisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBjYXNlICRmbGFnIGluCisJICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICBmbGFnPSJcIiRmbGFnXCIiCisJICAgIDs7CisJICBlc2FjCisJICBhcmc9IiRhcmcgJHdsJGZsYWciCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRmbGFnIgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKKwk7OworCisgICAgICAtV2wsKikKKwlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiIC1lICdzL14tV2wsLy8nYAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgY2FzZSAkZmxhZyBpbgorCSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgICAgZmxhZz0iXCIkZmxhZ1wiIgorCSAgICA7OworCSAgZXNhYworCSAgYXJnPSIkYXJnICR3bCRmbGFnIgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZmxhZyIKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCisJOzsKKworICAgICAgLVhjb21waWxlcikKKwlwcmV2PXhjb21waWxlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVhsaW5rZXIpCisJcHJldj14bGlua2VyCisJY29udGludWUKKwk7OworCisgICAgICAtWENDbGlua2VyKQorCXByZXY9eGNjbGlua2VyCisJY29udGludWUKKwk7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KKyAgICAgIC0qIHwgKyopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJY2FzZSAkYXJnIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisJOzsKKworICAgICAgKi4kb2JqZXh0KQorCSMgQSBzdGFuZGFyZCBvYmplY3QuCisJb2Jqcz0iJG9ianMgJGFyZyIKKwk7OworCisgICAgICAqLmxvKQorCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgorCWlmICgke1NFRH0gLWUgJzJxJyAkYXJnIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICRhcmcgaW4KKwkgICovKiB8ICpcXCopIC4gJGFyZyA7OworCSAgKikgLiAuLyRhcmcgOzsKKwkgIGVzYWMKKworCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IFwKKwkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgorCSAgICB4ZGlyPQorIAkgIGVsc2UKKwkgICAgeGRpcj0iJHhkaXIvIgorCSAgZmkKKworCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCQlkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKKwkJcHJldj0KKwkJY29udGludWUKKwkgICAgICBlbHNlCisJCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCXByZXY9ZGxwcmVmaWxlcworCSAgICAgIGZpCisJICAgIGZpCisKKwkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKKwkgICAgICBwcmV2PQorCSAgICBmaQorCisJICAgICMgQSBQSUMgb2JqZWN0LgorCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCSAgICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KKwkgICAgICBhcmc9IiRub25fcGljX29iamVjdCIKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgorCSAgICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCisJICAgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKKwkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkgIGZpCisJZWxzZQorCSAgIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZWxzZQorCSAgICAjIERyeS1ydW4gY2FzZS4KKworCSAgICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwkgICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KKwkgICAgICB4ZGlyPQorCSAgICBlbHNlCisJICAgICAgeGRpcj0iJHhkaXIvIgorCSAgICBmaQorCisJICAgIHBpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7b2JqZGlyfS8ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgICAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKKwkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBwcmV2PQorCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICBwcmV2PQorCWVsc2UKKwkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJY2FzZSAkYXJnIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMgIyBhcmcKKworICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisgICAgICBmaQorICAgIGRvbmUgIyBhcmd1bWVudCBwYXJzaW5nIGxvb3AKKworICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgb3V0cHV0bmFtZT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkZWNobyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAorICAgIGVsc2UKKyAgICAgIHNobGliX3NlYXJjaF9wYXRoPQorICAgIGZpCisgICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCisgICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgorCisgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KKyAgICAgIG91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCisgICAgZWxzZQorICAgICAgb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKKyAgICBmaQorICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZGlyZWN0b3J5LgorICAgIGlmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCisgICAgICAkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgorICAgICAgJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKKyAgICAgIGV4aXRfc3RhdHVzPSQ/CisgICAgICBpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIDs7CisgICAgKi4kbGliZXh0KSBsaW5rbW9kZT1vbGRsaWIgOzsKKyAgICAqLmxvIHwgKi4kb2JqZXh0KSBsaW5rbW9kZT1vYmogOzsKKyAgICAqLmxhKSBsaW5rbW9kZT1saWIgOzsKKyAgICAqKSBsaW5rbW9kZT1wcm9nIDs7ICMgQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYSBwcm9ncmFtLgorICAgIGVzYWMKKworICAgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiopCisgICAgICAjIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGlvbnMgaW4gJHBvc3RkZXBzIGFuZCAkcHJlZGVwcworICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPSRkdXBsaWNhdGVfZGVwcworICAgICAgOzsKKyAgICBlc2FjCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KKwljYXNlICIkbGlicyAiIGluCisJKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBsaWJzPSIkbGlicyAkZGVwbGliIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgorCisgICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcworICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQorICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCisJZG9uZQorICAgICAgZmkKKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgZmkKKworICAgIGRlcGxpYnM9CisgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKyAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgbGliKQorCXBhc3Nlcz0iY29udiBsaW5rIgorCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbworCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5sYSkgOzsKKwkgICopCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICBwcm9nKQorCWNvbXBpbGVfZGVwbGlicz0KKwlmaW5hbGl6ZV9kZXBsaWJzPQorCWFsbGRlcGxpYnM9bm8KKwluZXdkbGZpbGVzPQorCW5ld2RscHJlZmlsZXM9CisJcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgorCTs7CisgICAgKikgIHBhc3Nlcz0iY29udiIKKwk7OworICAgIGVzYWMKKyAgICBmb3IgcGFzcyBpbiAkcGFzc2VzOyBkbworICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iOyB0aGVuCisJbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCWNhc2UgJHBhc3MgaW4KKwlkbG9wZW4pIGxpYnM9IiRkbGZpbGVzIiA7OworCWRscHJlb3BlbikgbGlicz0iJGRscHJlZmlsZXMiIDs7CisJbGluaykgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlICRkZXBlbmRlbmN5X2xpYnMiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgorCSMgQ29sbGVjdCBkbHByZW9wZW5lZCBsaWJyYXJpZXMKKwlzYXZlX2RlcGxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KKwlsaWI9CisJZm91bmQ9bm8KKwljYXNlICRkZXBsaWIgaW4KKwktbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlfC10aHJlYWRzKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWIiCisJICBmaQorCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICB0ZXN0ICIkcGFzcyIgPSBjb252ICYmIGNvbnRpbnVlCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIG5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLWwvLydgCisJICBmb3Igc2VhcmNoZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwKKyAgICAgICAgICAgICAgICAgICAgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGNhc2UgJGxpYiBpbgorCQkgICovKiB8ICpcXCopIC4gJGxpYiA7OworCQkgICopIC4gLi8kbGliIDs7CisJCSAgZXNhYworCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCSAgICB0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCisJCSAgICBsaWI9JGxhZGlyLyRvbGRfbGlicmFyeQorCQkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCQkgICAgZWxzZQorCQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCQkgICAgZmkKKwkJICAgIGNvbnRpbnVlCisJCSAgZmkKKwkJZmkKKwkgICAgICAgIDs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBjb250aW51ZQorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBzY2FuOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIDs7CisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1MJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIiAxPiYyCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIGNvbnRpbnVlCisJICA7OyAjIC1MCisJLVIqKQorCSAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIHZhbGlkX2FfbGliPW5vCisJICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJICAgICAgbWF0Y2hfcGF0dGVybiopCisJCXNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKKwkgICAgICAgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKKwkJaWYgZXZhbCAkZWNobyBcIiRkZXBsaWJcIiAyPi9kZXYvbnVsbCBcCisJCSAgICB8ICRTRUQgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICB2YWxpZF9hX2xpYj15ZXMKKwkJZmkKKwkJOzsKKwkgICAgICBwYXNzX2FsbCkKKwkJdmFsaWRfYV9saWI9eWVzCisJCTs7CisgICAgICAgICAgICBlc2FjCisJICAgIGlmIHRlc3QgIiR2YWxpZF9hX2xpYiIgIT0geWVzOyB0aGVuCisJICAgICAgJGVjaG8KKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCSAgICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAgICRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIHRoZSBmaWxlIGV4dGVuc2lvbnMgLiRsaWJleHQgb2YgdGhpcyBhcmd1bWVudCBtYWtlcyBtZSBiZWxpZXZlIgorCSAgICAgICRlY2hvICIqKiogdGhhdCBpdCBpcyBqdXN0IGEgc3RhdGljIGFyY2hpdmUgdGhhdCBJIHNob3VsZCBub3QgdXNlZCBoZXJlLiIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgorCSAgICAgICRlY2hvICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICA7OyAjICouJGxpYmV4dAorCSoubG8gfCAqLiRvYmpleHQpCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCisJICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCisJICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRlcGxpYiIKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwklREVQTElCUyUpCisJICBhbGxkZXBsaWJzPXllcworCSAgY29udGludWUKKwkgIDs7CisJZXNhYyAjIGNhc2UgJGRlcGxpYgorCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmICgke1NFRH0gLWUgJzJxJyAkbGliIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkbGFkaXIiID0gIlgkbGliIiAmJiBsYWRpcj0iLiIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCisJIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZXMgaW5zdGFsbGVkLCBvciBzaG91bGRub3RsaW5rCisJaW5zdGFsbGVkPXllcworCXNob3VsZG5vdGxpbms9bm8KKwlhdm9pZHRlbXBycGF0aD0KKworCisJIyBSZWFkIHRoZSAubGEgZmlsZQorCWNhc2UgJGxpYiBpbgorCSovKiB8ICpcXCopIC4gJGxpYiA7OworCSopIC4gLi8kbGliIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgICB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiIgfHwKKwkgICB7IHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgfTsgdGhlbgorCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKKwkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCisJZmkKKworCWlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCisJICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIHRtcF9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKyAgICAgICAgICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfZGVwcyIgPSAiWHllcyIgOyB0aGVuCisJICAgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgICAgZXNhYworICAgICAgICAgICAgICBmaQorCSAgICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgICAgZG9uZQorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGNvbnYKKworCisJIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorCWxpbmtsaWI9CisJZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgbGlua2xpYj0iJGwiCisJZG9uZQorCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gZGxvcGVuCisKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRsYWRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7CisJKikKKwkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciIDE+JjIKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgorCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKKwkgIGZpCisJICA7OworCWVzYWMKKwlsYW5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgorCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBsaWJyYXJ5IFxgJGxpYicgd2FzIG1vdmVkLiIgMT4mMgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbGliZGlyIgorCSAgZmkKKwkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCW5hbWU9YCRlY2hvICJYJGxhbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgorCSAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRkbG5hbWUiCisJICBlbHNlCisJICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCisJICBmaQorCWZpICMgJHBhc3MgPSBkbHByZW9wZW4KKworCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAjIExpbmsgdGhlIGNvbnZlbmllbmNlIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIiAjIHVzZWQgZm9yIHByb2csc2NhbiBwYXNzCisJICBmaQorCSAgY29udGludWUKKwlmaQorCisKKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyAmJiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsYWRpciIKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisKKwkgIGxpbmthbGxkZXBsaWJzPW5vCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgIGxpbmthbGxkZXBsaWJzPXllcworCSAgZmkKKworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgOzsgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGVzYWMKKwkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPworCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocworCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCisJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgZG9uZSAjIGZvciBkZXBsaWIKKwkgIGNvbnRpbnVlCisJZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJgorCSAgICAgeyB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwKKwkJIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQseWVzIjsgfSB8fAorCSAgICAgICB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCisJICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgorCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCisJICAgICAgKiIgJGRpciAiKikgOzsKKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRhYnNkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KKworCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCisJICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAorCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCisJCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KKwkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCisJICAgIGNvbnRpbnVlCisJICBmaQorCWZpCisKKwlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisJdXNlX3N0YXRpY19saWJzPSRwcmVmZXJfc3RhdGljX2xpYnMKKwlpZiB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IGJ1aWx0ICYmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzIDsgdGhlbgorCSAgdXNlX3N0YXRpY19saWJzPW5vCisJZmkKKwlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICB7IHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgorCSAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKKwkgICAgbmVlZF9yZWxpbms9eWVzCisJICBmaQorCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKKworCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uCisJICAjIHNvbWUgc3lzdGVtcyAoZGFyd2luKQorCSAgaWYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbmsgOyB0aGVuCisJICAgICRlY2hvCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJGVjaG8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgorCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQorCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwkgICAgcmVhbG5hbWU9IiQyIgorCSAgICBzaGlmdDsgc2hpZnQKKwkgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCSAgICAjIHVzZSBkbG5hbWUgaWYgd2UgZ290IGl0LiBpdCdzIHBlcmZlY3RseSBnb29kLCBubz8KKwkgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICBzb25hbWU9IiRkbG5hbWUiCisJICAgIGVsaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgICAgICMgYmxlaCB3aW5kb3dzCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICpjeWd3aW4qIHwgbWluZ3cqKQorCQltYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisJCXZlcnN1ZmZpeD0iLSRtYWpvciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCSAgICBlbHNlCisJICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCisJICAgIGZpCisKKwkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKKwkgICAgc29yb290PSIkc29uYW1lIgorCSAgICBzb25hbWU9YCRlY2hvICRzb3Jvb3QgfCAke1NFRH0gLWUgJ3MvXi4qXC8vLydgCisJICAgIG5ld2xpYj0ibGliaW1wLWAkZWNobyAkc29uYW1lIHwgJHtTRUR9ICdzL15saWIvLztzL1wuZGxsJC8vJ2AuYSIKKworCSAgICAjIElmIHRoZSBsaWJyYXJ5IGhhcyBubyBleHBvcnQgbGlzdCwgdGhlbiBjcmVhdGUgb25lIG5vdworCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiI7IHRoZW4gOgorCSAgICBlbHNlCisJICAgICAgJHNob3cgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgorCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICAgIGNtZHM9JGV4dHJhY3RfZXhwc3ltc19jbWRzCisJICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkJSUZTPSIkc2F2ZV9pZnMiCisJCWV2YWwgY21kPVwiJGNtZFwiCisJCSRzaG93ICIkY21kIgorCQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgICAgICBkb25lCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZpCisKKwkgICAgIyBDcmVhdGUgJG5ld2xpYgorCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCisJICAgICAgJHNob3cgImdlbmVyYXRpbmcgaW1wb3J0IGxpYnJhcnkgZm9yIFxgJHNvbmFtZSciCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJZXZhbCBjbWQ9XCIkY21kXCIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKwkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKKwkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCisJICAgIGxpbmtsaWI9JG5ld2xpYgorCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICBsaWJfbGlua2VkPXllcworCSAgICBjYXNlICRoYXJkY29kZV9hY3Rpb24gaW4KKwkgICAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgorCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCisJCWNhc2UgJGhvc3QgaW4KKwkJICAqLSotc2NvMy4ydjUuMC5bMDI0XSopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotc3lzdjQqdXcyKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NU9wZW5VTklYKiB8ICotKi1zeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgXAorCQkgICAgKi0qLXVuaXh3YXJlNyopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotZGFyd2luKiApCisJCSAgICAjIGlmIHRoZSBsaWIgaXMgYSBtb2R1bGUgdGhlbiB3ZSBjYW4gbm90IGxpbmsgYWdhaW5zdAorCQkgICAgIyBpdCwgc29tZW9uZSBpcyBpZ25vcmluZyB0aGUgbmV3IHdhcm5pbmdzIEkgYWRkZWQKKwkJICAgIGlmIC91c3IvYmluL2ZpbGUgLUwgJGFkZCAyPiAvZGV2L251bGwgfAorICAgICAgICAgICAgICAgICAgICAgICRFR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCisJCSAgICAgICRlY2hvICIqKiBXYXJuaW5nLCBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgorCQkgICAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgorCQkgICAgICAgICRlY2hvCisJCSAgICAgICAgJGVjaG8gIioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCSAgICAgICAgJGVjaG8gIioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCisJCSAgICAgIGVsc2UKKwkJICAgICAgICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkgICAgICBmaQorCQkgICAgZmkKKwkJZXNhYworCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OworCQllc2FjCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgcmVsaW5rKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCQlhZGRfZGlyPSItTCRkaXIiCisJCSMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkJaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJICBjYXNlICRsaWJkaXIgaW4KKwkJICAgIFtcXC9dKikKKwkJICAgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgICAgOzsKKwkJICBlc2FjCisJCWZpCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7CisJICAgIGVzYWMKKworCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCisJICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKKwkgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KKwkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7CisJICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhZGRfc2hsaWJwYXRoOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZF9kaXIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGQgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHllcyAmJiBcCisJCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmIFwKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGxpYmRpcjoiKikgOzsKKwkgICAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciIgJiYKKwkJIHRlc3QgLWYgIiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIiA7IHRoZW4KKwkgICAgICAgIGFkZD0iJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZWxzZQorCSAgICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJY2FzZSAkbGliZGlyIGluCisJCSAgW1xcL10qKQorCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICAkZWNobworCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCisJICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgJGVjaG8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKKwkgICAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgJGVjaG8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKKwkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCQkkZWNobworCQkkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCSRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCQkkZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCQkkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KKwkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OworCQkgICAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7CisJCSAgIGVzYWM7OworCSAgICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkbGliZGlyIjs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKKwkgIGZpCisKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgorCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5CisJICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgZG9uZQorCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKKwkgICAgICAqLmxhKQorCQlkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCQl0ZXN0ICJYJGRpciIgPSAiWCRkZXBsaWIiICYmIGRpcj0iLiIKKwkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJCWNhc2UgJGRpciBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKKwkJKikKKwkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgorCQkgICAgYWJzZGlyPSIkZGlyIgorCQkgIGZpCisJCSAgOzsKKwkJZXNhYworCQlpZiBncmVwICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCisJCSAgcGF0aD0iJGFic2Rpci8kb2JqZGlyIgorCQllbHNlCisJCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCQkgIGZpCisJCSAgaWYgdGVzdCAiJGFic2RpciIgIT0gIiRsaWJkaXIiOyB0aGVuCisJCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIiAxPiYyCisJCSAgZmkKKwkJICBwYXRoPSIkYWJzZGlyIgorCQlmaQorCQlkZXBkZXBsPQorCQljYXNlICRob3N0IGluCisJCSotKi1kYXJ3aW4qKQorCQkgICMgd2UgZG8gbm90IHdhbnQgdG8gbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJzLAorCQkgICMgYnV0IG5lZWQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZAorCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCisJCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KKwkJICAgICAgZGVwZGVwbD0kdG1wCisJCSAgICBkb25lCisJCSAgICBpZiB0ZXN0IC1mICIkcGF0aC8kZGVwZGVwbCIgOyB0aGVuCisJCSAgICAgIGRlcGRlcGw9IiRwYXRoLyRkZXBkZXBsIgorCQkgICAgZmkKKwkJICAgICMgZG8gbm90IGFkZCBwYXRocyB3aGljaCBhcmUgYWxyZWFkeSB0aGVyZQorCQkgICAgY2FzZSAiICRuZXdsaWJfc2VhcmNoX3BhdGggIiBpbgorCQkgICAgKiIgJHBhdGggIiopIDs7CisJCSAgICAqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJHBhdGgiOzsKKwkJICAgIGVzYWMKKwkJICBmaQorCQkgIHBhdGg9IiIKKwkJICA7OworCQkqKQorCQkgIHBhdGg9Ii1MJHBhdGgiCisJCSAgOzsKKwkJZXNhYworCQk7OworCSAgICAgIC1sKikKKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotZGFyd2luKikKKwkJICAjIEFnYWluLCB3ZSBvbmx5IHdhbnQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMKKwkJICBldmFsIHRtcF9saWJzPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgInMsXlwtbCwsImAKKwkJICBmb3IgdG1wIGluICRuZXdsaWJfc2VhcmNoX3BhdGggOyBkbworCQkgICAgaWYgdGVzdCAtZiAiJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiIDsgdGhlbgorCQkgICAgICBldmFsIGRlcGRlcGw9IiR0bXAvbGliJHRtcF9saWJzLmR5bGliIgorCQkgICAgICBicmVhaworCQkgICAgZmkKKwkJICBkb25lCisJCSAgcGF0aD0iIgorCQkgIDs7CisJCSopIGNvbnRpbnVlIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICAqKSBjb250aW51ZSA7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRwYXRoICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRkZXBkZXBsICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRkZXBkZXBsICRkZXBsaWJzIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCisJZmkgIyBsaW5rbW9kZSA9IGxpYgorICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCisJaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KKwkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgIGxpYl9zZWFyY2hfcGF0aD0KKwkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KKwkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBuZXdsaWJfc2VhcmNoX3BhdGg9CisJZmkKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KKwkgIHZhcnM9ImRlcGxpYnMiCisJZWxzZQorCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCisJZmkKKwlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKKwkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgorCSAgbmV3X2xpYnM9CisJICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KKwkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KKwkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKKwkgICAgIyAgICAgICAgYnJva2VuOgorCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgorCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KKwkgICAgIyBwcmFjdGljZToKKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAtUiopIDs7CisJICAgICopCisJICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKKwkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKKwkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQorCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCisJICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcworCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQorCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKKwkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAorCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKKwkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKKwkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5CisJICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQorCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0CisJICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCisJICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAgICopCisJCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSA7OworCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikKKwkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgorCWRvbmUgIyBmb3IgdmFyCisgICAgICBmaQorICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKyAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQorICAgICAgdG1wX2xpYnM9CisgICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KKwljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgorCSoiICRpICIqKQorCSAgaT0iIgorCSAgOzsKKwllc2FjCisJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKKwlmaQorICAgICAgZG9uZQorICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicworICAgIGRvbmUgIyBmb3IgcGFzcworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisgICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKyAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorICAgIGZpCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIG9sZGxpYikKKyAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgb2xkbGlicz0iJG91dHB1dCIKKyAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCisJICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCisJICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAorCSAgZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCWVsc2UKKwkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIgMj4mMQorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZWxzZQorCSAgJGVjaG8KKwkgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKKwkgICRlY2hvICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgorCSAgbGlib2Jqcz0iJGxpYm9ianMgJG9ianMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgorICAgICAgZmkKKyAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKKworICAgICAgb2xkbGlicz0KKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KKwkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KKwkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KKwkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCisJICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKKwkgIGJ1aWxkX29sZF9saWJzPXllcworCWZpCisKKwlpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorCisJaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorICAgICAgZWxzZQorCisJIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKwlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCisJSUZTPSIkc2F2ZV9pZnMiCisKKwlpZiB0ZXN0IC1uICIkOCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBjb252ZXJ0IGFic29sdXRlIHZlcnNpb24gbnVtYmVycyB0byBsaWJ0b29sIGFnZXMKKwkjIHRoaXMgcmV0YWlucyBjb21wYXRpYmlsaXR5IHdpdGggLmxhIGZpbGVzIGFuZCBhdHRlbXB0cworCSMgdG8gbWFrZSB0aGUgY29kZSBiZWxvdyBhIGJpdCBtb3JlIGNvbXByZWhlbnNpYmxlCisKKwljYXNlICR2aW5mb19udW1iZXIgaW4KKwl5ZXMpCisJICBudW1iZXJfbWFqb3I9IiQyIgorCSAgbnVtYmVyX21pbm9yPSIkMyIKKwkgIG51bWJlcl9yZXZpc2lvbj0iJDQiCisJICAjCisJICAjIFRoZXJlIGFyZSByZWFsbHkgb25seSB0d28ga2luZHMgLS0gdGhvc2UgdGhhdAorCSAgIyB1c2UgdGhlIGN1cnJlbnQgcmV2aXNpb24gYXMgdGhlIG1ham9yIHZlcnNpb24KKwkgICMgYW5kIHRob3NlIHRoYXQgc3VidHJhY3QgYWdlIGFuZCB1c2UgYWdlIGFzCisJICAjIGEgbWlub3IgdmVyc2lvbi4gIEJ1dCwgdGhlbiB0aGVyZSBpcyBpcml4CisJICAjIHdoaWNoIGhhcyBhbiBleHRyYSAxIGFkZGVkIGp1c3QgZm9yIGZ1bgorCSAgIworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3N8bm9uZSkKKwkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcmAKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKKwkgICAgOzsKKwkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxzdW5vcykKKwkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGFnZT0iMCIKKwkgICAgOzsKKwkgIGlyaXh8bm9uc3RvcHV4KQorCSAgICBjdXJyZW50PWBleHByICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yYAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBsdF9pcml4X2luY3JlbWVudD1ubworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQyIgorCSAgcmV2aXNpb249IiQzIgorCSAgYWdlPSIkNCIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgbWlub3JfY3VycmVudD1gZXhwciAkY3VycmVudCArIDFgCisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCI7CisJICA7OworCisJaXJpeCB8IG5vbnN0b3B1eCkKKwkgIGlmIHRlc3QgIlgkbHRfaXJpeF9pbmNyZW1lbnQiID0gIlhubyI7IHRoZW4KKwkgICAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgZWxzZQorCSAgICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAorCSAgZmkKKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgICBub25zdG9wdXgpIHZlcnN0cmluZ19wcmVmaXg9bm9uc3RvcHV4IDs7CisJICAgICopICAgICAgICAgdmVyc3RyaW5nX3ByZWZpeD1zZ2kgOzsKKwkgIGVzYWMKKwkgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kcmV2aXNpb24KKwkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KKwkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCisJICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpCisJICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICA7OworCisJb3NmKQorCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JGFnZQorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBpZmFjZT1gZXhwciAkY3VycmVudCAtICRsb29wYAorCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKKwkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCisJICBkb25lCisKKwkgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KKwkgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2N1cnJlbnR9LjAiCisJICA7OworCisJc3Vub3MpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgorCSAgOzsKKworCXdpbmRvd3MpCisJICAjIFVzZSAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgb25lCisJICAjIGV4dGVuc2lvbiBvbiBET1MgOC4zIGZpbGVzeXN0ZW1zLgorCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgdmVyc3VmZml4PSItJG1ham9yIgorCSAgOzsKKworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciIDE+JjIKKwkgICRlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCisJaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgIG1ham9yPQorCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICBkYXJ3aW4pCisJICAgICMgd2UgY2FuJ3QgY2hlY2sgZm9yICIwLjAiIGluIGFyY2hpdmVfY21kcyBkdWUgdG8gcXVvdGluZworCSAgICAjIHByb2JsZW1zLCBzbyB3ZSByZXNldCBpdCBjb21wbGV0ZWx5CisJICAgIHZlcnN0cmluZz0KKwkgICAgOzsKKwkgICopCisJICAgIHZlcnN0cmluZz0iMC4wIgorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgICB2ZXJzdWZmaXg9CisJICBlbHNlCisJICAgIHZlcnN1ZmZpeD0iLjAuMCIKKwkgIGZpCisJZmkKKworCSMgUmVtb3ZlIHZlcnNpb24gaW5mbyBmcm9tIG5hbWUgaWYgdmVyc2lvbmluZyBzaG91bGQgYmUgYXZvaWRlZAorCWlmIHRlc3QgIiRhdm9pZF92ZXJzaW9uIiA9IHllcyAmJiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICBtYWpvcj0KKwkgIHZlcnN1ZmZpeD0KKwkgIHZlcnN0cmluZz0iIgorCWZpCisKKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCisJaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisJICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgIGZpCisJZWxzZQorCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KKwkjIFJlbW92ZSBvdXIgb3V0cHV0cywgYnV0IGRvbid0IHJlbW92ZSBvYmplY3QgZmlsZXMgc2luY2UgdGhleQorCSMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdoZW4gY29tcGlsaW5nIFBJQyBvYmplY3RzLgorCXJlbW92ZWxpc3Q9CisJdGVtcHJlbW92ZWxpc3Q9YCRlY2hvICIkb3V0cHV0X29iamRpci8qImAKKwlmb3IgcCBpbiAkdGVtcHJlbW92ZWxpc3Q7IGRvCisJICBjYXNlICRwIGluCisJICAgICouJG9iamV4dCkKKwkgICAgICAgOzsKKwkgICAgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgfCAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qIHwgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKikKKwkgICAgICAgaWYgdGVzdCAiWCRwcmVjaW91c19maWxlc19yZWdleCIgIT0gIlgiOyB0aGVuCisJICAgICAgICAgaWYgZWNobyAkcCB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKKwkgICAgICAgICB0aGVuCisJCSAgIGNvbnRpbnVlCisJCSBmaQorCSAgICAgICBmaQorCSAgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkcCIKKwkgICAgICAgOzsKKwkgICAgKikgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAtbiAiJHJlbW92ZWxpc3QiOyB0aGVuCisJICAkc2hvdyAiJHtybX1yICRyZW1vdmVsaXN0IgorCSAgJHJ1biAke3JtfXIgJHJlbW92ZWxpc3QKKwlmaQorICAgICAgZmkKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgorCW9sZGxpYnM9IiRvbGRsaWJzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisKKwkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCisJb2xkb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCisgICAgICAjZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKyAgICAgICMJbGliX3NlYXJjaF9wYXRoPWAkZWNobyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJHtTRUR9IC1lICJzJSAkcGF0aCAlICVnImAKKyAgICAgICMJZGVwbGlicz1gJGVjaG8gIiRkZXBsaWJzICIgfCAke1NFRH0gLWUgInMlIC1MJHBhdGggJSAlZyJgCisgICAgICAjCWRlcGVuZGVuY3lfbGlicz1gJGVjaG8gIiRkZXBlbmRlbmN5X2xpYnMgIiB8ICR7U0VEfSAtZSAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICNkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCXRlbXBfeHJwYXRoPQorCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KKwkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgorCWZpCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKKyAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKKyAgICAgIGRsZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KKwljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKKyAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKKyAgICAgIGRscHJlZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KKwljYXNlICIkZGxwcmVmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKKwkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKKwkgICAgOzsKKwkgICotKi1uZXRic2QqKQorCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgOzsKKyAJICAqKQorCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgorCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCWZpCisKKwkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCisJbmFtZV9zYXZlPSRuYW1lCisJbGlibmFtZV9zYXZlPSRsaWJuYW1lCisJcmVsZWFzZV9zYXZlPSRyZWxlYXNlCisJdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAorCW1ham9yX3NhdmU9JG1ham9yCisJIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKKwkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KKwkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KKwlyZWxlYXNlPSIiCisJdmVyc3VmZml4PSIiCisJbWFqb3I9IiIKKwluZXdkZXBsaWJzPQorCWRyb3BwZWRkZXBzPW5vCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwlwYXNzX2FsbCkKKwkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgorCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjaworCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgorCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0CisJICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KKwkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKKwkgIDs7CisJdGVzdF9jb21waWxlKQorCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKKwkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0CisJICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjaworCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCisJICAkcm0gY29uZnRlc3QuYworCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKKwkgICRybSBjb25mdGVzdAorCSAgaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnM7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKKwkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkJaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQkgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICoiICRpICIqKQorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICBpPSIiCisJCSAgICA7OworCQkgIGVzYWMKKwkgICAgICAgIGZpCisJCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkJICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKKwkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCisJCSAgZGVwbGliX21hdGNoPSQyCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICAkZWNobworCQkgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICAkZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgorCQkgICAgJGVjaG8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICBmaQorCQlmaQorCSAgICAgIGVsc2UKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKKwkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKKwkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkJJHJtIGNvbmZ0ZXN0CisJCWlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAorCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcworCQkgICAgZGVwbGliX21hdGNoPSQyCisJCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgZWxzZQorCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKKwkJICAgICAgJGVjaG8KKwkJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKKwkJICAgICAgJGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICAgIGZpCisJCSAgZmkKKwkJZWxzZQorCQkgIGRyb3BwZWRkZXBzPXllcworCQkgICRlY2hvCisJCSAgJGVjaG8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKKwkJICAkZWNobyAiKioqIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgorCQkgICRlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgorCQkgICRlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgorCQlmaQorCSAgICAgIGVsc2UKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZmkKKwkgIDs7CisJZmlsZV9tYWdpYyopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKKwkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisgICAgICAgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgJiYgdGVzdCAgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkqIiAkYV9kZXBsaWIgIiopCisJCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgIGFfZGVwbGliPSIiCisJCSAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCisJCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCBcCisJCQkgfCBncmVwICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCisJCQljb250aW51ZQorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCisJCQljYXNlICRwb3RsaWJsaW5rIGluCisJCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKKwkJCSopIHBvdGxpYj1gJGVjaG8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKKwkJCWVzYWMKKwkJICAgICAgZG9uZQorCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgXAorCQkJIHwgJHtTRUR9IDEwcSBcCisJCQkgfCAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQkkZWNobworCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCisJCWVsc2UKKwkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkZWNobyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICBmaQorCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbWF0Y2hfcGF0dGVybiopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIG5hbWU9YGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AKKwkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisJICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgcG90bGliPSIkcG90ZW50X2xpYiIgIyBzZWUgc3ltbGluay1jaGVjayBhYm92ZSBpbiBmaWxlX21hZ2ljIHRlc3QKKwkJICAgIGlmIGV2YWwgJGVjaG8gXCIkcG90ZW50X2xpYlwiIDI+L2Rldi9udWxsIFwKKwkJICAgICAgICB8ICR7U0VEfSAxMHEgXAorCQkgICAgICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgICAgICBhX2RlcGxpYj0iIgorCQkgICAgICBicmVhayAyCisJCSAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCSRlY2hvCisJCSRlY2hvICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJJGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSRlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQkkZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKKwkJZWxzZQorCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRlY2hvICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgIGZpCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwlub25lIHwgdW5rbm93biB8ICopCisJICBuZXdkZXBsaWJzPSIiCisJICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAorCSAgICAtZSAncy8gLVtMUl1bXiBdKi8vZydgCisJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCisJICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJworCSAgICAgIHRtcF9kZXBsaWJzPWAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJHtTRUR9IC1lICIxcyxeWCwsIiAtZSAicywkaSwsImAKKwkgICAgZG9uZQorCSAgZmkKKwkgIGlmICRlY2hvICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAncy9bIAldLy9nJyBcCisJICAgIHwgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KKwkgICAgJGVjaG8KKwkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgorCSAgICBmaQorCSAgICAkZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCisJICAgIGRyb3BwZWRkZXBzPXllcworCSAgZmkKKwkgIDs7CisJZXNhYworCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKKwltYWpvcj0kbWFqb3Jfc2F2ZQorCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQorCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQorCW5hbWU9JG5hbWVfc2F2ZQorCisJY2FzZSAkaG9zdCBpbgorCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICBuZXdkZXBsaWJzPWAkZWNobyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCisJICA7OworCWVzYWMKKworCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICRlY2hvCisJICAgICRlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKKwkgICAgJGVjaG8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgorCSAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCisJICAgICRlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCisJICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICAgICAgJGVjaG8KKwkgICAgICAkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJICAgICAgJGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJICAgICAgJGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkgICAgICAkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgICBlbHNlCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGZpCisJICBlbHNlCisJICAgICRlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgorCSAgICAkZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKKwkgICAgJGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKKworCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCisJICAgICAgJGVjaG8KKwkgICAgICAkZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKKwkgICAgICAkZWNobyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCisJICAgICAgJGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKKwkgICAgICAkZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCWZpCisJIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCisJZGVwbGlicz0kbmV3ZGVwbGlicworICAgICAgZmkKKworCisgICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKKyAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0CisgICAgICBuZXdfbGlicz0KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJY2FzZSAiICRuZXdfbGlicyAiIGluCisJKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OworCSopCisJICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBkZXBsaWJzPSIkbmV3X2xpYnMiCisKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCQllbHNlCisJCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQkgICAgOzsKKwkJICAqKQorCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgorCSAgICAgIGZpCisJICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgorCSAgICAgIGNhc2UgJGFyY2hpdmVfY21kcyBpbgorCSAgICAgICpcJExEKikgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZFwiIDs7CisJICAgICAgKikgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIgOzsKKwkgICAgICBlc2FjCisJICAgIGVsc2UKKwkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZmkKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgICBycGF0aD0KKwkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICAgIGRvbmUKKwkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCisJICBmaQorCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKKwlmaQorCisJc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgorCXRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkc2hsaWJwYXRoIgorCWlmIHRlc3QgLW4gIiRzaGxpYnBhdGgiOyB0aGVuCisJICBldmFsICIkc2hsaWJwYXRoX3Zhcj0nJHNobGlicGF0aFwkJHNobGlicGF0aF92YXInOyBleHBvcnQgJHNobGlicGF0aF92YXIiCisJZmkKKworCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCisJc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJcmVhbG5hbWU9IiQyIgorCXNoaWZ0OyBzaGlmdAorCisJaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCWVsc2UKKwkgIHNvbmFtZT0iJHJlYWxuYW1lIgorCWZpCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgIGRsbmFtZT0kc29uYW1lCisJZmkKKworCWxpYj0iJG91dHB1dF9vYmpkaXIvJHJlYWxuYW1lIgorCWxpbmtuYW1lcz0KKwlmb3IgbGluaworCWRvCisJICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCisJZG9uZQorCisJIyBVc2Ugc3RhbmRhcmQgb2JqZWN0cyBpZiB0aGV5IGFyZSBwaWMKKwl0ZXN0IC16ICIkcGljX2ZsYWciICYmIGxpYm9ianM9YCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKworCSMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCisJaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgaWYgdGVzdCAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgPSB5ZXMgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCisJICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scworCSAgICBjbWRzPSRleHBvcnRfc3ltYm9sc19jbWRzCisJICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgIGV2YWwgY21kPVwiJGNtZFwiCisJICAgICAgaWYgbGVuPWBleHByICJYJGNtZCIgOiAiLioiYCAmJgorCSAgICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgICAgICAgICRzaG93ICIkY21kIgorCSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICAgICAgICBza2lwcGVkX2V4cG9ydD1mYWxzZQorCSAgICAgIGVsc2UKKwkgICAgICAgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgorCSAgICAgICAgJHNob3cgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgorCSAgICAgICAgc2tpcHBlZF9leHBvcnQ9OgorCQkjIEJyZWFrIG91dCBlYXJseSwgb3RoZXJ3aXNlIHNraXBwZWRfZXhwb3J0IG1heSBiZQorCQkjIHNldCB0byBmYWxzZSBieSBhIGxhdGVyIGJ1dCBzaG9ydGVyIGNtZC4KKwkJYnJlYWsKKwkgICAgICBmaQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICAgJHNob3cgIiRFR1JFUCAtZSBcIiRleHBvcnRfc3ltYm9sc19yZWdleFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIgPiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIgorCSAgICAgICRydW4gZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgJHNob3cgIiRtdiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIiCisJICAgICAgJHJ1biBldmFsICckbXYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkcnVuIGV2YWwgJyRlY2hvICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiRleHBvcnRfc3ltYm9scyInCisJZmkKKworCXRtcF9kZXBsaWJzPQorCWZvciB0ZXN0X2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkJY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCisJCSoiICR0ZXN0X2RlcGxpYiAiKikgOzsKKwkJKikKKwkJCXRtcF9kZXBsaWJzPSIkdG1wX2RlcGxpYnMgJHRlc3RfZGVwbGliIgorCQkJOzsKKwkJZXNhYworCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisKKwlpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcworCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgIGVsc2UKKwkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICAgIGxpYm9ianM9IiRsaWJvYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCSAgZmkKKwlmaQorCQorCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgorCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgorCWZpCisKKwkjIE1ha2UgYSBiYWNrdXAgb2YgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgd2hlbiByZWxpbmtpbmcKKwlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVUgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/CisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgIGVsc2UKKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgZmkKKwllbHNlCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgorCSAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCWVsc2UKKwkgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfY21kc1wiCisJICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYKKwkgICBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCisJICA6CisJZWxzZQorCSAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgcGllY2V3aXNlLgorCSAgJGVjaG8gImNyZWF0aW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLi4uIgorCisJICAjIFNhdmUgdGhlIHZhbHVlIG9mICRvdXRwdXQgYW5kICRsaWJvYmpzIGJlY2F1c2Ugd2Ugd2FudCB0bworCSAgIyB1c2UgdGhlbSBsYXRlci4gIElmIHdlIGhhdmUgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsIHdlCisJICAjIHdhbnQgdG8gdXNlIHNhdmVfbGlib2JqcyBhcyBpdCB3YXMgYmVmb3JlCisJICAjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIHdhcyBleHBhbmRlZCwgYmVjYXVzZSB3ZSBjYW4ndAorCSAgIyBhc3N1bWUgdGhlIGxpbmtlciB1bmRlcnN0YW5kcyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYy4KKwkgICMgVGhpcyBtYXkgaGF2ZSB0byBiZSByZXZpc2l0ZWQsIGluIGNhc2UgdG9vIG1hbnkKKwkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIGdldCBsaW5rZWQgaW4gYW5kIGVuZCB1cCBleGNlZWRpbmcKKwkgICMgdGhlIHNwZWMuCisJICBpZiB0ZXN0IC16ICIkY29udmVuaWVuY2UiIHx8IHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICBmaQorCSAgc2F2ZV9vdXRwdXQ9JG91dHB1dAorCSAgb3V0cHV0X2xhPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCisKKwkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCisJICAjIGluaXRpYWxpemUgayB0byBvbmUuCisJICB0ZXN0X2NtZHM9CisJICBjb25jYXRfY21kcz0KKwkgIG9iamxpc3Q9CisJICBkZWxmaWxlcz0KKwkgIGxhc3Rfcm9iaj0KKwkgIGs9MQorCSAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJICAjIExvb3Agb3ZlciB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGxpbmtlZC4KKwkgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcworCSAgZG8KKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisJICAgIGlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8CisJICAgICAgIHsgbGVuPWBleHByICJYJHRlc3RfY21kcyIgOiAiLioiIDI+L2Rldi9udWxsYCAmJgorCQkgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iOyB9OyB0aGVuCisJICAgICAgb2JqbGlzdD0iJG9iamxpc3QgJG9iaiIKKwkgICAgZWxzZQorCSAgICAgICMgVGhlIGNvbW1hbmQgJHRlc3RfY21kcyBpcyBhbG1vc3QgdG9vIGxvbmcsIGFkZCBhCisJICAgICAgIyBjb21tYW5kIHRvIHRoZSBxdWV1ZS4KKwkgICAgICBpZiB0ZXN0ICIkayIgLWVxIDEgOyB0aGVuCisJCSMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCisJCWV2YWwgY29uY2F0X2NtZHM9XCIkcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisJICAgICAgZWxzZQorCQkjIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzIHdpbGwgbGluayBpbgorCQkjIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgorCQlldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgICBsYXN0X3JvYmo9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkgICAgICBrPWBleHByICRrICsgMWAKKwkgICAgICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkgICAgICBvYmpsaXN0PSRvYmoKKwkgICAgICBsZW49MQorCSAgICBmaQorCSAgZG9uZQorCSAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAjIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUuICBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdAorCSAgIyBmaWxlcyB3aWxsIGxpbmsgaW4gdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisKKwkgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCisJICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgIGxpYm9ianM9JG91dHB1dAorCSAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgorCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kZXhwb3J0X3N5bWJvbHNfY21kc1wiCisgICAgICAgICAgZmkKKworCSAgIyBTZXQgdXAgYSBjb21tYW5kIHRvIHJlbW92ZSB0aGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMKKwkgICMgYWZ0ZXIgdGhleSBhcmUgdXNlZC4KKwkgIGk9MAorCSAgd2hpbGUgdGVzdCAiJGkiIC1sdCAiJGsiCisJICBkbworCSAgICBpPWBleHByICRpICsgMWAKKwkgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7aX0uJG9iamV4dCIKKwkgIGRvbmUKKworCSAgJGVjaG8gImNyZWF0aW5nIGEgdGVtcG9yYXJ5IHJlbG9hZGFibGUgb2JqZWN0IGZpbGU6ICRvdXRwdXQiCisKKwkgICMgTG9vcCB0aHJvdWdoIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYWJvdmUgYW5kIGV4ZWN1dGUgdGhlbS4KKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgZm9yIGNtZCBpbiAkY29uY2F0X2NtZHM7IGRvCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAkc2hvdyAiJGNtZCIKKwkgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKworCSAgbGlib2Jqcz0kb3V0cHV0CisJICAjIFJlc3RvcmUgdGhlIHZhbHVlIG9mIG91dHB1dC4KKwkgIG91dHB1dD0kc2F2ZV9vdXRwdXQKKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIiAmJiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgZmkKKwkgICMgRXhwYW5kIHRoZSBsaWJyYXJ5IGxpbmtpbmcgY29tbWFuZHMgYWdhaW4gdG8gcmVzZXQgdGhlCisJICAjIHZhbHVlIG9mICRsaWJvYmpzIGZvciBwaWVjZXdpc2UgbGlua2luZy4KKworCSAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kbW9kdWxlX2NtZHMKKwkgICAgZmkKKwkgIGVsc2UKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGNtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKKwkgIGVsc2UKKwkgICAgY21kcz0kYXJjaGl2ZV9jbWRzCisJICAgIGZpCisJICBmaQorCisJICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byByZW1vdmUgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzCisJICAjIHRvIHRoZSBqdXN0LXJlc2V0ICRjbWRzLgorCSAgZXZhbCBjbWRzPVwiXCRjbWRzflwkcm0gJGRlbGZpbGVzXCIKKwlmaQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGV2YWwgY21kPVwiJGNtZFwiCisJICAkc2hvdyAiJGNtZCIKKwkgICRydW4gZXZhbCAiJGNtZCIgfHwgeworCSAgICBsdF9leGl0PSQ/CisKKwkgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJICAgIGlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJworCSAgICBmaQorCisJICAgIGV4aXQgJGx0X2V4aXQKKwkgIH0KKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisKKwkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKKwlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJG12ICIkcmVhbG5hbWUiVSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkgICAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKKwkgICAgZmkKKwkgIGZpCisKKwkgIGV4aXQgJEVYSVRfU1VDQ0VTUworCWZpCisKKwkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgorCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbworCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgorCSAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCisJICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSknIHx8IGV4aXQgJD8KKwkgIGZpCisJZG9uZQorCisJIyBJZiAtbW9kdWxlIG9yIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyB8fCB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCisJICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KKwkgIGRsbmFtZT0iJHNvbmFtZSIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvYmopCisgICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgY2FzZSAkb3V0cHV0IGluCisgICAgICAqLmxvKQorCWlmIHRlc3QgLW4gIiRvYmpzJG9sZF9kZXBsaWJzIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCWxpYm9iaj0iJG91dHB1dCIKKwlvYmo9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCTs7CisgICAgICAqKQorCWxpYm9iaj0KKwlvYmo9IiRvdXRwdXQiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgorICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCisKKyAgICAgICMgT2JqZWN0cyBmcm9tIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFRoaXMgYXNzdW1lcworICAgICAgIyBzaW5nbGUtdmVyc2lvbiBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBXaGVuZXZlciB3ZSBjcmVhdGUKKyAgICAgICMgZGlmZmVyZW50IG9uZXMgZm9yIFBJQy9ub24tUElDLCB0aGlzIHdlJ2xsIGhhdmUgdG8gZHVwbGljYXRlCisgICAgICAjIHRoZSBleHRyYWN0aW9uLgorICAgICAgcmVsb2FkX2NvbnZfb2Jqcz0KKyAgICAgIGdlbnRvcD0KKyAgICAgICMgcmVsb2FkX2NtZHMgcnVucyAkTEQgZGlyZWN0bHksIHNvIGxldCB1cyBnZXQgcmlkIG9mCisgICAgICAjIC1XbCBmcm9tIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGFuZCBob3BlIHdlIGNhbiBnZXQgYnkgd2l0aAorICAgICAgIyB0dXJuaW5nIGNvbW1hIGludG8gc3BhY2UuLgorICAgICAgd2w9CisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzPVwiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgIHJlbG9hZF9jb252X29ianM9JHJlbG9hZF9vYmpzXCBgJGVjaG8gIlgkdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3MiIHwgJFhzZWQgLWUgJ3N8LHwgfGcnYAorCWVsc2UKKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKKwkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisgICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKworICAgICAgb3V0cHV0PSIkb2JqIgorICAgICAgY21kcz0kcmVsb2FkX2NtZHMKKyAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwlJRlM9IiRzYXZlX2lmcyIKKwlldmFsIGNtZD1cIiRjbWRcIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgorICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgJHJ1biAke3JtfXIgJGdlbnRvcAorCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAkcnVuICR7cm19ciAkZ2VudG9wCisJZmkKKworCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0CisJIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKwkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJIyAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPworCWV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQ7IHRoZW4KKwkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgorCXJlbG9hZF9vYmpzPSIkbGlib2JqcyAkcmVsb2FkX2NvbnZfb2JqcyIKKwlvdXRwdXQ9IiRsaWJvYmoiCisJY21kcz0kcmVsb2FkX2NtZHMKKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwlmb3IgY21kIGluICRjbWRzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBldmFsIGNtZD1cIiRjbWRcIgorCSAgJHNob3cgIiRjbWQiCisJICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkkcnVuICR7cm19ciAkZ2VudG9wCisgICAgICBmaQorCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisKKyAgICBwcm9nKQorICAgICAgY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXQgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLDtzLCQsLmV4ZSwnYCA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgorCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKKwlmaQorICAgICAgZmkKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJY29tcGlsZV9kZXBsaWJzPWAkZWNobyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkZWNobyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmRhcndpbiopCisgICAgICAgICMgRG9uJ3QgYWxsb3cgbGF6eSBsaW5raW5nLCBpdCBicmVha3MgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMKKyAgICAgICAgaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCisJICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKwkgIHRlc3RiaW5kaXI9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRsaWJkaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZGxzeW1zPQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCisJY2FzZSAkZGxzeW1zIGluCisJIiIpIDs7CisJKi5jKQorCSAgIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKwkgIG5saXN0PSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Lm5tIgorCisJICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgorCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKworCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KKwkgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCisJICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyA+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIFwiQ1wiIHsKKyNlbmRpZgorCisvKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLworI2RlZmluZSBsdF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAorCisvKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAorIgorCisJICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKKworCSAgICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgorCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbworCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgorCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICBkb25lCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICBmaQorCisJICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCisJICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scworCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCisgICAgICAgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgICAgICRydW4gZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkJJHJ1biBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgZXNhYworCSAgICBlbHNlCisJICAgICAgJHJ1biBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKKwkgICAgICAkcnVuIGV2YWwgJ2dyZXAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKKyAgICAgICAgICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQorCSAgICAgICAgJHJ1biBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCQkkcnVuIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCisJICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbworCSAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICAgbmFtZT1gJGVjaG8gIiRhcmciIHwgJHtTRUR9IC1lICdzJV4uKi8lJSdgCisJICAgICRydW4gZXZhbCAnJGVjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KKwkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAgICRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCisJICAgICAgJG12ICIkbmxpc3QiVCAiJG5saXN0IgorCSAgICBmaQorCisJICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICAgIGlmIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiB8CisJCWlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQkgIHNvcnQgLWsgMworCQllbHNlCisJCSAgc29ydCArMgorCQlmaSB8CisJCXVuaXEgPiAiJG5saXN0IlM7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgorCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJworCSAgICBlbHNlCisJICAgICAgJGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorCisjdW5kZWYgbHRfcHJlbG9hZGVkX3N5bWJvbHMKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyIHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0ciBjaGFyICoKKyMgZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCisiCisKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogKQorCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNhbid0IGJlIGNvbnN0LCBiZWNhdXNlCisgICBydW50aW1lIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbgorICAgb24gcHNldWRvLXJlbG9jcyAqLworc3RydWN0IHsKKyIKKwkgICAgICA7OworCSAgICAqICkKKwkgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorY29uc3Qgc3RydWN0IHsKKyIKKwkgICAgICA7OworCSAgICBlc2FjCisKKworCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0ciBhZGRyZXNzOworfQorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7XAorIgorCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCisJICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorICB7MCwgKGx0X3B0cikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCSAgZmkKKworCSAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQorCSAgY2FzZSAkaG9zdCBpbgorCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCisJICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKKwkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKKwkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgorCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KKwkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKKwkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICoiIC1zdGF0aWMgIiopIDs7CisJICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCI7OworCSAgICBlc2FjOzsKKwkgICotKi1ocHV4KikKKwkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICoiIC1zdGF0aWMgIiopIDs7CisJICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyI7OworCSAgICBlc2FjCisJICBlc2FjCisKKwkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDICAkTFRDRkxBR1MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCisJICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyAgJExUQ0ZMQUdTIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPworCisJICAjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMgJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisJICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKworCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgICBjYXNlICRob3N0IGluCisgICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmIiA7IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiIHwgJE5MMlNQYAorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9LmRlZiAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lIiB8ICROTDJTUGAKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiIHwgJE5MMlNQYAorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lIiB8ICROTDJTUGAKKyAgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAqICkKKyAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lIiB8ICROTDJTUGAKKyAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiIHwgJE5MMlNQYAorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisJICA7OworCSotKi1mcmVlYnNkKikKKwkgICMgRnJlZUJTRCBkb2Vzbid0IG5lZWQgdGhpcy4uLgorCSAgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KKwkjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisJIyByZWFsbHkgd2FzIHJlcXVpcmVkLgorCisJIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKwljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiIHwgJE5MMlNQYAorCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlIiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX3JlbGluayIgPSBubyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZycgfCAkTkwyU1BgCisJbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisKKwkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KKwkkc2hvdyAiJGxpbmtfY29tbWFuZCIKKwkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiCisJZXhpdF9zdGF0dXM9JD8KKworCSMgRGVsZXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KKwkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgorCSAgJHJ1biAkcm0gIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKKwlmaQorCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCSMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgorCXJwYXRoPQorCWZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCisJICBjYXNlICRkaXIgaW4KKwkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKKwkgICAgIyBBYnNvbHV0ZSBwYXRoLgorCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICAgIDs7CisJICAqKQorCSAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCisJICAgIHJwYXRoPSIkcnBhdGhcJHRoaXNkaXIvJGRpcjoiCisJICAgIDs7CisJICBlc2FjCisJZG9uZQorCXRlbXBfcnBhdGg9IiRycGF0aCIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGNvbXBpbGVfdmFyPQorICAgICAgZmluYWxpemVfdmFyPQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgZG9uZQorCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAorCSMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCisJJHJ1biAkcm0gJG91dHB1dAorCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAorCSRzaG93ICIkbGlua19jb21tYW5kIgorCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPworCWV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKwkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIgMT4mMgorICAgICAgZWxzZQorCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCisJICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRTUDJOTCB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZycgfCAkTkwyU1BgCisJICBlbHNlCisJICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcworCSAgICByZWxpbmtfY29tbWFuZD0KKwkgIGZpCisJZWxzZQorCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCWZpCisgICAgICBmaQorCisgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisgICAgICBsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgorICAgICAgJHJ1biAkcm0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQorCisgICAgICAkc2hvdyAiJGxpbmtfY29tbWFuZCIKKyAgICAgICRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPworCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisJZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgorCSAgZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGVsc2UKKwkgICAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGZpCisJZG9uZQorCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCisJcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgorICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisJY2FzZSAkcHJvZ3BhdGggaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHFlY2hvPSIkU0hFTEwgJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7OworCSopIHFlY2hvPSIkU0hFTEwgYHB3ZGAvJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7OworCWVzYWMKKwlxZWNobz1gJGVjaG8gIlgkcWVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZWxzZQorCXFlY2hvPWAkZWNobyAiWCRlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGZpCisKKyAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKKwkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgorCWNhc2UgJG91dHB1dCBpbgorCSAgKi5leGUpIG91dHB1dD1gJGVjaG8gJG91dHB1dHwke1NFRH0gJ3MsLmV4ZSQsLCdgIDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBvdXRwdXRuYW1lPWAkZWNobyAkb3V0cHV0bmFtZXwke1NFRH0gJ3MsLmV4ZSQsLCdgIDs7CisJICAqKSBleGVleHQ9IDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiApCisgICAgICAgICAgICBvdXRwdXRfbmFtZT1gYmFzZW5hbWUgJG91dHB1dGAKKyAgICAgICAgICAgIG91dHB1dF9wYXRoPWBkaXJuYW1lICRvdXRwdXRgCisgICAgICAgICAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisgICAgICAgICAgICBjd3JhcHBlcj0iJG91dHB1dF9wYXRoLyRvdXRwdXRfbmFtZS5leGUiCisgICAgICAgICAgICAkcm0gJGN3cmFwcGVyc291cmNlICRjd3JhcHBlcgorICAgICAgICAgICAgdHJhcCAiJHJtICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgY2F0ID4gJGN3cmFwcGVyc291cmNlIDw8RU9GCisKKy8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKKworICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisgICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisKKyAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworICAgQ3VycmVudGx5LCBpdCBzaW1wbHkgZXhlY3MgdGhlIHdyYXBwZXIgKnNjcmlwdCogIi9iaW4vc2ggJG91dHB1dCIsCisgICBidXQgY291bGQgZXZlbnR1YWxseSBhYnNvcmIgYWxsIG9mIHRoZSBzY3JpcHRzIGZ1bmN0aW9uYWxpdHkgYW5kCisgICBleGVjICRvYmpkaXIvJG91dHB1dG5hbWUgZGlyZWN0bHkuCisqLworRU9GCisJICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2U8PCJFT0YiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBQQVRIX01BWAorI2VsaWYgZGVmaW5lZChNQVhQQVRITEVOKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBNQVhQQVRITEVOCisjZWxzZQorIyBkZWZpbmUgTFRfUEFUSE1BWCAxMDI0CisjZW5kaWYKKworI2lmbmRlZiBESVJfU0VQQVJBVE9SCisjIGRlZmluZSBESVJfU0VQQVJBVE9SICcvJworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfX0RKR1BQX18pIHx8IFwKKyAgZGVmaW5lZCAoX19PUzJfXykKKyMgZGVmaW5lIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNCisjIGlmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBESVJfU0VQQVJBVE9SXzIgJ1xcJworIyBlbmRpZgorIyBpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyAgZGVmaW5lIFBBVEhfU0VQQVJBVE9SXzIgJzsnCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpICgoY2gpID09IERJUl9TRVBBUkFUT1IpCisjZWxzZSAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpIFwKKyAgICAgICAgKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCisjZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SKQorI2Vsc2UgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCisjZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworCisjZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCisjZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKKyAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKK30gd2hpbGUgKDApCisKKy8qIC1EREVCVUcgaXMgZmFpcmx5IGNvbW1vbiBpbiBDRkxBR1MuICAqLworI3VuZGVmIERFQlVHCisjaWYgZGVmaW5lZCBERUJVR1dSQVBQRVIKKyMgZGVmaW5lIERFQlVHKGZvcm1hdCwgLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBfX1ZBX0FSR1NfXykKKyNlbHNlCisjIGRlZmluZSBERUJVRyhmb3JtYXQsIC4uLikKKyNlbmRpZgorCitjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSBOVUxMOworCit2b2lkICogeG1hbGxvYyAoc2l6ZV90IG51bSk7CitjaGFyICogeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKTsKK2NvbnN0IGNoYXIgKiBiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpOworY2hhciAqIGZpbmRfZXhlY3V0YWJsZShjb25zdCBjaGFyICp3cmFwcGVyKTsKK2ludCAgICBjaGVja19leGVjdXRhYmxlKGNvbnN0IGNoYXIgKnBhdGgpOworY2hhciAqIHN0cmVuZHphcChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCk7Cit2b2lkIGx0X2ZhdGFsIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgKipuZXdhcmd6OworICBpbnQgaTsKKworICBwcm9ncmFtX25hbWUgPSAoY2hhciAqKSB4c3RyZHVwIChiYXNlX25hbWUgKGFyZ3ZbMF0pKTsKKyAgREVCVUcoIihtYWluKSBhcmd2WzBdICAgICAgOiAlc1xuIixhcmd2WzBdKTsKKyAgREVCVUcoIihtYWluKSBwcm9ncmFtX25hbWUgOiAlc1xuIixwcm9ncmFtX25hbWUpOworICBuZXdhcmd6ID0gWE1BTExPQyhjaGFyICosIGFyZ2MrMik7CitFT0YKKworICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgorICBuZXdhcmd6WzBdID0gKGNoYXIgKikgeHN0cmR1cCgiJFNIRUxMIik7CitFT0YKKworICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PCJFT0YiCisgIG5ld2FyZ3pbMV0gPSBmaW5kX2V4ZWN1dGFibGUoYXJndlswXSk7CisgIGlmIChuZXdhcmd6WzFdID09IE5VTEwpCisgICAgbHRfZmF0YWwoIkNvdWxkbid0IGZpbmQgJXMiLCBhcmd2WzBdKTsKKyAgREVCVUcoIihtYWluKSBmb3VuZCBleGUgYXQgOiAlc1xuIixuZXdhcmd6WzFdKTsKKyAgLyogd2Uga25vdyB0aGUgc2NyaXB0IGhhcyB0aGUgc2FtZSBuYW1lLCB3aXRob3V0IHRoZSAuZXhlICovCisgIC8qIHNvIG1ha2Ugc3VyZSBuZXdhcmd6WzFdIGRvZXNuJ3QgZW5kIGluIC5leGUgKi8KKyAgc3RyZW5kemFwKG5ld2FyZ3pbMV0sIi5leGUiKTsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICBuZXdhcmd6W2krMV0gPSB4c3RyZHVwKGFyZ3ZbaV0pOworICBuZXdhcmd6W2FyZ2MrMV0gPSBOVUxMOworCisgIGZvciAoaT0wOyBpPGFyZ2MrMTsgaSsrKQorICB7CisgICAgREVCVUcoIihtYWluKSBuZXdhcmd6WyVkXSAgIDogJXNcbiIsaSxuZXdhcmd6W2ldKTsKKyAgICA7CisgIH0KKworRU9GCisKKyAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgbWluZ3cqKQorICAgICAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKKyAgZXhlY3YoIiRTSEVMTCIsKGNoYXIgY29uc3QgKiopbmV3YXJneik7CitFT0YKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCisgIGV4ZWN2KCIkU0hFTEwiLG5ld2FyZ3opOworRU9GCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDwiRU9GIgorICByZXR1cm4gMTI3OworfQorCit2b2lkICoKK3htYWxsb2MgKHNpemVfdCBudW0pCit7CisgIHZvaWQgKiBwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOworICBpZiAoIXApCisgICAgbHRfZmF0YWwgKCJNZW1vcnkgZXhoYXVzdGVkIik7CisKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgoreHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwgc3RyaW5nKSA6IE5VTEwKKzsKK30KKworY29uc3QgY2hhciAqCitiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGNvbnN0IGNoYXIgKmJhc2U7CisKKyNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKKyAgLyogU2tpcCBvdmVyIHRoZSBkaXNrIG5hbWUgaW4gTVNET1MgcGF0aG5hbWVzLiAqLworICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpbmFtZVswXSkgJiYgbmFtZVsxXSA9PSAnOicpCisgICAgbmFtZSArPSAyOworI2VuZGlmCisKKyAgZm9yIChiYXNlID0gbmFtZTsgKm5hbWU7IG5hbWUrKykKKyAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAoKm5hbWUpKQorICAgICAgYmFzZSA9IG5hbWUgKyAxOworICByZXR1cm4gYmFzZTsKK30KKworaW50CitjaGVja19leGVjdXRhYmxlKGNvbnN0IGNoYXIgKiBwYXRoKQoreworICBzdHJ1Y3Qgc3RhdCBzdDsKKworICBERUJVRygiKGNoZWNrX2V4ZWN1dGFibGUpICA6ICVzXG4iLCBwYXRoID8gKCpwYXRoID8gcGF0aCA6ICJFTVBUWSEiKSA6ICJOVUxMISIpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkgJiYKKyAgICAgICgKKyAgICAgICAgLyogTWluR1cgJiBuYXRpdmUgV0lOMzIgZG8gbm90IHN1cHBvcnQgU19JWE9USCBvciBTX0lYR1JQICovCisjaWYgZGVmaW5lZCAoU19JWE9USCkKKyAgICAgICAoKHN0LnN0X21vZGUgJiBTX0lYT1RIKSA9PSBTX0lYT1RIKSB8fAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU19JWEdSUCkKKyAgICAgICAoKHN0LnN0X21vZGUgJiBTX0lYR1JQKSA9PSBTX0lYR1JQKSB8fAorI2VuZGlmCisgICAgICAgKChzdC5zdF9tb2RlICYgU19JWFVTUikgPT0gU19JWFVTUikpCisgICAgICApCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogU2VhcmNoZXMgZm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIHdyYXBwZXIuICBSZXR1cm5zCisgICBuZXdseSBhbGxvY2F0ZWQgZnVsbCBwYXRoIG5hbWUgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlICovCitjaGFyICoKK2ZpbmRfZXhlY3V0YWJsZSAoY29uc3QgY2hhciogd3JhcHBlcikKK3sKKyAgaW50IGhhc19zbGFzaCA9IDA7CisgIGNvbnN0IGNoYXIqIHA7CisgIGNvbnN0IGNoYXIqIHBfbmV4dDsKKyAgLyogc3RhdGljIGJ1ZmZlciBmb3IgZ2V0Y3dkICovCisgIGNoYXIgdG1wW0xUX1BBVEhNQVggKyAxXTsKKyAgaW50IHRtcF9sZW47CisgIGNoYXIqIGNvbmNhdF9uYW1lOworCisgIERFQlVHKCIoZmluZF9leGVjdXRhYmxlKSAgOiAlc1xuIiwgd3JhcHBlciA/ICgqd3JhcHBlciA/IHdyYXBwZXIgOiAiRU1QVFkhIikgOiAiTlVMTCEiKTsKKworICBpZiAoKHdyYXBwZXIgPT0gTlVMTCkgfHwgKCp3cmFwcGVyID09ICdcMCcpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFic29sdXRlIHBhdGg/ICovCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcil3cmFwcGVyWzBdKSAmJiB3cmFwcGVyWzFdID09ICc6JykKKyAgeworICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7CisgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUoY29uY2F0X25hbWUpKQorICAgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICAgIFhGUkVFKGNvbmNhdF9uYW1lKTsKKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZgorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICh3cmFwcGVyWzBdKSkKKyAgICB7CisgICAgICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUoY29uY2F0X25hbWUpKQorICAgICAgICByZXR1cm4gY29uY2F0X25hbWU7CisgICAgICBYRlJFRShjb25jYXRfbmFtZSk7CisgICAgfQorI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICB9CisjZW5kaWYKKworICBmb3IgKHAgPSB3cmFwcGVyOyAqcDsgcCsrKQorICAgIGlmICgqcCA9PSAnLycpCisgICAgeworICAgICAgaGFzX3NsYXNoID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKCFoYXNfc2xhc2gpCisgIHsKKyAgICAvKiBubyBzbGFzaGVzOyBzZWFyY2ggUEFUSCAqLworICAgIGNvbnN0IGNoYXIqIHBhdGggPSBnZXRlbnYgKCJQQVRIIik7CisgICAgaWYgKHBhdGggIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHBfbmV4dCkKKyAgICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogcTsKKyAgICAgICAgc2l6ZV90IHBfbGVuOworICAgICAgICBmb3IgKHEgPSBwOyAqcTsgcSsrKQorICAgICAgICAgIGlmIChJU19QQVRIX1NFUEFSQVRPUigqcSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcF9sZW4gPSBxIC0gcDsKKyAgICAgICAgcF9uZXh0ID0gKCpxID09ICdcMCcgPyBxIDogcSArIDEpOworICAgICAgICBpZiAocF9sZW4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGVtcHR5IHBhdGg6IGN1cnJlbnQgZGlyZWN0b3J5ICovCisgICAgICAgICAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQorICAgICAgICAgICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7CisgICAgICAgICAgdG1wX2xlbiA9IHN0cmxlbih0bXApOworICAgICAgICAgIGNvbmNhdF9uYW1lID0gWE1BTExPQyhjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbih3cmFwcGVyKSArIDEpOworICAgICAgICAgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgICAgICAgICAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisgICAgICAgICAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25jYXRfbmFtZSA9IFhNQUxMT0MoY2hhciwgcF9sZW4gKyAxICsgc3RybGVuKHdyYXBwZXIpICsgMSk7CisgICAgICAgICAgbWVtY3B5IChjb25jYXRfbmFtZSwgcCwgcF9sZW4pOworICAgICAgICAgIGNvbmNhdF9uYW1lW3BfbGVuXSA9ICcvJzsKKyAgICAgICAgICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgcF9sZW4gKyAxLCB3cmFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCisgICAgICAgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgICBYRlJFRShjb25jYXRfbmFtZSk7CisgICAgICB9CisgICAgfQorICAgIC8qIG5vdCBmb3VuZCBpbiBQQVRIOyBhc3N1bWUgY3VyZGlyICovCisgIH0KKyAgLyogUmVsYXRpdmUgcGF0aCB8IG5vdCBmb3VuZCBpbiBwYXRoOiBwcmVwZW5kIGN3ZCAqLworICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7CisgIHRtcF9sZW4gPSBzdHJsZW4odG1wKTsKKyAgY29uY2F0X25hbWUgPSBYTUFMTE9DKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuKHdyYXBwZXIpICsgMSk7CisgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCisgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKKyAgICByZXR1cm4gY29uY2F0X25hbWU7CisgIFhGUkVFKGNvbmNhdF9uYW1lKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKgorc3RyZW5kemFwKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KQoreworICBzaXplX3QgbGVuLCBwYXRsZW47CisKKyAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgYXNzZXJ0KHBhdCAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4oc3RyKTsKKyAgcGF0bGVuID0gc3RybGVuKHBhdCk7CisKKyAgaWYgKHBhdGxlbiA8PSBsZW4pCisgIHsKKyAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOworICAgIGlmIChzdHJjbXAoc3RyLCBwYXQpID09IDApCisgICAgICAqc3RyID0gJ1wwJzsKKyAgfQorICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZAorbHRfZXJyb3JfY29yZSAoaW50IGV4aXRfc3RhdHVzLCBjb25zdCBjaGFyICogbW9kZSwKKyAgICAgICAgICBjb25zdCBjaGFyICogbWVzc2FnZSwgdmFfbGlzdCBhcCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAiLCBwcm9ncmFtX25hbWUsIG1vZGUpOworICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcCk7CisgIGZwcmludGYgKHN0ZGVyciwgIi5cbiIpOworCisgIGlmIChleGl0X3N0YXR1cyA+PSAwKQorICAgIGV4aXQgKGV4aXRfc3RhdHVzKTsKK30KKwordm9pZAorbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKKyAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZCAoYXApOworfQorRU9GCisgICAgICAgICAgIyB3ZSBzaG91bGQgcmVhbGx5IHVzZSBhIGJ1aWxkLXBsYXRmb3JtIHNwZWNpZmljIGNvbXBpbGVyCisgICAgICAgICAgIyBoZXJlLCBidXQgT1RPSCwgdGhlIHdyYXBwZXJzIChzaGVsbCBzY3JpcHQgYW5kIHRoaXMgQyBvbmUpCisgICAgICAgICAgIyBhcmUgb25seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZXhlY3V0ZSB0aGUgInJlYWwiIGJpbmFyeS4KKyAgICAgICAgICAjIFNpbmNlIHRoZSAicmVhbCIgYmluYXJ5IGlzIGJ1aWx0IGZvciAkaG9zdCwgdGhlbiB0aGlzCisgICAgICAgICAgIyB3cmFwcGVyIG1pZ2h0IGFzIHdlbGwgYmUgYnVpbHQgZm9yICRob3N0LCB0b28uCisgICAgICAgICAgJHJ1biAkTFRDQyAkTFRDRkxBR1MgLXMgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgJHJtICRvdXRwdXQKKyAgICAgICAgdHJhcCAiJHJtICRvdXRwdXQ7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkkZWNobyA+ICRvdXRwdXQgIlwKKyMhICRTSEVMTAorCisjICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAorIworIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKKyMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgorIworIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nJHtTRUR9IC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUgKHRha2VuIGZyb20gQXV0b2NvbmY6X0FTX0JPVVJORV9DT01QQVRJQkxFKS4KK2lmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKK2ZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KK2lmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgorICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgorICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCitlbHNlCisgICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KKyAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgIGVjaG89XCIkcWVjaG9cIgorICAgIGZpbGU9XCJcJDBcIgorICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCisgICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgICAgICBzaGlmdAorICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KKyAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCisgICAgICA6CisgICAgZWxzZQorICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgorICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9CisgICAgZmkKKyAgZmlcCisiCisJJGVjaG8gPj4gJG91dHB1dCAiXAorCisgICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCisgIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCisgIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KKworICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KKyAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCisgIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KKyAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKKworICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KKyAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCisgICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KKyAgICAgIFtcXFxcL10qIHwgW0EtWmEtel06W1xcXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OworICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OworICAgICAgZXNhYworICAgIGZpCisKKyAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAorICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKyIKKworCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwgXFwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRta2RpciBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKworICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5CisgICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgorICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6CisgICAgICBlbHNlCisJJGVjaG8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgorCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKyAgICBmaQorCisgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8CisgICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7CisgICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KKyAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKyAgZmkiCisJZWxzZQorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICBwcm9ncmFtPSckb3V0cHV0bmFtZScKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyIKKwlmaQorCisJJGVjaG8gPj4gJG91dHB1dCAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCisKKyAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKKyAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAorICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCisKKyAgICBleHBvcnQgJHNobGlicGF0aF92YXIKKyIKKwlmaQorCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAorICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICisiCisJZmkKKworCSRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgorIgorCWNhc2UgJGhvc3QgaW4KKwkjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKwkqLSotbWluZ3cgfCAqLSotb3MyKikKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQorIgorCSAgOzsKKworCSopCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisJZXNhYworCSRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkKlwiCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorICBlbHNlCisgICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgorICAgIFwkZWNobyBcIlwkMDogZXJyb3I6IFxcXGBcJHByb2dkaXIvXCRwcm9ncmFtJyBkb2VzIG5vdCBleGlzdFwiIDE+JjIKKyAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKKyAgICAkZWNobyBcIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIGZpCitmaVwKKyIKKwljaG1vZCAreCAkb3V0cHV0CisgICAgICBmaQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgorICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KKwlvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgorCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWVsc2UKKwkgIG9sZG9ianM9IiRvbGRfZGVwbGlicyAkbm9uX3BpY19vYmplY3RzIgorCWZpCisJYWRkbGlicz0iJG9sZF9jb252ZW5pZW5jZSIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRhZGRsaWJzIjsgdGhlbgorCWdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwlmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkYWRkbGlicworCW9sZG9ianM9IiRvbGRvYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICBjbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisgICAgICBlbHNlCisJIyBQT1NJWCBkZW1hbmRzIG5vIHBhdGhzIHRvIGJlIGVuY29kZWQgaW4gYXJjaGl2ZXMuICBXZSBoYXZlCisJIyB0byBhdm9pZCBjcmVhdGluZyBhcmNoaXZlcyB3aXRoIGR1cGxpY2F0ZSBiYXNlbmFtZXMgaWYgd2UKKwkjIG1pZ2h0IGhhdmUgdG8gZXh0cmFjdCB0aGVtIGFmdGVyd2FyZHMsIGUuZy4sIHdoZW4gY3JlYXRpbmcgYQorCSMgc3RhdGljIGFyY2hpdmUgb3V0IG9mIGEgY29udmVuaWVuY2UgbGlicmFyeSwgb3Igd2hlbiBsaW5raW5nCisJIyB0aGUgZW50aXJldHkgb2YgYSBsaWJ0b29sIGFyY2hpdmUgaW50byBhbm90aGVyIChjdXJyZW50bHkKKwkjIG5vdCBzdXBwb3J0ZWQgYnkgbGlidG9vbCkuCisJaWYgKGZvciBvYmogaW4gJG9sZG9ianMKKwkgICAgZG8KKwkgICAgICAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJworCSAgICBkb25lIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKwkgIDoKKwllbHNlCisJICAkZWNobyAiY29weWluZyBzZWxlY3RlZCBvYmplY3QgZmlsZXMgdG8gYXZvaWQgYmFzZW5hbWUgY29uZmxpY3RzLi4uIgorCisJICBpZiB0ZXN0IC16ICIkZ2VudG9wIjsgdGhlbgorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAgICRydW4gJHtybX1yICIkZ2VudG9wIgorCSAgICAkc2hvdyAiJG1rZGlyICRnZW50b3AiCisJICAgICRydW4gJG1rZGlyICIkZ2VudG9wIgorCSAgICBleGl0X3N0YXR1cz0kPworCSAgICBpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJGdlbnRvcCI7IHRoZW4KKwkgICAgICBleGl0ICRleGl0X3N0YXR1cworCSAgICBmaQorCSAgZmkKKworCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCisJICBvbGRvYmpzPQorCSAgY291bnRlcj0xCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIG9iamJhc2U9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgorCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OworCSAgICAqW1wgL10iJG9iamJhc2UgIiopCisJICAgICAgd2hpbGUgOjsgZG8KKwkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KKwkJIyBvdmVybGFwcy4KKwkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKKwkJY291bnRlcj1gZXhwciAkY291bnRlciArIDFgCisJCWNhc2UgIiAkb2xkb2JqcyAiIGluCisJCSpbXCAvXSIkbmV3b2JqICIqKSA7OworCQkqKSBpZiB0ZXN0ICEgLWYgIiRnZW50b3AvJG5ld29iaiI7IHRoZW4gYnJlYWs7IGZpIDs7CisJCWVzYWMKKwkgICAgICBkb25lCisJICAgICAgJHNob3cgImxuICRvYmogJGdlbnRvcC8kbmV3b2JqIHx8IGNwICRvYmogJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgICRydW4gbG4gIiRvYmoiICIkZ2VudG9wLyRuZXdvYmoiIHx8CisJICAgICAgJHJ1biBjcCAiJG9iaiIgIiRnZW50b3AvJG5ld29iaiIKKwkgICAgICBvbGRvYmpzPSIkb2xkb2JqcyAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgOzsKKwkgICAgKikgb2xkb2Jqcz0iJG9sZG9ianMgJG9iaiIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisKKwlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisKKwlpZiBsZW49YGV4cHIgIlgkY21kcyIgOiAiLioiYCAmJgorCSAgICAgdGVzdCAiJGxlbiIgLWxlICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCisJICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCisJZWxzZQorCSAgIyB0aGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGxpbmsgaW4gb25lIHN0ZXAsIGxpbmsgaW4gcGFydHMKKwkgICRlY2hvICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgorCSAgUkFOTElCPToKKwkgIG9iamxpc3Q9CisJICBjb25jYXRfY21kcz0KKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCisJICAjIElzIHRoZXJlIGEgYmV0dGVyIHdheSBvZiBmaW5kaW5nIHRoZSBsYXN0IG9iamVjdCBpbiB0aGUgbGlzdD8KKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgbGFzdF9vbGRvYmo9JG9iagorCSAgZG9uZQorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBvbGRvYmpzPSIkb2JqbGlzdCAkb2JqIgorCSAgICBvYmpsaXN0PSIkb2JqbGlzdCAkb2JqIgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgICAgaWYgbGVuPWBleHByICJYJHRlc3RfY21kcyIgOiAiLioiIDI+L2Rldi9udWxsYCAmJgorCSAgICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCisJICAgICAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCisJICAgICAgICBSQU5MSUI9JHNhdmVfUkFOTElCCisJICAgICAgZmkKKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgICAgIG9iamxpc3Q9CisJICAgIGZpCisJICBkb25lCisJICBSQU5MSUI9JHNhdmVfUkFOTElCCisJICBvbGRvYmpzPSRvYmpsaXN0CisJICBpZiB0ZXN0ICJYJG9sZG9ianMiID0gIlgiIDsgdGhlbgorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzXCIKKwkgIGVsc2UKKwkgICAgZXZhbCBjbWRzPVwiXCRjb25jYXRfY21kc35cJG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKyAgICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKKwlJRlM9IiRzYXZlX2lmcyIKKwkkc2hvdyAiJGNtZCIKKwkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLW4gIiRnZW5lcmF0ZWQiOyB0aGVuCisgICAgICAkc2hvdyAiJHtybX1yJGdlbmVyYXRlZCIKKyAgICAgICRydW4gJHtybX1yJGdlbmVyYXRlZAorICAgIGZpCisKKyAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KKyAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAqLmxhKQorICAgICAgb2xkX2xpYnJhcnk9CisgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgorICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKyAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgorCWVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWVsc2UKKwkgIHZhcl92YWx1ZT1gJGVjaG8gIlgkdmFyX3ZhbHVlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWZpCisgICAgICBkb25lCisgICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgorICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiB8ICROTDJTUGAKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgorCXJlbGlua19jb21tYW5kPQorICAgICAgZmkKKworCisgICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KKyAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJZm9yIGluc3RhbGxlZCBpbiBubyB5ZXM7IGRvCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9saWJkaXIiOyB0aGVuCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgICAgb3V0cHV0PSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCisJICAgICMgUmVwbGFjZSBhbGwgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMgd2l0aCB0aGUgaW5zdGFsbGVkIG9uZXMKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgKi5sYSkKKwkJbmFtZT1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkJZmkKKwkJbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgKikgbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgbmV3ZGxmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxmaWxlczsgZG8KKwkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJCWV4aXQgJEVYSVRfRkFJTFVSRQorCSAgICAgIGZpCisJICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGxpYmRpci8kbmFtZSIKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJCWV4aXQgJEVYSVRfRkFJTFVSRQorCSAgICAgIGZpCisJICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGxpYmRpci8kbmFtZSIKKwkgICAgZG9uZQorCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKwkgIGVsc2UKKwkgICAgbmV3ZGxmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CisJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CisJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKwkgIGZpCisJICAkcm0gJG91dHB1dAorCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCisJICB0ZGxuYW1lPSRkbG5hbWUKKwkgIGNhc2UgJGhvc3QsJG91dHB1dCwkaW5zdGFsbGVkLCRtb2R1bGUsJGRsbmFtZSBpbgorCSAgICAqY3lnd2luKiwqbGFpLHllcyxubywqLmRsbCB8ICptaW5ndyosKmxhaSx5ZXMsbm8sKi5kbGwpIHRkbG5hbWU9Li4vYmluLyRkbG5hbWUgOzsKKwkgIGVzYWMKKwkgICRlY2hvID4gJG91dHB1dCAiXAorIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JyR0ZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD0kaW5zdGFsbGVkCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPSRtb2R1bGUKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JyRkbGZpbGVzJworZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0geWVzOyB0aGVuCisJICAgICRlY2hvID4+ICRvdXRwdXQgIlwKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCisJICBmaQorCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KKyAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCisgICAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSkiCisgICAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpJyB8fCBleGl0ICQ/CisgICAgICA7OworICAgIGVzYWMKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICA7OworCisgICMgbGlidG9vbCBpbnN0YWxsIG1vZGUKKyAgaW5zdGFsbCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBpbnN0YWxsIgorCisgICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgorICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoIHx8CisgICAgICAgIyBBbGxvdyB0aGUgdXNlIG9mIEdOVSBzaHRvb2wncyBpbnN0YWxsIGNvbW1hbmQuCisgICAgICAgJGVjaG8gIlgkbm9ub3B0IiB8IGdyZXAgc2h0b29sID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCWFyZz0iXCIkYXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICBlbHNlCisgICAgICBpbnN0YWxsX3Byb2c9CisgICAgICBhcmc9JG5vbm9wdAorICAgIGZpCisKKyAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCisgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICBjYXNlICRhcmcgaW4KKyAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgIGFyZz0iXCIkYXJnXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgorCisgICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgorICAgIGRlc3Q9CisgICAgZmlsZXM9CisgICAgb3B0cz0KKyAgICBwcmV2PQorICAgIGluc3RhbGxfdHlwZT0KKyAgICBpc2Rpcj1ubworICAgIHN0cmlwbWU9CisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KKwlmaWxlcz0iJGZpbGVzICRkZXN0IgorCWRlc3Q9JGFyZworCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKKyAgICAgIC1mKSAKKyAgICAgIAljYXNlICIgJGluc3RhbGxfcHJvZyAiIGluCisJKltcXFwgL11jcFwgKikgOzsKKwkqKSBwcmV2PSRhcmcgOzsKKwllc2FjCisJOzsKKyAgICAgIC1nIHwgLW0gfCAtbykgcHJldj0kYXJnIDs7CisgICAgICAtcykKKwlzdHJpcG1lPSIgLXMiCisJY29udGludWUKKwk7OworICAgICAgLSopCisJOzsKKyAgICAgICopCisJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgorCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgcHJldj0KKwllbHNlCisJICBkZXN0PSRhcmcKKwkgIGNvbnRpbnVlCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgorICAgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgY2FzZSAkYXJnIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwlhcmc9IlwiJGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisgICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGFyZyIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogbm8gZmlsZSBvciBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiIDE+JjIKKyAgICAgIGVsc2UKKwkkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iIDE+JjIKKyAgICAgIGZpCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KKyAgICBkZXN0PWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS8kJSUnYAorCisgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCisgICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcworICAgIGlmIHRlc3QgIiRpc2RpciIgPSB5ZXM7IHRoZW4KKyAgICAgIGRlc3RkaXI9IiRkZXN0IgorICAgICAgZGVzdG5hbWU9CisgICAgZWxzZQorICAgICAgZGVzdGRpcj1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgICAgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGRlc3QiICYmIGRlc3RkaXI9LgorICAgICAgZGVzdG5hbWU9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgorICAgICAgc2V0IGR1bW15ICRmaWxlcworICAgICAgaWYgdGVzdCAiJCMiIC1ndCAyOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorICAgIGZpCisgICAgY2FzZSAkZGVzdGRpciBpbgorICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKyAgICAqKQorICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCWNhc2UgJGZpbGUgaW4KKwkqLmxvKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgc3RhdGljbGlicz0KKyAgICBmdXR1cmVfbGliZGlycz0KKyAgICBjdXJyZW50X2xpYmRpcnM9CisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCisgICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi4kbGliZXh0KQorCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCisJc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCisJOzsKKworICAgICAgKi5sYSkKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZmkKKworCWxpYnJhcnlfbmFtZXM9CisJb2xkX2xpYnJhcnk9CisJcmVsaW5rX2NvbW1hbmQ9CisJIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJY2FzZSAkZmlsZSBpbgorCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkqKSAuIC4vJGZpbGUgOzsKKwllc2FjCisKKwkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCisJaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KKwkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OworCSAgZXNhYworCWVsc2UKKwkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KKwkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisKKwlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AvCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KKwlkaXI9IiRkaXIkb2JqZGlyIgorCisJaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgIyBEZXRlcm1pbmUgdGhlIHByZWZpeCB0aGUgdXNlciBoYXMgYXBwbGllZCB0byBvdXIgZnV0dXJlIGRpci4KKwkgIGluc3RfcHJlZml4X2Rpcj1gJGVjaG8gIiRkZXN0ZGlyIiB8ICRTRUQgInMlJGxpYmRpclwkJSUiYAorCisJICAjIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIHBsYWNlIHVzIG91dHNpZGUgb2Ygb3VyIGV4cGVjdGVkCisJICAjIGxvY2F0aW9uIGIvYyB0aGlzIHByZXZlbnRzIGZpbmRpbmcgZGVwZW5kZW50IGxpYnJhcmllcyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgdG8gdGhlIHNhbWUgcHJlZml4LgorCSAgIyBBdCBwcmVzZW50LCB0aGlzIGNoZWNrIGRvZXNuJ3QgYWZmZWN0IHdpbmRvd3MgLmRsbCdzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCBpbnRvICRsaWJkaXIvLi4vYmluIChjdXJyZW50bHksIHRoYXQgd29ya3MgZmluZSkKKwkgICMgYnV0IGl0J3Mgc29tZXRoaW5nIHRvIGtlZXAgYW4gZXllIG9uLgorCSAgaWYgdGVzdCAiJGluc3RfcHJlZml4X2RpciIgPSAiJGRlc3RkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgaW5zdGFsbCBcYCRmaWxlJyB0byBhIGRpcmVjdG9yeSBub3QgZW5kaW5nIGluICRsaWJkaXIiIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCSAgICAjIFN0aWNrIHRoZSBpbnN0X3ByZWZpeF9kaXIgZGF0YSBpbnRvIHRoZSBsaW5rIGNvbW1hbmQuCisJICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiJHJlbGlua19jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgInMlQGluc3RfcHJlZml4X2RpckAlLWluc3QtcHJlZml4LWRpciAkaW5zdF9wcmVmaXhfZGlyJSIgfCAkTkwyU1BgCisJICBlbHNlCisJICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiJHJlbGlua19jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgInMlQGluc3RfcHJlZml4X2RpckAlJSIgfCAkTkwyU1BgCisJICBmaQorCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZWxpbmtpbmcgXGAkZmlsZSciIDE+JjIKKwkgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCisJICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgorCSAgZWxzZQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCWZpCisKKwkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCWlmIHRlc3QgLW4gIiQyIjsgdGhlbgorCSAgcmVhbG5hbWU9IiQyIgorCSAgc2hpZnQKKwkgIHNoaWZ0CisKKwkgIHNyY25hbWU9IiRyZWFsbmFtZSIKKwkgIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCIgJiYgc3JjbmFtZT0iJHJlYWxuYW1lIlQKKworCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgorCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCisJICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KKwkgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCisJICAgICRzaG93ICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgICAkcnVuIGV2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KKwkgIGZpCisKKwkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgorCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgorCSAgICAjIFRyeSBgbG4gLXNmJyBmaXJzdCwgYmVjYXVzZSB0aGUgYGxuJyBiaW5hcnkgbWlnaHQgZGVwZW5kIG9uCisJICAgICMgdGhlIHN5bWxpbmsgd2UgcmVwbGFjZSEgIFNvbGFyaXMgL2Jpbi9sbiBkb2VzIG5vdCB1bmRlcnN0YW5kIC1mLAorCSAgICAjIHNvIHdlIGFsc28gbmVlZCB0byB0cnkgcm0gJiYgbG4gLXMuCisJICAgIGZvciBsaW5rbmFtZQorCSAgICBkbworCSAgICAgIGlmIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSI7IHRoZW4KKyAgICAgICAgICAgICAgICAkc2hvdyAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCisgICAgICAgICAgICAgICAgJHJ1biBldmFsICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKwkgICAgICBmaQorCSAgICBkb25lCisJICBmaQorCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisJICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKKwkgIGNtZHM9JHBvc3RpbnN0YWxsX2NtZHMKKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGV2YWwgY21kPVwiJGNtZFwiCisJICAgICRzaG93ICIkY21kIgorCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IHsKKwkgICAgICBsdF9leGl0PSQ/CisKKwkgICAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKKwkgICAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkJJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknCisJICAgICAgZmkKKworCSAgICAgIGV4aXQgJGx0X2V4aXQKKwkgICAgfQorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJZmkKKworCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgorCW5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCisJJHNob3cgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIgorCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiIHx8IGV4aXQgJD8KKworCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KKwl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorCTs7CisKKyAgICAgICoubG8pCisJIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCisKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwljYXNlICRkZXN0ZmlsZSBpbgorCSoubG8pCisJICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgOzsKKwkqLiRvYmpleHQpCisJICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCisJICBkZXN0ZmlsZT0KKwkgIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisKKwkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KKwlpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCisJICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/CisJZmkKKworCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgorCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKKworCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KKwlmaQorCWV4aXQgJEVYSVRfU1VDQ0VTUworCTs7CisKKyAgICAgICopCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAorCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KKwkjIGluc3RhbGwKKwlzdHJpcHBlZF9leHQ9IiIKKwljYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KKwkgICAgICBmaWxlPWAkZWNobyAkZmlsZXwke1NFRH0gJ3MsLmV4ZSQsLCdgCisJICAgICAgc3RyaXBwZWRfZXh0PSIuZXhlIgorCSAgICBmaQorCSAgICA7OworCWVzYWMKKworCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwljYXNlICRob3N0IGluCisJKmN5Z3dpbip8Km1pbmd3KikKKwkgICAgd3JhcHBlcj1gJGVjaG8gJGZpbGUgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLCdgCisJICAgIDs7CisJKikKKwkgICAgd3JhcHBlcj0kZmlsZQorCSAgICA7OworCWVzYWMKKwlpZiAoJHtTRUR9IC1lICc0cScgJHdyYXBwZXIgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBub3RpbnN0X2RlcGxpYnM9CisJICByZWxpbmtfY29tbWFuZD0KKworCSAgIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisJICAjIGZvbyBldmVuIGlmIGJvdGggZm9vIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCisJICAjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKKwkgICMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KKwkgICMKKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAkd3JhcHBlciBpbgorCSAgKi8qIHwgKlxcKikgLiAke3dyYXBwZXJ9IDs7CisJICAqKSAuIC4vJHt3cmFwcGVyfSA7OworCSAgZXNhYworCisJICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KKwkgIGlmIHRlc3QgLXogIiRub3RpbnN0X2RlcGxpYnMiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCR3cmFwcGVyJyIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisKKwkgIGZpbmFsaXplPXllcworCSAgZm9yIGxpYiBpbiAkbm90aW5zdF9kZXBsaWJzOyBkbworCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCisJICAgIGxpYmRpcj0KKwkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgICAgICBjYXNlICRsaWIgaW4KKwkgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKKwkgICAgICAqKSAuIC4vJGxpYiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgbGliZmlsZT0iJGxpYmRpci8iYCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCisJICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKKwkgICAgICBmaW5hbGl6ZT1ubworCSAgICBmaQorCSAgZG9uZQorCisJICByZWxpbmtfY29tbWFuZD0KKwkgICMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bworCSAgIyBmb28gZXZlbiBpZiBib3RoIGZvbyBhbmQgRklMRS5leGUgZXhpc3Q6IGF1dG9tYXRpYy1hcHBlbmQtLmV4ZQorCSAgIyBiZWhhdmlvciBoYXBwZW5zIG9ubHkgZm9yIGV4ZWMoMyksIG5vdCBmb3Igb3BlbigyKSEgIEFsc28sIHNvdXJjaW5nCisJICAjIGBGSUxFLicgZG9lcyBub3Qgd29yayBvbiBjeWd3aW4gbWFuYWdlZCBtb3VudHMuCisJICAjCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgJHdyYXBwZXIgaW4KKwkgICovKiB8ICpcXCopIC4gJHt3cmFwcGVyfSA7OworCSAgKikgLiAuLyR7d3JhcHBlcn0gOzsKKwkgIGVzYWMKKworCSAgb3V0cHV0bmFtZT0KKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzICYmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKKwkgICAgICBmaWxlPWAkZWNobyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIG91dHB1dG5hbWU9IiR0bXBkaXIvJGZpbGUiCisJICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZycgfCAkTkwyU1BgCisKKwkgICAgICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgorCSAgICAgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICAgICAgZWxzZQorCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKKwkJJHtybX1yICIkdG1wZGlyIgorCQljb250aW51ZQorCSAgICAgIGZpCisJICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIiAxPiYyCisJICAgIGZpCisJICBlbHNlCisJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCisJICBmaQorCWZpCisKKwkjIHJlbW92ZSAuZXhlIHNpbmNlIGN5Z3dpbiAvdXNyL2Jpbi9pbnN0YWxsIHdpbGwgYXBwZW5kIGFub3RoZXIKKwkjIG9uZSBhbnl3YXkgCisJY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCisJKi91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQorCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KKwkgICouZXhlOiouZXhlKQorCSAgICAjIHRoaXMgaXMgb2sKKwkgICAgOzsKKwkgICouZXhlOiopCisJICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKKwkgICAgOzsKKwkgICo6Ki5leGUpCisJICAgIGRlc3RmaWxlPWAkZWNobyAkZGVzdGZpbGUgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLCdgCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwkkc2hvdyAiJGluc3RhbGxfcHJvZyRzdHJpcG1lICRmaWxlICRkZXN0ZmlsZSIKKwkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiIHx8IGV4aXQgJD8KKwl0ZXN0IC1uICIkb3V0cHV0bmFtZSIgJiYgJHtybX1yICIkdG1wZGlyIgorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCisgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/CisKKyAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgorCSRzaG93ICIkb2xkX3N0cmlwbGliICRvbGRsaWIiCisJJHJ1biBldmFsICIkb2xkX3N0cmlwbGliICRvbGRsaWIiIHx8IGV4aXQgJD8KKyAgICAgIGZpCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgIGNtZHM9JG9sZF9wb3N0aW5zdGFsbF9jbWRzCisgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKyAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJSUZTPSIkc2F2ZV9pZnMiCisJZXZhbCBjbWQ9XCIkY21kXCIKKwkkc2hvdyAiJGNtZCIKKwkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KKyAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCisgICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjX2NtZD0nJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCisgICAgZWxzZQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKKyAgICA7OworCisgICMgbGlidG9vbCBmaW5pc2ggbW9kZQorICBmaW5pc2gpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgorICAgIGxpYmRpcnM9IiRub25vcHQiCisgICAgYWRtaW5jbWRzPQorCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGZvciBkaXIKKyAgICAgIGRvCisJbGliZGlycz0iJGxpYmRpcnMgJGRpciIKKyAgICAgIGRvbmUKKworICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgorCSAgY21kcz0kZmluaXNoX2NtZHMKKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGV2YWwgY21kPVwiJGNtZFwiCisJICAgICRzaG93ICIkY21kIgorCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcworICAgICAgICRjbWQiCisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KKwkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCisJICAkcnVuIGV2YWwgIiRjbWRzIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyAgICAgICAkY21kcyIKKwlmaQorICAgICAgZG9uZQorICAgIGZpCisKKyAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KKyAgICB0ZXN0ICIkc2hvdyIgPSA6ICYmIGV4aXQgJEVYSVRfU1VDQ0VTUworCisgICAgJGVjaG8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCisgICAgJGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKKyAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworICAgICAgJGVjaG8gIiAgICRsaWJkaXIiCisgICAgZG9uZQorICAgICRlY2hvCisgICAgJGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgorICAgICRlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKKyAgICAkZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIHRoZSBcYC1MTElCRElSJyIKKyAgICAkZWNobyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgorICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgJGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICAkZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorICAgICAgJGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorICAgICAgJGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGxpYmRpcj1MSUJESVIKKyAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKworICAgICAgJGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCisgICAgICAkZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCisgICAgZmkKKyAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgICAgJGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgorICAgIGZpCisgICAgJGVjaG8KKyAgICAkZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCisgICAgJGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorICAgICRlY2hvICJYLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgfCAkWHNlZAorICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIDs7CisKKyAgIyBsaWJ0b29sIGV4ZWN1dGUgbW9kZQorICBleGVjdXRlKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGV4ZWN1dGUiCisKKyAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgorICAgIGNtZD0iJG5vbm9wdCIKKyAgICBpZiB0ZXN0IC16ICIkY21kIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgorICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCisgICAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiIDE+JjIKKwkkZWNobyAiJGhlbHAiIDE+JjIKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgIGRpcj0KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICoubGEpCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZmkKKworCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgorCWRsbmFtZT0KKwlsaWJyYXJ5X25hbWVzPQorCisJIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJY2FzZSAkZmlsZSBpbgorCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkqKSAuIC4vJGZpbGUgOzsKKwllc2FjCisKKwkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgorCSAgY29udGludWUKKwlmaQorCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKworCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgorCSAgZGlyPSIkZGlyLyRvYmpkaXIiCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkZGlyLyRkbG5hbWUiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKwk7OworCisgICAgICAqKQorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAtKikgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkgICopIC4gLi8kZmlsZSA7OworCSAgZXNhYworCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KKwlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorCisgICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICBmb3IgbHRfdmFyIGluIExBTkcgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKKyAgICAgIGRvCisJZXZhbCAiaWYgdGVzdCBcIlwke3NhdmVfJGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKwkJJGx0X3Zhcj1cJHNhdmVfJGx0X3ZhcjsgZXhwb3J0ICRsdF92YXIKKwkgICAgICBmaSIKKyAgICAgIGRvbmUKKworICAgICAgIyBOb3cgcHJlcGFyZSB0byBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgorICAgICAgZXhlY19jbWQ9IlwkY21kJGFyZ3MiCisgICAgZWxzZQorICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCWV2YWwgIlwkZWNobyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCisJJGVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisgICAgICAkZWNobyAiJGNtZCRhcmdzIgorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKKyAgICA7OworCisgICMgbGlidG9vbCBjbGVhbiBhbmQgdW5pbnN0YWxsIG1vZGUKKyAgY2xlYW4gfCB1bmluc3RhbGwpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogJG1vZGUiCisgICAgcm09IiRub25vcHQiCisgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZikgcm09IiRybSAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKKyAgICAgIC0qKSBybT0iJHJtICRhcmciIDs7CisgICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJHJtIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICBybWRpcnM9CisKKyAgICBvcmlnb2JqZGlyPSIkb2JqZGlyIgorICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSI7IHRoZW4KKwlkaXI9LgorCW9iamRpcj0iJG9yaWdvYmpkaXIiCisgICAgICBlbHNlCisJb2JqZGlyPSIkZGlyLyRvcmlnb2JqZGlyIgorICAgICAgZmkKKyAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgIHRlc3QgIiRtb2RlIiA9IHVuaW5zdGFsbCAmJiBvYmpkaXI9IiRkaXIiCisKKyAgICAgICMgUmVtZW1iZXIgb2JqZGlyIGZvciByZW1vdmFsIGxhdGVyLCBiZWluZyBjYXJlZnVsIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuOyB0aGVuCisJY2FzZSAiICRybWRpcnMgIiBpbgorCSAgKiIgJG9iamRpciAiKikgOzsKKwkgICopIHJtZGlycz0iJHJtZGlycyAkb2JqZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiAodGVzdCAtTCAiJGZpbGUiKSA+L2Rldi9udWxsIDI+JjEgXAorCXx8ICh0ZXN0IC1oICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCisJfHwgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJOgorICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KKwlleGl0X3N0YXR1cz0xCisJY29udGludWUKKyAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIHJtZmlsZXM9IiRmaWxlIgorCisgICAgICBjYXNlICRuYW1lIGluCisgICAgICAqLmxhKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KKwlpZiAoJHtTRUR9IC1lICcycScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgLiAkZGlyLyRuYW1lCisKKwkgICMgRGVsZXRlIHRoZSBsaWJ0b29sIGxpYnJhcmllcyBhbmQgc3ltbGlua3MuCisJICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbiIKKwkgIGRvbmUKKwkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kb2xkX2xpYnJhcnkiCisKKwkgIGNhc2UgIiRtb2RlIiBpbgorCSAgY2xlYW4pCisJICAgIGNhc2UgIiAgJGxpYnJhcnlfbmFtZXMgIiBpbgorCSAgICAjICIgICIgaW4gdGhlIGJlZ2lubmluZyBjYXRjaGVzIGVtcHR5ICRkbG5hbWUKKwkgICAgKiIgJGRsbmFtZSAiKikgOzsKKwkgICAgKikgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kZGxuYW1lIiA7OworCSAgICBlc2FjCisJICAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfWkiCisJICAgIDs7CisJICB1bmluc3RhbGwpCisJICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGNtZHM9JHBvc3R1bmluc3RhbGxfY21kcworCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJCUlGUz0iJHNhdmVfaWZzIgorCQlldmFsIGNtZD1cIiRjbWRcIgorCQkkc2hvdyAiJGNtZCIKKwkJJHJ1biBldmFsICIkY21kIgorCQlpZiB0ZXN0ICIkPyIgLW5lIDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgorCQkgIGV4aXRfc3RhdHVzPTEKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBjbWRzPSRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkJSUZTPSIkc2F2ZV9pZnMiCisJCWV2YWwgY21kPVwiJGNtZFwiCisJCSRzaG93ICIkY21kIgorCQkkcnVuIGV2YWwgIiRjbWQiCisJCWlmIHRlc3QgIiQ/IiAtbmUgMCAmJiB0ZXN0ICIkcm1mb3JjZSIgIT0geWVzOyB0aGVuCisJCSAgZXhpdF9zdGF0dXM9MQorCQlmaQorCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKwkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCisJICAgIDs7CisJICBlc2FjCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgorCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIC4gJGRpci8kbmFtZQorCisJICAjIEFkZCBQSUMgb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZS4KKwkgIGlmIHRlc3QgLW4gIiRwaWNfb2JqZWN0IiBcCisJICAgICAmJiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiBcCisJICAgICAmJiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbm9uX3BpY19vYmplY3QiCisJICBmaQorCWZpCisJOzsKKworICAgICAgKikKKwlpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbiA7IHRoZW4KKwkgIG5vZXhlbmFtZT0kbmFtZQorCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGZpbGU9YCRlY2hvICRmaWxlfCR7U0VEfSAncywuZXhlJCwsJ2AKKwkgICAgbm9leGVuYW1lPWAkZWNobyAkbmFtZXwke1NFRH0gJ3MsLmV4ZSQsLCdgCisJICAgICMgJGZpbGUgd2l0aCAuZXhlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gcm1maWxlcywKKwkgICAgIyBhZGQgJGZpbGUgd2l0aG91dCAuZXhlCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRmaWxlIgorCSAgICA7OworCSAgZXNhYworCSAgIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgYSBsaWJ0b29sIHByb2dyYW0uCisJICBpZiAoJHtTRUR9IC1lICc0cScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0KKwkgICAgLiAkZGlyLyRub2V4ZW5hbWUKKworCSAgICAjIG5vdGUgJG5hbWUgc3RpbGwgY29udGFpbnMgLmV4ZSBpZiBpdCB3YXMgaW4gJGZpbGUgb3JpZ2luYWxseQorCSAgICAjIGFzIGRvZXMgdGhlIHZlcnNpb24gb2YgJGZpbGUgdGhhdCB3YXMgYWRkZWQgaW50byAkcm1maWxlcworCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfVMuJHtvYmpleHR9IgorCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllcyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0kbmFtZSIKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiWCRub2V4ZW5hbWUiICE9ICJYJG5hbWUiIDsgdGhlbgorCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJHtub2V4ZW5hbWV9LmMiCisJICAgIGZpCisJICBmaQorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICRzaG93ICIkcm0gJHJtZmlsZXMiCisgICAgICAkcnVuICRybSAkcm1maWxlcyB8fCBleGl0X3N0YXR1cz0xCisgICAgZG9uZQorICAgIG9iamRpcj0iJG9yaWdvYmpkaXIiCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCSRzaG93ICJybWRpciAkZGlyIgorCSRydW4gcm1kaXIgJGRpciA+L2Rldi9udWxsIDI+JjEKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKKyAgICA7OworCisgICIiKQorICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCisgICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAteiAiJGV4ZWNfY21kIjsgdGhlbgorICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKKyAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICBmaQorZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgorCitpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCisgIGV2YWwgZXhlYyAkZXhlY19jbWQKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCisjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KK2Nhc2UgJG1vZGUgaW4KKyIiKSAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCisKK1Byb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorCisgICAgLS1jb25maWcgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKyAgICAtLWRlYnVnICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCistbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKKyAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCisgICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JworICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyAgICAtLXRhZz1UQUcgICAgICAgICB1c2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZnJvbSB0YWcgVEFHCisgICAgLS12ZXJzaW9uICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgorCitNT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgIGNsZWFuICAgICAgICAgICByZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5CisgICAgICBjb21waWxlICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAorICAgICAgZXhlY3V0ZSAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCisgICAgICBmaW5pc2ggICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcworICAgICAgaW5zdGFsbCAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCisgICAgICBsaW5rICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCisgICAgICB1bmluc3RhbGwgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKKworTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yCithIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKKyAgZXhpdCAkRVhJVF9TVUNDRVNTCisgIDs7CisKK2NsZWFuKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCit3aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgIDs7CisKK2NvbXBpbGUpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCisKK0NvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCisgIC1wcmVmZXItcGljICAgICAgIHRyeSB0byBidWlsZGluZyBQSUMgb2JqZWN0cyBvbmx5CisgIC1wcmVmZXItbm9uLXBpYyAgIHRyeSB0byBidWlsZGluZyBub24tUElDIG9iamVjdHMgb25seQorICAtc3RhdGljICAgICAgICAgICBhbHdheXMgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZworCitDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQorZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KKworVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCitTT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKK2xpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKKyAgOzsKKworZXhlY3V0ZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KKworQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCisKK1RoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKK2ZsYWdzLgorCitJZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCitpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKK2RpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgorCitUaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKKyAgOzsKKworZmluaXNoKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCisKK0NvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCisKK0VhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCisKK1RoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQordGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCisgIDs7CisKK2luc3RhbGwpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgorCitJbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KKworSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCitlaXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KKworVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKK0JTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgorICA7OworCitsaW5rKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KKworTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bworY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCithIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCisgIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQorICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKKyAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKKyAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKKyAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCisgIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbWF0Y2hpbmcgUkVHRVgKKyAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcworICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQorICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKKyAgLW5vLWZhc3QtaW5zdGFsbCAgZGlzYWJsZSB0aGUgZmFzdC1pbnN0YWxsIG1vZGUKKyAgLW5vLWluc3RhbGwgICAgICAgbGluayBhIG5vdC1pbnN0YWxsYWJsZSBleGVjdXRhYmxlCisgIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scworICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKKyAgLW9iamVjdGxpc3QgRklMRSAgVXNlIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm91bmQgaW4gRklMRSB0byBzcGVjaWZ5IG9iamVjdHMKKyAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4IFJFR0VYCisgICAgICAgICAgICAgICAgICAgIGRvbid0IHJlbW92ZSBvdXRwdXQgZmlsZXMgbWF0Y2hpbmcgUkVHRVgKKyAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KKyAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgorICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcworICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAtc3RhdGljLWxpYnRvb2wtbGlicworICAgICAgICAgICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcworICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCisKK0FsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCisKK0V2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCit0cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQorb2JqZWN0IGZpbGVzLgorCitJZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKK29ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKK3JlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAordXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCitpcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgorICA7OworCit1bmluc3RhbGwpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCitPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgIDs7CisKKyopCisgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKKyAgJGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgJEVYSVRfRkFJTFVSRQorICA7OworZXNhYworCiskZWNobworJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKKworZXhpdCAkPworCisjIFRoZSBUQUdzIGJlbG93IGFyZSBkZWZpbmVkIHN1Y2ggdGhhdCB3ZSBuZXZlciBnZXQgaW50byBhIHNpdHVhdGlvbgorIyBpbiB3aGljaCB3ZSBkaXNhYmxlIGJvdGgga2luZHMgb2YgbGlicmFyaWVzLiAgR2l2ZW4gY29uZmxpY3RpbmcKKyMgY2hvaWNlcywgd2UgZ28gZm9yIGEgc3RhdGljIGxpYnJhcnksIHRoYXQgaXMgdGhlIG1vc3QgcG9ydGFibGUsCisjIHNpbmNlIHdlIGNhbid0IHRlbGwgd2hldGhlciBzaGFyZWQgbGlicmFyaWVzIHdlcmUgZGlzYWJsZWQgYmVjYXVzZQorIyB0aGUgdXNlciBhc2tlZCBmb3IgdGhhdCBvciBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQKKyMgdGhlbS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBvbiBBSVgsIGJlY2F1c2Ugd2UgZG9uJ3QKKyMgc3VwcG9ydCBoYXZpbmcgYm90aCBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZW5hYmxlZCBhdCB0aGUgc2FtZQorIyB0aW1lIG9uIHRoYXQgcGxhdGZvcm0sIHNvIHdlIGRlZmF1bHQgdG8gYSBzaGFyZWQtb25seSBjb25maWd1cmF0aW9uLgorIyBJZiBhIGRpc2FibGUtc2hhcmVkIHRhZyBpcyBnaXZlbiwgd2UnbGwgZmFsbGJhY2sgdG8gYSBzdGF0aWMtb25seQorIyBjb25maWd1cmF0aW9uLiAgQnV0IHdlJ2xsIG5ldmVyIGdvIGZyb20gc3RhdGljLW9ubHkgdG8gc2hhcmVkLW9ubHkuCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKK2Rpc2FibGVfbGlicz1zaGFyZWQKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKK2Rpc2FibGVfbGlicz1zdGF0aWMKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOnNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjoyCisjIEVuZDoKZGlmZiAtLWdpdCBhL21hYy9MQU1FLm1jcCBiL21hYy9MQU1FLm1jcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZmUxYzJjCi0tLSAvZGV2L251bGwKKysrIGIvbWFjL0xBTUUubWNwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hYy9MQU1FX0NhcmJvbl9EZWJ1Zy5wY2ggYi9tYWMvTEFNRV9DYXJib25fRGVidWcucGNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlOWRjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tYWMvTEFNRV9DYXJib25fRGVidWcucGNoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hYy9MQU1FX0NhcmJvbl9GaW5hbC5wY2ggYi9tYWMvTEFNRV9DYXJib25fRmluYWwucGNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4NjUwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tYWMvTEFNRV9DYXJib25fRmluYWwucGNoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hYy9MQU1FX0NsYXNzaWNfRGVidWcucGNoIGIvbWFjL0xBTUVfQ2xhc3NpY19EZWJ1Zy5wY2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzQwMGQzZgotLS0gL2Rldi9udWxsCisrKyBiL21hYy9MQU1FX0NsYXNzaWNfRGVidWcucGNoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hYy9MQU1FX0NsYXNzaWNfRmluYWwucGNoIGIvbWFjL0xBTUVfQ2xhc3NpY19GaW5hbC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzI2Mjg1ZQotLS0gL2Rldi9udWxsCisrKyBiL21hYy9MQU1FX0NsYXNzaWNfRmluYWwucGNoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hYy9NYWNETExNYWluLmMgYi9tYWMvTWFjRExMTWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2NTQyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWMvTWFjRExMTWFpbi5jCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hYy9NYWtlZmlsZS5hbSBiL21hYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM4MmNkCi0tLSAvZGV2L251bGwKKysrIGIvbWFjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTMgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjEgMjAwMi8wNS8yOCAwNzo1MjoxMCBhbGVpZGluZ2VyIEV4cCAkCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKKworRVhUUkFfRElTVCA9IFwKKwkuRFNfU3RvcmUgXAorCUxBTUUubWNwIFwKKwlMQU1FX0NhcmJvbl9EZWJ1Zy5wY2ggXAorCUxBTUVfQ2FyYm9uX0ZpbmFsLnBjaCBcCisJTEFNRV9DbGFzc2ljX0RlYnVnLnBjaCBcCisJTEFNRV9DbGFzc2ljX0ZpbmFsLnBjaCBcCisJTWFjRExMTWFpbi5jIFwKKwlQcmVjb21waWxlX0NvbW1vbi5oCmRpZmYgLS1naXQgYS9tYWMvTWFrZWZpbGUuaW4gYi9tYWMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzMzU3OAotLS0gL2Rldi9udWxsCisrKyBiL21hYy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDM2NSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKyMgZ2xvYmFsIHNlY3Rpb24gZm9yIGV2ZXJ5IE1ha2VmaWxlLmFtCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIFwKKwkkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorc3ViZGlyID0gbWFjCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkZMQUdTID0gQEZGTEFHU0AKK0ZST05URU5EX0NGTEFHUyA9IEBGUk9OVEVORF9DRkxBR1NACitGUk9OVEVORF9MREFERCA9IEBGUk9OVEVORF9MREFEREAKK0ZST05URU5EX0xERkxBR1MgPSBARlJPTlRFTkRfTERGTEFHU0AKK0dSRVAgPSBAR1JFUEAKK0dUS19DRkxBR1MgPSBAR1RLX0NGTEFHU0AKK0dUS19DT05GSUcgPSBAR1RLX0NPTkZJR0AKK0dUS19MSUJTID0gQEdUS19MSUJTQAorSU5DTFVERVMgPSBASU5DTFVERVNACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IDEuOSBmb3JlaWduICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK0VYVFJBX0RJU1QgPSBcCisJLkRTX1N0b3JlIFwKKwlMQU1FLm1jcCBcCisJTEFNRV9DYXJib25fRGVidWcucGNoIFwKKwlMQU1FX0NhcmJvbl9GaW5hbC5wY2ggXAorCUxBTUVfQ2xhc3NpY19EZWJ1Zy5wY2ggXAorCUxBTUVfQ2xhc3NpY19GaW5hbC5wY2ggXAorCU1hY0RMTE1haW4uYyBcCisJUHJlY29tcGlsZV9Db21tb24uaAorCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBtYWMvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIG1hYy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicwordGFnczogVEFHUworVEFHUzoKKworY3RhZ3M6IENUQUdTCitDVEFHUzoKKworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAorCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCisJaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCisJaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKKwlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKKwlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIGVuZCBnbG9iYWwgc2VjdGlvbgorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbWFjL1ByZWNvbXBpbGVfQ29tbW9uLmggYi9tYWMvUHJlY29tcGlsZV9Db21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDViZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbWFjL1ByZWNvbXBpbGVfQ29tbW9uLmgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWFjb3N4L0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MgYi9tYWNvc3gvRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGVkNzdhCi0tLSAvZGV2L251bGwKKysrIGIvbWFjb3N4L0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUuYW0gYi9tYWNvc3gvRW5nbGlzaC5scHJvai9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDgxNTJlCi0tLSAvZGV2L251bGwKKysrIGIvbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS4xIDIwMDgvMDUvMjQgMDg6Mjg6NTggYWxlaWRpbmdlciBFeHAgJAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCisKK0VYVFJBX0RJU1QgPSBcCisJSW5mb1BsaXN0LnN0cmluZ3MKKwpkaWZmIC0tZ2l0IGEvbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUuaW4gYi9tYWNvc3gvRW5nbGlzaC5scHJvai9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzEyZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNTggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKK3N1YmRpciA9IG1hY29zeC9FbmdsaXNoLmxwcm9qCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkZMQUdTID0gQEZGTEFHU0AKK0ZST05URU5EX0NGTEFHUyA9IEBGUk9OVEVORF9DRkxBR1NACitGUk9OVEVORF9MREFERCA9IEBGUk9OVEVORF9MREFEREAKK0ZST05URU5EX0xERkxBR1MgPSBARlJPTlRFTkRfTERGTEFHU0AKK0dSRVAgPSBAR1JFUEAKK0dUS19DRkxBR1MgPSBAR1RLX0NGTEFHU0AKK0dUS19DT05GSUcgPSBAR1RLX0NPTkZJR0AKK0dUS19MSUJTID0gQEdUS19MSUJTQAorSU5DTFVERVMgPSBASU5DTFVERVNACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IDEuOSBmb3JlaWduICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK0VYVFJBX0RJU1QgPSBcCisJSW5mb1BsaXN0LnN0cmluZ3MKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbWFjb3N4L0VuZ2xpc2gubHByb2ovTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIG1hY29zeC9FbmdsaXNoLmxwcm9qL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9tYWNvc3gvSW5mby5wbGlzdCBiL21hY29zeC9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMThhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNvc3gvSW5mby5wbGlzdApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz5MQU1FPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPm5ldC5zb3VyY2Vmb3JnZS5MQU1FZnJhbWV3b3JrPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5GTVdLPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+TEFNaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9tYWNvc3gvTEFNRS54Y29kZXByb2ovTWFrZWZpbGUuYW0gYi9tYWNvc3gvTEFNRS54Y29kZXByb2ovTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5NTI5YwotLS0gL2Rldi9udWxsCisrKyBiL21hY29zeC9MQU1FLnhjb2RlcHJvai9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDcgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjEgMjAwOC8wNS8yNCAwODoyODo1OCBhbGVpZGluZ2VyIEV4cCAkCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKKworRVhUUkFfRElTVCA9IFwKKwlwcm9qZWN0LnBieHByb2oKKwpkaWZmIC0tZ2l0IGEvbWFjb3N4L0xBTUUueGNvZGVwcm9qL01ha2VmaWxlLmluIGIvbWFjb3N4L0xBTUUueGNvZGVwcm9qL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTg5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNvc3gvTEFNRS54Y29kZXByb2ovTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNTggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKK3N1YmRpciA9IG1hY29zeC9MQU1FLnhjb2RlcHJvagorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NPTkZJR19ERUZTID0gQENPTkZJR19ERUZTQAorQ09ORklHX01BVEhfTElCID0gQENPTkZJR19NQVRIX0xJQkAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQVUNDT0RFID0gQENQVUNDT0RFQAorQ1BVVFlQRSA9IEBDUFVUWVBFQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRUNITyA9IEBFQ0hPQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRjc3ID0gQEY3N0AKK0ZGTEFHUyA9IEBGRkxBR1NACitGUk9OVEVORF9DRkxBR1MgPSBARlJPTlRFTkRfQ0ZMQUdTQAorRlJPTlRFTkRfTERBREQgPSBARlJPTlRFTkRfTERBRERACitGUk9OVEVORF9MREZMQUdTID0gQEZST05URU5EX0xERkxBR1NACitHUkVQID0gQEdSRVBACitHVEtfQ0ZMQUdTID0gQEdUS19DRkxBR1NACitHVEtfQ09ORklHID0gQEdUS19DT05GSUdACitHVEtfTElCUyA9IEBHVEtfTElCU0AKK0lOQ0xVREVTID0gQElOQ0xVREVTQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREFERCA9IEBMREFEREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMSUJfTUFKT1JfVkVSU0lPTiA9IEBMSUJfTUFKT1JfVkVSU0lPTkAKK0xJQl9NSU5PUl9WRVJTSU9OID0gQExJQl9NSU5PUl9WRVJTSU9OQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRURFUCA9IEBNQUtFREVQQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOQVNNID0gQE5BU01ACitOQVNNX0ZPUk1BVCA9IEBOQVNNX0ZPUk1BVEAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUk1fRiA9IEBSTV9GQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTTkRGSUxFX0NGTEFHUyA9IEBTTkRGSUxFX0NGTEFHU0AKK1NOREZJTEVfTElCUyA9IEBTTkRGSUxFX0xJQlNACitTVFJJUCA9IEBTVFJJUEAKK1UgPSBAVUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJVEhfRlJPTlRFTkQgPSBAV0lUSF9GUk9OVEVOREAKK1dJVEhfTVAzUlRQID0gQFdJVEhfTVAzUlRQQAorV0lUSF9NUDNYID0gQFdJVEhfTVAzWEAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0Y3NyA9IEBhY19jdF9GNzdACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0FVVE9NQUtFX09QVElPTlMgPSAxLjkgZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCitFWFRSQV9ESVNUID0gXAorCXByb2plY3QucGJ4cHJvagorCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBtYWNvc3gvTEFNRS54Y29kZXByb2ovTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIG1hY29zeC9MQU1FLnhjb2RlcHJvai9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicwordGFnczogVEFHUworVEFHUzoKKworY3RhZ3M6IENUQUdTCitDVEFHUzoKKworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAorCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCisJaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCisJaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKKwlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKKwlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIGVuZCBnbG9iYWwgc2VjdGlvbgorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbWFjb3N4L0xBTUUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL21hY29zeC9MQU1FLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzNGQxOQotLS0gL2Rldi9udWxsCisrKyBiL21hY29zeC9MQU1FLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTAsMCArMSw1MjAgQEAKKy8vICEkKlVURjgqJCEKK3sKKwlhcmNoaXZlVmVyc2lvbiA9IDE7CisJY2xhc3NlcyA9IHsKKwl9OworCW9iamVjdFZlcnNpb24gPSA0MjsKKwlvYmplY3RzID0geworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQk4RDA3RjJCRTA0ODZDQzdBMDA3Q0QxRDAgLyogTEFNRV9QcmVmaXgucGNoIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMzJCQUUwQjcwMzcxQTc0QjAwQzkxNzgzIC8qIExBTUVfUHJlZml4LnBjaCAqLzsgfTsKKwkJOEQwN0YyQzAwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODlDMTY2NkZFODQxMTU4QzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCUVBMEE2QUQ0MEJCODRFMzgwMDNDODdCMSAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQTBBNkFDMjBCQjg0RDkzMDAzQzg3QjEgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQlFQTQ5OEM4RDBERTVFMzdCMDAyNTBGMEUgLyogY29uZmlnLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQTQ5OEM4QzBERTVFMzdCMDAyNTBGMEUgLyogY29uZmlnLmggKi87IH07CisJCUVBOENDMDg4MDlBMzlBNDkwMDEzNzlCOCAvKiBsYW1lLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA4NzA5QTM5QTQ5MDAxMzc5QjggLyogbGFtZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRUE4Q0MwQTUwOUEzOUE1NTAwMTM3OUI4IC8qIGNvbW1vbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwOEEwOUEzOUE1NTAwMTM3OUI4IC8qIGNvbW1vbi5jICovOyB9OworCQlFQThDQzBBNjA5QTM5QTU1MDAxMzc5QjggLyogY29tbW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA4QjA5QTM5QTU1MDAxMzc5QjggLyogY29tbW9uLmggKi87IH07CisJCUVBOENDMEE3MDlBMzlBNTUwMDEzNzlCOCAvKiBkY3Q2NF9pMzg2LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA4QzA5QTM5QTU1MDAxMzc5QjggLyogZGN0NjRfaTM4Ni5jICovOyB9OworCQlFQThDQzBBODA5QTM5QTU1MDAxMzc5QjggLyogZGN0NjRfaTM4Ni5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwOEQwOUEzOUE1NTAwMTM3OUI4IC8qIGRjdDY0X2kzODYuaCAqLzsgfTsKKwkJRUE4Q0MwQTkwOUEzOUE1NTAwMTM3OUI4IC8qIGRlY29kZV9pMzg2LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA4RTA5QTM5QTU1MDAxMzc5QjggLyogZGVjb2RlX2kzODYuYyAqLzsgfTsKKwkJRUE4Q0MwQUEwOUEzOUE1NTAwMTM3OUI4IC8qIGRlY29kZV9pMzg2LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA4RjA5QTM5QTU1MDAxMzc5QjggLyogZGVjb2RlX2kzODYuaCAqLzsgfTsKKwkJRUE4Q0MwQUMwOUEzOUE1NTAwMTM3OUI4IC8qIGh1ZmZtYW4uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMDkxMDlBMzlBNTUwMDEzNzlCOCAvKiBodWZmbWFuLmggKi87IH07CisJCUVBOENDMEFEMDlBMzlBNTUwMDEzNzlCOCAvKiBpbnRlcmZhY2UuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMDkyMDlBMzlBNTUwMDEzNzlCOCAvKiBpbnRlcmZhY2UuYyAqLzsgfTsKKwkJRUE4Q0MwQUUwOUEzOUE1NTAwMTM3OUI4IC8qIGludGVyZmFjZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwOTMwOUEzOUE1NTAwMTM3OUI4IC8qIGludGVyZmFjZS5oICovOyB9OworCQlFQThDQzBBRjA5QTM5QTU1MDAxMzc5QjggLyogbDJ0YWJsZXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMDk0MDlBMzlBNTUwMDEzNzlCOCAvKiBsMnRhYmxlcy5oICovOyB9OworCQlFQThDQzBCMDA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIxLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA5NTA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIxLmMgKi87IH07CisJCUVBOENDMEIxMDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjEuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMDk2MDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjEuaCAqLzsgfTsKKwkJRUE4Q0MwQjIwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwOTcwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMi5jICovOyB9OworCQlFQThDQzBCMzA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA5ODA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIyLmggKi87IH07CisJCUVBOENDMEI0MDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMDk5MDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjMuYyAqLzsgfTsKKwkJRUE4Q0MwQjUwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwOUEwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMy5oICovOyB9OworCQlFQThDQzBCODA5QTM5QTU1MDAxMzc5QjggLyogbXBnMTIzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzA5RDA5QTM5QTU1MDAxMzc5QjggLyogbXBnMTIzLmggKi87IH07CisJCUVBOENDMEI5MDlBMzlBNTUwMDEzNzlCOCAvKiBtcGdsaWIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMDlFMDlBMzlBNTUwMDEzNzlCOCAvKiBtcGdsaWIuaCAqLzsgfTsKKwkJRUE4Q0MwQkQwOUEzOUE1NTAwMTM3OUI4IC8qIHRhYmluaXQuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEEyMDlBMzlBNTUwMDEzNzlCOCAvKiB0YWJpbml0LmMgKi87IH07CisJCUVBOENDMEJFMDlBMzlBNTUwMDEzNzlCOCAvKiB0YWJpbml0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBBMzA5QTM5QTU1MDAxMzc5QjggLyogdGFiaW5pdC5oICovOyB9OworCQlFQThDQzBGOTA5QTM5QTVFMDAxMzc5QjggLyogYml0c3RyZWFtLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBDMTA5QTM5QTVFMDAxMzc5QjggLyogYml0c3RyZWFtLmMgKi87IH07CisJCUVBOENDMEZBMDlBMzlBNUUwMDEzNzlCOCAvKiBiaXRzdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEMyMDlBMzlBNUUwMDEzNzlCOCAvKiBiaXRzdHJlYW0uaCAqLzsgfTsKKwkJRUE4Q0MwRkMwOUEzOUE1RTAwMTM3OUI4IC8qIGVuY29kZXIuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEM0MDlBMzlBNUUwMDEzNzlCOCAvKiBlbmNvZGVyLmMgKi87IH07CisJCUVBOENDMEZEMDlBMzlBNUUwMDEzNzlCOCAvKiBlbmNvZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBDNTA5QTM5QTVFMDAxMzc5QjggLyogZW5jb2Rlci5oICovOyB9OworCQlFQThDQzBGRTA5QTM5QTVFMDAxMzc5QjggLyogZmZ0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBDNjA5QTM5QTVFMDAxMzc5QjggLyogZmZ0LmMgKi87IH07CisJCUVBOENDMEZGMDlBMzlBNUUwMDEzNzlCOCAvKiBmZnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEM3MDlBMzlBNUUwMDEzNzlCOCAvKiBmZnQuaCAqLzsgfTsKKwkJRUE4Q0MxMDAwOUEzOUE1RTAwMTM3OUI4IC8qIGdhaW5fYW5hbHlzaXMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEM4MDlBMzlBNUUwMDEzNzlCOCAvKiBnYWluX2FuYWx5c2lzLmMgKi87IH07CisJCUVBOENDMTAxMDlBMzlBNUUwMDEzNzlCOCAvKiBnYWluX2FuYWx5c2lzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBDOTA5QTM5QTVFMDAxMzc5QjggLyogZ2Fpbl9hbmFseXNpcy5oICovOyB9OworCQlFQThDQzEwQzA5QTM5QTVFMDAxMzc5QjggLyogaWQzdGFnLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBENTA5QTM5QTVFMDAxMzc5QjggLyogaWQzdGFnLmMgKi87IH07CisJCUVBOENDMTBEMDlBMzlBNUUwMDEzNzlCOCAvKiBpZDN0YWcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEQ2MDlBMzlBNUUwMDEzNzlCOCAvKiBpZDN0YWcuaCAqLzsgfTsKKwkJRUE4Q0MxMEUwOUEzOUE1RTAwMTM3OUI4IC8qIGwzc2lkZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRDcwOUEzOUE1RTAwMTM3OUI4IC8qIGwzc2lkZS5oICovOyB9OworCQlFQThDQzEwRjA5QTM5QTVFMDAxMzc5QjggLyogbGFtZS1hbmFseXNpcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRDgwOUEzOUE1RTAwMTM3OUI4IC8qIGxhbWUtYW5hbHlzaXMuaCAqLzsgfTsKKwkJRUE4Q0MxMTAwOUEzOUE1RTAwMTM3OUI4IC8qIGxhbWUuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEQ5MDlBMzlBNUUwMDEzNzlCOCAvKiBsYW1lLmMgKi87IH07CisJCUVBOENDMTExMDlBMzlBNUUwMDEzNzlCOCAvKiBsYW1lX2dsb2JhbF9mbGFncy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwREEwOUEzOUE1RTAwMTM3OUI4IC8qIGxhbWVfZ2xvYmFsX2ZsYWdzLmggKi87IH07CisJCUVBOENDMTE0MDlBMzlBNUUwMDEzNzlCOCAvKiBtYWNoaW5lLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBERDA5QTM5QTVFMDAxMzc5QjggLyogbWFjaGluZS5oICovOyB9OworCQlFQThDQzExNzA5QTM5QTVFMDAxMzc5QjggLyogbXBnbGliX2ludGVyZmFjZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRTAwOUEzOUE1RTAwMTM3OUI4IC8qIG1wZ2xpYl9pbnRlcmZhY2UuYyAqLzsgfTsKKwkJRUE4Q0MxMTgwOUEzOUE1RTAwMTM3OUI4IC8qIG5ld21kY3QuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEUxMDlBMzlBNUUwMDEzNzlCOCAvKiBuZXdtZGN0LmMgKi87IH07CisJCUVBOENDMTE5MDlBMzlBNUUwMDEzNzlCOCAvKiBuZXdtZGN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBFMjA5QTM5QTVFMDAxMzc5QjggLyogbmV3bWRjdC5oICovOyB9OworCQlFQThDQzExQTA5QTM5QTVFMDAxMzc5QjggLyogcHJlc2V0cy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRTMwOUEzOUE1RTAwMTM3OUI4IC8qIHByZXNldHMuYyAqLzsgfTsKKwkJRUE4Q0MxMUIwOUEzOUE1RTAwMTM3OUI4IC8qIHBzeW1vZGVsLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBFNDA5QTM5QTVFMDAxMzc5QjggLyogcHN5bW9kZWwuYyAqLzsgfTsKKwkJRUE4Q0MxMUMwOUEzOUE1RTAwMTM3OUI4IC8qIHBzeW1vZGVsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBFNTA5QTM5QTVFMDAxMzc5QjggLyogcHN5bW9kZWwuaCAqLzsgfTsKKwkJRUE4Q0MxMUQwOUEzOUE1RTAwMTM3OUI4IC8qIHF1YW50aXplLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBFNjA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemUuYyAqLzsgfTsKKwkJRUE4Q0MxMUUwOUEzOUE1RTAwMTM3OUI4IC8qIHF1YW50aXplLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBFNzA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemUuaCAqLzsgfTsKKwkJRUE4Q0MxMUYwOUEzOUE1RTAwMTM3OUI4IC8qIHF1YW50aXplX3B2dC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRTgwOUEzOUE1RTAwMTM3OUI4IC8qIHF1YW50aXplX3B2dC5jICovOyB9OworCQlFQThDQzEyMDA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemVfcHZ0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFQThDQzBFOTA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemVfcHZ0LmggKi87IH07CisJCUVBOENDMTIxMDlBMzlBNUUwMDEzNzlCOCAvKiByZXNlcnZvaXIuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEVBMDlBMzlBNUUwMDEzNzlCOCAvKiByZXNlcnZvaXIuYyAqLzsgfTsKKwkJRUE4Q0MxMjIwOUEzOUE1RTAwMTM3OUI4IC8qIHJlc2Vydm9pci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRUIwOUEzOUE1RTAwMTM3OUI4IC8qIHJlc2Vydm9pci5oICovOyB9OworCQlFQThDQzEyMzA5QTM5QTVFMDAxMzc5QjggLyogc2V0X2dldC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRUMwOUEzOUE1RTAwMTM3OUI4IC8qIHNldF9nZXQuYyAqLzsgfTsKKwkJRUE4Q0MxMjQwOUEzOUE1RTAwMTM3OUI4IC8qIHNldF9nZXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEVEMDlBMzlBNUUwMDEzNzlCOCAvKiBzZXRfZ2V0LmggKi87IH07CisJCUVBOENDMTI1MDlBMzlBNUUwMDEzNzlCOCAvKiB0YWJsZXMuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEVFMDlBMzlBNUUwMDEzNzlCOCAvKiB0YWJsZXMuYyAqLzsgfTsKKwkJRUE4Q0MxMjYwOUEzOUE1RTAwMTM3OUI4IC8qIHRhYmxlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRUYwOUEzOUE1RTAwMTM3OUI4IC8qIHRhYmxlcy5oICovOyB9OworCQlFQThDQzEyNzA5QTM5QTVFMDAxMzc5QjggLyogdGFrZWhpcm8uYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEYwMDlBMzlBNUUwMDEzNzlCOCAvKiB0YWtlaGlyby5jICovOyB9OworCQlFQThDQzEyODA5QTM5QTVFMDAxMzc5QjggLyogdXRpbC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRjEwOUEzOUE1RTAwMTM3OUI4IC8qIHV0aWwuYyAqLzsgfTsKKwkJRUE4Q0MxMjkwOUEzOUE1RTAwMTM3OUI4IC8qIHV0aWwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEYyMDlBMzlBNUUwMDEzNzlCOCAvKiB1dGlsLmggKi87IH07CisJCUVBOENDMTJBMDlBMzlBNUUwMDEzNzlCOCAvKiB2YnJxdWFudGl6ZS5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRjMwOUEzOUE1RTAwMTM3OUI4IC8qIHZicnF1YW50aXplLmMgKi87IH07CisJCUVBOENDMTJCMDlBMzlBNUUwMDEzNzlCOCAvKiB2YnJxdWFudGl6ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRjQwOUEzOUE1RTAwMTM3OUI4IC8qIHZicnF1YW50aXplLmggKi87IH07CisJCUVBOENDMTJDMDlBMzlBNUUwMDEzNzlCOCAvKiBWYnJUYWcuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEY1MDlBMzlBNUUwMDEzNzlCOCAvKiBWYnJUYWcuYyAqLzsgfTsKKwkJRUE4Q0MxMkQwOUEzOUE1RTAwMTM3OUI4IC8qIFZiclRhZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRjYwOUEzOUE1RTAwMTM3OUI4IC8qIFZiclRhZy5oICovOyB9OworCQlFQThDQzEyRTA5QTM5QTVFMDAxMzc5QjggLyogdmVyc2lvbi5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUE4Q0MwRjcwOUEzOUE1RTAwMTM3OUI4IC8qIHZlcnNpb24uYyAqLzsgfTsKKwkJRUE4Q0MxMkYwOUEzOUE1RTAwMTM3OUI4IC8qIHZlcnNpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVBOENDMEY4MDlBMzlBNUUwMDEzNzlCOCAvKiB2ZXJzaW9uLmggKi87IH07CisvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCTA4OUMxNjY3RkU4NDExNThDMDJBQUMwNyAvKiBFbmdsaXNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDEwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Quc3RyaW5nczsgbmFtZSA9IEVuZ2xpc2g7IHBhdGggPSBFbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzMkJBRTBCNzAzNzFBNzRCMDBDOTE3ODMgLyogTEFNRV9QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMQU1FX1ByZWZpeC5wY2g7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMDdGMkM3MDQ4NkNDN0EwMDdDRDFEMCAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdDsgcGF0aCA9IEluZm8ucGxpc3Q7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCThEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBMQU1FLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IExBTUUuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlFQTBBNkFDMjBCQjg0RDkzMDAzQzg3QjEgLyogQ29jb2EuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb2NvYS5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCUVBNDk4QzhDMERFNUUzN0IwMDI1MEYwRSAvKiBjb25maWcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gY29uZmlnLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMDg3MDlBMzlBNDkwMDEzNzlCOCAvKiBsYW1lLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBsYW1lLmg7IHBhdGggPSAuLi9pbmNsdWRlL2xhbWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwOEEwOUEzOUE1NTAwMTM3OUI4IC8qIGNvbW1vbi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gY29tbW9uLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMDhCMDlBMzlBNTUwMDEzNzlCOCAvKiBjb21tb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGNvbW1vbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzA4QzA5QTM5QTU1MDAxMzc5QjggLyogZGN0NjRfaTM4Ni5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gZGN0NjRfaTM4Ni5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzA4RDA5QTM5QTU1MDAxMzc5QjggLyogZGN0NjRfaTM4Ni5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZGN0NjRfaTM4Ni5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzA4RTA5QTM5QTU1MDAxMzc5QjggLyogZGVjb2RlX2kzODYuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGRlY29kZV9pMzg2LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMDhGMDlBMzlBNTUwMDEzNzlCOCAvKiBkZWNvZGVfaTM4Ni5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZGVjb2RlX2kzODYuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwOTEwOUEzOUE1NTAwMTM3OUI4IC8qIGh1ZmZtYW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGh1ZmZtYW4uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwOTIwOUEzOUE1NTAwMTM3OUI4IC8qIGludGVyZmFjZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gaW50ZXJmYWNlLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMDkzMDlBMzlBNTUwMDEzNzlCOCAvKiBpbnRlcmZhY2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGludGVyZmFjZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzA5NDA5QTM5QTU1MDAxMzc5QjggLyogbDJ0YWJsZXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGwydGFibGVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMDk1MDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjEuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGxheWVyMS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzA5NjA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIxLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBsYXllcjEuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwOTcwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMi5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gbGF5ZXIyLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMDk4MDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGxheWVyMi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzA5OTA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBsYXllcjMuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwOUEwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gbGF5ZXIzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMDlEMDlBMzlBNTUwMDEzNzlCOCAvKiBtcGcxMjMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IG1wZzEyMy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzA5RTA5QTM5QTU1MDAxMzc5QjggLyogbXBnbGliLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBtcGdsaWIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwQTIwOUEzOUE1NTAwMTM3OUI4IC8qIHRhYmluaXQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IHRhYmluaXQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwQTMwOUEzOUE1NTAwMTM3OUI4IC8qIHRhYmluaXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHRhYmluaXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwQzEwOUEzOUE1RTAwMTM3OUI4IC8qIGJpdHN0cmVhbS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gYml0c3RyZWFtLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEMyMDlBMzlBNUUwMDEzNzlCOCAvKiBiaXRzdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGJpdHN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBDNDA5QTM5QTVFMDAxMzc5QjggLyogZW5jb2Rlci5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gZW5jb2Rlci5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBDNTA5QTM5QTVFMDAxMzc5QjggLyogZW5jb2Rlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZW5jb2Rlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBDNjA5QTM5QTVFMDAxMzc5QjggLyogZmZ0LmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBmZnQuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwQzcwOUEzOUE1RTAwMTM3OUI4IC8qIGZmdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gZmZ0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEM4MDlBMzlBNUUwMDEzNzlCOCAvKiBnYWluX2FuYWx5c2lzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBnYWluX2FuYWx5c2lzLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEM5MDlBMzlBNUUwMDEzNzlCOCAvKiBnYWluX2FuYWx5c2lzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBnYWluX2FuYWx5c2lzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEQ1MDlBMzlBNUUwMDEzNzlCOCAvKiBpZDN0YWcuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGlkM3RhZy5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBENjA5QTM5QTVFMDAxMzc5QjggLyogaWQzdGFnLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBpZDN0YWcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRDcwOUEzOUE1RTAwMTM3OUI4IC8qIGwzc2lkZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gbDNzaWRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEQ4MDlBMzlBNUUwMDEzNzlCOCAvKiBsYW1lLWFuYWx5c2lzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAibGFtZS1hbmFseXNpcy5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRDkwOUEzOUE1RTAwMTM3OUI4IC8qIGxhbWUuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IGxhbWUuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwREEwOUEzOUE1RTAwMTM3OUI4IC8qIGxhbWVfZ2xvYmFsX2ZsYWdzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBsYW1lX2dsb2JhbF9mbGFncy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBERDA5QTM5QTVFMDAxMzc5QjggLyogbWFjaGluZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gbWFjaGluZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFMDA5QTM5QTVFMDAxMzc5QjggLyogbXBnbGliX2ludGVyZmFjZS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gbXBnbGliX2ludGVyZmFjZS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFMTA5QTM5QTVFMDAxMzc5QjggLyogbmV3bWRjdC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gbmV3bWRjdC5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFMjA5QTM5QTVFMDAxMzc5QjggLyogbmV3bWRjdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gbmV3bWRjdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFMzA5QTM5QTVFMDAxMzc5QjggLyogcHJlc2V0cy5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gcHJlc2V0cy5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFNDA5QTM5QTVFMDAxMzc5QjggLyogcHN5bW9kZWwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IHBzeW1vZGVsLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEU1MDlBMzlBNUUwMDEzNzlCOCAvKiBwc3ltb2RlbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gcHN5bW9kZWwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRTYwOUEzOUE1RTAwMTM3OUI4IC8qIHF1YW50aXplLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSBxdWFudGl6ZS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFNzA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHF1YW50aXplLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEU4MDlBMzlBNUUwMDEzNzlCOCAvKiBxdWFudGl6ZV9wdnQuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IHF1YW50aXplX3B2dC5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFOTA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemVfcHZ0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBxdWFudGl6ZV9wdnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRUEwOUEzOUE1RTAwMTM3OUI4IC8qIHJlc2Vydm9pci5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gcmVzZXJ2b2lyLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEVCMDlBMzlBNUUwMDEzNzlCOCAvKiByZXNlcnZvaXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHJlc2Vydm9pci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFQzA5QTM5QTVFMDAxMzc5QjggLyogc2V0X2dldC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gc2V0X2dldC5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFRDA5QTM5QTVFMDAxMzc5QjggLyogc2V0X2dldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gc2V0X2dldC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBFRTA5QTM5QTVFMDAxMzc5QjggLyogdGFibGVzLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSB0YWJsZXMuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRUYwOUEzOUE1RTAwMTM3OUI4IC8qIHRhYmxlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gdGFibGVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEYwMDlBMzlBNUUwMDEzNzlCOCAvKiB0YWtlaGlyby5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBwYXRoID0gdGFrZWhpcm8uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRjEwOUEzOUE1RTAwMTM3OUI4IC8qIHV0aWwuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IHV0aWwuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRjIwOUEzOUE1RTAwMTM3OUI4IC8qIHV0aWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHV0aWwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRjMwOUEzOUE1RTAwMTM3OUI4IC8qIHZicnF1YW50aXplLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IHBhdGggPSB2YnJxdWFudGl6ZS5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBGNDA5QTM5QTVFMDAxMzc5QjggLyogdmJycXVhbnRpemUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHZicnF1YW50aXplLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUVBOENDMEY1MDlBMzlBNUUwMDEzNzlCOCAvKiBWYnJUYWcuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IFZiclRhZy5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFQThDQzBGNjA5QTM5QTVFMDAxMzc5QjggLyogVmJyVGFnLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBWYnJUYWcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRjcwOUEzOUE1RTAwMTM3OUI4IC8qIHZlcnNpb24uYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgcGF0aCA9IHZlcnNpb24uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRUE4Q0MwRjgwOUEzOUE1RTAwMTM3OUI4IC8qIHZlcnNpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHZlcnNpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKy8qIEVuZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQlFQTBBNkFEMjBCQjg0RTMyMDAzQzg3QjEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUVBMEE2QUQ0MEJCODRFMzgwMDNDODdCMSAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDA3RjJDODA0ODZDQzdBMDA3Q0QxRDAgLyogTEFNRS5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIExBTUUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8sCisJCQkJMDg5QzE2NjVGRTg0MTE1OEMwMkFBQzA3IC8qIFJlc291cmNlcyAqLywKKwkJCQkwODY3RDY5QUZFODQwMjhGQzAyQUFDMDcgLyogRXh0ZXJuYWwgRnJhbWV3b3JrcyBhbmQgTGlicmFyaWVzICovLAorCQkJCTAzNDc2OERERkYzOEE0NUExMURCOUM4QiAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQluYW1lID0gTEFNRTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjlBRkU4NDAyOEZDMDJBQUMwNyAvKiBFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUVBMEE2QUMyMEJCODREOTMwMDNDODdCMSAvKiBDb2NvYS5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg5QzE2NjVGRTg0MTE1OEMwMkFBQzA3IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQwN0YyQzcwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkJMDg5QzE2NjZGRTg0MTE1OEMwMkFBQzA3IC8qIEluZm9QbGlzdC5zdHJpbmdzICovLAorCQkJKTsKKwkJCW5hbWUgPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzMkJBRTBCNzAzNzFBNzRCMDBDOTE3ODMgLyogTEFNRV9QcmVmaXgucGNoICovLAorCQkJCUVBOENDMDg3MDlBMzlBNDkwMDEzNzlCOCAvKiBsYW1lLmggKi8sCisJCQkJRUE0OThDOEMwREU1RTM3QjAwMjUwRjBFIC8qIGNvbmZpZy5oICovLAorCQkJCUVBOENDMEMwMDlBMzlBNUUwMDEzNzlCOCAvKiBsaWJtcDNsYW1lICovLAorCQkJCUVBOENDMDg5MDlBMzlBNTUwMDEzNzlCOCAvKiBtcGdsaWIgKi8sCisJCQkpOworCQkJbmFtZSA9IFNvdXJjZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUVBOENDMDg5MDlBMzlBNTUwMDEzNzlCOCAvKiBtcGdsaWIgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUVBOENDMDhBMDlBMzlBNTUwMDEzNzlCOCAvKiBjb21tb24uYyAqLywKKwkJCQlFQThDQzA4QjA5QTM5QTU1MDAxMzc5QjggLyogY29tbW9uLmggKi8sCisJCQkJRUE4Q0MwOEMwOUEzOUE1NTAwMTM3OUI4IC8qIGRjdDY0X2kzODYuYyAqLywKKwkJCQlFQThDQzA4RDA5QTM5QTU1MDAxMzc5QjggLyogZGN0NjRfaTM4Ni5oICovLAorCQkJCUVBOENDMDhFMDlBMzlBNTUwMDEzNzlCOCAvKiBkZWNvZGVfaTM4Ni5jICovLAorCQkJCUVBOENDMDhGMDlBMzlBNTUwMDEzNzlCOCAvKiBkZWNvZGVfaTM4Ni5oICovLAorCQkJCUVBOENDMDkxMDlBMzlBNTUwMDEzNzlCOCAvKiBodWZmbWFuLmggKi8sCisJCQkJRUE4Q0MwOTIwOUEzOUE1NTAwMTM3OUI4IC8qIGludGVyZmFjZS5jICovLAorCQkJCUVBOENDMDkzMDlBMzlBNTUwMDEzNzlCOCAvKiBpbnRlcmZhY2UuaCAqLywKKwkJCQlFQThDQzA5NDA5QTM5QTU1MDAxMzc5QjggLyogbDJ0YWJsZXMuaCAqLywKKwkJCQlFQThDQzA5NTA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIxLmMgKi8sCisJCQkJRUE4Q0MwOTYwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMS5oICovLAorCQkJCUVBOENDMDk3MDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjIuYyAqLywKKwkJCQlFQThDQzA5ODA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIyLmggKi8sCisJCQkJRUE4Q0MwOTkwOUEzOUE1NTAwMTM3OUI4IC8qIGxheWVyMy5jICovLAorCQkJCUVBOENDMDlBMDlBMzlBNTUwMDEzNzlCOCAvKiBsYXllcjMuaCAqLywKKwkJCQlFQThDQzA5RDA5QTM5QTU1MDAxMzc5QjggLyogbXBnMTIzLmggKi8sCisJCQkJRUE4Q0MwOUUwOUEzOUE1NTAwMTM3OUI4IC8qIG1wZ2xpYi5oICovLAorCQkJCUVBOENDMEEyMDlBMzlBNTUwMDEzNzlCOCAvKiB0YWJpbml0LmMgKi8sCisJCQkJRUE4Q0MwQTMwOUEzOUE1NTAwMTM3OUI4IC8qIHRhYmluaXQuaCAqLywKKwkJCSk7CisJCQluYW1lID0gbXBnbGliOworCQkJcGF0aCA9IC4uL21wZ2xpYjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUVBOENDMEMwMDlBMzlBNUUwMDEzNzlCOCAvKiBsaWJtcDNsYW1lICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlFQThDQzBDMTA5QTM5QTVFMDAxMzc5QjggLyogYml0c3RyZWFtLmMgKi8sCisJCQkJRUE4Q0MwQzIwOUEzOUE1RTAwMTM3OUI4IC8qIGJpdHN0cmVhbS5oICovLAorCQkJCUVBOENDMEM0MDlBMzlBNUUwMDEzNzlCOCAvKiBlbmNvZGVyLmMgKi8sCisJCQkJRUE4Q0MwQzUwOUEzOUE1RTAwMTM3OUI4IC8qIGVuY29kZXIuaCAqLywKKwkJCQlFQThDQzBDNjA5QTM5QTVFMDAxMzc5QjggLyogZmZ0LmMgKi8sCisJCQkJRUE4Q0MwQzcwOUEzOUE1RTAwMTM3OUI4IC8qIGZmdC5oICovLAorCQkJCUVBOENDMEM4MDlBMzlBNUUwMDEzNzlCOCAvKiBnYWluX2FuYWx5c2lzLmMgKi8sCisJCQkJRUE4Q0MwQzkwOUEzOUE1RTAwMTM3OUI4IC8qIGdhaW5fYW5hbHlzaXMuaCAqLywKKwkJCQlFQThDQzBENTA5QTM5QTVFMDAxMzc5QjggLyogaWQzdGFnLmMgKi8sCisJCQkJRUE4Q0MwRDYwOUEzOUE1RTAwMTM3OUI4IC8qIGlkM3RhZy5oICovLAorCQkJCUVBOENDMEQ3MDlBMzlBNUUwMDEzNzlCOCAvKiBsM3NpZGUuaCAqLywKKwkJCQlFQThDQzBEODA5QTM5QTVFMDAxMzc5QjggLyogbGFtZS1hbmFseXNpcy5oICovLAorCQkJCUVBOENDMEQ5MDlBMzlBNUUwMDEzNzlCOCAvKiBsYW1lLmMgKi8sCisJCQkJRUE4Q0MwREEwOUEzOUE1RTAwMTM3OUI4IC8qIGxhbWVfZ2xvYmFsX2ZsYWdzLmggKi8sCisJCQkJRUE4Q0MwREQwOUEzOUE1RTAwMTM3OUI4IC8qIG1hY2hpbmUuaCAqLywKKwkJCQlFQThDQzBFMDA5QTM5QTVFMDAxMzc5QjggLyogbXBnbGliX2ludGVyZmFjZS5jICovLAorCQkJCUVBOENDMEUxMDlBMzlBNUUwMDEzNzlCOCAvKiBuZXdtZGN0LmMgKi8sCisJCQkJRUE4Q0MwRTIwOUEzOUE1RTAwMTM3OUI4IC8qIG5ld21kY3QuaCAqLywKKwkJCQlFQThDQzBFMzA5QTM5QTVFMDAxMzc5QjggLyogcHJlc2V0cy5jICovLAorCQkJCUVBOENDMEU0MDlBMzlBNUUwMDEzNzlCOCAvKiBwc3ltb2RlbC5jICovLAorCQkJCUVBOENDMEU1MDlBMzlBNUUwMDEzNzlCOCAvKiBwc3ltb2RlbC5oICovLAorCQkJCUVBOENDMEU2MDlBMzlBNUUwMDEzNzlCOCAvKiBxdWFudGl6ZS5jICovLAorCQkJCUVBOENDMEU3MDlBMzlBNUUwMDEzNzlCOCAvKiBxdWFudGl6ZS5oICovLAorCQkJCUVBOENDMEU4MDlBMzlBNUUwMDEzNzlCOCAvKiBxdWFudGl6ZV9wdnQuYyAqLywKKwkJCQlFQThDQzBFOTA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemVfcHZ0LmggKi8sCisJCQkJRUE4Q0MwRUEwOUEzOUE1RTAwMTM3OUI4IC8qIHJlc2Vydm9pci5jICovLAorCQkJCUVBOENDMEVCMDlBMzlBNUUwMDEzNzlCOCAvKiByZXNlcnZvaXIuaCAqLywKKwkJCQlFQThDQzBFQzA5QTM5QTVFMDAxMzc5QjggLyogc2V0X2dldC5jICovLAorCQkJCUVBOENDMEVEMDlBMzlBNUUwMDEzNzlCOCAvKiBzZXRfZ2V0LmggKi8sCisJCQkJRUE4Q0MwRUUwOUEzOUE1RTAwMTM3OUI4IC8qIHRhYmxlcy5jICovLAorCQkJCUVBOENDMEVGMDlBMzlBNUUwMDEzNzlCOCAvKiB0YWJsZXMuaCAqLywKKwkJCQlFQThDQzBGMDA5QTM5QTVFMDAxMzc5QjggLyogdGFrZWhpcm8uYyAqLywKKwkJCQlFQThDQzBGMTA5QTM5QTVFMDAxMzc5QjggLyogdXRpbC5jICovLAorCQkJCUVBOENDMEYyMDlBMzlBNUUwMDEzNzlCOCAvKiB1dGlsLmggKi8sCisJCQkJRUE4Q0MwRjMwOUEzOUE1RTAwMTM3OUI4IC8qIHZicnF1YW50aXplLmMgKi8sCisJCQkJRUE4Q0MwRjQwOUEzOUE1RTAwMTM3OUI4IC8qIHZicnF1YW50aXplLmggKi8sCisJCQkJRUE4Q0MwRjUwOUEzOUE1RTAwMTM3OUI4IC8qIFZiclRhZy5jICovLAorCQkJCUVBOENDMEY2MDlBMzlBNUUwMDEzNzlCOCAvKiBWYnJUYWcuaCAqLywKKwkJCQlFQThDQzBGNzA5QTM5QTVFMDAxMzc5QjggLyogdmVyc2lvbi5jICovLAorCQkJCUVBOENDMEY4MDlBMzlBNUUwMDEzNzlCOCAvKiB2ZXJzaW9uLmggKi8sCisJCQkpOworCQkJbmFtZSA9IGxpYm1wM2xhbWU7CisJCQlwYXRoID0gLi4vbGlibXAzbGFtZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovID0geworCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJOEQwN0YyQkUwNDg2Q0M3QTAwN0NEMUQwIC8qIExBTUVfUHJlZml4LnBjaCBpbiBIZWFkZXJzICovLAorCQkJCUVBOENDMDg4MDlBMzlBNDkwMDEzNzlCOCAvKiBsYW1lLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBBNjA5QTM5QTU1MDAxMzc5QjggLyogY29tbW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBBODA5QTM5QTU1MDAxMzc5QjggLyogZGN0NjRfaTM4Ni5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MwQUEwOUEzOUE1NTAwMTM3OUI4IC8qIGRlY29kZV9pMzg2LmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBBQzA5QTM5QTU1MDAxMzc5QjggLyogaHVmZm1hbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MwQUUwOUEzOUE1NTAwMTM3OUI4IC8qIGludGVyZmFjZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MwQUYwOUEzOUE1NTAwMTM3OUI4IC8qIGwydGFibGVzLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBCMTA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIxLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBCMzA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIyLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBCNTA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIzLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBCODA5QTM5QTU1MDAxMzc5QjggLyogbXBnMTIzLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBCOTA5QTM5QTU1MDAxMzc5QjggLyogbXBnbGliLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzBCRTA5QTM5QTU1MDAxMzc5QjggLyogdGFiaW5pdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MwRkEwOUEzOUE1RTAwMTM3OUI4IC8qIGJpdHN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MwRkQwOUEzOUE1RTAwMTM3OUI4IC8qIGVuY29kZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUVBOENDMEZGMDlBMzlBNUUwMDEzNzlCOCAvKiBmZnQuaCBpbiBIZWFkZXJzICovLAorCQkJCUVBOENDMTAxMDlBMzlBNUUwMDEzNzlCOCAvKiBnYWluX2FuYWx5c2lzLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzEwRDA5QTM5QTVFMDAxMzc5QjggLyogaWQzdGFnLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzEwRTA5QTM5QTVFMDAxMzc5QjggLyogbDNzaWRlLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzEwRjA5QTM5QTVFMDAxMzc5QjggLyogbGFtZS1hbmFseXNpcy5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MxMTEwOUEzOUE1RTAwMTM3OUI4IC8qIGxhbWVfZ2xvYmFsX2ZsYWdzLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzExNDA5QTM5QTVFMDAxMzc5QjggLyogbWFjaGluZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MxMTkwOUEzOUE1RTAwMTM3OUI4IC8qIG5ld21kY3QuaCBpbiBIZWFkZXJzICovLAorCQkJCUVBOENDMTFDMDlBMzlBNUUwMDEzNzlCOCAvKiBwc3ltb2RlbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MxMUUwOUEzOUE1RTAwMTM3OUI4IC8qIHF1YW50aXplLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzEyMDA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemVfcHZ0LmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzEyMjA5QTM5QTVFMDAxMzc5QjggLyogcmVzZXJ2b2lyLmggaW4gSGVhZGVycyAqLywKKwkJCQlFQThDQzEyNDA5QTM5QTVFMDAxMzc5QjggLyogc2V0X2dldC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MxMjYwOUEzOUE1RTAwMTM3OUI4IC8qIHRhYmxlcy5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MxMjkwOUEzOUE1RTAwMTM3OUI4IC8qIHV0aWwuaCBpbiBIZWFkZXJzICovLAorCQkJCUVBOENDMTJCMDlBMzlBNUUwMDEzNzlCOCAvKiB2YnJxdWFudGl6ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MxMkQwOUEzOUE1RTAwMTM3OUI4IC8qIFZiclRhZy5oIGluIEhlYWRlcnMgKi8sCisJCQkJRUE4Q0MxMkYwOUEzOUE1RTAwMTM3OUI4IC8qIHZlcnNpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCUVBNDk4QzhEMERFNUUzN0IwMDI1MEYwRSAvKiBjb25maWcuaCBpbiBIZWFkZXJzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIExBTUUgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNEZBREMyNDIwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJMQU1FIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovLAorCQkJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQwN0YyQzEwNDg2Q0M3QTAwN0NEMUQwIC8qIFNvdXJjZXMgKi8sCisJCQkJRUEwQTZBRDIwQkI4NEUzMjAwM0M4N0IxIC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IExBTUU7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiOworCQkJcHJvZHVjdE5hbWUgPSBMQU1FOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDhEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBMQU1FLmZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuZnJhbWV3b3JrIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0RkFEQzI0NjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJMQU1FIiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDIuNCI7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCW1haW5Hcm91cCA9IDA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBMQU1FICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBMQU1FICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCThEMDdGMkMwMDQ4NkNDN0EwMDdDRDFEMCAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQwN0YyQzEwNDg2Q0M3QTAwN0NEMUQwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlFQThDQzBBNTA5QTM5QTU1MDAxMzc5QjggLyogY29tbW9uLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzBBNzA5QTM5QTU1MDAxMzc5QjggLyogZGN0NjRfaTM4Ni5jIGluIFNvdXJjZXMgKi8sCisJCQkJRUE4Q0MwQTkwOUEzOUE1NTAwMTM3OUI4IC8qIGRlY29kZV9pMzg2LmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzBBRDA5QTM5QTU1MDAxMzc5QjggLyogaW50ZXJmYWNlLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzBCMDA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIxLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzBCMjA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIyLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzBCNDA5QTM5QTU1MDAxMzc5QjggLyogbGF5ZXIzLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzBCRDA5QTM5QTU1MDAxMzc5QjggLyogdGFiaW5pdC5jIGluIFNvdXJjZXMgKi8sCisJCQkJRUE4Q0MwRjkwOUEzOUE1RTAwMTM3OUI4IC8qIGJpdHN0cmVhbS5jIGluIFNvdXJjZXMgKi8sCisJCQkJRUE4Q0MwRkMwOUEzOUE1RTAwMTM3OUI4IC8qIGVuY29kZXIuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMEZFMDlBMzlBNUUwMDEzNzlCOCAvKiBmZnQuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTAwMDlBMzlBNUUwMDEzNzlCOCAvKiBnYWluX2FuYWx5c2lzLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzEwQzA5QTM5QTVFMDAxMzc5QjggLyogaWQzdGFnLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzExMDA5QTM5QTVFMDAxMzc5QjggLyogbGFtZS5jIGluIFNvdXJjZXMgKi8sCisJCQkJRUE4Q0MxMTcwOUEzOUE1RTAwMTM3OUI4IC8qIG1wZ2xpYl9pbnRlcmZhY2UuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTE4MDlBMzlBNUUwMDEzNzlCOCAvKiBuZXdtZGN0LmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzExQTA5QTM5QTVFMDAxMzc5QjggLyogcHJlc2V0cy5jIGluIFNvdXJjZXMgKi8sCisJCQkJRUE4Q0MxMUIwOUEzOUE1RTAwMTM3OUI4IC8qIHBzeW1vZGVsLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzExRDA5QTM5QTVFMDAxMzc5QjggLyogcXVhbnRpemUuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTFGMDlBMzlBNUUwMDEzNzlCOCAvKiBxdWFudGl6ZV9wdnQuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTIxMDlBMzlBNUUwMDEzNzlCOCAvKiByZXNlcnZvaXIuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTIzMDlBMzlBNUUwMDEzNzlCOCAvKiBzZXRfZ2V0LmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzEyNTA5QTM5QTVFMDAxMzc5QjggLyogdGFibGVzLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzEyNzA5QTM5QTVFMDAxMzc5QjggLyogdGFrZWhpcm8uYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTI4MDlBMzlBNUUwMDEzNzlCOCAvKiB1dGlsLmMgaW4gU291cmNlcyAqLywKKwkJCQlFQThDQzEyQTA5QTM5QTVFMDAxMzc5QjggLyogdmJycXVhbnRpemUuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTJDMDlBMzlBNUUwMDEzNzlCOCAvKiBWYnJUYWcuYyBpbiBTb3VyY2VzICovLAorCQkJCUVBOENDMTJFMDlBMzlBNUUwMDEzNzlCOCAvKiB2ZXJzaW9uLmMgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisJCTA4OUMxNjY2RkU4NDExNThDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLyA9IHsKKwkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4OUMxNjY3RkU4NDExNThDMDJBQUMwNyAvKiBFbmdsaXNoICovLAorCQkJKTsKKwkJCW5hbWUgPSBJbmZvUGxpc3Quc3RyaW5nczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYVmFyaWFudEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gTEFNRV9QcmVmaXgucGNoOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiQGV4ZWN1dGFibGVfcGF0aC8uLi9GcmFtZXdvcmtzLyI7CisJCQkJTElCUkFSWV9TVFlMRSA9IERZTkFNSUM7CisJCQkJTUFDSF9PX1RZUEUgPSBtaF9keWxpYjsKKwkJCQlQUk9EVUNUX05BTUUgPSBMQU1FOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gZnJhbWV3b3JrOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAoCisJCQkJCXBwYywKKwkJCQkJaTM4NiwKKwkJCQkpOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSBMQU1FX1ByZWZpeC5wY2g7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICJAZXhlY3V0YWJsZV9wYXRoLy4uL0ZyYW1ld29ya3MvIjsKKwkJCQlMSUJSQVJZX1NUWUxFID0gRFlOQU1JQzsKKwkJCQlNQUNIX09fVFlQRSA9IG1oX2R5bGliOworCQkJCVBST0RVQ1RfTkFNRSA9IExBTUU7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBmcmFtZXdvcms7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ3MDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNEZBREMyNDgwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQk0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIkxBTUUiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ0MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIkxBTUUiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDcwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvbWFjb3N4L0xBTUVfUHJlZml4LnBjaCBiL21hY29zeC9MQU1FX1ByZWZpeC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExMDg5ZAotLS0gL2Rldi9udWxsCisrKyBiL21hY29zeC9MQU1FX1ByZWZpeC5wY2gKQEAgLTAsMCArMSw3IEBACisvLworLy8gUHJlZml4IGhlYWRlciBmb3IgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgJ0xBTUUnIHRhcmdldCBpbiB0aGUgJ0xBTUUnIHByb2plY3QuCisvLworCisjaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgorCisjZGVmaW5lIEhBVkVfQ09ORklHX0gKZGlmZiAtLWdpdCBhL21hY29zeC9NYWtlZmlsZS5hbSBiL21hY29zeC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWYwZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjb3N4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTAgQEAKKyMjICRJZDogTWFrZWZpbGUuYW0sdiAxLjIgMjAwOC8wNS8yNCAwODoyODo1OCBhbGVpZGluZ2VyIEV4cCAkCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKKworU1VCRElSUyA9IEVuZ2xpc2gubHByb2ogTEFNRS54Y29kZXByb2oKKworCitFWFRSQV9ESVNUID0gXAorCUluZm8ucGxpc3QgXAorCUxBTUVfUHJlZml4LnBjaApkaWZmIC0tZ2l0IGEvbWFjb3N4L01ha2VmaWxlLmluIGIvbWFjb3N4L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTJkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNvc3gvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MTkgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKK3N1YmRpciA9IG1hY29zeAorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCisJaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKKwlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkZMQUdTID0gQEZGTEFHU0AKK0ZST05URU5EX0NGTEFHUyA9IEBGUk9OVEVORF9DRkxBR1NACitGUk9OVEVORF9MREFERCA9IEBGUk9OVEVORF9MREFEREAKK0ZST05URU5EX0xERkxBR1MgPSBARlJPTlRFTkRfTERGTEFHU0AKK0dSRVAgPSBAR1JFUEAKK0dUS19DRkxBR1MgPSBAR1RLX0NGTEFHU0AKK0dUS19DT05GSUcgPSBAR1RLX0NPTkZJR0AKK0dUS19MSUJTID0gQEdUS19MSUJTQAorSU5DTFVERVMgPSBASU5DTFVERVNACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IDEuOSBmb3JlaWduICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK1NVQkRJUlMgPSBFbmdsaXNoLmxwcm9qIExBTUUueGNvZGVwcm9qCitFWFRSQV9ESVNUID0gXAorCUluZm8ucGxpc3QgXAorCUxBTUVfUHJlZml4LnBjaAorCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbWFjb3N4L01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduICBtYWNvc3gvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKKyQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKK2N0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD0uOyBcCisJZWxzZSBcCisJICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD07IFwKKwlmaTsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAorCSAgICAgIHRhZ3M9IiQkdGFncyAkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICBkaXN0ZGlyPWAkKGFtX19jZCkgJChkaXN0ZGlyKSAmJiBwd2RgOyBcCisJICAgIHRvcF9kaXN0ZGlyPWAkKGFtX19jZCkgJCh0b3BfZGlzdGRpcikgJiYgcHdkYDsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJHRvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJGRpc3RkaXIvJCRzdWJkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtcmVjdXJzaXZlCisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06CisKK3BzOiBwcy1yZWN1cnNpdmUKKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGluc3RhbGwtYW0gXAorCWluc3RhbGwtc3RyaXAKKworLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCisJYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBlbmQgZ2xvYmFsIHNlY3Rpb24KKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL21pc2MvLmluZGVudC5wcm8gYi9taXNjLy5pbmRlbnQucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjM5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjLy5pbmRlbnQucHJvCkBAIC0wLDAgKzEsMzIgQEAKKy8vIElOREVOVCBzZXR1cCBmaWxlOgorLy8JYmFzaWNhbGx5IHRoZSBHTlUtc3R5bGUgb2YgY29kaW5nCisvLyAKKy0tbm8tYmxhbmstbGluZXMtYWZ0ZXItZGVjbGFyYXRpb25zCistLWJsYW5rLWxpbmVzLWFmdGVyLXByb2NlZHVyZXMKKy0tbm8tYmxhbmstbGluZXMtYWZ0ZXItY29tbWFzCistLWJyZWFrLWJlZm9yZS1ib29sZWFuLW9wZXJhdG9yCistLWJyYWNlcy1vbi1pZi1saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyCistLWJyYWNlLWluZGVudDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgPC0KKy0tYnJhY2VzLW9uLXN0cnVjdC1kZWNsLWxpbmUgICAgICAgICAgICAgICAgICAgICAgLy8KKy0tY29tbWVudC1pbmRlbnRhdGlvbjI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzIKKy0tZGVjbGFyYXRpb24tY29tbWVudC1jb2x1bW4zMCAgICAgICAgICAgICAgICAgICAgLy8gMT8KKy0tbm8tY29tbWVudC1kZWxpbWl0ZXJzLW9uLWJsYW5rLWxpbmVzCistLWRvbnQtY3VkZGxlLWVsc2UKKy0tZWxzZS1lbmRpZi1jb2x1bW4xCistLXNwYWNlLWFmdGVyLWNhc3QKKy0tZGVjbGFyYXRpb24taW5kZW50YXRpb244ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMgorLW5kaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IGRvZXMgdGhpcyBtZWFuPworLS1kb250LWZvcm1hdC1maXJzdC1jb2x1bW4tY29tbWVudHMKKy0tZG9udC1mb3JtYXQtY29tbWVudHMKKy0taG9ub3VyLW5ld2xpbmVzCistLWluZGVudC1sZXZlbDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKKy0tcGFyYW1ldGVyLWluZGVudGF0aW9uNiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNQorLS1jb250aW51ZS1hdC1wYXJlbnRoZXNlcworLS1zcGFjZS1hZnRlci1wcm9jZWR1cmUtY2FsbHMKKy0tcHJvY25hbWVzLXN0YXJ0LWxpbmVzCistLWRvbnQtc3Rhci1jb21tZW50cworLS1sZWF2ZS1vcHRpb25hbC1ibGFuay1saW5lcyAKKworCistLXRhYi1zaXplMAorLS1saW5lLWxlbmd0aDgwCmRpZmYgLS1naXQgYS9taXNjL0xhbWUudmJzIGIvbWlzYy9MYW1lLnZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQyMDAyCi0tLSAvZGV2L251bGwKKysrIGIvbWlzYy9MYW1lLnZicwpAQCAtMCwwICsxLDE1OCBAQAorJyBsYW1lLnZicyBXaW5kb3dzU2NyaXB0IHdyYXBwZXIgdjAuNSwgMDYvMTUvMjAwMQorJyAkaWQkCisnCisnICpQdXJwb3NlKgorJyBVc2UgdGhpcyBXaW5kb3dzU2NyaXB0IHRvIGVuY29kZSBXQVZzIHVzaW5nIGRyYWcmZHJvcDoKKycgMC4gIG1ha2Ugc3VyZSB5b3UgaGF2ZSB3aW5kb3dzIHNjcmlwdCBob3N0IHY1LjEgb24geW91ciBzeXN0ZW0KKycgICAgIChlbnRlciAnY3NjcmlwdCcgaW4gYSBET1MtQm94IGFuZCBjb21wYXJlIHZlcnNpb24gbnVtYmVyKQorJyAxLiAgYWRqdXN0IHRoZSBwYXRoIHNldHRpbmdzIGJlbG93IHRvIGZpdCB5b3VyIG5lZWRzCisnIDJhLiBwdXQgdGhpcyBmaWxlIHNvbWV3aGVyZSBvbiB0aGUgZGVza3RvcAorJyAzYS4gZHJhZyBvbmUgb3IgbW9yZSB3YXYtZmlsZXMgb24gdGhlIGljb24gYW5kIHdhdGNoIHRoZW0gYmVpbmcgbGFtZWQuCisnCisnIDJiLiBzdGFydC0+ZXhlY3V0ZSwgZW50ZXIgInNlbmR0byIsIGRyYWcgdGhlIHNjcmlwdCBvciBhIGxpbmsgdG8gaXQgaW4KKycgICAgIHNlbmR0byB3aW5kb3cgKGFkanVzdCBuYW1lcyBhbmQgaWNvbiBhcyB5b3UgbGlrZSkKKycgM2IuIHNlbGVjdCB3YXZlLWZpbGUocykgYW5kIHNlbmQgaXQgdmlhIHRoZSBzZW5kLXRvIG1lbnUgdG8gTEFNRSEKKycKKycgWW91IG1heSB3aXNoIHRvIGNyZWF0ZSBjb3BpZXMgb2YgdGhpcyBmaWxlIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgc2V0LgorJworJyBJZiB5b3Ugd291bGQgbGlrZSBhIEdVSTogdHJ5IHRvIGVuYWJsZSB0aGUgSFRNTCBVSSAoc2VlIGJlbG93KQorJworJyBSYWxmIEtlbXBrZW5zLCByYWxmLmtlbXBrZW5zQGVwb3N0LmRlCisnCisnCisnICpIaXN0b3J5KgorJyBWMC41ICogbGFtZS52YnMgd2lsbCBhdXRvbWF0aWNhbGx5IGRlY29kZSBpZiB0aGUgZmlsZSBoYXMgYSAubXAzIGV4dGVuc2lvbgorJyAgICAgICogbm93IGV4cGxpY2l0bHkgcmVmdXNlcyB0byBhY2NlcHQgZm9sZGVycworJyBWMC40ICogY3JlYXRlcyBzaW5nbGUgLm1wMyBleHRlbnNpb25zLCBub3cgSUQzIG9wdGlvbnMgaW4gSFRNTCBpbnRlcmZhY2UKKycgVjAuMyAqIGZpeGVkIGJ1ZyB0aGF0IHByZXZlbnRlZCBsYW1lLmV4ZSB0byBiZSBsb2NhdGVkIGluIGEgcGF0aCB0aGF0IAorJyAgICAgICAgY29udGFpbmVkIGEgc3BhY2UKKycgICAgICAqIGV4cGVyaW1lbnRhbCBIVE1MIFVJIHN1cHBvcnQgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCisnIFYwLjIgYWRkZWQgbXVsdGlwbGUgZmlsZSBzdXBwb3J0CisnIFYwLjEgaW5pdGlhbCByZWxlYXNlCisKKycgKioqIGNoYW5nZSBwYXRoIHRvIHlvdXIgbmVlZHMgKioqCisgICAgcGF0aCA9ICJEOlxBdWRpb1xMYW1lXExhbWUzODZcIiAgICchISEgbXVzdCBlbmQgd2l0aCBhIGJhY2tzbGFzaCAhISEKKyAgICBsYW1lID0gImxhbWUuZXhlIgorCisnICoqKiBjaGFuZ2UgZGVmYXVsdCBvcHRpb25zIHRvIHlvdXIgbmVlZHMgKioqCisgICAgb3B0cyA9ICItLXByZXNldCBoaWZpIgorCisnICoqKiBIVE1MIEdVSSAoZXhwZXJpbWVudGFsKSAqKioKKyAgICB1c2VHVUkgPSBGYWxzZQorJyBpdCBzZXQgdG8gVHJ1ZSwgb3BlbnMgZmlsZSBsYW1lR1VJLmh0bWwgcmVzaWRpbmcgaW4gdGhlIHNhbWUgcGF0aCBhcyBsYW1lLmV4ZQorJyB0byBjaG9vc2Ugb3B0aW9ucy4gUGxlYXNlIGxvb2sgYXQgdGhlIGV4YW1wbGUgSFRNTC1maWxlIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCisnIG5vIGNoYW5nZXMgbmVlZGVkIGJlbG93IHRoaXMgbGluZQorJyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworRGltIHdzaCwgYXJncywgaW5maWxlLCBmcwordGl0bGU9IkxBTUUgU2NyaXB0IgorCisnIGdldCBpbnB1dCBmaWxlcworU2V0IHdzaCA9IFdTY3JpcHQuQ3JlYXRlT2JqZWN0KCJXU2NyaXB0LlNoZWxsIikKK1NldCBhcmdzID0gV1NjcmlwdC5Bcmd1bWVudHMKK0lmIGFyZ3MuQ291bnQgPSAwIFRoZW4KKyAgTXNnQm94ICJMQU1FIG1wMyBlbmNvZGVyL2RlY29kZXIgZnJvbnRlbmQgc2NyaXB0LiIgJiB2YkNSICYgXyAKKwkiUGxlYXNlIHVzZSBkcmFnICYgZHJvcCB0byBzcGVjaWZ5IGlucHV0IGZpbGVzLiIsIHZiSW5mb3JtYXRpb24sIHRpdGxlCisgIFdTY3JpcHQuUXVpdAorRW5kIElmCisKKycgY2hlY2sgcGF0aAorU2V0IGZzbyA9IENyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkZpbGVTeXN0ZW1PYmplY3QiKQorSWYgTm90IGZzby5GaWxlRXhpc3RzKHBhdGggJiBsYW1lKSBUaGVuCisgIE1zZ0JveCAiQ291bGQgbm90IGZpbmQgTEFNRSEiICYgdmJDUiAmICIobG9va2VkIGZvciAnIiAmIHBhdGggJiBsYW1lICYgIicpIiwgdmJDcml0aWNhbCwgdGl0bGUKKyAgV1NjcmlwdC5RdWl0CitFbmQgSWYKKworJyBzdGFydCBHVUkKK2lmIHVzZUdVSSBUaGVuCisgIHNldCBpZT1XU2NyaXB0LkNyZWF0ZU9iamVjdCgiSW50ZXJuZXRFeHBsb3Jlci5BcHBsaWNhdGlvbiIsICJpZV8iKQorICBpZS5uYXZpZ2F0ZShwYXRoICYgImxhbWVHVUkuaHRtbCIpCisgIGRvIAorICAgIFdTY3JpcHQuU2xlZXAgMTAwIAorICBsb29wIHVudGlsIGllLlJlYWR5U3RhdGU9NCAnd2FpdCBmb3IgR1VJCisKKyAgaWUuV2lkdGg9NjQwCisgIGllLkhlaWdodD02MDAKKyAgaWUuVG9vbGJhcj1mYWxzZQorICBpZS5TdGF0dXNiYXI9ZmFsc2UKKyAgaWUudmlzaWJsZT10cnVlCisKKyAgJ2xpbmsgdG8gR1VJCisgIHNldCBkb2N1bWVudD1pZS5kb2N1bWVudAorICBkb2N1bWVudC5mb3Jtcy5sYW1lZm9ybS5va2J1dHRvbi5vbkNsaWNrPUdldFJlZigib2tidXR0b24iKQorCisgICd3YWl0IGZvciB1c2VyIHByZXNzaW5nIG9rLi4uCisgIGRvIAorICAgIFdTY3JpcHQuU2xlZXAgMzAwIAorICBsb29wIHVudGlsIHByb2Nlc3MKK2VuZCBpZgorCisncHJvY2VzcyBmaWxlcworRm9yIGkgPSAwIFRvIGFyZ3MuQ291bnQtMQorICBpbmZpbGUgPSBhcmdzKGkpCisgICcgY2hlY2sgaW5wdXQgZmlsZQorICBJZiBmc28uRm9sZGVyRXhpc3RzKGluZmlsZSkgVGhlbgorICAgIE1zZ0JveCAiJyIgJiBpbmZpbGUgJiAiJyBpcyBhIGZvbGRlciEiICYgdmJDUiAmIF8KKwl0aXRsZSAmICIgb25seSBoYW5kbGVzIHByb3BlciBmaWxlcy4iLCB2YkluZm9ybWF0aW9uLCB0aXRsZQorICBFbHNlCisgICBJZiBOb3QgZnNvLkZpbGVFeGlzdHMoaW5maWxlKSBUaGVuCisgICAgICBNc2dCb3ggIkVycm9yIG9wZW5pbmcgaW5wdXQtZmlsZSIgJiB2YkNSICYgIiciICYgaW5maWxlICYgIiciLCB2YkNyaXRpY2FsICwgdGl0bGUKKyAgICBFbHNlCisgICAgJyBydW4gbGFtZQorICAgIElmKExDYXNlKGdldEV4dGVuc2lvbihpbmZpbGUpKT0ibXAzIikgVGhlbiAnZGVjb2RlCisgICAgICByZXQgPSB3c2guUnVuKENocigzNCkgJiBwYXRoICYgbGFtZSAmIENIUigzNCkgJiAiIC0tZGVjb2RlICIgJiBfCisgICAgICAgICAgQ2hyKDM0KSAmIGluZmlsZSAmIENocigzNCkgJiBDaHIoMzIpICYgQ2hyKDM0KSAmIF8KKyAgICAgICAgICBnZXRCYXNlbmFtZShpbmZpbGUpICYgIi53YXYiICYgQ2hyKDM0KSwgMSwgVHJ1ZSkKKyAgICBFbHNlICcgZW5jb2RlCisgICAgICByZXQgPSB3c2guUnVuKENocigzNCkgJiBwYXRoICYgbGFtZSAmIENIUigzNCkgJiBDaHIoMzIpICYgb3B0cyAmIENocigzMikgJiBfCisgICAgICAgICAgQ2hyKDM0KSAmIGluZmlsZSAmIENocigzNCkgJiBDaHIoMzIpICYgQ2hyKDM0KSAmIF8KKyAgICAgICAgICBnZXRCYXNlbmFtZShpbmZpbGUpICYgIi5tcDMiICYgQ2hyKDM0KSwgMSwgVHJ1ZSkKKyAgICBFbmQgSWYKKyAgICAnIGRpYWdub3N0aWNzCisgICAgU2VsZWN0IENhc2UgcmV0CisgICAgQ2FzZSAoMCkgJ29rZXlkb2tleQorICAgIENhc2UgKC0xKQorICAgICAgTXNnQm94ICJMQU1FIGFib3J0ZWQgYnkgdXNlciEiLCB2YkV4Y2xhbWF0aW9uLCB0aXRsZQorICAgIENhc2UgKDEpCisgICAgICBNc2dCb3ggIkVycm9yIHJldHVybmVkIGJ5IExBTUUhIiAmIHZiQ1IgJiAiKENoZWNrIExBTUUgb3B0aW9ucyBhbmQgaW5wdXQgZmlsZSBmb3JtYXRzLikiICYgdmJDUiAmICJVc2VkIE9wdGlvbnM6ICIgJiBvcHRzLCB2YkNyaXRpY2FsLCB0aXRsZQorICAgIENhc2UgRWxzZQorICAgICAgTXNnQm94ICJSZWNlaXZlZCB1bmtub3duIExBTUUgcmV0dXJuLWNvZGU6ICIgJiByZXQsIHZiQ3JpdGljYWwsIHRpdGxlCisgICAgRW5kIFNlbGVjdAorICAgRW5kIElmCisgIEVuZCBJZgorTmV4dAorCitXU2NyaXB0LlF1aXQKKycgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorJyB1dGlsaXR5IGZ1bmN0aW9ucworCitGdW5jdGlvbiBnZXRCYXNlbmFtZShmaWxlc3BlYykKKyAgRGltIGZzbworICBTZXQgZnNvID0gQ3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRmlsZVN5c3RlbU9iamVjdCIpCisgIFNldCBmID0gZnNvLkdldEZpbGUoZmlsZXNwZWMpCisgIAorICBnZXRCYXNlbmFtZSA9IGYuUGFyZW50Rm9sZGVyICYgIlwiICYgZnNvLkdldEJhc2VOYW1lKGZpbGVzcGVjKQorRW5kIEZ1bmN0aW9uCisKK0Z1bmN0aW9uIGdldEV4dGVuc2lvbihmaWxlc3BlYykKKyAgRGltIGZzbworICBTZXQgZnNvID0gQ3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRmlsZVN5c3RlbU9iamVjdCIpCisgIFNldCBmID0gZnNvLkdldEZpbGUoZmlsZXNwZWMpCisgIAorICBnZXRFeHRlbnNpb24gPSBmc28uR2V0RXh0ZW5zaW9uTmFtZShmaWxlc3BlYykgCitFbmQgRnVuY3Rpb24KKworJyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisnIG1hbmFnZSBsaW5rIHRvIElFIEhUTUwtaW50ZXJmYWNlCisKK3N1YiBva2J1dHRvbgorICAncHJvY2VzcyBpbnB1dHMKKyAgb3B0cz1kb2N1bWVudC5hbGwubGFtZW9wdGlvbnMuVmFsdWUKKyAgaWUuUXVpdAorICBNc2dCb3ggIkxBTUUgb3B0aW9uczoiICYgdmJDUiAmIG9wdHMsIHZiSW5mb3JtYXRpb24sIHRpdGxlCitlbmQgc3ViCisKK3N1YiBpZV9vblF1aXQKKyAgcHJvY2Vzcz1UcnVlCitlbmQgc3ViCisnZW9mCmRpZmYgLS1naXQgYS9taXNjL01ha2VmaWxlLmFtIGIvbWlzYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzEzYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI3IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS4xMCAyMDAyLzAxLzI1IDExOjIzOjIzIGFsZWlkaW5nZXIgRXhwICQKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbAorCitFWFRSQV9QUk9HUkFNUyA9IGFieCBhdGggc2NhbGFydGVzdAorCitDTEVBTkZJTEVTID0gJChFWFRSQV9QUk9HUkFNUykKKworRVhUUkFfU0NSSVBUUyA9IFwKKwlhdWVuYyBcCisJbGFtZWlkMy5wbCBcCisJbXVnZWNvLnNoIFwKKwltbGFtZQorCitFWFRSQV9ESVNUID0gXAorCSQoRVhUUkFfU0NSSVBUUykgXAorCUxhbWUudmJzIFwKKwlsYW1lR1VJLmh0bWwgXAorCWxhbWU0ZG9zLmJhdCBcCisJbWxhbWVfY29yci5jCisKK2FieF9TT1VSQ0VTID0gYWJ4LmMKKworYXRoX1NPVVJDRVMgPSBhdGguYworCitzY2FsYXJ0ZXN0X1NPVVJDRVMgPSBzY2FsYXJ0ZXN0LmMKKwpkaWZmIC0tZ2l0IGEvbWlzYy9NYWtlZmlsZS5pbiBiL21pc2MvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyN2FjMAotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MDMgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0FOU0kyS05SID0gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIFwKKwkkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCBkZXBjb21wCitFWFRSQV9QUk9HUkFNUyA9IGFieCQoRVhFRVhUKSBhdGgkKEVYRUVYVCkgc2NhbGFydGVzdCQoRVhFRVhUKQorc3ViZGlyID0gbWlzYworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK2FtX2FieF9PQkpFQ1RTID0gYWJ4JFUuJChPQkpFWFQpCithYnhfT0JKRUNUUyA9ICQoYW1fYWJ4X09CSkVDVFMpCithYnhfTERBREQgPSAkKExEQUREKQorYWJ4X0RFUEVOREVOQ0lFUyA9CithbV9hdGhfT0JKRUNUUyA9IGF0aCRVLiQoT0JKRVhUKQorYXRoX09CSkVDVFMgPSAkKGFtX2F0aF9PQkpFQ1RTKQorYXRoX0xEQUREID0gJChMREFERCkKK2F0aF9ERVBFTkRFTkNJRVMgPQorYW1fc2NhbGFydGVzdF9PQkpFQ1RTID0gc2NhbGFydGVzdCRVLiQoT0JKRVhUKQorc2NhbGFydGVzdF9PQkpFQ1RTID0gJChhbV9zY2FsYXJ0ZXN0X09CSkVDVFMpCitzY2FsYXJ0ZXN0X0xEQUREID0gJChMREFERCkKK3NjYWxhcnRlc3RfREVQRU5ERU5DSUVTID0KK0RFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHRvcF9idWlsZGRpcilAYW1fX2lzcmNACitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKGFieF9TT1VSQ0VTKSAkKGF0aF9TT1VSQ0VTKSAkKHNjYWxhcnRlc3RfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQoYWJ4X1NPVVJDRVMpICQoYXRoX1NPVVJDRVMpICQoc2NhbGFydGVzdF9TT1VSQ0VTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitFQ0hPID0gQEVDSE9ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGNzcgPSBARjc3QAorRkZMQUdTID0gQEZGTEFHU0AKK0ZST05URU5EX0NGTEFHUyA9IEBGUk9OVEVORF9DRkxBR1NACitGUk9OVEVORF9MREFERCA9IEBGUk9OVEVORF9MREFEREAKK0ZST05URU5EX0xERkxBR1MgPSBARlJPTlRFTkRfTERGTEFHU0AKK0dSRVAgPSBAR1JFUEAKK0dUS19DRkxBR1MgPSBAR1RLX0NGTEFHU0AKK0dUS19DT05GSUcgPSBAR1RLX0NPTkZJR0AKK0dUS19MSUJTID0gQEdUS19MSUJTQAorSU5DTFVERVMgPSBASU5DTFVERVNACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEQUREID0gQExEQUREQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCVE9PTF9ERVBTID0gQExJQlRPT0xfREVQU0AKK0xJQl9NQUpPUl9WRVJTSU9OID0gQExJQl9NQUpPUl9WRVJTSU9OQAorTElCX01JTk9SX1ZFUlNJT04gPSBATElCX01JTk9SX1ZFUlNJT05ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NOREZJTEVfQ0ZMQUdTID0gQFNOREZJTEVfQ0ZMQUdTQAorU05ERklMRV9MSUJTID0gQFNOREZJTEVfTElCU0AKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lUSF9GUk9OVEVORCA9IEBXSVRIX0ZST05URU5EQAorV0lUSF9NUDNSVFAgPSBAV0lUSF9NUDNSVFBACitXSVRIX01QM1ggPSBAV0lUSF9NUDNYQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRjc3ID0gQGFjX2N0X0Y3N0AKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IDEuOSBmb3JlaWduICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK0NMRUFORklMRVMgPSAkKEVYVFJBX1BST0dSQU1TKQorRVhUUkFfU0NSSVBUUyA9IFwKKwlhdWVuYyBcCisJbGFtZWlkMy5wbCBcCisJbXVnZWNvLnNoIFwKKwltbGFtZQorCitFWFRSQV9ESVNUID0gXAorCSQoRVhUUkFfU0NSSVBUUykgXAorCUxhbWUudmJzIFwKKwlsYW1lR1VJLmh0bWwgXAorCWxhbWU0ZG9zLmJhdCBcCisJbWxhbWVfY29yci5jCisKK2FieF9TT1VSQ0VTID0gYWJ4LmMKK2F0aF9TT1VSQ0VTID0gYXRoLmMKK3NjYWxhcnRlc3RfU09VUkNFUyA9IHNjYWxhcnRlc3QuYworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbWlzYy9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbWlzYy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorYWJ4JChFWEVFWFQpOiAkKGFieF9PQkpFQ1RTKSAkKGFieF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBhYngkKEVYRUVYVCkKKwkkKExJTkspICQoYWJ4X09CSkVDVFMpICQoYWJ4X0xEQUREKSAkKExJQlMpCithdGgkKEVYRUVYVCk6ICQoYXRoX09CSkVDVFMpICQoYXRoX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGF0aCQoRVhFRVhUKQorCSQoTElOSykgJChhdGhfT0JKRUNUUykgJChhdGhfTERBREQpICQoTElCUykKK3NjYWxhcnRlc3QkKEVYRUVYVCk6ICQoc2NhbGFydGVzdF9PQkpFQ1RTKSAkKHNjYWxhcnRlc3RfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgc2NhbGFydGVzdCQoRVhFRVhUKQorCSQoTElOSykgJChzY2FsYXJ0ZXN0X09CSkVDVFMpICQoc2NhbGFydGVzdF9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworJCh0b3Bfc3JjZGlyKS9hbnNpMmtucjoKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIC4vYW5zaTJrbnIKKworbW9zdGx5Y2xlYW4ta3I6CisJLXRlc3QgIiRVIiA9ICIiIHx8IHJtIC1mICpfLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2FieCRVLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9hdGgkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2NhbGFydGVzdCRVLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CithYnhfLmM6IGFieC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvYWJ4LmM7IHRoZW4gZWNobyAkKHNyY2RpcikvYWJ4LmM7IGVsc2UgZWNobyBhYnguYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorYXRoXy5jOiBhdGguYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2F0aC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2F0aC5jOyBlbHNlIGVjaG8gYXRoLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3NjYWxhcnRlc3RfLmM6IHNjYWxhcnRlc3QuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3NjYWxhcnRlc3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9zY2FsYXJ0ZXN0LmM7IGVsc2UgZWNobyBzY2FsYXJ0ZXN0LmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2FieF8uJChPQkpFWFQpIGFieF8ubG8gYXRoXy4kKE9CSkVYVCkgYXRoXy5sbyBzY2FsYXJ0ZXN0Xy4kKE9CSkVYVCkgXAorc2NhbGFydGVzdF8ubG8gOiAkKEFOU0kyS05SKQorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4ta3IgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBcCisJaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAorCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4ta3IgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgXAorCXBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIGVuZCBnbG9iYWwgc2VjdGlvbgorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbWlzYy9hYnguYyBiL21pc2MvYWJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2MzY0ZAotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvYWJ4LmMKQEAgLTAsMCArMSwxMzIzIEBACisvKgorICogIFVzYWdlOiBhYnggb3JpZ2luYWxfZmlsZSB0ZXN0X2ZpbGUKKyAqCisgKiAgQXNrIHlvdSBhcyBsb25nIGFzIHRoZSBwcm9iYWJpbGl0eSBpcyBiZWxvdyB0aGUgZ2l2ZW4gcGVyY2VudGFnZSB0aGF0CisgKiAgeW91IHJlY29nbml6ZSBkaWZmZXJlbmNlcworICoKKyAqICBFeGFtcGxlOiBhYnggbXVzaWMud2F2IG11c2ljLm1wMworICogICAgICAgICAgIGFieCBtdXNpYy53YXYgbXVzaWMubXAzIC0taGVscAorICoKKyAqICBOb3RlOiBzZXZlcmFsICdkZWNvZGluZycgdXRpbGl0ZXMgbXVzdCBiZSBvbiB0aGUgJ3JpZ2h0JyBwbGFjZQorICoKKyAqICBCdWdzOgorICogICAgICBmaXggcGF0aCBvZiBkZWNvZGluZyB1dGlsaXRpZXMKKyAqICAgICAgb25seSAxNiBiaXQgc3VwcG9ydAorICogICAgICBvbmx5IHN1cHBvcnQgb2YgdGhlIHNhbWUgc2FtcGxlIGZyZXF1ZW5jeQorICogICAgICBubyBleGFjdCBXQVYgZmlsZSBoZWFkZXIgYW5hbHlzaXMKKyAqICAgICAgbm8gbW91c2Ugb3Igam95c3RpY2sgc3VwcG9ydAorICogICAgICBkb24ndCB1c2VzIGZ1bmN0aW9uYWxpdHkgb2YgYXRoLmMKKyAqICAgICAgb25seSAyIGZpbGVzIGFyZSBjb21wYXJhYmxlCisgKiAgICAgIHdvcnNlIHVzZXIgaW50ZXJmYWNlCisgKiAgICAgIHF1aWNrICYgZGlydHkgaGFjaworICogICAgICB3YXN0ZXMgbWVtb3J5CisgKiAgICAgIGNvbXBpbGUgdGltZSB3YXJuaW5ncworICogICAgICBidWZmZXIgb3ZlcnJ1bnMgcG9zc2libGUKKyAqICAgICAgbm8gZGl0aGVyaW5nIGlmIHJlY2FsY3MgYXJlIG5lY2Vzc2FyeQorICogICAgICBjb3JyZWxhdGlvbiBvbmx5IGRvbmUgd2l0aCBvbmUgY2hhbm5lbCAoMiBjaGFubmVscywgc3VtLCB3aGF0IGlzIGJldHRlcj8pCisgKiAgICAgIGxvd3Bhc3MraGlnaHBhc3MgZmlsdGVyaW5nICgzMDAgSHorMio1IGtIeikgYmVmb3JlIGRlbGF5K2FtcGxpdHVkZSBjb3JyCisgKiAgICAgIGNyb3NzIGZhZGUgYXQgc3RhcnQvc3RvcAorICogICAgICBub24gcG9ydGFibGUga2V5Ym9hcmQKKyAqICAgICAgZmFkZSBvdXQgb24gcXVpdCwgZmFkZSBpbiBvbiBzdGFydAorICogICAgICBsZXZlbC9kZWxheSBhanVzdG1lbnQgc2hvdWxkIGJlIHN3aXRjaGFibGUKKyAqICAgICAgcGF1c2Uga2V5IG1pc3NpbmcKKyAqICAgICAgcHJvYmxlbXMgd2l0aCBkaWdpdGFsIHNpbGVuY2UgZmlsZXMgKGRpdmlzaW9uIGJ5IDApCisgKiAgICAgIEdy77+977+9ZSBjcm9zcyBjb3JyIGZlbnN0ZXIgMl4xNi4uLjE4CisgKiAgICAgIFN0ZWxsZW5zdWNoZSwgYWIgMCpsZW4gb2RlciAwLjEqbGVuIG9kZXIgMC4yNSpsZW4sIG5hY2ggRWZmZWt0aXYgb2RlciBTcGl0emVud2VydAorICogICAgICBBYnN0dXJ6IGJlaSBMUEFDIGZlZWRpbmcsIHdhcnVtPworICogICAgICBBbHMgJ0InIGJlaW0gUmF0ZXNwaWVsIHNvbGx0ZSBhdWNoICcwJy4uLic5JyB2ZXJ3ZW5kYmFyIHNlaW4KKyAqICAgICAgT2RlciBtaXQgZWluZW0gRmlsdGVyIDMwMCBIei4uLjMga0h6IHZvcmhlciBmaWx0ZXJuPworICogICAgICBNdWx0aXBsZSBlbmNvZGVkIGRpZmZlcmVuemllcnRlcyBTaWduYWwKKyAqICAgICAgQW1wbGl0dWRlbmFucGFzc3VuZyBzY2hhbHRiYXIgbWFjaGVuPworICogICAgICBEaXJla3QgYXVmIGRlciBLb21tYW5kb3plaWxlIGtvZGllcmVuOgorICogICAgICBhYnggInRlc3Qud2F2IiAiIWxhbWUgLWIxMjggdGVzdC53YXYgLSIKKyAqLworCisvLyBJZiB0aGUgcHJvZ3JhbSBzaG91bGQgaW5jcmVhc2UgaXQgcHJpb3JpdHkgd2hpbGUgcGxheWluZyBkZWZpbmUgVVNFX05JQ0UuCisvLyBQcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkIFNVSUQgcm9vdC4gRGVjb21wcmVzc2luZyBwaGFzZSBpcyB1c2luZyBOT1JNQUwgcHJpb3JpdHkKKyNkZWZpbmUgVVNFX05JQ0UKKworLy8gTm90IG9ubHkgaW5jcmVhc2UgcHJpb3JpdHkgYnV0IGNoYW5nZSB0byByZWxhdGltZSBzY2hlZHVsaW5nLiBQcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkIFNVSUQgcm9vdAorI2RlZmluZSBVU0VfUkVBTFRJTUUKKworLy8gUGF0aCBvZiB0aGUgcHJvZ3JhbXM6IG1wZzEyMywgbXBwZGVjLCBmYWFkLCBhYzNkZWMsIG9nZzEyMywgbHBhYywgc2hvcnRlbiwgTUFDLCBmbGFjCisvLyNkZWZpbmUgUEFUSF9PRl9FWFRFUk5BTF9UT09MU19GT1JfVU5DT01QUkVTU0lORyAgICIvdXNyL2xvY2FsL2Jpbi8iCisjZGVmaW5lIFBBVEhfT0ZfRVhURVJOQUxfVE9PTFNfRk9SX1VOQ09NUFJFU1NJTkcgICAiIgorCisKKyNpZiBkZWZpbmVkIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjZGVmaW5lICBNQVggICgxPDwxNykKKworI2lmICAgZGVmaW5lZCBIQVZFX1NZU19TT1VORENBUkRfSAorIyBpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZWxpZiBkZWZpbmVkIEhBVkVfTElOVVhfU09VTkRDQVJEX0gKKyMgaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4gICAgICAgICAvKiBzdGFuZCBhbG9uZSBjb21waWxhYmxlIGZvciBteSB0ZXN0cyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFVTRV9OSUNFCisjIGluY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaWYgZGVmaW5lZCBVU0VfUkVBTFRJTUUKKyMgaW5jbHVkZSA8c2NoZWQuaD4KKyNlbmRpZgorCisjZGVmaW5lICBCRiAgICAgICAgICAgKChmcmVxKS8yNSkKKyNkZWZpbmUgIE1BWF9MRU4gICAgICAoMjEwICogNDQxMDApCisjZGVmaW5lICBETUFfU0FNUExFUyAgNTEyCSAgICAJLyogTXkgTGludXggZHJpdmVyIHVzZXMgYSBETUEgYnVmZmVyIG9mIDY1NTM2KjE2IGJpdCwgd2hpY2ggaXMgMzI3Njggc2FtcGxlcyBpbiAxNiBiaXQgc3RlcmVvIG1vZGUgKi8KKwordm9pZCAgU2V0X1JlYWx0aW1lICggdm9pZCApCit7CisjaWYgZGVmaW5lZCBVU0VfUkVBTFRJTUUKKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gIHNwOworICAgIGludCAgICAgICAgICAgICAgICAgcmV0OworCisgICAgbWVtc2V0ICAgICAgKCAmc3AsIDAsIHNpemVvZihzcCkgKTsKKyAgICBzZXRldWlkICAgICAoIDAgKTsKKyAgICBzcC5zY2hlZF9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4gKCBTQ0hFRF9GSUZPICk7CisgICAgcmV0ICAgICAgICAgICAgICAgPSBzY2hlZF9zZXRzY2hlZHVsZXIgKCAwLCBTQ0hFRF9SUiwgJnNwICk7CisgICAgc2V0ZXVpZCAgICAgKCBnZXR1aWQoKSApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFVTRV9OSUNFCisgICAgc2V0ZXVpZCAgICAgKCAwICk7CisgICAgc2V0cHJpb3JpdHkgKCBQUklPX1BST0NFU1MsIGdldHBpZCgpLCAtMjAgKTsKKyAgICBzZXRldWlkICAgICAoIGdldHVpZCgpICk7CisjZW5kaWYKK30KKworaW50IHZlcmJvc2UgPSAwOworCitzdGF0aWMgc3RydWN0IHRlcm1pb3Mgc3RvcmVkX3NldHRpbmdzOworCisKK3ZvaWQgcmVzZXQgKCB2b2lkICkKK3sKKyAgICB0Y3NldGF0dHIgKCAwLCBUQ1NBTk9XLCAmc3RvcmVkX3NldHRpbmdzICk7Cit9CisKKwordm9pZCBzZXQgKCB2b2lkICkKK3sKKyAgICBzdHJ1Y3QgdGVybWlvcyBuZXdfc2V0dGluZ3M7CisKKyAgICB0Y2dldGF0dHIgKCAwLCAmc3RvcmVkX3NldHRpbmdzICk7CisgICAgbmV3X3NldHRpbmdzID0gc3RvcmVkX3NldHRpbmdzOworCisgICAgbmV3X3NldHRpbmdzLmNfbGZsYWcgICAgJj0gfkVDSE87CisgICAgLyogRGlzYWJsZSBjYW5vbmljYWwgbW9kZSwgYW5kIHNldCBidWZmZXIgc2l6ZSB0byAxIGJ5dGUgKi8KKyAgICBuZXdfc2V0dGluZ3MuY19sZmxhZyAgICAmPSB+SUNBTk9OOworICAgIG5ld19zZXR0aW5ncy5jX2NjW1ZUSU1FXSA9IDA7CisgICAgbmV3X3NldHRpbmdzLmNfY2NbVk1JTl0gID0gMTsKKworICAgIHRjc2V0YXR0cigwLFRDU0FOT1csJm5ld19zZXR0aW5ncyk7CisgICAgcmV0dXJuOworfQorCisKK2ludCBzZWwgKCB2b2lkICkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCAgdDsKKyAgICBmZF9zZXQgICAgICAgICAgZmQgWzFdOworICAgIGludCAgICAgICAgICAgICByZXQ7CisgICAgdW5zaWduZWQgY2hhciAgIGM7CisKKyAgICBGRF9TRVQgKDAsIGZkKTsKKyAgICB0LnR2X3NlYyAgPSAwOworICAgIHQudHZfdXNlYyA9IDA7CisKKyAgICByZXQgPSBzZWxlY3QgKCAxLCBmZCwgTlVMTCwgTlVMTCwgJnQgKTsKKworICAgIHN3aXRjaCAoIHJldCApIHsKKyAgICBjYXNlICAwOgorICAgICAgICByZXR1cm4gLTE7CisgICAgY2FzZSAgMToKKyAgICAgICAgcmV0ID0gcmVhZCAoMCwgJmMsIDEpOworICAgICAgICByZXR1cm4gcmV0ID09IDEgID8gIGMgIDogIC0xOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9Cit9CisKKyNkZWZpbmUgRkZUX0VSUl9PSyAgICAgIDAgICAgICAgICAgICAgICAvLyBubyBlcnJvcgorI2RlZmluZSBGRlRfRVJSX0xEICAgICAgMSAgICAgICAgICAgICAgIC8vIGxlbiBpcyBub3QgYSBwb3dlciBvZiAyCisjZGVmaW5lIEZGVF9FUlJfTUFYICAgICAyICAgICAgICAgICAgICAgLy8gbGVuIHRvbyBsYXJnZQorCit0eXBlZGVmIGZsb2F0ICAgZl90OwordHlwZWRlZiBmX3QgICAgIGNvbXBsIFsyXTsKK2NvbXBsICAgICAgICAgICByb290ICAgIFtNQVggPj4gMV07ICAgICAgICAgICAgIC8vIFNpbnVzLS9Lb3NpbnVzdGFiZWxsZQorc2l6ZV90ICAgICAgICAgIHNodWZmbGUgW01BWCA+PiAxXSBbMl07ICAgICAgICAgLy8gU2h1ZmZsZS1UYWJlbGxlCitzaXplX3QgICAgICAgICAgc2h1ZmZsZV9sZW47CisKKy8vIEJpdGludmVyc2lvbgorCitzaXplX3QgIHN3YXAgKCBzaXplX3QgbnVtYmVyLCBpbnQgYml0cyApCit7CisgICAgc2l6ZV90ICByZXQ7CisgICAgZm9yICggcmV0ID0gMDsgYml0cy0tOyBudW1iZXIgPj49IDEgKSB7CisgICAgICAgIHJldCA9IHJldCArIHJldCArIChudW1iZXIgJiAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gQmVzdGltbWVuIGRlcyBMb2dhcml0aG11cyBkdWFsaXMKKworaW50ICBsZCAoIHNpemVfdCBudW1iZXIgKQoreworICAgIHNpemVfdCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZW9mKHNpemVfdCkqQ0hBUl9CSVQ7IGkrKyApCisgICAgICAgIGlmICggKChzaXplX3QpMSA8PCBpKSA9PSBudW1iZXIgKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIC0xOworfQorCisvLyBEaWUgZWlnZW50bGljaGUgRkZUCisKK2ludCAgZmZ0ICggY29tcGwqIGZuLCBjb25zdCBzaXplX3QgbmV3bGVuICkKK3sKKyAgICBzdGF0aWMgc2l6ZV90ICBsZW4gID0gMDsKKyAgICBzdGF0aWMgaW50ICAgICBiaXRzID0gMDsKKyAgICBzaXplX3QgICAgICAgICBpOworICAgIHNpemVfdCAgICAgICAgIGo7CisgICAgc2l6ZV90ICAgICAgICAgazsKKyAgICBzaXplX3QgICAgICAgICBwOworCisgICAgLyogVGFiZWxsZW4gaW5pdGlhbGlzaWVyZW4gKi8KKworICAgIGlmICggbmV3bGVuICE9IGxlbiApIHsKKyAgICAgICAgbGVuICA9IG5ld2xlbjsKKworICAgICAgICBpZiAoIChiaXRzPWxkKGxlbikpID09IC0xICkKKyAgICAgICAgICAgIHJldHVybiBGRlRfRVJSX0xEOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICBqID0gc3dhcCAoIGksIGJpdHMgKTsKKyAgICAgICAgICAgIGlmICggaSA8IGogKSB7CisgICAgICAgICAgICAgICAgc2h1ZmZsZSBbc2h1ZmZsZV9sZW5dIFswXSA9IGk7CisgICAgICAgICAgICAgICAgc2h1ZmZsZSBbc2h1ZmZsZV9sZW5dIFsxXSA9IGo7CisgICAgICAgICAgICAgICAgc2h1ZmZsZV9sZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKCBpID0gMDsgaSA8IChsZW4+PjEpOyBpKysgKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IChkb3VibGUpIHN3YXAgKCBpK2ksIGJpdHMgKSAqIDIqTV9QSS9sZW47CisgICAgICAgICAgICByb290IFtpXSBbMF0gPSBjb3MgKHgpOworICAgICAgICAgICAgcm9vdCBbaV0gWzFdID0gc2luICh4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEVpZ2VudGxpY2hlIFRyYW5zZm9ybWF0aW9uICovCisKKyAgICBwID0gbGVuID4+IDE7CisgICAgZG8geworICAgICAgICBmX3QqICBicCA9IChmX3QqKSByb290OworICAgICAgICBmX3QqICBzaSA9IChmX3QqKSBmbjsKKyAgICAgICAgZl90KiAgZGkgPSAoZl90KikgZm4rcCtwOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGsgPSBwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGZfdCAgbXVsciA9IGJwWzBdKmRpWzBdIC0gYnBbMV0qZGlbMV07CisgICAgICAgICAgICAgICAgZl90ICBtdWxpID0gYnBbMV0qZGlbMF0gKyBicFswXSpkaVsxXTsKKworICAgICAgICAgICAgICAgIGRpWzBdICA9IHNpWzBdIC0gbXVscjsKKyAgICAgICAgICAgICAgICBkaVsxXSAgPSBzaVsxXSAtIG11bGk7CisgICAgICAgICAgICAgICAgc2lbMF0gKz0gbXVscjsKKyAgICAgICAgICAgICAgICBzaVsxXSArPSBtdWxpOworCisgICAgICAgICAgICAgICAgc2kgKz0gMiwgZGkgKz0gMjsKKyAgICAgICAgICAgIH0gd2hpbGUgKCAtLWsgKTsKKyAgICAgICAgICAgIHNpICs9IHArcCwgZGkgKz0gcCtwLCBicCArPSAyOworICAgICAgICB9IHdoaWxlICggc2kgPCAmZm5bbGVuXVswXSApOworICAgIH0gd2hpbGUgKHAgPj49IDEpOworCisgICAgLyogQml0aW52ZXJzaW9uICovCisKKyAgICBmb3IgKCBrID0gMDsgayA8IHNodWZmbGVfbGVuOyBrKysgKSB7CisgICAgICAgIGZfdCAgdG1wOworICAgICAgICBpICAgPSBzaHVmZmxlIFtrXSBbMF07CisgICAgICAgIGogICA9IHNodWZmbGUgW2tdIFsxXTsKKyAgICAgICAgdG1wID0gZm4gW2ldWzBdOyBmbiBbaV1bMF0gPSBmbiBbal1bMF07IGZuIFtqXVswXSA9IHRtcDsKKyAgICAgICAgdG1wID0gZm4gW2ldWzFdOyBmbiBbaV1bMV0gPSBmbiBbal1bMV07IGZuIFtqXVsxXSA9IHRtcDsKKyAgICB9CisKKyAgICByZXR1cm4gRkZUX0VSUl9PSzsKK30KKwordm9pZCAgcHJpbnRudW1iZXIgKCBsb25nIGRvdWJsZSB4ICkKK3sKKyAgICB1bnNpZ25lZCAgZXhwID0gMDsKKworICAgIGlmICAgICAgKCB4IDwgOS45OTk5OTUgICkgZnByaW50ZiAoIHN0ZGVyciwgIiU3LjVmIiwgIChkb3VibGUpeCApOworICAgIGVsc2UgaWYgKCB4IDwgOTkuOTk5OTUgICkgZnByaW50ZiAoIHN0ZGVyciwgIiU3LjRmIiwgIChkb3VibGUpeCApOworICAgIGVsc2UgaWYgKCB4IDwgOTk5Ljk5OTUgICkgZnByaW50ZiAoIHN0ZGVyciwgIiU3LjNmIiwgIChkb3VibGUpeCApOworICAgIGVsc2UgaWYgKCB4IDwgOTk5OS45OTUgICkgZnByaW50ZiAoIHN0ZGVyciwgIiU3LjJmIiwgIChkb3VibGUpeCApOworICAgIGVsc2UgaWYgKCB4IDwgOTk5OTkuOTUgICkgZnByaW50ZiAoIHN0ZGVyciwgIiU3LjFmIiwgIChkb3VibGUpeCApOworICAgIGVsc2UgaWYgKCB4IDwgOTk5OTk5LjUgICkgZnByaW50ZiAoIHN0ZGVyciwgIiU2LjBmLiIsIChkb3VibGUpeCApOworICAgIGVsc2UgaWYgKCB4IDwgOTk5OTk5OS41ICkgZnByaW50ZiAoIHN0ZGVyciwgIiU3LjBmIiwgIChkb3VibGUpeCApOworICAgIGVsc2UgaWYgKCB4IDwgOS45OTk1ZTkgICkgeworICAgICAgICB3aGlsZSAoIHggPj0gOS45OTk1ICkgZXhwKysgICwgeCAvPSAxMDsKKyAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiU1LjNmZSUwMXUiLCAoZG91YmxlKXgsIGV4cCApOworICAgIH0gZWxzZSBpZiAoIHggPCA5Ljk5NWU5OSApIHsKKyAgICAgICAgd2hpbGUgKCB4ID49IDkuNWU2ICApIGV4cCs9NiAsIHggLz0gMS5lNjsKKyAgICAgICAgd2hpbGUgKCB4ID49IDkuOTk1ICApIGV4cCsrICAsIHggLz0gMTA7CisgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIlNC4yZmUlMDJ1IiwgKGRvdWJsZSl4LCBleHAgKTsKKyAgICB9IGVsc2UgaWYgKCB4IDwgOS45NWU5OTlMICkgeworICAgICAgICB3aGlsZSAoIHggPj0gOS41ZTE4ICkgZXhwKz0xOCwgeCAvPSAxLmUxODsKKyAgICAgICAgd2hpbGUgKCB4ID49IDkuOTUgICApIGV4cCsrICAsIHggLz0gMTA7CisgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIlMy4xZmUlMDN1IiwgKGRvdWJsZSl4LCBleHAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoIHggPj0gOS41ZTQ4ICkgZXhwKz00OCwgeCAvPSAxLmU0ODsKKyAgICAgICAgd2hpbGUgKCB4ID49IDkuNSAgICApIGV4cCsrICAsIHggLz0gMTA7CisgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIlMS4wZi5lJTA0dSIsIChkb3VibGUpeCwgZXhwICk7CisgICAgfQorfQorCitkb3VibGUgbG9nZHVhbCAoIGxvbmcgZG91YmxlIHggKQoreworICAgIHVuc2lnbmVkIGV4cCA9IDA7CisKKyAgICB3aGlsZSAoIHggPj0gMTg0NDY3NDQwNzM3MDk1NTE2MTYuICkKKyAgICAgICAgeCAvPSAxODQ0Njc0NDA3MzcwOTU1MTYxNi4sIGV4cCArPSA2NDsKKyAgICB3aGlsZSAoIHggPj0gMjU2LiApCisgICAgICAgIHggLz0gMjU2LiwgZXhwICs9IDg7CisgICAgd2hpbGUgKCB4ID49IDIuICkKKyAgICAgICAgeCAvPSAyLiwgZXhwICs9IDE7CisgICAgcmV0dXJuIGV4cCArIGxvZyAoeCkvbG9nKDIpOworfQorCitpbnQgIHJhbmRvbV9udW1iZXIgKCB2b2lkICkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCAgdDsKKyAgICB1bnNpZ25lZCBsb25nICAgdmFsOworCisgICAgZ2V0dGltZW9mZGF5ICggJnQsIE5VTEwgKTsKKworICAgIHZhbCAgPSB0LnR2X3NlYyBeIHQudHZfdXNlYyBeIHJhbmQoKTsKKyAgICB2YWwgXj0gdmFsID4+IDE2OworICAgIHZhbCBePSB2YWwgPj4gIDg7CisgICAgdmFsIF49IHZhbCA+PiAgNDsKKyAgICB2YWwgXj0gdmFsID4+ICAyOworICAgIHZhbCBePSB2YWwgPj4gIDE7CisKKyAgICByZXR1cm4gdmFsICYgMTsKK30KKworbG9uZyBkb3VibGUgIHByb2IgKCBpbnQgbGFzdCwgaW50IHRvdGFsICkKK3sKKyAgICBsb25nIGRvdWJsZSAgc3VtID0gMC47CisgICAgbG9uZyBkb3VibGUgIHRtcCA9IDEuOworICAgIGludCAgICAgICAgICBpOworICAgIGludCAgICAgICAgICBqICAgPSB0b3RhbDsKKworICAgIGlmICggMipsYXN0ID09IHRvdGFsICkKKyAgICAgICAgcmV0dXJuIDEuOworICAgIGlmICggMipsYXN0ID4gdG90YWwgKQorICAgICAgICBsYXN0ID0gdG90YWwgLSBsYXN0OworCisgICAgZm9yICggaSA9IDA7IGkgPD0gbGFzdDsgaSsrICkgeworICAgICAgICBzdW0gKz0gdG1wOworICAgICAgICB0bXAgID0gdG1wICogKHRvdGFsLWkpIC8gKDEraSk7CisgICAgICAgIHdoaWxlICggaiA+IDAgICYmICB0bXAgPiAxICkKKyAgICAgICAgICAgIGotLSwgc3VtICo9IDAuNSwgdG1wICo9IDAuNTsKKyAgICB9CisgICAgd2hpbGUgKCBqID4gMCApCisgICAgICAgIGotLSwgc3VtICo9IDAuNTsKKworICAgIHJldHVybiAyLipzdW07Cit9CisKKwordm9pZCAgZXZhbCAoIGludCByaWdodCApCit7CisgICAgc3RhdGljIGludCAgIGNvdW50ID0gMDsKKyAgICBzdGF0aWMgaW50ICAgb2theSAgPSAwOworICAgIGxvbmcgZG91YmxlICB2YWw7CisKKyAgICBjb3VudCArKzsKKyAgICBva2F5ICArPSByaWdodDsKKworICAgIHZhbCAgICA9IDEuTCAvIHByb2IgKCBva2F5LCBjb3VudCApOworCisgICAgZnByaW50ZiAoc3RkZXJyLCAiICAgJXMgJTV1LyUtNXUgIiwgcmlnaHQgPyAiT0siIDogIi0gIiAsIG9rYXksIGNvdW50ICk7CisgICAgcHJpbnRudW1iZXIgKHZhbCk7CisgICAgaWYgKCBjb3VudCA+IDEgKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgICAlNC4yZiBiaXQiLCAwLjAxICogKGludCkobG9nZHVhbCh2YWwpIC8gKGNvdW50LTEpICogMTAwLikgKTsKKyAgICBmcHJpbnRmICggc3RkZXJyLCAiXG4iICk7Cit9CisKKwordHlwZWRlZiBzaWduZWQgc2hvcnQgIHNhbXBsZV90OwordHlwZWRlZiBzYW1wbGVfdCAgICAgIG1vbm9fdCAgIFsxXTsKK3R5cGVkZWYgc2FtcGxlX3QgICAgICBzdGVyZW9fdCBbMl07Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICBuOworICAgIGxvbmcgZG91YmxlICAgICAgICAgeDsKKyAgICBsb25nIGRvdWJsZSAgICAgICAgIHgyOworICAgIGxvbmcgZG91YmxlICAgICAgICAgeTsKKyAgICBsb25nIGRvdWJsZSAgICAgICAgIHkyOworICAgIGxvbmcgZG91YmxlICAgICAgICAgeHk7Cit9IGtvcnJfdDsKKworCit2b2lkICBhbmFseXplX3N0ZXJlbyAoIGNvbnN0IHN0ZXJlb190KiBwMSwgY29uc3Qgc3RlcmVvX3QqIHAyLCBzaXplX3QgbGVuLCBrb3JyX3QqIGNvbnN0IGsgKQoreworICAgIGxvbmcgZG91YmxlICBfeCA9IDAsIF94MiA9IDAsIF95ID0gMCwgX3kyID0gMCwgX3h5ID0gMDsKKyAgICBkb3VibGUgICAgICAgdDE7CisgICAgZG91YmxlICAgICAgIHQyOworCisgICAgayAtPiBuICArPSAyKmxlbjsKKworICAgIGZvciAoIDsgbGVuLS07IHAxKyssIHAyKysgKSB7CisgICAgICAgIF94ICArPSAodDEgPSAoKnAxKVswXSk7IF94MiArPSB0MSAqIHQxOworICAgICAgICBfeSAgKz0gKHQyID0gKCpwMilbMF0pOyBfeTIgKz0gdDIgKiB0MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3h5ICs9IHQxICogdDI7CisgICAgICAgIF94ICArPSAodDEgPSAoKnAxKVsxXSk7IF94MiArPSB0MSAqIHQxOworICAgICAgICBfeSAgKz0gKHQyID0gKCpwMilbMV0pOyBfeTIgKz0gdDIgKiB0MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3h5ICs9IHQxICogdDI7CisgICAgfQorCisgICAgayAtPiB4ICArPSBfeCA7CisgICAgayAtPiB4MiArPSBfeDI7CisgICAgayAtPiB5ICArPSBfeSA7CisgICAgayAtPiB5MiArPSBfeTI7CisgICAgayAtPiB4eSArPSBfeHk7Cit9CisKK2ludCAgc2duICggZG91YmxlIHggKQoreworICAgIGlmICggeCA9PSAwICkgcmV0dXJuIDA7CisgICAgaWYgKCB4IDwgIDAgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuICsxOworfQorCitsb25nIGRvdWJsZSAgcmVwb3J0ICggY29uc3Qga29ycl90KiBjb25zdCBrICkKK3sKKyAgICBsb25nIGRvdWJsZSAgcjsKKyAgICBsb25nIGRvdWJsZSAgc3g7CisgICAgbG9uZyBkb3VibGUgIHN5OworICAgIGxvbmcgZG91YmxlICB4OworICAgIGxvbmcgZG91YmxlICB5OworICAgIGxvbmcgZG91YmxlICBiOworCisgICAgciAgPSAoay0+eDIqay0+biAtIGstPngqay0+eCkgKiAoay0+eTIqay0+biAtIGstPnkqay0+eSk7CisgICAgciAgPSByICA+IDAubCAgPyAgKGstPnh5KmstPm4gLSBrLT54KmstPnkpIC8gc3FydCAocikgIDogIDEubDsKKyAgICBzeCA9IGstPm4gPiAxICA/ICBzcXJ0ICggKGstPngyIC0gay0+eCprLT54L2stPm4pIC8gKGstPm4gLSAxKSApICA6ICAwLmw7CisgICAgc3kgPSBrLT5uID4gMSAgPyAgc3FydCAoIChrLT55MiAtIGstPnkqay0+eS9rLT5uKSAvIChrLT5uIC0gMSkgKSAgOiAgMC5sOworICAgIHggID0gay0+biA+IDAgID8gIGstPngvay0+biAgOiAgMC5sOworICAgIHkgID0gay0+biA+IDAgID8gIGstPnkvay0+biAgOiAgMC5sOworCisgICAgYiAgPSBzeCAhPSAwICAgPyAgc3kvc3ggKiBzZ24ocikgIDogIDAubDsKKyAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgInI9JUxmICBzeD0lTGYgIHN5PSVMZiAgeD0lTGYgIHk9JUxmICBiPSVMZlxuIiwgciwgc3gsIHN5LCB4LCB5LCBiICk7CisgICAgcmV0dXJuIGI7Cit9CisKKworLyogSW5wdXQ6IGFuIHVuc2lnbmVkIHNob3J0IG4uCisgKiBPdXRwdXQ6IHRoZSBzd2FwcGVkIGJ5dGVzIG9mIG4gaWYgdGhlIGFyY2ggaXMgYmlnLWVuZGlhbiBvciBuIGl0c2VsZgorICogICAgICAgICBpZiB0aGUgYXJjaCBpcyBsaXR0bGUtZW5kaWFuLgorICogQ29tbWVudDogc2hvdWxkIGJlIHJlcGxhY2VkIGxhdHRlciB3aXRoIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gdGhpcworICogICAgICAgICAgaG9tZS1icmV3ZWQgaGFjayAocmJyaXRvKS4gVGhlIG5hbWUgc2hvdWxkIGJlIGJldHRlciBhbHNvLgorICovCitpbmxpbmUgdW5zaWduZWQgc2hvcnQgYmUxNl9sZSh1bnNpZ25lZCBzaG9ydCBuKQoreworI2lmZGVmIF9XT1JEU19CSUdFTkRJQU4KKyAgICAgcmV0dXJuIChuIDw8IDgpIHwgKG4gPj4gOCk7CisjZWxzZQorICAgICByZXR1cm4gbjsKKyNlbmRpZgorfQorCisKK2ludCBmZWVkICggaW50IGZkLCBjb25zdCBzdGVyZW9fdCogcCwgaW50IGxlbiApCit7CisgICAgIGludCBpOworICAgICBzdGVyZW9fdCB0bXBbMzAwMDBdOwkvKiBBbiBhcmJpdHJhcnkgc2l6ZS0tdG8gYmUgY2hhbmdlZCBsYXR0ZXIgKi8KKworICAgICBpZiAobGVuID4gc2l6ZW9mKHRtcCkvc2l6ZW9mKCp0bXApKQorCSAgbGVuID0gc2l6ZW9mKHRtcCkvc2l6ZW9mKCp0bXApOworCisgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCSAgdG1wW2ldWzBdID0gYmUxNl9sZShwW2ldWzBdKTsKKwkgIHRtcFtpXVsxXSA9IGJlMTZfbGUocFtpXVsxXSk7CisgICAgIH0KKworICAgICB3cml0ZSAoIGZkLCB0bXAsIHNpemVvZihzdGVyZW9fdCkgKiBsZW4gKTsKKyAgICAgcmV0dXJuIGxlbjsKK30KKworCitzaG9ydCAgcm91bmQgKCBkb3VibGUgZiApCit7CisgICAgbG9uZyAgeCA9IChsb25nKSBmbG9vciAoIGYgKyAwLjUgKTsKKyAgICByZXR1cm4geCA9PSAoc2hvcnQpeCAgPyAgKHNob3J0KXggIDogIChzaG9ydCkgKCh4ID4+IDMxKSBeIDB4N0ZGRik7Cit9CisKKworaW50ICBmZWVkMiAoIGludCBmZCwgY29uc3Qgc3RlcmVvX3QqIHAxLCBjb25zdCBzdGVyZW9fdCogcDIsIGludCBsZW4gKQoreworICAgICBzdGVyZW9fdCAgdG1wIFszMDAwMF07ICAgLyogQW4gYXJiaXRyYXJ5IHNpemUsIGhvcGUgdGhhdCBubyBvdmVycnVucyBvY2N1cmUgKi8KKyAgICAgaW50ICAgICAgIGk7CisKKyAgICAgaWYgKGxlbiA+IHNpemVvZih0bXApL3NpemVvZigqdG1wKSkKKwkgIGxlbiA9IHNpemVvZih0bXApL3NpemVvZigqdG1wKTsKKyAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKwkgIGRvdWJsZSBmID0gY29zICggTV9QSS8yKmkvbGVuICk7CisJICBmICo9IGY7CisJICB0bXAgW2ldIFswXSA9IGJlMTZfbGUocm91bmQgKCBwMSBbaV0gWzBdICogZiArIHAyIFtpXSBbMF0gKiAoMS4gLSBmKSApKTsKKwkgIHRtcCBbaV0gWzFdID0gYmUxNl9sZShyb3VuZCAoIHAxIFtpXSBbMV0gKiBmICsgcDIgW2ldIFsxXSAqICgxLiAtIGYpICkpOworICAgICB9CisKKyAgICAgd3JpdGUgKCBmZCwgdG1wLCBzaXplb2Yoc3RlcmVvX3QpICogbGVuICk7CisgICAgIHJldHVybiBsZW47Cit9CisKKworaW50IGZlZWRmYWMgKCBpbnQgZmQsIGNvbnN0IHN0ZXJlb190KiBwMSwgY29uc3Qgc3RlcmVvX3QqIHAyLCBpbnQgbGVuLCBkb3VibGUgZmFjMSwgZG91YmxlIGZhYzIgKQoreworICAgICBzdGVyZW9fdCAgdG1wIFszMDAwMF07ICAgLyogQW4gYXJiaXRyYXJ5IHNpemUsIGhvcGUgdGhhdCBubyBvdmVycnVucyBvY2N1cmUgKi8KKyAgICAgaW50ICAgICAgIGk7CisKKyAgICAgaWYgKGxlbiA+IHNpemVvZih0bXApL3NpemVvZigqdG1wKSkKKwkgIGxlbiA9IHNpemVvZih0bXApL3NpemVvZigqdG1wKTsKKyAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKwkgIHRtcCBbaV0gWzBdID0gYmUxNl9sZShyb3VuZCAoIHAxIFtpXSBbMF0gKiBmYWMxICsgcDIgW2ldIFswXSAqIGZhYzIgKSk7CisJICB0bXAgW2ldIFsxXSA9IGJlMTZfbGUocm91bmQgKCBwMSBbaV0gWzFdICogZmFjMSArIHAyIFtpXSBbMV0gKiBmYWMyICkpOworICAgIH0KKworICAgIHdyaXRlICggZmQsIHRtcCwgc2l6ZW9mKHN0ZXJlb190KSAqIGxlbiApOworICAgIHJldHVybiBsZW47Cit9CisKKwordm9pZCBzZXR1cCAoIGludCBmZGQsIGludCBzYW1wbGVzLCBsb25nIGZyZXEgKQoreworICAgIGludCBzdGF0dXMsIG9yZywgYXJnOworCisgICAgLy8gTmFjaCB2b3JuIHZlcnNjaG9iZW4KKyAgICBpZiAoIC0xID09IChzdGF0dXMgPSBpb2N0bCAoZmRkLCBTT1VORF9QQ01fU1lOQywgMCkpICkKKyAgICAgICAgcGVycm9yICgiU09VTkRfUENNX1NZTkMgaW9jdGwgZmFpbGVkIik7CisKKyAgICBvcmcgPSBhcmcgPSAyOworICAgIGlmICggLTEgPT0gKHN0YXR1cyA9IGlvY3RsIChmZGQsIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMUywgJmFyZykpICkKKyAgICAgICAgcGVycm9yICgiU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTIGlvY3RsIGZhaWxlZCIpOworICAgIGlmIChhcmcgIT0gb3JnKQorICAgICAgICBwZXJyb3IgKCJ1bmFibGUgdG8gc2V0IG51bWJlciBvZiBjaGFubmVscyIpOworICAgIGZwcmludGYgKHN0ZGVyciwgIiUxdSoiLCBhcmcpOworCisgICAgb3JnID0gYXJnID0gQUZNVF9TMTZfTEU7CisgICAgaWYgKCAtMSA9PSBpb2N0bCAoZmRkLCBTTkRDVExfRFNQX1NFVEZNVCwgJmFyZykgKQorICAgICAgICBwZXJyb3IgKCJTTkRDVExfRFNQX1NFVEZNVCBpb2N0bCBmYWlsZWQiKTsKKyAgICBpZiAoKGFyZyAmIG9yZykgPT0gMCkKKyAgICAgICAgcGVycm9yICgidW5hYmxlIHRvIHNldCBkYXRhIGZvcm1hdCIpOworCisgICAgb3JnID0gYXJnID0gZnJlcTsKKyAgICBpZiAoIC0xID09IChzdGF0dXMgPSBpb2N0bCAoZmRkLCBTTkRDVExfRFNQX1NQRUVELCAmYXJnKSkgKQorICAgICAgICBwZXJyb3IgKCJTTkRDVExfRFNQX1NQRUVEIGlvY3RsIGZhaWxlZCIpOworICAgIGZwcmludGYgKHN0ZGVyciwgIiU1dSBIeiolLjNmIHNlY1xuIiwgYXJnLCAoZG91YmxlKXNhbXBsZXMvYXJnICk7CisKK30KKworCit2b2lkIE1lc3NhZ2UgKCBjb25zdCBjaGFyKiBzLCBzaXplX3QgaW5kZXgsIGxvbmcgZnJlcSwgc2l6ZV90IHN0YXJ0LCBzaXplX3Qgc3RvcCApCit7CisgICAgdW5zaWduZWQgbG9uZyAgbm9ybV9pbmRleCA9IDEwMGx1ICogaW5kZXggLyBmcmVxOworICAgIHVuc2lnbmVkIGxvbmcgIG5vcm1fc3RhcnQgPSAxMDBsdSAqIHN0YXJ0IC8gZnJlcTsKKyAgICB1bnNpZ25lZCBsb25nICBub3JtX3N0b3AgID0gMTAwbHUgKiBzdG9wICAvIGZyZXE7CisKKyAgICBmcHJpbnRmICggc3RkZXJyLCAiXHJMaXN0ZW5pbmcgJXMgICUybHU6JTAybHUuJTAybHUgICglMWx1OiUwMmx1LiUwMmx1Li4uJTFsdTolMDJsdS4lMDJsdSklKi4qc1xyTGlzdGVuaW5nICVzIiwKKyAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgbm9ybV9pbmRleCAvIDYwMDAsIG5vcm1faW5kZXggLyAxMDAgJSA2MCwgbm9ybV9pbmRleCAlIDEwMCwKKyAgICAgICAgICAgICAgbm9ybV9zdGFydCAvIDYwMDAsIG5vcm1fc3RhcnQgLyAxMDAgJSA2MCwgbm9ybV9zdGFydCAlIDEwMCwKKyAgICAgICAgICAgICAgbm9ybV9zdG9wICAvIDYwMDAsIG5vcm1fc3RvcCAgLyAxMDAgJSA2MCwgbm9ybV9zdG9wICAlIDEwMCwKKyAgICAgICAgICAgICAgMzYgLSAoaW50KXN0cmxlbihzKSwgMzYgLSAoaW50KXN0cmxlbihzKSwgIiIsCisgICAgICAgICAgICAgIHMgKTsKKworICAgIGZmbHVzaCAgKCBzdGRlcnIgKTsKK30KKworCitzaXplX3QgIGNhbGNfdHJ1ZV9pbmRleCAoIHNpemVfdCBpbmRleCwgc2l6ZV90IHN0YXJ0LCBzaXplX3Qgc3RvcCApCit7CisgICAgaWYgKCBzdGFydCA+PSBzdG9wICkKKyAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgIHdoaWxlICggaW5kZXggLSBzdGFydCA8IERNQV9TQU1QTEVTICkKKyAgICAgICAgaW5kZXggKz0gc3RvcCAtIHN0YXJ0OworICAgIHJldHVybiBpbmRleCAtIERNQV9TQU1QTEVTOworfQorCisKK3ZvaWQgdGVzdGluZyAoIGNvbnN0IHN0ZXJlb190KiBBLCBjb25zdCBzdGVyZW9fdCogQiwgc2l6ZV90IGxlbiwgbG9uZyBmcmVxICkKK3sKKyAgICBpbnQgICAgIGM7CisgICAgaW50ICAgICBmZCAgICA9IG9wZW4gKCAiL2Rldi9kc3AiLCBPX1dST05MWSApOworICAgIGludCAgICAgcm5kICAgPSByYW5kb21fbnVtYmVyICgpOyAgIC8qIEF1c3dhaGwgdm9uIFggKi8KKyAgICBpbnQgICAgIHN0YXRlID0gMDsgICAgICAgICAgICAgICAgICAvKiBkZXJ6ZWl0aWdlciBG77+9dHR1bmdzbW9kdXMgKi8KKyAgICBmbG9hdCAgIGZhYzEgID0gMC41OworICAgIGZsb2F0ICAgZmFjMiAgPSAwLjU7CisgICAgc2l6ZV90ICBzdGFydCA9IDA7CisgICAgc2l6ZV90ICBzdG9wICA9IGxlbjsKKyAgICBzaXplX3QgIGluZGV4ID0gc3RhcnQ7ICAgICAgICAgICAgICAgICAgLyogZGVyemVpdGlnZXIgT2Zmc2V0IGF1ZiBkZW4gQXVkaW9zdHLvv71tZW4gKi8KKyAgICBjaGFyICAgIG1lc3NhZ2UgWzgwXSA9ICJBICAiOworCisgICAgc2V0dXAgKCBmZCwgbGVuLCBmcmVxICk7CisKKyAgICB3aGlsZSAoIDEgKSB7CisgICAgICAgIGMgPSBzZWwgKCk7CisgICAgICAgIGlmICggYyA9PSAyNyApCisgICAgICAgICAgICBjID0gc2VsICgpICsgMHgxMDA7CisKKyAgICAgICAgc3dpdGNoICggYyApIHsKKyAgICAgICAgY2FzZSAnQScgOgorICAgICAgICBjYXNlICdhJyA6CisgICAgICAgICAgICBzdHJjcHkgKCBtZXNzYWdlLCAiQSAgIiApOworICAgICAgICAgICAgaWYgKCBzdGF0ZSAhPSAwICkKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MTAwKycwJyA6CisgICAgICAgIGNhc2UgJzAnIDoKKyAgICAgICAgY2FzZSAnQicgOgorICAgICAgICBjYXNlICdiJyA6CisgICAgICAgICAgICBzdHJjcHkgKCBtZXNzYWdlLCAiICBCIiApOworICAgICAgICAgICAgaWYgKCBzdGF0ZSAhPSAxICkKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdYJyA6CisgICAgICAgIGNhc2UgJ3gnIDoKKyAgICAgICAgICAgIHN0cmNweSAoIG1lc3NhZ2UsICIgWCAiICk7CisgICAgICAgICAgICBpZiAoIHN0YXRlICE9IHJuZCApCisgICAgICAgICAgICAgICAgc3RhdGUgPSBybmQgKyAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnbScgOgorICAgICAgICAgICAgc3RhdGUgPSA4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnTScgOgorICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgJiAxKSArIDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd4JyYweDFGOgorICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgJiAxKSArIDY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIHN0b3AgID0gbGVuOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnbycgIDoKKwkgICAgc3RhcnQgPSBjYWxjX3RydWVfaW5kZXggKCBpbmRleCwgc3RhcnQsIHN0b3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnICA6CisJICAgIHN0b3AgID0gY2FsY190cnVlX2luZGV4ICggaW5kZXgsIHN0YXJ0LCBzdG9wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdoJyAgOgorICAgICAgICAgICAgaWYgKCBzdGFydCA+IGZyZXEvMTAwICkKKyAgICAgICAgICAgICAgICBzdGFydCAtPSBmcmVxLzEwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICBpbmRleCA9IHN0YXJ0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ2onICA6CisgICAgICAgICAgICBpZiAoIHN0YXJ0IDwgc3RvcC1mcmVxLzEwMCApCisgICAgICAgICAgICAgICAgc3RhcnQgKz0gZnJlcS8xMDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RhcnQgPSBzdG9wOworICAgICAgICAgICAgaW5kZXggPSBzdGFydDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdrJyAgOgorICAgICAgICAgICAgaWYgKCBzdG9wID4gc3RhcnQrZnJlcS8xMDAgKQorICAgICAgICAgICAgICAgIHN0b3AgLT0gZnJlcS8xMDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RvcCA9IHN0YXJ0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ2wnICA6CisgICAgICAgICAgICBpZiAoIHN0b3AgPCBsZW4tZnJlcS8xMDAgKQorICAgICAgICAgICAgICAgIHN0b3AgKz0gZnJlcS8xMDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RvcCA9IGxlbjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICBpbmRleCA9IHN0YXJ0OworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY2FzZSAnRCcrMHgxMDA6CisgICAgICAgICAgICBzdHJjcHkgKCBtZXNzYWdlLCAiRGlmZmVyZW5jZSAoKzQwIGRCKSIgKTsKKyAgICAgICAgICAgIHN0YXRlID0gOTsKKyAgICAgICAgICAgIGZhYzEgID0gLTEwMC47CisgICAgICAgICAgICBmYWMyICA9ICsxMDAuOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCcrMHgxMDA6CisgICAgICAgICAgICBzdHJjcHkgKCBtZXNzYWdlLCAiRGlmZmVyZW5jZSAoKzMwIGRCKSIgKTsKKyAgICAgICAgICAgIHN0YXRlID0gOTsKKyAgICAgICAgICAgIGZhYzEgID0gLTMyLjsKKyAgICAgICAgICAgIGZhYzIgID0gKzMyLjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ0QnICYgMHgxRiA6CisgICAgICAgICAgICBzdHJjcHkgKCBtZXNzYWdlLCAiRGlmZmVyZW5jZSAoKzIwIGRCKSIgKTsKKyAgICAgICAgICAgIHN0YXRlID0gOTsKKyAgICAgICAgICAgIGZhYzEgID0gLTEwLjsKKyAgICAgICAgICAgIGZhYzIgID0gKzEwLjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ0QnIDoKKyAgICAgICAgICAgIHN0cmNweSAoIG1lc3NhZ2UsICJEaWZmZXJlbmNlICgrMTAgZEIpIiApOworICAgICAgICAgICAgc3RhdGUgPSA5OworICAgICAgICAgICAgZmFjMSAgPSAtMy47CisgICAgICAgICAgICBmYWMyICA9ICszLjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnIDoKKyAgICAgICAgICAgIHN0cmNweSAoIG1lc3NhZ2UsICJEaWZmZXJlbmNlICggIDAgZEIpIiApOworICAgICAgICAgICAgc3RhdGUgPSA5OworICAgICAgICAgICAgZmFjMSAgPSAtMS47CisgICAgICAgICAgICBmYWMyICA9ICsxLjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgxMDArJzEnIDoKKyAgICAgICAgY2FzZSAweDEwMCsnMicgOgorICAgICAgICBjYXNlIDB4MTAwKyczJyA6CisgICAgICAgIGNhc2UgMHgxMDArJzQnIDoKKyAgICAgICAgY2FzZSAweDEwMCsnNScgOgorICAgICAgICBjYXNlIDB4MTAwKyc2JyA6CisgICAgICAgIGNhc2UgMHgxMDArJzcnIDoKKyAgICAgICAgY2FzZSAweDEwMCsnOCcgOgorICAgICAgICBjYXNlIDB4MTAwKyc5JyA6CisgICAgICAgICAgICBzcHJpbnRmICggbWVzc2FnZSwgIiAgQiAoRXJyb3JzIC0lYyBkQikiLCAoY2hhciljICk7CisgICAgICAgICAgICBzdGF0ZSA9IDk7CisgICAgICAgICAgICBmYWMyICA9IHBvdyAoMTAuLCAtMC4wNSooYy0weDEwMC0nMCcpICk7CisgICAgICAgICAgICBmYWMxICA9IDEuIC0gZmFjMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJzEnIDoKKyAgICAgICAgY2FzZSAnMicgOgorICAgICAgICBjYXNlICczJyA6CisgICAgICAgIGNhc2UgJzQnIDoKKyAgICAgICAgY2FzZSAnNScgOgorICAgICAgICBjYXNlICc2JyA6CisgICAgICAgIGNhc2UgJzcnIDoKKyAgICAgICAgY2FzZSAnOCcgOgorICAgICAgICBjYXNlICc5JyA6CisgICAgICAgICAgICBzcHJpbnRmICggbWVzc2FnZSwgIiAgQiAoRXJyb3JzICslYyBkQikiLCBjICk7CisgICAgICAgICAgICBzdGF0ZSA9IDk7CisgICAgICAgICAgICBmYWMyICA9IHBvdyAoMTAuLCAwLjA1KihjLScwJykgKTsKKyAgICAgICAgICAgIGZhYzEgID0gMS4gLSBmYWMyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnQScgJiAweDFGOgorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAgVm90ZSBmb3IgWDo9QSIgKTsKKyAgICAgICAgICAgIGV2YWwgKCBybmQgPT0gMCApOworICAgICAgICAgICAgcm5kICAgPSByYW5kb21fbnVtYmVyICgpOworICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PSA2ICAmJiAgc3RhdGUgPT0gNyApCisgICAgICAgICAgICAgICAgc3RhdGUgPSA2ICsgcm5kOworICAgICAgICAgICAgZWxzZSBpZiAoIHN0YXRlICE9IHJuZCApCisgICAgICAgICAgICAgICAgc3RhdGUgPSBybmQgKyAyOworICAgICAgICAgICAgc3RyY3B5ICggbWVzc2FnZSwiIFggIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnQicgJiAweDFGOgorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAgVm90ZSBmb3IgWDo9QiIgKTsKKyAgICAgICAgICAgIGV2YWwgKCBybmQgPT0gMSApOworICAgICAgICAgICAgcm5kICAgPSByYW5kb21fbnVtYmVyICgpOworICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PSA2ICAmJiAgc3RhdGUgPT0gNyApCisgICAgICAgICAgICAgICAgc3RhdGUgPSA2ICsgcm5kOworICAgICAgICAgICAgZWxzZSBpZiAoIHN0YXRlICE9IHJuZCApCisgICAgICAgICAgICAgICAgc3RhdGUgPSBybmQgKyAyOworICAgICAgICAgICAgc3RyY3B5ICggbWVzc2FnZSwiIFggIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJcYSIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ1EnOgorICAgICAgICBjYXNlICdxJzoKKyAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJcbiUtNzkuNzlzXHIiLCAiUXVpdCBwcm9ncmFtIiApOworICAgICAgICAgICAgY2xvc2UgKGZkKTsKKyAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJcblxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgMDogLyogQSAqLworICAgICAgICAgICAgaWYgKCBpbmRleCArIEJGID49IHN0b3AgKQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQgKGZkLCBBK2luZGV4LCBzdG9wLWluZGV4ICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZCAoZmQsIEEraW5kZXgsIEJGICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6IC8qIEIgKi8KKyAgICAgICAgICAgIGlmICggaW5kZXggKyBCRiA+PSBzdG9wICkKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkIChmZCwgQitpbmRleCwgc3RvcC1pbmRleCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQgKGZkLCBCK2luZGV4LCBCRiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOiAvKiBCID0+IEEgKi8KKyAgICAgICAgICAgIGlmICggaW5kZXggKyBCRiA+PSBzdG9wICkKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkMiAoZmQsIEIraW5kZXgsIEEraW5kZXgsIHN0b3AtaW5kZXggKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkMiAoZmQsIEIraW5kZXgsIEEraW5kZXgsIEJGICk7CisgICAgICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6IC8qIEEgPT4gQiAqLworICAgICAgICAgICAgaWYgKCBpbmRleCArIEJGID49IHN0b3AgKQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQyIChmZCwgQStpbmRleCwgQitpbmRleCwgc3RvcC1pbmRleCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQyIChmZCwgQStpbmRleCwgQitpbmRleCwgQkYgKTsKKyAgICAgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDogLyogQSAqLworICAgICAgICAgICAgc3RyY3B5ICggbWVzc2FnZSwgIkEgICIgKTsKKyAgICAgICAgICAgIGlmICggaW5kZXggKyBCRiA+PSBzdG9wICkKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkIChmZCwgQStpbmRleCwgc3RvcC1pbmRleCApLAorICAgICAgICAgICAgICAgIHN0YXRlKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZCAoZmQsIEEraW5kZXgsIEJGICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6IC8qIEIgKi8KKyAgICAgICAgICAgIHN0cmNweSAoIG1lc3NhZ2UsICIgIEIiICk7CisgICAgICAgICAgICBpZiAoIGluZGV4ICsgQkYgPj0gc3RvcCApCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZCAoZmQsIEIraW5kZXgsIHN0b3AtaW5kZXggKSwKKyAgICAgICAgICAgICAgICBzdGF0ZS0tOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQgKGZkLCBCK2luZGV4LCBCRiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA2OiAvKiBYICovCisgICAgICAgICAgICBzdHJjcHkgKCBtZXNzYWdlLCAiIFggIiApOworICAgICAgICAgICAgaWYgKCBpbmRleCArIEJGID49IHN0b3AgKQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQgKGZkLCAocm5kID8gQiA6IEEpK2luZGV4LCBzdG9wLWluZGV4ICksCisgICAgICAgICAgICAgICAgc3RhdGUrKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkIChmZCwgKHJuZCA/IEIgOiBBKStpbmRleCwgQkYgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNzogLyogIVggKi8KKyAgICAgICAgICAgIHN0cmNweSAoIG1lc3NhZ2UsICIhWCAiICk7CisgICAgICAgICAgICBpZiAoIGluZGV4ICsgQkYgPj0gc3RvcCApCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZCAoZmQsIChybmQgPyBBIDogQikraW5kZXgsIHN0b3AtaW5kZXggKSwKKyAgICAgICAgICAgICAgICBzdGF0ZS0tOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQgKGZkLCAocm5kID8gQSA6IEIpK2luZGV4LCBCRiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgaWYgKCBpbmRleCArIEJGLzIgPj0gc3RvcCApCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZDIgKGZkLCBBK2luZGV4LCBCK2luZGV4LCBzdG9wLWluZGV4ICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZDIgKGZkLCBBK2luZGV4LCBCK2luZGV4LCBCRi8yICk7CisgICAgICAgICAgICBNZXNzYWdlICggIiAgQiIsIGluZGV4LCBmcmVxLCBzdGFydCwgc3RvcCApOworICAgICAgICAgICAgaWYgKCBpbmRleCArIEJGID49IHN0b3AgKQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWQgKGZkLCBCK2luZGV4LCBzdG9wLWluZGV4ICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZCAoZmQsIEIraW5kZXgsIEJGICk7CisgICAgICAgICAgICBpZiAoIGluZGV4ICsgQkYvMiA+PSBzdG9wICkKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkMiAoZmQsIEIraW5kZXgsIEEraW5kZXgsIHN0b3AtaW5kZXggKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkMiAoZmQsIEIraW5kZXgsIEEraW5kZXgsIEJGLzIgKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgKCAiQSAgIiwgaW5kZXgsIGZyZXEsIHN0YXJ0LCBzdG9wICk7CisgICAgICAgICAgICBpZiAoIGluZGV4ICsgQkYgPj0gc3RvcCApCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZCAoZmQsIEEraW5kZXgsIHN0b3AtaW5kZXggKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleCArPSBmZWVkIChmZCwgQStpbmRleCwgQkYgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgOTogLyogTGlrbyAqLworICAgICAgICAgICAgaWYgKCBpbmRleCArIEJGID49IHN0b3AgKQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGZlZWRmYWMgKGZkLCBBK2luZGV4LCBCK2luZGV4LCBzdG9wLWluZGV4LCBmYWMxLCBmYWMyICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5kZXggKz0gZmVlZGZhYyAoZmQsIEEraW5kZXgsIEIraW5kZXgsIEJGICAgICAgICAsIGZhYzEsIGZhYzIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQgKDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZGV4ID49IHN0b3ApCisgICAgICAgICAgICBpbmRleCA9IHN0YXJ0OworICAgICAgICBNZXNzYWdlICggbWVzc2FnZSwgY2FsY190cnVlX2luZGV4ICggaW5kZXgsIHN0YXJ0LCBzdG9wKSwgZnJlcSwgc3RhcnQsIHN0b3AgKTsKKyAgICB9Cit9CisKKworaW50ICBoYXNfZXh0ICggY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZXh0ICkKK3sKKyAgICBpZiAoIHN0cmxlbiAobmFtZSkgPCBzdHJsZW4gKGV4dCkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuYW1lICs9IHN0cmxlbiAobmFtZSkgLSBzdHJsZW4gKGV4dCk7CisgICAgcmV0dXJuIHN0cmNhc2VjbXAgKG5hbWUsIGV4dCkgID8gIDAgIDogIDE7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0ICBleHRlbnRpb247CisgICAgY29uc3QgY2hhciogY29uc3QgIGNvbW1hbmQ7Cit9IGRlY29kZXJfdDsKKworCisjZGVmaW5lIFJFRElSICAgICAiIDI+IC9kZXYvbnVsbCIKKyNkZWZpbmUgU1RET1VUICAgICIvZGV2L2ZkLzEiCisjZGVmaW5lIFBBVEggICAgICBQQVRIX09GX0VYVEVSTkFMX1RPT0xTX0ZPUl9VTkNPTVBSRVNTSU5HCisKK2NvbnN0IGRlY29kZXJfdCAgZGVjb2RlciBbXSA9IHsKKyAgICB7ICIubXAxIiAgICAsIFBBVEgibXBnMTIzIC13IC0gJXMiICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBNUEVHIExheWVyIEkgICAgICAgICA6IHd3dy5paXMuZmhnLmRlLCB3d3cubXBlZy5vcmcKKyAgICB7ICIubXAyIiAgICAsIFBBVEgibXBnMTIzIC13IC0gJXMiICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBNUEVHIExheWVyIElJICAgICAgICA6IHd3dy5paXMuZmhnLmRlLCB3d3cudXEubmV0LmF1L356em1jaGVuZywgd3d3Lm1wZWcub3JnCisgICAgeyAiLm1wMyIgICAgLCBQQVRIIm1wZzEyMyAtdyAtICVzIiAgICAgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gTVBFRyBMYXllciBJSUkgICAgICAgOiB3d3cuaWlzLmZoZy5kZSwgd3d3Lm1wM2Rldi5vcmcsIHd3dy5tcGVnLm9yZworICAgIHsgIi5tcDNwcm8iICwgUEFUSCJtcGcxMjMgLXcgLSAlcyIgICAgICAgICAgICAgICAgICAgICAgICAgUkVESVIgfSwgIC8vIE1QRUcgTGF5ZXIgSUlJICAgICAgIDogd3d3Lmlpcy5maGcuZGUsIHd3dy5tcDNkZXYub3JnLCB3d3cubXBlZy5vcmcKKyAgICB7ICIubXB0IiAgICAsIFBBVEgibXBnMTIzIC13IC0gJXMiICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBNUEVHIExheWVyIElJSSAgICAgICA6IHd3dy5paXMuZmhnLmRlLCB3d3cubXAzZGV2Lm9yZywgd3d3Lm1wZWcub3JnCisgICAgeyAiLm1wcCIgICAgLCBQQVRIIm1wcGRlYyAlcyAtIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gTVBFR3BsdXMgICAgICAgICAgICAgOiB3d3cuc3R1ZC51bmktaGFubm92ZXIuZGUvdXNlci83Mzg4NAorICAgIHsgIi5tcGMiICAgICwgUEFUSCJtcHBkZWMgJXMgLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVESVIgfSwgIC8vIE1QRUdwbHVzICAgICAgICAgICAgIDogd3d3LnN0dWQudW5pLWhhbm5vdmVyLmRlL3VzZXIvNzM4ODQKKyAgICB7ICIubXArIiAgICAsIFBBVEgibXBwZGVjICVzIC0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBNUEVHcGx1cyAgICAgICAgICAgICA6IHd3dy5zdHVkLnVuaS1oYW5ub3Zlci5kZS91c2VyLzczODg0CisgICAgeyAiLmFhYyIgICAgLCBQQVRIImZhYWQgLXQud2F2IC13ICVzIiAgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gQWR2YW5jZWQgQXVkaW8gQ29kaW5nOiBwc3l0ZWwuaHlwZXJtYXJ0Lm5ldCwgd3d3LmFhYy10ZWNoLmNvbSwgc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2ZhYWMsIHd3dy5hYWMtYXVkaW8uY29tLCB3d3cubXBlZy5vcmcKKyAgICB7ICJhYWMubHF0IiAsIFBBVEgiZmFhZCAtdC53YXYgLXcgJXMiICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBBZHZhbmNlZCBBdWRpbyBDb2Rpbmc6IHBzeXRlbC5oeXBlcm1hcnQubmV0LCB3d3cuYWFjLXRlY2guY29tLCBzb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZmFhYywgd3d3LmFhYy1hdWRpby5jb20sIHd3dy5tcGVnLm9yZworICAgIHsgIi5hYzMiICAgICwgUEFUSCJhYzNkZWMgJXMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVESVIgfSwgIC8vIERvbGJ5IEFDMyAgICAgICAgICAgIDogd3d3LmF0dC5jb20KKyAgICB7ICJhYzMubHF0IiAsIFBBVEgiYWMzZGVjICVzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBEb2xieSBBQzMgICAgICAgICAgICA6IHd3dy5hdHQuY29tCisgICAgeyAiLm9nZyIgICAgLCBQQVRIIm9nZzEyMyAtZCB3YXYgLW8gZmlsZToiU1RET1VUIiAlcyIgICAgICBSRURJUiB9LCAgLy8gT2dnIFZvcmJpcyAgICAgICAgICAgOiB3d3cueGlwaC5vcmcvb2dnL3ZvcmJpcy9pbmRleC5odG1sCisgICAgeyAiLnBhYyIgICAgLCBQQVRIImxwYWMgLXggJXMgIlNURE9VVCAgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gTG9zc2xlc3MgcHJlZGljdGl2ZSBBdWRpbyBDb21wcmVzc2lvbjogd3d3LWZ0LmVlLnR1LWJlcmxpbi5kZS9+bGllYmNoZW4vbHBhYy5odG1sIChsaWViY2hlbkBmdC5lZS50dS1iZXJsaW4uZGUpCisgICAgeyAiLnNobiIgICAgLCBQQVRIInNob3J0ZW4gLXggPCAlcyIgICAgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gU2hvcnRlbiAgICAgICAgICAgICAgOiBzaG51dGlscy5mcmVlc2hlbGwub3JnLCB3d3cuc29mdHNvdW5kLmNvbS9TaG9ydGVuLmh0bWwgKHNobnV0aWxzQGZyZWVzaGVsbC5vcmcsIHNob3J0ZW5Ac29mdHNvdW5kLmNvbSkKKyAgICB7ICIud2F2Lmd6IiAsIFBBVEgiZ3ppcCAgLWQgPCAlcyB8IHNveCAtdHdhdiAtIC10d2F2IC1zdyAtIlJFRElSIH0sICAvLyBnemlwZWQgV0FWCisgICAgeyAiLndhdi5zeiIgLCBQQVRIInN6aXAgIC1kIDwgJXMgfCBzb3ggLXR3YXYgLSAtdHdhdiAtc3cgLSJSRURJUiB9LCAgLy8gc3ppcGVkIFdBVgorICAgIHsgIi53YXYuc3oyIiwgUEFUSCJzemlwMiAtZCA8ICVzIHwgc294IC10d2F2IC0gLXR3YXYgLXN3IC0iUkVESVIgfSwgIC8vIHN6aXBlZCBXQVYKKyAgICB7ICIucmF3IiAgICAsIFBBVEgic294IC1yNDQxMDAgLXN3IC1jMiAtdHJhdyAlcyAtdHdhdiAtc3cgLSJSRURJUiB9LCAgLy8gcmF3IGZpbGVzIGFyZSB0cmVhdGVkIGFzIENEIGxpa2UgYXVkaW8KKyAgICB7ICIuY2RyIiAgICAsIFBBVEgic294IC1yNDQxMDAgLXN3IC1jMiAtdHJhdyAlcyAtdHdhdiAtc3cgLSJSRURJUiB9LCAgLy8gQ0QtREEgZmlsZXMgYXJlIHRyZWF0ZWQgYXMgQ0QgbGlrZSBhdWRpbywgbm8gcHJlZW1waGFzaXMgaW5mbyBhdmFpbGFibGUKKyAgICB7ICIucm0iICAgICAsICJlY2hvICVzICc/Pz8nIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBSZWFsIEF1ZGlvICAgICAgICAgICA6IHd3dy5yZWFsLmNvbQorICAgIHsgIi5lcGMiICAgICwgImVjaG8gJXMgJz8/PyciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVESVIgfSwgIC8vIGVQQUMgICAgICAgICAgICAgICAgIDogd3d3LmF1ZGlvdmVkYS5jb20sIHd3dy5sdWNlbnQuY29tL2xkcgorICAgIHsgIi5tb3YiICAgICwgImVjaG8gJXMgJz8/PyciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVESVIgfSwgIC8vIFFEZXNpZ24gTXVzaWMgMiAgICAgIDogd3d3LnFkZXNpZ24uY29tCisgICAgeyAiLnZxZiIgICAgLCAiZWNobyAlcyAnPz8/JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gVHdpblZRICAgICAgICAgICAgICAgOiB3d3cueWFtYWhhLXhnLmNvbS9lbmdsaXNoL3hnL1NvdW5kVlEsIHd3dy52cWYuY29tLCBzb3VuZC5zcGxhYi5lY2wubnR0LmNvLmpwL3R3aW52cS1lCisgICAgeyAiLndtYSIgICAgLCAiZWNobyAlcyAnPz8/JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gTWljcm9zb2Z0IE1lZGlhIEF1ZGlvOiB3d3cud2luZG93c21lZGlhLmNvbSwgd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93cy93aW5kb3dzbWVkaWEKKyAgICB7ICIuZmxhYyIgICAsIFBBVEgiZmxhYyAtYyAtZCAlcyIgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVyOiBmbGFjLnNvdXJjZWZvcmdlLm5ldC8KKyAgICB7ICIuZmxhIiAgICAsIFBBVEgiZmxhYyAtYyAtZCAlcyIgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVyOiBmbGFjLnNvdXJjZWZvcmdlLm5ldC8KKyAgICB7ICIuYXBlIiAgICAsICIoICJQQVRIIk1BQyAlcyBfLl8ud2F2IC1kID4gL2Rldi9udWxsOyBjYXQgXy5fLndhdjsgcm0gXy5fLndhdiApIiAgUkVESVIgfSwgIC8vIE1vbmtleSdzIEF1ZGlvIENvZGVjIDogd3d3Lm1vbmtleXNhdWRpby5jb20gKGVtYWlsQG1vbmtleXNhdWRpby5jb20pCisgICAgeyAiLnJrYSIgICAgLCAiKCAiUEFUSCJya2F1ICVzIF8uXy53YXYgICA+IC9kZXYvbnVsbDsgY2F0IF8uXy53YXY7IHJtIF8uXy53YXYgKSIgIFJFRElSIH0sICAvLyBSSyBBdWRpbzoKKyAgICB7ICIucmthdSIgICAsICIoICJQQVRIInJrYXUgJXMgXy5fLndhdiAgID4gL2Rldi9udWxsOyBjYXQgXy5fLndhdjsgcm0gXy5fLndhdiApIiAgUkVESVIgfSwgIC8vIFJLIEF1ZGlvOgorICAgIHsgIi5tb2QiICAgICwgUEFUSCJ4bXAgLWIxNiAtYyAtZjQ0MTAwIC0tc3RlcmVvIC1vLSAlcyB8IHNveCAtcjQ0MTAwIC1zdyAtYzIgLXRyYXcgLSAtdHdhdiAtc3cgLSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRElSIH0sICAvLyBBbWlnYSdzIE11c2ljIG9uIERpc2s6CisgICAgeyAiIiAgICAgICAgLCBQQVRIInNveCAlcyAtdHdhdiAtc3cgLSIgICAgICAgICAgICAgICAgICAgICBSRURJUiB9LCAgLy8gUmVzdCwgbWF5IGJlIHNveCBjYW4gaGFuZGxlIGl0Cit9OworCisjdW5kZWYgUkVESVIKKyN1bmRlZiBTVERPVVQKKyN1bmRlZiBQQVRICisKKworaW50ICByZWFkd2F2ZSAoIHN0ZXJlb190KiBidWZmLCBzaXplX3QgbWF4bGVuLCBjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QqIGxlbiApCit7CisgICAgY2hhciogICAgICAgICAgIGNvbW1hbmQgPSBtYWxsb2MgKDIqc3RybGVuKG5hbWUpICsgNTEyKTsKKyAgICBjaGFyKiAgICAgICAgICAgbmFtZV9xICA9IG1hbGxvYyAoMipzdHJsZW4obmFtZSkgKyAxMjgpOworICAgIHVuc2lnbmVkIHNob3J0ICBoZWFkZXIgWzIyXTsKKyAgICBGSUxFKiAgICAgICAgICAgZnA7CisgICAgc2l6ZV90ICAgICAgICAgIGk7CisgICAgc2l6ZV90ICAgICAgICAgIGo7CisKKyAgICAvLyBUaGUgKm5pY2UqIHNoZWxsIHF1b3RpbmcKKyAgICBpID0gaiA9IDA7CisgICAgaWYgKCBuYW1lW2ldID09ICctJyApCisgICAgICAgIG5hbWVfcVtqKytdID0gJy4nLAorICAgICAgICBuYW1lX3FbaisrXSA9ICcvJzsKKworICAgIHdoaWxlIChuYW1lW2ldKSB7CisgICAgICAgIGlmICggIWlzYWxudW0gKG5hbWVbaV0pICYmIG5hbWVbaV0hPSctJyAmJiBuYW1lW2ldIT0nXycgJiYgbmFtZVtpXSE9Jy4nICkKKyAgICAgICAgICAgIG5hbWVfcVtqKytdID0gJ1xcJzsKKyAgICAgICAgbmFtZV9xW2orK10gPSBuYW1lW2krK107CisgICAgfQorICAgIG5hbWVfcVtqXSA9ICdcMCc7CisKKyAgICBmcHJpbnRmIChzdGRlcnIsICJSZWFkaW5nICVzIiwgbmFtZSApOworICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZW9mKGRlY29kZXIpL3NpemVvZigqZGVjb2Rlcik7IGkrKyApCisgICAgICAgIGlmICggaGFzX2V4dCAobmFtZSwgZGVjb2RlcltpXS5leHRlbnRpb24pICkgeworICAgICAgICAgICAgc3ByaW50ZiAoIGNvbW1hbmQsIGRlY29kZXJbaV0uY29tbWFuZCwgbmFtZV9xICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgZnJlZSAobmFtZV9xKTsKKyAgICBpZiAoIChmcCA9IHBvcGVuIChjb21tYW5kLCAiciIpKSA9PSBOVUxMICkgeworICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBleGVjOlxuJXNcbiIsIGNvbW1hbmQgKTsKKyAgICAgICAgZXhpdCAoMSk7CisgICAgfQorICAgIGZyZWUgKGNvbW1hbmQpOworCisgICAgZnByaW50ZiAoc3RkZXJyLCAiIC4uLiIgKTsKKyAgICBmcmVhZCAoIGhlYWRlciwgc2l6ZW9mKCpoZWFkZXIpLCBzaXplb2YoaGVhZGVyKS9zaXplb2YoKmhlYWRlciksIGZwICk7CisKKyAgICBzd2l0Y2ggKGJlMTZfbGUoaGVhZGVyWzExXSkpIHsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgKmxlbiA9IGZyZWFkICggYnVmZiwgc2l6ZW9mKHN0ZXJlb190KSwgbWF4bGVuLCBmcCApOworCSAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbjsgaSArKykgeworCQkgYnVmZltpXVswXSA9IGJlMTZfbGUoYnVmZltpXVswXSk7CisJCSBidWZmW2ldWzFdID0gYmUxNl9sZShidWZmW2ldWzFdKTsKKwkgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICpsZW4gPSBmcmVhZCAoIGJ1ZmYsIHNpemVvZihzYW1wbGVfdCksIG1heGxlbiwgZnAgKTsKKyAgICAgICAgICAgIGZvciAoIGkgPSAqbGVuOyBpLS0gPiAwOyApCisgICAgICAgICAgICAgICAgYnVmZltpXVswXSA9IGJ1ZmZbaV1bMV0gPSAoKHNhbXBsZV90KilidWZmKSBbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXGJcYlxiXGIsIFN0YW5kYXJkIE9wZW4gU291cmNlIEJ1ZyBkZXRlY3RlZCwgdHJ5IG11cmtzYXJvdW5kIC4uLiIgKTsKKyAgICAgICAgICAgICpsZW4gPSBmcmVhZCAoIGJ1ZmYsIHNpemVvZihzdGVyZW9fdCksIG1heGxlbiwgZnAgKTsKKyAgICAgICAgICAgIGhlYWRlclsxMV0gPSAgICAgMjsKKyAgICAgICAgICAgIGhlYWRlclsxMl0gPSA2NTUzNDsgIC8qIHVzZSB0aGF0IG9mIHRoZSBvdGhlciBjaGFubmVsICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9ubHkgMSBvciAyIGNoYW5uZWxzIGFyZSBzdXBwb3J0ZWQsIG5vdCAldVxuIiwgaGVhZGVyWzExXSApOworICAgICAgICAgICAgcGNsb3NlIChmcCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBjbG9zZSAoIGZwICk7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iICk7CisgICAgcmV0dXJuIGJlMTZfbGUoaGVhZGVyWzEyXSkgPyBiZTE2X2xlKGhlYWRlclsxMl0pIDogNjU1MzQ7Cit9CisKKworZG91YmxlICBjcm9zc19hbmFseXplICggY29uc3Qgc3RlcmVvX3QqIHAxLCBjb25zdCBzdGVyZW9fdCAqcDIsIHNpemVfdCBsZW4gKQoreworICAgIGZsb2F0ICAgUDEgW01BWF0gWzJdOworICAgIGZsb2F0ICAgUDIgW01BWF0gWzJdOworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIG1heGluZGV4OworICAgIGRvdWJsZSAgc3VtMTsKKyAgICBkb3VibGUgIHN1bTI7CisgICAgZG91YmxlICBtYXg7CisgICAgZG91YmxlICB5MTsKKyAgICBkb3VibGUgIHkyOworICAgIGRvdWJsZSAgeTM7CisgICAgZG91YmxlICB5bzsKKyAgICBkb3VibGUgIHhvOworICAgIGRvdWJsZSAgdG1wOworICAgIGRvdWJsZSAgdG1wMTsKKyAgICBkb3VibGUgIHRtcDI7CisgICAgaW50ICAgICByZXQgPSAwOworICAgIGludCAgICAgY250ID0gNTsKKworICAgIC8vIENhbGN1bGF0aW5nIGVmZmVjdGl2ZSB2b2x0YWdlCisgICAgc3VtMSA9IHN1bTIgPSAwLjsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBzdW0xICs9IChkb3VibGUpcDFbaV1bMF0gKiBwMVtpXVswXTsKKyAgICAgICAgc3VtMiArPSAoZG91YmxlKXAyW2ldWzBdICogcDJbaV1bMF07CisgICAgfQorICAgIHN1bTEgPSBzcXJ0ICggc3VtMS9sZW4gKTsKKyAgICBzdW0yID0gc3FydCAoIHN1bTIvbGVuICk7CisKKyAgICAvLyBTZWFyY2hpbmcgYmVnaW5uaW5nIG9mIHNpZ25hbCAobm90IHN0YWJsZSBmb3IgcGF0aG9sb2dpY2FsIHNpZ25hbHMpCisgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGlmICggYWJzIChwMVtpXVswXSkgPj0gc3VtMSAgJiYgIGFicyAocDJbaV1bMF0pID49IHN1bTIgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgcDEgICs9IGk7CisgICAgcDIgICs9IGk7CisgICAgbGVuIC09IGk7CisKKyAgICBpZiAoIGxlbiA8PSBNQVggKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIEZpbGxpbmcgYXJyYXlzIGZvciBGRlQKKyAgICBkbyB7CisgICAgICAgIHN1bTEgPSBzdW0yID0gMC47CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgTUFYOyBpKysgKSB7CisjaWZkZWYgVVNFRElGRgorICAgICAgICAgICAgdG1wMSAgPSBwMSBbaV1bMF0gLSBwMSBbaSsxXVswXTsKKyAgICAgICAgICAgIHRtcDIgID0gcDIgW2krcmV0XVswXSAtIHAyIFtpK3JldCsxXVswXTsKKyNlbHNlCisgICAgICAgICAgICB0bXAxICA9IHAxIFtpXVswXTsKKyAgICAgICAgICAgIHRtcDIgID0gcDIgW2krcmV0XVswXTsKKyNlbmRpZgorICAgICAgICAgICAgc3VtMSArPSB0bXAxKnRtcDE7CisgICAgICAgICAgICBzdW0yICs9IHRtcDIqdG1wMjsKKyAgICAgICAgICAgIFAxIFtpXVswXSA9IHRtcDE7CisgICAgICAgICAgICBQMiBbaV1bMF0gPSB0bXAyOworICAgICAgICAgICAgUDEgW2ldWzFdID0gMC47CisgICAgICAgICAgICBQMiBbaV1bMV0gPSAwLjsKKyAgICAgICAgfQorCisgICAgICAgIGZmdCAoUDEsIE1BWCk7CisgICAgICAgIGZmdCAoUDIsIE1BWCk7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBNQVg7IGkrKyApIHsKKyAgICAgICAgICAgIGRvdWJsZSAgYTAgPSBQMSBbaV1bMF07CisgICAgICAgICAgICBkb3VibGUgIGExID0gUDEgW2ldWzFdOworICAgICAgICAgICAgZG91YmxlICBiMCA9IFAyIFsoTUFYLWkpJihNQVgtMSldWzBdOworICAgICAgICAgICAgZG91YmxlICBiMSA9IFAyIFsoTUFYLWkpJihNQVgtMSldWzFdOworICAgICAgICAgICAgUDEgW2ldWzBdID0gYTAqYjAgLSBhMSpiMTsKKyAgICAgICAgICAgIFAxIFtpXVsxXSA9IGEwKmIxICsgYTEqYjA7CisgICAgICAgIH0KKworICAgICAgICBmZnQgKFAxLCBNQVgpOworCisgICAgICAgIG1heCA9IFAxIFttYXhpbmRleCA9IDBdWzBdOworICAgICAgICBmb3IgKCBpID0gMTsgaSA8IE1BWDsgaSsrICkKKyAgICAgICAgICAgIGlmICggUDFbaV1bMF0gPiBtYXggKQorICAgICAgICAgICAgICAgIG1heCA9IFAxIFttYXhpbmRleCA9IGldWzBdOworCisgICAgICAgIHkyID0gUDEgWyBtYXhpbmRleCAgICAgICAgICAgXVswXTsKKyAgICAgICAgeTEgPSBQMSBbKG1heGluZGV4LTEpJihNQVgtMSldWzBdIC0geTI7CisgICAgICAgIHkzID0gUDEgWyhtYXhpbmRleCsxKSYoTUFYLTEpXVswXSAtIHkyOworCisgICAgICAgIHhvID0gMC41ICogKHkxLXkzKSAvICh5MSt5Myk7CisgICAgICAgIHlvID0gMC41ICogKCAoeTEreTMpKnhvICsgKHkzLXkxKSApICogeG87CisKKyAgICAgICAgaWYgKG1heGluZGV4ID4gTUFYLzIgKQorICAgICAgICAgICAgbWF4aW5kZXggLT0gTUFYOworCisgICAgICAgIHJldCArPSBtYXhpbmRleDsKKyAgICAgICAgdG1wID0gMTAwLi9NQVgvc3FydChzdW0xKnN1bTIpOworICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIHByaW50ZiAoICJbJTVkXSU4LjRmICBbJTVkXSU4LjRmICBbJTVkXSU4LjRmICBbJTEwLjRmXSU4LjRmXG4iLAorICAgICAgICAgICAgICAgICAgICAgcmV0LSAxLCAoeTEreTIpKnRtcCwKKyAgICAgICAgICAgICAgICAgICAgIHJldCAgICwgICAgIHkyICp0bXAsCisgICAgICAgICAgICAgICAgICAgICByZXQrIDEsICh5Myt5MikqdG1wLAorICAgICAgICAgICAgICAgICAgICAgcmV0K3hvLCAoeW8reTIpKnRtcCApOworCisgICAgfSB3aGlsZSAoIG1heGluZGV4ICAmJiAgY250LS0gKTsKKworICAgIHJldHVybiByZXQgKyB4bzsKK30KKworCitzaG9ydCAgdG9fc2hvcnQgKCBpbnQgeCApCit7CisgICAgcmV0dXJuIHggPT0gKHNob3J0KXggID8gIChzaG9ydCl4ICA6ICAoc2hvcnQpICgoeCA+PiAzMSkgXiAweDdGRkYpOworfQorCisKK3ZvaWQgIERDX2NhbmNlbCAoIHN0ZXJlb190KiBwLCBzaXplX3QgbGVuICkKK3sKKyAgICBkb3VibGUgIHN1bTEgPSAwOworICAgIGRvdWJsZSAgc3VtMiA9IDA7CisgICAgc2l6ZV90ICBpOworICAgIGludCAgICAgZGlmZjE7CisgICAgaW50ICAgICBkaWZmMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgc3VtMSArPSBwW2ldWzBdOworICAgICAgICBzdW0yICs9IHBbaV1bMV07CisgICAgfQorICAgIGlmICggZmFicyhzdW0xKSA8IGxlbiAgJiYgIGZhYnMoc3VtMikgPCBsZW4gKQorICAgICAgICByZXR1cm47CisKKyAgICBkaWZmMSA9IHJvdW5kICggc3VtMSAvIGxlbiApOworICAgIGRpZmYyID0gcm91bmQgKCBzdW0yIC8gbGVuICk7CisgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJlbW92aW5nIERDIChsZWZ0PSVkLCByaWdodD0lZClcbiIsIGRpZmYxLCBkaWZmMiApOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBwW2ldWzBdID0gdG9fc2hvcnQgKCBwW2ldWzBdIC0gZGlmZjEpOworICAgICAgICBwW2ldWzFdID0gdG9fc2hvcnQgKCBwW2ldWzFdIC0gZGlmZjIpOworICAgIH0KK30KKwordm9pZCAgbXVsdGlwbHkgKCBjaGFyIGMsIHN0ZXJlb190KiBwLCBzaXplX3QgbGVuLCBkb3VibGUgZmFjdCApCit7CisgICAgc2l6ZV90ICBpOworCisgICAgaWYgKCBmYWN0ID09IDEuICkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICh2ZXJib3NlKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJNdWx0aXBseWluZyAlYyBieSAlNy41ZlxuIiwgYywgZmFjdCApOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBwW2ldWzBdID0gdG9fc2hvcnQgKCBwW2ldWzBdICogZmFjdCApOworICAgICAgICBwW2ldWzFdID0gdG9fc2hvcnQgKCBwW2ldWzFdICogZmFjdCApOworICAgIH0KK30KKworCitpbnQgIG1heGltdW0gKCBzdGVyZW9fdCogcCwgc2l6ZV90IGxlbiApCit7CisgICAgaW50ICAgICBtYXggPSAwOworICAgIHNpemVfdCAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgaWYgKGFicyhwW2ldWzBdKSA+IG1heCkgbWF4ID0gYWJzKHBbaV1bMF0pOworICAgICAgICBpZiAoYWJzKHBbaV1bMV0pID4gbWF4KSBtYXggPSBhYnMocFtpXVsxXSk7CisgICAgfQorICAgIHJldHVybiBtYXg7Cit9CisKKwordm9pZCAgdXNhZ2UgKCB2b2lkICkKK3sKKyAgICBmcHJpbnRmICggc3RkZXJyLAorICAgICAgICAidXNhZ2U6ICBhYnggWy12XSBGaWxlX0EgRmlsZV9CXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIkZpbGVfQSBhbmQgRmlsZV9CIGxvYWRlZCBhbmQgcGxheWVkLiBGaWxlX0Egc2hvdWxkIGJlIHRoZSBiZXR0ZXIvcmVmZXJlbmNlXG4iCisgICAgICAgICJmaWxlLCBGaWxlX0IgdGhlIG90aGVyLiBZb3UgY2FuIHByZXNzIHRoZSBmb2xsb3dpbmcga2V5czpcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiICBhL0E6ICAgIExpc3RlbiB0byBGaWxlIEFcbiIKKyAgICAgICAgIiAgYi9COiAgICBMaXN0ZW4gdG8gRmlsZSBCXG4iCisgICAgICAgICIgIHgvWDogICAgTGlzdGVuIHRvIHRoZSByYW5kb21seSBzZWxlY3RlZCBGaWxlIFgsIHdoaWNoIGlzIEEgb3IgQlxuIgorICAgICAgICAiICBDdHJsLUE6IFlvdSB2b3RlIGZvciBYPUFcbiIKKyAgICAgICAgIiAgQ3RybC1COiBZb3Ugdm90ZSBmb3IgWD1CXG4iCisgICAgICAgICIgIG06ICAgICAgQWx0ZXJuYXRpbmcgcGxheWluZyBBIGFuZCBCLiBGYXN0IHN3aXRjaGluZ1xuIgorICAgICAgICAiICBNOiAgICAgIEFsdGVybmF0aW5nIHBsYXlpbmcgQSBhbmQgQi4gU2xvdyBzd2l0Y2hpbmdcbiIKKyAgICAgICAgIiAgZC9EL0N0cmwtRC9BbHQtZC9BbHQtRDpcbiIKKyAgICAgICAgIiAgICAgICAgICBMaXN0ZW4gdG8gdGhlIGRpZmZlcmVuY2UgQS1CICgrMCBkQi4uLis0MCBkQilcbiIKKyAgICAgICAgIiAgby9wOiAgICBDaHVuayBzZWxlY3RcbiIKKyAgICAgICAgIiAgaGprbDogICBDaHVuayBmaW5lIGFkanVzdCAoaGo6IHN0YXJ0LCBrbDogc3RvcClcbiIKKyAgICAgICAgIiAgU3BhY2U6ICBDaHVuayBkZXNlbGVjdFxuIgorICAgICAgICAiICAwLi4uOTogIExpc3RlbiB0byBCLCBidXQgZGlmZmVyZW5jZSBBLUIgaXMgYW1wbGlmaWVkIGJ5IDAtOSBkQlxuIgorICAgICAgICAiICBROiAgICAgIFF1aXQgdGhlIHByb2dyYW1cbiIKKyAgICAgICAgIlxuIgorICAgICk7Cit9CisKKworaW50ICBtYWluICggaW50IGFyZ2MsIGNoYXIqKiBhcmd2ICkKK3sKKyAgICBzdGVyZW9fdCogIF9BID0gY2FsbG9jICggTUFYX0xFTiwgc2l6ZW9mKHN0ZXJlb190KSApOworICAgIHN0ZXJlb190KiAgX0IgPSBjYWxsb2MgKCBNQVhfTEVOLCBzaXplb2Yoc3RlcmVvX3QpICk7CisgICAgc3RlcmVvX3QqICBBICA9IF9BOworICAgIHN0ZXJlb190KiAgQiAgPSBfQjsKKyAgICBzaXplX3QgICAgIGxlbl9BOworICAgIHNpemVfdCAgICAgbGVuX0I7CisgICAgc2l6ZV90ICAgICBsZW47CisgICAgaW50ICAgICAgICBtYXhfQTsKKyAgICBpbnQgICAgICAgIG1heF9COworICAgIGludCAgICAgICAgbWF4OworICAgIGxvbmcgICAgICAgZnJlcTE7CisgICAgbG9uZyAgICAgICBmcmVxMjsKKyAgICBpbnQgICAgICAgIHNoaWZ0OworICAgIGRvdWJsZSAgICAgZnNoaWZ0OworICAgIGRvdWJsZSAgICAgYW1wbDsKKyAgICBpbnQgICAgICAgIGFtcGxfWDsKKyAgICBrb3JyX3QgICAgIGs7CisKKyAgICBpZiAoYXJnYyA+IDEgICYmICAwID09IHN0cmNtcCAoYXJndlsxXSwgIi12IikgKSB7CisgICAgICAgIHZlcmJvc2UgPSAxOworICAgICAgICBhcmdjLS07CisgICAgICAgIGFyZ3YrKzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCBhcmdjICkgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHVzYWdlICgpOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDM6CisgICAgICAgIHVzYWdlKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZyZXExID0gcmVhZHdhdmUgKCBBLCBNQVhfTEVOLCBhcmd2WzFdLCAmbGVuX0EgKTsKKyAgICBEQ19jYW5jZWwgKCBBLCBsZW5fQSApOworICAgIGZyZXEyID0gcmVhZHdhdmUgKCBCLCBNQVhfTEVOLCBhcmd2WzJdLCAmbGVuX0IgKTsKKyAgICBEQ19jYW5jZWwgKCBCLCBsZW5fQiApOworCisgICAgaWYgICAgICAoIGZyZXExID09IDY1NTM0ICAmJiAgZnJlcTIgIT0gNjU1MzQgKQorICAgICAgICBmcmVxMSA9IGZyZXEyOworICAgIGVsc2UgaWYgKCBmcmVxMiA9PSA2NTUzNCAgJiYgIGZyZXExICE9IDY1NTM0ICkKKyAgICAgICAgZnJlcTIgPSBmcmVxMTsKKyAgICBlbHNlIGlmICggZnJlcTEgPT0gNjU1MzQgICYmICBmcmVxMiA9PSA2NTUzNCApCisgICAgICAgIGZyZXExID0gZnJlcTIgPSA0NDEwMDsKKworICAgIGlmICggZnJlcTEgIT0gZnJlcTIgKSB7CisgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJEaWZmZXJlbnQgc2FtcGxlIGZyZXF1ZW5jaWVzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIkE6ICVsZCwgQjogJWxkXG4iLCBmcmVxMSwgZnJlcTIgKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgbGVuICAgID0gbGVuX0EgPCBsZW5fQiAgPyAgbGVuX0EgIDogIGxlbl9COworICAgIGZzaGlmdCA9IGNyb3NzX2FuYWx5emUgKCBBLCBCLCBsZW4gKTsKKyAgICBzaGlmdCAgPSBmbG9vciAoIGZzaGlmdCArIDAuNSApOworCisgICAgaWYgKCB2ZXJib3NlICkgeworICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiRGVsYXkgQ2gxIGlzICUuNGYgc2FtcGxlc1xuIiwgZnNoaWZ0ICk7CisJZnByaW50ZiAoIHN0ZGVyciwgIkRlbGF5IENoMiBpcyAlLjRmIHNhbXBsZXNcbiIsCisJICAgICAgICAgIGNyb3NzX2FuYWx5emUgKCAoc3RlcmVvX3QqKSgoKHNhbXBsZV90KilBKSsxKSwgKHN0ZXJlb190KikoKChzYW1wbGVfdCopQikrMSksIGxlbiApICk7CisgICAgfQorCisgICAgaWYgKHNoaWZ0ID4gMCkgeworICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJEZWxheWluZyBBIGJ5ICVkIHNhbXBsZXNcbiIsICtzaGlmdCk7CisgICAgICAgIEIgICAgICs9IHNoaWZ0OworICAgICAgICBsZW5fQiAtPSBzaGlmdDsKKyAgICB9CisgICAgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJEZWxheWluZyBCIGJ5ICVkIHNhbXBsZXNcbiIsIC1zaGlmdCk7CisgICAgICAgIEEgICAgIC09IHNoaWZ0OworICAgICAgICBsZW5fQSArPSBzaGlmdDsKKyAgICB9CisKKyAgICBsZW4gICAgPSBsZW5fQSA8IGxlbl9CICA/ICBsZW5fQSAgOiAgbGVuX0I7CisgICAgbWVtc2V0ICggJmssIDAsIHNpemVvZihrKSApOworICAgIGFuYWx5emVfc3RlcmVvICggQSwgQiwgbGVuLCAmayApOworICAgIGFtcGwgID0gcmVwb3J0ICgmayk7CisgICAgbWF4X0EgPSBtYXhpbXVtICggQSwgbGVuICk7CisgICAgbWF4X0IgPSBtYXhpbXVtICggQiwgbGVuICk7CisKKyAgICBpZiAoIGFtcGwgPD0gMC45ODg1NSApIHsgLyogPCAtMC4wNSBkQiAqLworICAgICAgICBtYXggICAgPSBtYXhfQSphbXBsIDwgbWF4X0IgID8gIG1heF9CICA6ICBtYXhfQSphbXBsOworICAgICAgICBhbXBsX1ggPSAoaW50KSgyOTIwMyAvIG1heCk7CisgICAgICAgIGlmICggYW1wbF9YIDwgMiApIGFtcGxfWCA9IDE7CisgICAgICAgIG11bHRpcGx5ICggJ0EnLCBBLCBsZW4sIGFtcGwqYW1wbF9YICk7CisgICAgICAgIG11bHRpcGx5ICggJ0InLCBCLCBsZW4sICAgICAgYW1wbF9YICk7CisgICAgfSBlbHNlIGlmICggYW1wbCA+PSAxLjAxMTU4ICkgeyAvKiA+ICswLjA1IGRCICovCisgICAgICAgIG1heCAgICA9IG1heF9BIDwgbWF4X0IvYW1wbCAgPyAgbWF4X0IvYW1wbCAgOiAgbWF4X0E7CisgICAgICAgIGFtcGxfWCA9IChpbnQpKDI5MjAzIC8gbWF4KTsKKyAgICAgICAgaWYgKCBhbXBsX1ggPCAyICkgYW1wbF9YID0gMTsKKyAgICAgICAgbXVsdGlwbHkgKCAnQScsIEEsIGxlbiwgICAgICAgICBhbXBsX1ggKTsKKyAgICAgICAgbXVsdGlwbHkgKCAnQicsIEIsIGxlbiwgMS4vYW1wbCphbXBsX1ggKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXggICAgPSBtYXhfQSA8IG1heF9CID8gbWF4X0IgOiBtYXhfQTsKKyAgICAgICAgYW1wbF9YID0gKGludCkoMjkyMDMgLyBtYXgpOworICAgICAgICBpZiAoIGFtcGxfWCA8IDIgKSBhbXBsX1ggPSAxOworICAgICAgICBtdWx0aXBseSAoICdBJywgQSwgbGVuLCBhbXBsX1ggKTsKKyAgICAgICAgbXVsdGlwbHkgKCAnQicsIEIsIGxlbiwgYW1wbF9YICk7CisgICAgfQorCisgICAgc2V0ICgpOworICAgIFNldF9SZWFsdGltZSAoKTsKKyAgICB0ZXN0aW5nICggQSwgQiwgbGVuLCBmcmVxMSApOworICAgIHJlc2V0ICgpOworCisgICAgZnJlZSAoX0EpOworICAgIGZyZWUgKF9CKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogZW5kIG9mIGFieC5jICovCmRpZmYgLS1naXQgYS9taXNjL2F0aC5jIGIvbWlzYy9hdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTZjZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWlzYy9hdGguYwpAQCAtMCwwICsxLDgzOSBAQAorLyogJElkOiBhdGguYyx2IDEuMTIgMjAwMC8xMi8wNSAxNTozNzoyNiBhbGVpZGluZ2VyIEV4cCAkICovCisvKgorICogS25vd24gYnVncyAoc29ydGVkIGJ5IGltcG9ydGFuY2UpOiAKKyAqICAgICAtIGh1bWFuIGRlbGF5IChjYS4gMjAwIG1zIG9yIG1vcmU/Pz8pIGFuZCBidWZmZXJpbmcgZGVsYXkgKDM0MSBtcyBANDgga0h6LzY0IEtCeXRlKQorICogICAgICAgc2hvdWxkIGJlIHN1YnRyYWN0ZWQKKyAqICAgICAtIGVycm9yIGhhbmRsaW5nCisgKiAgICAgLSBjb3Mgc2xvcGUgb24gZGlyZWN0aW9uIGNoYW5nZXMKKyAqICAgICAtIGNhbGlicmF0aW9uIGZpbGUgb2Ygc291bmRjYXJkL2FtcGxpZmllci9oZWFkIHBob25lCisgKiAgICAgLSB3b3JzZSBoYW5kbGluZworICogICAgIC0gKy8tIGhhbmRsaW5nIHZpYSBtb3VzZSAoZG8geW91IGhhdmUgY29kZT8pIGluIGEgZGFyayByb29tCisgKiAgICAgLSBFTlRFUiBhcyBkaXJlY3Rpb24gY2hhbmdlCisgKiAgICAgLSBmaW5lciBwcmVjYWxjdWxhdGVkIEFUSCBmb3IgcHJlLWVtcGhhc2lzCisgKi8KKworLyogCisgKiBTdWdnZXN0ZWQgbGV2ZWwgcmFuZ2VzOgorICogICAgIDE4MCBIei4uLjEzLjUga0h6OiAgNTAuLi43MCBkQgorICogICAgIDEwMCBIei4uLjE1LjAga0h6OiAgNDAuLi43MCBkQgorICogICAgICA3MCBIei4uLjE2LjAga0h6OiAgMzAuLi43MCBkQgorICogICAgICA0NSBIei4uLjE2LjUga0h6OiAgMjAuLi43MCBkQgorICogICAgICAzMCBIei4uLjE3LjUga0h6OiAgMTAuLi43MCBkQgorICogICAgICAyNSBIei4uLjE4LjAga0h6OiAgIDUuLi43NSBkQgorICogICAgICAyMCBIei4uLjE5LjAga0h6OiAgIDAuLi44MCBkQgorICogICAgICAxNiBIei4uLjIwLjAga0h6OiAtMTAuLi44MCBkQgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9TWVNfU09VTkRDQVJEX0gKKyMgaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2VsaWYgZGVmaW5lZChIQVZFX0xJTlVYX1NPVU5EQ0FSRF9IKQorIyBpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNlbHNlCisjIGVycm9yIG5vIHNvdW5kY2FyZCBpbmNsdWRlCisjZW5kaWYKKworICAgICAKKworI2RlZmluZSBBVURJT19ERVZJQ0UgICAgICAgIi9kZXYvZHNwIgorLy8jZGVmaW5lIENPT0xFRElUX0ZJTEUgICAgICAiL21udC9kb3NkL2Nvb2xlZGl0LndhdiIKKyNkZWZpbmUgREVMQVlfVU5USUxfWENIRyAgIDIuNQorI2RlZmluZSBUVVJOX1NURVBTCSAgIDI0MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHNvdW5kY2FyZCBzdHVmZgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgZG91YmxlIGRpdGhlcl9jb2VmZiBbXSBbMTZdID0geworICAgIHsgIC8qIDQ4IGtIeiAqLyAzLjM1MTg1MzUyNzc1MzkxNTkxMzExLCAgNC4yNDkxNDM3OTI5NTQ4MjAzMjk3OCwgIDEuNzgwNDIyNTE3MjkxNTAxNTMwODYsIC0wLjkyNjAxMzgxNDE5MTg2MjAxMTg0LCAtMS4zNzMwODU5NjEwNDE4MjM0MzY0NSwgLTEuODU5NTE5MTU5OTkyNDc3MDQ4MjksIC0zLjI4MDc0NDM3ODcyNjMyMzMwNTI2LCAtMy4wNTQ5NjY3MDE4NTcwMjk5MDg4MiwgLTEuMjI4NTU0NjI4Mzk0NTA1Mjg4MzcsIC0wLjMwMjkxNTMxOTU5MTcxMjY3MDE1LCAtMC4xODU5ODQ4NjE5NTY1MjYwMDc3MCwgIDAuNDIwMTA1MTIyMDU3MDIwMDM3OTAsICAwLjkyMjc4Nzg2MTExMzY4NjUzNDUyLCAgMC42MjEwMjM4MDQ1MTc3MTc3NTE5MywgIDAuMTQzMTI4OTcyMDY2NTAwNDQ4MjgsIC0wLjAwNDU0NzIxNTA4MjAzOTI3NzQ2IH0sCisgICAgeyAgLyogNTYga0h6ICovIDMuODY0MDQxMzQ5ODIyODA2Mjg3NDksICA2LjY3MTk1NTkyNzAxNjEzMjkxMDcxLCAgNS45MDU3NjE5NTQ2NzI0NTgwMjA0NiwgIDEuNTc1ODk3MDU5MjE0ODcyNjE5ODEsIC0yLjEwNjE4MjAxMzg5NzM3MzcyMTc4LCAtMi43NDE5MTc4ODgyMjUwNzE4NDM5NSwgLTIuNjIxNzUwNzA2MzY4NDk5OTkzOTYsIC0zLjc4NTA1MjI2NDYzMDMyODA4ODYzLCAtNC40NTY5ODg0ODU3ODAxMDQzODI4NCwgLTIuNzY4MjU5NjYyNDM0NjA1MzYxMTAsIC0wLjI2NTA5OTMxMzc1NTg0MDA3MzEyLCAgMC42Nzg1MzgxMjAyODk2ODcxNjc5OSwgIDAuMTc2MzM1Mjg0NDE0NzcwMjE4OTIsIC0wLjI4NTExNDE3MTkxODM3ODIzNzcwLCAtMC4yMTg2NjYwNTEwMDk3NTYwODQ3MCwgLTAuMDQ3NTE2NzQwOTQ0NTY4MzM3MTkgfSwKKyAgICB7ICAvKiA2NCBrSHogKi8gNC4wOTI3NjkzODg4MDA5ODA5MjE3MiwgIDguMjc0MjQwNDQ2NzQ2NTk4MTI5MzcsIDEwLjExNTAzMTYyMjkyMTQ2NzYyODgwLCAgNy4xOTE1OTgwMTU2OTU0NDMxNzM1MywgIDEuMzk3NzAwNzAyOTE3Mzk1NTY1MjMsIC0yLjg2NTk1OTAxOTgxMjQ0Njg4NjAxLCAtMy43NjU2NzI3NDA1MDA5NDY5MTM2MiwgLTMuNTgwNTE0NDU2ODQ0NzIzNzgyOTgsIC00Ljc4MjYyOTE3NzM4NzU4MDIyNTM5LCAtNi41MzA3NTc1MDg5NDc3NzY1MDg5OSwgLTYuMzEzMzA1MTQzMDY4NTcwNTU2MjcsIC0zLjY5OTcxMzgyNzY3NzYzNTM0MTk1LCAtMC43ODEyNTA5NDE5MTc0NDg3ODI5OCwgIDAuNTkwMjc1MDgxMTM4MzcyNjcyMTcsICAwLjUzNTAwMjY0MDA5NjA3MzY3NjQ4LCAgMC4xNDg2MDA0MzU2NzIwNjIxNzUwNiB9LAorICAgIHsgIC8qIDcyIGtIeiAqLyA0LjEzODMzNTUzODAxOTg1MjM1NDY1LCAgOS4wMjQ2MTc3ODA4OTM0MDA4MjQzNywgMTIuOTMwOTAzNjY5MzI3NDA1MTA3ODIsIDEyLjY2MzcyMjg1NzY3Njk5MDUxOTQ4LCAgNy43NjEyMjE3NjcwMjI3NDE0OTYzMCwgIDEuMzA2MTcyNTc1NTU3MzIyNzgyOTYsIC0yLjkyODU5MTIwODg3MTIxMjg1MzU4LCAtNC4wMjQzODU5ODQ5NTgzNzgzMDYyNywgLTQuMTY2NzMwNjgxMzI0OTE5MzYyNjIsIC01LjU1NjE4MDY1MzAwMTI5OTE2NTc0LCAtNy44MjY1Nzc4ODYxMTIzMTY1MzEwMywgLTguODMwNTU5MDQ0NjYxMDY2NjgwMzUsIC03LjM0ODg0Nzg5MzQ3NzEzODE1NjcyLCAtNC4zMzk3NzY2NDkwNjA0ODMxNDg5MSwgLTEuNjc3MTEzMTAyODg2MTE5NzUzOTgsIC0wLjMzMDg2Njg3MDQ0NzEwMjM1NDIwIH0sCisgICAgeyAgLyogODAga0h6ICovIDQuMjIxMzUyOTMzNDI2NjcwMDU1MTcsICA5Ljc2NjM5ODQ2NTgyNTM5NzIyMzc1LCAxNS40NjU2MjY4MjQxODM1NzQ3ODI5MCwgMTcuNTQzNzg1NDk5Mjc4NTUyNDgzNDYsIDEzLjI5MTEyMDg0MzEzMTU4OTYzMzk2LCAgMy41MTUxMjQ0MTk5ODI1MjY1NzQ3MCwgLTcuNTEwMjU2NzE0NjI1MDI1NzczMDAsLTE0Ljg0MTY0MzIwODY0NTM2MjE5MzY4LC0xNi4xMDMwNjkwNzM1ODgyNjUwNDE0OCwtMTIuNTQ3NzU5MDc2OTE4NjY0MTQ0MDIsIC03LjQwNTYwNjY3MjY4NzgyNjU1MTQ5LCAtMy4zNDcwODAyOTQ4MjA1MjU2NTczMiwgLTEuMTk1NzIyMTQ4NzI5MjU3OTA4NjAsIC0wLjM5NTgyMTg1MjE2Mjc1MDg2Nzg2LCAtMC4xNDgwMzE2MDgxNjg0NjYwMzQyNCwgLTAuMDQyOTI4MTg0ODg2MjcwMTE4ODEgfSwKKyAgICB7ICAvKiA4OCBrSHogKi8gNC4xODUyMTQ2Nzg2NTk5NjkzNTMyNSwgIDkuOTY3NjU4MjE0NzU5MDk1NTY5NDIsIDE2LjkxOTA1NzYwMzg5MzkwNjE3NTUxLCAyMS43NDAxNjgyNDY2ODkxMzU1NzY4OSwgMjAuOTY0NTcxNDYzNTQwNjA2ODIzNjcsIDEzLjI4NjQwNDUzNDIxMjUzODkwNTQyLCAgMC44NTExNjkzMzg0MjE3MTEwMTU4NywtMTEuNjYwNTQ1MTYyNjEwMDcxMjc0NjksLTE5LjYyNzUwNjU2OTg1NTgxODAwMTY5LC0yMC45ODgzMTk2MjQ3MzAxNTkwNDUwOCwtMTYuOTUzNzQwNzI1MDUwNDI4MjU0NTgsLTEwLjY4ODQ4MTgwMjk1MzkwMTU0MTQ2LCAtNS4xNzE2OTc5Mjk4NDM2OTY3ODkwOCwgLTEuNzk5NzU0MDk0Mzk2NTAzMTkxMjksIC0wLjM4MDU3MDczNzkxNDE1ODk4Njc0LCAtMC4wMjY3MjY1MzkzMjg0NDY1Njk3NSB9LAorICAgIHsgIC8qIDk2IGtIeiAqLyA0LjA5NDE4ODc3MzI0ODk5NDczMTg5LCAgOS43Nzk3NzM2NDAxMDg3MDIxMTIwNywgMTcuMTAxMjAwODI2ODAzODUzNDExNTksIDIzLjM3MzU2MjE3NjE1OTk1MDM2ODE4LCAyNS4yNzEyMTk0MjA2MDcyMjM3NDI3NiwgMjAuNjQwNTk5OTE2MTM1NTAxNzQxOTAsICA5Ljk5NzIxNDQ1MDUxNDc1NjEwMzcxLCAtMy4zOTgzMzAwMDU1MDk5NzkzODUxMiwtMTUuMDM0MTAwNTQzOTI5MzMzNzcyNzgsLTIxLjM2NzA0MjAxMDAwNjgzMDY3Njc5LC0yMS40MDc3Mjg1OTk2OTM4ODc0MTY4NSwtMTYuNzkzNTU0MjYxMzY2NTc2NzM4MDgsLTEwLjQ4NTcwMjAwNjg4MTQxNjIyMTYzLCAtNS4wNzY0Mjk1MTUxNjEyNzQzODQ4NiwgLTEuNzU1NTUyNDA5MzY5ODkxNTk0MzYsIC0wLjMzODE3OTk3Mjk4NTg2MDU0MTMxIH0sCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogICAgZGV2aWNlOworICAgIGludCAgICAgICAgICAgIGZkOworICAgIGxvbmcgZG91YmxlICAgIHNhbXBsZV9mcmVxOworICAgIGNvbnN0IGRvdWJsZSogIGRpdGhlcjsKKyAgICBpbnQgICAgICAgICAgICBjaGFubmVsczsKKyAgICBpbnQgICAgICAgICAgICBiaXRzOworfSBzb3VuZGNhcmRfdDsKKwordHlwZWRlZiBzaWduZWQgc2hvcnQgIHNhbXBsZV90OwordHlwZWRlZiBzYW1wbGVfdCAgICAgIHN0ZXJlb190IFsyXTsgCisKK2ludCAgb3Blbl9zb3VuZGNhcmQgKCAKKyAgICBzb3VuZGNhcmRfdCogY29uc3QgIGssIAorICAgIGNvbnN0IGNoYXIqICAgICAgICAgZGV2aWNlLCAKKyAgICBjb25zdCBpbnQgICAgICAgICAgIGNoYW5uZWxzLAorICAgIGNvbnN0IGludCAgICAgICAgICAgYml0cywgCisgICAgY29uc3QgbG9uZyBkb3VibGUgICBmcmVxICkKK3sKKyAgICBpbnQgIGFyZzsKKyAgICBpbnQgIG9yZzsKKyAgICBpbnQgIGluZGV4OworICAgIGludCAgc3RhdHVzOworICAgIAorICAgIGstPmRldmljZSA9IGRldmljZTsKKyAgICBpZiAoIC0xID09IChrLT5mZCA9IG9wZW4gKCBrLT5kZXZpY2UsIE9fV1JPTkxZICkpICkgeworICAgICAgICBwZXJyb3IoIm9wZW5pbmcgb2YgYXVkaW8gZGV2aWNlIGZhaWxlZCIpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgaWYgKCAtMSA9PSAoc3RhdHVzID0gaW9jdGwgKGstPmZkLCBTT1VORF9QQ01fU1lOQywgMCkpKSB7CisgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIlczogU09VTkRfUENNX1NZTkMgaW9jdGwgZmFpbGVkOiAlc1xuIiwgay0+ZGV2aWNlLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG9yZyA9IGFyZyA9IGNoYW5uZWxzOworICAgIGlmICggLTEgPT0gKHN0YXR1cyA9IGlvY3RsIChrLT5mZCwgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTLCAmYXJnKSkgKSB7CisJZnByaW50ZiAoIHN0ZGVyciwgIiVzOiBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMgKCVkKSBpb2N0bCBmYWlsZWQ6ICVzXG4iICwgay0+ZGV2aWNlLCBjaGFubmVscywgc3RyZXJyb3IgKGVycm5vKSApOworCXJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGFyZyAhPSBvcmcpIHsKKwlmcHJpbnRmICggc3RkZXJyLCAiJXM6IHVuYWJsZSB0byBzZXQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBrLT5kZXZpY2UsIGFyZywgb3JnICk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBrLT5jaGFubmVscyA9IGFyZzsKKyAgICAKKyAgICBvcmcgPSBhcmcgPSBiaXRzOworICAgIGlmICggLTEgPT0gKHN0YXR1cyA9IGlvY3RsIChrLT5mZCwgU09VTkRfUENNX1dSSVRFX0JJVFMsICZhcmcpKSApIHsKKwlmcHJpbnRmICggc3RkZXJyLCAiJXM6IFNPVU5EX1BDTV9XUklURV9CSVRTIGlvY3RsIGZhaWxlZFxuIiwgay0+ZGV2aWNlICk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoYXJnICE9IG9yZykgeworCWZwcmludGYgKCBzdGRlcnIsICIlczogdW5hYmxlIHRvIHNldCBzYW1wbGUgc2l6ZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgay0+ZGV2aWNlLCBhcmcsIG9yZyApOworCXJldHVybiAtMTsKKyAgICB9CisgICAgay0+Yml0cyA9IGFyZzsKKworICAgIG9yZyA9IGFyZyA9IGstPmJpdHMgPD0gOCAgPyAgQUZNVF9VOCAgOiAgQUZNVF9TMTZfTEU7CisgICAgaWYgKCAtMSA9PSBpb2N0bCAoay0+ZmQsIFNORENUTF9EU1BfU0VURk1ULCAmYXJnKSApIHsKKwlmcHJpbnRmICggc3RkZXJyLCAiJXM6IFNORENUTF9EU1BfU0VURk1UIGlvY3RsIGZhaWxlZFxuIiwgay0+ZGV2aWNlICk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGFyZyAmIG9yZykgPT0gMCkgeworCWZwcmludGYgKCBzdGRlcnIsICIlczogdW5hYmxlIHRvIHNldCBkYXRhIGZvcm1hdFxuIiwgay0+ZGV2aWNlICk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBvcmcgPSBhcmcgPSAoaW50KSBmbG9vciAoIGZyZXEgKyAwLjUgKTsKKyAgICBpZiAoIC0xID09IChzdGF0dXMgPSBpb2N0bCAoay0+ZmQsIFNPVU5EX1BDTV9XUklURV9SQVRFLCAmYXJnKSkgKSB7CisJZnByaW50ZiAoIHN0ZGVyciwgIiVzOiBTT1VORF9QQ01fV1JJVEVfV1JJVEUgaW9jdGwgZmFpbGVkXG4iLCBrLT5kZXZpY2UgKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGstPnNhbXBsZV9mcmVxID0gKGxvbmcgZG91YmxlKWFyZzsKKyAgICBpbmRleCAgICAgICAgICA9IChhcmcgLSA0NDAwMCkgLyA4MDAwOworICAgIGlmICggaW5kZXggPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICkgaW5kZXggPSAwOworICAgIGlmICggaW5kZXggPj0gc2l6ZW9mKGRpdGhlcl9jb2VmZikvc2l6ZW9mKCpkaXRoZXJfY29lZmYpICkgaW5kZXggPSBzaXplb2YoZGl0aGVyX2NvZWZmKS9zaXplb2YoKmRpdGhlcl9jb2VmZikgLSAxOworICAgIGstPmRpdGhlciAgICAgID0gZGl0aGVyX2NvZWZmIFsgaW5kZXggXTsKKyAgICByZXR1cm4gMDsKK30KKworaW50ICBwbGF5X3NvdW5kY2FyZCAgICAoIHNvdW5kY2FyZF90KiBjb25zdCBrLCBzdGVyZW9fdCogc2FtcGxlcywgc2l6ZV90IGxlbmd0aCApCit7CisgICAgc2l6ZV90ICBieXRlcyA9IGxlbmd0aCAqIHNpemVvZiAoKnNhbXBsZXMpOworICAgIAorI2lmZGVmIENPT0xFRElUX0ZJTEUKKyAgICBzdGF0aWMgaW50IGZkID0gLTE7CisgICAgaWYgKCBmZCA8IDAgKSBmZCA9IG9wZW4gKCBDT09MRURJVF9GSUxFLCBPX1dST05MWSB8IE9fQ1JFQVQgKTsKKyAgICB3cml0ZSAoIGZkLCBzYW1wbGVzLCBieXRlcyApOworI2VuZGlmICAgIAorICAgIAorICAgIHJldHVybiB3cml0ZSAoIGstPmZkLCBzYW1wbGVzLCBieXRlcyApID09IGJ5dGVzICA/ICAwICA6ICAtMTsKK30KKworaW50ICBjbG9zZV9zb3VuZGNhcmQgICAoIHNvdW5kY2FyZF90KiBjb25zdCBrICkKK3sKKyAgICByZXR1cm4gY2xvc2UgKGstPmZkKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnJlcXVlbmN5IHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0geworICAgIGxpbmVhciAgICA9IDAsCisgICAgbG9nYXJpdGhtID0gMSwKKyAgICBzcXVhcmUgICAgPSAyLAorICAgIGN1YmljICAgICA9IDMsCisgICAgZXJiICAgICAgID0gNCwKKyAgICByZWNpcCAgICAgPSA1Cit9IGdlbm1vZGVfdDsKKworc3RhdGljIGxvbmcgZG91YmxlIGxpbmVhcl9mICAgICAgICAoIGxvbmcgZG91YmxlIHggKSB7IHJldHVybiB4ID4gMC5MICA/ICB4ICAgICAgICAgICAgIDogIDAuMEw7IH0KK3N0YXRpYyBsb25nIGRvdWJsZSBsb2dhcml0aG1fZiAgICAgKCBsb25nIGRvdWJsZSB4ICkgeyByZXR1cm4geCA+IDAuTCAgPyAgbG9nMTAgKHgpICAgICA6IC0zLjVMOyB9CitzdGF0aWMgbG9uZyBkb3VibGUgc3F1YXJlX2YgICAgICAgICggbG9uZyBkb3VibGUgeCApIHsgcmV0dXJuIHggPiAwLkwgID8gIHNxcnQgKHgpICAgICAgOiAgMC4wTDsgfQorc3RhdGljIGxvbmcgZG91YmxlIGN1YmljX2YgICAgICAgICAoIGxvbmcgZG91YmxlIHggKSB7IHJldHVybiB4ID4gMC5MICA/ICBwb3cgKHgsMS8zLikgIDogIDAuMEw7IH0KK3N0YXRpYyBsb25nIGRvdWJsZSBlcmJfZiAgICAgICAgICAgKCBsb25nIGRvdWJsZSB4ICkgeyByZXR1cm4gbG9nICgxLiArIDAuMDA0MzcqeCk7IH0KK3N0YXRpYyBsb25nIGRvdWJsZSByZWNpcF9mICAgICAgICAgKCBsb25nIGRvdWJsZSB4ICkgeyByZXR1cm4geCA+IDEuTCAgPyAgMS5ML3ggICAgICAgICA6ICAxLjBMOyB9CisKK3N0YXRpYyBsb25nIGRvdWJsZSBpbnZfbGluZWFyX2YgICAgKCBsb25nIGRvdWJsZSB4ICkgeyByZXR1cm4geDsgIH0KK3N0YXRpYyBsb25nIGRvdWJsZSBpbnZfbG9nYXJpdGhtX2YgKCBsb25nIGRvdWJsZSB4ICkgeyByZXR1cm4gcG93ICgxMC4sIHgpOyAgfQorc3RhdGljIGxvbmcgZG91YmxlIGludl9zcXVhcmVfZiAgICAoIGxvbmcgZG91YmxlIHggKSB7IHJldHVybiB4Kng7ICB9CitzdGF0aWMgbG9uZyBkb3VibGUgaW52X2N1YmljX2YgICAgICggbG9uZyBkb3VibGUgeCApIHsgcmV0dXJuIHgqeCp4OyAgfQorc3RhdGljIGxvbmcgZG91YmxlIGludl9lcmJfZiAgICAgICAoIGxvbmcgZG91YmxlIHggKSB7IHJldHVybiAoZXhwKHgpIC0gMS4pICogKDEuLzAuMDA0MzcpOyB9CitzdGF0aWMgbG9uZyBkb3VibGUgaW52X3JlY2lwX2YgICAgICggbG9uZyBkb3VibGUgeCApIHsgcmV0dXJuIHggPiAxLkwgID8gIDEuTC94ICAgICAgICAgOiAgMS4wTDsgfQorCit0eXBlZGVmIGxvbmcgZG91YmxlICgqY29udmVydGVyX2ZuX3QpICggbG9uZyBkb3VibGUgKTsKKworY29uc3QgY29udmVydGVyX2ZuX3QgIGZ1bmMgICAgIFtdID0geyBsaW5lYXJfZiwgICAgIGxvZ2FyaXRobV9mLCAgICAgc3F1YXJlX2YsICAgICBjdWJpY19mICAgICwgZXJiX2YgICAgLCByZWNpcF9mICAgICB9OworY29uc3QgY29udmVydGVyX2ZuX3QgIGludl9mdW5jIFtdID0geyBpbnZfbGluZWFyX2YsIGludl9sb2dhcml0aG1fZiwgaW52X3NxdWFyZV9mLCBpbnZfY3ViaWNfZiwgaW52X2VyYl9mLCBpbnZfcmVjaXBfZiB9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2VubW9kZV90ICAgICAgZ2VubW9kZTsKKyAgICBsb25nIGRvdWJsZSAgICBzdGFydF9mcmVxOworICAgIGxvbmcgZG91YmxlICAgIHN0b3BfZnJlcTsKKyAgICBsb25nIGRvdWJsZSAgICBzYW1wbGVfZnJlcTsKKyAgICB1bnNpZ25lZCBsb25nICBkdXJhdGlvbjsKKworICAgIGxvbmcgZG91YmxlICAgIHBoYXNlOworICAgIGxvbmcgZG91YmxlICAgIHBhcmFtMTsKKyAgICBsb25nIGRvdWJsZSAgICBwYXJhbTI7CisgICAgdW5zaWduZWQgbG9uZyAgY291bnRlcjsgCit9IGdlbmVyYXRvcl90OworCitpbnQgIG9wZW5fZ2VuZXJhdG9yICggCisgICAgZ2VuZXJhdG9yX3QqIGNvbnN0ICBnLAorICAgIGNvbnN0IHNvdW5kY2FyZF90KiAgY29uc3QgcywKKyAgICBjb25zdCBnZW5tb2RlX3QgICAgIGdlbm1vZGUsIAorICAgIGNvbnN0IGxvbmcgZG91YmxlICAgZHVyYXRpb24sIAorICAgIGNvbnN0IGxvbmcgZG91YmxlICAgc3RhcnRfZnJlcSwgCisgICAgY29uc3QgbG9uZyBkb3VibGUgICBzdG9wX2ZyZXEgKQoreworICAgIGctPnNhbXBsZV9mcmVxID0gcy0+c2FtcGxlX2ZyZXE7CisgICAgZy0+Z2VubW9kZSAgICAgPSBnZW5tb2RlOworICAgIGctPnN0YXJ0X2ZyZXEgID0gc3RhcnRfZnJlcTsKKyAgICBnLT5zdG9wX2ZyZXEgICA9IHN0b3BfZnJlcTsKKyAgICBnLT5kdXJhdGlvbiAgICA9ICh1bnNpZ25lZCBsb25nKSBmbG9vciAoIGR1cmF0aW9uICogZy0+c2FtcGxlX2ZyZXEgKyAwLjUgKTsKKyAgICAKKyAgICBpZiAoIGctPmR1cmF0aW9uIDwgMiApCisJcmV0dXJuIC0xOworCisgICAgaWYgKCBnLT5nZW5tb2RlID49IHNpemVvZiAoZnVuYykvc2l6ZW9mKCpmdW5jKSApCisJcmV0dXJuIC0xOworICAgIAorICAgIGctPnBhcmFtMSA9IGZ1bmMgW2ctPmdlbm1vZGVdICggZy0+c3RhcnRfZnJlcSAvIGctPnNhbXBsZV9mcmVxICk7CisgICAgZy0+cGFyYW0yID0gKCBmdW5jIFsgZy0+Z2VubW9kZSBdICggZy0+c3RvcF9mcmVxIC8gZy0+c2FtcGxlX2ZyZXEgKSAtIGctPnBhcmFtMSApIAorCSAgICAgIC8gKCBnLT5kdXJhdGlvbiAtIDEgKTsKKyAgICBnLT5waGFzZSAgPSAwLkw7CisgICAgZy0+Y291bnRlcj0gMDsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworbG9uZyBkb3VibGUgIGl0ZXJhdGVfZ2VuZXJhdG9yICggZ2VuZXJhdG9yX3QqIGNvbnN0IGcgKQoreworICAgIGxvbmcgZG91YmxlICBmcmVxOworICAgIAorICAgIGZyZXEgPSBpbnZfZnVuYyBbIGctPmdlbm1vZGUgXSAoIGctPnBhcmFtMSArIGctPmNvdW50ZXIrKyAqIGctPnBhcmFtMiApOworCQorICAgIGctPnBoYXNlICs9IGZyZXE7CisgICAgaWYgKGctPnBoYXNlID4gMTUuKQorCWctPnBoYXNlIC09IDE2LjsKKyAgICByZXR1cm4gc2luICggMi4qTV9QSSAqIGctPnBoYXNlICk7Cit9CisKK2xvbmcgZG91YmxlICBnZXRfc2luZSAoIGdlbmVyYXRvcl90KiBjb25zdCBnICkKK3sKKyAgICByZXR1cm4gc2luICggMi4qTV9QSSAqIGctPnBoYXNlICk7Cit9CisKK2xvbmcgZG91YmxlICBnZXRfY29zaW5lICggZ2VuZXJhdG9yX3QqIGNvbnN0IGcgKQoreworICAgIHJldHVybiBjb3MgKCAyLipNX1BJICogZy0+cGhhc2UgKTsKK30KKworCitsb25nIGRvdWJsZSAgZnJlcXVlbmN5ICggY29uc3QgZ2VuZXJhdG9yX3QqIGNvbnN0IGcgKQoreworICAgIHJldHVybiBpbnZfZnVuYyBbIGctPmdlbm1vZGUgXSAoIGctPnBhcmFtMSArIGctPmNvdW50ZXIgKiBnLT5wYXJhbTIgKSAqIGctPnNhbXBsZV9mcmVxOworfQorCitpbnQgIGNsb3NlX2dlbmVyYXRvciAoIGdlbmVyYXRvcl90KiBjb25zdCBnICkKK3sKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGFtcGxpdHVkZSBzdHVmZgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICB1cCAgICAgICAgID0gMCwKKyAgICBkb3duICAgICAgID0gMSwKKyAgICB0dXJuX3VwICAgID0gMiwKKyAgICB0dXJuX2Rvd24gID0gMywKKyAgICBzdGlsbF91cCAgID0gNCwKKyAgICBzdGlsbF9kb3duID0gNSwKKyAgICBjaGFuZ2UgICAgID0gNgorfSBkaXJlY3Rpb25fdDsKKwkKKwkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBsb25nIGRvdWJsZSAgICBzYW1wbGVfZnJlcTsKKyAgICBkaXJlY3Rpb25fdCAgICBkaXJlY3Rpb247ICAgICAgICAgICAgLy8gZG93biwgdXAsIHN0aWxsX3VwLCBzdGlsbF9kb3duLCB0dXJuX2Rvd24sIHR1cm5fdXAKKyAgICBpbnQgICAgICAgICAgICBtdWx0aXBsaWVyOyAgICAgICAgICAgLy8gLVRVUk5fU1RFUFM6IGRvd24sICtUVVJOX1NURVBTIHVwCisgICAgbG9uZyBkb3VibGUgICAgYW1wbGl0dWRlOworICAgIGxvbmcgZG91YmxlICAgIGRlbHRhX2FtcGxpdHVkZTsKKyAgICBsb25nICAgICAgICAgICBkaXJlY3Rpb25fY2hhbmdlOworfSBhbXBsaXR1ZGVfdDsKKworaW50ICBvcGVuX2FtcGxpZmllciAoIAorICAgIGFtcGxpdHVkZV90KiBjb25zdCAgICAgICAgYSwKKyAgICBjb25zdCBzb3VuZGNhcmRfdCogY29uc3QgIHMsCisgICAgY29uc3QgbG9uZyBkb3VibGUgICAgICAgICBzdGFydF9hbXBsLAorICAgIGNvbnN0IGRvdWJsZSAgICAgICAgICAgICAgZEJfcGVyX3NlYyApCit7CisgICAgYS0+c2FtcGxlX2ZyZXEgICAgICA9IHMtPnNhbXBsZV9mcmVxOworICAgIGEtPmRpcmVjdGlvbiAgICAgICAgPSB1cDsKKyAgICBhLT5tdWx0aXBsaWVyICAgICAgID0gK1RVUk5fU1RFUFM7CisgICAgYS0+YW1wbGl0dWRlICAgICAgICA9IHN0YXJ0X2FtcGwgKiAzMjc2Ny47CisgICAgYS0+ZGVsdGFfYW1wbGl0dWRlICA9IGRCX3Blcl9zZWMgKiAwLjExNTEyOTI1NDY0OTcwMjI4NDIgLyBzLT5zYW1wbGVfZnJlcSAvIFRVUk5fU1RFUFM7CisgICAgYS0+ZGlyZWN0aW9uX2NoYW5nZSA9IDA7CisgICAgCisgICAgc3JhbmQgKCB0aW1lIChOVUxMKSApOworICAgIHJldHVybiAwOworfQorCitsb25nIGRvdWJsZSBpdGVyYXRlX2FtcGxpZmllciAoIGFtcGxpdHVkZV90KiBjb25zdCBhICkKK3sKKyAgICBzd2l0Y2ggKCBhLT5kaXJlY3Rpb24gKSB7CisgICAgY2FzZSBzdGlsbF91cDoKKyAgICAgICAgYXNzZXJ0IChhLT5tdWx0aXBsaWVyID09ICtUVVJOX1NURVBTKTsKKyAgICAgICAgaWYgKGEtPmRpcmVjdGlvbl9jaGFuZ2UgPiAwICkKKwkgICAgYS0+ZGlyZWN0aW9uX2NoYW5nZS0tOworCWVsc2UKKwkgICAgYS0+ZGlyZWN0aW9uID0gdHVybl9kb3duOworCWJyZWFrOworICAgIGNhc2Ugc3RpbGxfZG93bjoKKyAgICAgICAgYXNzZXJ0IChhLT5tdWx0aXBsaWVyID09IC1UVVJOX1NURVBTKTsKKyAgICAgICAgaWYgKGEtPmRpcmVjdGlvbl9jaGFuZ2UgPiAwICkKKwkgICAgYS0+ZGlyZWN0aW9uX2NoYW5nZS0tOworCWVsc2UKKwkgICAgYS0+ZGlyZWN0aW9uID0gdHVybl91cDsKKwlicmVhazsKKyAgICBjYXNlIHR1cm5fdXA6CisgICAgICAgIGFzc2VydCAoYS0+ZGlyZWN0aW9uX2NoYW5nZSA9PSAwKTsKKwlpZiAoIGEtPm11bHRpcGxpZXIgPCArVFVSTl9TVEVQUyApCisJICAgIGEtPm11bHRpcGxpZXIrKzsKKwllbHNlCisJICAgIGEtPmRpcmVjdGlvbiA9IHVwOworCWJyZWFrOworICAgIGNhc2UgdHVybl9kb3duOgorICAgICAgICBhc3NlcnQgKGEtPmRpcmVjdGlvbl9jaGFuZ2UgPT0gMCk7CisJaWYgKCBhLT5tdWx0aXBsaWVyID4gLVRVUk5fU1RFUFMgKQorCSAgICBhLT5tdWx0aXBsaWVyLS07CisJZWxzZQorCSAgICBhLT5kaXJlY3Rpb24gPSBkb3duOworCWJyZWFrOworICAgIGNhc2UgdXA6CisgICAgICAgIGFzc2VydCAoYS0+bXVsdGlwbGllciA9PSArVFVSTl9TVEVQUyk7CisgICAgICAgIGFzc2VydCAoYS0+ZGlyZWN0aW9uX2NoYW5nZSA9PSAwKTsKKwlicmVhazsKKyAgICBjYXNlIGRvd246CisgICAgICAgIGFzc2VydCAoYS0+bXVsdGlwbGllciA9PSAtVFVSTl9TVEVQUyk7CisgICAgICAgIGFzc2VydCAoYS0+ZGlyZWN0aW9uX2NoYW5nZSA9PSAwKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWZwcmludGYgKCBzdGRlcnIsICJcblxyKioqIEJ1ZyEgKioqXG4iKTsKKwlicmVhazsKKyAgICB9CisKKyAgICBhLT5hbXBsaXR1ZGUgKj0gMS5MICsgYS0+ZGVsdGFfYW1wbGl0dWRlICogYS0+bXVsdGlwbGllcjsKKyAgICByZXR1cm4gYS0+YW1wbGl0dWRlOyAgICAgICAgIAorfQorCitsb25nIGRvdWJsZSBhbXBsaXR1ZGUgKCBjb25zdCBhbXBsaXR1ZGVfdCogY29uc3QgYSApCit7CisgICAgcmV0dXJuIGEtPmFtcGxpdHVkZSAvIDMyNzY3LjsKK30KKworaW50IGNoYW5nZV9kaXJlY3Rpb24gKCBhbXBsaXR1ZGVfdCogY29uc3QgYSwgZGlyZWN0aW9uX3QgbmV3X2RpcmVjdGlvbiApCit7CisgICAgc3dpdGNoICggbmV3X2RpcmVjdGlvbiApIHsKKyAgICBjYXNlIHVwOgorICAgICAgICBpZiAoYS0+ZGlyZWN0aW9uID09IGRvd24pIHsKKwkgICAgYS0+ZGlyZWN0aW9uID0gc3RpbGxfZG93bjsKKwl9IGVsc2UgeworCSAgICBmcHJpbnRmICggc3RkZXJyLCAiRGlyZWN0aW9uIG5vdCBkb3duLCBzbyBpZ25vcmVkXG4iICk7CisJICAgIHJldHVybiAtMTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBkb3duOgorICAgICAgICBpZiAoYS0+ZGlyZWN0aW9uID09IHVwKSB7CisJICAgIGEtPmRpcmVjdGlvbiA9IHN0aWxsX3VwOworCX0gZWxzZSB7CisJICAgIGZwcmludGYgKCBzdGRlcnIsICJEaXJlY3Rpb24gbm90IHVwLCBzbyBpZ25vcmVkXG4iICk7CisJICAgIHJldHVybiAtMTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBjaGFuZ2U6CisgICAgICAgIHN3aXRjaCAoIGEtPmRpcmVjdGlvbiApIHsKKyAgICAgICAgY2FzZSB1cDoKKwkgICAgYS0+ZGlyZWN0aW9uID0gc3RpbGxfdXA7CisJICAgIGJyZWFrOworCWNhc2UgZG93bjoKKwkgICAgYS0+ZGlyZWN0aW9uID0gc3RpbGxfZG93bjsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgZnByaW50ZiAoIHN0ZGVyciwgIkRpcmVjdGlvbiBzdGlsbCBjaGFuZ2luZywgc28gaWdub3JlZFxuIiApOworCSAgICByZXR1cm4gLTE7CisJfQorCWJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisJZnByaW50ZiAoIHN0ZGVyciwgIkRpcmVjdGlvbiB1bmtub3duLCBzbyBpZ25vcmVkXG4iICk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGEtPmRpcmVjdGlvbl9jaGFuZ2UgPSAxICsgcmFuZCAoKSAqIChhLT5zYW1wbGVfZnJlcSAqIERFTEFZX1VOVElMX1hDSEcgLyBSQU5EX01BWCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCAgY2xvc2VfYW1wbGlmaWVyICggYW1wbGl0dWRlX3QqIGNvbnN0IGEgKQoreworICAgIHJldHVybiAwOworfQorCisKK2RvdWJsZSBBVEggKCBkb3VibGUgZnJlcSApCit7CisgICAgc3RhdGljIGZsb2F0IHRhYiBbXSA9IHsKKyAgICAgICAgLyogICAgMTAuMCAqLyAgOTYuNjksIDk2LjY5LCA5Ni4yNiwgOTUuMTIsCisgICAgICAgIC8qICAgIDEyLjYgKi8gIDkzLjUzLCA5MS4xMywgODguODIsIDg2Ljc2LAorICAgICAgICAvKiAgICAxNS44ICovICA4NC42OSwgODIuNDMsIDc5Ljk3LCA3Ny40OCwKKyAgICAgICAgLyogICAgMjAuMCAqLyAgNzQuOTIsIDcyLjM5LCA3MC4wMCwgNjcuNjIsCisgICAgICAgIC8qICAgIDI1LjEgKi8gIDY1LjI5LCA2My4wMiwgNjAuODQsIDU5LjAwLAorICAgICAgICAvKiAgICAzMS42ICovICA1Ny4xNywgNTUuMzQsIDUzLjUxLCA1MS42NywKKyAgICAgICAgLyogICAgMzkuOCAqLyAgNTAuMDQsIDQ4LjEyLCA0Ni4zOCwgNDQuNjYsCisgICAgICAgIC8qICAgIDUwLjEgKi8gIDQzLjEwLCA0MS43MywgNDAuNTAsIDM5LjIyLAorICAgICAgICAvKiAgICA2My4xICovICAzNy4yMywgMzUuNzcsIDM0LjUxLCAzMi44MSwKKyAgICAgICAgLyogICAgNzkuNCAqLyAgMzEuMzIsIDMwLjM2LCAyOS4wMiwgMjcuNjAsCisgICAgICAgIC8qICAgMTAwLjAgKi8gIDI2LjU4LCAyNS45MSwgMjQuNDEsIDIzLjAxLAorICAgICAgICAvKiAgIDEyNS45ICovICAyMi4xMiwgMjEuMjUsIDIwLjE4LCAxOS4wMCwKKyAgICAgICAgLyogICAxNTguNSAqLyAgMTcuNzAsIDE2LjgyLCAxNS45NCwgMTUuMTIsCisgICAgICAgIC8qICAgMTk5LjUgKi8gIDE0LjMwLCAxMy40MSwgMTIuNjAsIDExLjk4LAorICAgICAgICAvKiAgIDI1MS4yICovICAxMS4zNiwgMTAuNTcsICA5Ljk4LCAgOS40MywKKyAgICAgICAgLyogICAzMTYuMiAqLyAgIDguODcsICA4LjQ2LCAgNy40NCwgIDcuMTIsCisgICAgICAgIC8qICAgMzk4LjEgKi8gICA2LjkzLCAgNi42OCwgIDYuMzcsICA2LjA2LAorICAgICAgICAvKiAgIDUwMS4yICovICAgNS44MCwgIDUuNTUsICA1LjI5LCAgNS4wMiwKKyAgICAgICAgLyogICA2MzEuMCAqLyAgIDQuNzUsICA0LjQ4LCAgNC4yMiwgIDMuOTgsCisgICAgICAgIC8qICAgNzk0LjMgKi8gICAzLjc1LCAgMy41MSwgIDMuMjcsICAzLjIyLAorICAgICAgICAvKiAgMTAwMC4wICovICAgMy4xMiwgIDMuMDEsICAyLjkxLCAgMi42OCwKKyAgICAgICAgLyogIDEyNTguOSAqLyAgIDIuNDYsICAyLjE1LCAgMS44MiwgIDEuNDYsCisgICAgICAgIC8qICAxNTg0LjkgKi8gICAxLjA3LCAgMC42MSwgIDAuMTMsIC0wLjM1LAorICAgICAgICAvKiAgMTk5NS4zICovICAtMC45NiwgLTEuNTYsIC0xLjc5LCAtMi4zNSwKKyAgICAgICAgLyogIDI1MTEuOSAqLyAgLTIuOTUsIC0zLjUwLCAtNC4wMSwgLTQuMjEsCisgICAgICAgIC8qICAzMTYyLjMgKi8gIC00LjQ2LCAtNC45OSwgLTUuMzIsIC01LjM1LAorICAgICAgICAvKiAgMzk4MS4xICovICAtNS4xMywgLTQuNzYsIC00LjMxLCAtMy4xMywKKyAgICAgICAgLyogIDUwMTEuOSAqLyAgLTEuNzksICAwLjA4LCAgMi4wMywgIDQuMDMsCisgICAgICAgIC8qICA2MzA5LjYgKi8gICA1LjgwLCAgNy4zNiwgIDguODEsIDEwLjIyLAorICAgICAgICAvKiAgNzk0My4zICovICAxMS41NCwgMTIuNTEsIDEzLjQ4LCAxNC4yMSwKKyAgICAgICAgLyogMTAwMDAuMCAqLyAgMTQuNzksIDEzLjk5LCAxMi44NSwgMTEuOTMsCisgICAgICAgIC8qIDEyNTg5LjMgKi8gIDEyLjg3LCAxNS4xOSwgMTkuMTQsIDIzLjY5LAorICAgICAgICAvKiAxNTg0OC45ICovICAzMy41MiwgNDguNjUsIDU5LjQyLCA2MS43NywKKyAgICAgICAgLyogMTk5NTIuNiAqLyAgNjMuODUsIDY2LjA0LCA2OC4zMywgNzAuMDksCisgICAgICAgIC8qIDI1MTE4LjkgKi8gIDcwLjY2LCA3MS4yNywgNzEuOTEsIDcyLjYwLAorICAgIH07CisgICAgZG91YmxlICAgIGZyZXFfbG9nOworICAgIGRvdWJsZSAgICBkQjsKKyAgICB1bnNpZ25lZCAgaW5kZXg7CisgICAgCisgICAgaWYgKCBmcmVxIDwgICAgMTAuICkgZnJlcSA9ICAgIDEwLjsKKyAgICBpZiAoIGZyZXEgPiAyNTAwMC4gKSBmcmVxID0gMjUwMDAuOworICAgIAorICAgIGZyZXFfbG9nID0gNDAuICogbG9nMTAgKDAuMSAqIGZyZXEpOyAgIC8qIDQgc3RlcHMgcGVyIHRoaXJkLCBzdGFydGluZyBhdCAxMCBIeiAqLworICAgIGluZGV4ICAgID0gKHVuc2lnbmVkKSBmcmVxX2xvZzsKKyAgICBhc3NlcnQgKCBpbmRleCA8IHNpemVvZih0YWIpL3NpemVvZigqdGFiKSApOworICAgIGRCID0gdGFiIFtpbmRleF0gKiAoMSArIGluZGV4IC0gZnJlcV9sb2cpICsgdGFiIFtpbmRleCsxXSAqIChmcmVxX2xvZyAtIGluZGV4KTsKKyAgICByZXR1cm4gcG93ICggMTAuLCAwLjA1KmRCICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBrZXlib2FyZCBzdHVmZgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICBpbml0OworICAgIHN0cnVjdCB0ZXJtaW9zICBzdG9yZWRfc2V0dGluZzsKKyAgICBzdHJ1Y3QgdGVybWlvcyAgY3VycmVudF9zZXR0aW5nOworfSBrZXlib2FyZF90OworCitzdGF0aWMga2V5Ym9hcmRfdCogX19rOworCisvKiBSZXN0b3JlIHRlcm0tc2V0dGluZ3MgdG8gdGhvc2Ugc2F2ZWQgd2hlbiB0ZXJtX2luaXQgd2FzIGNhbGxlZCAqLworCitzdGF0aWMgdm9pZCAgdGVybV9yZXN0b3JlICh2b2lkKQoreworICAgIHRjc2V0YXR0ciAoIDAsIFRDU0FOT1csICYoX19rLT5zdG9yZWRfc2V0dGluZykgKTsKK30gIC8qIHRlcm1fcmVzdG9yZSAqLworCisvKiBDbGVhbiB1cCB0ZXJtaW5hbDsgY2FsbGVkIG9uIGV4aXQgKi8KKworc3RhdGljIHZvaWQgIHRlcm1fZXhpdCAoIGludCBzaWcgKQoreworICAgIHRlcm1fcmVzdG9yZSAoKTsKK30gIC8qIHRlcm1fZXhpdCAqLworCisvKiBXaWxsIGJlIGNhbGxlZCB3aGVuIGN0cmwtWiBpcyBwcmVzc2VkLCB0aGlzIGNvcnJlY3RseSBoYW5kbGVzIHRoZSB0ZXJtaW5hbCAqLworCitzdGF0aWMgdm9pZCAgdGVybV9jdHJsX3ogKCBpbnQgc2lnICkKK3sKKyAgICBzaWduYWwgKCBTSUdUU1RQLCB0ZXJtX2N0cmxfeiApOworICAgIHRlcm1fcmVzdG9yZSAoKTsKKyAgICBraWxsICggZ2V0cGlkKCksIFNJR1NUT1AgKTsKK30gIC8qIHRlcm1fY3RybF96ICovCisKKy8qIFdpbGwgYmUgY2FsbGVkIHdoZW4gYXBwbGljYXRpb24gaXMgY29udGludWVkIGFmdGVyIGhhdmluZyBiZWVuIHN0b3BwZWQgKi8KKworc3RhdGljIHZvaWQgIHRlcm1fY29udCAoIGludCBzaWcgKQoreworICAgIHNpZ25hbCAoIFNJR0NPTlQsIHRlcm1fY29udCApOworICAgIHRjc2V0YXR0ciAoIDAsIFRDU0FOT1csICYoX19rLT5jdXJyZW50X3NldHRpbmcpICk7Cit9IC8qIHRlcm1fY29udCgpICovCisKK2ludCAgb3Blbl9rZXlib2FyZCAgICAoIGtleWJvYXJkX3QqIGNvbnN0IGsgKQoreworICAgIF9fayA9IGs7CisgICAgdGNnZXRhdHRyICggMCwgJihrLT5zdG9yZWRfc2V0dGluZykgKTsKKyAgICB0Y2dldGF0dHIgKCAwLCAmKGstPmN1cnJlbnRfc2V0dGluZykgKTsKKworICAgIHNpZ25hbCAoIFNJR0lOVCwgIHRlcm1fZXhpdCAgICk7ICAgICAgIC8qIFdlIF9tdXN0XyBjbGVhbiB1cCB3aGVuIHdlIGV4aXQgKi8KKyAgICBzaWduYWwgKCBTSUdRVUlULCB0ZXJtX2V4aXQgICApOworICAgIHNpZ25hbCAoIFNJR1RTVFAsIHRlcm1fY3RybF96ICk7ICAgICAgIC8qIEN0cmwtWiBtdXN0IGFsc28gYmUgaGFuZGxlZCAgICAgKi8KKyAgICBzaWduYWwgKCBTSUdDT05ULCB0ZXJtX2NvbnQgICApOworLy8gIGF0ZXhpdCAoIHRlcm1fZXhpdCApOworCisgICAgLyogT25lIG9yIG1vcmUgY2hhcmFjdGVycyBhcmUgc3VmZmljaWVudCB0byBjYXVzZSBhIHJlYWQgdG8gcmV0dXJuICovCisgICAgY2ZtYWtlcmF3ICggJihrLT5jdXJyZW50X3NldHRpbmcpICk7CisgICAgay0+Y3VycmVudF9zZXR0aW5nLmNfb2ZsYWcgICAgIHw9IE9OTENSIHwgT1BPU1Q7ICAvKiBlbmFibGVzIE5MID0+IENSTEYgb24gb3V0cHV0ICovCisgICAgCisgICAgdGNzZXRhdHRyICggMCwgVENTQU5PVywgJihrLT5jdXJyZW50X3NldHRpbmcpICk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCAgZ2V0Y2hhcl9rZXlib2FyZCAoIGtleWJvYXJkX3QqIGNvbnN0IGsgKQoreworICAgIHN0cnVjdCB0aW1ldmFsICB0OworICAgIGZkX3NldCAgICAgICAgICBmZCBbMV07CisgICAgaW50ICAgICAgICAgICAgIHJldDsKKyAgICB1bnNpZ25lZCBjaGFyICAgYzsKKworICAgIEZEX1NFVCAoMCwgZmQpOworICAgIHQudHZfc2VjICA9IDA7CisgICAgdC50dl91c2VjID0gMDsKKworICAgIHJldCA9IHNlbGVjdCAoIDEsIGZkLCBOVUxMLCBOVUxMLCAmdCApOworICAgIAorICAgIHN3aXRjaCAoIHJldCApIHsKKyAgICBjYXNlICAwOgorICAgICAgICByZXR1cm4gLTE7CisgICAgY2FzZSAgMToKKyAgICAgICAgcmV0ID0gcmVhZCAoMCwgJmMsIDEpOworICAgICAgICByZXR1cm4gcmV0ID09IDEgID8gIGMgIDogIC0xOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9Cit9CisKK2ludCAgY2xvc2Vfa2V5Ym9hcmQgICAoIGtleWJvYXJkX3QqIGNvbnN0IGsgKQoreworICAgIHRlcm1fcmVzdG9yZSAoKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgcmVwb3J0aW5nIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgIHJlcG9ydF9vcGVuICggdm9pZCApCit7CisgICAgc3RhdGljIGNoYXIgYnVmZiBbMzI3NjddOworICAgIGZmbHVzaCAgKCBzdGRvdXQgKTsKKyAgICBzZXR2YnVmICggc3Rkb3V0LCBidWZmLCBfSU9GQkYsIHNpemVvZihidWZmKSApOworICAgIHJldHVybiAwOworfQorCitpbnQgIHJlcG9ydCAoIGNvbnN0IGdlbmVyYXRvcl90KiBjb25zdCBnLCBjb25zdCBhbXBsaXR1ZGVfdCogY29uc3QgYSApCit7CisgICAgc3RhdGljIGRvdWJsZSAgbGFzdF9mcmVxICA9IC0xLjsKKyAgICBzdGF0aWMgZG91YmxlICBsYXN0X2xldmVsID0gLTEuOworICAgIGRvdWJsZSAgICAgICAgIGZyZXE7CisgICAgZG91YmxlICAgICAgICAgbGV2ZWw7CisKKyAgICBmcmVxICA9IGZyZXF1ZW5jeSAoZyk7CisgICAgbGV2ZWwgPSAyMC4gKiBsb2cxMCAoYW1wbGl0dWRlIChhKSAqIEFUSCAoZnJlcSkgKSArIDgwLjsKKyAgICAKKyAgICBpZiAoIGxhc3RfZnJlcSA+PSAwICkKKyAgICAgICAgcHJpbnRmICggIiUxMS4zZiAlOC4yZlxuIiwgc3FydCAoZnJlcSpsYXN0X2ZyZXEpLCAwLjUgKiAobGV2ZWwrbGFzdF9sZXZlbCkgKTsKKyAgICBwcmludGYgKCAiIyAlOS4zZiAlOC4yZlxuIiwgZnJlcSwgbGV2ZWwgKTsKKyAgICAKKyAgICBmZmx1c2ggKCBzdGRvdXQgKTsKKyAgICAKKyAgICBsYXN0X2ZyZXEgID0gZnJlcTsKKyAgICBsYXN0X2xldmVsID0gbGV2ZWw7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCAgcmVwb3J0X2Nsb3NlICggdm9pZCApCit7CisgICAgcHJpbnRmICggIiUlJSVcblxuIiApOworICAgIGZmbHVzaCAgKCBzdGRvdXQgKTsKKyAgICBjbG9zZSAoIGR1cCAoIGZpbGVubyhzdGRvdXQpICkgKTsKKyAgICBzZXR2YnVmICggc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDAgKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgbWFpbiBzdHVmZgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIHsgCisgICAgbGVmdCAgICAgPSAwLCAKKyAgICByaWdodCAgICA9IDEsIAorICAgIHBoYXNlMCAgID0gMiwgCisgICAgYm90aCAgICAgPSAyLAorICAgIHBoYXNlOTAgID0gMywgCisgICAgcGhhc2UxODAgPSA0LCAKKyAgICBwaGFzZW1vZCA9IDUgCit9IGVhcm1vZGVfdDsKKworc3RhdGljIGxvbmcgZG91YmxlIHNjYWxhciAoIGNvbnN0IGRvdWJsZSogYSwgY29uc3QgZG91YmxlKiBiICkKK3sKKyAgICByZXR1cm4gIGFbIDBdKmJbIDBdICsgYVsgMV0qYlsgMV0gKyBhWyAyXSpiWyAyXSArIGFbIDNdKmJbIDNdCisgICAgICAgICAgICthWyA0XSpiWyA0XSArIGFbIDVdKmJbIDVdICsgYVsgNl0qYlsgNl0gKyBhWyA3XSpiWyA3XQorICAgICAgICAgICArYVsgOF0qYlsgOF0gKyBhWyA5XSpiWyA5XSArIGFbMTBdKmJbMTBdICsgYVsxMV0qYlsxMV0KKyAgICAgICAgICAgK2FbMTJdKmJbMTJdICsgYVsxM10qYlsxM10gKyBhWzE0XSpiWzE0XSArIGFbMTVdKmJbMTVdOworfQorCitpbnQgZXhwZXJpbWVudCAoIGdlbmVyYXRvcl90KiBjb25zdCAgZywKKwkJIGFtcGxpdHVkZV90KiBjb25zdCAgYSwKKwkJIGtleWJvYXJkX3QqICBjb25zdCAgaywKKwkJIHNvdW5kY2FyZF90KiBjb25zdCAgcywKKwkJIGVhcm1vZGVfdCAgICAgICAgICAgZWFybW9kZSApCit7ICAgIAorICAgIGxvbmcgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgajsKKyAgICBzdGVyZW9fdCAgICAgICBzYW1wbGVzIFs1MTJdOworICAgIHN0YXRpYyBkb3VibGUgIHF1YW50X2Vycm9ycyBbMl0gWzE2XTsKKyAgICBsb25nIGRvdWJsZSAgICB2YWw7CisgICAgZG91YmxlICAgICAgICAgYW1wbDsKKyAgICBsb25nICAgICAgICAgICBpdmFsOworICAgIAorICAgIGZwcmludGYgKCBzdGRlcnIsICJccisrKyAgdXAgICsrKyIgKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGctPmR1cmF0aW9uOyBpICs9IHNpemVvZihzYW1wbGVzKS9zaXplb2YoKnNhbXBsZXMpICkgeworICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiJTNsdSUlXGJcYlxiXGIiLCBpKjEwMGx1L2ctPmR1cmF0aW9uICk7CisJCisJZm9yIChqID0gMDsgaiA8IHNpemVvZihzYW1wbGVzKS9zaXplb2YoKnNhbXBsZXMpOyBqKysgKSB7CisJICAgIGFtcGwgPSBpdGVyYXRlX2FtcGxpZmllciAoYSkgKiBBVEggKGZyZXF1ZW5jeSAoZykpOworCSAgICB2YWwgID0gYW1wbCAqIGl0ZXJhdGVfZ2VuZXJhdG9yIChnKTsKKwkgICAgaXZhbCA9IChsb25nKSBmbG9vciAoIHZhbCArIDAuNSArIHNjYWxhciAocXVhbnRfZXJyb3JzWzBdLCBzLT5kaXRoZXIpICk7CisJICAgIAorCSAgICBpZiAoIGl2YWwgIT0gKHNhbXBsZV90KSBpdmFsICkgeworCQlyZXBvcnQgKGcsIGEpOworCQlmcHJpbnRmICggc3RkZXJyLCAiXHJPdmVycnVuICAgICBcblxuIiApOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgbWVtbW92ZSAoICYgcXVhbnRfZXJyb3JzIFswXSBbMV0sICYgcXVhbnRfZXJyb3JzIFswXSBbMF0sIAorCSAgICAgICAgICAgICAgc2l6ZW9mKHF1YW50X2Vycm9yc1swXSkgLSBzaXplb2YocXVhbnRfZXJyb3JzWzBdWzBdKSApOworCSAgICBxdWFudF9lcnJvcnMgWzBdIFswXSA9IHZhbCAtIGl2YWw7IAorCSAgICBzd2l0Y2ggKCBlYXJtb2RlICkgeworCSAgICBjYXNlIGJvdGg6IAorCSAgICAgICAgc2FtcGxlcyBbal0gWzBdID0gc2FtcGxlcyBbal0gWzFdID0gaXZhbDsgCisJCWJyZWFrOworCSAgICBjYXNlIGxlZnQ6IAorCSAgICAgICAgc2FtcGxlcyBbal0gWzBdID0gaXZhbDsKKwkJc2FtcGxlcyBbal0gWzFdID0gMDsgCisJCWJyZWFrOworCSAgICBjYXNlIHJpZ2h0OiAKKwkgICAgICAgIHNhbXBsZXMgW2pdIFswXSA9IDA7CisJCXNhbXBsZXMgW2pdIFsxXSA9IGl2YWw7IAorCQlicmVhazsKKwkgICAgY2FzZSBwaGFzZTE4MDogCisJICAgICAgICBzYW1wbGVzIFtqXSBbMF0gPSBpdmFsID09IC0zMjc2OCA/IDMyNzY3IDogLWl2YWw7CisJCXNhbXBsZXMgW2pdIFsxXSA9ICtpdmFsOyAKKwkJYnJlYWs7CisJICAgIGNhc2UgcGhhc2U5MDoKKwkgICAgICAgIHNhbXBsZXMgW2pdIFswXSA9IGl2YWw7CisJICAgICAgICB2YWwgID0gYW1wbCAqIGdldF9jb3NpbmUgKGcpOworCSAgICAgICAgaXZhbCA9IChsb25nKSBmbG9vciAoIHZhbCArIDAuNSArIHNjYWxhciAocXVhbnRfZXJyb3JzWzFdLCBzLT5kaXRoZXIpICk7CisJICAgICAgICBpZiAoIGl2YWwgIT0gKHNhbXBsZV90KSBpdmFsICkgeworCQkgICAgcmVwb3J0IChnLCBhKTsKKwkJICAgIGZwcmludGYgKCBzdGRlcnIsICJcck92ZXJydW4gICAgIFxuXG4iICk7CisJCSAgICByZXR1cm4gLTE7CisJICAgICAgICB9CisJICAgICAgICBtZW1tb3ZlICggJiBxdWFudF9lcnJvcnMgWzFdIFsxXSwgJiBxdWFudF9lcnJvcnMgWzFdIFswXSwgCisJICAgICAgICAgICAgICBzaXplb2YocXVhbnRfZXJyb3JzWzFdKSAtIHNpemVvZihxdWFudF9lcnJvcnNbMV1bMF0pICk7CisgIAkgICAgICAgIHF1YW50X2Vycm9ycyBbMV0gWzBdID0gdmFsIC0gaXZhbDsgCisJICAgICAgICBzYW1wbGVzIFtqXSBbMV0gPSBpdmFsOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICAgIGFzc2VydCAoMCk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKwlwbGF5X3NvdW5kY2FyZCAoIHMsIHNhbXBsZXMsIHNpemVvZihzYW1wbGVzKS9zaXplb2YoKnNhbXBsZXMpICk7CisJaWYgKCBhbXBsaXR1ZGUgKGEpICogQVRIIChmcmVxdWVuY3kgKGcpKSA8PSAzLjE2MjI3NzY2ZS02ICkgeworICAgICAgICAgICAgcmVwb3J0IChnLCBhKTsKKwkgICAgZnByaW50ZiAoIHN0ZGVyciwgIlxyVW5kZXJydW4gICAgICBcblxuIiApOworCSAgICByZXR1cm4gLTE7CisJfQorCQorCXN3aXRjaCAoIGdldGNoYXJfa2V5Ym9hcmQgKGspICkgeworCWNhc2UgJysnOgorCSAgICBmcHJpbnRmICggc3RkZXJyLCAiXHIrKysgIHVwICArKysiICk7CisJICAgIHJlcG9ydCAoZywgYSk7CisJICAgIGNoYW5nZV9kaXJlY3Rpb24gKCBhLCB1cCApOworCSAgICBicmVhazsKKwljYXNlICctJzoKKwkgICAgZnByaW50ZiAoIHN0ZGVyciwgIlxyLS0tIGRvd24gLS0tIiApOworICAgICAgICAgICAgcmVwb3J0IChnLCBhKTsKKwkgICAgY2hhbmdlX2RpcmVjdGlvbiAoIGEsIGRvd24gKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnXHInOgorCWNhc2UgJ1xuJzoKKwkgICAgZnByaW50ZiAoIHN0ZGVyciwgIlxyKiogY2hhbmdlICoqIiApOworICAgICAgICAgICAgcmVwb3J0IChnLCBhKTsKKwkgICAgY2hhbmdlX2RpcmVjdGlvbiAoIGEsIGNoYW5nZSApOworCSAgICBicmVhazsKKwljYXNlICdDJyYweDFGOgorCWNhc2UgJ3EnOgorCWNhc2UgJ1EnOgorCWNhc2UgJ3gnOgorCWNhc2UgJ1gnOgorCSAgICBmcHJpbnRmICggc3RkZXJyLCAiXHJCcmVhayAgICAgICBcblxuIiApOworCSAgICBmZmx1c2ggICggc3RkZXJyICk7CisJICAgIHJldHVybiAtMTsKKwlkZWZhdWx0OgorCSAgICBmcHJpbnRmICggc3RkZXJyLCAiXGEiICk7CisJICAgIGJyZWFrOworCWNhc2UgLTE6CisJICAgIGJyZWFrOworCX0KKyAgICB9CisJCisgICAgZnByaW50ZiAoIHN0ZGVyciwgIlxyUmVhZHkgICAgICAgXG5cbiIgKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UgKCB2b2lkICkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBoZWxwW10gPSAKKyAgICAgICAgIidBYnNvbHV0ZSBUaHJlc2hvbGQgb2YgSGVhcmluZycgLS0gVmVyc2lvbiAwLjA3ICAgKEMpIEZyYW5rIEtsZW1tIDIwMDBcbiIKKwkiXG4iCisJInVzYWdlOlxuIiAKKwkiICAgIGF0aCAgdHlwZSBtaW5mcmVxIG1heGZyZXEgZHVyYXRpb24gYW1wbF9zcGVlZCBbc3RhcnRfbGV2ZWwgW2Vhcm1vZGVdID4gcmVwb3J0ZmlsZVxuIgorCSJcbiIKKwkiICAgICAgICAgdHlwZTogICAgICAgICBsaW5lYXIsIGxvZ2FyaXRobSwgc3F1YXJlLCBjdWJpYywgZXJiLCByZWNpcFxuIgorCSIgICAgICAgICBtaW5mcmVxOiAgICAgIGluaXRpYWwgZnJlcXVlbmN5IFtIel1cbiIKKwkiICAgICAgICAgbWF4ZnJlcTogICAgICBlbmQgZnJlcXVlbmN5IFtIel1cbiIKKwkiICAgICAgICAgZHVyYXRpb246ICAgICBkdXJhdGlvbiBvZiB0aGUgZXhwZXJpbWVudCBbc11cbiIKKwkiICAgICAgICAgYW1wbF9zcGVlZDogICBhbXBsaXR1ZGUgc2xvcGUgc3BlZWQgW3Bob24vc11cbiIKKwkiICAgICAgICAgc3RhcnRfbGV2ZWw6ICBhYnNvbHV0ZSBsZXZlbCBhdCBzdGFydHVwIFswLi4uMV1cbiIKKwkiICAgICAgICAgZWFybW9kZTogICAgICBsZWZ0LCByaWdodCwgYm90aCwgcGhhc2U5MCwgcGhhc2UxODBcbiIKKwkiXG4iCisJImV4YW1wbGU6XG4iCisgICAgICAgICIgICAgYXRoICBlcmIgIDcwMCAyMjAwMCA2MDAgMyAwLjAwMDEgPiByZXN1bHQxXG4iCisJIiAgICBhdGggIGVyYiAxNDAwICAgIDE2IDM2MCAzIDAuMDAwMSA+IHJlc3VsdDJcbiIKKwkiXG4iCisJImhhbmRsaW5nOlxuIgorCSIgICAgcHJlc3MgJy0nIG9uY2Ugd2hlbiB5b3Ugc3RhcnQgaGVhcmluZyBhIHRvbmVcbiIKKwkiICAgIHByZXNzICcrJyBvbmNlIHdoZW4geW91IHN0b3AgaGVhcmluZyBhIHRvbmVcbiIKKwkiICAgIHByZXNzICdxJyB0byBlYXJseSBsZWF2ZSB0aGUgcHJvZ3JhbVxuIgorCSIgICAgb24gZXJyb3JzIHRoZSBwcmVzc2VkIGtleSBpcyBpZ25vcmVkXG4iOworICAgIAorICAgIGZwcmludGYgKCBzdGRlcnIsICIlc1xuIiwgaGVscCApOworfQorCitpbnQgbWFpbiAoIGludCBhcmdjLCBjaGFyKiogYXJndiApCit7CisgICAgZ2VuZXJhdG9yX3QgIGc7CisgICAgYW1wbGl0dWRlX3QgIGE7CisgICAgc291bmRjYXJkX3QgIHM7CisgICAga2V5Ym9hcmRfdCAgIGs7CisgICAgZ2VubW9kZV90ICAgIGdlbm1vZGU7CisgICAgZWFybW9kZV90ICAgIGVhcm1vZGU7CisKKyAgICBpZiAoIGFyZ2MgPT0gMSApIHsKKyAgICAgICAgdXNhZ2UgKCk7CisgICAgICAgIHN5c3RlbSAoICIuL2F0aCBlcmIgIDcwMCAyMjAwMCA2MDAgMyAwLjAwMDEgPiByZXN1bHQxIiApOworCXN5c3RlbSAoICIuL2F0aCBlcmIgMTQwMCAgICAxNiAzNjAgMyAwLjAwMDEgPiByZXN1bHQyIiApOworCXN5c3RlbSAoICJ4bWdyIHJlc3VsdDEgcmVzdWx0MiAmPiAvZGV2L251bGwgJiIgKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgaWYgKCBhcmdjIDwgNiApIHsKKwl1c2FnZSAoKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgaWYgICAgICAoIDAgPT0gc3RybmNtcCAoIGFyZ3ZbMV0sICJsaSIgLCAyKSApIGdlbm1vZGUgPSBsaW5lYXI7CisgICAgZWxzZSBpZiAoIDAgPT0gc3RybmNtcCAoIGFyZ3ZbMV0sICJsbyIgLCAyKSApIGdlbm1vZGUgPSBsb2dhcml0aG07CisgICAgZWxzZSBpZiAoIDAgPT0gc3RybmNtcCAoIGFyZ3ZbMV0sICJzcSIgLCAyKSApIGdlbm1vZGUgPSBzcXVhcmU7CisgICAgZWxzZSBpZiAoIDAgPT0gc3RybmNtcCAoIGFyZ3ZbMV0sICJjdSIgLCAyKSApIGdlbm1vZGUgPSBjdWJpYzsKKyAgICBlbHNlIGlmICggMCA9PSBzdHJuY21wICggYXJndlsxXSwgImVyIiAsIDIpICkgZ2VubW9kZSA9IGVyYjsKKyAgICBlbHNlIGlmICggMCA9PSBzdHJuY21wICggYXJndlsxXSwgInJlIiAsIDIpICkgZ2VubW9kZSA9IHJlY2lwOworICAgIGVsc2UgeworCXVzYWdlICgpOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmICAgICAgKCBhcmdjIDwgOCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFybW9kZSA9IGJvdGg7CisgICAgZWxzZSBpZiAoIDAgPT0gc3RybmNtcCAoIGFyZ3ZbN10sICJsZSIgICAgICwgMikgKSBlYXJtb2RlID0gbGVmdDsKKyAgICBlbHNlIGlmICggMCA9PSBzdHJuY21wICggYXJndls3XSwgInJpIiAgICAgLCAyKSApIGVhcm1vZGUgPSByaWdodDsKKyAgICBlbHNlIGlmICggMCA9PSBzdHJuY21wICggYXJndls3XSwgImJvIiAgICAgLCAyKSApIGVhcm1vZGUgPSBib3RoOworICAgIGVsc2UgaWYgKCAwID09IHN0cm5jbXAgKCBhcmd2WzddLCAicGhhc2U5IiAsIDYpICkgZWFybW9kZSA9IHBoYXNlOTA7CisgICAgZWxzZSBpZiAoIDAgPT0gc3RybmNtcCAoIGFyZ3ZbN10sICJwaGFzZTEiICwgNikgKSBlYXJtb2RlID0gcGhhc2UxODA7CisgICAgZWxzZSB7CisJdXNhZ2UgKCk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgCisgICAgb3Blbl9zb3VuZGNhcmQgKCAmcywgQVVESU9fREVWSUNFLCBzaXplb2Yoc3RlcmVvX3QpL3NpemVvZihzYW1wbGVfdCksIENIQVJfQklUKnNpemVvZihzYW1wbGVfdCksIDk2MDAwLjAgKTsKKyAgICBvcGVuX2dlbmVyYXRvciAoICZnLCAmcywgZ2VubW9kZSwgYXRvZiAoYXJndls0XSksIGF0b2YgKGFyZ3ZbMl0pLCBhdG9mIChhcmd2WzNdKSApOworICAgIG9wZW5fYW1wbGlmaWVyICggJmEsICZzLCBhcmdjID4gNiAgPyAgYXRvZiAoYXJndls2XSkgIDogIDAuMDAwMSwgYXRvZiAoYXJndls1XSkgKTsKKyAgICBvcGVuX2tleWJvYXJkICAoICZrICk7CisKKyAgICByZXBvcnRfb3BlbiAgICAoICk7CisgICAgZXhwZXJpbWVudCAgICAgKCAmZywgJmEsICZrLCAmcywgZWFybW9kZSApOworICAgIHJlcG9ydF9jbG9zZSAgICggKTsKKyAgICAKKyAgICBjbG9zZV9rZXlib2FyZCAoICZrICk7CisgICAgY2xvc2VfYW1wbGlmaWVyKCAmYSApOworICAgIGNsb3NlX2dlbmVyYXRvciggJmcgKTsKKyAgICBjbG9zZV9zb3VuZGNhcmQoICZzICk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGVuZCBvZiBhdGguYyAqLworCisKZGlmZiAtLWdpdCBhL21pc2MvYXVlbmMgYi9taXNjL2F1ZW5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwZDljODEKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL2F1ZW5jCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorIyAKKyMgYXVlbmMgLS0gdmVyc2lvbiAwLjEKKyMKKyMgQSB3cmFwcGVyIGZvciBsYW1lIHRvIGVuY29kZSBtdWx0aXBsZSBmaWxlcy4gIEJ5IGRlZmF1bHQsIGEgLndhdgorIyBleHRlbnNpb24gaXMgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgYnkgLm1wMyAuCisjCisjIChDKSAxOTk5IEdlcmhhcmQgV2VzcCA8Z3dlc3BAY29zeS5zYmcuYWMuYXQ+IHVuZGVyIHRoZSBHUEwuCisKKyMgc2V0IHRoZSB2YXJpYWJsZXMgYmVsb3cgYWNjb3JkaW5nIHRvIHlvdXIgdGFzdGUKK0xBTUU9bGFtZQorTEFNRV9PUFRTPSItUyAtaCAtdiAtViAwIC1iIDI1NiIgIyBoaWdoIHF1YWxpdHksIHNpbGVudCBvcGVyYXRpb24KKworaWYgWyAkIyAtbHQgMSBdIDsgdGhlbgorICBleGVjIDE+JjIKKyAgY2F0IDw8IF9FT0ZfCit1c2FnZTogJDAgW29wdGlvbnNdIGZpbGUuLi4KK29wdGlvbnM6CisgIC1kIC0tZGVsZXRlOiBkZWxldGUgb3JpZ2luYWwgZmlsZSBhZnRlciBzdWNjZXNzZnVsIGVuY29kaW5nCitfRU9GXworICBleGl0IDEKK2ZpCisKK3Vuc2V0IERFTEVURQorY2FzZSAiJDEiIGluCisgIC1kIHwgLS1kZWxldGUgKSBERUxFVEU9MSA7IHNoaWZ0IDs7Citlc2FjCisKK2ZvciBmCitkbworICAkTEFNRSAkTEFNRV9PUFRTICIkZiIgYGJhc2VuYW1lICIkZiIgLndhdmAubXAzIHx8IHsKKyAgICBleGVjIDE+JjIKKyAgICBlY2hvICJlbmNvZGluZyBvZiAkZiBmYWlsZWQsIGFib3J0aW5nLi4uIgorICAgIGV4aXQgMQorICB9CisgIGlmIFsgLW4gIiRERUxFVEUiIF0gOyB0aGVuCisgICAgcm0gLWYgIiRmIgorICBmaQorZG9uZQpkaWZmIC0tZ2l0IGEvbWlzYy9kZXBjb21wIGIvbWlzYy9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0NzAxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL2RlcGNvbXAKQEAgLTAsMCArMSw1MzAgQEAKKyMhIC9iaW4vc2gKKyMgZGVwY29tcCAtIGNvbXBpbGUgYSBwcm9ncmFtIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzIGFzIHNpZGUtZWZmZWN0cworCitzY3JpcHR2ZXJzaW9uPTIwMDUtMDctMDkuMTEKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KKyAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRkZXBtb2RlIiB8fCB0ZXN0IC16ICIkc291cmNlIiB8fCB0ZXN0IC16ICIkb2JqZWN0IjsgdGhlbgorICBlY2hvICJkZXBjb21wOiBWYXJpYWJsZXMgc291cmNlLCBvYmplY3QgYW5kIGRlcG1vZGUgbXVzdCBiZSBzZXQiIDE+JjIKKyAgZXhpdCAxCitmaQorCisjIERlcGVuZGVuY2llcyBmb3Igc3ViL2Jhci5vIG9yIHN1Yi9iYXIub2JqIGdvIGludG8gc3ViLy5kZXBzL2Jhci5Qby4KK2RlcGZpbGU9JHtkZXBmaWxlLWBlY2hvICIkb2JqZWN0IiB8CisgIHNlZCAnc3xbXlxcL10qJHwnJHtERVBESVItLmRlcHN9Jy8mfDtzfFwuXChbXi5dKlwpJHwuUFwxfDtzfFBvYmokfFBvfCdgfQordG1wZGVwZmlsZT0ke3RtcGRlcGZpbGUtYGVjaG8gIiRkZXBmaWxlIiB8IHNlZCAncy9cLlwoW14uXSpcKSQvLlRcMS8nYH0KKworcm0gLWYgIiR0bXBkZXBmaWxlIgorCisjIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKKyMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCisjIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCisjIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgoraWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KKyAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCisgIGdjY2ZsYWc9LU0KKyAgZGVwbW9kZT1nY2MKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBkYXNobXN0ZG91dCB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50LgorICAgZGFzaG1mbGFnPS14TQorICAgZGVwbW9kZT1kYXNobXN0ZG91dAorZmkKKworY2FzZSAiJGRlcG1vZGUiIGluCitnY2MzKQorIyMgZ2NjIDMgaW1wbGVtZW50cyBkZXBlbmRlbmN5IHRyYWNraW5nIHRoYXQgZG9lcyBleGFjdGx5IHdoYXQKKyMjIHdlIHdhbnQuICBZYXkhICBOb3RlOiBmb3Igc29tZSByZWFzb24gbGlidG9vbCAxLjQgZG9lc24ndCBsaWtlCisjIyBpdCBpZiAtTUQgLU1QIGNvbWVzIGFmdGVyIHRoZSAtTUYgc3R1ZmYuICBIbW0uCisgICIkQCIgLU1UICIkb2JqZWN0IiAtTUQgLU1QIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBtdiAiJHRtcGRlcGZpbGUiICIkZGVwZmlsZSIKKyAgOzsKKworZ2NjKQorIyMgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBnZXQgZGVwZW5kZW5jeSBvdXRwdXQgZnJvbSBnY2MuICBIZXJlJ3MKKyMjIHdoeSB3ZSBwaWNrIHRoaXMgcmF0aGVyIG9ic2N1cmUgbWV0aG9kOgorIyMgLSBEb24ndCB3YW50IHRvIHVzZSAtTUQgYmVjYXVzZSB3ZSdkIGxpa2UgdGhlIGRlcGVuZGVuY2llcyB0byBlbmQKKyMjICAgdXAgaW4gYSBzdWJkaXIuICBIYXZpbmcgdG8gcmVuYW1lIGJ5IGhhbmQgaXMgdWdseS4KKyMjICAgKFdlIG1pZ2h0IGVuZCB1cCBkb2luZyB0aGlzIGFueXdheSB0byBzdXBwb3J0IG90aGVyIGNvbXBpbGVycy4pCisjIyAtIFRoZSBERVBFTkRFTkNJRVNfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG1ha2VzIGdjYyBhY3QgbGlrZQorIyMgICAtTU0sIG5vdCAtTSAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuCisjIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCisjIyAgIHRoYW4gcmVuYW1pbmcpLgorICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KKyAgICBnY2NmbGFnPS1NRCwKKyAgZmkKKyAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIGFscGhhPUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKKyMjIFRoZSBzZWNvbmQgLWUgZXhwcmVzc2lvbiBoYW5kbGVzIERPUy1zdHlsZSBmaWxlIG5hbWVzIHdpdGggZHJpdmUgbGV0dGVycy4KKyAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCisgICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisjIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSBgZGVsZXRlZCBoZWFkZXIgZmlsZScgcHJvYmxlbS4KKyMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCisjIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKKyMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCisjIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCisjIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgYDonLiAgT24gdGhlIHRoZW9yeQorIyMgdGhhdCB0aGUgc3BhY2UgbWVhbnMgc29tZXRoaW5nLCB3ZSBhZGQgYSBzcGFjZSB0byB0aGUgb3V0cHV0IGFzCisjIyB3ZWxsLgorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaHApCisgICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQorICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCisgICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGV4aXQgMQorICA7OworCitzZ2kpCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICIkQCIgIi1XcCwtTUR1cGRhdGUsJHRtcGRlcGZpbGUiCisgIGVsc2UKKyAgICAiJEAiIC1NRHVwZGF0ZSAiJHRtcGRlcGZpbGUiCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuICAjIHllcywgdGhlIHNvdXJjZWZpbGUgZGVwZW5kIG9uIG90aGVyIGZpbGVzCisgICAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKworICAgICMgQ2xpcCBvZmYgdGhlIGluaXRpYWwgZWxlbWVudCAodGhlIGRlcGVuZGVudCkuICBEb24ndCB0cnkgdG8gYmUKKyAgICAjIGNsZXZlciBhbmQgcmVwbGFjZSB0aGlzIHdpdGggc2VkIGNvZGUsIGFzIElSSVggc2VkIHdvbid0IGhhbmRsZQorICAgICMgbGluZXMgd2l0aCBtb3JlIHRoYW4gYSBmaXhlZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoNDA5NiBpbgorICAgICMgSVJJWCA2LjIgc2VkLCA4MTkyIGluIElSSVggNi41KS4gIFdlIGFsc28gcmVtb3ZlIGNvbW1lbnQgbGluZXM7CisgICAgIyB0aGUgSVJJWCBjYyBhZGRzIGNvbW1lbnRzIGxpa2UgYCM6ZmVjJyB0byB0aGUgZW5kIG9mIHRoZQorICAgICMgZGVwZW5kZW5jeSBsaW5lLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIHwgXAorICAgIHRyICcKKycgJyAnID4+ICRkZXBmaWxlCisgICAgZWNobyA+PiAkZGVwZmlsZQorCisgICAgIyBUaGUgc2Vjb25kIHBhc3MgZ2VuZXJhdGVzIGEgZHVtbXkgZW50cnkgZm9yIGVhY2ggaGVhZGVyIGZpbGUuCisgICAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIFwKKyAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyAtZSAncy8kLzovJyBcCisgICA+PiAkZGVwZmlsZQorICBlbHNlCisgICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKKyAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKKyAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworYWl4KQorICAjIFRoZSBDIGZvciBBSVggQ29tcGlsZXIgdXNlcyAtTSBhbmQgb3V0cHV0cyB0aGUgZGVwZW5kZW5jaWVzCisgICMgaW4gYSAudSBmaWxlLiAgSW4gb2xkZXIgdmVyc2lvbnMsIHRoaXMgZmlsZSBhbHdheXMgbGl2ZXMgaW4gdGhlCisgICMgY3VycmVudCBkaXJlY3RvcnkuICBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUKKyAgIyBzdGFydCBvZiBlYWNoIGxpbmU7ICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgIyBWZXJzaW9uIDYgdXNlcyB0aGUgZGlyZWN0b3J5IGluIGJvdGggY2FzZXMuCisgIHN0cmlwcGVkPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAncy9cKC4qXClcLi4qJC9cMS8nYAorICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIiRAIiAtV2MsLU0KKyAgZWxzZQorICAgICIkQCIgLU0KKyAgZmkKKyAgc3RhdD0kPworCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiA6CisgIGVsc2UKKyAgICBzdHJpcHBlZD1gZWNobyAiJHN0cmlwcGVkIiB8IHNlZCAncyxeLiovLCwnYAorICAgIHRtcGRlcGZpbGU9IiRzdHJpcHBlZC51IgorICBmaQorCisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICBvdXRuYW1lPSIkc3RyaXBwZWQubyIKKyAgICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJy4KKyAgICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiwkb2JqZWN0IDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgc2VkIC1lICJzLF4kb3V0bmFtZTogXCguKlwpJCxcMTosIiA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICBlbHNlCisgICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKKyAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKKyAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaWNjKQorICAjIEludGVsJ3MgQyBjb21waWxlciB1bmRlcnN0YW5kcyBgLU1EIC1NRiBmaWxlJy4gIEhvd2V2ZXIgb24KKyAgIyAgICBpY2MgLU1EIC1NRiBmb28uZCAtYyAtbyBzdWIvZm9vLm8gc3ViL2Zvby5jCisgICMgSUNDIDcuMCB3aWxsIGZpbGwgZm9vLmQgd2l0aCBzb21ldGhpbmcgbGlrZQorICAjICAgIGZvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBmb28ubzogc3ViL2Zvby5oCisgICMgd2hpY2ggaXMgd3JvbmcuICBXZSB3YW50OgorICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5jCisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmgKKyAgIyAgICBzdWIvZm9vLmM6CisgICMgICAgc3ViL2Zvby5oOgorICAjIElDQyA3LjEgd2lsbCBvdXRwdXQKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jIHN1Yi9mb28uaAorICAjIGFuZCB3aWxsIHdyYXAgbG9uZyBsaW5lcyB1c2luZyBcIDoKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jIC4uLiBcCisgICMgICAgIHN1Yi9mb28uaCAuLi4gXAorICAjICAgICAuLi4KKworICAiJEAiIC1NRCAtTUYgIiR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJywKKyAgIyBvciBgZm9vLm86IGRlcDEuaCBkZXAyLmggXCcsIG9yIGAgZGVwMy5oIGRlcDQuaCBcJy4KKyAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICBzZWQgInMsXlteOl0qOiwkb2JqZWN0IDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyAgIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICBzZWQgJ3MsXlteOl0qOiBcKC4qXCkkLFwxLDtzL15cXCQvLzsvXiQvZDsvOiQvZCcgPCAiJHRtcGRlcGZpbGUiIHwKKyAgICBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCit0cnU2NCkKKyAgICMgVGhlIFRydTY0IGNvbXBpbGVyIHVzZXMgLU1EIHRvIGdlbmVyYXRlIGRlcGVuZGVuY2llcyBhcyBhIHNpZGUKKyAgICMgZWZmZWN0LiAgYGNjIC1NRCAtbyBmb28ubyAuLi4nIHB1dHMgdGhlIGRlcGVuZGVuY2llcyBpbnRvIGBmb28uby5kJy4KKyAgICMgQXQgbGVhc3Qgb24gQWxwaGEvUmVkaGF0IDYuMSwgQ29tcGFxIENDQyBWNi4yLTUwNCBzZWVtcyB0byBwdXQKKyAgICMgZGVwZW5kZW5jaWVzIGluIGBmb28uZCcgaW5zdGVhZCwgc28gd2UgY2hlY2sgZm9yIHRoYXQgdG9vLgorICAgIyBTdWJkaXJlY3RvcmllcyBhcmUgcmVzcGVjdGVkLgorICAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKKyAgIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQorICAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorCisgICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aCBUcnU2NCBjYywgc2hhcmVkIG9iamVjdHMgY2FuIGFsc28gYmUgdXNlZCB0byBtYWtlIGEKKyAgICAgICMgc3RhdGljIGxpYnJhcnkuICBUaGlzIG1lY2FuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCisgICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgorICAgICAgIworICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKKyAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCisgICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCisgICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCisgICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcworICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgorICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40CisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAorICAgICAgIiRAIiAtTUQKKyAgIGZpCisKKyAgIHN0YXQ9JD8KKyAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICAgZWxzZQorICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgICAgIGV4aXQgJHN0YXQKKyAgIGZpCisKKyAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICBkbworICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgIGRvbmUKKyAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICAgZWxzZQorICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgIGZpCisgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICA7OworCisjbm9zaWRlZWZmZWN0KQorICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKKyAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KKworZGFzaG1zdGRvdXQpCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIHRlc3QgLXogIiRkYXNobWZsYWciICYmIGRhc2htZmxhZz0tTQorICAjIFJlcXVpcmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgYDonCisgICMgaW4gdGhlIHRhcmdldCBuYW1lLiAgVGhpcyBpcyB0byBjb3BlIHdpdGggRE9TLXN0eWxlIGZpbGVuYW1lczoKKyAgIyBhIGRlcGVuZGVuY3kgc3VjaCBhcyBgYzovZm9vL2JhcicgY291bGQgYmUgc2VlbiBhcyB0YXJnZXQgYGMnIG90aGVyd2lzZS4KKyAgIiRAIiAkZGFzaG1mbGFnIHwKKyAgICBzZWQgJ3M6XlsgIF0qW146IF1bXjpdW146XSpcOlsgICAgXSo6JyIkb2JqZWN0IidcOiA6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitkYXNoWG1zdGRvdXQpCisgICMgVGhpcyBjYXNlIG9ubHkgZXhpc3RzIHRvIHNhdGlzZnkgZGVwZW5kLm00LiAgSXQgaXMgbmV2ZXIgYWN0dWFsbHkKKyAgIyBydW4sIGFzIHRoaXMgbW9kZSBpcyBzcGVjaWFsbHkgcmVjb2duaXplZCBpbiB0aGUgcHJlYW1ibGUuCisgIGV4aXQgMQorICA7OworCittYWtlZGVwZW5kKQorICAiJEAiIHx8IGV4aXQgJD8KKyAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorICAjIFggbWFrZWRlcGVuZAorICBzaGlmdAorICBjbGVhcmVkPW5vCisgIGZvciBhcmcgaW4gIiRAIjsgZG8KKyAgICBjYXNlICRjbGVhcmVkIGluCisgICAgbm8pCisgICAgICBzZXQgIiI7IHNoaWZ0CisgICAgICBjbGVhcmVkPXllcyA7OworICAgIGVzYWMKKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1EKnwtSSopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgIyBTdHJpcCBhbnkgb3B0aW9uIHRoYXQgbWFrZWRlcGVuZCBtYXkgbm90IHVuZGVyc3RhbmQuICBSZW1vdmUKKyAgICAjIHRoZSBvYmplY3QgdG9vLCBvdGhlcndpc2UgbWFrZWRlcGVuZCB3aWxsIHBhcnNlIGl0IGFzIGEgc291cmNlIGZpbGUuCisgICAgLSp8JG9iamVjdCkKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgb2JqX3N1ZmZpeD0iYGVjaG8gJG9iamVjdCB8IHNlZCAncy9eLipcLi8uLydgIgorICB0b3VjaCAiJHRtcGRlcGZpbGUiCisgICR7TUFLRURFUEVORC1tYWtlZGVwZW5kfSAtbyIkb2JqX3N1ZmZpeCIgLWYiJHRtcGRlcGZpbGUiICIkQCIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICBzZWQgJzEsMmQnICIkdG1wZGVwZmlsZSIgfCB0ciAnICcgJworJyB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZSIuYmFrCisgIDs7CisKK2NwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQuCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIiRAIiAtRSB8CisgICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKKyAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAorICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCisgICIkQCIgfHwgZXhpdCAkPworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgKikKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIiRAIiAtRSB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgorICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitub25lKQorICBleGVjICIkQCIKKyAgOzsKKworKikKKyAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbWlzYy9sYW1lNGRvcy5iYXQgYi9taXNjL2xhbWU0ZG9zLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTVjYjNlCi0tLSAvZGV2L251bGwKKysrIGIvbWlzYy9sYW1lNGRvcy5iYXQKQEAgLTAsMCArMSw0MSBAQAorQGVjaG8gb2ZmDQorcmVtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCityZW0gIFBVUlBPU0U6DQorcmVtICAtIHB1dCB0aGlzIEJhdGNoLUNvbW1hbmQgb24geW91ciBEZXNrdG9wLCANCityZW0gICAgc28geW91IGNhbiBkcmFnIGFuZCBkcm9wIHdhdmUgZmlsZXMgb24gaXQNCityZW0gICAgYW5kIExBTUUgd2lsbCBlbmNvZGUgdGhlbSB0byBtcDMgZm9ybWF0Lg0KK3JlbSAgLSBwdXQgdGhpcyBCYXRjaC1Db21tYW5kIGluIGEgcGxhY2UgbWVudGlvbmVkDQorcmVtICAgIGluIHlvdXIgUEFUSCBlbnZpcm9ubWVudCwgc3RhcnQgdGhlIERPUy1CT1gNCityZW0gICAgYW5kIGNoYW5nZSB0byBhIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHdhdmUgDQorcmVtICAgIGZpbGVzIGFyZSBsb2NhdGVkLiB0aGUgZm9sbG93aW5nIGxpbmUgd2lsbA0KK3JlbSAgICBlbmNvZGUgYWxsIHlvdXIgd2F2ZSBmaWxlcyB0byBtcDMNCityZW0gICAgICJsYW1lLmJhdCAqLndhdiINCityZW0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3JlbSAgICAgICAgICAgICAgICAgICAgICAgICBDMjAwMCAgUm9iZXJ0IEhlZ2VtYW5uDQorcmVtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCityZW0gIENoYW5nZXMgdG8gc3VwcG9ydCBsb25nIGZpbGVuYW1lcyB1c2luZyA0RE9TDQorcmVtICBieSBBbGV4YW5kZXIgU3R1bXBmIDxkcm9wZGFjaGFsdXBhQGdteC5uZXQ+DQorcmVtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCityZW0gIHBsZWFzZSBzZXQgTEFNRSBhbmQgTEFNRU9QVFMNCityZW0gIExBTUUgLSB3aGVyZSB0aGUgZXhlY3V0ZWFibGUgaXMNCityZW0gIE9QVFMgLSBvcHRpb25zIHlvdSBsaWtlIExBTUUgdG8gdXNlDQorDQorICAgICAgICBzZXQgTEFNRT1jOlxwcm9ncmF+MVxzb3VuZCZ+MVxsYW1lXGxhbWUuZXhlDQorICAgICAgICBzZXQgT1BUUz0taCAtLWxvd3Bhc3Mtd2lkdGggMiAtLWxvd3Bhc3MgMjAuNSAtYiAxMTIgLS1hYnIgMTgwDQorDQorcmVtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisJc2V0IHRoZWNtZD0lTEFNRSUgJU9QVFMlDQorICAgICAgICBmb3IgJSVmIGluICglJikgZG8gKCV0aGVjbWQlICVAc2ZuWyUlZl1eKHJlbiAlQHNmblslJWZdLm1wMyAiJUBsZm5bJSVmXS5tcF8iPk5VTCkpDQorICAgICAgICByZW4gKi5tcDMubXBfICoubmV3Lm1wMyA+JiBOVUwNCisgICAgICAgIHJlbiAqLndhdi5tcF8gKi5tcDMgPiYgTlVMDQorICAgICAgICBnb3RvIGVuZG1hcmsNCis6ZXJyb3JtYXJrDQorCWVjaG8uDQorCWVjaG8uDQorCWVjaG8gRVJST1IgcHJvY2Vzc2luZyAlMQ0KKwllY2hvLiANCis6ZW5kbWFyaw0KK3JlbQ0KK3JlbQlmaW5pc2hlZA0KK3JlbQ0KZGlmZiAtLWdpdCBhL21pc2MvbGFtZUdVSS5odG1sIGIvbWlzYy9sYW1lR1VJLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5MGZkMAotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvbGFtZUdVSS5odG1sCkBAIC0wLDAgKzEsNDAzIEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCitjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgRXhwcmVzcyAyLjAiPgorPHRpdGxlPkxhbWU8L3RpdGxlPgorPCEtLSBMQU1FIEhUTUwgR1VJIFYwLjIgZm9yIExBTUUuVkJTIGJ5IFJhbGYgS2VtcGtlbnMgKHJhbGYua2VtcGtlbnNAZXBvc3QuZGUpCisgIC0tICRJRCQKKyAgLS0KKyAgLS0gcHVycG9zZSBvZiB0aGlzIHBhZ2UgaXMgYmVpbmcgYSBmcm9udGVuZCBmb3IgbGFtZS52YnMgdjAuMyBvciBsYXRlcgorICAtLSBpdCBpcyBsYXVuY2hlZCBmcm9tIGxhbWUudmJzIGlmIHVzZUdVSSBpbiBsYW1lLnZicyBpcyBzZXQgdG8gJ1RydWUnCisgIC0tIGF1dG9tYXRpY2FsbHkKKyAgLS0gbGFtZSB3aWxsIHRoZW4gdXNlIHRoZSBvcHRpb25zIGNob3NlbgorICAtLQorICAtLSBUT0RPOiBhZGQgb3RoZXIgb3B0aW9ucywgbmljZXIgbGF5b3V0Li4uCisgIC0tPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0b3BtYXJnaW49IjQiIGxlZnRtYXJnaW49IjQiPgorPHNjcmlwdD4KKyAgZnVuY3Rpb24gdXBkYXRlT3B0aW9ucygpIHsKKyAgdmFyIGY9ZG9jdW1lbnQuZm9ybXMubGFtZWZvcm07CisgIHZhciBvcHRzPSIiOworICBvcHRzKz1mLmJpdHJhdGUub3B0aW9uc1tmLmJpdHJhdGUuc2VsZWN0ZWRJbmRleF0udmFsdWUgKyAiICIgKyAKKyAgICAgICAgZi5tb2RlLnZhbHVlOworCisgICAgaWYgKGYuaGlnaF9xdWFsaXR5LmNoZWNrZWQpCisgICAgICBvcHRzKz0gIiAiICsgZi5oaWdoX3F1YWxpdHkudmFsdWU7CisgICAgCisgICAgaWYgKGYuZmFzdC5jaGVja2VkKQorICAgICAgb3B0cys9IiAiK2YuZmFzdC52YWx1ZTsKKyAgICAKKyAgICBpZiAoZi52YnIuY2hlY2tlZCl7CisgICAgICBvcHRzKz0iICIrZi52YnIudmFsdWUrICIgIiArIGYudmJyX3F1YWxpdHkudmFsdWUgKyAiICIgKyBmLm1heF9iaXRyYXRlLnZhbHVlOworICAgICAgaWYgKGYuZW5mb3JjZV9taW5fYml0cmF0ZS5jaGVja2VkKQorICAgICAgICAgb3B0cys9ICIgIiArIGYuZW5mb3JjZV9taW5fYml0cmF0ZS52YWx1ZTsKKyAgICB9CisgICAgICAgIAorICAgIGlmIChmLmNvcHlyaWdodC5jaGVja2VkKQorICAgICAgb3B0cys9ICIgIiArIGYuY29weXJpZ2h0LnZhbHVlOworICAgIAorICAgIGlmIChmLmNvcHkuY2hlY2tlZCkKKyAgICAgIG9wdHMrPSAiICIgKyBmLmNvcHkudmFsdWU7CisgICAgCisgICAgaWYgKGYubm9fZmlsdGVycy5jaGVja2VkKQorICAgICAgb3B0cys9ICIgIiArIGYubm9fZmlsdGVycy52YWx1ZTsKKyAgICAKKyAgICBpZiAoZi50aXRsZS52YWx1ZSAhPSAiIikKKyAgICAgIG9wdHMrPSAiIC0tdHQgXCIiK2YudGl0bGUudmFsdWUrIlwiIjsKKworICAgIGlmIChmLmFydGlzdC52YWx1ZSAhPSAiIikKKyAgICAgIG9wdHMrPSIgLS10YSBcIiIrZi5hcnRpc3QudmFsdWUrIlwiIjsKKworICAgIGlmIChmLmFsYnVtLnZhbHVlICE9ICIiKQorICAgICAgb3B0cys9IiAtLXRsIFwiIitmLmFsYnVtLnZhbHVlKyJcIiI7CisKKyAgICBpZiAoZi55ZWFyLnZhbHVlICE9ICIiKQorICAgICAgb3B0cys9IiAtLXR5ICIrZi55ZWFyLnZhbHVlOworCisgICAgaWYgKGYudHJhY2sudmFsdWUgIT0gIiIpCisgICAgICBvcHRzKz0iIC0tdG4gIitmLnRyYWNrLnZhbHVlOworCisgICAgaWYgKGYuZ2VucmUudmFsdWUgPj0gMCkKKyAgICAgIG9wdHMrPSIgLS10ZyAiK2YuZ2VucmUudmFsdWU7CisKKyAgICBpZiAoZi5jb21tZW50LnZhbHVlICE9ICIiKQorICAgICAgb3B0cys9IiAtLXRjIFwiIitmLmNvbW1lbnQudmFsdWUrIlwiIjsKKworICAgIGYubGFtZW9wdGlvbnMudmFsdWU9b3B0czs7CisgICAgcmV0dXJuOworICB9Cis8L3NjcmlwdD4KKzxub3NjcmlwdD4KKzxIMT48Zm9udCBjb2xvcj0icmVkIj5KYXZhU2NyaXB0IG11c3QgYmUgYWN0aXZhdGVkIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZyb250ZW5kLiBDdXJyZW50bHkgaXQgaXMgbm90ITwvZm9udD48L0gxPgorPC9ub3NjcmlwdD4KKworPGZvcm0gbWV0aG9kPSJQT1NUIiBuYW1lPSJsYW1lZm9ybSI+CisgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibGFtZW9wdGlvbnMiIHZhbHVlPSJub3QgcHJvY2Vzc2VkIj48aDE+PGZvbnQKKyAgICBmYWNlPSJBcmlhbCI+TEFNRSBGcm9udGVuZDwvZm9udD48L2gxPgorICAgIDx0YWJsZSBib3JkZXI9IjAiPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGZvbnQgZmFjZT0iQXJpYWwiPjxzdHJvbmc+Rml4ZWQgQml0cmF0ZTwvc3Ryb25nPjwvZm9udD48L3RkPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48Zm9udCBmYWNlPSJBcmlhbCI+Yml0cmF0ZSAoLWIpIDxzZWxlY3QKKyAgICAgICAgICAgIG5hbWU9ImJpdHJhdGUiIHNpemU9IjEiIG9uY2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1iIDgiPjgga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMTYiPjE2IGticzwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1iIDI0Ij4yNCBrYnM8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItYiAzMiI+MzIga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgNDAiPjQwIGticzwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1iIDQ4Ij40OCBrYnM8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItYiA1NiI+NTYga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgNjQiPjY0IGticzwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1iIDgwIj44MCBrYnM8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItYiA5NiI+OTYga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCB2YWx1ZT0iLWIgMTI4Ij4xMjgga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMTEyIj4xMTIga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMTQ0Ij4xNDQga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMTYwIj4xNjAga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMTkyIj4xOTIga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMjI0Ij4yMjQga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMjU2Ij4yNTYga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMzIwIj4zMjAga2JzPC9vcHRpb24+CisgICAgICAgICAgICA8L3NlbGVjdD48L2ZvbnQ+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48Zm9udCBmYWNlPSJBcmlhbCI+PGlucHV0CisgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIgY2hlY2tlZCBuYW1lPSJoaWdoX3F1YWxpdHkiCisgICAgICAgICAgICB2YWx1ZT0iLWgiIG9uY2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPmhpZ2ggcXVhbGl0eSAoLWgpPC9mb250PjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxmb250IGZhY2U9IkFyaWFsIj48aW5wdXQKKyAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJmYXN0IiB2YWx1ZT0iLWYiCisgICAgICAgICAgICBvbmNoYW5nZT0idXBkYXRlT3B0aW9ucygpIj5mYXN0IChubyBub2lzZSBzaGFwaW5nKTwvZm9udD48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGZvbnQgZmFjZT0iQXJpYWwiPjxzdHJvbmc+VmFyaWFibGUgQml0cmF0ZTwvc3Ryb25nPjwvZm9udD48L3RkPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48Zm9udCBmYWNlPSJBcmlhbCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IgorICAgICAgICAgICAgbmFtZT0idmJyIiB2YWx1ZT0iLXYiIG9uY2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPnZhcmlhYmxlCisgICAgICAgICAgICBiaXRyYXRlICgtdik8L2ZvbnQ+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48Zm9udCBmYWNlPSJBcmlhbCI+VkJSIHF1YWxpdHkgKC1WKSA8c2VsZWN0CisgICAgICAgICAgICBuYW1lPSJ2YnJfcXVhbGl0eSIgc2l6ZT0iMSIKKyAgICAgICAgICAgIG9uY2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1WIDAiPjAgKGhpZ2hlc3QpPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLVYgMSI+MTwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1WIDIiPjI8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItViAzIj4zPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLVYgNCI+NDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9Ii1WIDUiPjUgKG1lZGl1bSk8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItViA2Ij42PC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLVYgNyI+Nzwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1WIDgiPjg8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItViA5Ij45IChsb3dlc3QpPC9vcHRpb24+CisgICAgICAgICAgICA8L3NlbGVjdD48L2ZvbnQ+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjxmb250IGZhY2U9IkFyaWFsIj5tYXhpbXVtIGJpdHJhdGUgKC1CKSA8c2VsZWN0CisgICAgICAgICAgICBuYW1lPSJtYXhfYml0cmF0ZSIgc2l6ZT0iMSIKKyAgICAgICAgICAgIG9uY2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPgorICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU+bm9uZTwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1CIDgiPjgga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMTYiPjE2IGticzwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1CIDI0Ij4yNCBrYnM8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItQiAzMiI+MzIga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgNDAiPjQwIGticzwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1CIDQ4Ij40OCBrYnM8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItQiA1NiI+NTYga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgNjQiPjY0IGticzwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1CIDgwIj44MCBrYnM8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItQiA5NiI+OTYga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLWIgMTI4Ij4xMjgga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMTEyIj4xMTIga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMTQ0Ij4xNDQga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMTYwIj4xNjAga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMTkyIj4xOTIga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMjI0Ij4yMjQga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMjU2Ij4yNTYga2JzPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iLUIgMzIwIj4zMjAga2JzPC9vcHRpb24+CisgICAgICAgICAgICA8L3NlbGVjdD48L2ZvbnQ+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48Zm9udCBmYWNlPSJBcmlhbCI+PGlucHV0CisgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIgbmFtZT0iZW5mb3JjZV9taW5fYml0cmF0ZSIgdmFsdWU9Ii1GIgorICAgICAgICAgICAgb25jaGFuZ2U9InVwZGF0ZU9wdGlvbnMoKSI+ZW5mb3JjZSBtaW4uIGJpdHJhdGUgKC1GKTwvZm9udD48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGZvbnQgZmFjZT0iQXJpYWwiPjxzdHJvbmc+R2VuZXJhbDwvc3Ryb25nPjwvZm9udD48L3RkPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48Zm9udCBmYWNlPSJBcmlhbCI+bW9kZSAoLW0pIDxzZWxlY3QgbmFtZT0ibW9kZSIKKyAgICAgICAgICAgIHNpemU9IjEiIG9uY2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii1tIG0iPm1vbm88L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItbSBzIj5zdGVyZW88L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkIHZhbHVlPSItbSBqIj5qb2ludCBzdGVyZW88L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSItbSBmIj5taWQvc2lkZSBzdGVyZW88L29wdGlvbj4KKyAgICAgICAgICAgIDwvc2VsZWN0PjwvZm9udD48L3RkPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxmb250IGZhY2U9IkFyaWFsIj48aW5wdXQKKyAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJub19maWx0ZXJzIiB2YWx1ZT0iLWsiCisgICAgICAgICAgICBvbmNoYW5nZT0idXBkYXRlT3B0aW9ucygpIj5kaXNhYmxlIGFsbCBmaWx0ZXJzICgtayk8L2ZvbnQ+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjxmb250IGZhY2U9IkFyaWFsIj48aW5wdXQgdHlwZT0iY2hlY2tib3giCisgICAgICAgICAgICBuYW1lPSJjb3B5cmlnaHQiIHZhbHVlPSItYyIKKyAgICAgICAgICAgIG9uY2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPmNvcHlyaWdodGVkICgtYyk8L2ZvbnQ+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48Zm9udCBmYWNlPSJBcmlhbCI+PGlucHV0CisgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIgbmFtZT0iY29weSIgdmFsdWU9Ii1vIgorICAgICAgICAgICAgb25jaGFuZ2U9InVwZGF0ZU9wdGlvbnMoKSI+bm9uLW9yaWdpbmFsICgtbyk8L2ZvbnQ+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CisgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjxmb250IGZhY2U9IkFyaWFsIj48c3Ryb25nPklEMy1UYWc8L3N0cm9uZz48L2ZvbnQ+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGZvbnQgZmFjZT0iQXJpYWwiPnRpdGxlICgtLXR0KSA8aW5wdXQKKyAgICAgICAgICAgIHR5cGU9InRleHQiIHNpemU9IjMwIiBuYW1lPSJ0aXRsZSIgb25DaGFuZ2U9InVwZGF0ZU9wdGlvbnMoKSI+PC9mb250PjwvdGQ+CisgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGZvbnQgZmFjZT0iQXJpYWwiPmFydGlzdCAoLS10YSkgPGlucHV0CisgICAgICAgICAgICB0eXBlPSJ0ZXh0IiBzaXplPSIzMCIgbmFtZT0iYXJ0aXN0IiBvbkNoYW5nZT0idXBkYXRlT3B0aW9ucygpIj48L2ZvbnQ+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjxmb250IGZhY2U9IkFyaWFsIj5hbGJ1bSAoLS10bCkgPGlucHV0CisgICAgICAgICAgICB0eXBlPSJ0ZXh0IiBzaXplPSIzMCIgbmFtZT0iYWxidW0iIG9uQ2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPjwvZm9udD48L3RkPgorICAgICAgICAgICAgPHRkPjxmb250IGZhY2U9IkFyaWFsIj55ZWFyICgtLXR5KSA8aW5wdXQgdHlwZT0idGV4dCIKKyAgICAgICAgICAgIHNpemU9IjQiIG5hbWU9InllYXIiIG9uQ2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPjwvZm9udD48L3RkPgorICAgICAgICAgICAgPHRkPjxmb250IGZhY2U9IkFyaWFsIj50cmFjayAoLS10bikgPGlucHV0CisgICAgICAgICAgICB0eXBlPSJ0ZXh0IiBzaXplPSIyIiBuYW1lPSJ0cmFjayIgb25DaGFuZ2U9InVwZGF0ZU9wdGlvbnMoKSI+PC9mb250PjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48Zm9udCBmYWNlPSJBcmlhbCI+Y29tbWVudCAoLS10YykgPC9mb250PjxpbnB1dAorICAgICAgICAgICAgdHlwZT0idGV4dCIgc2l6ZT0iMzAiIG5hbWU9ImNvbW1lbnQiIG9uQ2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPjwvdGQ+CisgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGZvbnQgZmFjZT0iQXJpYWwiPmdlbnJlICgtLXRnKSA8L2ZvbnQ+PHNlbGVjdAorICAgICAgICAgICAgbmFtZT0iZ2VucmUiIHNpemU9IjEiIG9uQ2hhbmdlPSJ1cGRhdGVPcHRpb25zKCkiPgorICAgICAgICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9Ii0xIj5ub25lCisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIzIj5BIENhcHBlbGxhIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM0Ij5BY2lkIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijc0Ij5BY2lkIEphenogPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNzMiPkFjaWQgUHVuayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5OSI+QWNvdXN0aWMgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjAiPkFsdGVybmF0aXZlIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQwIj5BbHQuIFJvY2sgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjYiPkFtYmllbnQgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQ1Ij5BbmltZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5MCI+QXZhbnRnYXJkZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMTYiPkJhbGxhZCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0MSI+QmFzcyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMzUiPkJlYXQgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iODUiPkJlYm9iIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijk2Ij5CaWcgQmFuZCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMzgiPkJsYWNrIE1ldGFsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijg5Ij5CbHVlZ3Jhc3MgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMCI+Qmx1ZXMgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTA3Ij5Cb290eSBCYXNzIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzMiI+QnJpdFBvcCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2NSI+Q2FiYXJldCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI4OCI+Q2VsdGljIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwNCI+Q2hhbWJlciBNdXNpYyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMDIiPkNoYW5zb24gPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOTciPkNob3J1cyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMzYiPkNocmlzdGlhbiBHYW5nc3RhIFJhcCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2MSI+Q2hyaXN0aWFuIFJhcCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNDEiPkNocmlzdGlhbiBSb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjMyIj5DbGFzc2ljYWwgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+Q2xhc3NpYyBSb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExMiI+Q2x1YiA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMjgiPkNsdWItSG91c2UgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTciPkNvbWVkeSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNDAiPkNvbnRlbXBvcmFyeSBDaHJpc3RpYW4gPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+Q291bnRyeSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMzkiPkNyb3Nzb3ZlciA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1OCI+Q3VsdCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzIj5EYW5jZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMjUiPkRhbmNlIEhhbGwgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTAiPkRhcmt3YXZlIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIyIj5EZWF0aCBNZXRhbCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0Ij5EaXNjbyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1NSI+RHJlYW0gPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI3Ij5EcnVtICZhbXA7IEJhc3MgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIyIj5EcnVtIFNvbG8gPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIwIj5EdWV0IDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijk4Ij5FYXN5IExpc3RlbmluZyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1MiI+RWxlY3Ryb25pYyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0OCI+RXRobmljIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjU0Ij5FdXJvZGFuY2UgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI0Ij5FdXJvLUhvdXNlIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI1Ij5FdXJvLVRlY2hubyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI4NCI+RmFzdC1GdXNpb24gPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iODAiPkZvbGsgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTE1Ij5Gb2xrbG9yZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI4MSI+Rm9say9Sb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExOSI+RnJlZXN0eWxlIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjUiPkZ1bmsgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzAiPkZ1c2lvbiA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzNiI+R2FtZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1OSI+R2FuZ3N0YSBSYXAgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI2Ij5Hb2EgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzgiPkdvc3BlbCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0OSI+R290aGljIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjkxIj5Hb3RoaWMgUm9jayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2Ij5HcnVuZ2UgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI5Ij5IYXJkY29yZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI3OSI+SGFyZCBSb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzNyI+SGVhdnkgTWV0YWwgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNyI+SGlwLUhvcCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzNSI+SG91c2UgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTAwIj5IdW1vdXIgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMxIj5JbmRpZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxOSI+SW5kdXN0cmlhbCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMyI+SW5zdHJ1bWVudGFsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ2Ij5JbnN0cnVtZW50YWwgUG9wIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ3Ij5JbnN0cnVtZW50YWwgUm9jayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI4Ij5KYXp6IDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI5Ij5KYXp6K0Z1bmsgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQ2Ij5KUG9wIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYzIj5KdW5nbGUgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iODYiPkxhdGluIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjcxIj5Mby1GaSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0NSI+TWVkaXRhdGl2ZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNDIiPk1lcmVuZ3VlIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjkiPk1ldGFsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijc3Ij5NdXNpY2FsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjgyIj5OYXRpb25hbCBGb2xrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjY0Ij5OYXRpdmUgQW1lcmljYW4gPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMzIj5OZWdlcnB1bmsgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTAiPk5ldyBBZ2UgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNjYiPk5ldyBXYXZlIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM5Ij5Ob2lzZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMSI+T2xkaWVzIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwMyI+T3BlcmEgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIiPk90aGVyIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijc1Ij5Qb2xrYSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMzQiPlBvbHNrIFB1bmsgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMiPlBvcDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjUzIj5Qb3AtRm9sayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2MiI+UG9wL0Z1bmsgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTA5Ij5Qb3JuIEdyb292ZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMTciPlBvd2VyIEJhbGxhZCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMyI+UHJhbmtzIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwOCI+UHJpbXVzIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjkyIj5Qcm9ncmVzc2l2ZSBSb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjY3Ij5Qc3ljaGVkZWxpYyA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5MyI+UHN5Y2hlZGVsaWMgUm9jayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0MyI+UHVuayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMjEiPlB1bmsgUm9jayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNSI+UmFwIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjY4Ij5SYXZlIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE0Ij5SJmFtcDtCIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE2Ij5SZWdnYWUgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNzYiPlJldHJvIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijg3Ij5SZXZpdmFsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExOCI+Umh5dGhtaWMgU291bCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNyI+Um9jayA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI3OCI+Um9jayAmYW1wOyBSb2xsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE0MyI+U2Fsc2EgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTE0Ij5TYW1iYSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMTAiPlNhdGlyZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2OSI+U2hvd3R1bmVzIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIxIj5Ta2EgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTExIj5TbG93IEphbSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5NSI+U2xvdyBSb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwNSI+U29uYXRhIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQyIj5Tb3VsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM3Ij5Tb3VuZCBDbGlwIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI0Ij5Tb3VuZHRyYWNrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjU2Ij5Tb3V0aGVybiBSb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ0Ij5TcGFjZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMDEiPlNwZWVjaCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI4MyI+U3dpbmcgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOTQiPlN5bXBob25pYyBSb2NrIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwNiI+U3ltcGhvbnkgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQ3Ij5TeW50aHBvcCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMTMiPlRhbmdvIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE4Ij5UZWNobm8gPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTEiPlRlY2huby1JbmR1c3RyaWFsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzMCI+VGVycm9yIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE0NCI+VGhyYXNoIE1ldGFsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYwIj5Ub3AgNDAgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNzAiPlRyYWlsZXIgPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzEiPlRyYW5jZSA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI3MiI+VHJpYmFsIDwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI3Ij5UcmlwLUhvcCA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyOCI+Vm9jYWwgPC9vcHRpb24+CisgICAgICAgICAgICA8L3NlbGVjdD48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIzIj48Zm9udCBmYWNlPSJBcmlhbCI+PGlucHV0CisgICAgICAgICAgICB0eXBlPSJidXR0b24iIG5hbWU9Im9rYnV0dG9uIiB2YWx1ZT0iU3RhcnQgTEFNRSIKKyAgICAgICAgICAgIDwvZm9udD48L2ZvbnQ+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorPC9mb3JtPgorCis8dGFibGUgYm9yZGVyPSIwIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5bPGEgaHJlZj0iVVNBR0UiIHRhcmdldD0iX2JsYW5rIj5MQU1FIEhFTFA8L2E+XSBbPGEKKyAgICAgICAgaHJlZj0iUkVBRE1FIiB0YXJnZXQ9Il9ibGFuayI+TEFNRSBSZWFkbWU8L2E+XSBbPGEKKyAgICAgICAgaHJlZj0iaGlzdG9yeS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+TEFNRSBIaXN0b3J5PC9hPl0gWzxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cubXAzZGV2Lm9yZyIgdGFyZ2V0PSJfYmxhbmsiPkxBTUUKKyAgICAgICAgSG9tZXBhZ2U8L2E+XTwvdGQ+CisgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWlzYy9sYW1laWQzLnBsIGIvbWlzYy9sYW1laWQzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTI4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL2xhbWVpZDMucGwKQEAgLTAsMCArMSw1NSBAQAorIworIyAgRnJvbTogUGVyIEJvbG1zdGVkdCA8dG9tdGVuQGtvbDE0LmNvbT4KKyMgCisjICAgQUM+IElmIHNvbWVvbmUgaGFzIHNjcmlwdHMgdGhhdCByZWFkIGlucHV0IElEMyB0YWdzIGFuZCBjb252ZXJ0CisjICAgQUM+IHRoZW0gdG8gYXJncyBmb3IgbGFtZSAod2hpY2ggdGhlbiBlbmNvZGVzIHRoZSB0YWdzIGludG8gdGhlCisjICAgQUM+IG91dHB1dCBmaWxlcyksIGxldCBtZSBrbm93LCB0b28hCisjCisjICBUaGlzIGlzIGVhc3kgcGVhc3kgdXNpbmcgUGVybC4gIEVzcGVjaWFsbHkgdXNpbmcgQ2hyaXMgTmFuZG9yJ3MgZXhjZWxsZW50CisjICBNUDM6OkluZm8gcGFja2FnZSAoYXZhaWxhYmxlIG9uIENQQU4pLiAgSGVyZSdzIGEgcHJvZ3JhbSBJIGp1c3Qgd3JvdGUgdGhhdAorIyAgSSB0aGluayBkb2VzIHdoYXQgeW91IHdhbnQuICBJbnZva2UgaXQgd2l0aCAiPHByb2dyYW0+IDxmaWxlPiBbb3B0aW9uc10iCisjICAod2hlcmUgdGhlIG9wdGlvbnMgY2FuIGluY2x1ZGUgYW4gb3V0cHV0IGZpbGVuYW1lKSwgbGlrZSBmb3IgZXhhbXBsZToKKyMKKyMgICAgICAgICAgbGFtZWlkMy5wbCBIUS5tcDMgTFEubXAzIC1mdgorIworIyAgKE5vdGUgaG93IHRoZSBzeW50YXggZGlmZmVycyBmcm9tIHRoYXQgb2YgTGFtZSdzLikgIFRoZSBwcm9ncmFtIHdpbGwKKyMgIGV4dHJhY3QgSUQzIHRhZ3MgZnJvbSB0aGUgaW5wdXQgZmlsZSBhbmQgaW52b2tlIExhbWUgd2l0aCBhcmd1bWVudHMgZm9yCisjICBpbmNsdWRpbmcgdGhlbS4gIChUaGlzIHByb2dyYW0gaGFzIG5vdCB1bmRlcmdvbmUgYW55IHJlYWwgdGVzdGluZy4uKQorCit1c2UgTVAzOjpJbmZvOwordXNlIHN0cmljdDsKKworbXkgJWZsZHMgPSAoIAorCVRJVExFID0+ICd0dCcsCisJQVJUSVNUID0+ICd0YScsCisJQUxCVU0gPT4gJ3RsJywKKwlZRUFSID0+ICd0eScsCisJQ09NTUVOVCA9PiAndGMnLAorCUdFTlJFID0+ICd0ZycsCisJVFJBQ0tOVU0gPT4gJ3RuJworCSk7CisKK215ICRmID0gc2hpZnQgQEFSR1Y7CitteSAkcyA9ICJsYW1lICR7Zn0gIiAuICZtYWtlaWQzYXJncyggJGYgKSAuIGpvaW4gJyAnLCBAQVJHVjsKK3ByaW50IFNUREVSUiAiWyR7c31dXG4iOworc3lzdGVtKCAkcyApOworCitzdWIgbWFrZWlkM2FyZ3MoICQgKQoreworCW15ICRzOworCWlmICggbXkgJHRhZyA9IGdldF9tcDN0YWcoIEBfLT5bIDAgXSApICkKKwl7CisJCWZvciAoIGtleXMgJWZsZHMgKQorCQl7CisJCQlpZiAoICR0YWctPnsgJF8gfSApCisJCQl7CisJCQkJJHMgLj0gc3ByaW50ZigKKwkJCQkJIi0tJXMgXCIlc1wiICIsCisJCQkJCSVmbGRzLT57ICRfIH0sCisJCQkJCSR0YWctPnsgJF8gfSApOworCQkJfQorCQl9CisJfQorCXJldHVybiAkcyB8fCAiIjsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy9tbGFtZSBiL21pc2MvbWxhbWUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjNiZWFiNQotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvbWxhbWUKQEAgLTAsMCArMSwxOTUgQEAKKyMhL2Jpbi9zaCAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgIAorIyAgUnVuIHRoZSBMQU1FIGVuY29kZXIgb24gbXVsdGlwbGUgZmlsZXMsIHdpdGggb3B0aW9uIHRvIGRlbGV0ZSAud2F2IGZpbGVzCisjICBhZnRlciBlbmNvZGluZy4gICJtbGFtZSAtPyIgd2lsbCBnaXZlIGluc3RydWN0aW9ucy4KKyMKKyMgIFJvYmVydCBIZWdlbWFubgorIyAgbW9kaWZpZWQgb24gcmVxdWVzdDogRnJhbmsgS2xlbW0gPHBma0B1bmktamVuYS5kZT4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBlbmNvZGVyIHBhdGggdG8gdXNlCittcDNjb2Rlcj0ibGFtZSIKK21wM2FuYWx5emVyPSJtbGFtZV9jb3JyIgorCisjIGRlZmF1bHQgb3B0aW9ucyB0byB1c2UKK29wdGlvbnNfbG93PSItaCAtZCAtbWogLWIgMTI4Igorb3B0aW9uc19oaWdoPSItaCAtZCAtbWogLVYgMSAtYiAxMTIgLUIgMzIwIgorb3B0aW9ucz0kb3B0aW9uc19oaWdoCisKKyMgcmVtb3ZlIHNvdXJjZT8KK3JlbW92ZXNvdXJjZT1mYWxzZQorCisjIGZvcmNlIG92ZXJ3cml0ZSBvZiBkZXN0aW5hdGlvbgordGVzdG92ZXJ3cml0ZT10cnVlCisKKyMgd2FpdGluZyBhZnRlciBlcnJvciByZXBvcnQgbiBzZWNvbmRzCitlcnJvcmRlbGF5PTEgCisKK2hlbHB0ZXh0PSJcblwKK1RoaXMgc2NyaXB0IHJ1bnMgdGhlIExBTUUgbXAzIGVuY29kZXIgb24gbXVsdGlwbGUgZmlsZXM6IFxuXG5cCisgICAgJDAgW29wdGlvbnNdIDxmaWxlIDE+IC4uLiA8ZmlsZSBuPlxuXAorXG5cCisgIG9wdGlvbnM6XG5cCisgICAgLT8gICAgICAgICAgICAgICAgICB0aGlzIGhlbHAgdGV4dFxuXAorICAgIC1yICAgICAgICAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGFmdGVyIGVuY29kaW5nXG5cCisgICAgLWYgICAgICAgICAgICAgICAgICBmb3JjZSBvdmVyd3JpdGUgb2YgZGVzdGluYXRpb24gaWYgZXhpc3RzXG5cCisgICAgLWwgICAgICAgICAgICAgICAgICBsb3cgcXVhbGl0eSBzZXR0aW5nc1xuXAorICAgIC1oICAgICAgICAgICAgICAgICAgaGlnaCBxdWFsaXR5IHNldHRpbmdzXG5cCisgICAgLW8gXCI8bGFtZSBvcHRpb25zPlwiIG92ZXJyaWRlcyBzY3JpcHQgZGVmYXVsdCBvcHRpb25zCitcblwKKyAgZXhhbXBsZTpcblwKKyAgICAkMCAgLXIgIC1mICAtbyBcIi12IC1WIDAgLWIgMTEyXCIgYSoud2F2IHoqLmFpZiBnKi5tcD9cblwKK1xuXAorIgorCisjICAgcHJvY2VzcyBjb21tYW5kLWxpbmUgb3B0aW9ucworIyAgIHRoaXMgY291bGQgYmUgZXh0ZW5kZWQgdG8gZmFrZSB0aGUgCisjICAgY29tbWFuZGxpbmUgaW50ZXJmYWNlIG9mIHRoZSBtcDNlbmNvZGVyCisKK3doaWxlIGdldG9wdHMgIjpvOnI6aDpsOmYiIG9wdG47IGRvCisgICAgY2FzZSAkb3B0biBpbgorICAgIG8gKSBvcHRpb25zPSRPUFRBUkcgCSMgcmVwbGFjZSBkZWZhdWx0IG9wdGlvbnMKKwllY2hvIE5ldyBsYW1lIG9wdGlvbnMgYXJlIFwnJG9wdGlvbnNcJworICAgICAgICA7OyAKKyAgICByICkgcmVtb3Zlc291cmNlPXRydWUKKyAgICAgICAgZWNobyBSZW1vdmluZyBzb3VyY2UgZmlsZXMgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGNvbnZlcnRpbmcKKwk7OworICAgIGYgKSB0ZXN0b3ZlcndyaXRlPWZhbHNlCisgICAgICAgIGVjaG8gRm9yY2Ugb3ZlcndyaXRpbmcgZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZXMKKwk7OworICAgIGggKSBvcHRpb25zPSRvcHRpb25zX2hpZ2gKKyAgICAgICAgOzsKKyAgICBsICkgb3B0aW9ucz0kb3B0aW9uc19sb3cKKyAgICAgICAgOzsKKyAgICBcPyApIHByaW50ZiAiJGhlbHB0ZXh0IgorCXNsZWVwICRlcnJvcmRlbGF5CisgICAgICAgIGV4aXQgMSAgCisgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorc2hpZnQgJCgoJE9QVElORCAtIDEpKQorCisjIG5vIGZpbGVzIHJlbWFpbmluZz8KKworaWYgWyAiJDEiID0gIiIgXTsgdGhlbgorICAgIHByaW50ZiAiJGhlbHB0ZXh0IgorICAgIHNsZWVwICRlcnJvcmRlbGF5CisgICAgZXhpdCAxICAKK2ZpCisKKyMgICBwcm9jZXNzIGlucHV0LWZpbGVzCisKK2ZvciBzcmMgaW4gIiRAIjsgZG8KKworICAgIGNhc2UgJHNyYyBpbgorICAgICpbLl1bd1ddW2FBXVt2Vl0gICkKKyAgICAgICAgZHN0PSR7c3JjJVsuXVt3V11bYUFdW3ZWXX0ubXAzCisgICAgICAgIGlmIFsgLWYgIiRzcmMiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgJHRlc3RvdmVyd3JpdGUgPSB0cnVlIC1hIC1mICIkZHN0IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyBcJyRkc3RcJyBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcKKwkJc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgICAgIGVsaWYgJG1wM2NvZGVyICRvcHRpb25zIGAkbXAzYW5hbHl6ZXIgIiRzcmMiYCAiJHNyYyIgIiRkc3QiOyB0aGVuCisgICAgICAgICAgICAgICAgaWYgWyAkcmVtb3Zlc291cmNlID0gdHJ1ZSBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIHJtIC1mICIkc3JjIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZWNobyBjb252ZXJ0aW5nIG9mIFwnJHNyY1wnIHRvIFwnJGRzdFwnIGZhaWxlZAorCQlzbGVlcCAkZXJyb3JkZWxheQorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyBObyBzb3VyY2UgZmlsZSBcJyRzcmNcJyBmb3VuZC4KKwkgICAgc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICpbLl1bYUFdW2lJXVtmRl0gICkKKyAgICAgICAgZHN0PSR7c3JjJVsuXVthQV1baUldW2ZGXX0ubXAzCisgICAgICAgIGlmIFsgLWYgIiRzcmMiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgJHRlc3RvdmVyd3JpdGUgPSB0cnVlIC1hIC1mICIkZHN0IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyBcJyRkc3RcJyBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcKKwkJc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgICAgIGVsaWYgJG1wM2NvZGVyICRvcHRpb25zICIkc3JjIiAiJGRzdCI7IHRoZW4KKyAgICAgICAgICAgICAgICBpZiBbICRyZW1vdmVzb3VyY2UgPSB0cnVlIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcm0gLWYgIiRzcmMiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvIGNvbnZlcnRpbmcgb2YgXCckc3JjXCcgdG8gXCckZHN0XCcgZmFpbGVkCisJCXNsZWVwICRlcnJvcmRlbGF5CisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvIE5vIHNvdXJjZSBmaWxlIFwnJHNyY1wnIGZvdW5kLgorCSAgICBzbGVlcCAkZXJyb3JkZWxheQorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgKlsuXVthQV1baUldW2ZGXVtmRl0gKQorICAgICAgICBkc3Q9JHtzcmMlWy5dW2FBXVtpSV1bZkZdW2ZGXX0ubXAzCisgICAgICAgIGlmIFsgLWYgIiRzcmMiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgJHRlc3RvdmVyd3JpdGUgPSB0cnVlIC1hIC1mICIkZHN0IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyBcJyRkc3RcJyBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcKKwkJc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgICAgIGVsaWYgJG1wM2NvZGVyICRvcHRpb25zICIkc3JjIiAiJGRzdCI7IHRoZW4KKyAgICAgICAgICAgICAgICBpZiBbICRyZW1vdmVzb3VyY2UgPSB0cnVlIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcm0gLWYgIiRzcmMiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvIGNvbnZlcnRpbmcgb2YgXCckc3JjXCcgdG8gXCckZHN0XCcgZmFpbGVkCisJCXNsZWVwICRlcnJvcmRlbGF5CisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvIE5vIHNvdXJjZSBmaWxlIFwnJHNyY1wnIGZvdW5kLgorCSAgICBzbGVlcCAkZXJyb3JkZWxheQorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgKlsuXVttTV1bcFBdW2dHMTJdICApCisgICAgICAgIGRzdD0ke3NyYyVbLl1bbU1dW3BQXVtnRzEyXX0ubXAzCisgICAgICAgIGlmIFsgLWYgIiRzcmMiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgJHRlc3RvdmVyd3JpdGUgPSB0cnVlIC1hIC1mICIkZHN0IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyBcJyRkc3RcJyBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcKKwkJc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgICAgIGVsaWYgJG1wM2NvZGVyICRvcHRpb25zICIkc3JjIiAiJGRzdCI7IHRoZW4KKyAgICAgICAgICAgICAgICBpZiBbICRyZW1vdmVzb3VyY2UgPSB0cnVlIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcm0gLWYgIiRzcmMiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvIGNvbnZlcnRpbmcgb2YgXCckc3JjXCcgdG8gXCckZHN0XCcgZmFpbGVkCisJCXNsZWVwICRlcnJvcmRlbGF5CisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvIE5vIHNvdXJjZSBmaWxlIFwnJHNyY1wnIGZvdW5kLgorCSAgICBzbGVlcCAkZXJyb3JkZWxheQorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgKlsuXVttTV1bcFBdMyApCisgICAgICAgIGRzdD0ke3NyYyVbLl1bbU1dW3BQXTN9LW5ldy1jb252ZXJ0ZWQtZmlsZS4ke3NyYyMjKi59CisgICAgICAgIGlmIFsgLWYgIiRzcmMiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgJHRlc3RvdmVyd3JpdGUgPSB0cnVlIC1hIC1mICIkZHN0IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyBcJyRkc3RcJyBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcKKwkJc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgICAgIGVsaWYgJG1wM2NvZGVyICRvcHRpb25zICIkc3JjIiAiJGRzdCI7IHRoZW4KKyAgICAgICAgICAgICAgICBpZiBbICRyZW1vdmVzb3VyY2UgPSB0cnVlIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgbXYgLWYgIiRkc3QiICIkc3JjIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZWNobyBjb252ZXJ0aW5nIG9mIFwnJHNyY1wnIHRvIFwnJGRzdFwnIGZhaWxlZAorCQlzbGVlcCAkZXJyb3JkZWxheQorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyBObyBzb3VyY2UgZmlsZSBcJyRzcmNcJyBmb3VuZC4KKwkgICAgc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICogKSAjIHRoZSByZXN0CisgICAgICAgIGVjaG8gd2FybmluZzogRmlsZSBleHRlbnRpb24gXCcuJHtzcmMjIyoufVwnIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgc2xlZXAgJGVycm9yZGVsYXkKKyAgICAgICAgOzsKKworICAgIGVzYWMKKworZG9uZQpkaWZmIC0tZ2l0IGEvbWlzYy9tbGFtZV9jb3JyLmMgYi9taXNjL21sYW1lX2NvcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA1YjYzCi0tLSAvZGV2L251bGwKKysrIGIvbWlzYy9tbGFtZV9jb3JyLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgICAgQnVnOiAKKwktIHJ1bnMgb25seSBvbiBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzIGZvciBXQVYgZmlsZXMKKyAgICAgICAgLSBOb3QgYWxsIFdBViBmaWxlcyBhcmUgcmVjb2duaXplZAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHN0ZXJlbyBbMl07Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBtb25vOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgbjsKKyAgICBsb25nIGRvdWJsZSAgICAgICAgIHg7CisgICAgbG9uZyBkb3VibGUgICAgICAgICB4MjsKKyAgICBsb25nIGRvdWJsZSAgICAgICAgIHk7CisgICAgbG9uZyBkb3VibGUgICAgICAgICB5MjsKKyAgICBsb25nIGRvdWJsZSAgICAgICAgIHh5OworfSBrb3JyX3Q7CisKK3ZvaWQgYW5hbHl6ZV9zdGVyZW8gKCBjb25zdCBzdGVyZW8qIHAsIHNpemVfdCBsZW4sIGtvcnJfdCogayApCit7CisgICAgbG9uZyBkb3VibGUgIF94ID0gMCwgX3gyID0gMCwgX3kgPSAwLCBfeTIgPSAwLCBfeHkgPSAwOworICAgIGRvdWJsZSAgICAgICB0MTsKKyAgICBkb3VibGUgICAgICAgdDI7CisgICAgCisgICAgayAtPiBuICArPSBsZW47CisgICAgCisgICAgZm9yICggOyBsZW4tLTsgcCsrICkgeworICAgICAgICBfeCAgKz0gKHQxID0gKCpwKVswXSk7IF94MiArPSB0MSAqIHQxOworICAgICAgICBfeSAgKz0gKHQyID0gKCpwKVsxXSk7IF95MiArPSB0MiAqIHQyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94eSArPSB0MSAqIHQyOworICAgIH0KKyAgICAKKyAgICBrIC0+IHggICs9IF94IDsKKyAgICBrIC0+IHgyICs9IF94MjsKKyAgICBrIC0+IHkgICs9IF95IDsKKyAgICBrIC0+IHkyICs9IF95MjsKKyAgICBrIC0+IHh5ICs9IF94eTsKK30KKwordm9pZCBhbmFseXplX2RzdGVyZW8gKCBjb25zdCBzdGVyZW8qIHAsIHNpemVfdCBsZW4sIGtvcnJfdCogayApCit7CisgICAgc3RhdGljIGRvdWJsZSBsMCA9IDA7CisgICAgc3RhdGljIGRvdWJsZSBsMSA9IDA7CisgICAgbG9uZyBkb3VibGUgICBfeCA9IDAsIF94MiA9IDAsIF95ID0gMCwgX3kyID0gMCwgX3h5ID0gMDsKKyAgICBkb3VibGUgICAgICAgIHQxOworICAgIGRvdWJsZSAgICAgICAgdDI7CisgICAgCisgICAgayAtPiBuICArPSBsZW47CisgICAgCisgICAgZm9yICggOyBsZW4tLTsgcCsrICkgeworICAgICAgICBfeCAgKz0gKHQxID0gKCpwKVswXSAtIGwwKTsgIF94MiArPSB0MSAqIHQxOworICAgICAgICBfeSAgKz0gKHQyID0gKCpwKVsxXSAtIGwxKTsgIF95MiArPSB0MiAqIHQyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94eSArPSB0MSAqIHQyOworCWwwICAgPSAoKnApWzBdOworCWwxICAgPSAoKnApWzFdOworICAgIH0KKyAgICAKKyAgICBrIC0+IHggICs9IF94IDsKKyAgICBrIC0+IHgyICs9IF94MjsKKyAgICBrIC0+IHkgICs9IF95IDsKKyAgICBrIC0+IHkyICs9IF95MjsKKyAgICBrIC0+IHh5ICs9IF94eTsKK30KKworCit2b2lkIGFuYWx5emVfbW9ubyAgICggY29uc3QgbW9ubyogcCwgc2l6ZV90IGxlbiwga29ycl90KiBrICkKK3sKKyAgICBsb25nIGRvdWJsZSAgIF94ID0gMCwgX3gyID0gMDsKKyAgICBkb3VibGUgICAgICAgIHQxOworICAgIAorICAgIGsgLT4gbiAgKz0gbGVuOworICAgIAorICAgIGZvciAoIDsgbGVuLS07IHArKyApIHsKKyAgICAgICAgX3ggICs9ICh0MSA9ICgqcCkpOyBfeDIgKz0gdDEgKiB0MTsKKyAgICB9CisgICAgCisgICAgayAtPiB4ICArPSBfeCA7CisgICAgayAtPiB4MiArPSBfeDI7CisgICAgayAtPiB5ICArPSBfeCA7CisgICAgayAtPiB5MiArPSBfeDI7CisgICAgayAtPiB4eSArPSBfeDI7Cit9CisKK3ZvaWQgYW5hbHl6ZV9kbW9ubyAgICggY29uc3QgbW9ubyogcCwgc2l6ZV90IGxlbiwga29ycl90KiBrICkKK3sKKyAgICBzdGF0aWMgZG91YmxlIGwwID0gMDsKKyAgICBsb25nIGRvdWJsZSAgIF94ID0gMCwgX3gyID0gMDsKKyAgICBkb3VibGUgICAgICAgIHQxOworICAgIAorICAgIGsgLT4gbiAgKz0gbGVuOworICAgIAorICAgIGZvciAoIDsgbGVuLS07IHArKyApIHsKKyAgICAgICAgX3ggICs9ICh0MSA9ICgqcCkgLSBsMCk7IF94MiArPSB0MSAqIHQxOworCWwwICAgPSAqcDsKKyAgICB9CisgICAgCisgICAgayAtPiB4ICArPSBfeCA7CisgICAgayAtPiB4MiArPSBfeDI7CisgICAgayAtPiB5ICArPSBfeCA7CisgICAgayAtPiB5MiArPSBfeDI7CisgICAgayAtPiB4eSArPSBfeDI7Cit9CisKK2ludCBzZ24gKCBsb25nIGRvdWJsZSB4ICkKK3sKKyAgICBpZiAoIHggPiAwICkgcmV0dXJuICsxOworICAgIGlmICggeCA8IDAgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCByZXBvcnQgKCBjb25zdCBrb3JyX3QqIGsgKQoreworICAgIGxvbmcgZG91YmxlICBzY2FsZSA9IHNxcnQgKCAxLmU1IC8gKDE8PDI5KSApOyAvLyBTaW5lIEZ1bGwgU2NhbGUgaXMgKzEwIGRCLCA3MzI3ID0gMTAwJQorICAgIGxvbmcgZG91YmxlICByOworICAgIGxvbmcgZG91YmxlICByZDsKKyAgICBsb25nIGRvdWJsZSAgc3g7CisgICAgbG9uZyBkb3VibGUgIHN5OworICAgIGxvbmcgZG91YmxlICB4OworICAgIGxvbmcgZG91YmxlICB5OworICAgIGxvbmcgZG91YmxlICBiOworICAgIAorICAgIHIgID0gKGstPngyKmstPm4gLSBrLT54KmstPngpICogKGstPnkyKmstPm4gLSBrLT55KmstPnkpOworICAgIHIgID0gciAgPiAwLmwgID8gIChrLT54eSprLT5uIC0gay0+eCprLT55KSAvIHNxcnQgKHIpICA6ICAxLmw7CisgICAgc3ggPSBrLT5uID4gMSAgPyAgc3FydCAoIChrLT54MiAtIGstPngqay0+eC9rLT5uKSAvIChrLT5uIC0gMSkgKSAgOiAgMC5sOworICAgIHN5ID0gay0+biA+IDEgID8gIHNxcnQgKCAoay0+eTIgLSBrLT55KmstPnkvay0+bikgLyAoay0+biAtIDEpICkgIDogIDAubDsKKyAgICB4ICA9IGstPm4gPiAwICA/ICBrLT54L2stPm4gIDogIDAubDsKKyAgICB5ICA9IGstPm4gPiAwICA/ICBrLT55L2stPm4gIDogIDAubDsKKyAgICAKKyAgICBiICA9IGF0YW4yICggc3ksIHN4ICogc2duIChyKSApICogKCA4IC8gTV9QSSk7CisgICAKKy8vICAgIDYgICAgICAgNSAgICAgICAgNCAgICAgICAgMyAgICAgICAgMgorLy8gICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisvLyAgICAgIHxcICAgICAgICAgICAgIHwgICAgICAgICAgICAgL3wKKy8vICAgIDcgfCAgIFwgICAgICAgICAgfCAgICAgICAgICAvICAgfCAgMQorLy8gICAgICB8ICAgICAgXCAgICAgICB8ICAgICAgIC8gICAgICB8ICAKKy8vICAgICAgfCAgICAgICAgIFwgICAgfCAgICAvICAgICAgICAgfAorLy8gICAgICB8ICAgICAgICAgICAgXCB8IC8gICAgICAgICAgICB8CisvLyAgICA4IHwtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLXwgIDAKKy8vICAgICAgfCAgICAgICAgICAgIC8gfCBcICAgICAgICAgICAgfAorLy8gICAgICB8ICAgICAgICAgLyAgICB8ICAgIFwgICAgICAgICB8CisvLyAgIC03IHwgICAgICAvICAgICAgIHwgICAgICAgXCAgICAgIHwgLTEKKy8vICAgICAgfCAgIC8gICAgICAgICAgfCAgICAgICAgICBcICAgfAorLy8gICAgICB8L19fX19fX19fX19fX198X19fX19fX19fX19fX1x8CisvLworLy8gICAtNiAgICAgICAtNSAgICAgIC00ICAgICAgLTMgICAgICAgIC0yCisgICAgCisgICAgaWYgKCByID4gMC45OCApIHsKKyAgICAgICAgcHJpbnRmICgiLW1tIik7CQkvLyBkaXNndWlzZWQgbW9ubyBmaWxlCisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoIGZhYnMgKGItMikgPiAwLjY2NiApIHsKKyAgICAgICAgcHJpbnRmICgiLW1zIik7CQkvLyBsb3cgcHJvZml0IGZvciBqb2ludCBzdGVyZW8KKwlyZXR1cm47CisgICAgfQorICAgIGlmICggciA8IDAuMzMzICkgeworICAgICAgICBwcmludGYgKCItbXMiKTsJCS8vIGxvdyBwcm9maXQgZm9yIGpvaW50IHN0ZXJlbworCXJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgcmVhZGZpbGUgKCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgZmQgKQoreworICAgIHVuc2lnbmVkIHNob3J0ICBoZWFkZXIgWzIyXTsKKyAgICBzdGVyZW8gICAgICAgICAgcyBbNDA5Nl07CisgICAgbW9ubyAgICAgICAgICAgIG0gWzgxOTJdOworICAgIHNpemVfdCAgICAgICAgICBzYW1wbGVzOworICAgIGtvcnJfdCAgICAgICAgICBrMDsKKyAgICBrb3JyX3QgICAgICAgICAgazE7CisgICAgCisgICAgbWVtc2V0ICggJmswLCAwLCBzaXplb2YoazApICk7CisgICAgbWVtc2V0ICggJmsxLCAwLCBzaXplb2YoazEpICk7CisgICAgCisgICAgcmVhZCAoIGZkLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpICk7CisgICAgCisgICAgc3dpdGNoICggaGVhZGVyWzExXSApIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHByaW50ZiAoIi1tbVxuIik7CisgICAgICAgIGJyZWFrOworCQorICAgIGNhc2UgMjoKKyAgICAgICAgd2hpbGUgICggKCBzYW1wbGVzID0gcmVhZCAoZmQsIHMsIHNpemVvZihzKSkgKSA+IDAgKSB7CisgICAgICAgICAgICBhbmFseXplX3N0ZXJlbyAgKCBzLCBzYW1wbGVzIC8gc2l6ZW9mICgqcyksICZrMCApOworICAgICAgICAgICAgYW5hbHl6ZV9kc3RlcmVvICggcywgc2FtcGxlcyAvIHNpemVvZiAoKnMpLCAmazEgKTsKKwl9CisgICAgICAgIHJlcG9ydCAoJmswKTsKKyAgICAgICAgcmVwb3J0ICgmazEpOworCWJyZWFrOworCQorICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIldSBDaGFubmVscyBub3Qgc3VwcG9ydGVkOiAlc1xuIiwgaGVhZGVyWzExXSwgbmFtZSApOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2ludCBtYWluICggaW50IGFyZ2MsIGNoYXIqKiBhcmd2ICkKK3sKKyAgICBjaGFyKiAgbmFtZTsKKyAgICBpbnQgICAgZmQ7CisgICAgCisgICAgaWYgKGFyZ2MgPCAyKQorICAgICAgICByZWFkZmlsZSAoICI8c3RkaW4+IiwgMCApOworICAgIGVsc2UgICAgICAgIAorICAgICAgICB3aGlsZSAoIChuYW1lID0gKisrYXJndikgIT0gTlVMTCApIHsKKwkgICAgaWYgKCAoZmQgPSBvcGVuICggbmFtZSwgT19SRE9OTFkgKSkgPj0gMCApIHsKKyAgICAgICAgICAgICAgICByZWFkZmlsZSAoIG5hbWUsIGZkICk7CisJCWNsb3NlICggZmQgKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJDYW4ndCBvcGVuOiAlc1xuIiwgbmFtZSApOworCSAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21pc2MvbXVnZWNvLnNoIGIvbWlzYy9tdWdlY28uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmJlMjc3NAotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvbXVnZWNvLnNoCkBAIC0wLDAgKzEsMTM3IEBACisjIS9iaW4vc2gKK3Byb2duYW1lPW11Z2VjbyB2ZXJzaW9uPTAuMQorcHJvZ3JhbXI9J0FsZXhhbmRlciBMZWlkaW5nZXInCitwcm9nZGF0ZT0nNyBEZWMgMjAwMCcKK3Byb2dkZXNjPSdNVWx0aUdFbmVyYXRpb25DT2RpbmcnCisjIE5FRURTOiBnZXRvcHQsIGxhbWUKKyMgUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBERUZBVUxUUyBzZWN0aW9uLgorCisjICRJZDogbXVnZWNvLnNoLHYgMS42IDIwMDAvMTIvMDggMTM6NDc6NTYgYWxlaWRpbmdlciBFeHAgJAorCit1c2FnZSgpIHsKK2NhdCA8PCBFT0YKKyoqICRwcm9nbmFtZSB2JHZlcnNpb24sICRwcm9nZGF0ZSAqKgorYnkgJHByb2dyYW1yCiskcHJvZ2Rlc2MKK3VzYWdlOiAkcHJvZ25hbWUgWyA8ZmxhZ3M+IF0gLWcgPG51bT4gPGZpbGU+CisgICAgLXYJICAgICAgIHVzZSBidWlsdGluIFZCUiBvcHRpb25zCisgICAgLWcgPG51bT4gICBudW1iZXIgb2YgZ2VuZXJhdGlvbnMKKyAgICAtaCBoZWxwCisKKyB1c2VkCisgIC0gZW52IHZhcnM6CisgICAgKiBMQU1FICAgOiBhbHRlcm5hdGl2ZSBlbmNvZGVyIGJpbmFyeQorICAgICogTEFNRU9QVDogYWx0ZXJuYXRpdmUgZW5jb2RlciBvcHRpb25zCisgIC0gVkJSIG9wdHM6ICRlbmNfdmJyX29wdHMKKyAgLSBDQlIgb3B0czogJGVuY19jYnJfb3B0cworRU9GCit9CisKKyMgREVGQVVMVFMKKworIyBpZiB5b3UgY2FuLCB1c2UgZ2V0b3B0KDEpIChjKTE5OTcgYnkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgorIyBpdCdzIGluIG1vc3QgbW9kZXJuIHVuaXhlbiwgb3IgbG9vayBhdCBodHRwOi8vaHVpemVuLmRkcy5ubC9+ZnJvZG9sLworOiAke0dFVE9QVD1nZXRvcHR9CSMgaGVscGVyIHByb2dyYW0KKyMgbWt0ZW1wIChvcHRpb25hbCkgaXMgYWxzbyBpbiBtb3N0IG1vZGVybiB1bml4ZW4gKG9yaWdpbmFsbHkgZnJvbSBPcGVuQlNEKQorOiAke01LVEVNUD1ta3RlbXB9CSMgaGVscGVyIHByb2dyYW0KKzogJHtUTVBESVI6PS90bXB9CSMgc2V0IGRlZmF1bHQgdGVtcCBkaXJlY3RvcnkKKzogJHtMQU1FOj1sYW1lfQkJIyBwYXRoIHRvIExBTUUKKworZW5jX2Nicl9vcHRzPSItYjE5MiAtaCAtLWxvd3Bhc3MgMTggLS1sb3dwYXNzLXdpZHRoIDAiCitlbmNfdmJyX29wdHM9Ii0tdmJyLW10cmggLS1uc3BzeXR1bmUgLXYgLWggLWQgLVkgLVgzIgorZW5jX29wdHM9JHtMQU1FT1BUOi0kZW5jX2Nicl9vcHRzfQorbnVtPQkJCSMgZGVmYXVsdCBudW1iZXIgb2YgZ2VuZXJhdGlvbnMKKworIyBERUZJTkUgRlVOQ1RJT05TCisKK2UoKSB7IGVjaG8gIiRwcm9nbmFtZTogJCoiOyB9CitkaWUoKSB7CSAgICAjIHVzYWdlOiAgZGllIFsgPGV4aXRjb2RlPiBbIDxlcnJvcm1lc3NhZ2U+IF0gXQorICAgIHRyYXAgJycgMSAyIDMgMTMgMTUKKyAgICBleGl0Y29kZT0wCisgICAgWyAkIyAtZ3QgMCBdICYmIHsgZXhpdGNvZGU9JDE7IHNoaWZ0OyB9CisgICAgWyAkIyAtZ3QgMCBdICYmIGUgIkVycm9yOiAkKiIgPiYyCisgICAgZXhpdCAkZXhpdGNvZGUKK30KKworIyB0ZmlsZSgpCisjIHRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0ZW1wb3JhcnkgZmlsZXMuICAndGZpbGUgdGVtcCcgd2lsbCBtYWtlIGEgdGVtcGZpbGUKKyMgYW5kIHB1dCB0aGUgcGF0aCB0byBpdCBpbiB0aGUgdmFyaWFibGUgJHRlbXAgKGRlZmF1bHRzIHRvIHZhcmlhYmxlICR0ZikKK3RyYXAgJ2ZvciBmIGluICR6dGZpbGVzOyBkbyBybSAtZiAiJGYiOyBkb25lJyAwCit0cmFwICd0cmFwICIiIDEgMiAzIDEzIDE1OyBleGl0IDEwJyAxIDIgMyAxMyAxNQordW5zZXQgenRmaWxlcwordGZpbGUoKSB7CSMgdXNhZ2U6IHRmaWxlIDx2YXJpYWJsZV9uYW1lPgorICAgIHp0Zj1gJE1LVEVNUCAtcSAkVE1QRElSLyRwcm9nbmFtZS5YWFhYWFggMj4vZGV2L251bGxgCSMgdHJ5IG1rdGVtcAorICAgIGlmIFsgJD8gLWd0IDAgLW8gLXogIiR6dGYiIF07IHRoZW4JIyBpZiBta3RlbXAgZmFpbHMsIGRvIGl0IHVuc2FmZWx5CisJenRmPSRUTVBESVIvJExPR05BTUUuJHByb2duYW1lLiQkCisJWyAtZSAiJHp0ZiIgXSAmJiB6dGY9IHx8IHsgdG91Y2ggJHp0ZiAmJiBjaG1vZCA2MDAgJHp0ZjsgfQorICAgIGZpCisgICAgWyAiJHp0ZiIgLWEgLWYgIiR6dGYiIF0gfHwgeyBlY2hvIENvdWxkIG5vdCBtYWtlIHRlbXBmaWxlOyBleGl0IDg7IH0KKyAgICB6dGZpbGVzPSIkenRmaWxlcyAkenRmIgorICAgIGV2YWwgJHsxOi10Zn09JyR6dGYnCit9CisKKyMgUEFSU0UgQ09NTUFORCBMSU5FCisKK29wdGlvbnM9Imc6dmgiCSMgb3B0aW9uIHN0cmluZyBmb3IgZ2V0b3B0KDEpCitoZWxwPTsgWyAiJDEiID0gLWggLW8gIiQxIiA9IC1oZWxwIC1vICIkMSIgPSAtLWhlbHAgXSAmJiBoZWxwPXllcworWyAiJGhlbHAiIF0gJiYgeyB1c2FnZTsgZGllOyB9CiskR0VUT1BUIC1UID4vZGV2L251bGwgMj4mMQorWyAkPyAtZXEgNCBdICYmIEdFVE9QVD0iJEdFVE9QVCAtbiAkcHJvZ25hbWUgLXMgc2giICNmcm9kb2wncyBnZXRvcHQ/CitldmFsIHNldCAtLSBgJEdFVE9QVCAiJG9wdGlvbnMiICIkQCJgCitbICQjIC1sdCAxIF0gJiYgeyBkaWUgOSBnZXRvcHQgZmFpbGVkOyB9Cit3aGlsZSBbICQjIC1ndCAwIF07IGRvCisgICAgY2FzZSAiJDEiIGluCisgICAgLWcpIG51bT0kMjsgc2hpZnQgOzsKKyAgICAtdikgZW5jX29wdHM9JGVuY19jYnJfb3B0cyA7OworICAgIC1oKQloZWxwPXkgOzsKKyAgICAtLSkJc2hpZnQ7IGJyZWFrIDs7CisgICAgKikJdXNhZ2U7IGRpZSA5ICJpbnZhbGlkIGNvbW1hbmQgbGluZSBzeW50YXghIiA7OworICAgIGVzYWMKKyAgICBzaGlmdAorZG9uZQorWyAiJGhlbHAiIF0gJiYgeyB1c2FnZTsgZGllOyB9CitbICQjIC1lcSAwIF0gJiYgeyB1c2FnZTsgZGllIDkgbm8gYXJndW1lbnRzOyB9ICNjaGFuZ2Ugb3IgcmVtb3ZlIGlmIGRlc2lyZWQKKyMgc2FuaXR5IGNoZWNraW5nCitbICIkbnVtIiBdICYmIGVjaG8gIiRudW0ifGdyZXAgLXEgJ15bMC05XSokJyAmJiBbICRudW0gLWdlIDEgXSBcCisgICAgfHwgZGllIDEgcGxlYXNlIHVzZSB0aGUgLWcgZmxhZyB3aXRoIGEgdmFsaWQgbnVtYmVyCisKKyMgTUFJTiBQUk9HUkFNCisKKyMgd2hhdCB2ZXJzaW9uIG9mIGxhbWUgYXJlIHdlIHVzaW5nPworbGFtZV92ZXJzPWAkTEFNRSAyPiYxIHwgYXdrICdOUj09MXtwcmludCAkM30nYAorCisjIGNoZWNrIGZpbGVuYW1lCitbIC1mICIkMSIgXSB8fCBkaWUgMiAiJyQxJyBpc24ndCBhIGZpbGUiCitlY2hvICIkMSJ8Z3JlcCAtcWkgJ1wud2F2JCcgfHwgZGllIDIgIickMScgaXNuJ3QgYSAud2F2IgorCisjIG1ha2UgdGVtcGZpbGVzCitiYXNlPWBlY2hvICIkMSJ8c2VkICdzL1wuW14uXSokLy8nYAorZGVzdD0ke2Jhc2V9X2dlbmVyYXRpb25fJG51bS53YXYKK1sgLWUgIiRkZXN0IiBdICYmIGRpZSAyICInJGRlc3QnIGFscmVhZHkgZXhpc3RzIgordG91Y2ggIiRkZXN0IiB8fCBkaWUgMiAiY291bGRuJ3QgY3JlYXRlICckZGVzdCciCitUTVBESVI9LiB0ZmlsZSB0bXB3YXYKK1RNUERJUj0uIHRmaWxlIHRtcG1wMworY3AgLWYgIiQxIiAiJHRtcHdhdiIKKworIyBkbyB0aGUgbG9vcAorc3RhcnQ9YGRhdGVgCitpPTEKK3doaWxlIFsgJGkgLWxlICRudW0gXTsgZG8KKyAgICBlICJXb3JraW5nIG9uIGZpbGUgJyQxJywgZ2VuZXJhdGlvbiBudW1iZXIgJGkuLi4iCisKKyAgICAkTEFNRSAkZW5jX29wdHMgLS10YyAibGFtZSAkbGFtZV92ZXJzOyBHZW5lcmF0aW9uOiAkaSIgXAorCSIkdG1wd2F2IiAiJHRtcG1wMyIgfHwgZGllIDMgZW5jb2RpbmcgZmFpbGVkCisgICAgJExBTUUgLS1kZWNvZGUgLS1tcDNpbnB1dCAiJHRtcG1wMyIgIiR0bXB3YXYiIHx8IGRpZSAzIGRlY29kaW5nIGZhaWxlZAorCisgICAgaT1gZXhwciAkaSArIDFgCitkb25lCitlbmQ9YGRhdGVgCisKKyMgc2F2ZSB0aGUgcmVzdWx0CitsbiAtZiAiJHRtcHdhdiIgIiRkZXN0IgorCitlY2hvCitlICJTdGFydDogJHN0YXJ0IgorZSAiU3RvcCA6ICRlbmQiCisKK2RpZQpkaWZmIC0tZ2l0IGEvbWlzYy9zY2FsYXJ0ZXN0LmMgYi9taXNjL3NjYWxhcnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTY4MGQwCi0tLSAvZGV2L251bGwKKysrIGIvbWlzYy9zY2FsYXJ0ZXN0LmMKQEAgLTAsMCArMSwxNjYgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAicmVzYW1wbGUuaCIKKworI2RlZmluZSBDTEsgICAgMzAwLmU2CisjZGVmaW5lIExPT1BTICAyMDAwMAorCisKK3R5cGVkZWYgZG91YmxlICggKmRkZiApICggZG91YmxlICk7CisKKworZmxvYXQgYTEgWzI1Nl07CitmbG9hdCBhMiBbMjU2XTsKKwordm9pZCBpbml0ICggdm9pZCApCit7CisgICAgaW50ICBpOworICAgIAorICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZW9mKGExKS9zaXplb2YoKmExKTsgaSsrICkgeworICAgICAgICBhMSBbaV0gPSBzaW4oaSkrMC4yKnNpbigxLjgqaSkrbG9nKDIraSk7CisJYTIgW2ldID0gY29zKDAuMSppKTsKKyAgICB9Cit9CisKK3ZvaWQgdGVzdCAoIGludCBubywgc2NhbGFyX3QgZiApCit7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICB0MTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgIHQyOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgdDM7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICB0NDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGw7CisgICAgZG91YmxlICAgICAgICAgICAgICBsYXN0ID0gMDsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGN1cnIgPSAwOworICAgIAorICAgIHByaW50ZiAoICJbJTN1XSAlMjIuMTRmXHRcdCIsIG5vLCAoZG91YmxlKWYgKGExLGEyKSApOworICAgIGZmbHVzaCAoIHN0ZG91dCApOworCisgICAgZG8geworICAgIHJkdHNjbGwgKHQxKTsKKyAgICBsID0gTE9PUFM7CisgICAgZG8KKyAgICAgICAgOworICAgIHdoaWxlICgtLWwpOworICAgIHJkdHNjbGwgKHQyKTsKKyAgICByZHRzY2xsICh0Myk7CisgICAgbCA9IExPT1BTOworICAgIGRvCisgICAgICAgIGYoYTEsYTIpLCBmKGExLGEyKSwgZihhMSxhMiksIGYoYTEsYTIpOworICAgIHdoaWxlICgtLWwpOworICAgIHJkdHNjbGwgKHQ0KTsKKyAgICBsYXN0ID0gY3VycjsKKyAgICBjdXJyID0gKHQ0LXQzLXQyK3QxKSAvIENMSyAvIExPT1BTIC8gNCAqIDEuZTk7CisgICAgfSB3aGlsZSAoIGZhYnMoY3Vyci1sYXN0KSA+IDEuZS00ICogKGN1cnIrbGFzdCkgKTsKKyAgICBwcmludGYgKCIlOC4yZiBuc1xuIiwgKGN1cnIrbGFzdCkgLyAyICk7Cit9CisKK3ZvaWQgdGVzdG4gKCBzY2FsYXJuX3QgZiApCit7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICB0MTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgIHQyOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgdDM7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICB0NDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGw7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIGRvdWJsZSAgICAgICAgICAgICAgbGFzdCA9IDA7CisgICAgZG91YmxlICAgICAgICAgICAgICBjdXJyID0gMDsKKyAgICAKKyAgICBmb3IgKCBpID0gMTsgaSA8PSA2NDsgaSArPSBpPDYgPyAxIDogaTw4ID8gMiA6IGkgKSB7CisgICAgICAgIHByaW50ZiAoICJbJTN1XSAlMjIuMTRmXHRcdCIsIDQqaSwgKGRvdWJsZSlmIChhMSxhMixpKSApOworICAgICAgICBmZmx1c2ggKCBzdGRvdXQgKTsKKworICAgIGRvIHsKKyAgICAgICAgcmR0c2NsbCAodDEpOworICAgICAgICBsID0gTE9PUFM7CisgICAgICAgIGRvCisgICAgICAgICAgICA7CisgICAgICAgIHdoaWxlICgtLWwpOworICAgICAgICByZHRzY2xsICh0Mik7CisgICAgICAgIHJkdHNjbGwgKHQzKTsKKyAgICAgICAgbCA9IExPT1BTOworICAgICAgICBkbworICAgICAgICAgICAgZihhMSxhMixpKSwgZihhMSxhMixpKSwgZihhMSxhMixpKSwgZihhMSxhMixpKTsKKyAgICAgICAgd2hpbGUgKC0tbCk7CisgICAgICAgIHJkdHNjbGwgKHQ0KTsKKyAgICBsYXN0ID0gY3VycjsKKyAgICBjdXJyID0gKHQ0LXQzLXQyK3QxKSAvIENMSyAvIExPT1BTIC8gNCAqIDEuZTk7CisgICAgfSB3aGlsZSAoIGZhYnMoY3Vyci1sYXN0KSA+IDEuZS00ICogKGN1cnIrbGFzdCkgKTsKKyAgICBwcmludGYgKCIlOC4yZiBuc1xuIiwgKGN1cnIrbGFzdCkgLyAyICk7CisgICAgfQorfQorCit2b2lkIHRlc3QyICggY29uc3QgY2hhciogbmFtZSwgZGRmIGYgKQoreworICAgIGludCAgICAgaTsKKyAgICBkb3VibGUgIHg7CisgICAgCisgICAgcHJpbnRmICggIlxuJSUlJSAlc1xuXG4iLCBuYW1lICk7CisgICAgCisgICAgZm9yICggaSA9IC0xMDAwOyBpIDw9IDEwMDA7IGkrKyApIHsKKyAgICAgICAgeCA9IDEuZS0zICogaTsKKwlwcmludGYgKCAiJTVkXHQlMTIuOGZcdCUxMi44Zlx0JTEyLjhmXG4iLCBpLCBmKHgpLCAoZih4KzUuZS01KSAtIGYoeC01LmUtNSkpKjEuZSs0LCAoZih4KzEuZS00KSArIGYoeC0xLmUtNCkgLSAyKmYoeCkpKjUuZSs3ICk7CisgICAgfQorICAgIHByaW50ZiAoICIlJSUlXG4iICk7CisgICAgZmZsdXNoICggc3Rkb3V0ICk7Cit9CisKKworaW50IG1haW4gKCBpbnQgYXJnYywgY2hhcioqIGFyZ3YgKQoreworCisjaWYgMAorCisgICAgdGVzdDIgKCAiSGFubiIsIGhhbm5pbmcgICApOworICAgIHRlc3QyICggIkhhbW0iLCBoYW1taW5nICAgKTsKKyAgICB0ZXN0MiAoICJCTSIsIGJsYWNrbWFuICApOworICAgIHRlc3QyICggIkJNMSIsYmxhY2ttYW4xICk7CisgICAgdGVzdDIgKCAiQk0yIixibGFja21hbjIgKTsKKyAgICB0ZXN0MiAoICJCTUggTiIsYmxhY2ttYW5oYXJyaXNfbnV0dGFsbCApOworICAgIHRlc3QyICggIk1OSCBNaW4iLGJsYWNrbWFuaGFycmlzX21pbjQgICAgKTsKKworI2Vsc2UKKworICAgIGluaXQgKCk7CisKKyAgICB0ZXN0ICggNCwgc2NhbGFyMDRfZmxvYXQzMiAgICAgICApOworICAgIHRlc3QgKCA0LCBzY2FsYXIwNF9mbG9hdDMyX2kzODcgICk7CisgICAgdGVzdCAoIDQsIHNjYWxhcjA0X2Zsb2F0MzJfM0ROb3cgKTsKKyAgICB0ZXN0ICggNCwgc2NhbGFyMDRfZmxvYXQzMl9TSU1EICApOworCisgICAgdGVzdCAoIDgsIHNjYWxhcjA4X2Zsb2F0MzIgICAgICAgKTsKKyAgICB0ZXN0ICggOCwgc2NhbGFyMDhfZmxvYXQzMl9pMzg3ICApOworICAgIHRlc3QgKCA4LCBzY2FsYXIwOF9mbG9hdDMyXzNETm93ICk7CisgICAgdGVzdCAoIDgsIHNjYWxhcjA4X2Zsb2F0MzJfU0lNRCAgKTsKKworICAgIHRlc3QgKCAxMiwgc2NhbGFyMTJfZmxvYXQzMiAgICAgICApOworICAgIHRlc3QgKCAxMiwgc2NhbGFyMTJfZmxvYXQzMl9pMzg3ICApOworICAgIHRlc3QgKCAxMiwgc2NhbGFyMTJfZmxvYXQzMl8zRE5vdyApOworICAgIHRlc3QgKCAxMiwgc2NhbGFyMTJfZmxvYXQzMl9TSU1EICApOworCisgICAgdGVzdCAoIDE2LCBzY2FsYXIxNl9mbG9hdDMyICAgICAgICk7CisgICAgdGVzdCAoIDE2LCBzY2FsYXIxNl9mbG9hdDMyX2kzODcgICk7CisgICAgdGVzdCAoIDE2LCBzY2FsYXIxNl9mbG9hdDMyXzNETm93ICk7CisgICAgdGVzdCAoIDE2LCBzY2FsYXIxNl9mbG9hdDMyX1NJTUQgICk7CisKKyAgICB0ZXN0ICggMjAsIHNjYWxhcjIwX2Zsb2F0MzIgICAgICAgKTsKKyAgICB0ZXN0ICggMjAsIHNjYWxhcjIwX2Zsb2F0MzJfaTM4NyAgKTsKKyAgICB0ZXN0ICggMjAsIHNjYWxhcjIwX2Zsb2F0MzJfM0ROb3cgKTsKKyAgICB0ZXN0ICggMjAsIHNjYWxhcjIwX2Zsb2F0MzJfU0lNRCAgKTsKKworICAgIHRlc3QgKCAyNCwgc2NhbGFyMjRfZmxvYXQzMiAgICAgICApOworICAgIHRlc3QgKCAyNCwgc2NhbGFyMjRfZmxvYXQzMl9pMzg3ICApOworICAgIHRlc3QgKCAyNCwgc2NhbGFyMjRfZmxvYXQzMl8zRE5vdyApOworICAgIHRlc3QgKCAyNCwgc2NhbGFyMjRfZmxvYXQzMl9TSU1EICApOworCisgICAgdGVzdG4oIHNjYWxhcjRuX2Zsb2F0MzIgICAgICAgKTsKKyAgICB0ZXN0biggc2NhbGFyNG5fZmxvYXQzMl9pMzg3ICApOworICAgIHRlc3RuKCBzY2FsYXI0bl9mbG9hdDMyXzNETm93ICk7CisgICAgdGVzdG4oIHNjYWxhcjRuX2Zsb2F0MzJfU0lNRCAgKTsKKworI2VuZGlmICAgIAorICAgIAorICAgIHJldHVybiAwOworfQorCisvKiBlbmQgb2Ygc2NhbGFydGVzdC5jICovCmRpZmYgLS1naXQgYS9taXNzaW5nIGIvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OTRlNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZwpAQCAtMCwwICsxLDM2MCBAQAorIyEgL2Jpbi9zaAorIyBDb21tb24gc3R1YiBmb3IgYSBmZXcgbWlzc2luZyBHTlUgcHJvZ3JhbXMgd2hpbGUgaW5zdGFsbGluZy4KKworc2NyaXB0dmVyc2lvbj0yMDA1LTA2LTA4LjIxCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICBleGl0IDEKK2ZpCisKK3J1bj06CisKKyMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKKyMgc3JjZGlyIGFscmVhZHkuCitpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCitlbHNlCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KK2ZpCisKK21zZz0ibWlzc2luZyBvbiB5b3VyIHN5c3RlbSIKKworY2FzZSAiJDEiIGluCistLXJ1bikKKyAgIyBUcnkgdG8gcnVuIHJlcXVlc3RlZCBwcm9ncmFtLCBhbmQganVzdCBleGl0IGlmIGl0IHN1Y2NlZWRzLgorICBydW49CisgIHNoaWZ0CisgICIkQCIgJiYgZXhpdCAwCisgICMgRXhpdCBjb2RlIDYzIG1lYW5zIHZlcnNpb24gbWlzbWF0Y2guICBUaGlzIG9mdGVuIGhhcHBlbnMKKyAgIyB3aGVuIHRoZSB1c2VyIHRyeSB0byB1c2UgYW4gYW5jaWVudCB2ZXJzaW9uIG9mIGEgdG9vbCBvbgorICAjIGEgZmlsZSB0aGF0IHJlcXVpcmVzIGEgbWluaW11bSB2ZXJzaW9uLiAgSW4gdGhpcyBjYXNlIHdlCisgICMgd2Ugc2hvdWxkIHByb2NlZWQgaGFzIGlmIHRoZSBwcm9ncmFtIGhhZCBiZWVuIGFic2VudCwgb3IKKyAgIyBpZiAtLXJ1biBoYWRuJ3QgYmVlbiBwYXNzZWQuCisgIGlmIHRlc3QgJD8gPSA2MzsgdGhlbgorICAgIHJ1bj06CisgICAgbXNnPSJwcm9iYWJseSB0b28gb2xkIgorICBmaQorICA7OworCisgIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKyAgICBlY2hvICJcCiskMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KKworSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgorZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC0tcnVuICAgICAgICAgICB0cnkgdG8gcnVuIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgZW11bGF0ZSBpdCBpZiBpdCBmYWlscworCitTdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6CisgIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKKyAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCisgIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCisgIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKKyAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQorICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBoZWxwMm1hbiAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgdGFyICAgICAgICAgIHRyeSB0YXIsIGdudXRhciwgZ3RhciwgdGhlbiB0YXIgd2l0aG91dCBub24tcG9ydGFibGUgZmxhZ3MKKyAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQorCitTZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCitlc2FjCisKKyMgTm93IGV4aXQgaWYgd2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4gIEFsc28gZXhpdCBub3cgaWYgd2UKKyMgZG9uJ3QgaGF2ZSBpdCBhbmQgLS12ZXJzaW9uIHdhcyBwYXNzZWQgKG1vc3QgbGlrZWx5IHRvIGRldGVjdAorIyB0aGUgcHJvZ3JhbSkuCitjYXNlICIkMSIgaW4KKyAgbGV4fHlhY2MpCisgICAgIyBOb3QgR05VIHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgLS12ZXJzaW9uLgorICAgIDs7CisKKyAgdGFyKQorICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCisgICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgorICAgICAgIGV4aXQgMQorICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KKyAgICAgICBleGl0IDEKKyAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgorICAgICAgICMgQ291bGQgbm90IHJ1biAtLXZlcnNpb24gb3IgLS1oZWxwLiAgVGhpcyBpcyBwcm9iYWJseSBzb21lb25lCisgICAgICAgIyBydW5uaW5nIGAkVE9PTCAtLXZlcnNpb24nIG9yIGAkVE9PTCAtLWhlbHAnIHRvIGNoZWNrIHdoZXRoZXIKKyAgICAgICAjICRUT09MIGV4aXN0cyBhbmQgbm90IGtub3dpbmcgJFRPT0wgdXNlcyBtaXNzaW5nLgorICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgOzsKK2VzYWMKKworIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKKyMgdHJ5IHRvIGVtdWxhdGUgaXQuCitjYXNlICIkMSIgaW4KKyAgYWNsb2NhbCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50CisgICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCisgICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgJHtjb25maWd1cmVfYWN9YAorICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgorICAgIHRvdWNoX2ZpbGVzPQorICAgIGZvciBmIGluICRmaWxlczsgZG8KKyAgICAgIGNhc2UgIiRmIiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCisgICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KKyAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAorCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8CisJICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCisgICAgOzsKKworICBhdXRvbTR0ZSkKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCisgICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0WyA9XSpcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW9bIF0qXChbXiBdKlwpLiovXDEvcCdgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiIyEgL2Jpbi9zaCIKKwllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKKwllY2hvICIjICAkICRAIgorCWVjaG8gImV4aXQgMCIKKwljaG1vZCAreCAkZmlsZQorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBiaXNvbnx5YWNjKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKKyAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAiJExBU1RBUkciIGluCisJKi55KQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYworCSAgICBmaQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCisJZWNobyA+eS50YWIuaAorICAgIGZpCisgICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgorCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYworICAgIGZpCisgICAgOzsKKworICBsZXh8ZmxleCkKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIGxleC55eS5jCisgICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCisgICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgorCWNhc2UgIiRMQVNUQVJHIiBpbgorCSoubCkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKKwkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYworICAgIGZpCisgICAgOzsKKworICBoZWxwMm1hbikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCisJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQorCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAorICAgIGZpCisgICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBtYWtlaW5mbykKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKKyAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cworICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKKyAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgorICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICAjIFRoZSBmaWxlIHRvIHRvdWNoIGlzIHRoYXQgc3BlY2lmaWVkIHdpdGggLW8gLi4uCisgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCisgICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCisgICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KKyAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAorICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRpbmZpbGVgCisgICAgICAjIC4uLiBvciBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIHNvdXJjZSBuYW1lIChkaXIvZi50ZXhpIGJlY29tZXMgZi5pbmZvKQorICAgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiRpbmZpbGUiIHwgc2VkICdzLC4qLywsO3MsLlteLl0qJCwsJ2AuaW5mbworICAgIGZpCisgICAgIyBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlIHVzZXIgcmVhbGx5IG5lZWRzIG1ha2VpbmZvOworICAgICMgbGV0J3MgZmFpbCB3aXRob3V0IHRvdWNoaW5nIGFueXRoaW5nLgorICAgIHRlc3QgLWYgJGZpbGUgfHwgZXhpdCAxCisgICAgdG91Y2ggJGZpbGUKKyAgICA7OworCisgIHRhcikKKyAgICBzaGlmdAorCisgICAgIyBXZSBoYXZlIGFscmVhZHkgdHJpZWQgdGFyIGluIHRoZSBnZW5lcmljIHBhcnQuCisgICAgIyBMb29rIGZvciBnbnV0YXIvZ3RhciBiZWZvcmUgaW52b2NhdGlvbiB0byBhdm9pZCB1Z2x5IGVycm9yCisgICAgIyBtZXNzYWdlcy4KKyAgICBpZiAoZ251dGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgorICAgICAgIGdudXRhciAiJEAiICYmIGV4aXQgMAorICAgIGZpCisgICAgaWYgKGd0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgICAgZ3RhciAiJEAiICYmIGV4aXQgMAorICAgIGZpCisgICAgZmlyc3Rhcmc9IiQxIgorICAgIGlmIHNoaWZ0OyB0aGVuCisJY2FzZSAiJGZpcnN0YXJnIiBpbgorCSpvKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKwljYXNlICIkZmlyc3RhcmciIGluCisJKmgqKQorCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKKwkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCisJICAgIDs7CisJZXNhYworICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IEkgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHJ1biBcYHRhcicgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAgICAgWW91IG1heSB3YW50IHRvIGluc3RhbGwgR05VIHRhciBvciBGcmVlIHBheHV0aWxzLCBvciBjaGVjayB0aGUKKyAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIgorICAgIGV4aXQgMQorICAgIDs7CisKKyAgKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCisgICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCisgICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQorICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL21wZ2xpYi9BVVRIT1JTIGIvbXBnbGliL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2YTEwYgotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi9BVVRIT1JTCkBAIC0wLDAgKzEsMTYgQEAKK01pY2hhZWwgSGlwcAk8bWhAbXBnMTIzLmRlPglBdXRob3Igb2Ygb3JpZ25hbCBtcGdsaWIgdmVyc2lvbiAwLjJhLgorCitBbGJlcnQgTC4gRmFiZXIJPGFmYWJlckB1c2Vycy5zZi5uZXQ+CitBbGVrc2FuZGVyIEtvcnp5bnNraQk8b2xjaW9zQHVzZXJzLnNmLm5ldD4gCitBbGV4YW5kZXIgTGVpZGluZ2VyCTxhbGVpZGluZ2VyQHVzZXJzLnNmLm5ldD4KK0ZyYW5rIEtsZW1tCTxwZmtAdXNlcnMuc2YubmV0PgorR2FicmllbCBCb3V2aWduZQk8Ym91dmlnbmVAdXNlcnMuc2YubmV0PgorTGVpZ2ggU21pdGgJPGxlaWdoc21pdGhAdXNlcnMuc2YubmV0PgorTWFyayBUYXlsb3IJPG1hcmt0QHVzZXJzLnNmLm5ldD4KK015ZXJzIENhcnBlbnRlcgk8bXllcnNAdXNlcnMuc2YubmV0PgorTmFva2kgU2hpYmF0YQk8c2hpYmF0Y2hAdXNlcnMuc2YubmV0PgorUm9iZXJ0IEhlZ2VtYW5uCTxyb2JlcnRAdXNlcnMuc2YubmV0PgorU2lnYmpvcm4gU2tqYWVyZXQJPGNpc2NAdXNlcnMuc2YubmV0PgorU3RlZmFuIEJlbGxvbgk8c2JlbGxvbkB1c2Vycy5zZi5uZXQ+CitTdGV2ZSBMaG9tbWUJPHJvYnV4NEB1c2Vycy5zZi5uZXQ+CitUYWtlaGlybyBUT01JTkFHQQk8dGFrZWhpcm9AdXNlcnMuc2YubmV0PgpkaWZmIC0tZ2l0IGEvbXBnbGliL01ha2VmaWxlLmFtIGIvbXBnbGliL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NjQwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tcGdsaWIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1NyBAQAorIyMgJElkOiBNYWtlZmlsZS5hbSx2IDEuMTUuOC4xIDIwMTAvMDMvMjIgMTQ6MTc6MTQgcm9iZXJ0IEV4cCAkCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKKworSU5DTFVERVMgPSBASU5DTFVERVNAIC1JJCh0b3Bfc3JjZGlyKS9saWJtcDNsYW1lIC1JJCh0b3BfYnVpbGRkaXIpCisKK0VYVFJBX0RJU1QgPSBcCisJQVVUSE9SUyBcCisJUkVBRE1FIFwKKwltcGdsaWJfdmM2LmRzcCBcCisJbXBnbGliX3ZjOC52Y3Byb2oKKworREVGUyA9IEBERUZTQCBAQ09ORklHX0RFRlNACisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYm1wZ2RlY29kZXIubGEKKworbGlibXBnZGVjb2Rlcl9sYV9TT1VSQ0VTID0gY29tbW9uLmMgXAorCWRjdDY0X2kzODYuYyBcCisJZGVjb2RlX2kzODYuYyBcCisJaW50ZXJmYWNlLmMgXAorCWxheWVyMS5jIFwKKwlsYXllcjIuYyBcCisJbGF5ZXIzLmMgXAorCXRhYmluaXQuYworCitub2luc3RfSEVBREVSUyA9IGNvbW1vbi5oIFwKKwlkY3Q2NF9pMzg2LmggXAorCWRlY29kZV9pMzg2LmggXAorCWh1ZmZtYW4uaCBcCisJaW50ZXJmYWNlLmggXAorCWwydGFibGVzLmggXAorCWxheWVyMS5oIFwKKwlsYXllcjIuaCBcCisJbGF5ZXIzLmggXAorCW1wZzEyMy5oIFwKKwltcGdsaWIuaCBcCisJdGFiaW5pdC5oCisKK0xDTElOVEZMQUdTPSBcCisJK3Bvc2l4bGliIFwKKwkrc2hvd3N1bW1hcnkgXAorCStzaG93YWxsdXNlcyBcCisJK3doaWNobGliIFwKKwkrZm9yY2VoaW50cyBcCisJLWZpeGVkZm9ybWFsYXJyYXkgXAorCSttYXRjaGFueWludGVncmFsIFwKKwktRGxpbnQKKworbGNsaW50LnR4dDogJHtsaWJtcGdkZWNvZGVyX2xhX1NPVVJDRVN9ICR7bm9pbnN0X0hFQURFUlN9CisJQGxjbGludCAke0xDTElOVEZMQUdTfSAke0lOQ0xVREVTfSAke0RFRlN9ICR7bGlibXBnZGVjb2Rlcl9sYV9TT1VSQ0VTfSAyPiYxID5sY2xpbnQudHh0IHx8IHRydWUKKworbGNsaW50OiBsY2xpbnQudHh0CisJbW9yZSBsY2xpbnQudHh0CisKKyMkKE9CSkVDVFMpOiBsaWJ0b29sCisjbGlidG9vbDogJChMSUJUT09MX0RFUFMpCisjCSQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvbXBnbGliL01ha2VmaWxlLmluIGIvbXBnbGliL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDg2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tcGdsaWIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1NTIgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTAgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIGdsb2JhbCBzZWN0aW9uIGZvciBldmVyeSBNYWtlZmlsZS5hbQorCisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitBTlNJMktOUiA9ICQodG9wX3NyY2RpcikvYW5zaTJrbnIKK0RJU1RfQ09NTU9OID0gUkVBRE1FICQobm9pbnN0X0hFQURFUlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCisJJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsIGRlcGNvbXAKK3N1YmRpciA9IG1wZ2xpYgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbgorYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0xUTElCUkFSSUVTID0gJChub2luc3RfTFRMSUJSQVJJRVMpCitsaWJtcGdkZWNvZGVyX2xhX0xJQkFERCA9CithbV9saWJtcGdkZWNvZGVyX2xhX09CSkVDVFMgPSBjb21tb24kVS5sbyBkY3Q2NF9pMzg2JFUubG8gXAorCWRlY29kZV9pMzg2JFUubG8gaW50ZXJmYWNlJFUubG8gbGF5ZXIxJFUubG8gbGF5ZXIyJFUubG8gXAorCWxheWVyMyRVLmxvIHRhYmluaXQkVS5sbworbGlibXBnZGVjb2Rlcl9sYV9PQkpFQ1RTID0gJChhbV9saWJtcGdkZWNvZGVyX2xhX09CSkVDVFMpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJCh0b3BfYnVpbGRkaXIpQGFtX19pc3JjQAorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChsaWJtcGdkZWNvZGVyX2xhX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGxpYm1wZ2RlY29kZXJfbGFfU09VUkNFUykKK0hFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09ORklHX0RFRlMgPSBAQ09ORklHX0RFRlNACitDT05GSUdfTUFUSF9MSUIgPSBAQ09ORklHX01BVEhfTElCQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BVQ0NPREUgPSBAQ1BVQ0NPREVACitDUFVUWVBFID0gQENQVVRZUEVACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AgQENPTkZJR19ERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitJTkNMVURFUyA9IEBJTkNMVURFU0AgLUkkKHRvcF9zcmNkaXIpL2xpYm1wM2xhbWUgLUkkKHRvcF9idWlsZGRpcikKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VERVAgPSBATUFLRURFUEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTkFTTSA9IEBOQVNNQAorTkFTTV9GT1JNQVQgPSBATkFTTV9GT1JNQVRACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JNX0YgPSBAUk1fRkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0ZST05URU5EID0gQFdJVEhfRlJPTlRFTkRACitXSVRIX01QM1JUUCA9IEBXSVRIX01QM1JUUEAKK1dJVEhfTVAzWCA9IEBXSVRIX01QM1hACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gMS45IGZvcmVpZ24gJCh0b3Bfc3JjZGlyKS9hbnNpMmtucgorRVhUUkFfRElTVCA9IFwKKwlBVVRIT1JTIFwKKwlSRUFETUUgXAorCW1wZ2xpYl92YzYuZHNwIFwKKwltcGdsaWJfdmM4LnZjcHJvagorCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJtcGdkZWNvZGVyLmxhCitsaWJtcGdkZWNvZGVyX2xhX1NPVVJDRVMgPSBjb21tb24uYyBcCisJZGN0NjRfaTM4Ni5jIFwKKwlkZWNvZGVfaTM4Ni5jIFwKKwlpbnRlcmZhY2UuYyBcCisJbGF5ZXIxLmMgXAorCWxheWVyMi5jIFwKKwlsYXllcjMuYyBcCisJdGFiaW5pdC5jCisKK25vaW5zdF9IRUFERVJTID0gY29tbW9uLmggXAorCWRjdDY0X2kzODYuaCBcCisJZGVjb2RlX2kzODYuaCBcCisJaHVmZm1hbi5oIFwKKwlpbnRlcmZhY2UuaCBcCisJbDJ0YWJsZXMuaCBcCisJbGF5ZXIxLmggXAorCWxheWVyMi5oIFwKKwlsYXllcjMuaCBcCisJbXBnMTIzLmggXAorCW1wZ2xpYi5oIFwKKwl0YWJpbml0LmgKKworTENMSU5URkxBR1MgPSBcCisJK3Bvc2l4bGliIFwKKwkrc2hvd3N1bW1hcnkgXAorCStzaG93YWxsdXNlcyBcCisJK3doaWNobGliIFwKKwkrZm9yY2VoaW50cyBcCisJLWZpeGVkZm9ybWFsYXJyYXkgXAorCSttYXRjaGFueWludGVncmFsIFwKKwktRGxpbnQKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbXBnbGliL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduICBtcGdsaWIvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobm9pbnN0X0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorbGlibXBnZGVjb2Rlci5sYTogJChsaWJtcGdkZWNvZGVyX2xhX09CSkVDVFMpICQobGlibXBnZGVjb2Rlcl9sYV9ERVBFTkRFTkNJRVMpIAorCSQoTElOSykgICQobGlibXBnZGVjb2Rlcl9sYV9PQkpFQ1RTKSAkKGxpYm1wZ2RlY29kZXJfbGFfTElCQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCiskKHRvcF9zcmNkaXIpL2Fuc2kya25yOgorCWNkICQodG9wX3NyY2RpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgLi9hbnNpMmtucgorCittb3N0bHljbGVhbi1rcjoKKwktdGVzdCAiJFUiID0gIiIgfHwgcm0gLWYgKl8uYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY29tbW9uJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kY3Q2NF9pMzg2JFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kZWNvZGVfaTM4NiRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvaW50ZXJmYWNlJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9sYXllcjEkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xheWVyMiRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGF5ZXIzJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90YWJpbml0JFUuUGxvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8Citjb21tb25fLmM6IGNvbW1vbi5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvY29tbW9uLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvY29tbW9uLmM7IGVsc2UgZWNobyBjb21tb24uYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorZGN0NjRfaTM4Nl8uYzogZGN0NjRfaTM4Ni5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvZGN0NjRfaTM4Ni5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2RjdDY0X2kzODYuYzsgZWxzZSBlY2hvIGRjdDY0X2kzODYuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorZGVjb2RlX2kzODZfLmM6IGRlY29kZV9pMzg2LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9kZWNvZGVfaTM4Ni5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2RlY29kZV9pMzg2LmM7IGVsc2UgZWNobyBkZWNvZGVfaTM4Ni5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitpbnRlcmZhY2VfLmM6IGludGVyZmFjZS5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvaW50ZXJmYWNlLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvaW50ZXJmYWNlLmM7IGVsc2UgZWNobyBpbnRlcmZhY2UuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorbGF5ZXIxXy5jOiBsYXllcjEuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2xheWVyMS5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2xheWVyMS5jOyBlbHNlIGVjaG8gbGF5ZXIxLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2xheWVyMl8uYzogbGF5ZXIyLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9sYXllcjIuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9sYXllcjIuYzsgZWxzZSBlY2hvIGxheWVyMi5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitsYXllcjNfLmM6IGxheWVyMy5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvbGF5ZXIzLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvbGF5ZXIzLmM7IGVsc2UgZWNobyBsYXllcjMuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAordGFiaW5pdF8uYzogdGFiaW5pdC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvdGFiaW5pdC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3RhYmluaXQuYzsgZWxzZSBlY2hvIHRhYmluaXQuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorY29tbW9uXy4kKE9CSkVYVCkgY29tbW9uXy5sbyBkY3Q2NF9pMzg2Xy4kKE9CSkVYVCkgZGN0NjRfaTM4Nl8ubG8gXAorZGVjb2RlX2kzODZfLiQoT0JKRVhUKSBkZWNvZGVfaTM4Nl8ubG8gaW50ZXJmYWNlXy4kKE9CSkVYVCkgXAoraW50ZXJmYWNlXy5sbyBsYXllcjFfLiQoT0JKRVhUKSBsYXllcjFfLmxvIGxheWVyMl8uJChPQkpFWFQpIFwKK2xheWVyMl8ubG8gbGF5ZXIzXy4kKE9CSkVYVCkgbGF5ZXIzXy5sbyB0YWJpbml0Xy4kKE9CSkVYVCkgdGFiaW5pdF8ubG8gXAorOiAkKEFOU0kyS05SKQorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKEhFQURFUlMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMVExJQlJBUklFUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWtyIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisKK2xjbGludC50eHQ6ICR7bGlibXBnZGVjb2Rlcl9sYV9TT1VSQ0VTfSAke25vaW5zdF9IRUFERVJTfQorCUBsY2xpbnQgJHtMQ0xJTlRGTEFHU30gJHtJTkNMVURFU30gJHtERUZTfSAke2xpYm1wZ2RlY29kZXJfbGFfU09VUkNFU30gMj4mMSA+bGNsaW50LnR4dCB8fCB0cnVlCisKK2xjbGludDogbGNsaW50LnR4dAorCW1vcmUgbGNsaW50LnR4dAorCisjJChPQkpFQ1RTKTogbGlidG9vbAorI2xpYnRvb2w6ICQoTElCVE9PTF9ERVBTKQorIwkkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL21wZ2xpYi9SRUFETUUgYi9tcGdsaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNTVkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcGdsaWIvUkVBRE1FCkBAIC0wLDAgKzEsMjYgQEAKK2hpcCAtIEhpcCBJc24ndCBhIFBsYXllcgorQSBMR1BMZWQgbXBlZyBhdWRpbyBkZWNvZGluZyBsaWJyYXJ5LgorCitCYXNlZCBvZmYgb2YgTWljaGFlbCBIaXBwJ3MgbXBnbGliIDAuMmEgPGh0dHA6Ly93d3cubXBnMTIzLmRlLz4sIHdpdGggbWFueQoraW1wcm92ZW1lbnRzIGJ5IHRoZSBsYW1lIGRldmVsb3BtZW50IHRlYW0gKHNlZSBBVVRIT1JTKS4KKworVGhlIGludGVyZmFjZSB0byB0aGUgbGlicmFyeSBpcyBiYXNlZCBvZmYgb2Ygdm9yYmlzZmlsZS4gIElmIHlvdSBhZGQgbXAzCitzdXBwb3J0IHRvIHlvdXIgYXBwIHVzaW5nIHRoaXMgbGlicmFyeSBpdCBzaG91bGQgYmUgYSBzbmFwIHRvIGFkZCBPZ2cgVm9yYmlzCitzdXBwb3J0IGFzIHdlbGwuCisKK1RoaXMgaXNuJ3QgYXMgZmFzdCBhcyBtcGcxMjMgd2lsbCBiZSBmb3IgZGVjb2RpbmcgYXMgbm9uZSBvZiBpdCBpcyBpbgorYXNzbWJsZXIuICAKKworU2Vla2luZyBjdXJyZW50bHkgaXNuJ3QgaW1wbGVtZW50ZWQuCisKKworRnJvbSBtcGdsaWIncyBvcmdpbmFsIFJFQURNRToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1BMRUFTRSBOT1RFOiBUaGlzIHNvZnR3YXJlIG1heSBjb250YWluIHBhdGVudGVkIGFsZ29yaXRobXMgKGF0IGxlYXN0CisgIHBhdGVudGVkIGluIHNvbWUgY291bnRyaWVzKS4gSXQgbWF5IGJlIG5vdCBhbGxvd2VkIHRvIHNlbGwvdXNlIHByb2R1Y3RzCisgIGJhc2VkIG9uIHRoaXMgc291cmNlIGNvZGUgaW4gdGhlc2UgY291bnRyaWVzLiBDaGVjayB0aGlzIG91dCBmaXJzdCEKKworQ09QWVJJR0hUIG9mIE1QMyBtdXNpYzoKKyAgUGxlYXNlIG5vdGUsIHRoYXQgdGhlIGR1cGxpY2F0aW5nIG9mIGNvcHlyaWdodGVkIG11c2ljIHdpdGhvdXQgZXhwbGljaXQKKyAgcGVybWlzc2lvbiB2aW9sYXRlcyB0aGUgcmlnaHRzIG9mIHRoZSBvd25lci4KZGlmZiAtLWdpdCBhL21wZ2xpYi9jb21tb24uYyBiL21wZ2xpYi9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjZhOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2NvbW1vbi5jCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICogY29tbW9uLmM6IHNvbWUgY29tbW9uIGJpdHN0cmVhbSBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAgVGhlIEwuQS5NLkUuIHByb2plY3QKKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEhpcHAsIHNlZSBhbHNvIEFVVEhPUlMgYW5kIFJFQURNRS4KKyAqICAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogJElkOiBjb21tb24uYyx2IDEuMzIuOC40IDIwMTAvMDMvMjIgMTQ6MzI6MzYgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZmRlZiBtYWNpbnRvc2gKKyNpbmNsdWRlICAgPHR5cGVzLmg+CisjaW5jbHVkZSAgIDxzdGF0Lmg+CisjZWxzZQorI2luY2x1ZGUgIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKworLyogSW4gQysrIHRoZSBhcnJheSBmaXJzdCBtdXN0IGJlIHByb3RvdHlwZWQsIHdoeSA/ICovCisKKworICAgIC8qICpJTkRFTlQtT0ZGKiAqLworY29uc3QgaW50IHRhYnNlbF8xMjMgWzJdIFszXSBbMTZdID0geworICAgeyB7MCwzMiw2NCw5NiwxMjgsMTYwLDE5MiwyMjQsMjU2LDI4OCwzMjAsMzUyLDM4NCw0MTYsNDQ4LH0sCisgICAgIHswLDMyLDQ4LDU2LCA2NCwgODAsIDk2LDExMiwxMjgsMTYwLDE5MiwyMjQsMjU2LDMyMCwzODQsfSwKKyAgICAgezAsMzIsNDAsNDgsIDU2LCA2NCwgODAsIDk2LDExMiwxMjgsMTYwLDE5MiwyMjQsMjU2LDMyMCx9IH0sCisKKyAgIHsgezAsMzIsNDgsNTYsNjQsODAsOTYsMTEyLDEyOCwxNDQsMTYwLDE3NiwxOTIsMjI0LDI1Nix9LAorICAgICB7MCw4LDE2LDI0LDMyLDQwLDQ4LDU2LDY0LDgwLDk2LDExMiwxMjgsMTQ0LDE2MCx9LAorICAgICB7MCw4LDE2LDI0LDMyLDQwLDQ4LDU2LDY0LDgwLDk2LDExMiwxMjgsMTQ0LDE2MCx9IH0KK307CisKK2NvbnN0IGxvbmcgZnJlcXNbOV0gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwgMjQwMDAsIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsIDEyMDAwLCAgODAwMCB9OworCisgICAgLyogKklOREVOVC1PTiogKi8KKworCityZWFsICAgIG11bHNbMjddWzY0XTsKKworI2lmIDAKK3N0YXRpYyB2b2lkCitnZXRfSUlfc3R1ZmYoc3RydWN0IGZyYW1lICpmcikKK3sKKyAgICAvKiAqSU5ERU5ULU9GRiogKi8KKyAgc3RhdGljIGNvbnN0IGludCB0cmFuc2xhdGUgWzNdIFsyXSBbMTZdID0gICAvKiBjaGFyID8gKi8KKyAgIHsgeyB7IDAsMiwyLDIsMiwyLDIsMCwwLDAsMSwxLDEsMSwxLDAgfSAsCisgICAgICAgeyAwLDIsMiwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwwIH0gfSAsCisgICAgIHsgeyAwLDIsMiwyLDIsMiwyLDAsMCwwLDAsMCwwLDAsMCwwIH0gLAorICAgICAgIHsgMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9IH0gLAorICAgICB7IHsgMCwzLDMsMywzLDMsMywwLDAsMCwxLDEsMSwxLDEsMCB9ICwKKyAgICAgICB7IDAsMywzLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDAgfSB9IH07CisgICAgLyogKklOREVOVC1PTiogKi8KKworICAgIGludCAgICAgdGFibGUsIHNibGltOworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxfdGFibGUyICp0YWJsZXNbNV0gPSB7IGFsbG9jXzAsIGFsbG9jXzEsIGFsbG9jXzIsIGFsbG9jXzMsIGFsbG9jXzQgfTsKKyAgICBzdGF0aWMgaW50IHNibGltc1s1XSA9IHsgMjcsIDMwLCA4LCAxMiwgMzAgfTsKKworICAgIGlmIChmci0+bHNmKQorICAgICAgICB0YWJsZSA9IDQ7CisgICAgZWxzZQorICAgICAgICB0YWJsZSA9IHRyYW5zbGF0ZVtmci0+c2FtcGxpbmdfZnJlcXVlbmN5XVsyIC0gZnItPnN0ZXJlb11bZnItPmJpdHJhdGVfaW5kZXhdOworICAgIHNibGltID0gc2JsaW1zW3RhYmxlXTsKKworICAgIGZyLT5hbGxvYyA9IHRhYmxlc1t0YWJsZV07CisgICAgZnItPklJX3NibGltaXQgPSBzYmxpbTsKK30KKyNlbmRpZgorCisjZGVmaW5lIEhEUkNNUE1BU0sgMHhmZmZmZmQwMAorCisjZGVmaW5lIE1BWF9JTlBVVF9GUkFNRVNJWkUgNDA5NgorCitpbnQKK2hlYWRfY2hlY2sodW5zaWduZWQgbG9uZyBoZWFkLCBpbnQgY2hlY2tfbGF5ZXIpCit7CisgICAgLyoKKyAgICAgICBsb29rIGZvciBhIHZhbGlkIGhlYWRlci4gIAorICAgICAgIGlmIGNoZWNrX2xheWVyID4gMCwgdGhlbiByZXF1aXJlIHRoYXQKKyAgICAgICBuTGF5ZXIgPSBjaGVja19sYXllci4gIAorICAgICAqLworCisgICAgLyogYml0cyAxMy0xNCA9IGxheWVyIDMgKi8KKyAgICBpbnQgICAgIG5MYXllciA9IDQgLSAoKGhlYWQgPj4gMTcpICYgMyk7CisKKyAgICBpZiAoKGhlYWQgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgICAgIC8qIHN5bmN3b3JkICovCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAobkxheWVyID09IDQpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChjaGVja19sYXllciA+IDAgJiYgbkxheWVyICE9IGNoZWNrX2xheWVyKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoKChoZWFkID4+IDEyKSAmIDB4ZikgPT0gMHhmKSB7CisgICAgICAgIC8qIGJpdHMgMTYsMTcsMTgsMTkgPSAxMTExICBpbnZhbGlkIGJpdHJhdGUgKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoKChoZWFkID4+IDEwKSAmIDB4MykgPT0gMHgzKSB7CisgICAgICAgIC8qIGJpdHMgMjAsMjEgPSAxMSAgaW52YWxpZCBzYW1wbGluZyBmcmVxICovCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKChoZWFkICYgMHgzKSA9PSAweDIpCisgICAgICAgIC8qIGludmFsaWQgZW1waGFzaXMgKi8KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBkZWNvZGUgYSBoZWFkZXIgYW5kIHdyaXRlIHRoZSBpbmZvcm1hdGlvbgorICogaW50byB0aGUgZnJhbWUgc3RydWN0dXJlCisgKi8KK2ludAorZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZnJhbWUgKmZyLCB1bnNpZ25lZCBsb25nIG5ld2hlYWQpCit7CisKKworICAgIGlmIChuZXdoZWFkICYgKDEgPDwgMjApKSB7CisgICAgICAgIGZyLT5sc2YgPSAobmV3aGVhZCAmICgxIDw8IDE5KSkgPyAweDAgOiAweDE7CisgICAgICAgIGZyLT5tcGVnMjUgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnItPmxzZiA9IDE7CisgICAgICAgIGZyLT5tcGVnMjUgPSAxOworICAgIH0KKworCisgICAgZnItPmxheSA9IDQgLSAoKG5ld2hlYWQgPj4gMTcpICYgMyk7CisgICAgaWYgKCgobmV3aGVhZCA+PiAxMCkgJiAweDMpID09IDB4MykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN0cmVhbSBlcnJvclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmIChmci0+bXBlZzI1KSB7CisgICAgICAgIGZyLT5zYW1wbGluZ19mcmVxdWVuY3kgPSA2ICsgKChuZXdoZWFkID4+IDEwKSAmIDB4Myk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZnItPnNhbXBsaW5nX2ZyZXF1ZW5jeSA9ICgobmV3aGVhZCA+PiAxMCkgJiAweDMpICsgKGZyLT5sc2YgKiAzKTsKKworICAgIGZyLT5lcnJvcl9wcm90ZWN0aW9uID0gKChuZXdoZWFkID4+IDE2KSAmIDB4MSkgXiAweDE7CisKKyAgICBpZiAoZnItPm1wZWcyNSkgICAgIC8qIGFsbG93IEJpdHJhdGUgY2hhbmdlIGZvciAyLjUgLi4uICovCisgICAgICAgIGZyLT5iaXRyYXRlX2luZGV4ID0gKChuZXdoZWFkID4+IDEyKSAmIDB4Zik7CisKKyAgICBmci0+Yml0cmF0ZV9pbmRleCA9ICgobmV3aGVhZCA+PiAxMikgJiAweGYpOworICAgIGZyLT5wYWRkaW5nID0gKChuZXdoZWFkID4+IDkpICYgMHgxKTsKKyAgICBmci0+ZXh0ZW5zaW9uID0gKChuZXdoZWFkID4+IDgpICYgMHgxKTsKKyAgICBmci0+bW9kZSA9ICgobmV3aGVhZCA+PiA2KSAmIDB4Myk7CisgICAgZnItPm1vZGVfZXh0ID0gKChuZXdoZWFkID4+IDQpICYgMHgzKTsKKyAgICBmci0+Y29weXJpZ2h0ID0gKChuZXdoZWFkID4+IDMpICYgMHgxKTsKKyAgICBmci0+b3JpZ2luYWwgPSAoKG5ld2hlYWQgPj4gMikgJiAweDEpOworICAgIGZyLT5lbXBoYXNpcyA9IG5ld2hlYWQgJiAweDM7CisKKyAgICBmci0+c3RlcmVvID0gKGZyLT5tb2RlID09IE1QR19NRF9NT05PKSA/IDEgOiAyOworCisgICAgc3dpdGNoIChmci0+bGF5KSB7CisgICAgY2FzZSAxOgorICAgICAgICBmci0+ZnJhbWVzaXplID0gKGxvbmcpIHRhYnNlbF8xMjNbZnItPmxzZl1bMF1bZnItPmJpdHJhdGVfaW5kZXhdICogMTIwMDA7CisgICAgICAgIGZyLT5mcmFtZXNpemUgLz0gZnJlcXNbZnItPnNhbXBsaW5nX2ZyZXF1ZW5jeV07CisgICAgICAgIGZyLT5mcmFtZXNpemUgPSAoKGZyLT5mcmFtZXNpemUgKyBmci0+cGFkZGluZykgPDwgMikgLSA0OworICAgICAgICBmci0+ZG93bl9zYW1wbGUgPSAwOworICAgICAgICBmci0+ZG93bl9zYW1wbGVfc2JsaW1pdCA9IFNCTElNSVQgPj4gKGZyLT5kb3duX3NhbXBsZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgICBmci0+ZnJhbWVzaXplID0gKGxvbmcpIHRhYnNlbF8xMjNbZnItPmxzZl1bMV1bZnItPmJpdHJhdGVfaW5kZXhdICogMTQ0MDAwOworICAgICAgICBmci0+ZnJhbWVzaXplIC89IGZyZXFzW2ZyLT5zYW1wbGluZ19mcmVxdWVuY3ldOworICAgICAgICBmci0+ZnJhbWVzaXplICs9IGZyLT5wYWRkaW5nIC0gNDsKKyAgICAgICAgZnItPmRvd25fc2FtcGxlID0gMDsKKyAgICAgICAgZnItPmRvd25fc2FtcGxlX3NibGltaXQgPSBTQkxJTUlUID4+IChmci0+ZG93bl9zYW1wbGUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMzoKKyNpZiAwCisgICAgICAgIGZyLT5kb19sYXllciA9IGRvX2xheWVyMzsKKyAgICAgICAgaWYgKGZyLT5sc2YpCisgICAgICAgICAgICBzc2l6ZSA9IChmci0+c3RlcmVvID09IDEpID8gOSA6IDE3OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzc2l6ZSA9IChmci0+c3RlcmVvID09IDEpID8gMTcgOiAzMjsKKyNlbmRpZgorCisjaWYgMAorICAgICAgICBpZiAoZnItPmVycm9yX3Byb3RlY3Rpb24pCisgICAgICAgICAgICBzc2l6ZSArPSAyOworI2VuZGlmCisgICAgICAgIGlmIChmci0+ZnJhbWVzaXplID4gTUFYX0lOUFVUX0ZSQU1FU0laRSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGcmFtZSBzaXplIHRvbyBiaWcuXG4iKTsKKyAgICAgICAgICAgIGZyLT5mcmFtZXNpemUgPSBNQVhfSU5QVVRfRlJBTUVTSVpFOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKGZyLT5iaXRyYXRlX2luZGV4ID09IDApCisgICAgICAgICAgICBmci0+ZnJhbWVzaXplID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmci0+ZnJhbWVzaXplID0gKGxvbmcpIHRhYnNlbF8xMjNbZnItPmxzZl1bMl1bZnItPmJpdHJhdGVfaW5kZXhdICogMTQ0MDAwOworICAgICAgICAgICAgZnItPmZyYW1lc2l6ZSAvPSBmcmVxc1tmci0+c2FtcGxpbmdfZnJlcXVlbmN5XSA8PCAoZnItPmxzZik7CisgICAgICAgICAgICBmci0+ZnJhbWVzaXplID0gZnItPmZyYW1lc2l6ZSArIGZyLT5wYWRkaW5nIC0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNvcnJ5LCBsYXllciAlZCBub3Qgc3VwcG9ydGVkXG4iLCBmci0+bGF5KTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgLyogICAgcHJpbnRfaGVhZGVyKGZyKTsgKi8KKworICAgIHJldHVybiAxOworfQorCisKKyNpZiAxCit2b2lkCitwcmludF9oZWFkZXIoc3RydWN0IGZyYW1lICpmcikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqbW9kZXNbNF0gPSB7ICJTdGVyZW8iLCAiSm9pbnQtU3RlcmVvIiwgIkR1YWwtQ2hhbm5lbCIsICJTaW5nbGUtQ2hhbm5lbCIgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqbGF5ZXJzWzRdID0geyAiVW5rbm93biIsICJJIiwgIklJIiwgIklJSSIgfTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiTVBFRyAlcywgTGF5ZXI6ICVzLCBGcmVxOiAlbGQsIG1vZGU6ICVzLCBtb2RleHQ6ICVkLCBCUEYgOiAlZFxuIiwKKyAgICAgICAgICAgIGZyLT5tcGVnMjUgPyAiMi41IiA6IChmci0+bHNmID8gIjIuMCIgOiAiMS4wIiksCisgICAgICAgICAgICBsYXllcnNbZnItPmxheV0sIGZyZXFzW2ZyLT5zYW1wbGluZ19mcmVxdWVuY3ldLAorICAgICAgICAgICAgbW9kZXNbZnItPm1vZGVdLCBmci0+bW9kZV9leHQsIGZyLT5mcmFtZXNpemUgKyA0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNoYW5uZWxzOiAlZCwgY29weXJpZ2h0OiAlcywgb3JpZ2luYWw6ICVzLCBDUkM6ICVzLCBlbXBoYXNpczogJWQuXG4iLAorICAgICAgICAgICAgZnItPnN0ZXJlbywgZnItPmNvcHlyaWdodCA/ICJZZXMiIDogIk5vIiwKKyAgICAgICAgICAgIGZyLT5vcmlnaW5hbCA/ICJZZXMiIDogIk5vIiwgZnItPmVycm9yX3Byb3RlY3Rpb24gPyAiWWVzIiA6ICJObyIsIGZyLT5lbXBoYXNpcyk7CisgICAgZnByaW50ZihzdGRlcnIsICJCaXRyYXRlOiAlZCBLYml0cy9zLCBFeHRlbnNpb24gdmFsdWU6ICVkXG4iLAorICAgICAgICAgICAgdGFic2VsXzEyM1tmci0+bHNmXVtmci0+bGF5IC0gMV1bZnItPmJpdHJhdGVfaW5kZXhdLCBmci0+ZXh0ZW5zaW9uKTsKK30KKwordm9pZAorcHJpbnRfaGVhZGVyX2NvbXBhY3Qoc3RydWN0IGZyYW1lICpmcikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqbW9kZXNbNF0gPSB7ICJzdGVyZW8iLCAiam9pbnQtc3RlcmVvIiwgImR1YWwtY2hhbm5lbCIsICJtb25vIiB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICpsYXllcnNbNF0gPSB7ICJVbmtub3duIiwgIkkiLCAiSUkiLCAiSUlJIiB9OworCisgICAgZnByaW50ZihzdGRlcnIsICJNUEVHICVzIGxheWVyICVzLCAlZCBrYml0L3MsICVsZCBIeiAlc1xuIiwKKyAgICAgICAgICAgIGZyLT5tcGVnMjUgPyAiMi41IiA6IChmci0+bHNmID8gIjIuMCIgOiAiMS4wIiksCisgICAgICAgICAgICBsYXllcnNbZnItPmxheV0sCisgICAgICAgICAgICB0YWJzZWxfMTIzW2ZyLT5sc2ZdW2ZyLT5sYXkgLSAxXVtmci0+Yml0cmF0ZV9pbmRleF0sCisgICAgICAgICAgICBmcmVxc1tmci0+c2FtcGxpbmdfZnJlcXVlbmN5XSwgbW9kZXNbZnItPm1vZGVdKTsKK30KKworI2VuZGlmCisKK3Vuc2lnbmVkIGludAorZ2V0Yml0cyhQTVBTVFIgbXAsIGludCBudW1iZXJfb2ZfYml0cykKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJ2YWw7CisKKyAgICBpZiAobnVtYmVyX29mX2JpdHMgPD0gMCB8fCAhbXAtPndvcmRwb2ludGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHsKKyAgICAgICAgcnZhbCA9IG1wLT53b3JkcG9pbnRlclswXTsKKyAgICAgICAgcnZhbCA8PD0gODsKKyAgICAgICAgcnZhbCB8PSBtcC0+d29yZHBvaW50ZXJbMV07CisgICAgICAgIHJ2YWwgPDw9IDg7CisgICAgICAgIHJ2YWwgfD0gbXAtPndvcmRwb2ludGVyWzJdOworICAgICAgICBydmFsIDw8PSBtcC0+Yml0aW5kZXg7CisgICAgICAgIHJ2YWwgJj0gMHhmZmZmZmY7CisKKyAgICAgICAgbXAtPmJpdGluZGV4ICs9IG51bWJlcl9vZl9iaXRzOworCisgICAgICAgIHJ2YWwgPj49ICgyNCAtIG51bWJlcl9vZl9iaXRzKTsKKworICAgICAgICBtcC0+d29yZHBvaW50ZXIgKz0gKG1wLT5iaXRpbmRleCA+PiAzKTsKKyAgICAgICAgbXAtPmJpdGluZGV4ICY9IDc7CisgICAgfQorICAgIHJldHVybiBydmFsOworfQorCit1bnNpZ25lZCBpbnQKK2dldGJpdHNfZmFzdChQTVBTVFIgbXAsIGludCBudW1iZXJfb2ZfYml0cykKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJ2YWw7CisKKyAgICB7CisgICAgICAgIHJ2YWwgPSBtcC0+d29yZHBvaW50ZXJbMF07CisgICAgICAgIHJ2YWwgPDw9IDg7CisgICAgICAgIHJ2YWwgfD0gbXAtPndvcmRwb2ludGVyWzFdOworICAgICAgICBydmFsIDw8PSBtcC0+Yml0aW5kZXg7CisgICAgICAgIHJ2YWwgJj0gMHhmZmZmOworICAgICAgICBtcC0+Yml0aW5kZXggKz0gbnVtYmVyX29mX2JpdHM7CisKKyAgICAgICAgcnZhbCA+Pj0gKDE2IC0gbnVtYmVyX29mX2JpdHMpOworCisgICAgICAgIG1wLT53b3JkcG9pbnRlciArPSAobXAtPmJpdGluZGV4ID4+IDMpOworICAgICAgICBtcC0+Yml0aW5kZXggJj0gNzsKKyAgICB9CisgICAgcmV0dXJuIHJ2YWw7Cit9CisKKworaW50CitzZXRfcG9pbnRlcihQTVBTVFIgbXAsIGxvbmcgYmFja3N0ZXApCit7CisgICAgdW5zaWduZWQgY2hhciAqYnNidWZvbGQ7CisKKyAgICBpZiAobXAtPmZzaXplb2xkIDwgMCAmJiBiYWNrc3RlcCA+IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJoaXA6IENhbid0IHN0ZXAgYmFjayAlbGQgYnl0ZXMhXG4iLCBiYWNrc3RlcCk7CisgICAgICAgIHJldHVybiBNUDNfRVJSOworICAgIH0KKyAgICBic2J1Zm9sZCA9IG1wLT5ic3NwYWNlWzEgLSBtcC0+YnNudW1dICsgNTEyOworICAgIG1wLT53b3JkcG9pbnRlciAtPSBiYWNrc3RlcDsKKyAgICBpZiAoYmFja3N0ZXApCisgICAgICAgIG1lbWNweShtcC0+d29yZHBvaW50ZXIsIGJzYnVmb2xkICsgbXAtPmZzaXplb2xkIC0gYmFja3N0ZXAsIChzaXplX3QpIGJhY2tzdGVwKTsKKyAgICBtcC0+Yml0aW5kZXggPSAwOworICAgIHJldHVybiBNUDNfT0s7Cit9CmRpZmYgLS1naXQgYS9tcGdsaWIvY29tbW9uLmggYi9tcGdsaWIvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzZDc1ZQotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi9jb21tb24uaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAgVGhlIEwuQS5NLkUuIHByb2plY3QKKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEhpcHAsIHNlZSBhbHNvIEFVVEhPUlMgYW5kIFJFQURNRS4KKyAqICAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworCisjaWZuZGVmIENPTU1PTl9IX0lOQ0xVREVECisjZGVmaW5lIENPTU1PTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJtcGcxMjMuaCIKKyNpbmNsdWRlICJtcGdsaWIuaCIKKworZXh0ZXJuIGNvbnN0IGludCB0YWJzZWxfMTIzWzJdWzNdWzE2XTsKK2V4dGVybiBjb25zdCBsb25nIGZyZXFzWzldOworCitleHRlcm4gcmVhbCBtdWxzWzI3XVs2NF07CisKKworaW50ICAgICBoZWFkX2NoZWNrKHVuc2lnbmVkIGxvbmcgaGVhZCwgaW50IGNoZWNrX2xheWVyKTsKK2ludCAgICAgZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZnJhbWUgKmZyLCB1bnNpZ25lZCBsb25nIG5ld2hlYWQpOwordm9pZCAgICBwcmludF9oZWFkZXIoc3RydWN0IGZyYW1lICpmcik7Cit2b2lkICAgIHByaW50X2hlYWRlcl9jb21wYWN0KHN0cnVjdCBmcmFtZSAqZnIpOwordW5zaWduZWQgaW50IGdldGJpdHMoUE1QU1RSIG1wLCBpbnQgbnVtYmVyX29mX2JpdHMpOwordW5zaWduZWQgaW50IGdldGJpdHNfZmFzdChQTVBTVFIgbXAsIGludCBudW1iZXJfb2ZfYml0cyk7CitpbnQgICAgIHNldF9wb2ludGVyKFBNUFNUUiBtcCwgbG9uZyBiYWNrc3RlcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXBnbGliL2RjdDY0X2kzODYuYyBiL21wZ2xpYi9kY3Q2NF9pMzg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxMWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi9kY3Q2NF9pMzg2LmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBkY3Q2NF9pMzY4LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCBUaGUgTC5BLk0uRS4gcHJvamVjdAorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgSGlwcCwgc2VlIGFsc28gQVVUSE9SUyBhbmQgUkVBRE1FLgorICogIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKgorICogRGlzY3JldGUgQ29zaW5lIFRhbnNmb3JtIChEQ1QpIGZvciBzdWJiYW5kIHN5bnRoZXNpcworICogb3B0aW1pemVkIGZvciBtYWNoaW5lcyB3aXRoIG5vIGF1dG8taW5jcmVtZW50LiAKKyAqIFRoZSBwZXJmb3JtYW5jZSBpcyBoaWdobHkgY29tcGlsZXIgZGVwZW5kZW5kLiBNYXliZQorICogdGhlIGRjdDY0LmMgdmVyc2lvbiBmb3IgJ25vcm1hbCcgcHJvY2Vzc29yIG1heSBiZSBmYXN0ZXIKKyAqIGV2ZW4gZm9yIEludGVsIHByb2Nlc3NvcnMuCisgKi8KKworLyogJElkOiBkY3Q2NF9pMzg2LmMsdiAxLjEwLjEwLjIgMjAxMC8wMy8yMiAxNDoxNzoxNCByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZGN0NjRfaTM4Ni5oIgorI2luY2x1ZGUgInRhYmluaXQuaCIKKworI2lmZGVmIFdJVEhfRE1BTExPQworI2luY2x1ZGUgPGRtYWxsb2MuaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZGN0NjRfMShyZWFsICogb3V0MCwgcmVhbCAqIG91dDEsIHJlYWwgKiBiMSwgcmVhbCAqIGIyLCByZWFsICogc2FtcGxlcykKK3sKKworICAgIHsKKyAgICAgICAgcmVhbCAgICpjb3N0YWIgPSBwbnRzWzBdOworCisgICAgICAgIGIxWzB4MDBdID0gc2FtcGxlc1sweDAwXSArIHNhbXBsZXNbMHgxRl07CisgICAgICAgIGIxWzB4MUZdID0gKHNhbXBsZXNbMHgwMF0gLSBzYW1wbGVzWzB4MUZdKSAqIGNvc3RhYlsweDBdOworCisgICAgICAgIGIxWzB4MDFdID0gc2FtcGxlc1sweDAxXSArIHNhbXBsZXNbMHgxRV07CisgICAgICAgIGIxWzB4MUVdID0gKHNhbXBsZXNbMHgwMV0gLSBzYW1wbGVzWzB4MUVdKSAqIGNvc3RhYlsweDFdOworCisgICAgICAgIGIxWzB4MDJdID0gc2FtcGxlc1sweDAyXSArIHNhbXBsZXNbMHgxRF07CisgICAgICAgIGIxWzB4MURdID0gKHNhbXBsZXNbMHgwMl0gLSBzYW1wbGVzWzB4MURdKSAqIGNvc3RhYlsweDJdOworCisgICAgICAgIGIxWzB4MDNdID0gc2FtcGxlc1sweDAzXSArIHNhbXBsZXNbMHgxQ107CisgICAgICAgIGIxWzB4MUNdID0gKHNhbXBsZXNbMHgwM10gLSBzYW1wbGVzWzB4MUNdKSAqIGNvc3RhYlsweDNdOworCisgICAgICAgIGIxWzB4MDRdID0gc2FtcGxlc1sweDA0XSArIHNhbXBsZXNbMHgxQl07CisgICAgICAgIGIxWzB4MUJdID0gKHNhbXBsZXNbMHgwNF0gLSBzYW1wbGVzWzB4MUJdKSAqIGNvc3RhYlsweDRdOworCisgICAgICAgIGIxWzB4MDVdID0gc2FtcGxlc1sweDA1XSArIHNhbXBsZXNbMHgxQV07CisgICAgICAgIGIxWzB4MUFdID0gKHNhbXBsZXNbMHgwNV0gLSBzYW1wbGVzWzB4MUFdKSAqIGNvc3RhYlsweDVdOworCisgICAgICAgIGIxWzB4MDZdID0gc2FtcGxlc1sweDA2XSArIHNhbXBsZXNbMHgxOV07CisgICAgICAgIGIxWzB4MTldID0gKHNhbXBsZXNbMHgwNl0gLSBzYW1wbGVzWzB4MTldKSAqIGNvc3RhYlsweDZdOworCisgICAgICAgIGIxWzB4MDddID0gc2FtcGxlc1sweDA3XSArIHNhbXBsZXNbMHgxOF07CisgICAgICAgIGIxWzB4MThdID0gKHNhbXBsZXNbMHgwN10gLSBzYW1wbGVzWzB4MThdKSAqIGNvc3RhYlsweDddOworCisgICAgICAgIGIxWzB4MDhdID0gc2FtcGxlc1sweDA4XSArIHNhbXBsZXNbMHgxN107CisgICAgICAgIGIxWzB4MTddID0gKHNhbXBsZXNbMHgwOF0gLSBzYW1wbGVzWzB4MTddKSAqIGNvc3RhYlsweDhdOworCisgICAgICAgIGIxWzB4MDldID0gc2FtcGxlc1sweDA5XSArIHNhbXBsZXNbMHgxNl07CisgICAgICAgIGIxWzB4MTZdID0gKHNhbXBsZXNbMHgwOV0gLSBzYW1wbGVzWzB4MTZdKSAqIGNvc3RhYlsweDldOworCisgICAgICAgIGIxWzB4MEFdID0gc2FtcGxlc1sweDBBXSArIHNhbXBsZXNbMHgxNV07CisgICAgICAgIGIxWzB4MTVdID0gKHNhbXBsZXNbMHgwQV0gLSBzYW1wbGVzWzB4MTVdKSAqIGNvc3RhYlsweEFdOworCisgICAgICAgIGIxWzB4MEJdID0gc2FtcGxlc1sweDBCXSArIHNhbXBsZXNbMHgxNF07CisgICAgICAgIGIxWzB4MTRdID0gKHNhbXBsZXNbMHgwQl0gLSBzYW1wbGVzWzB4MTRdKSAqIGNvc3RhYlsweEJdOworCisgICAgICAgIGIxWzB4MENdID0gc2FtcGxlc1sweDBDXSArIHNhbXBsZXNbMHgxM107CisgICAgICAgIGIxWzB4MTNdID0gKHNhbXBsZXNbMHgwQ10gLSBzYW1wbGVzWzB4MTNdKSAqIGNvc3RhYlsweENdOworCisgICAgICAgIGIxWzB4MERdID0gc2FtcGxlc1sweDBEXSArIHNhbXBsZXNbMHgxMl07CisgICAgICAgIGIxWzB4MTJdID0gKHNhbXBsZXNbMHgwRF0gLSBzYW1wbGVzWzB4MTJdKSAqIGNvc3RhYlsweERdOworCisgICAgICAgIGIxWzB4MEVdID0gc2FtcGxlc1sweDBFXSArIHNhbXBsZXNbMHgxMV07CisgICAgICAgIGIxWzB4MTFdID0gKHNhbXBsZXNbMHgwRV0gLSBzYW1wbGVzWzB4MTFdKSAqIGNvc3RhYlsweEVdOworCisgICAgICAgIGIxWzB4MEZdID0gc2FtcGxlc1sweDBGXSArIHNhbXBsZXNbMHgxMF07CisgICAgICAgIGIxWzB4MTBdID0gKHNhbXBsZXNbMHgwRl0gLSBzYW1wbGVzWzB4MTBdKSAqIGNvc3RhYlsweEZdOworICAgIH0KKworCisgICAgeworICAgICAgICByZWFsICAgKmNvc3RhYiA9IHBudHNbMV07CisKKyAgICAgICAgYjJbMHgwMF0gPSBiMVsweDAwXSArIGIxWzB4MEZdOworICAgICAgICBiMlsweDBGXSA9IChiMVsweDAwXSAtIGIxWzB4MEZdKSAqIGNvc3RhYlswXTsKKyAgICAgICAgYjJbMHgwMV0gPSBiMVsweDAxXSArIGIxWzB4MEVdOworICAgICAgICBiMlsweDBFXSA9IChiMVsweDAxXSAtIGIxWzB4MEVdKSAqIGNvc3RhYlsxXTsKKyAgICAgICAgYjJbMHgwMl0gPSBiMVsweDAyXSArIGIxWzB4MERdOworICAgICAgICBiMlsweDBEXSA9IChiMVsweDAyXSAtIGIxWzB4MERdKSAqIGNvc3RhYlsyXTsKKyAgICAgICAgYjJbMHgwM10gPSBiMVsweDAzXSArIGIxWzB4MENdOworICAgICAgICBiMlsweDBDXSA9IChiMVsweDAzXSAtIGIxWzB4MENdKSAqIGNvc3RhYlszXTsKKyAgICAgICAgYjJbMHgwNF0gPSBiMVsweDA0XSArIGIxWzB4MEJdOworICAgICAgICBiMlsweDBCXSA9IChiMVsweDA0XSAtIGIxWzB4MEJdKSAqIGNvc3RhYls0XTsKKyAgICAgICAgYjJbMHgwNV0gPSBiMVsweDA1XSArIGIxWzB4MEFdOworICAgICAgICBiMlsweDBBXSA9IChiMVsweDA1XSAtIGIxWzB4MEFdKSAqIGNvc3RhYls1XTsKKyAgICAgICAgYjJbMHgwNl0gPSBiMVsweDA2XSArIGIxWzB4MDldOworICAgICAgICBiMlsweDA5XSA9IChiMVsweDA2XSAtIGIxWzB4MDldKSAqIGNvc3RhYls2XTsKKyAgICAgICAgYjJbMHgwN10gPSBiMVsweDA3XSArIGIxWzB4MDhdOworICAgICAgICBiMlsweDA4XSA9IChiMVsweDA3XSAtIGIxWzB4MDhdKSAqIGNvc3RhYls3XTsKKworICAgICAgICBiMlsweDEwXSA9IGIxWzB4MTBdICsgYjFbMHgxRl07CisgICAgICAgIGIyWzB4MUZdID0gKGIxWzB4MUZdIC0gYjFbMHgxMF0pICogY29zdGFiWzBdOworICAgICAgICBiMlsweDExXSA9IGIxWzB4MTFdICsgYjFbMHgxRV07CisgICAgICAgIGIyWzB4MUVdID0gKGIxWzB4MUVdIC0gYjFbMHgxMV0pICogY29zdGFiWzFdOworICAgICAgICBiMlsweDEyXSA9IGIxWzB4MTJdICsgYjFbMHgxRF07CisgICAgICAgIGIyWzB4MURdID0gKGIxWzB4MURdIC0gYjFbMHgxMl0pICogY29zdGFiWzJdOworICAgICAgICBiMlsweDEzXSA9IGIxWzB4MTNdICsgYjFbMHgxQ107CisgICAgICAgIGIyWzB4MUNdID0gKGIxWzB4MUNdIC0gYjFbMHgxM10pICogY29zdGFiWzNdOworICAgICAgICBiMlsweDE0XSA9IGIxWzB4MTRdICsgYjFbMHgxQl07CisgICAgICAgIGIyWzB4MUJdID0gKGIxWzB4MUJdIC0gYjFbMHgxNF0pICogY29zdGFiWzRdOworICAgICAgICBiMlsweDE1XSA9IGIxWzB4MTVdICsgYjFbMHgxQV07CisgICAgICAgIGIyWzB4MUFdID0gKGIxWzB4MUFdIC0gYjFbMHgxNV0pICogY29zdGFiWzVdOworICAgICAgICBiMlsweDE2XSA9IGIxWzB4MTZdICsgYjFbMHgxOV07CisgICAgICAgIGIyWzB4MTldID0gKGIxWzB4MTldIC0gYjFbMHgxNl0pICogY29zdGFiWzZdOworICAgICAgICBiMlsweDE3XSA9IGIxWzB4MTddICsgYjFbMHgxOF07CisgICAgICAgIGIyWzB4MThdID0gKGIxWzB4MThdIC0gYjFbMHgxN10pICogY29zdGFiWzddOworICAgIH0KKworICAgIHsKKyAgICAgICAgcmVhbCAgICpjb3N0YWIgPSBwbnRzWzJdOworCisgICAgICAgIGIxWzB4MDBdID0gYjJbMHgwMF0gKyBiMlsweDA3XTsKKyAgICAgICAgYjFbMHgwN10gPSAoYjJbMHgwMF0gLSBiMlsweDA3XSkgKiBjb3N0YWJbMF07CisgICAgICAgIGIxWzB4MDFdID0gYjJbMHgwMV0gKyBiMlsweDA2XTsKKyAgICAgICAgYjFbMHgwNl0gPSAoYjJbMHgwMV0gLSBiMlsweDA2XSkgKiBjb3N0YWJbMV07CisgICAgICAgIGIxWzB4MDJdID0gYjJbMHgwMl0gKyBiMlsweDA1XTsKKyAgICAgICAgYjFbMHgwNV0gPSAoYjJbMHgwMl0gLSBiMlsweDA1XSkgKiBjb3N0YWJbMl07CisgICAgICAgIGIxWzB4MDNdID0gYjJbMHgwM10gKyBiMlsweDA0XTsKKyAgICAgICAgYjFbMHgwNF0gPSAoYjJbMHgwM10gLSBiMlsweDA0XSkgKiBjb3N0YWJbM107CisKKyAgICAgICAgYjFbMHgwOF0gPSBiMlsweDA4XSArIGIyWzB4MEZdOworICAgICAgICBiMVsweDBGXSA9IChiMlsweDBGXSAtIGIyWzB4MDhdKSAqIGNvc3RhYlswXTsKKyAgICAgICAgYjFbMHgwOV0gPSBiMlsweDA5XSArIGIyWzB4MEVdOworICAgICAgICBiMVsweDBFXSA9IChiMlsweDBFXSAtIGIyWzB4MDldKSAqIGNvc3RhYlsxXTsKKyAgICAgICAgYjFbMHgwQV0gPSBiMlsweDBBXSArIGIyWzB4MERdOworICAgICAgICBiMVsweDBEXSA9IChiMlsweDBEXSAtIGIyWzB4MEFdKSAqIGNvc3RhYlsyXTsKKyAgICAgICAgYjFbMHgwQl0gPSBiMlsweDBCXSArIGIyWzB4MENdOworICAgICAgICBiMVsweDBDXSA9IChiMlsweDBDXSAtIGIyWzB4MEJdKSAqIGNvc3RhYlszXTsKKworICAgICAgICBiMVsweDEwXSA9IGIyWzB4MTBdICsgYjJbMHgxN107CisgICAgICAgIGIxWzB4MTddID0gKGIyWzB4MTBdIC0gYjJbMHgxN10pICogY29zdGFiWzBdOworICAgICAgICBiMVsweDExXSA9IGIyWzB4MTFdICsgYjJbMHgxNl07CisgICAgICAgIGIxWzB4MTZdID0gKGIyWzB4MTFdIC0gYjJbMHgxNl0pICogY29zdGFiWzFdOworICAgICAgICBiMVsweDEyXSA9IGIyWzB4MTJdICsgYjJbMHgxNV07CisgICAgICAgIGIxWzB4MTVdID0gKGIyWzB4MTJdIC0gYjJbMHgxNV0pICogY29zdGFiWzJdOworICAgICAgICBiMVsweDEzXSA9IGIyWzB4MTNdICsgYjJbMHgxNF07CisgICAgICAgIGIxWzB4MTRdID0gKGIyWzB4MTNdIC0gYjJbMHgxNF0pICogY29zdGFiWzNdOworCisgICAgICAgIGIxWzB4MThdID0gYjJbMHgxOF0gKyBiMlsweDFGXTsKKyAgICAgICAgYjFbMHgxRl0gPSAoYjJbMHgxRl0gLSBiMlsweDE4XSkgKiBjb3N0YWJbMF07CisgICAgICAgIGIxWzB4MTldID0gYjJbMHgxOV0gKyBiMlsweDFFXTsKKyAgICAgICAgYjFbMHgxRV0gPSAoYjJbMHgxRV0gLSBiMlsweDE5XSkgKiBjb3N0YWJbMV07CisgICAgICAgIGIxWzB4MUFdID0gYjJbMHgxQV0gKyBiMlsweDFEXTsKKyAgICAgICAgYjFbMHgxRF0gPSAoYjJbMHgxRF0gLSBiMlsweDFBXSkgKiBjb3N0YWJbMl07CisgICAgICAgIGIxWzB4MUJdID0gYjJbMHgxQl0gKyBiMlsweDFDXTsKKyAgICAgICAgYjFbMHgxQ10gPSAoYjJbMHgxQ10gLSBiMlsweDFCXSkgKiBjb3N0YWJbM107CisgICAgfQorCisgICAgeworICAgICAgICByZWFsIGNvbnN0IGNvczAgPSBwbnRzWzNdWzBdOworICAgICAgICByZWFsIGNvbnN0IGNvczEgPSBwbnRzWzNdWzFdOworCisgICAgICAgIGIyWzB4MDBdID0gYjFbMHgwMF0gKyBiMVsweDAzXTsKKyAgICAgICAgYjJbMHgwM10gPSAoYjFbMHgwMF0gLSBiMVsweDAzXSkgKiBjb3MwOworICAgICAgICBiMlsweDAxXSA9IGIxWzB4MDFdICsgYjFbMHgwMl07CisgICAgICAgIGIyWzB4MDJdID0gKGIxWzB4MDFdIC0gYjFbMHgwMl0pICogY29zMTsKKworICAgICAgICBiMlsweDA0XSA9IGIxWzB4MDRdICsgYjFbMHgwN107CisgICAgICAgIGIyWzB4MDddID0gKGIxWzB4MDddIC0gYjFbMHgwNF0pICogY29zMDsKKyAgICAgICAgYjJbMHgwNV0gPSBiMVsweDA1XSArIGIxWzB4MDZdOworICAgICAgICBiMlsweDA2XSA9IChiMVsweDA2XSAtIGIxWzB4MDVdKSAqIGNvczE7CisKKyAgICAgICAgYjJbMHgwOF0gPSBiMVsweDA4XSArIGIxWzB4MEJdOworICAgICAgICBiMlsweDBCXSA9IChiMVsweDA4XSAtIGIxWzB4MEJdKSAqIGNvczA7CisgICAgICAgIGIyWzB4MDldID0gYjFbMHgwOV0gKyBiMVsweDBBXTsKKyAgICAgICAgYjJbMHgwQV0gPSAoYjFbMHgwOV0gLSBiMVsweDBBXSkgKiBjb3MxOworCisgICAgICAgIGIyWzB4MENdID0gYjFbMHgwQ10gKyBiMVsweDBGXTsKKyAgICAgICAgYjJbMHgwRl0gPSAoYjFbMHgwRl0gLSBiMVsweDBDXSkgKiBjb3MwOworICAgICAgICBiMlsweDBEXSA9IGIxWzB4MERdICsgYjFbMHgwRV07CisgICAgICAgIGIyWzB4MEVdID0gKGIxWzB4MEVdIC0gYjFbMHgwRF0pICogY29zMTsKKworICAgICAgICBiMlsweDEwXSA9IGIxWzB4MTBdICsgYjFbMHgxM107CisgICAgICAgIGIyWzB4MTNdID0gKGIxWzB4MTBdIC0gYjFbMHgxM10pICogY29zMDsKKyAgICAgICAgYjJbMHgxMV0gPSBiMVsweDExXSArIGIxWzB4MTJdOworICAgICAgICBiMlsweDEyXSA9IChiMVsweDExXSAtIGIxWzB4MTJdKSAqIGNvczE7CisKKyAgICAgICAgYjJbMHgxNF0gPSBiMVsweDE0XSArIGIxWzB4MTddOworICAgICAgICBiMlsweDE3XSA9IChiMVsweDE3XSAtIGIxWzB4MTRdKSAqIGNvczA7CisgICAgICAgIGIyWzB4MTVdID0gYjFbMHgxNV0gKyBiMVsweDE2XTsKKyAgICAgICAgYjJbMHgxNl0gPSAoYjFbMHgxNl0gLSBiMVsweDE1XSkgKiBjb3MxOworCisgICAgICAgIGIyWzB4MThdID0gYjFbMHgxOF0gKyBiMVsweDFCXTsKKyAgICAgICAgYjJbMHgxQl0gPSAoYjFbMHgxOF0gLSBiMVsweDFCXSkgKiBjb3MwOworICAgICAgICBiMlsweDE5XSA9IGIxWzB4MTldICsgYjFbMHgxQV07CisgICAgICAgIGIyWzB4MUFdID0gKGIxWzB4MTldIC0gYjFbMHgxQV0pICogY29zMTsKKworICAgICAgICBiMlsweDFDXSA9IGIxWzB4MUNdICsgYjFbMHgxRl07CisgICAgICAgIGIyWzB4MUZdID0gKGIxWzB4MUZdIC0gYjFbMHgxQ10pICogY29zMDsKKyAgICAgICAgYjJbMHgxRF0gPSBiMVsweDFEXSArIGIxWzB4MUVdOworICAgICAgICBiMlsweDFFXSA9IChiMVsweDFFXSAtIGIxWzB4MURdKSAqIGNvczE7CisgICAgfQorCisgICAgeworICAgICAgICByZWFsIGNvbnN0IGNvczAgPSBwbnRzWzRdWzBdOworCisgICAgICAgIGIxWzB4MDBdID0gYjJbMHgwMF0gKyBiMlsweDAxXTsKKyAgICAgICAgYjFbMHgwMV0gPSAoYjJbMHgwMF0gLSBiMlsweDAxXSkgKiBjb3MwOworICAgICAgICBiMVsweDAyXSA9IGIyWzB4MDJdICsgYjJbMHgwM107CisgICAgICAgIGIxWzB4MDNdID0gKGIyWzB4MDNdIC0gYjJbMHgwMl0pICogY29zMDsKKyAgICAgICAgYjFbMHgwMl0gKz0gYjFbMHgwM107CisKKyAgICAgICAgYjFbMHgwNF0gPSBiMlsweDA0XSArIGIyWzB4MDVdOworICAgICAgICBiMVsweDA1XSA9IChiMlsweDA0XSAtIGIyWzB4MDVdKSAqIGNvczA7CisgICAgICAgIGIxWzB4MDZdID0gYjJbMHgwNl0gKyBiMlsweDA3XTsKKyAgICAgICAgYjFbMHgwN10gPSAoYjJbMHgwN10gLSBiMlsweDA2XSkgKiBjb3MwOworICAgICAgICBiMVsweDA2XSArPSBiMVsweDA3XTsKKyAgICAgICAgYjFbMHgwNF0gKz0gYjFbMHgwNl07CisgICAgICAgIGIxWzB4MDZdICs9IGIxWzB4MDVdOworICAgICAgICBiMVsweDA1XSArPSBiMVsweDA3XTsKKworICAgICAgICBiMVsweDA4XSA9IGIyWzB4MDhdICsgYjJbMHgwOV07CisgICAgICAgIGIxWzB4MDldID0gKGIyWzB4MDhdIC0gYjJbMHgwOV0pICogY29zMDsKKyAgICAgICAgYjFbMHgwQV0gPSBiMlsweDBBXSArIGIyWzB4MEJdOworICAgICAgICBiMVsweDBCXSA9IChiMlsweDBCXSAtIGIyWzB4MEFdKSAqIGNvczA7CisgICAgICAgIGIxWzB4MEFdICs9IGIxWzB4MEJdOworCisgICAgICAgIGIxWzB4MENdID0gYjJbMHgwQ10gKyBiMlsweDBEXTsKKyAgICAgICAgYjFbMHgwRF0gPSAoYjJbMHgwQ10gLSBiMlsweDBEXSkgKiBjb3MwOworICAgICAgICBiMVsweDBFXSA9IGIyWzB4MEVdICsgYjJbMHgwRl07CisgICAgICAgIGIxWzB4MEZdID0gKGIyWzB4MEZdIC0gYjJbMHgwRV0pICogY29zMDsKKyAgICAgICAgYjFbMHgwRV0gKz0gYjFbMHgwRl07CisgICAgICAgIGIxWzB4MENdICs9IGIxWzB4MEVdOworICAgICAgICBiMVsweDBFXSArPSBiMVsweDBEXTsKKyAgICAgICAgYjFbMHgwRF0gKz0gYjFbMHgwRl07CisKKyAgICAgICAgYjFbMHgxMF0gPSBiMlsweDEwXSArIGIyWzB4MTFdOworICAgICAgICBiMVsweDExXSA9IChiMlsweDEwXSAtIGIyWzB4MTFdKSAqIGNvczA7CisgICAgICAgIGIxWzB4MTJdID0gYjJbMHgxMl0gKyBiMlsweDEzXTsKKyAgICAgICAgYjFbMHgxM10gPSAoYjJbMHgxM10gLSBiMlsweDEyXSkgKiBjb3MwOworICAgICAgICBiMVsweDEyXSArPSBiMVsweDEzXTsKKworICAgICAgICBiMVsweDE0XSA9IGIyWzB4MTRdICsgYjJbMHgxNV07CisgICAgICAgIGIxWzB4MTVdID0gKGIyWzB4MTRdIC0gYjJbMHgxNV0pICogY29zMDsKKyAgICAgICAgYjFbMHgxNl0gPSBiMlsweDE2XSArIGIyWzB4MTddOworICAgICAgICBiMVsweDE3XSA9IChiMlsweDE3XSAtIGIyWzB4MTZdKSAqIGNvczA7CisgICAgICAgIGIxWzB4MTZdICs9IGIxWzB4MTddOworICAgICAgICBiMVsweDE0XSArPSBiMVsweDE2XTsKKyAgICAgICAgYjFbMHgxNl0gKz0gYjFbMHgxNV07CisgICAgICAgIGIxWzB4MTVdICs9IGIxWzB4MTddOworCisgICAgICAgIGIxWzB4MThdID0gYjJbMHgxOF0gKyBiMlsweDE5XTsKKyAgICAgICAgYjFbMHgxOV0gPSAoYjJbMHgxOF0gLSBiMlsweDE5XSkgKiBjb3MwOworICAgICAgICBiMVsweDFBXSA9IGIyWzB4MUFdICsgYjJbMHgxQl07CisgICAgICAgIGIxWzB4MUJdID0gKGIyWzB4MUJdIC0gYjJbMHgxQV0pICogY29zMDsKKyAgICAgICAgYjFbMHgxQV0gKz0gYjFbMHgxQl07CisKKyAgICAgICAgYjFbMHgxQ10gPSBiMlsweDFDXSArIGIyWzB4MURdOworICAgICAgICBiMVsweDFEXSA9IChiMlsweDFDXSAtIGIyWzB4MURdKSAqIGNvczA7CisgICAgICAgIGIxWzB4MUVdID0gYjJbMHgxRV0gKyBiMlsweDFGXTsKKyAgICAgICAgYjFbMHgxRl0gPSAoYjJbMHgxRl0gLSBiMlsweDFFXSkgKiBjb3MwOworICAgICAgICBiMVsweDFFXSArPSBiMVsweDFGXTsKKyAgICAgICAgYjFbMHgxQ10gKz0gYjFbMHgxRV07CisgICAgICAgIGIxWzB4MUVdICs9IGIxWzB4MURdOworICAgICAgICBiMVsweDFEXSArPSBiMVsweDFGXTsKKyAgICB9CisKKyAgICBvdXQwWzB4MTAgKiAxNl0gPSBiMVsweDAwXTsKKyAgICBvdXQwWzB4MTAgKiAxMl0gPSBiMVsweDA0XTsKKyAgICBvdXQwWzB4MTAgKiA4XSA9IGIxWzB4MDJdOworICAgIG91dDBbMHgxMCAqIDRdID0gYjFbMHgwNl07CisgICAgb3V0MFsweDEwICogMF0gPSBiMVsweDAxXTsKKyAgICBvdXQxWzB4MTAgKiAwXSA9IGIxWzB4MDFdOworICAgIG91dDFbMHgxMCAqIDRdID0gYjFbMHgwNV07CisgICAgb3V0MVsweDEwICogOF0gPSBiMVsweDAzXTsKKyAgICBvdXQxWzB4MTAgKiAxMl0gPSBiMVsweDA3XTsKKworICAgIGIxWzB4MDhdICs9IGIxWzB4MENdOworICAgIG91dDBbMHgxMCAqIDE0XSA9IGIxWzB4MDhdOworICAgIGIxWzB4MENdICs9IGIxWzB4MGFdOworICAgIG91dDBbMHgxMCAqIDEwXSA9IGIxWzB4MENdOworICAgIGIxWzB4MEFdICs9IGIxWzB4MEVdOworICAgIG91dDBbMHgxMCAqIDZdID0gYjFbMHgwQV07CisgICAgYjFbMHgwRV0gKz0gYjFbMHgwOV07CisgICAgb3V0MFsweDEwICogMl0gPSBiMVsweDBFXTsKKyAgICBiMVsweDA5XSArPSBiMVsweDBEXTsKKyAgICBvdXQxWzB4MTAgKiAyXSA9IGIxWzB4MDldOworICAgIGIxWzB4MERdICs9IGIxWzB4MEJdOworICAgIG91dDFbMHgxMCAqIDZdID0gYjFbMHgwRF07CisgICAgYjFbMHgwQl0gKz0gYjFbMHgwRl07CisgICAgb3V0MVsweDEwICogMTBdID0gYjFbMHgwQl07CisgICAgb3V0MVsweDEwICogMTRdID0gYjFbMHgwRl07CisKKyAgICBiMVsweDE4XSArPSBiMVsweDFDXTsKKyAgICBvdXQwWzB4MTAgKiAxNV0gPSBiMVsweDEwXSArIGIxWzB4MThdOworICAgIG91dDBbMHgxMCAqIDEzXSA9IGIxWzB4MThdICsgYjFbMHgxNF07CisgICAgYjFbMHgxQ10gKz0gYjFbMHgxYV07CisgICAgb3V0MFsweDEwICogMTFdID0gYjFbMHgxNF0gKyBiMVsweDFDXTsKKyAgICBvdXQwWzB4MTAgKiA5XSA9IGIxWzB4MUNdICsgYjFbMHgxMl07CisgICAgYjFbMHgxQV0gKz0gYjFbMHgxRV07CisgICAgb3V0MFsweDEwICogN10gPSBiMVsweDEyXSArIGIxWzB4MUFdOworICAgIG91dDBbMHgxMCAqIDVdID0gYjFbMHgxQV0gKyBiMVsweDE2XTsKKyAgICBiMVsweDFFXSArPSBiMVsweDE5XTsKKyAgICBvdXQwWzB4MTAgKiAzXSA9IGIxWzB4MTZdICsgYjFbMHgxRV07CisgICAgb3V0MFsweDEwICogMV0gPSBiMVsweDFFXSArIGIxWzB4MTFdOworICAgIGIxWzB4MTldICs9IGIxWzB4MURdOworICAgIG91dDFbMHgxMCAqIDFdID0gYjFbMHgxMV0gKyBiMVsweDE5XTsKKyAgICBvdXQxWzB4MTAgKiAzXSA9IGIxWzB4MTldICsgYjFbMHgxNV07CisgICAgYjFbMHgxRF0gKz0gYjFbMHgxQl07CisgICAgb3V0MVsweDEwICogNV0gPSBiMVsweDE1XSArIGIxWzB4MURdOworICAgIG91dDFbMHgxMCAqIDddID0gYjFbMHgxRF0gKyBiMVsweDEzXTsKKyAgICBiMVsweDFCXSArPSBiMVsweDFGXTsKKyAgICBvdXQxWzB4MTAgKiA5XSA9IGIxWzB4MTNdICsgYjFbMHgxQl07CisgICAgb3V0MVsweDEwICogMTFdID0gYjFbMHgxQl0gKyBiMVsweDE3XTsKKyAgICBvdXQxWzB4MTAgKiAxM10gPSBiMVsweDE3XSArIGIxWzB4MUZdOworICAgIG91dDFbMHgxMCAqIDE1XSA9IGIxWzB4MUZdOworfQorCisvKgorICogdGhlIGNhbGwgdmlhIGRjdDY0IGlzIGEgdHJpY2sgdG8gZm9yY2UgR0NDIHRvIHVzZQorICogKG5ldykgcmVnaXN0ZXJzIGZvciB0aGUgYjEsYjIgcG9pbnRlciB0byB0aGUgYnVmc1t4eF0gZmllbGQKKyAqLwordm9pZAorZGN0NjQocmVhbCAqIGEsIHJlYWwgKiBiLCByZWFsICogYykKK3sKKyAgICByZWFsICAgIGJ1ZnNbMHg0MF07CisgICAgZGN0NjRfMShhLCBiLCBidWZzLCBidWZzICsgMHgyMCwgYyk7Cit9CmRpZmYgLS1naXQgYS9tcGdsaWIvZGN0NjRfaTM4Ni5oIGIvbXBnbGliL2RjdDY0X2kzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQwZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2RjdDY0X2kzODYuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAgVGhlIEwuQS5NLkUuIHByb2plY3QKKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEhpcHAsIHNlZSBhbHNvIEFVVEhPUlMgYW5kIFJFQURNRS4KKyAqICAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBNUEdMSUJfRENUNjRfSTM4Nl9IX0lOQ0xVREVECisjZGVmaW5lIE1QR0xJQl9EQ1Q2NF9JMzg2X0hfSU5DTFVERUQKKworI2luY2x1ZGUgImNvbW1vbi5oIgorCit2b2lkICAgIGRjdDY0KHJlYWwgKiBhLCByZWFsICogYiwgcmVhbCAqIGMpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXBnbGliL2RlY29kZV9pMzg2LmMgYi9tcGdsaWIvZGVjb2RlX2kzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJhMzIyCi0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2RlY29kZV9pMzg2LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBkZWNvZGVfaTM5Ni5jOiBNcGVnIExheWVyLTEsMiwzIGF1ZGlvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCBUaGUgTC5BLk0uRS4gcHJvamVjdAorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgSGlwcCwgc2VlIGFsc28gQVVUSE9SUyBhbmQgUkVBRE1FLgorICogIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKgorICogU2xpZ2hsdHkgb3B0aW1pemVkIGZvciBtYWNoaW5lcyB3aXRob3V0IGF1dG9pbmNyZW1lbnQvZGVjcmVtZW50LgorICogVGhlIHBlcmZvcm1hbmNlIGlzIGhpZ2hseSBjb21waWxlciBkZXBlbmRlbmQuIE1heWJlCisgKiB0aGUgZGVjb2RlLmMgdmVyc2lvbiBmb3IgJ25vcm1hbCcgcHJvY2Vzc29yIG1heSBiZSBmYXN0ZXIKKyAqIGV2ZW4gZm9yIEludGVsIHByb2Nlc3NvcnMuCisgKi8KKworLyogJElkOiBkZWNvZGVfaTM4Ni5jLHYgMS4xOC4yLjIgMjAxMC8wMy8yMiAxNDoxNzoxNCByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGlmbmRlZiBIQVZFX1NUUkNIUgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyAgZGVmaW5lIHN0cnJjaHIgcmluZGV4CisjIGVuZGlmCitjaGFyICAgKnN0cmNocigpLCAqc3RycmNocigpOworIyBpZm5kZWYgSEFWRV9NRU1DUFkKKyMgIGRlZmluZSBtZW1jcHkoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCisjICBkZWZpbmUgbWVtbW92ZShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3Jpc2Nvc19fKSAmJiBkZWZpbmVkKEZQQTEwKQorI2luY2x1ZGUgInltYXRoLmgiCisjZWxzZQorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZGVjb2RlX2kzODYuaCIKKyNpbmNsdWRlICJkY3Q2NF9pMzg2LmgiCisjaW5jbHVkZSAidGFiaW5pdC5oIgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKKworIC8qIG9sZCBXUklURV9TQU1QTEVfQ0xJUFBFRCAqLworI2RlZmluZSBXUklURV9TQU1QTEVfQ0xJUFBFRChUWVBFLHNhbXBsZXMsc3VtLGNsaXApIFwKKyAgaWYoIChzdW0pID4gMzI3NjcuMCkgeyAqKHNhbXBsZXMpID0gMHg3ZmZmOyAoY2xpcCkrKzsgfSBcCisgIGVsc2UgaWYoIChzdW0pIDwgLTMyNzY4LjApIHsgKihzYW1wbGVzKSA9IC0weDgwMDA7IChjbGlwKSsrOyB9IFwKKyAgZWxzZSB7ICooc2FtcGxlcykgPSAoVFlQRSkoKHN1bSk+MCA/IChzdW0pKzAuNSA6IChzdW0pLTAuNSkgOyB9CisKKyNkZWZpbmUgV1JJVEVfU0FNUExFX1VOQ0xJUFBFRChUWVBFLHNhbXBsZXMsc3VtLGNsaXApIFwKKyAgKnNhbXBsZXMgPSAoVFlQRSlzdW07CisKKyAgLyogKklOREVOVC1PRkYqICovCisKKyAvKiB2ZXJzaW9uczogY2xpcHBlZCAod2hlbiBUWVBFID09IHNob3J0KSBhbmQgdW5jbGlwcGVkICh3aGVuIFRZUEUgPT0gcmVhbCkgb2Ygc3ludGhfMXRvMV9tb25vKiBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgU1lOVEhfMVRPMV9NT05PX0NMSVBDSE9JQ0UoVFlQRSxTWU5USF8xVE8xKSAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIHNhbXBsZXNfdG1wWzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgKnRtcDEgPSBzYW1wbGVzX3RtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGkscmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgcG50MSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0ID0gU1lOVEhfMVRPMSAobXAsYmFuZFB0ciwwLCh1bnNpZ25lZCBjaGFyICopIHNhbXBsZXNfdG1wLCZwbnQxKTsgXAorICBvdXQgKz0gKnBudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yKGk9MDtpPDMyO2krKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICooIChUWVBFICopIG91dCkgPSAqdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0ICs9IHNpemVvZihUWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAxICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpwbnQgKz0gMzIqc2l6ZW9mKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gcmV0OyAKKworICAvKiAqSU5ERU5ULU9OKiAqLworCisKK2ludAorc3ludGhfMXRvMV9tb25vKFBNUFNUUiBtcCwgcmVhbCAqIGJhbmRQdHIsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpwbnQpCit7CisgICAgU1lOVEhfMVRPMV9NT05PX0NMSVBDSE9JQ0Uoc2hvcnQsIHN5bnRoXzF0bzEpCit9IGludAorc3ludGhfMXRvMV9tb25vX3VuY2xpcHBlZChQTVBTVFIgbXAsIHJlYWwgKiBiYW5kUHRyLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqcG50KQoreworICAgIFNZTlRIXzFUTzFfTU9OT19DTElQQ0hPSUNFKHJlYWwsIHN5bnRoXzF0bzFfdW5jbGlwcGVkKQorfQorCisgICAgLyogKklOREVOVC1PRkYqICovCisvKiB2ZXJzaW9uczogY2xpcHBlZCAod2hlbiBUWVBFID09IHNob3J0KSBhbmQgdW5jbGlwcGVkICh3aGVuIFRZUEUgPT0gcmVhbCkgb2Ygc3ludGhfMXRvMSogZnVuY3Rpb25zICovCisjZGVmaW5lIFNZTlRIXzFUTzFfQ0xJUENIT0lDRShUWVBFLFdSSVRFX1NBTVBMRSkgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBpbnQgc3RlcCA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBibzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgKnNhbXBsZXMgPSAoVFlQRSAqKSAob3V0ICsgKnBudCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlYWwgKmIwLCgqYnVmKVsweDExMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBjbGlwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBibzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvID0gbXAtPnN5bnRoX2JvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmKCFjaGFubmVsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm8tLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm8gJj0gMHhmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnVmID0gbXAtPnN5bnRoX2J1ZmZzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2FtcGxlcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnVmID0gbXAtPnN5bnRoX2J1ZmZzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmKGJvICYgMHgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjAgPSBidWZbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm8xID0gYm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGN0NjQoYnVmWzFdKygoYm8rMSkmMHhmKSxidWZbMF0rYm8sYmFuZFB0cik7ICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYjAgPSBidWZbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm8xID0gYm8rMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGN0NjQoYnVmWzBdK2JvLGJ1ZlsxXStibysxLGJhbmRQdHIpOyAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1wLT5zeW50aF9ibyA9IGJvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVhbCAqd2luZG93ID0gZGVjd2luICsgMTYgLSBibzE7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChqPTE2O2o7ai0tLGIwKz0weDEwLHdpbmRvdys9MHgyMCxzYW1wbGVzKz1zdGVwKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZWFsIHN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gID0gd2luZG93WzB4MF0gKiBiMFsweDBdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4MV0gKiBiMFsweDFdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4Ml0gKiBiMFsweDJdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4M10gKiBiMFsweDNdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4NF0gKiBiMFsweDRdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4NV0gKiBiMFsweDVdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4Nl0gKiBiMFsweDZdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4N10gKiBiMFsweDddOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4OF0gKiBiMFsweDhdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4OV0gKiBiMFsweDldOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4QV0gKiBiMFsweEFdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4Ql0gKiBiMFsweEJdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4Q10gKiBiMFsweENdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4RF0gKiBiMFsweERdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4RV0gKiBiMFsweEVdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93WzB4Rl0gKiBiMFsweEZdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBXUklURV9TQU1QTEUgKFRZUEUsc2FtcGxlcyxzdW0sY2xpcCk7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZWFsIHN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gID0gd2luZG93WzB4MF0gKiBiMFsweDBdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4Ml0gKiBiMFsweDJdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4NF0gKiBiMFsweDRdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4Nl0gKiBiMFsweDZdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4OF0gKiBiMFsweDhdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4QV0gKiBiMFsweEFdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4Q10gKiBiMFsweENdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gKz0gd2luZG93WzB4RV0gKiBiMFsweEVdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBXUklURV9TQU1QTEUgKFRZUEUsc2FtcGxlcyxzdW0sY2xpcCk7ICAgICAgICAgICAgICBcCisgICAgICBiMC09MHgxMCx3aW5kb3ctPTB4MjAsc2FtcGxlcys9c3RlcDsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2luZG93ICs9IGJvMTw8MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChqPTE1O2o7ai0tLGIwLT0weDEwLHdpbmRvdy09MHgyMCxzYW1wbGVzKz1zdGVwKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZWFsIHN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gPSAtd2luZG93Wy0weDFdICogYjBbMHgwXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDJdICogYjBbMHgxXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDNdICogYjBbMHgyXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDRdICogYjBbMHgzXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDVdICogYjBbMHg0XTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDZdICogYjBbMHg1XTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDddICogYjBbMHg2XTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDhdICogYjBbMHg3XTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDldICogYjBbMHg4XTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weEFdICogYjBbMHg5XTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weEJdICogYjBbMHhBXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weENdICogYjBbMHhCXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weERdICogYjBbMHhDXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weEVdICogYjBbMHhEXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weEZdICogYjBbMHhFXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdW0gLT0gd2luZG93Wy0weDBdICogYjBbMHhGXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBXUklURV9TQU1QTEUgKFRZUEUsc2FtcGxlcyxzdW0sY2xpcCk7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpwbnQgKz0gNjQqc2l6ZW9mKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBjbGlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvKiAqSU5ERU5ULU9OKiAqLworCisKK2ludAorc3ludGhfMXRvMShQTVBTVFIgbXAsIHJlYWwgKiBiYW5kUHRyLCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKnBudCkKK3sKKyAgICBTWU5USF8xVE8xX0NMSVBDSE9JQ0Uoc2hvcnQsIFdSSVRFX1NBTVBMRV9DTElQUEVEKQorfSBpbnQKK3N5bnRoXzF0bzFfdW5jbGlwcGVkKFBNUFNUUiBtcCwgcmVhbCAqIGJhbmRQdHIsIGludCBjaGFubmVsLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqcG50KQoreworICAgIFNZTlRIXzFUTzFfQ0xJUENIT0lDRShyZWFsLCBXUklURV9TQU1QTEVfVU5DTElQUEVEKQorfQpkaWZmIC0tZ2l0IGEvbXBnbGliL2RlY29kZV9pMzg2LmggYi9tcGdsaWIvZGVjb2RlX2kzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM5ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2RlY29kZV9pMzg2LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBwcm9qZWN0CisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBIaXBwLCBzZWUgYWxzbyBBVVRIT1JTIGFuZCBSRUFETUUuCisgKiAgCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgREVDT0RFX0kzODZfSF9JTkNMVURFRAorI2RlZmluZSBERUNPREVfSTM4Nl9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJjb21tb24uaCIKKworaW50ICAgICBzeW50aF8xdG8xX21vbm8oUE1QU1RSIG1wLCByZWFsICogYmFuZFB0ciwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKnBudCk7CitpbnQgICAgIHN5bnRoXzF0bzEoUE1QU1RSIG1wLCByZWFsICogYmFuZFB0ciwgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpwbnQpOworCitpbnQgICAgIHN5bnRoXzF0bzFfbW9ub191bmNsaXBwZWQoUE1QU1RSIG1wLCByZWFsICogYmFuZFB0ciwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKnBudCk7CitpbnQgICAgIHN5bnRoXzF0bzFfdW5jbGlwcGVkKFBNUFNUUiBtcCwgcmVhbCAqIGJhbmRQdHIsIGludCBjaGFubmVsLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqcG50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tcGdsaWIvZGVwY29tcCBiL21wZ2xpYi9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0NzAxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tcGdsaWIvZGVwY29tcApAQCAtMCwwICsxLDUzMCBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAwNS0wNy0wOS4xMQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPi4KKworY2FzZSAkMSBpbgorICAnJykKKyAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICBleGl0IDE7CisgICAgIDs7CisgIC1oIHwgLS1oKikKKyAgICBjYXQgPDxcRU9GCitVc2FnZTogZGVwY29tcCBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQorCitSdW4gUFJPR1JBTVMgQVJHUyB0byBjb21waWxlIGEgZmlsZSwgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMKK2FzIHNpZGUtZWZmZWN0cy4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBkZXBtb2RlICAgICBEZXBlbmRlbmN5IHRyYWNraW5nIG1vZGUuCisgIHNvdXJjZSAgICAgIFNvdXJjZSBmaWxlIHJlYWQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBvYmplY3QgICAgICBPYmplY3QgZmlsZSBvdXRwdXQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBERVBESVIgICAgICBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgZGVwZW5kZW5jaWVzLgorICBkZXBmaWxlICAgICBEZXBlbmRlbmN5IGZpbGUgdG8gb3V0cHV0LgorICB0bXBkZXBmaWxlICBUZW1wb3JhcnkgZmlsZSB0byB1c2Ugd2hlbiBvdXRwdXRpbmcgZGVwZW5kZW5jaWVzLgorICBsaWJ0b29sICAgICBXaGV0aGVyIGxpYnRvb2wgaXMgdXNlZCAoeWVzL25vKS4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgIGV4aXQgJD8KKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRlcG1vZGUiIHx8IHRlc3QgLXogIiRzb3VyY2UiIHx8IHRlc3QgLXogIiRvYmplY3QiOyB0aGVuCisgIGVjaG8gImRlcGNvbXA6IFZhcmlhYmxlcyBzb3VyY2UsIG9iamVjdCBhbmQgZGVwbW9kZSBtdXN0IGJlIHNldCIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgRGVwZW5kZW5jaWVzIGZvciBzdWIvYmFyLm8gb3Igc3ViL2Jhci5vYmogZ28gaW50byBzdWIvLmRlcHMvYmFyLlBvLgorZGVwZmlsZT0ke2RlcGZpbGUtYGVjaG8gIiRvYmplY3QiIHwKKyAgc2VkICdzfFteXFwvXSokfCcke0RFUERJUi0uZGVwc30nLyZ8O3N8XC5cKFteLl0qXCkkfC5QXDF8O3N8UG9iaiR8UG98J2B9Cit0bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQorCitybSAtZiAiJHRtcGRlcGZpbGUiCisKKyMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQorIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKKyMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKKyMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgorICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KKyAgZ2NjZmxhZz0tTQorICBkZXBtb2RlPWdjYworZmkKKworaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCisgICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCisgICBkYXNobWZsYWc9LXhNCisgICBkZXBtb2RlPWRhc2htc3Rkb3V0CitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyAgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIG12ICIkdG1wZGVwZmlsZSIgIiRkZXBmaWxlIgorICA7OworCitnY2MpCisjIyBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGdldCBkZXBlbmRlbmN5IG91dHB1dCBmcm9tIGdjYy4gIEhlcmUncworIyMgd2h5IHdlIHBpY2sgdGhpcyByYXRoZXIgb2JzY3VyZSBtZXRob2Q6CisjIyAtIERvbid0IHdhbnQgdG8gdXNlIC1NRCBiZWNhdXNlIHdlJ2QgbGlrZSB0aGUgZGVwZW5kZW5jaWVzIHRvIGVuZAorIyMgICB1cCBpbiBhIHN1YmRpci4gIEhhdmluZyB0byByZW5hbWUgYnkgaGFuZCBpcyB1Z2x5LgorIyMgICAoV2UgbWlnaHQgZW5kIHVwIGRvaW5nIHRoaXMgYW55d2F5IHRvIHN1cHBvcnQgb3RoZXIgY29tcGlsZXJzLikKKyMjIC0gVGhlIERFUEVOREVOQ0lFU19PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFrZXMgZ2NjIGFjdCBsaWtlCisjIyAgIC1NTSwgbm90IC1NIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4KKyMjIC0gVXNpbmcgLU0gZGlyZWN0bHkgbWVhbnMgcnVubmluZyB0aGUgY29tcGlsZXIgdHdpY2UgKGV2ZW4gd29yc2UKKyMjICAgdGhhbiByZW5hbWluZykuCisgIGlmIHRlc3QgLXogIiRnY2NmbGFnIjsgdGhlbgorICAgIGdjY2ZsYWc9LU1ELAorICBmaQorICAiJEAiIC1XcCwiJGdjY2ZsYWckdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgYWxwaGE9QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorIyMgVGhlIHNlY29uZCAtZSBleHByZXNzaW9uIGhhbmRsZXMgRE9TLXN0eWxlIGZpbGUgbmFtZXMgd2l0aCBkcml2ZSBsZXR0ZXJzLgorICBzZWQgLWUgJ3MvXlteOl0qOiAvIC8nIFwKKyAgICAgIC1lICdzL15bJyRhbHBoYSddOlwvW146XSo6IC8gLycgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyMjIFRoaXMgbmV4dCBwaWVjZSBvZiBtYWdpYyBhdm9pZHMgdGhlIGBkZWxldGVkIGhlYWRlciBmaWxlJyBwcm9ibGVtLgorIyMgVGhlIHByb2JsZW0gaXMgdGhhdCB3aGVuIGEgaGVhZGVyIGZpbGUgd2hpY2ggYXBwZWFycyBpbiBhIC5QIGZpbGUKKyMjIGlzIGRlbGV0ZWQsIHRoZSBkZXBlbmRlbmN5IGNhdXNlcyBtYWtlIHRvIGRpZSAoYmVjYXVzZSB0aGVyZSBpcworIyMgdHlwaWNhbGx5IG5vIHdheSB0byByZWJ1aWxkIHRoZSBoZWFkZXIpLiAgV2UgYXZvaWQgdGhpcyBieSBhZGRpbmcKKyMjIGR1bW15IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBoZWFkZXIgZmlsZS4gIFRvbyBiYWQgZ2NjIGRvZXNuJ3QgZG8KKyMjIHRoaXMgZm9yIHVzIGRpcmVjdGx5LgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfAorIyMgU29tZSB2ZXJzaW9ucyBvZiBnY2MgcHV0IGEgc3BhY2UgYmVmb3JlIHRoZSBgOicuICBPbiB0aGUgdGhlb3J5CisjIyB0aGF0IHRoZSBzcGFjZSBtZWFucyBzb21ldGhpbmcsIHdlIGFkZCBhIHNwYWNlIHRvIHRoZSBvdXRwdXQgYXMKKyMjIHdlbGwuCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitocCkKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK3NnaSkKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIiRAIiAiLVdwLC1NRHVwZGF0ZSwkdG1wZGVwZmlsZSIKKyAgZWxzZQorICAgICIkQCIgLU1EdXBkYXRlICIkdG1wZGVwZmlsZSIKKyAgZmkKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gICMgeWVzLCB0aGUgc291cmNlZmlsZSBkZXBlbmQgb24gb3RoZXIgZmlsZXMKKyAgICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorCisgICAgIyBDbGlwIG9mZiB0aGUgaW5pdGlhbCBlbGVtZW50ICh0aGUgZGVwZW5kZW50KS4gIERvbid0IHRyeSB0byBiZQorICAgICMgY2xldmVyIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBzZWQgY29kZSwgYXMgSVJJWCBzZWQgd29uJ3QgaGFuZGxlCisgICAgIyBsaW5lcyB3aXRoIG1vcmUgdGhhbiBhIGZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzICg0MDk2IGluCisgICAgIyBJUklYIDYuMiBzZWQsIDgxOTIgaW4gSVJJWCA2LjUpLiAgV2UgYWxzbyByZW1vdmUgY29tbWVudCBsaW5lczsKKyAgICAjIHRoZSBJUklYIGNjIGFkZHMgY29tbWVudHMgbGlrZSBgIzpmZWMnIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgIyBkZXBlbmRlbmN5IGxpbmUuCisgICAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCisgICAgdHIgJworJyAnICcgPj4gJGRlcGZpbGUKKyAgICBlY2hvID4+ICRkZXBmaWxlCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICRkZXBmaWxlCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCithaXgpCisgICMgVGhlIEMgZm9yIEFJWCBDb21waWxlciB1c2VzIC1NIGFuZCBvdXRwdXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgIyBpbiBhIC51IGZpbGUuICBJbiBvbGRlciB2ZXJzaW9ucywgdGhpcyBmaWxlIGFsd2F5cyBsaXZlcyBpbiB0aGUKKyAgIyBjdXJyZW50IGRpcmVjdG9yeS4gIEFsc28sIHRoZSBBSVggY29tcGlsZXIgcHV0cyBgJG9iamVjdDonIGF0IHRoZQorICAjIHN0YXJ0IG9mIGVhY2ggbGluZTsgJG9iamVjdCBkb2Vzbid0IGhhdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgorICAjIFZlcnNpb24gNiB1c2VzIHRoZSBkaXJlY3RvcnkgaW4gYm90aCBjYXNlcy4KKyAgc3RyaXBwZWQ9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL1woLipcKVwuLiokL1wxLydgCisgIHRtcGRlcGZpbGU9IiRzdHJpcHBlZC51IgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiIC1XYywtTQorICBlbHNlCisgICAgIiRAIiAtTQorICBmaQorICBzdGF0PSQ/CisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuIDoKKyAgZWxzZQorICAgIHN0cmlwcGVkPWBlY2hvICIkc3RyaXBwZWQiIHwgc2VkICdzLF4uKi8sLCdgCisgICAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIGZpCisKKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgIG91dG5hbWU9IiRzdHJpcHBlZC5vIgorICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLgorICAgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiBcKC4qXCkkLFwxOiwiIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitpY2MpCisgICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgorICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKKyAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCisgICMgICAgZm9vLm86IHN1Yi9mb28uYworICAjICAgIGZvby5vOiBzdWIvZm9vLmgKKyAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6CisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAorICAjICAgIHN1Yi9mb28uYzoKKyAgIyAgICBzdWIvZm9vLmg6CisgICMgSUNDIDcuMSB3aWxsIG91dHB1dAorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCisgICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKKyAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCisgICMgICAgIC4uLgorCisgICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAorICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgorICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAorICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK3RydTY0KQorICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQorICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgorICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisKKyAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQorICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjYW5pc20gaXMgdXNlZCBpbiBsaWJ0b29sIDEuNCBzZXJpZXMgdG8KKyAgICAgICMgaGFuZGxlIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uLgorICAgICAgIyBXaXRoIGxpYnRvb2wgMS40LCBkZXBlbmRlbmNpZXMgd2VyZSBvdXRwdXQgaW4gJGRpci5saWJzLyRiYXNlLmxvLmQuCisgICAgICAjCisgICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhpcyBleGNlcHRpb24gd2FzIHJlbW92ZWQsIGFuZCBsaWJ0b29sIG5vdworICAgICAgIyBnZW5lcmF0ZXMgMiBzZXBhcmF0ZSBvYmplY3RzIGZvciB0aGUgMiBsaWJyYXJpZXMuICBUaGVzZSB0d28KKyAgICAgICMgY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKKyAgICAgICMgaW4gJGRpciRiYXNlLm8uZC4gIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGJvdGggZmlsZXMsIGJlY2F1c2UKKyAgICAgICMgb25lIG9mIHRoZSB0d28gY29tcGlsYXRpb25zIGNhbiBiZSBkaXNhYmxlZC4gIFdlIHNob3VsZCBwcmVmZXIKKyAgICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCisgICAgICAjIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB3aGVuIC5saWJzLyBpcyBkZWxldGVkLCB3aGlsZSBpZ25vcmluZworICAgICAgIyB0aGUgZm9ybWVyIHdvdWxkIGNhdXNlIGEgZGlzdGNsZWFuY2hlY2sgcGFuaWMuCisgICAgICB0bXBkZXBmaWxlMT0kZGlyLmxpYnMvJGJhc2UubG8uZCAgICMgbGlidG9vbCAxLjQKKyAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5vLmQgICAgICAgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLm8uZCAgICAjIGxpYnRvb2wgMS41CisgICAgICB0bXBkZXBmaWxlND0kZGlyLmxpYnMvJGJhc2UuZCAgICAgICMgQ29tcGFxIENDQyBWNi4yLTUwNAorICAgICAgIiRAIiAtV2MsLU1ECisgICBlbHNlCisgICAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kCisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGU0PSRkaXIkYmFzZS5kCisgICAgICAiJEAiIC1NRAorICAgZmkKKworICAgc3RhdD0kPworICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgICBlbHNlCisgICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgorICAgICAgZXhpdCAkc3RhdAorICAgZmkKKworICAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgIGRvCisgICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhaworICAgZG9uZQorICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgorICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICBlbHNlCisgICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICAgZmkKKyAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgIDs7CisKKyNub3NpZGVlZmZlY3QpCisgICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAorICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgorCitkYXNobXN0ZG91dCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKKyAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgorICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgorICAiJEAiICRkYXNobWZsYWcgfAorICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2Rhc2hYbXN0ZG91dCkKKyAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQorICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KKyAgZXhpdCAxCisgIDs7CisKK21ha2VkZXBlbmQpCisgICIkQCIgfHwgZXhpdCAkPworICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisgICMgWCBtYWtlZGVwZW5kCisgIHNoaWZ0CisgIGNsZWFyZWQ9bm8KKyAgZm9yIGFyZyBpbiAiJEAiOyBkbworICAgIGNhc2UgJGNsZWFyZWQgaW4KKyAgICBubykKKyAgICAgIHNldCAiIjsgc2hpZnQKKyAgICAgIGNsZWFyZWQ9eWVzIDs7CisgICAgZXNhYworICAgIGNhc2UgIiRhcmciIGluCisgICAgLUQqfC1JKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQorICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KKyAgICAtKnwkb2JqZWN0KQorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgIGVzYWMKKyAgZG9uZQorICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCisgIHRvdWNoICIkdG1wZGVwZmlsZSIKKyAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCisnIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKKyAgOzsKKworY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAiJEAiIC1FIHwKKyAgICBzZWQgLW4gLWUgJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgXAorICAgICAgIC1lICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyB8CisgICAgc2VkICckIHM6IFxcJDo6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3Zpc3VhbGNwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCisgICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgIiRAIiB8fCBleGl0ICQ/CisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgIiRhcmciIGluCisgICAgIi1HbSJ8Ii9HbSJ8Ii1HaSJ8Ii9HaSJ8Ii1aSSJ8Ii9aSSIpCisJc2V0IGZub3JkICIkQCIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICAqKQorCXNldCBmbm9yZCAiJEAiICIkYXJnIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgIGVzYWMKKyAgZG9uZQorICAiJEAiIC1FIHwKKyAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjplY2hvICJgY3lncGF0aCAtdSBcXCJcMVxcImAiOnAnIHwgc29ydCB8IHVuaXEgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9tcGdsaWIvaHVmZm1hbi5oIGIvbXBnbGliL2h1ZmZtYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDczYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2h1ZmZtYW4uaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBwcm9qZWN0CisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBIaXBwLCBzZWUgYWxzbyBBVVRIT1JTIGFuZCBSRUFETUUuCisgKiAgCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIGh1ZmZtYW4gdGFibGVzIC4uLiByZWNhbGN1YWx0ZWQgdG8gd29yayB3aXRoIG15IG9wdGltemVkCisgKiBkZWNvZGVyIHNjaGVtZSAoTUgpCisgKiAKKyAqIHByb2JhYmx5IHdlIGNvdWxkIHNhdmUgYSBmZXcgYnl0ZXMgb2YgbWVtb3J5LCBiZWNhdXNlIHRoZSAKKyAqIHNtYWxsZXIgdGFibGVzIGFyZSBvZnRlbiB0aGUgcGFydCBvZiBhIGJpZ2dlciB0YWJsZQorICovCisKKy8qICpJTkRFTlQtT0ZGKiAqLworCisKK3N0cnVjdCBuZXdodWZmIAoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCBsaW5iaXRzOworICAgIGNvbnN0IHNob3J0ICogY29uc3QgdGFibGU7Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdGFiMFtdID0gCit7IAorICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWIxW10gPQoreworICAgIC01LCAgLTMsICAtMSwgIDE3LCAgIDEsICAxNiwgICAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdGFiMltdID0KK3sKKyAgICAtMTUsIC0xMSwgIC05LCAgLTUsICAtMywgIC0xLCAgMzQsICAgMiwgIDE4LCAgLTEsICAzMywgIDMyLCAgMTcsICAtMSwgICAxLCAgIDE2LCAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWIzW10gPQoreworIC0xMywgLTExLCAgLTksICAtNSwgIC0zLCAgLTEsICAzNCwgICAyLCAgMTgsICAtMSwgIDMzLCAgMzIsICAxNiwgIDE3LCAgLTEsCisgICAxLCAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWI1W10gPQoreworIC0yOSwgLTI1LCAtMjMsIC0xNSwgIC03LCAgLTUsICAtMywgIC0xLCAgNTEsICAzNSwgIDUwLCAgNDksICAtMywgIC0xLCAgMTksCisgICAzLCAgLTEsICA0OCwgIDM0LCAgLTMsICAtMSwgIDE4LCAgMzMsICAtMSwgICAyLCAgMzIsICAxNywgIC0xLCAgIDEsICAxNiwKKyAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWI2W10gPQoreworIC0yNSwgLTE5LCAtMTMsICAtOSwgIC01LCAgLTMsICAtMSwgIDUxLCAgIDMsICAzNSwgIC0xLCAgNTAsICA0OCwgIC0xLCAgMTksCisgIDQ5LCAgLTMsICAtMSwgIDM0LCAgIDIsICAxOCwgIC0zLCAgLTEsICAzMywgIDMyLCAgIDEsICAtMSwgIDE3LCAgLTEsICAxNiwKKyAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWI3W10gPQoreworIC02OSwgLTY1LCAtNTcsIC0zOSwgLTI5LCAtMTcsIC0xMSwgIC03LCAgLTMsICAtMSwgIDg1LCAgNjksICAtMSwgIDg0LCAgODMsCisgIC0xLCAgNTMsICA2OCwgIC0zLCAgLTEsICAzNywgIDgyLCAgMjEsICAtNSwgIC0xLCAgODEsICAtMSwgICA1LCAgNTIsICAtMSwKKyAgODAsICAtMSwgIDY3LCAgNTEsICAtNSwgIC0zLCAgLTEsICAzNiwgIDY2LCAgMjAsICAtMSwgIDY1LCAgNjQsIC0xMSwgIC03LAorICAtMywgIC0xLCAgIDQsICAzNSwgIC0xLCAgNTAsICAgMywgIC0xLCAgMTksICA0OSwgIC0zLCAgLTEsICA0OCwgIDM0LCAgMTgsCisgIC01LCAgLTEsICAzMywgIC0xLCAgIDIsICAzMiwgIDE3LCAgLTEsICAgMSwgIDE2LCAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWI4W10gPQoreworIC02NSwgLTYzLCAtNTksIC00NSwgLTMxLCAtMTksIC0xMywgIC03LCAgLTUsICAtMywgIC0xLCAgODUsICA4NCwgIDY5LCAgODMsCisgIC0zLCAgLTEsICA1MywgIDY4LCAgMzcsICAtMywgIC0xLCAgODIsICAgNSwgIDIxLCAgLTUsICAtMSwgIDgxLCAgLTEsICA1MiwKKyAgNjcsICAtMywgIC0xLCAgODAsICA1MSwgIDM2LCAgLTUsICAtMywgIC0xLCAgNjYsICAyMCwgIDY1LCAgLTMsICAtMSwgICA0LAorICA2NCwgIC0xLCAgMzUsICA1MCwgIC05LCAgLTcsICAtMywgIC0xLCAgMTksICA0OSwgIC0xLCAgIDMsICA0OCwgIDM0LCAgLTEsCisgICAyLCAgMzIsICAtMSwgIDE4LCAgMzMsICAxNywgIC0zLCAgLTEsICAgMSwgIDE2LCAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWI5W10gPQoreworIC02MywgLTUzLCAtNDEsIC0yOSwgLTE5LCAtMTEsICAtNSwgIC0zLCAgLTEsICA4NSwgIDY5LCAgNTMsICAtMSwgIDgzLCAgLTEsCisgIDg0LCAgIDUsICAtMywgIC0xLCAgNjgsICAzNywgIC0xLCAgODIsICAyMSwgIC0zLCAgLTEsICA4MSwgIDUyLCAgLTEsICA2NywKKyAgLTEsICA4MCwgICA0LCAgLTcsICAtMywgIC0xLCAgMzYsICA2NiwgIC0xLCAgNTEsICA2NCwgIC0xLCAgMjAsICA2NSwgIC01LAorICAtMywgIC0xLCAgMzUsICA1MCwgIDE5LCAgLTEsICA0OSwgIC0xLCAgIDMsICA0OCwgIC01LCAgLTMsICAtMSwgIDM0LCAgIDIsCisgIDE4LCAgLTEsICAzMywgIDMyLCAgLTMsICAtMSwgIDE3LCAgIDEsICAtMSwgIDE2LCAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWIxMFtdID0KK3sKKy0xMjUsLTEyMSwtMTExLCAtODMsIC01NSwgLTM1LCAtMjEsIC0xMywgIC03LCAgLTMsICAtMSwgMTE5LCAxMDMsICAtMSwgMTE4LAorICA4NywgIC0zLCAgLTEsIDExNywgMTAyLCAgNzEsICAtMywgIC0xLCAxMTYsICA4NiwgIC0xLCAxMDEsICA1NSwgIC05LCAgLTMsCisgIC0xLCAxMTUsICA3MCwgIC0zLCAgLTEsICA4NSwgIDg0LCAgOTksICAtMSwgIDM5LCAxMTQsIC0xMSwgIC01LCAgLTMsICAtMSwKKyAxMDAsICAgNywgMTEyLCAgLTEsICA5OCwgIC0xLCAgNjksICA1MywgIC01LCAgLTEsICAgNiwgIC0xLCAgODMsICA2OCwgIDIzLAorIC0xNywgIC01LCAgLTEsIDExMywgIC0xLCAgNTQsICAzOCwgIC01LCAgLTMsICAtMSwgIDM3LCAgODIsICAyMSwgIC0xLCAgODEsCisgIC0xLCAgNTIsICA2NywgIC0zLCAgLTEsICAyMiwgIDk3LCAgLTEsICA5NiwgIC0xLCAgIDUsICA4MCwgLTE5LCAtMTEsICAtNywKKyAgLTMsICAtMSwgIDM2LCAgNjYsICAtMSwgIDUxLCAgIDQsICAtMSwgIDIwLCAgNjUsICAtMywgIC0xLCAgNjQsICAzNSwgIC0xLAorICA1MCwgICAzLCAgLTMsICAtMSwgIDE5LCAgNDksICAtMSwgIDQ4LCAgMzQsICAtNywgIC0zLCAgLTEsICAxOCwgIDMzLCAgLTEsCisgICAyLCAgMzIsICAxNywgIC0xLCAgIDEsICAxNiwgICAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdGFiMTFbXSA9Cit7CistMTIxLC0xMTMsIC04OSwgLTU5LCAtNDMsIC0yNywgLTE3LCAgLTcsICAtMywgIC0xLCAxMTksIDEwMywgIC0xLCAxMTgsIDExNywKKyAgLTMsICAtMSwgMTAyLCAgNzEsICAtMSwgMTE2LCAgLTEsICA4NywgIDg1LCAgLTUsICAtMywgIC0xLCAgODYsIDEwMSwgIDU1LAorICAtMSwgMTE1LCAgNzAsICAtOSwgIC03LCAgLTMsICAtMSwgIDY5LCAgODQsICAtMSwgIDUzLCAgODMsICAzOSwgIC0xLCAxMTQsCisgIC0xLCAxMDAsICAgNywgIC01LCAgLTEsIDExMywgIC0xLCAgMjMsIDExMiwgIC0zLCAgLTEsICA1NCwgIDk5LCAgLTEsICA5NiwKKyAgLTEsICA2OCwgIDM3LCAtMTMsICAtNywgIC01LCAgLTMsICAtMSwgIDgyLCAgIDUsICAyMSwgIDk4LCAgLTMsICAtMSwgIDM4LAorICAgNiwgIDIyLCAgLTUsICAtMSwgIDk3LCAgLTEsICA4MSwgIDUyLCAgLTUsICAtMSwgIDgwLCAgLTEsICA2NywgIDUxLCAgLTEsCisgIDM2LCAgNjYsIC0xNSwgLTExLCAgLTcsICAtMywgIC0xLCAgMjAsICA2NSwgIC0xLCAgIDQsICA2NCwgIC0xLCAgMzUsICA1MCwKKyAgLTEsICAxOSwgIDQ5LCAgLTUsICAtMywgIC0xLCAgIDMsICA0OCwgIDM0LCAgMzMsICAtNSwgIC0xLCAgMTgsICAtMSwgICAyLAorICAzMiwgIDE3LCAgLTMsICAtMSwgICAxLCAgMTYsICAgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHRhYjEyW10gPQoreworLTExNSwgLTk5LCAtNzMsIC00NSwgLTI3LCAtMTcsICAtOSwgIC01LCAgLTMsICAtMSwgMTE5LCAxMDMsIDExOCwgIC0xLCAgODcsCisgMTE3LCAgLTMsICAtMSwgMTAyLCAgNzEsICAtMSwgMTE2LCAxMDEsICAtMywgIC0xLCAgODYsICA1NSwgIC0zLCAgLTEsIDExNSwKKyAgODUsICAzOSwgIC03LCAgLTMsICAtMSwgMTE0LCAgNzAsICAtMSwgMTAwLCAgMjMsICAtNSwgIC0xLCAxMTMsICAtMSwgICA3LAorIDExMiwgIC0xLCAgNTQsICA5OSwgLTEzLCAgLTksICAtMywgIC0xLCAgNjksICA4NCwgIC0xLCAgNjgsICAtMSwgICA2LCAgIDUsCisgIC0xLCAgMzgsICA5OCwgIC01LCAgLTEsICA5NywgIC0xLCAgMjIsICA5NiwgIC0zLCAgLTEsICA1MywgIDgzLCAgLTEsICAzNywKKyAgODIsIC0xNywgIC03LCAgLTMsICAtMSwgIDIxLCAgODEsICAtMSwgIDUyLCAgNjcsICAtNSwgIC0zLCAgLTEsICA4MCwgICA0LAorICAzNiwgIC0xLCAgNjYsICAyMCwgIC0zLCAgLTEsICA1MSwgIDY1LCAgLTEsICAzNSwgIDUwLCAtMTEsICAtNywgIC01LCAgLTMsCisgIC0xLCAgNjQsICAgMywgIDQ4LCAgMTksICAtMSwgIDQ5LCAgMzQsICAtMSwgIDE4LCAgMzMsICAtNywgIC01LCAgLTMsICAtMSwKKyAgIDIsICAzMiwgICAwLCAgMTcsICAtMSwgICAxLCAgMTYKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWIxM1tdID0KK3sKKy01MDksLTUwMywtNDc1LC00MDUsLTMzMywtMjY1LC0yMDUsLTE1MywtMTE1LCAtODMsIC01MywgLTM1LCAtMjEsIC0xMywgIC05LAorICAtNywgIC01LCAgLTMsICAtMSwgMjU0LCAyNTIsIDI1MywgMjM3LCAyNTUsICAtMSwgMjM5LCAyMjMsICAtMywgIC0xLCAyMzgsCisgMjA3LCAgLTEsIDIyMiwgMTkxLCAgLTksICAtMywgIC0xLCAyNTEsIDIwNiwgIC0xLCAyMjAsICAtMSwgMTc1LCAyMzMsICAtMSwKKyAyMzYsIDIyMSwgIC05LCAgLTUsICAtMywgIC0xLCAyNTAsIDIwNSwgMTkwLCAgLTEsIDIzNSwgMTU5LCAgLTMsICAtMSwgMjQ5LAorIDIzNCwgIC0xLCAxODksIDIxOSwgLTE3LCAgLTksICAtMywgIC0xLCAxNDMsIDI0OCwgIC0xLCAyMDQsICAtMSwgMTc0LCAxNTgsCisgIC01LCAgLTEsIDE0MiwgIC0xLCAxMjcsIDEyNiwgMjQ3LCAgLTUsICAtMSwgMjE4LCAgLTEsIDE3MywgMTg4LCAgLTMsICAtMSwKKyAyMDMsIDI0NiwgMTExLCAtMTUsICAtNywgIC0zLCAgLTEsIDIzMiwgIDk1LCAgLTEsIDE1NywgMjE3LCAgLTMsICAtMSwgMjQ1LAorIDIzMSwgIC0xLCAxNzIsIDE4NywgIC05LCAgLTMsICAtMSwgIDc5LCAyNDQsICAtMywgIC0xLCAyMDIsIDIzMCwgMjQzLCAgLTEsCisgIDYzLCAgLTEsIDE0MSwgMjE2LCAtMjEsICAtOSwgIC0zLCAgLTEsICA0NywgMjQyLCAgLTMsICAtMSwgMTEwLCAxNTYsICAxNSwKKyAgLTUsICAtMywgIC0xLCAyMDEsICA5NCwgMTcxLCAgLTMsICAtMSwgMTI1LCAyMTUsICA3OCwgLTExLCAgLTUsICAtMywgIC0xLAorIDIwMCwgMjE0LCAgNjIsICAtMSwgMTg1LCAgLTEsIDE1NSwgMTcwLCAgLTEsICAzMSwgMjQxLCAtMjMsIC0xMywgIC01LCAgLTEsCisgMjQwLCAgLTEsIDE4NiwgMjI5LCAgLTMsICAtMSwgMjI4LCAxNDAsICAtMSwgMTA5LCAyMjcsICAtNSwgIC0xLCAyMjYsICAtMSwKKyAgNDYsICAxNCwgIC0xLCAgMzAsIDIyNSwgLTE1LCAgLTcsICAtMywgIC0xLCAyMjQsICA5MywgIC0xLCAyMTMsIDEyNCwgIC0zLAorICAtMSwgMTk5LCAgNzcsICAtMSwgMTM5LCAxODQsICAtNywgIC0zLCAgLTEsIDIxMiwgMTU0LCAgLTEsIDE2OSwgMTA4LCAgLTEsCisgMTk4LCAgNjEsIC0zNywgLTIxLCAgLTksICAtNSwgIC0zLCAgLTEsIDIxMSwgMTIzLCAgNDUsICAtMSwgMjEwLCAgMjksICAtNSwKKyAgLTEsIDE4MywgIC0xLCAgOTIsIDE5NywgIC0zLCAgLTEsIDE1MywgMTIyLCAxOTUsICAtNywgIC01LCAgLTMsICAtMSwgMTY3LAorIDE1MSwgIDc1LCAyMDksICAtMywgIC0xLCAgMTMsIDIwOCwgIC0xLCAxMzgsIDE2OCwgLTExLCAgLTcsICAtMywgIC0xLCAgNzYsCisgMTk2LCAgLTEsIDEwNywgMTgyLCAgLTEsICA2MCwgIDQ0LCAgLTMsICAtMSwgMTk0LCAgOTEsICAtMywgIC0xLCAxODEsIDEzNywKKyAgMjgsIC00MywgLTIzLCAtMTEsICAtNSwgIC0xLCAxOTMsICAtMSwgMTUyLCAgMTIsICAtMSwgMTkyLCAgLTEsIDE4MCwgMTA2LAorICAtNSwgIC0zLCAgLTEsIDE2NiwgMTIxLCAgNTksICAtMSwgMTc5LCAgLTEsIDEzNiwgIDkwLCAtMTEsICAtNSwgIC0xLCAgNDMsCisgIC0xLCAxNjUsIDEwNSwgIC0xLCAxNjQsICAtMSwgMTIwLCAxMzUsICAtNSwgIC0xLCAxNDgsICAtMSwgMTE5LCAxMTgsIDE3OCwKKyAtMTEsICAtMywgIC0xLCAgMjcsIDE3NywgIC0zLCAgLTEsICAxMSwgMTc2LCAgLTEsIDE1MCwgIDc0LCAgLTcsICAtMywgIC0xLAorICA1OCwgMTYzLCAgLTEsICA4OSwgMTQ5LCAgLTEsICA0MiwgMTYyLCAtNDcsIC0yMywgIC05LCAgLTMsICAtMSwgIDI2LCAxNjEsCisgIC0zLCAgLTEsICAxMCwgMTA0LCAxNjAsICAtNSwgIC0zLCAgLTEsIDEzNCwgIDczLCAxNDcsICAtMywgIC0xLCAgNTcsICA4OCwKKyAgLTEsIDEzMywgMTAzLCAgLTksICAtMywgIC0xLCAgNDEsIDE0NiwgIC0zLCAgLTEsICA4NywgMTE3LCAgNTYsICAtNSwgIC0xLAorIDEzMSwgIC0xLCAxMDIsICA3MSwgIC0zLCAgLTEsIDExNiwgIDg2LCAgLTEsIDEwMSwgMTE1LCAtMTEsICAtMywgIC0xLCAgMjUsCisgMTQ1LCAgLTMsICAtMSwgICA5LCAxNDQsICAtMSwgIDcyLCAxMzIsICAtNywgIC01LCAgLTEsIDExNCwgIC0xLCAgNzAsIDEwMCwKKyAgNDAsICAtMSwgMTMwLCAgMjQsIC00MSwgLTI3LCAtMTEsICAtNSwgIC0zLCAgLTEsICA1NSwgIDM5LCAgMjMsICAtMSwgMTEzLAorICAtMSwgIDg1LCAgIDcsICAtNywgIC0zLCAgLTEsIDExMiwgIDU0LCAgLTEsICA5OSwgIDY5LCAgLTMsICAtMSwgIDg0LCAgMzgsCisgIC0xLCAgOTgsICA1MywgIC01LCAgLTEsIDEyOSwgIC0xLCAgIDgsIDEyOCwgIC0zLCAgLTEsICAyMiwgIDk3LCAgLTEsICAgNiwKKyAgOTYsIC0xMywgIC05LCAgLTUsICAtMywgIC0xLCAgODMsICA2OCwgIDM3LCAgLTEsICA4MiwgICA1LCAgLTEsICAyMSwgIDgxLAorICAtNywgIC0zLCAgLTEsICA1MiwgIDY3LCAgLTEsICA4MCwgIDM2LCAgLTMsICAtMSwgIDY2LCAgNTEsICAyMCwgLTE5LCAtMTEsCisgIC01LCAgLTEsICA2NSwgIC0xLCAgIDQsICA2NCwgIC0zLCAgLTEsICAzNSwgIDUwLCAgMTksICAtMywgIC0xLCAgNDksICAgMywKKyAgLTEsICA0OCwgIDM0LCAgLTMsICAtMSwgIDE4LCAgMzMsICAtMSwgICAyLCAgMzIsICAtMywgIC0xLCAgMTcsICAgMSwgIDE2LAorICAgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHRhYjE1W10gPQoreworLTQ5NSwtNDQ1LC0zNTUsLTI2MywtMTgzLC0xMTUsIC03NywgLTQzLCAtMjcsIC0xMywgIC03LCAgLTMsICAtMSwgMjU1LCAyMzksCisgIC0xLCAyNTQsIDIyMywgIC0xLCAyMzgsICAtMSwgMjUzLCAyMDcsICAtNywgIC0zLCAgLTEsIDI1MiwgMjIyLCAgLTEsIDIzNywKKyAxOTEsICAtMSwgMjUxLCAgLTEsIDIwNiwgMjM2LCAgLTcsICAtMywgIC0xLCAyMjEsIDE3NSwgIC0xLCAyNTAsIDE5MCwgIC0zLAorICAtMSwgMjM1LCAyMDUsICAtMSwgMjIwLCAxNTksIC0xNSwgIC03LCAgLTMsICAtMSwgMjQ5LCAyMzQsICAtMSwgMTg5LCAyMTksCisgIC0zLCAgLTEsIDE0MywgMjQ4LCAgLTEsIDIwNCwgMTU4LCAgLTcsICAtMywgIC0xLCAyMzMsIDEyNywgIC0xLCAyNDcsIDE3MywKKyAgLTMsICAtMSwgMjE4LCAxODgsICAtMSwgMTExLCAgLTEsIDE3NCwgIDE1LCAtMTksIC0xMSwgIC0zLCAgLTEsIDIwMywgMjQ2LAorICAtMywgIC0xLCAxNDIsIDIzMiwgIC0xLCAgOTUsIDE1NywgIC0zLCAgLTEsIDI0NSwgMTI2LCAgLTEsIDIzMSwgMTcyLCAgLTksCisgIC0zLCAgLTEsIDIwMiwgMTg3LCAgLTMsICAtMSwgMjE3LCAxNDEsICA3OSwgIC0zLCAgLTEsIDI0NCwgIDYzLCAgLTEsIDI0MywKKyAyMTYsIC0zMywgLTE3LCAgLTksICAtMywgIC0xLCAyMzAsICA0NywgIC0xLCAyNDIsICAtMSwgMTEwLCAyNDAsICAtMywgIC0xLAorICAzMSwgMjQxLCAgLTEsIDE1NiwgMjAxLCAgLTcsICAtMywgIC0xLCAgOTQsIDE3MSwgIC0xLCAxODYsIDIyOSwgIC0zLCAgLTEsCisgMTI1LCAyMTUsICAtMSwgIDc4LCAyMjgsIC0xNSwgIC03LCAgLTMsICAtMSwgMTQwLCAyMDAsICAtMSwgIDYyLCAxMDksICAtMywKKyAgLTEsIDIxNCwgMjI3LCAgLTEsIDE1NSwgMTg1LCAgLTcsICAtMywgIC0xLCAgNDYsIDE3MCwgIC0xLCAyMjYsICAzMCwgIC01LAorICAtMSwgMjI1LCAgLTEsICAxNCwgMjI0LCAgLTEsICA5MywgMjEzLCAtNDUsIC0yNSwgLTEzLCAgLTcsICAtMywgIC0xLCAxMjQsCisgMTk5LCAgLTEsICA3NywgMTM5LCAgLTEsIDIxMiwgIC0xLCAxODQsIDE1NCwgIC03LCAgLTMsICAtMSwgMTY5LCAxMDgsICAtMSwKKyAxOTgsICA2MSwgIC0xLCAyMTEsIDIxMCwgIC05LCAgLTUsICAtMywgIC0xLCAgNDUsICAxMywgIDI5LCAgLTEsIDEyMywgMTgzLAorICAtNSwgIC0xLCAyMDksICAtMSwgIDkyLCAyMDgsICAtMSwgMTk3LCAxMzgsIC0xNywgIC03LCAgLTMsICAtMSwgMTY4LCAgNzYsCisgIC0xLCAxOTYsIDEwNywgIC01LCAgLTEsIDE4MiwgIC0xLCAxNTMsICAxMiwgIC0xLCAgNjAsIDE5NSwgIC05LCAgLTMsICAtMSwKKyAxMjIsIDE2NywgIC0xLCAxNjYsICAtMSwgMTkyLCAgMTEsICAtMSwgMTk0LCAgLTEsICA0NCwgIDkxLCAtNTUsIC0yOSwgLTE1LAorICAtNywgIC0zLCAgLTEsIDE4MSwgIDI4LCAgLTEsIDEzNywgMTUyLCAgLTMsICAtMSwgMTkzLCAgNzUsICAtMSwgMTgwLCAxMDYsCisgIC01LCAgLTMsICAtMSwgIDU5LCAxMjEsIDE3OSwgIC0zLCAgLTEsIDE1MSwgMTM2LCAgLTEsICA0MywgIDkwLCAtMTEsICAtNSwKKyAgLTEsIDE3OCwgIC0xLCAxNjUsICAyNywgIC0xLCAxNzcsICAtMSwgMTc2LCAxMDUsICAtNywgIC0zLCAgLTEsIDE1MCwgIDc0LAorICAtMSwgMTY0LCAxMjAsICAtMywgIC0xLCAxMzUsICA1OCwgMTYzLCAtMTcsICAtNywgIC0zLCAgLTEsICA4OSwgMTQ5LCAgLTEsCisgIDQyLCAxNjIsICAtMywgIC0xLCAgMjYsIDE2MSwgIC0zLCAgLTEsICAxMCwgMTYwLCAxMDQsICAtNywgIC0zLCAgLTEsIDEzNCwKKyAgNzMsICAtMSwgMTQ4LCAgNTcsICAtNSwgIC0xLCAxNDcsICAtMSwgMTE5LCAgIDksICAtMSwgIDg4LCAxMzMsIC01MywgLTI5LAorIC0xMywgIC03LCAgLTMsICAtMSwgIDQxLCAxMDMsICAtMSwgMTE4LCAxNDYsICAtMSwgMTQ1LCAgLTEsICAyNSwgMTQ0LCAgLTcsCisgIC0zLCAgLTEsICA3MiwgMTMyLCAgLTEsICA4NywgMTE3LCAgLTMsICAtMSwgIDU2LCAxMzEsICAtMSwgMTAyLCAgNzEsICAtNywKKyAgLTMsICAtMSwgIDQwLCAxMzAsICAtMSwgIDI0LCAxMjksICAtNywgIC0zLCAgLTEsIDExNiwgICA4LCAgLTEsIDEyOCwgIDg2LAorICAtMywgIC0xLCAxMDEsICA1NSwgIC0xLCAxMTUsICA3MCwgLTE3LCAgLTcsICAtMywgIC0xLCAgMzksIDExNCwgIC0xLCAxMDAsCisgIDIzLCAgLTMsICAtMSwgIDg1LCAxMTMsICAtMywgIC0xLCAgIDcsIDExMiwgIDU0LCAgLTcsICAtMywgIC0xLCAgOTksICA2OSwKKyAgLTEsICA4NCwgIDM4LCAgLTMsICAtMSwgIDk4LCAgMjIsICAtMywgIC0xLCAgIDYsICA5NiwgIDUzLCAtMzMsIC0xOSwgIC05LAorICAtNSwgIC0xLCAgOTcsICAtMSwgIDgzLCAgNjgsICAtMSwgIDM3LCAgODIsICAtMywgIC0xLCAgMjEsICA4MSwgIC0zLCAgLTEsCisgICA1LCAgODAsICA1MiwgIC03LCAgLTMsICAtMSwgIDY3LCAgMzYsICAtMSwgIDY2LCAgNTEsICAtMSwgIDY1LCAgLTEsICAyMCwKKyAgIDQsICAtOSwgIC0zLCAgLTEsICAzNSwgIDUwLCAgLTMsICAtMSwgIDY0LCAgIDMsICAxOSwgIC0zLCAgLTEsICA0OSwgIDQ4LAorICAzNCwgIC05LCAgLTcsICAtMywgIC0xLCAgMTgsICAzMywgIC0xLCAgIDIsICAzMiwgIDE3LCAgLTMsICAtMSwgICAxLCAgMTYsCisgICAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdGFiMTZbXSA9Cit7CistNTA5LC01MDMsLTQ2MSwtMzIzLC0xMDMsIC0zNywgLTI3LCAtMTUsICAtNywgIC0zLCAgLTEsIDIzOSwgMjU0LCAgLTEsIDIyMywKKyAyNTMsICAtMywgIC0xLCAyMDcsIDI1MiwgIC0xLCAxOTEsIDI1MSwgIC01LCAgLTEsIDE3NSwgIC0xLCAyNTAsIDE1OSwgIC0zLAorICAtMSwgMjQ5LCAyNDgsIDE0MywgIC03LCAgLTMsICAtMSwgMTI3LCAyNDcsICAtMSwgMTExLCAyNDYsIDI1NSwgIC05LCAgLTUsCisgIC0zLCAgLTEsICA5NSwgMjQ1LCAgNzksICAtMSwgMjQ0LCAyNDMsIC01MywgIC0xLCAyNDAsICAtMSwgIDYzLCAtMjksIC0xOSwKKyAtMTMsICAtNywgIC01LCAgLTEsIDIwNiwgIC0xLCAyMzYsIDIyMSwgMjIyLCAgLTEsIDIzMywgIC0xLCAyMzQsIDIxNywgIC0xLAorIDIzOCwgIC0xLCAyMzcsIDIzNSwgIC0zLCAgLTEsIDE5MCwgMjA1LCAgLTMsICAtMSwgMjIwLCAyMTksIDE3NCwgLTExLCAgLTUsCisgIC0xLCAyMDQsICAtMSwgMTczLCAyMTgsICAtMywgIC0xLCAxMjYsIDE3MiwgMjAyLCAgLTUsICAtMywgIC0xLCAyMDEsIDEyNSwKKyAgOTQsIDE4OSwgMjQyLCAtOTMsICAtNSwgIC0zLCAgLTEsICA0NywgIDE1LCAgMzEsICAtMSwgMjQxLCAtNDksIC0yNSwgLTEzLAorICAtNSwgIC0xLCAxNTgsICAtMSwgMTg4LCAyMDMsICAtMywgIC0xLCAxNDIsIDIzMiwgIC0xLCAxNTcsIDIzMSwgIC03LCAgLTMsCisgIC0xLCAxODcsIDE0MSwgIC0xLCAyMTYsIDExMCwgIC0xLCAyMzAsIDE1NiwgLTEzLCAgLTcsICAtMywgIC0xLCAxNzEsIDE4NiwKKyAgLTEsIDIyOSwgMjE1LCAgLTEsICA3OCwgIC0xLCAyMjgsIDE0MCwgIC0zLCAgLTEsIDIwMCwgIDYyLCAgLTEsIDEwOSwgIC0xLAorIDIxNCwgMTU1LCAtMTksIC0xMSwgIC01LCAgLTMsICAtMSwgMTg1LCAxNzAsIDIyNSwgIC0xLCAyMTIsICAtMSwgMTg0LCAxNjksCisgIC01LCAgLTEsIDEyMywgIC0xLCAxODMsIDIwOCwgMjI3LCAgLTcsICAtMywgIC0xLCAgMTQsIDIyNCwgIC0xLCAgOTMsIDIxMywKKyAgLTMsICAtMSwgMTI0LCAxOTksICAtMSwgIDc3LCAxMzksIC03NSwgLTQ1LCAtMjcsIC0xMywgIC03LCAgLTMsICAtMSwgMTU0LAorIDEwOCwgIC0xLCAxOTgsICA2MSwgIC0zLCAgLTEsICA5MiwgMTk3LCAgMTMsICAtNywgIC0zLCAgLTEsIDEzOCwgMTY4LCAgLTEsCisgMTUzLCAgNzYsICAtMywgIC0xLCAxODIsIDEyMiwgIDYwLCAtMTEsICAtNSwgIC0zLCAgLTEsICA5MSwgMTM3LCAgMjgsICAtMSwKKyAxOTIsICAtMSwgMTUyLCAxMjEsICAtMSwgMjI2LCAgLTEsICA0NiwgIDMwLCAtMTUsICAtNywgIC0zLCAgLTEsIDIxMSwgIDQ1LAorICAtMSwgMjEwLCAyMDksICAtNSwgIC0xLCAgNTksICAtMSwgMTUxLCAxMzYsICAyOSwgIC03LCAgLTMsICAtMSwgMTk2LCAxMDcsCisgIC0xLCAxOTUsIDE2NywgIC0xLCAgNDQsICAtMSwgMTk0LCAxODEsIC0yMywgLTEzLCAgLTcsICAtMywgIC0xLCAxOTMsICAxMiwKKyAgLTEsICA3NSwgMTgwLCAgLTMsICAtMSwgMTA2LCAxNjYsIDE3OSwgIC01LCAgLTMsICAtMSwgIDkwLCAxNjUsICA0MywgIC0xLAorIDE3OCwgIDI3LCAtMTMsICAtNSwgIC0xLCAxNzcsICAtMSwgIDExLCAxNzYsICAtMywgIC0xLCAxMDUsIDE1MCwgIC0xLCAgNzQsCisgMTY0LCAgLTUsICAtMywgIC0xLCAxMjAsIDEzNSwgMTYzLCAgLTMsICAtMSwgIDU4LCAgODksICA0MiwgLTk3LCAtNTcsIC0zMywKKyAtMTksIC0xMSwgIC01LCAgLTMsICAtMSwgMTQ5LCAxMDQsIDE2MSwgIC0zLCAgLTEsIDEzNCwgMTE5LCAxNDgsICAtNSwgIC0zLAorICAtMSwgIDczLCAgODcsIDEwMywgMTYyLCAgLTUsICAtMSwgIDI2LCAgLTEsICAxMCwgMTYwLCAgLTMsICAtMSwgIDU3LCAxNDcsCisgIC0xLCAgODgsIDEzMywgIC05LCAgLTMsICAtMSwgIDQxLCAxNDYsICAtMywgIC0xLCAxMTgsICAgOSwgIDI1LCAgLTUsICAtMSwKKyAxNDUsICAtMSwgMTQ0LCAgNzIsICAtMywgIC0xLCAxMzIsIDExNywgIC0xLCAgNTYsIDEzMSwgLTIxLCAtMTEsICAtNSwgIC0zLAorICAtMSwgMTAyLCAgNDAsIDEzMCwgIC0zLCAgLTEsICA3MSwgMTE2LCAgMjQsICAtMywgIC0xLCAxMjksIDEyOCwgIC0zLCAgLTEsCisgICA4LCAgODYsICA1NSwgIC05LCAgLTUsICAtMSwgMTE1LCAgLTEsIDEwMSwgIDcwLCAgLTEsICAzOSwgMTE0LCAgLTUsICAtMywKKyAgLTEsIDEwMCwgIDg1LCAgIDcsICAyMywgLTIzLCAtMTMsICAtNSwgIC0xLCAxMTMsICAtMSwgMTEyLCAgNTQsICAtMywgIC0xLAorICA5OSwgIDY5LCAgLTEsICA4NCwgIDM4LCAgLTMsICAtMSwgIDk4LCAgMjIsICAtMSwgIDk3LCAgLTEsICAgNiwgIDk2LCAgLTksCisgIC01LCAgLTEsICA4MywgIC0xLCAgNTMsICA2OCwgIC0xLCAgMzcsICA4MiwgIC0xLCAgODEsICAtMSwgIDIxLCAgIDUsIC0zMywKKyAtMjMsIC0xMywgIC03LCAgLTMsICAtMSwgIDUyLCAgNjcsICAtMSwgIDgwLCAgMzYsICAtMywgIC0xLCAgNjYsICA1MSwgIDIwLAorICAtNSwgIC0xLCAgNjUsICAtMSwgICA0LCAgNjQsICAtMSwgIDM1LCAgNTAsICAtMywgIC0xLCAgMTksICA0OSwgIC0zLCAgLTEsCisgICAzLCAgNDgsICAzNCwgIC0zLCAgLTEsICAxOCwgIDMzLCAgLTEsICAgMiwgIDMyLCAgLTMsICAtMSwgIDE3LCAgIDEsICAxNiwKKyAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB0YWIyNFtdID0KK3sKKy00NTEsLTExNywgLTQzLCAtMjUsIC0xNSwgIC03LCAgLTMsICAtMSwgMjM5LCAyNTQsICAtMSwgMjIzLCAyNTMsICAtMywgIC0xLAorIDIwNywgMjUyLCAgLTEsIDE5MSwgMjUxLCAgLTUsICAtMSwgMjUwLCAgLTEsIDE3NSwgMTU5LCAgLTEsIDI0OSwgMjQ4LCAgLTksCisgIC01LCAgLTMsICAtMSwgMTQzLCAxMjcsIDI0NywgIC0xLCAxMTEsIDI0NiwgIC0zLCAgLTEsICA5NSwgMjQ1LCAgLTEsICA3OSwKKyAyNDQsIC03MSwgIC03LCAgLTMsICAtMSwgIDYzLCAyNDMsICAtMSwgIDQ3LCAyNDIsICAtNSwgIC0xLCAyNDEsICAtMSwgIDMxLAorIDI0MCwgLTI1LCAgLTksICAtMSwgIDE1LCAgLTMsICAtMSwgMjM4LCAyMjIsICAtMSwgMjM3LCAyMDYsICAtNywgIC0zLCAgLTEsCisgMjM2LCAyMjEsICAtMSwgMTkwLCAyMzUsICAtMywgIC0xLCAyMDUsIDIyMCwgIC0xLCAxNzQsIDIzNCwgLTE1LCAgLTcsICAtMywKKyAgLTEsIDE4OSwgMjE5LCAgLTEsIDIwNCwgMTU4LCAgLTMsICAtMSwgMjMzLCAxNzMsICAtMSwgMjE4LCAxODgsICAtNywgIC0zLAorICAtMSwgMjAzLCAxNDIsICAtMSwgMjMyLCAxNTcsICAtMywgIC0xLCAyMTcsIDEyNiwgIC0xLCAyMzEsIDE3MiwgMjU1LC0yMzUsCistMTQzLCAtNzcsIC00NSwgLTI1LCAtMTUsICAtNywgIC0zLCAgLTEsIDIwMiwgMTg3LCAgLTEsIDE0MSwgMjE2LCAgLTUsICAtMywKKyAgLTEsICAxNCwgMjI0LCAgMTMsIDIzMCwgIC01LCAgLTMsICAtMSwgMTEwLCAxNTYsIDIwMSwgIC0xLCAgOTQsIDE4NiwgIC05LAorICAtNSwgIC0xLCAyMjksICAtMSwgMTcxLCAxMjUsICAtMSwgMjE1LCAyMjgsICAtMywgIC0xLCAxNDAsIDIwMCwgIC0zLCAgLTEsCisgIDc4LCAgNDYsICA2MiwgLTE1LCAgLTcsICAtMywgIC0xLCAxMDksIDIxNCwgIC0xLCAyMjcsIDE1NSwgIC0zLCAgLTEsIDE4NSwKKyAxNzAsICAtMSwgMjI2LCAgMzAsICAtNywgIC0zLCAgLTEsIDIyNSwgIDkzLCAgLTEsIDIxMywgMTI0LCAgLTMsICAtMSwgMTk5LAorICA3NywgIC0xLCAxMzksIDE4NCwgLTMxLCAtMTUsICAtNywgIC0zLCAgLTEsIDIxMiwgMTU0LCAgLTEsIDE2OSwgMTA4LCAgLTMsCisgIC0xLCAxOTgsICA2MSwgIC0xLCAyMTEsICA0NSwgIC03LCAgLTMsICAtMSwgMjEwLCAgMjksICAtMSwgMTIzLCAxODMsICAtMywKKyAgLTEsIDIwOSwgIDkyLCAgLTEsIDE5NywgMTM4LCAtMTcsICAtNywgIC0zLCAgLTEsIDE2OCwgMTUzLCAgLTEsICA3NiwgMTk2LAorICAtMywgIC0xLCAxMDcsIDE4MiwgIC0zLCAgLTEsIDIwOCwgIDEyLCAgNjAsICAtNywgIC0zLCAgLTEsIDE5NSwgMTIyLCAgLTEsCisgMTY3LCAgNDQsICAtMywgIC0xLCAxOTQsICA5MSwgIC0xLCAxODEsICAyOCwgLTU3LCAtMzUsIC0xOSwgIC03LCAgLTMsICAtMSwKKyAxMzcsIDE1MiwgIC0xLCAxOTMsICA3NSwgIC01LCAgLTMsICAtMSwgMTkyLCAgMTEsICA1OSwgIC0zLCAgLTEsIDE3NiwgIDEwLAorICAyNiwgIC01LCAgLTEsIDE4MCwgIC0xLCAxMDYsIDE2NiwgIC0zLCAgLTEsIDEyMSwgMTUxLCAgLTMsICAtMSwgMTYwLCAgIDksCisgMTQ0LCAgLTksICAtMywgIC0xLCAxNzksIDEzNiwgIC0zLCAgLTEsICA0MywgIDkwLCAxNzgsICAtNywgIC0zLCAgLTEsIDE2NSwKKyAgMjcsICAtMSwgMTc3LCAxMDUsICAtMSwgMTUwLCAxNjQsIC0xNywgIC05LCAgLTUsICAtMywgIC0xLCAgNzQsIDEyMCwgMTM1LAorICAtMSwgIDU4LCAxNjMsICAtMywgIC0xLCAgODksIDE0OSwgIC0xLCAgNDIsIDE2MiwgIC03LCAgLTMsICAtMSwgMTYxLCAxMDQsCisgIC0xLCAxMzQsIDExOSwgIC0zLCAgLTEsICA3MywgMTQ4LCAgLTEsICA1NywgMTQ3LCAtNjMsIC0zMSwgLTE1LCAgLTcsICAtMywKKyAgLTEsICA4OCwgMTMzLCAgLTEsICA0MSwgMTAzLCAgLTMsICAtMSwgMTE4LCAxNDYsICAtMSwgIDI1LCAxNDUsICAtNywgIC0zLAorICAtMSwgIDcyLCAxMzIsICAtMSwgIDg3LCAxMTcsICAtMywgIC0xLCAgNTYsIDEzMSwgIC0xLCAxMDIsICA0MCwgLTE3LCAgLTcsCisgIC0zLCAgLTEsIDEzMCwgIDI0LCAgLTEsICA3MSwgMTE2LCAgLTUsICAtMSwgMTI5LCAgLTEsICAgOCwgMTI4LCAgLTEsICA4NiwKKyAxMDEsICAtNywgIC01LCAgLTEsICAyMywgIC0xLCAgIDcsIDExMiwgMTE1LCAgLTMsICAtMSwgIDU1LCAgMzksIDExNCwgLTE1LAorICAtNywgIC0zLCAgLTEsICA3MCwgMTAwLCAgLTEsICA4NSwgMTEzLCAgLTMsICAtMSwgIDU0LCAgOTksICAtMSwgIDY5LCAgODQsCisgIC03LCAgLTMsICAtMSwgIDM4LCAgOTgsICAtMSwgIDIyLCAgOTcsICAtNSwgIC0zLCAgLTEsICAgNiwgIDk2LCAgNTMsICAtMSwKKyAgODMsICA2OCwgLTUxLCAtMzcsIC0yMywgLTE1LCAgLTksICAtMywgIC0xLCAgMzcsICA4MiwgIC0xLCAgMjEsICAtMSwgICA1LAorICA4MCwgIC0xLCAgODEsICAtMSwgIDUyLCAgNjcsICAtMywgIC0xLCAgMzYsICA2NiwgIC0xLCAgNTEsICAyMCwgIC05LCAgLTUsCisgIC0xLCAgNjUsICAtMSwgICA0LCAgNjQsICAtMSwgIDM1LCAgNTAsICAtMSwgIDE5LCAgNDksICAtNywgIC01LCAgLTMsICAtMSwKKyAgIDMsICA0OCwgIDM0LCAgMTgsICAtMSwgIDMzLCAgLTEsICAgMiwgIDMyLCAgLTMsICAtMSwgIDE3LCAgIDEsICAtMSwgIDE2LAorICAgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHRhYl9jMFtdID0KK3sKKyAtMjksIC0yMSwgLTEzLCAgLTcsICAtMywgIC0xLCAgMTEsICAxNSwgIC0xLCAgMTMsICAxNCwgIC0zLCAgLTEsICAgNywgICA1LAorICAgOSwgIC0zLCAgLTEsICAgNiwgICAzLCAgLTEsICAxMCwgIDEyLCAgLTMsICAtMSwgICAyLCAgIDEsICAtMSwgICA0LCAgIDgsCisgICAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgdGFiX2MxW10gPQoreworIC0xNSwgIC03LCAgLTMsICAtMSwgIDE1LCAgMTQsICAtMSwgIDEzLCAgMTIsICAtMywgIC0xLCAgMTEsICAxMCwgIC0xLCAgIDksCisgICA4LCAgLTcsICAtMywgIC0xLCAgIDcsICAgNiwgIC0xLCAgIDUsICAgNCwgIC0zLCAgLTEsICAgMywgICAyLCAgLTEsICAgMSwKKyAgIDAKK307CisKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ld2h1ZmYgaHRbXSA9IAoreworIHsgLyogMCAqLyAwICwgdGFiMCAgfSAsCisgeyAvKiAyICovIDAgLCB0YWIxICB9ICwKKyB7IC8qIDMgKi8gMCAsIHRhYjIgIH0gLAorIHsgLyogMyAqLyAwICwgdGFiMyAgfSAsCisgeyAvKiAwICovIDAgLCB0YWIwICB9ICwKKyB7IC8qIDQgKi8gMCAsIHRhYjUgIH0gLAorIHsgLyogNCAqLyAwICwgdGFiNiAgfSAsCisgeyAvKiA2ICovIDAgLCB0YWI3ICB9ICwKKyB7IC8qIDYgKi8gMCAsIHRhYjggIH0gLAorIHsgLyogNiAqLyAwICwgdGFiOSAgfSAsCisgeyAvKiA4ICovIDAgLCB0YWIxMCB9ICwKKyB7IC8qIDggKi8gMCAsIHRhYjExIH0gLAorIHsgLyogOCAqLyAwICwgdGFiMTIgfSAsCisgeyAvKiAxNiAqLyAwICwgdGFiMTMgfSAsCisgeyAvKiAwICAqLyAwICwgdGFiMCAgfSAsCisgeyAvKiAxNiAqLyAwICwgdGFiMTUgfSAsCisKKyB7IC8qIDE2ICovIDEgLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDIgLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDMgLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDQgLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDYgLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDggLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDEwLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDEzLCB0YWIxNiB9ICwKKyB7IC8qIDE2ICovIDQgLCB0YWIyNCB9ICwKKyB7IC8qIDE2ICovIDUgLCB0YWIyNCB9ICwKKyB7IC8qIDE2ICovIDYgLCB0YWIyNCB9ICwKKyB7IC8qIDE2ICovIDcgLCB0YWIyNCB9ICwKKyB7IC8qIDE2ICovIDggLCB0YWIyNCB9ICwKKyB7IC8qIDE2ICovIDkgLCB0YWIyNCB9ICwKKyB7IC8qIDE2ICovIDExLCB0YWIyNCB9ICwKKyB7IC8qIDE2ICovIDEzLCB0YWIyNCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ld2h1ZmYgaHRjW10gPSAKK3sKKyB7IC8qIDEgLCAxICwgKi8gMCAsIHRhYl9jMCB9ICwKKyB7IC8qIDEgLCAxICwgKi8gMCAsIHRhYl9jMSB9Cit9OworCisgICAgLyogKklOREVOVC1PTiogKi8KZGlmZiAtLWdpdCBhL21wZ2xpYi9pbnRlcmZhY2UuYyBiL21wZ2xpYi9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTMzOGFlCi0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsNjk1IEBACisvKgorICogaW50ZXJmYWNlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCBUaGUgTC5BLk0uRS4gcHJvamVjdAorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgSGlwcCwgc2VlIGFsc28gQVVUSE9SUyBhbmQgUkVBRE1FLgorICogIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworLyogJElkOiBpbnRlcmZhY2UuYyx2IDEuNTIuMi40IDIwMTAvMDMvMjIgMTQ6MTc6MTQgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAidGFiaW5pdC5oIgorI2luY2x1ZGUgImxheWVyMy5oIgorI2luY2x1ZGUgImxhbWUuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisjaW5jbHVkZSAiVmJyVGFnLmgiCisjaW5jbHVkZSAiZGVjb2RlX2kzODYuaCIKKworI2luY2x1ZGUgImxheWVyMS5oIgorI2luY2x1ZGUgImxheWVyMi5oIgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKKy8qICNkZWZpbmUgSElQX0RFQlVHICovCisKK2ludAorSW5pdE1QMyhQTVBTVFIgbXApCit7CisgICAgbWVtc2V0KG1wLCAwLCBzaXplb2YoTVBTVFIpKTsKKworICAgIG1wLT5mcmFtZXNpemUgPSAwOworICAgIG1wLT5udW1fZnJhbWVzID0gMDsKKyAgICBtcC0+ZW5jX2RlbGF5ID0gLTE7CisgICAgbXAtPmVuY19wYWRkaW5nID0gLTE7CisgICAgbXAtPnZicl9oZWFkZXIgPSAwOworICAgIG1wLT5oZWFkZXJfcGFyc2VkID0gMDsKKyAgICBtcC0+c2lkZV9wYXJzZWQgPSAwOworICAgIG1wLT5kYXRhX3BhcnNlZCA9IDA7CisgICAgbXAtPmZyZWVfZm9ybWF0ID0gMDsKKyAgICBtcC0+b2xkX2ZyZWVfZm9ybWF0ID0gMDsKKyAgICBtcC0+c3NpemUgPSAwOworICAgIG1wLT5kc2l6ZSA9IDA7CisgICAgbXAtPmZzaXplb2xkID0gLTE7CisgICAgbXAtPmJzaXplID0gMDsKKyAgICBtcC0+aGVhZCA9IG1wLT50YWlsID0gTlVMTDsKKyAgICBtcC0+ZnIuc2luZ2xlID0gLTE7CisgICAgbXAtPmJzbnVtID0gMDsKKyAgICBtcC0+d29yZHBvaW50ZXIgPSBtcC0+YnNzcGFjZVttcC0+YnNudW1dICsgNTEyOworICAgIG1wLT5iaXRpbmRleCA9IDA7CisgICAgbXAtPnN5bnRoX2JvID0gMTsKKyAgICBtcC0+c3luY19iaXRzdHJlYW0gPSAxOworCisgICAgbWFrZV9kZWNvZGVfdGFibGVzKDMyNzY3KTsKKworICAgIGluaXRfbGF5ZXIzKFNCTElNSVQpOworCisgICAgaW5pdF9sYXllcjIoKTsKKworICAgIHJldHVybiAxOworfQorCit2b2lkCitFeGl0TVAzKFBNUFNUUiBtcCkKK3sKKyAgICBzdHJ1Y3QgYnVmICpiLCAqYm47CisKKyAgICBiID0gbXAtPnRhaWw7CisgICAgd2hpbGUgKGIpIHsKKyAgICAgICAgZnJlZShiLT5wbnQpOworICAgICAgICBibiA9IGItPm5leHQ7CisgICAgICAgIGZyZWUoYik7CisgICAgICAgIGIgPSBibjsKKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmICoKK2FkZGJ1ZihQTVBTVFIgbXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgc3RydWN0IGJ1ZiAqbmJ1ZjsKKworICAgIG5idWYgPSAoc3RydWN0IGJ1ZiAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBidWYpKTsKKyAgICBpZiAoIW5idWYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJoaXA6IGFkZGJ1ZigpIE91dCBvZiBtZW1vcnkhXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5idWYtPnBudCA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYygoc2l6ZV90KSBzaXplKTsKKyAgICBpZiAoIW5idWYtPnBudCkgeworICAgICAgICBmcmVlKG5idWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmJ1Zi0+c2l6ZSA9IHNpemU7CisgICAgbWVtY3B5KG5idWYtPnBudCwgYnVmLCAoc2l6ZV90KSBzaXplKTsKKyAgICBuYnVmLT5uZXh0ID0gTlVMTDsKKyAgICBuYnVmLT5wcmV2ID0gbXAtPmhlYWQ7CisgICAgbmJ1Zi0+cG9zID0gMDsKKworICAgIGlmICghbXAtPnRhaWwpIHsKKyAgICAgICAgbXAtPnRhaWwgPSBuYnVmOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbXAtPmhlYWQtPm5leHQgPSBuYnVmOworICAgIH0KKworICAgIG1wLT5oZWFkID0gbmJ1ZjsKKyAgICBtcC0+YnNpemUgKz0gc2l6ZTsKKworICAgIHJldHVybiBuYnVmOworfQorCit2b2lkCityZW1vdmVfYnVmKFBNUFNUUiBtcCkKK3sKKyAgICBzdHJ1Y3QgYnVmICpidWYgPSBtcC0+dGFpbDsKKworICAgIG1wLT50YWlsID0gYnVmLT5uZXh0OworICAgIGlmIChtcC0+dGFpbCkKKyAgICAgICAgbXAtPnRhaWwtPnByZXYgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBtcC0+dGFpbCA9IG1wLT5oZWFkID0gTlVMTDsKKyAgICB9CisKKyAgICBmcmVlKGJ1Zi0+cG50KTsKKyAgICBmcmVlKGJ1Zik7CisKK30KKworc3RhdGljIGludAorcmVhZF9idWZfYnl0ZShQTVBTVFIgbXApCit7CisgICAgdW5zaWduZWQgaW50IGI7CisKKyAgICBpbnQgICAgIHBvczsKKworCisgICAgcG9zID0gbXAtPnRhaWwtPnBvczsKKyAgICB3aGlsZSAocG9zID49IG1wLT50YWlsLT5zaXplKSB7CisgICAgICAgIHJlbW92ZV9idWYobXApOworICAgICAgICBpZiAoIW1wLT50YWlsKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhpcDogRmF0YWwgZXJyb3IhIHRyaWVkIHRvIHJlYWQgcGFzdCBtcCBidWZmZXJcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBtcC0+dGFpbC0+cG9zOworICAgIH0KKworICAgIGIgPSBtcC0+dGFpbC0+cG50W3Bvc107CisgICAgbXAtPmJzaXplLS07CisgICAgbXAtPnRhaWwtPnBvcysrOworCisKKyAgICByZXR1cm4gYjsKK30KKworCisKK3N0YXRpYyB2b2lkCityZWFkX2hlYWQoUE1QU1RSIG1wKQoreworICAgIHVuc2lnbmVkIGxvbmcgaGVhZDsKKworICAgIGhlYWQgPSByZWFkX2J1Zl9ieXRlKG1wKTsKKyAgICBoZWFkIDw8PSA4OworICAgIGhlYWQgfD0gcmVhZF9idWZfYnl0ZShtcCk7CisgICAgaGVhZCA8PD0gODsKKyAgICBoZWFkIHw9IHJlYWRfYnVmX2J5dGUobXApOworICAgIGhlYWQgPDw9IDg7CisgICAgaGVhZCB8PSByZWFkX2J1Zl9ieXRlKG1wKTsKKworICAgIG1wLT5oZWFkZXIgPSBoZWFkOworfQorCisKKworCitzdGF0aWMgdm9pZAorY29weV9tcChQTVBTVFIgbXAsIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICpwdHIpCit7CisgICAgaW50ICAgICBsZW4gPSAwOworCisgICAgd2hpbGUgKGxlbiA8IHNpemUgJiYgbXAtPnRhaWwpIHsKKyAgICAgICAgaW50ICAgICBubGVuOworICAgICAgICBpbnQgICAgIGJsZW4gPSBtcC0+dGFpbC0+c2l6ZSAtIG1wLT50YWlsLT5wb3M7CisgICAgICAgIGlmICgoc2l6ZSAtIGxlbikgPD0gYmxlbikgeworICAgICAgICAgICAgbmxlbiA9IHNpemUgLSBsZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBubGVuID0gYmxlbjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocHRyICsgbGVuLCBtcC0+dGFpbC0+cG50ICsgbXAtPnRhaWwtPnBvcywgKHNpemVfdCkgbmxlbik7CisgICAgICAgIGxlbiArPSBubGVuOworICAgICAgICBtcC0+dGFpbC0+cG9zICs9IG5sZW47CisgICAgICAgIG1wLT5ic2l6ZSAtPSBubGVuOworICAgICAgICBpZiAobXAtPnRhaWwtPnBvcyA9PSBtcC0+dGFpbC0+c2l6ZSkgeworICAgICAgICAgICAgcmVtb3ZlX2J1ZihtcCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIG51bWJlciBvZiBieXRlcyBuZWVkZWQgYnkgR2V0VmJyVGFnIHRvIHBhcnNlIGhlYWRlciAqLworI2RlZmluZSBYSU5HX0hFQURFUl9TSVpFIDE5NAorCisvKgordHJhdmVyc2UgbXAgZGF0YSBzdHJ1Y3R1cmUgd2l0aG91dCBjaGFuZ2luZyBpdAorKGp1c3QgbGlrZSBzeW5jX2J1ZmZlcikKK3B1bGwgb3V0IFhpbmcgYnl0ZXMKK2NhbGwgdmJyIGhlYWRlciBjaGVjayBjb2RlIGZyb20gTEFNRQoraWYgd2UgZmluZCBhIGhlYWRlciwgcGFyc2UgaXQgYW5kIGFsc28gY29tcHV0ZSB0aGUgVkJSIGhlYWRlciBzaXplCitpZiBubyBoZWFkZXIsIGRvIG5vdGhpbmcuCisKK2J5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGJlZm9yZSBNUEVHIGhlYWRlci4gIHNraXAgdGhpcyBtYW55IGJ5dGVzCitiZWZvcmUgc3RhcnRpbmcgdG8gcmVhZAorcmV0dXJuIHZhbHVlOiBudW1iZXIgb2YgYnl0ZXMgaW4gVkJSIGhlYWRlciwgaW5jbHVkaW5nIHN5bmN3b3JkCisqLworc3RhdGljIGludAorY2hlY2tfdmJyX2hlYWRlcihQTVBTVFIgbXAsIGludCBieXRlcykKK3sKKyAgICBpbnQgICAgIGksIHBvczsKKyAgICBzdHJ1Y3QgYnVmICpidWYgPSBtcC0+dGFpbDsKKyAgICB1bnNpZ25lZCBjaGFyIHhpbmdbWElOR19IRUFERVJfU0laRV07CisgICAgVkJSVEFHREFUQSBwVGFnRGF0YTsKKworICAgIHBvcyA9IGJ1Zi0+cG9zOworICAgIC8qIHNraXAgdG8gdmFsaWQgaGVhZGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzOyArK2kpIHsKKyAgICAgICAgd2hpbGUgKHBvcyA+PSBidWYtPnNpemUpIHsKKyAgICAgICAgICAgIGJ1ZiA9IGJ1Zi0+bmV4dDsKKyAgICAgICAgICAgIGlmICghYnVmKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLyogZmF0YWwgZXJyb3IgKi8KKyAgICAgICAgICAgIHBvcyA9IGJ1Zi0+cG9zOworICAgICAgICB9CisgICAgICAgICsrcG9zOworICAgIH0KKyAgICAvKiBub3cgcmVhZCBoZWFkZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWElOR19IRUFERVJfU0laRTsgKytpKSB7CisgICAgICAgIHdoaWxlIChwb3MgPj0gYnVmLT5zaXplKSB7CisgICAgICAgICAgICBidWYgPSBidWYtPm5leHQ7CisgICAgICAgICAgICBpZiAoIWJ1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7IC8qIGZhdGFsIGVycm9yICovCisgICAgICAgICAgICBwb3MgPSBidWYtPnBvczsKKyAgICAgICAgfQorICAgICAgICB4aW5nW2ldID0gYnVmLT5wbnRbcG9zXTsKKyAgICAgICAgKytwb3M7CisgICAgfQorCisgICAgLyogY2hlY2sgZmlyc3QgYnl0ZXMgZm9yIFhpbmcgaGVhZGVyICovCisgICAgbXAtPnZicl9oZWFkZXIgPSBHZXRWYnJUYWcoJnBUYWdEYXRhLCB4aW5nKTsKKyAgICBpZiAobXAtPnZicl9oZWFkZXIpIHsKKyAgICAgICAgbXAtPm51bV9mcmFtZXMgPSBwVGFnRGF0YS5mcmFtZXM7CisgICAgICAgIG1wLT5lbmNfZGVsYXkgPSBwVGFnRGF0YS5lbmNfZGVsYXk7CisgICAgICAgIG1wLT5lbmNfcGFkZGluZyA9IHBUYWdEYXRhLmVuY19wYWRkaW5nOworCisgICAgICAgIC8qIGZwcmludGYoc3RkZXJyLCJoaXA6IGRlbGF5czogJWkgJWkgXG4iLG1wLT5lbmNfZGVsYXksbXAtPmVuY19wYWRkaW5nKTsgKi8KKyAgICAgICAgLyogZnByaW50ZihzdGRlcnIsImhpcDogWGluZyBWQlIgaGVhZGVyIGRlY3RlY3RlZC4gIE1QMyBmaWxlIGhhcyAlaSBmcmFtZXNcbiIsIHBUYWdEYXRhLmZyYW1lcyk7ICovCisgICAgICAgIGlmIChwVGFnRGF0YS5oZWFkZXJzaXplIDwgMSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gcFRhZ0RhdGEuaGVhZGVyc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworc3RhdGljIGludAorc3luY19idWZmZXIoUE1QU1RSIG1wLCBpbnQgZnJlZV9tYXRjaCkKK3sKKyAgICAvKiB0cmF2ZXJzZSBtcCBzdHJ1Y3R1cmUgd2l0aG91dCBtb2RpZnlpbmcgcG9pbnRlcnMsIGxvb2tpbmcKKyAgICAgKiBmb3IgYSBmcmFtZSB2YWxpZCBoZWFkZXIuCisgICAgICogaWYgZnJlZV9mb3JtYXQsIHZhbGlkIGhlYWRlciBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZQorICAgICAqIHNhbXBsZXJhdGUuICAgCisgICAgICogcmV0dXJuIG51bWJlciBvZiBieXRlcyBpbiBtcCwgYmVmb3JlIHRoZSBoZWFkZXIKKyAgICAgKiByZXR1cm4gLTEgaWYgaGVhZGVyIGlzIG5vdCBmb3VuZAorICAgICAqLworICAgIHVuc2lnbmVkIGludCBiWzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgaW50ICAgICBpLCBoLCBwb3M7CisgICAgc3RydWN0IGJ1ZiAqYnVmID0gbXAtPnRhaWw7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHBvcyA9IGJ1Zi0+cG9zOworICAgIGZvciAoaSA9IDA7IGkgPCBtcC0+YnNpemU7IGkrKykgeworICAgICAgICAvKiBnZXQgNCBieXRlcyAqLworCisgICAgICAgIGJbMF0gPSBiWzFdOworICAgICAgICBiWzFdID0gYlsyXTsKKyAgICAgICAgYlsyXSA9IGJbM107CisgICAgICAgIHdoaWxlIChwb3MgPj0gYnVmLT5zaXplKSB7CisgICAgICAgICAgICBidWYgPSBidWYtPm5leHQ7CisgICAgICAgICAgICBwb3MgPSBidWYtPnBvczsKKyAgICAgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggZGF0YSB0byByZWFkIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiWzNdID0gYnVmLT5wbnRbcG9zXTsKKyAgICAgICAgKytwb3M7CisKKyAgICAgICAgaWYgKGkgPj0gMykgeworICAgICAgICAgICAgc3RydWN0IGZyYW1lICpmciA9ICZtcC0+ZnI7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGhlYWQ7CisKKyAgICAgICAgICAgIGhlYWQgPSBiWzBdOworICAgICAgICAgICAgaGVhZCA8PD0gODsKKyAgICAgICAgICAgIGhlYWQgfD0gYlsxXTsKKyAgICAgICAgICAgIGhlYWQgPDw9IDg7CisgICAgICAgICAgICBoZWFkIHw9IGJbMl07CisgICAgICAgICAgICBoZWFkIDw8PSA4OworICAgICAgICAgICAgaGVhZCB8PSBiWzNdOworICAgICAgICAgICAgaCA9IGhlYWRfY2hlY2soaGVhZCwgZnItPmxheSk7CisKKyAgICAgICAgICAgIGlmIChoICYmIGZyZWVfbWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAvKiBqdXN0IHRvIGJlIGV2ZW4gbW9yZSB0aG9yb3VnaCwgbWF0Y2ggdGhlIHNhbXBsZSByYXRlICovCisgICAgICAgICAgICAgICAgaW50ICAgICBtb2RlLCBzdGVyZW8sIHNhbXBsaW5nX2ZyZXF1ZW5jeSwgbXBlZzI1LCBsc2Y7CisKKyAgICAgICAgICAgICAgICBpZiAoaGVhZCAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgICAgICAgICBsc2YgPSAoaGVhZCAmICgxIDw8IDE5KSkgPyAweDAgOiAweDE7CisgICAgICAgICAgICAgICAgICAgIG1wZWcyNSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsc2YgPSAxOworICAgICAgICAgICAgICAgICAgICBtcGVnMjUgPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1vZGUgPSAoKGhlYWQgPj4gNikgJiAweDMpOworICAgICAgICAgICAgICAgIHN0ZXJlbyA9IChtb2RlID09IE1QR19NRF9NT05PKSA/IDEgOiAyOworCisgICAgICAgICAgICAgICAgaWYgKG1wZWcyNSkKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdfZnJlcXVlbmN5ID0gNiArICgoaGVhZCA+PiAxMCkgJiAweDMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdfZnJlcXVlbmN5ID0gKChoZWFkID4+IDEwKSAmIDB4MykgKyAobHNmICogMyk7CisgICAgICAgICAgICAgICAgaCA9ICgoc3RlcmVvID09IGZyLT5zdGVyZW8pICYmIChsc2YgPT0gZnItPmxzZikgJiYgKG1wZWcyNSA9PSBmci0+bXBlZzI1KSAmJgorICAgICAgICAgICAgICAgICAgICAgKHNhbXBsaW5nX2ZyZXF1ZW5jeSA9PSBmci0+c2FtcGxpbmdfZnJlcXVlbmN5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworCit2b2lkCitkZWNvZGVfcmVzZXQoUE1QU1RSIG1wKQoreworI2lmIDAKKyAgICByZW1vdmVfYnVmKG1wKTsKKyAgICAvKiBzdGFydCBsb29raW5nIGZvciBuZXh0IGZyYW1lICovCisgICAgLyogbXAtPmZzaXplb2xkID0gbXAtPmZyYW1lc2l6ZTsgKi8KKyAgICBtcC0+ZnNpemVvbGQgPSAtMTsKKyAgICBtcC0+b2xkX2ZyZWVfZm9ybWF0ID0gbXAtPmZyZWVfZm9ybWF0OworICAgIG1wLT5mcmFtZXNpemUgPSAwOworICAgIG1wLT5oZWFkZXJfcGFyc2VkID0gMDsKKyAgICBtcC0+c2lkZV9wYXJzZWQgPSAwOworICAgIG1wLT5kYXRhX3BhcnNlZCA9IDA7CisgICAgbXAtPnN5bmNfYml0c3RyZWFtID0gMTsgLyogVE9ETyBjaGVjayBpZiB0aGlzIGlzIHJpZ2h0ICovCisjZWxzZQorICAgIEluaXRNUDMobXApOyAgICAgICAgLyogTGVzcyBlcnJvciBwcm9uZSB0byBqdXN0IHRvIHJlaW5pdGlhbGlzZS4gKi8KKyNlbmRpZgorfQorCitpbnQKK2F1ZGlvZGF0YV9wcmVjZWRlc2ZyYW1lcyhQTVBTVFIgbXApCit7CisgICAgaWYgKG1wLT5mci5sYXkgPT0gMykKKyAgICAgICAgcmV0dXJuIGxheWVyM19hdWRpb2RhdGFfcHJlY2VkZXNmcmFtZXMobXApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8qIEZvciBMYXllciAxICYgMiB0aGUgYXVkaW8gZGF0YSBzdGFydHMgYXQgdGhlIGZyYW1lIHRoYXQgZGVzY3JpYmVzIGl0LCBzbyBubyBhdWRpbyBkYXRhIHByZWNlZGVzLiAqLworfQorCitzdGF0aWMgaW50CitkZWNvZGVNUDNfY2xpcGNob2ljZShQTVBTVFIgbXAsIHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaXNpemUsIGNoYXIgKm91dCwgaW50ICpkb25lLAorICAgICAgICAgICAgICAgICAgICAgaW50ICgqc3ludGhfMXRvMV9tb25vX3B0cikgKFBNUFNUUiwgcmVhbCAqLCB1bnNpZ25lZCBjaGFyICosIGludCAqKSwKKyAgICAgICAgICAgICAgICAgICAgIGludCAoKnN5bnRoXzF0bzFfcHRyKSAoUE1QU1RSLCByZWFsICosIGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKikpCit7CisgICAgaW50ICAgICBpLCBpcmV0LCBiaXRzLCBieXRlczsKKworICAgIGlmIChpbiAmJiBpc2l6ZSAmJiBhZGRidWYobXAsIGluLCBpc2l6ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE1QM19FUlI7CisKKyAgICAvKiBGaXJzdCBkZWNvZGUgaGVhZGVyICovCisgICAgaWYgKCFtcC0+aGVhZGVyX3BhcnNlZCkgeworCisgICAgICAgIGlmIChtcC0+ZnNpemVvbGQgPT0gLTEgfHwgbXAtPnN5bmNfYml0c3RyZWFtKSB7CisgICAgICAgICAgICBpbnQgICAgIHZicmJ5dGVzOworICAgICAgICAgICAgbXAtPnN5bmNfYml0c3RyZWFtID0gMDsKKworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBjYWxsLiAgIHN5bmMgd2l0aCBhbnl0aGluZyAqLworICAgICAgICAgICAgLyogYnl0ZXM9IG51bWJlciBvZiBieXRlcyBiZWZvcmUgaGVhZGVyICovCisgICAgICAgICAgICBieXRlcyA9IHN5bmNfYnVmZmVyKG1wLCAwKTsKKworICAgICAgICAgICAgLyogbm93IGxvb2sgZm9yIFhpbmcgVkJSIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKG1wLT5ic2l6ZSA+PSBieXRlcyArIFhJTkdfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAvKiB2YnJieXRlcyA9IG51bWJlciBvZiBieXRlcyBpbiBlbnRpcmUgdmJyIGhlYWRlciAqLworICAgICAgICAgICAgICAgIHZicmJ5dGVzID0gY2hlY2tfdmJyX2hlYWRlcihtcCwgYnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBkYXRhIHRvIGxvb2sgZm9yIFhpbmcgaGVhZGVyICovCisjaWZkZWYgSElQX0RFQlVHCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJoaXA6IG5vdCBlbm91Z2ggZGF0YSB0byBsb29rIGZvciBYaW5nIGhlYWRlclxuIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gTVAzX05FRURfTU9SRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1wLT52YnJfaGVhZGVyKSB7CisgICAgICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBlbm91Z2ggZGF0YSB0byBwYXJzZSBlbnRpcmUgWGluZyBoZWFkZXI/ICovCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzICsgdmJyYnl0ZXMgPiBtcC0+YnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZnByaW50ZihzdGRlcnIsImhpcDogbm90IGVub3VnaCBkYXRhIHRvIHBhcnNlIGVudGlyZSBYaW5nIGhlYWRlclxuIik7ICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNUDNfTkVFRF9NT1JFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHJlYWQgaW4gWGluZyBoZWFkZXIuICBCdWZmZXIgZGF0YSBpbiBjYXNlIGl0CisgICAgICAgICAgICAgICAgICogaXMgdXNlZCBieSBhIG5vbiB6ZXJvIG1haW5fZGF0YV9iZWdpbiBmb3IgdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgKiBmcmFtZSwgYnV0IG90aGVyd2lzZSBkb250IGRlY29kZSBYaW5nIGhlYWRlciAqLworI2lmZGVmIEhJUF9ERUJVRworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaGlwOiBmb3VuZCB4aW5nIGhlYWRlciwgc2tpcHBpbmcgJWkgYnl0ZXNcbiIsIHZicmJ5dGVzICsgYnl0ZXMpOworI2VuZGlmCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZicmJ5dGVzICsgYnl0ZXM7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgcmVhZF9idWZfYnl0ZShtcCk7CisgICAgICAgICAgICAgICAgLyogbm93IHdlIG5lZWQgdG8gZmluZCBhbm90aGVyIHN5bmN3b3JkICovCisgICAgICAgICAgICAgICAgLyoganVzdCByZXR1cm4gYW5kIG1ha2UgdXNlciBzZW5kIGluIG1vcmUgZGF0YSAqLworCisgICAgICAgICAgICAgICAgcmV0dXJuIE1QM19ORUVEX01PUkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBtYXRjaCBjaGFubmVscywgc2FtcGxlcmF0ZSwgZXRjLCB3aGVuIHN5bmNpbmcgKi8KKyAgICAgICAgICAgIGJ5dGVzID0gc3luY19idWZmZXIobXAsIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogYnVmZmVyIG5vdyBzeW5jaHJvbml6ZWQgKi8KKyAgICAgICAgaWYgKGJ5dGVzIDwgMCkgeworICAgICAgICAgICAgLyogZnByaW50ZihzdGRlcnIsImhpcDogbmVlZCBtb3JlIGJ5dGVzICVkXG4iLCBieXRlcyk7ICovCisgICAgICAgICAgICByZXR1cm4gTVAzX05FRURfTU9SRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAvKiB0aGVyZSB3ZXJlIHNvbWUgZXh0cmEgYnl0ZXMgaW4gZnJvbnQgb2YgaGVhZGVyLgorICAgICAgICAgICAgICogYml0c3RyZWFtIHByb2JsZW0sIGJ1dCB3ZSBhcmUgbm93IHJlc3luY2VkIAorICAgICAgICAgICAgICogc2hvdWxkIHRyeSB0byBidWZmZXIgcHJldmlvdXMgZGF0YSBpbiBjYXNlIG5ldworICAgICAgICAgICAgICogZnJhbWUgaGFzIG5vbnplcm8gbWFpbl9kYXRhX2JlZ2luLCBidXQgd2UgbmVlZAorICAgICAgICAgICAgICogdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBvdmVyZmxvdyBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50ICAgICBzaXplOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJoaXA6IGJpdHN0cmVhbSBwcm9ibGVtLCByZXN5bmNpbmcgc2tpcHBpbmcgJWQgYnl0ZXMuLi5cbiIsIGJ5dGVzKTsKKyAgICAgICAgICAgIG1wLT5vbGRfZnJlZV9mb3JtYXQgPSAwOworI2lmIDEKKyAgICAgICAgICAgIC8qIEZJWE1FOiBjb3JyZWN0ID8/PyAqLworICAgICAgICAgICAgbXAtPnN5bmNfYml0c3RyZWFtID0gMTsKKyNlbmRpZgorICAgICAgICAgICAgLyogc2tpcCBzb21lIGJ5dGVzLCBidWZmZXIgdGhlIHJlc3QgKi8KKyAgICAgICAgICAgIHNpemUgPSAoaW50KSAobXAtPndvcmRwb2ludGVyIC0gKG1wLT5ic3NwYWNlW21wLT5ic251bV0gKyA1MTIpKTsKKworICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhGUkFNRVNJWkUpIHsKKyAgICAgICAgICAgICAgICAvKiB3b3JkcG9pbnRlciBidWZmZXIgaXMgdHJhc2hlZC4gIHByb2JhYmx5IGNhbnQgcmVjb3ZlciwgYnV0IHRyeSBhbnl3YXkgKi8KKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhpcDogd29yZHBvaW50ZXIgdHJhc2hlZC4gIHNpemU9JWkgKCVpKSAgYnl0ZXM9JWkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgTUFYRlJBTUVTSVpFLCBieXRlcyk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgbXAtPndvcmRwb2ludGVyID0gbXAtPmJzc3BhY2VbbXAtPmJzbnVtXSArIDUxMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVmZmVyIGNvbnRhaW5zICdzaXplJyBkYXRhIHJpZ2h0IG5vdyAKKyAgICAgICAgICAgICAgIHdlIHdhbnQgdG8gYWRkICdieXRlcycgd29ydGggb2YgZGF0YSwgYnV0IGRvIG5vdCAKKyAgICAgICAgICAgICAgIGV4Y2VlZCBNQVhGUkFNRVNJWkUsIHNvIHdlIHRocm91Z2ggYXdheSAnaScgYnl0ZXMgKi8KKyAgICAgICAgICAgIGkgPSAoc2l6ZSArIGJ5dGVzKSAtIE1BWEZSQU1FU0laRTsKKyAgICAgICAgICAgIGZvciAoOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgLS1ieXRlczsKKyAgICAgICAgICAgICAgICByZWFkX2J1Zl9ieXRlKG1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29weV9tcChtcCwgYnl0ZXMsIG1wLT53b3JkcG9pbnRlcik7CisgICAgICAgICAgICBtcC0+ZnNpemVvbGQgKz0gYnl0ZXM7CisgICAgICAgIH0KKworICAgICAgICByZWFkX2hlYWQobXApOworICAgICAgICBkZWNvZGVfaGVhZGVyKCZtcC0+ZnIsIG1wLT5oZWFkZXIpOworICAgICAgICBtcC0+aGVhZGVyX3BhcnNlZCA9IDE7CisgICAgICAgIG1wLT5mcmFtZXNpemUgPSBtcC0+ZnIuZnJhbWVzaXplOworICAgICAgICBtcC0+ZnJlZV9mb3JtYXQgPSAobXAtPmZyYW1lc2l6ZSA9PSAwKTsKKworICAgICAgICBpZiAobXAtPmZyLmxzZikKKyAgICAgICAgICAgIG1wLT5zc2l6ZSA9IChtcC0+ZnIuc3RlcmVvID09IDEpID8gOSA6IDE3OworICAgICAgICBlbHNlCisgICAgICAgICAgICBtcC0+c3NpemUgPSAobXAtPmZyLnN0ZXJlbyA9PSAxKSA/IDE3IDogMzI7CisgICAgICAgIGlmIChtcC0+ZnIuZXJyb3JfcHJvdGVjdGlvbikKKyAgICAgICAgICAgIG1wLT5zc2l6ZSArPSAyOworCisgICAgICAgIG1wLT5ic251bSA9IDEgLSBtcC0+YnNudW07IC8qIHRvZ2dsZSBidWZmZXIgKi8KKyAgICAgICAgbXAtPndvcmRwb2ludGVyID0gbXAtPmJzc3BhY2VbbXAtPmJzbnVtXSArIDUxMjsKKyAgICAgICAgbXAtPmJpdGluZGV4ID0gMDsKKworICAgICAgICAvKiBmb3IgdmVyeSBmaXJzdCBoZWFkZXIsIG5ldmVyIHBhcnNlIHJlc3Qgb2YgZGF0YSAqLworICAgICAgICBpZiAobXAtPmZzaXplb2xkID09IC0xKSB7CisjaWZkZWYgSElQX0RFQlVHCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhpcDogbm90IHBhcnNpbmcgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgb2YgdGhlIGZpcnN0IGhlYWRlclxuIik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBNUDNfTkVFRF9NT1JFOworICAgICAgICB9CisgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgaGVhZGVyIHBhcnNpbmcgYmxvY2sgKi8KKworICAgIC8qIG5vdyBkZWNvZGUgc2lkZSBpbmZvcm1hdGlvbiAqLworICAgIGlmICghbXAtPnNpZGVfcGFyc2VkKSB7CisKKyAgICAgICAgLyogTGF5ZXIgMyBvbmx5ICovCisgICAgICAgIGlmIChtcC0+ZnIubGF5ID09IDMpIHsKKyAgICAgICAgICAgIGlmIChtcC0+YnNpemUgPCBtcC0+c3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIE1QM19ORUVEX01PUkU7CisKKyAgICAgICAgICAgIGNvcHlfbXAobXAsIG1wLT5zc2l6ZSwgbXAtPndvcmRwb2ludGVyKTsKKworICAgICAgICAgICAgaWYgKG1wLT5mci5lcnJvcl9wcm90ZWN0aW9uKQorICAgICAgICAgICAgICAgIGdldGJpdHMobXAsIDE2KTsKKyAgICAgICAgICAgIGJpdHMgPSBkb19sYXllcjNfc2lkZWluZm8obXApOworICAgICAgICAgICAgLyogYml0cyA9IGFjdHVhbCBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcGFyc2UgdGhpcyBmcmFtZSAqLworICAgICAgICAgICAgLyogY2FuIGJlIG5lZ2F0aXZlLCBpZiBhbGwgYml0cyBuZWVkZWQgYXJlIGluIHRoZSByZXNlcnZvaXIgKi8KKyAgICAgICAgICAgIGlmIChiaXRzIDwgMCkKKyAgICAgICAgICAgICAgICBiaXRzID0gMDsKKworICAgICAgICAgICAgLyogcmVhZCBqdXN0IGFzIG1hbnkgYnl0ZXMgYXMgbmVjZXNzYXJ5IGJlZm9yZSBkZWNvZGluZyAqLworICAgICAgICAgICAgbXAtPmRzaXplID0gKGJpdHMgKyA3KSAvIDg7CisKKyNpZmRlZiBISVBfREVCVUcKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiaGlwOiAlZCBiaXRzIG5lZWRlZCB0byBwYXJzZSBsYXllciBJSUkgZnJhbWUsIG51bWJlciBvZiBieXRlcyB0byByZWFkIGJlZm9yZSBkZWNvZGluZyBkc2l6ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBiaXRzLCBtcC0+ZHNpemUpOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIHRoaXMgd2lsbCBmb3JjZSBtcGdsaWIgdG8gcmVhZCBlbnRpcmUgZnJhbWUgYmVmb3JlIGRlY29kaW5nICovCisgICAgICAgICAgICAvKiBtcC0+ZHNpemU9IG1wLT5mcmFtZXNpemUgLSBtcC0+c3NpemU7ICovCisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIExheWVycyAxIGFuZCAyICovCisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBpbnB1dCBkYXRhICovCisgICAgICAgICAgICBpZiAobXAtPmZyLmZyYW1lc2l6ZSA+IG1wLT5ic2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTVAzX05FRURfTU9SRTsKKworICAgICAgICAgICAgLyogdGFrZXMgY2FyZSB0aGF0IHRoZSByaWdodCBhbW91bnQgb2YgZGF0YSBpcyBjb3BpZWQgaW50byB3b3JkcG9pbnRlciAqLworICAgICAgICAgICAgbXAtPmRzaXplID0gbXAtPmZyLmZyYW1lc2l6ZTsKKyAgICAgICAgICAgIG1wLT5zc2l6ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtcC0+c2lkZV9wYXJzZWQgPSAxOworICAgIH0KKworICAgIC8qIG5vdyBkZWNvZGUgbWFpbiBkYXRhICovCisgICAgaXJldCA9IE1QM19ORUVEX01PUkU7CisgICAgaWYgKCFtcC0+ZGF0YV9wYXJzZWQpIHsKKyAgICAgICAgaWYgKG1wLT5kc2l6ZSA+IG1wLT5ic2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIE1QM19ORUVEX01PUkU7CisgICAgICAgIH0KKworICAgICAgICBjb3B5X21wKG1wLCBtcC0+ZHNpemUsIG1wLT53b3JkcG9pbnRlcik7CisKKyAgICAgICAgKmRvbmUgPSAwOworCisgICAgICAgIC8qZG9fbGF5ZXIzKCZtcC0+ZnIsKHVuc2lnbmVkIGNoYXIgKikgb3V0LGRvbmUpOyAqLworICAgICAgICBzd2l0Y2ggKG1wLT5mci5sYXkpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKG1wLT5mci5lcnJvcl9wcm90ZWN0aW9uKQorICAgICAgICAgICAgICAgIGdldGJpdHMobXAsIDE2KTsKKworICAgICAgICAgICAgZG9fbGF5ZXIxKG1wLCAodW5zaWduZWQgY2hhciAqKSBvdXQsIGRvbmUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKG1wLT5mci5lcnJvcl9wcm90ZWN0aW9uKQorICAgICAgICAgICAgICAgIGdldGJpdHMobXAsIDE2KTsKKworICAgICAgICAgICAgZG9fbGF5ZXIyKG1wLCAodW5zaWduZWQgY2hhciAqKSBvdXQsIGRvbmUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZG9fbGF5ZXIzKG1wLCAodW5zaWduZWQgY2hhciAqKSBvdXQsIGRvbmUsIHN5bnRoXzF0bzFfbW9ub19wdHIsIHN5bnRoXzF0bzFfcHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJoaXA6IGludmFsaWQgbGF5ZXIgJWRcbiIsIG1wLT5mci5sYXkpOworICAgICAgICB9CisKKyAgICAgICAgbXAtPndvcmRwb2ludGVyID0gbXAtPmJzc3BhY2VbbXAtPmJzbnVtXSArIDUxMiArIG1wLT5zc2l6ZSArIG1wLT5kc2l6ZTsKKworICAgICAgICBtcC0+ZGF0YV9wYXJzZWQgPSAxOworICAgICAgICBpcmV0ID0gTVAzX09LOworICAgIH0KKworCisgICAgLyogcmVtYWluaW5nIGJpdHMgYXJlIGFuY2lsbGFyeSBkYXRhLCBvciByZXNlcnZvaXIgZm9yIG5leHQgZnJhbWUgCisgICAgICogSWYgZnJlZSBmb3JtYXQsIHNjYW4gc3RyZWFtIGxvb2tpbmcgZm9yIG5leHQgZnJhbWUgdG8gZGV0ZXJtaW5lCisgICAgICogbXAtPmZyYW1lc2l6ZSAqLworICAgIGlmIChtcC0+ZnJlZV9mb3JtYXQpIHsKKyAgICAgICAgaWYgKG1wLT5vbGRfZnJlZV9mb3JtYXQpIHsKKyAgICAgICAgICAgIC8qIGZyZWUgZm9ybWF0LiAgYml0cmF0ZSBtdXN0IG5vdCB2YXJ5ICovCisgICAgICAgICAgICBtcC0+ZnJhbWVzaXplID0gbXAtPmZzaXplb2xkX25vcGFkZGluZyArIChtcC0+ZnIucGFkZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBieXRlcyA9IHN5bmNfYnVmZmVyKG1wLCAxKTsKKyAgICAgICAgICAgIGlmIChieXRlcyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGlyZXQ7CisgICAgICAgICAgICBtcC0+ZnJhbWVzaXplID0gYnl0ZXMgKyBtcC0+c3NpemUgKyBtcC0+ZHNpemU7CisgICAgICAgICAgICBtcC0+ZnNpemVvbGRfbm9wYWRkaW5nID0gbXAtPmZyYW1lc2l6ZSAtIG1wLT5mci5wYWRkaW5nOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJoaXA6IGZyZWVmb3JtYXQgYml0c3RyZWFtOiAgZXN0aW1hdGVkIGJpdHJhdGU9JWlrYnMgIFxuIiwKKyAgICAgICAgICAgICAgIDgqKDQrbXAtPmZyYW1lc2l6ZSkqZnJlcXNbbXAtPmZyLnNhbXBsaW5nX2ZyZXF1ZW5jeV0vCisgICAgICAgICAgICAgICAoMTAwMCo1NzYqKDItbXAtPmZyLmxzZikpKTsKKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogYnVmZmVyIHRoZSBhbmNpbGxhcnkgZGF0YSBhbmQgcmVzZXJ2b2lyIGZvciBuZXh0IGZyYW1lICovCisgICAgYnl0ZXMgPSBtcC0+ZnJhbWVzaXplIC0gKG1wLT5zc2l6ZSArIG1wLT5kc2l6ZSk7CisgICAgaWYgKGJ5dGVzID4gbXAtPmJzaXplKSB7CisgICAgICAgIHJldHVybiBpcmV0OworICAgIH0KKworICAgIGlmIChieXRlcyA+IDApIHsKKyAgICAgICAgaW50ICAgICBzaXplOworI2lmIDAKKyAgICAgICAgLyogRklYTUU6IHdoaWxlIGxvb3AgT0sgPz8/ICovCisgICAgICAgIHdoaWxlIChieXRlcyA+IDUxMikgeworICAgICAgICAgICAgcmVhZF9idWZfYnl0ZShtcCk7CisgICAgICAgICAgICBieXRlcy0tOworICAgICAgICAgICAgbXAtPmZyYW1lc2l6ZS0tOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgY29weV9tcChtcCwgYnl0ZXMsIG1wLT53b3JkcG9pbnRlcik7CisgICAgICAgIG1wLT53b3JkcG9pbnRlciArPSBieXRlczsKKworICAgICAgICBzaXplID0gKGludCkgKG1wLT53b3JkcG9pbnRlciAtIChtcC0+YnNzcGFjZVttcC0+YnNudW1dICsgNTEyKSk7CisgICAgICAgIGlmIChzaXplID4gTUFYRlJBTUVTSVpFKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhpcDogZmF0YWwgZXJyb3IuICBNQVhGUkFNRVNJWkUgbm90IGxhcmdlIGVub3VnaC5cbiIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKiB0aGUgYWJvdmUgZnJhbWUgaXMgY29tcGxldGVseSBwYXJzZWQuICBzdGFydCBsb29raW5nIGZvciBuZXh0IGZyYW1lICovCisgICAgbXAtPmZzaXplb2xkID0gbXAtPmZyYW1lc2l6ZTsKKyAgICBtcC0+b2xkX2ZyZWVfZm9ybWF0ID0gbXAtPmZyZWVfZm9ybWF0OworICAgIG1wLT5mcmFtZXNpemUgPSAwOworICAgIG1wLT5oZWFkZXJfcGFyc2VkID0gMDsKKyAgICBtcC0+c2lkZV9wYXJzZWQgPSAwOworICAgIG1wLT5kYXRhX3BhcnNlZCA9IDA7CisKKyAgICByZXR1cm4gaXJldDsKK30KKworaW50CitkZWNvZGVNUDMoUE1QU1RSIG1wLCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlzaXplLCBjaGFyICpvdXQsIGludCBvc2l6ZSwgaW50ICpkb25lKQoreworICAgIGlmIChvc2l6ZSA8IDQ2MDgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJoaXA6IEluc3VmZmljaWVudCBtZW1vcnkgZm9yIGRlY29kaW5nIGJ1ZmZlciAlZFxuIiwgb3NpemUpOworICAgICAgICByZXR1cm4gTVAzX0VSUjsKKyAgICB9CisKKyAgICAvKiBwYXNzaW5nIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgd2hpY2ggY2xpcCB0aGUgc2FtcGxlcyAqLworICAgIHJldHVybiBkZWNvZGVNUDNfY2xpcGNob2ljZShtcCwgaW4sIGlzaXplLCBvdXQsIGRvbmUsIHN5bnRoXzF0bzFfbW9ubywgc3ludGhfMXRvMSk7Cit9CisKK2ludAorZGVjb2RlTVAzX3VuY2xpcHBlZChQTVBTVFIgbXAsIHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaXNpemUsIGNoYXIgKm91dCwgaW50IG9zaXplLCBpbnQgKmRvbmUpCit7CisgICAgLyogd2UgZm9yYmlkIGlucHV0IHdpdGggbW9yZSB0aGFuIDExNTIgc2FtcGxlcyBwZXIgY2hhbm5lbCBmb3Igb3V0cHV0IGluIHVuY2xpcHBlZCBtb2RlICovCisgICAgaWYgKG9zaXplIDwgKGludCkgKDExNTIgKiAyICogc2l6ZW9mKHJlYWwpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhpcDogb3V0IHNwYWNlIHRvbyBzbWFsbCBmb3IgdW5jbGlwcGVkIG1vZGVcbiIpOworICAgICAgICByZXR1cm4gTVAzX0VSUjsKKyAgICB9CisKKyAgICAvKiBwYXNzaW5nIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgY2xpcCB0aGUgc2FtcGxlcyAqLworICAgIHJldHVybiBkZWNvZGVNUDNfY2xpcGNob2ljZShtcCwgaW4sIGlzaXplLCBvdXQsIGRvbmUsIHN5bnRoXzF0bzFfbW9ub191bmNsaXBwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoXzF0bzFfdW5jbGlwcGVkKTsKK30KZGlmZiAtLWdpdCBhL21wZ2xpYi9pbnRlcmZhY2UuaCBiL21wZ2xpYi9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzEzYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCBUaGUgTC5BLk0uRS4gcHJvamVjdAorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgSGlwcCwgc2VlIGFsc28gQVVUSE9SUyBhbmQgUkVBRE1FLgorICogIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIElOVEVSRkFDRV9IX0lOQ0xVREVECisjZGVmaW5lIElOVEVSRkFDRV9IX0lOQ0xVREVECisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworICAgIGludCAgICAgSW5pdE1QMyhQTVBTVFIgbXApOworICAgIGludCAgICAgZGVjb2RlTVAzKFBNUFNUUiBtcCwgdW5zaWduZWQgY2hhciAqaW5tZW1vcnksIGludCBpbm1lbXNpemUsIGNoYXIgKm91dG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0bWVtc2l6ZSwgaW50ICpkb25lKTsKKyAgICB2b2lkICAgIEV4aXRNUDMoUE1QU1RSIG1wKTsKKworLyogYWRkZWQgZGVjb2RlTVAzX3VuY2xpcHBlZCB0byBzdXBwb3J0IHJldHVybmluZyByYXcgZmxvYXRpbmctcG9pbnQgdmFsdWVzIG9mIHNhbXBsZXMuIFRoZSByZXByZXNlbnRhdGlvbgorICAgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgaXMgZGVmaW5lZCBpbiBtcGcxMjMuaCBhcyAjZGVmaW5lIHJlYWwuIEl0IGlzIDY0LWJpdCBkb3VibGUgYnkgZGVmYXVsdC4gCisgICBObyBtb3JlIHRoYW4gMTE1MiBzYW1wbGVzIHBlciBjaGFubmVsIGFyZSBhbGxvd2VkLiAqLworICAgIGludCAgICAgZGVjb2RlTVAzX3VuY2xpcHBlZChQTVBTVFIgbXAsIHVuc2lnbmVkIGNoYXIgKmlubWVtb3J5LCBpbnQgaW5tZW1zaXplLCBjaGFyICpvdXRtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRtZW1zaXplLCBpbnQgKmRvbmUpOworCisvKiBhZGRlZCByZW1vdmVfYnVmIHRvIHN1cHBvcnQgbXBnbGliIHNlZWtpbmcgKi8KKyAgICB2b2lkICAgIHJlbW92ZV9idWYoUE1QU1RSIG1wKTsKKworLyogYWRkZWQgYXVkaW9kYXRhX3ByZWNlZGVzZnJhbWVzIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHN0cmVhbSBmcmFtZXMgdGhlIGF1ZGlvIGRhdGEgd2lsbCBwcmVjZWRlIHRoZSAKKyAgIGN1cnJlbnQgZnJhbWUgYnkgZm9yIExheWVyIDMgZGF0YS4gQWlkcyBzZWVraW5nLgorICovCisgICAgaW50ICAgICBhdWRpb2RhdGFfcHJlY2VkZXNmcmFtZXMoUE1QU1RSIG1wKTsKKworLyogUmVzZXRzIGRlY29kaW5nLiBBaWRzIHNlZWtpbmcuICovCisgICAgdm9pZCAgICBkZWNvZGVfcmVzZXQoUE1QU1RSIG1wKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXBnbGliL2wydGFibGVzLmggYi9tcGdsaWIvbDJ0YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTNkZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2wydGFibGVzLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCBUaGUgTC5BLk0uRS4gcHJvamVjdAorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgSGlwcCwgc2VlIGFsc28gQVVUSE9SUyBhbmQgUkVBRE1FLgorICogIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogTGF5ZXIgMiBBbGxvYyB0YWJsZXMgLi4gCisgKiBtb3N0IG90aGVyIHRhYmxlcyBhcmUgY2FsY3VsYXRlZCBvbiBwcm9ncmFtIHN0YXJ0ICh3aGljaCBpcyAob2YgY291cnNlKQorICogbm90IElTTy1jb25mb3JtKSAuLiAKKyAqIExheWVyLTMgaHVmZm1hbiB0YWJsZSBpcyBpbiBodWZmbWFuLmgKKyAqLworCitjb25zdCBzdHJ1Y3QgYWxfdGFibGUyIGFsbG9jXzBbXSA9IHsKKyAgICB7NCwgMH0sIHs1LCAzfSwgezMsIC0zfSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LCB7OSwgLTI1NX0sIHsxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTExfSwKKyAgICB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTQsIC04MTkxfSwgezE1LCAtMTYzODN9LCB7MTYsIC0zMjc2N30sCisgICAgezQsIDB9LCB7NSwgM30sIHszLCAtM30sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwgezksIC0yNTV9LCB7MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUxMX0sCisgICAgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE0LCAtODE5MX0sIHsxNSwgLTE2MzgzfSwgezE2LCAtMzI3Njd9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7MywgLTN9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sIHs5LCAtMjU1fSwgezEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MTF9LAorICAgIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNCwgLTgxOTF9LCB7MTUsIC0xNjM4M30sIHsxNiwgLTMyNzY3fSwKKyAgICB7NCwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sCisgICAgezksIC0yNTV9LCB7MTAsIC01MTF9LCB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTYsIC0zMjc2N30sCisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LAorICAgIHs5LCAtMjU1fSwgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE2LCAtMzI3Njd9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7NCwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sCisgICAgezksIC0yNTV9LCB7MTAsIC01MTF9LCB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTYsIC0zMjc2N30sCisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LAorICAgIHs5LCAtMjU1fSwgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE2LCAtMzI3Njd9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7NCwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sCisgICAgezksIC0yNTV9LCB7MTAsIC01MTF9LCB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTYsIC0zMjc2N30sCisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LAorICAgIHs5LCAtMjU1fSwgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTYsIC0zMjc2N30sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezE2LCAtMzI3Njd9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxNiwgLTMyNzY3fQorfTsKKworY29uc3Qgc3RydWN0IGFsX3RhYmxlMiBhbGxvY18xW10gPSB7CisgICAgezQsIDB9LCB7NSwgM30sIHszLCAtM30sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwgezksIC0yNTV9LCB7MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUxMX0sCisgICAgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE0LCAtODE5MX0sIHsxNSwgLTE2MzgzfSwgezE2LCAtMzI3Njd9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7MywgLTN9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sIHs5LCAtMjU1fSwgezEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MTF9LAorICAgIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNCwgLTgxOTF9LCB7MTUsIC0xNjM4M30sIHsxNiwgLTMyNzY3fSwKKyAgICB7NCwgMH0sIHs1LCAzfSwgezMsIC0zfSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LCB7OSwgLTI1NX0sIHsxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTExfSwKKyAgICB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTQsIC04MTkxfSwgezE1LCAtMTYzODN9LCB7MTYsIC0zMjc2N30sCisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LAorICAgIHs5LCAtMjU1fSwgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE2LCAtMzI3Njd9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7NCwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sCisgICAgezksIC0yNTV9LCB7MTAsIC01MTF9LCB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTYsIC0zMjc2N30sCisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LAorICAgIHs5LCAtMjU1fSwgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE2LCAtMzI3Njd9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7NCwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sCisgICAgezksIC0yNTV9LCB7MTAsIC01MTF9LCB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTYsIC0zMjc2N30sCisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LAorICAgIHs5LCAtMjU1fSwgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE2LCAtMzI3Njd9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MywgLTN9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezE2LCAtMzI3Njd9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7MTYsIC0zMjc2N30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezMsIC0zfSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTYsIC0zMjc2N30sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezE2LCAtMzI3Njd9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTYsIC0zMjc2N30sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezE2LCAtMzI3Njd9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxNiwgLTMyNzY3fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTYsIC0zMjc2N30KK307CisKK2NvbnN0IHN0cnVjdCBhbF90YWJsZTIgYWxsb2NfMltdID0geworICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwgezksIC0yNTV9LAorICAgIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNCwgLTgxOTF9LCB7MTUsIC0xNjM4M30sCisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LCB7OSwgLTI1NX0sCisgICAgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE0LCAtODE5MX0sIHsxNSwgLTE2MzgzfSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfQorfTsKKworY29uc3Qgc3RydWN0IGFsX3RhYmxlMiBhbGxvY18zW10gPSB7CisgICAgezQsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwgezgsIC0xMjd9LCB7OSwgLTI1NX0sCisgICAgezEwLCAtNTExfSwgezExLCAtMTAyM30sIHsxMiwgLTIwNDd9LCB7MTMsIC00MDk1fSwgezE0LCAtODE5MX0sIHsxNSwgLTE2MzgzfSwKKyAgICB7NCwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LCB7OCwgLTEyN30sIHs5LCAtMjU1fSwKKyAgICB7MTAsIC01MTF9LCB7MTEsIC0xMDIzfSwgezEyLCAtMjA0N30sIHsxMywgLTQwOTV9LCB7MTQsIC04MTkxfSwgezE1LCAtMTYzODN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30KK307CisKK2NvbnN0IHN0cnVjdCBhbF90YWJsZTIgYWxsb2NfNFtdID0geworICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNCwgLTgxOTF9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNCwgLTgxOTF9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNCwgLTgxOTF9LAorICAgIHs0LCAwfSwgezUsIDN9LCB7NywgNX0sIHszLCAtM30sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sIHs4LCAtMTI3fSwKKyAgICB7OSwgLTI1NX0sIHsxMCwgLTUxMX0sIHsxMSwgLTEwMjN9LCB7MTIsIC0yMDQ3fSwgezEzLCAtNDA5NX0sIHsxNCwgLTgxOTF9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezMsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwgezQsIC03fSwgezUsIC0xNX0sIHs2LCAtMzF9LCB7NywgLTYzfSwKKyAgICB7MywgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LCB7NCwgLTd9LCB7NSwgLTE1fSwgezYsIC0zMX0sIHs3LCAtNjN9LAorICAgIHszLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sIHs0LCAtN30sIHs1LCAtMTV9LCB7NiwgLTMxfSwgezcsIC02M30sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fSwKKyAgICB7MiwgMH0sIHs1LCAzfSwgezcsIDV9LCB7MTAsIDl9LAorICAgIHsyLCAwfSwgezUsIDN9LCB7NywgNX0sIHsxMCwgOX0sCisgICAgezIsIDB9LCB7NSwgM30sIHs3LCA1fSwgezEwLCA5fQorfTsKZGlmZiAtLWdpdCBhL21wZ2xpYi9sYXllcjEuYyBiL21wZ2xpYi9sYXllcjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJhODVkCi0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL2xheWVyMS5jCkBAIC0wLDAgKzEsMTkxIEBACisvKiAKKyAqIGxheWVyMS5jOiBNcGVnIExheWVyLTEgYXVkaW8gZGVjb2RlciAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCBUaGUgTC5BLk0uRS4gcHJvamVjdAorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgSGlwcCwgc2VlIGFsc28gQVVUSE9SUyBhbmQgUkVBRE1FLgorICogIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogJElkOiBsYXllcjEuYyx2IDEuMjMuMi4yIDIwMTAvMDMvMjIgMTQ6MTc6MTQgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkZWNvZGVfaTM4Ni5oIgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsYXllcjEuaCIKKworc3RhdGljIHZvaWQKK0lfc3RlcF9vbmUoUE1QU1RSIG1wLCB1bnNpZ25lZCBpbnQgYmFsbG9jW10sIHVuc2lnbmVkIGludCBzY2FsZV9pbmRleFsyXVtTQkxJTUlUXSwgc3RydWN0IGZyYW1lICpmcikKK3sKKyAgICB1bnNpZ25lZCBpbnQgKmJhID0gYmFsbG9jOworICAgIHVuc2lnbmVkIGludCAqc2NhID0gKHVuc2lnbmVkIGludCAqKSBzY2FsZV9pbmRleDsKKworICAgIGFzc2VydChmci0+c3RlcmVvID09IDEgfHwgZnItPnN0ZXJlbyA9PSAyKTsKKyAgICBpZiAoZnItPnN0ZXJlbyA9PSAyKSB7CisgICAgICAgIGludCAgICAgaTsKKyAgICAgICAgaW50ICAgICBqc2JvdW5kID0gZnItPmpzYm91bmQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqc2JvdW5kOyBpKyspIHsKKyAgICAgICAgICAgICpiYSsrID0gZ2V0Yml0cyhtcCwgNCk7CisgICAgICAgICAgICAqYmErKyA9IGdldGJpdHMobXAsIDQpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IGpzYm91bmQ7IGkgPCBTQkxJTUlUOyBpKyspCisgICAgICAgICAgICAqYmErKyA9IGdldGJpdHMobXAsIDQpOworCisgICAgICAgIGJhID0gYmFsbG9jOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqc2JvdW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKmJhKyspKQorICAgICAgICAgICAgICAgICpzY2ErKyA9IGdldGJpdHMobXAsIDYpOworICAgICAgICAgICAgaWYgKCgqYmErKykpCisgICAgICAgICAgICAgICAgKnNjYSsrID0gZ2V0Yml0cyhtcCwgNik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0ganNib3VuZDsgaSA8IFNCTElNSVQ7IGkrKykKKyAgICAgICAgICAgIGlmICgoKmJhKyspKSB7CisgICAgICAgICAgICAgICAgKnNjYSsrID0gZ2V0Yml0cyhtcCwgNik7CisgICAgICAgICAgICAgICAgKnNjYSsrID0gZ2V0Yml0cyhtcCwgNik7CisgICAgICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgICAgIGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQkxJTUlUOyBpKyspCisgICAgICAgICAgICAqYmErKyA9IGdldGJpdHMobXAsIDQpOworICAgICAgICBiYSA9IGJhbGxvYzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNCTElNSVQ7IGkrKykKKyAgICAgICAgICAgIGlmICgoKmJhKyspKQorICAgICAgICAgICAgICAgICpzY2ErKyA9IGdldGJpdHMobXAsIDYpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK0lfc3RlcF90d28oUE1QU1RSIG1wLCByZWFsIGZyYWN0aW9uWzJdW1NCTElNSVRdLCB1bnNpZ25lZCBpbnQgYmFsbG9jWzIgKiBTQkxJTUlUXSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IHNjYWxlX2luZGV4WzJdW1NCTElNSVRdLCBzdHJ1Y3QgZnJhbWUgKmZyKQoreworICAgIGludCAgICAgaSwgbjsKKyAgICBpbnQgICAgIHNtcGJbMiAqIFNCTElNSVRdOyAvKiB2YWx1ZXM6IDAtNjU1MzUgKi8KKyAgICBpbnQgICAgKnNhbXBsZTsKKyAgICB1bnNpZ25lZCBpbnQgKmJhOworICAgIHVuc2lnbmVkIGludCAqc2NhID0gKHVuc2lnbmVkIGludCAqKSBzY2FsZV9pbmRleDsKKworICAgIGFzc2VydChmci0+c3RlcmVvID09IDEgfHwgZnItPnN0ZXJlbyA9PSAyKTsKKyAgICBpZiAoZnItPnN0ZXJlbyA9PSAyKSB7CisgICAgICAgIGludCAgICAganNib3VuZCA9IGZyLT5qc2JvdW5kOworICAgICAgICByZWFsICAgKmYwID0gZnJhY3Rpb25bMF07CisgICAgICAgIHJlYWwgICAqZjEgPSBmcmFjdGlvblsxXTsKKyAgICAgICAgYmEgPSBiYWxsb2M7CisgICAgICAgIGZvciAoc2FtcGxlID0gc21wYiwgaSA9IDA7IGkgPCBqc2JvdW5kOyBpKyspIHsKKyAgICAgICAgICAgIG4gPSAqYmErKzsKKyAgICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgICAgICpzYW1wbGUrKyA9IGdldGJpdHMobXAsIG4gKyAxKTsKKyAgICAgICAgICAgIG4gPSAqYmErKzsKKyAgICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgICAgICpzYW1wbGUrKyA9IGdldGJpdHMobXAsIG4gKyAxKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBqc2JvdW5kOyBpIDwgU0JMSU1JVDsgaSsrKSB7CisgICAgICAgICAgICBuID0gKmJhKys7CisgICAgICAgICAgICBpZiAobikKKyAgICAgICAgICAgICAgICAqc2FtcGxlKysgPSBnZXRiaXRzKG1wLCBuICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgYmEgPSBiYWxsb2M7CisgICAgICAgIGZvciAoc2FtcGxlID0gc21wYiwgaSA9IDA7IGkgPCBqc2JvdW5kOyBpKyspIHsKKyAgICAgICAgICAgIG4gPSAqYmErKzsKKyAgICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgICAgICpmMCsrID0gKHJlYWwpICgoKC0xKSA8PCBuKSArICgqc2FtcGxlKyspICsgMSkgKiBtdWxzW24gKyAxXVsqc2NhKytdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpmMCsrID0gMC4wOworICAgICAgICAgICAgbiA9ICpiYSsrOworICAgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAgICAgKmYxKysgPSAocmVhbCkgKCgoLTEpIDw8IG4pICsgKCpzYW1wbGUrKykgKyAxKSAqIG11bHNbbiArIDFdWypzY2ErK107CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmYxKysgPSAwLjA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0ganNib3VuZDsgaSA8IFNCTElNSVQ7IGkrKykgeworICAgICAgICAgICAgbiA9ICpiYSsrOworICAgICAgICAgICAgaWYgKG4pIHsKKyAgICAgICAgICAgICAgICByZWFsICAgIHNhbXAgPSAocmVhbCkgKCgoLTEpIDw8IG4pICsgKCpzYW1wbGUrKykgKyAxKTsKKyAgICAgICAgICAgICAgICAqZjArKyA9IHNhbXAgKiBtdWxzW24gKyAxXVsqc2NhKytdOworICAgICAgICAgICAgICAgICpmMSsrID0gc2FtcCAqIG11bHNbbiArIDFdWypzY2ErK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmYwKysgPSAqZjErKyA9IDAuMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBmci0+ZG93bl9zYW1wbGVfc2JsaW1pdDsgaSA8IDMyOyBpKyspCisgICAgICAgICAgICBmcmFjdGlvblswXVtpXSA9IGZyYWN0aW9uWzFdW2ldID0gMC4wOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVhbCAgICpmMCA9IGZyYWN0aW9uWzBdOworICAgICAgICBiYSA9IGJhbGxvYzsKKyAgICAgICAgZm9yIChzYW1wbGUgPSBzbXBiLCBpID0gMDsgaSA8IFNCTElNSVQ7IGkrKykgeworICAgICAgICAgICAgbiA9ICpiYSsrOworICAgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAgICAgKnNhbXBsZSsrID0gZ2V0Yml0cyhtcCwgbiArIDEpOworICAgICAgICB9CisgICAgICAgIGJhID0gYmFsbG9jOworICAgICAgICBmb3IgKHNhbXBsZSA9IHNtcGIsIGkgPSAwOyBpIDwgU0JMSU1JVDsgaSsrKSB7CisgICAgICAgICAgICBuID0gKmJhKys7CisgICAgICAgICAgICBpZiAobikKKyAgICAgICAgICAgICAgICAqZjArKyA9IChyZWFsKSAoKCgtMSkgPDwgbikgKyAoKnNhbXBsZSsrKSArIDEpICogbXVsc1tuICsgMV1bKnNjYSsrXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZjArKyA9IDAuMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBmci0+ZG93bl9zYW1wbGVfc2JsaW1pdDsgaSA8IDMyOyBpKyspCisgICAgICAgICAgICBmcmFjdGlvblswXVtpXSA9IDAuMDsKKyAgICB9Cit9CisKKy8qaW50IGRvX2xheWVyMShzdHJ1Y3QgZnJhbWUgKmZyLGludCBvdXRtb2RlLHN0cnVjdCBhdWRpb19pbmZvX3N0cnVjdCAqYWkpICovCitpbnQKK2RvX2xheWVyMShQTVBTVFIgbXAsIHVuc2lnbmVkIGNoYXIgKnBjbV9zYW1wbGUsIGludCAqcGNtX3BvaW50KQoreworICAgIGludCAgICAgY2xpcCA9IDA7CisgICAgdW5zaWduZWQgaW50IGJhbGxvY1syICogU0JMSU1JVF07CisgICAgdW5zaWduZWQgaW50IHNjYWxlX2luZGV4WzJdW1NCTElNSVRdOworICAgIHJlYWwgICAgZnJhY3Rpb25bMl1bU0JMSU1JVF07CisgICAgc3RydWN0IGZyYW1lICpmciA9ICYobXAtPmZyKTsKKyAgICBpbnQgICAgIGksIHN0ZXJlbyA9IGZyLT5zdGVyZW87CisgICAgaW50ICAgICBzaW5nbGUgPSBmci0+c2luZ2xlOworCisgICAgZnItPmpzYm91bmQgPSAoZnItPm1vZGUgPT0gTVBHX01EX0pPSU5UX1NURVJFTykgPyAoZnItPm1vZGVfZXh0IDw8IDIpICsgNCA6IDMyOworCisgICAgaWYgKHN0ZXJlbyA9PSAxIHx8IHNpbmdsZSA9PSAzKQorICAgICAgICBzaW5nbGUgPSAwOworCisgICAgSV9zdGVwX29uZShtcCwgYmFsbG9jLCBzY2FsZV9pbmRleCwgZnIpOworCisgICAgZm9yIChpID0gMDsgaSA8IFNDQUxFX0JMT0NLOyBpKyspIHsKKyAgICAgICAgSV9zdGVwX3R3byhtcCwgZnJhY3Rpb24sIGJhbGxvYywgc2NhbGVfaW5kZXgsIGZyKTsKKworICAgICAgICBpZiAoc2luZ2xlID49IDApIHsKKyAgICAgICAgICAgIGNsaXAgKz0gc3ludGhfMXRvMV9tb25vKG1wLCAocmVhbCAqKSBmcmFjdGlvbltzaW5nbGVdLCBwY21fc2FtcGxlLCBwY21fcG9pbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50ICAgICBwMSA9ICpwY21fcG9pbnQ7CisgICAgICAgICAgICBjbGlwICs9IHN5bnRoXzF0bzEobXAsIChyZWFsICopIGZyYWN0aW9uWzBdLCAwLCBwY21fc2FtcGxlLCAmcDEpOworICAgICAgICAgICAgY2xpcCArPSBzeW50aF8xdG8xKG1wLCAocmVhbCAqKSBmcmFjdGlvblsxXSwgMSwgcGNtX3NhbXBsZSwgcGNtX3BvaW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjbGlwOworfQpkaWZmIC0tZ2l0IGEvbXBnbGliL2xheWVyMS5oIGIvbXBnbGliL2xheWVyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOTU5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9tcGdsaWIvbGF5ZXIxLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBwcm9qZWN0CisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBIaXBwLCBzZWUgYWxzbyBBVVRIT1JTIGFuZCBSRUFETUUuCisgKiAgCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTEFZRVIxX0hfSU5DTFVERUQKKyNkZWZpbmUgTEFZRVIxX0hfSU5DTFVERUQKKworaW50ICAgICBkb19sYXllcjEoUE1QU1RSIG1wLCB1bnNpZ25lZCBjaGFyICpwY21fc2FtcGxlLCBpbnQgKnBjbV9wb2ludCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXBnbGliL2xheWVyMi5jIGIvbXBnbGliL2xheWVyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmEzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tcGdsaWIvbGF5ZXIyLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qIAorICogbGF5ZXIyLmM6IE1wZWcgTGF5ZXItMiBhdWRpbyBkZWNvZGVyIAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBwcm9qZWN0CisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBIaXBwLCBzZWUgYWxzbyBBVVRIT1JTIGFuZCBSRUFETUUuCisgKiAgCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworLyogJElkOiBsYXllcjIuYyx2IDEuMjMuMi4yIDIwMTAvMDMvMjIgMTQ6MTc6MTQgcm9iZXJ0IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJsYXllcjIuaCIKKyNpbmNsdWRlICJsMnRhYmxlcy5oIgorI2luY2x1ZGUgImRlY29kZV9pMzg2LmgiCisKKyNpZmRlZiBXSVRIX0RNQUxMT0MKKyNpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKworc3RhdGljIGludCBncnBfM3RhYlszMiAqIDNdID0geyAwLCB9OyAvKiB1c2VkOiAyNyAqLworc3RhdGljIGludCBncnBfNXRhYlsxMjggKiAzXSA9IHsgMCwgfTsgLyogdXNlZDogMTI1ICovCitzdGF0aWMgaW50IGdycF85dGFiWzEwMjQgKiAzXSA9IHsgMCwgfTsgLyogdXNlZDogNzI5ICovCisKK3ZvaWQKK2luaXRfbGF5ZXIyKHZvaWQpCit7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtdWxtdWxbMjddID0geworICAgICAgICAwLjAsIC0yLjAgLyAzLjAsIDIuMCAvIDMuMCwKKyAgICAgICAgMi4wIC8gNy4wLCAyLjAgLyAxNS4wLCAyLjAgLyAzMS4wLCAyLjAgLyA2My4wLCAyLjAgLyAxMjcuMCwgMi4wIC8gMjU1LjAsCisgICAgICAgIDIuMCAvIDUxMS4wLCAyLjAgLyAxMDIzLjAsIDIuMCAvIDIwNDcuMCwgMi4wIC8gNDA5NS4wLCAyLjAgLyA4MTkxLjAsCisgICAgICAgIDIuMCAvIDE2MzgzLjAsIDIuMCAvIDMyNzY3LjAsIDIuMCAvIDY1NTM1LjAsCisgICAgICAgIC00LjAgLyA1LjAsIC0yLjAgLyA1LjAsIDIuMCAvIDUuMCwgNC4wIC8gNS4wLAorICAgICAgICAtOC4wIC8gOS4wLCAtNC4wIC8gOS4wLCAtMi4wIC8gOS4wLCAyLjAgLyA5LjAsIDQuMCAvIDkuMCwgOC4wIC8gOS4wCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGJhc2VbM11bOV0gPSB7CisgICAgICAgIHsxLCAwLCAyLH0sCisgICAgICAgIHsxNywgMTgsIDAsIDE5LCAyMCx9LAorICAgICAgICB7MjEsIDEsIDIyLCAyMywgMCwgMjQsIDI1LCAyLCAyNn0KKyAgICB9OworICAgIGludCAgICAgaSwgaiwgaywgbCwgbGVuOworICAgIHJlYWwgICAqdGFibGU7CisgICAgc3RhdGljIGNvbnN0IGludCB0YWJsZW5bM10gPSB7IDMsIDUsIDkgfTsKKyAgICBzdGF0aWMgaW50ICppdGFibGUsICp0YWJsZXNbM10gPSB7IGdycF8zdGFiLCBncnBfNXRhYiwgZ3JwXzl0YWIgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaXRhYmxlID0gdGFibGVzW2ldOworICAgICAgICBsZW4gPSB0YWJsZW5baV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKykKKyAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgbGVuOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKml0YWJsZSsrID0gYmFzZVtpXVtsXTsKKyAgICAgICAgICAgICAgICAgICAgKml0YWJsZSsrID0gYmFzZVtpXVtrXTsKKyAgICAgICAgICAgICAgICAgICAgKml0YWJsZSsrID0gYmFzZVtpXVtqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChrID0gMDsgayA8IDI3OyBrKyspIHsKKyAgICAgICAgZG91YmxlICBtID0gbXVsbXVsW2tdOworICAgICAgICB0YWJsZSA9IG11bHNba107CisgICAgICAgIGZvciAoaiA9IDMsIGkgPSAwOyBpIDwgNjM7IGkrKywgai0tKQorICAgICAgICAgICAgKnRhYmxlKysgPSAocmVhbCkgKG0gKiBwb3coMi4wLCAoZG91YmxlKSBqIC8gMy4wKSk7CisgICAgICAgICp0YWJsZSsrID0gMC4wOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorSUlfc3RlcF9vbmUoUE1QU1RSIG1wLCB1bnNpZ25lZCBpbnQgKmJpdF9hbGxvYywgaW50ICpzY2FsZSwgc3RydWN0IGZyYW1lICpmcikKK3sKKyAgICBpbnQgICAgIHN0ZXJlbyA9IGZyLT5zdGVyZW8gLSAxOworICAgIGludCAgICAgc2JsaW1pdCA9IGZyLT5JSV9zYmxpbWl0OworICAgIGludCAgICAganNib3VuZCA9IGZyLT5qc2JvdW5kOworICAgIGludCAgICAgc2JsaW1pdDIgPSBmci0+SUlfc2JsaW1pdCA8PCBzdGVyZW87CisgICAgc3RydWN0IGFsX3RhYmxlMiBjb25zdCAqYWxsb2MxID0gZnItPmFsbG9jOworICAgIGludCAgICAgaTsKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IHNjZnNpX2J1Zls2NF07CisgICAgdW5zaWduZWQgaW50ICpzY2ZzaSwgKmJpdGE7CisgICAgaW50ICAgICBzYywgc3RlcDsKKworICAgIGJpdGEgPSBiaXRfYWxsb2M7CisgICAgaWYgKHN0ZXJlbykgeworICAgICAgICBmb3IgKGkgPSBqc2JvdW5kOyBpOyBpLS0sIGFsbG9jMSArPSAoMSA8PCBzdGVwKSkgeworICAgICAgICAgICAgKmJpdGErKyA9IChjaGFyKSBnZXRiaXRzKG1wLCBzdGVwID0gYWxsb2MxLT5iaXRzKTsKKyAgICAgICAgICAgICpiaXRhKysgPSAoY2hhcikgZ2V0Yml0cyhtcCwgc3RlcCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gc2JsaW1pdCAtIGpzYm91bmQ7IGk7IGktLSwgYWxsb2MxICs9ICgxIDw8IHN0ZXApKSB7CisgICAgICAgICAgICBiaXRhWzBdID0gKGNoYXIpIGdldGJpdHMobXAsIHN0ZXAgPSBhbGxvYzEtPmJpdHMpOworICAgICAgICAgICAgYml0YVsxXSA9IGJpdGFbMF07CisgICAgICAgICAgICBiaXRhICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgYml0YSA9IGJpdF9hbGxvYzsKKyAgICAgICAgc2Nmc2kgPSBzY2ZzaV9idWY7CisgICAgICAgIGZvciAoaSA9IHNibGltaXQyOyBpOyBpLS0pCisgICAgICAgICAgICBpZiAoKmJpdGErKykKKyAgICAgICAgICAgICAgICAqc2Nmc2krKyA9IChjaGFyKSBnZXRiaXRzX2Zhc3QobXAsIDIpOworICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgICAgIC8qIG1vbm8gKi8KKworICAgICAgICBmb3IgKGkgPSBzYmxpbWl0OyBpOyBpLS0sIGFsbG9jMSArPSAoMSA8PCBzdGVwKSkKKyAgICAgICAgICAgICpiaXRhKysgPSAoY2hhcikgZ2V0Yml0cyhtcCwgc3RlcCA9IGFsbG9jMS0+Yml0cyk7CisgICAgICAgIGJpdGEgPSBiaXRfYWxsb2M7CisgICAgICAgIHNjZnNpID0gc2Nmc2lfYnVmOworICAgICAgICBmb3IgKGkgPSBzYmxpbWl0OyBpOyBpLS0pCisgICAgICAgICAgICBpZiAoKmJpdGErKykKKyAgICAgICAgICAgICAgICAqc2Nmc2krKyA9IChjaGFyKSBnZXRiaXRzX2Zhc3QobXAsIDIpOworICAgIH0KKworICAgIGJpdGEgPSBiaXRfYWxsb2M7CisgICAgc2Nmc2kgPSBzY2ZzaV9idWY7CisgICAgZm9yIChpID0gc2JsaW1pdDI7IGk7IGktLSkKKyAgICAgICAgaWYgKCpiaXRhKyspCisgICAgICAgICAgICBzd2l0Y2ggKCpzY2ZzaSsrKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKnNjYWxlKysgPSBnZXRiaXRzX2Zhc3QobXAsIDYpOworICAgICAgICAgICAgICAgICpzY2FsZSsrID0gZ2V0Yml0c19mYXN0KG1wLCA2KTsKKyAgICAgICAgICAgICAgICAqc2NhbGUrKyA9IGdldGJpdHNfZmFzdChtcCwgNik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgKnNjYWxlKysgPSBzYyA9IGdldGJpdHNfZmFzdChtcCwgNik7CisgICAgICAgICAgICAgICAgKnNjYWxlKysgPSBzYzsKKyAgICAgICAgICAgICAgICAqc2NhbGUrKyA9IGdldGJpdHNfZmFzdChtcCwgNik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgKnNjYWxlKysgPSBzYyA9IGdldGJpdHNfZmFzdChtcCwgNik7CisgICAgICAgICAgICAgICAgKnNjYWxlKysgPSBzYzsKKyAgICAgICAgICAgICAgICAqc2NhbGUrKyA9IHNjOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogICAvKiBjYXNlIDMgKi8KKyAgICAgICAgICAgICAgICAqc2NhbGUrKyA9IGdldGJpdHNfZmFzdChtcCwgNik7CisgICAgICAgICAgICAgICAgKnNjYWxlKysgPSBzYyA9IGdldGJpdHNfZmFzdChtcCwgNik7CisgICAgICAgICAgICAgICAgKnNjYWxlKysgPSBzYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworfQorCitzdGF0aWMgdm9pZAorSUlfc3RlcF90d28oUE1QU1RSIG1wLCB1bnNpZ25lZCBpbnQgKmJpdF9hbGxvYywgcmVhbCBmcmFjdGlvblsyXVs0XVtTQkxJTUlUXSwgaW50ICpzY2FsZSwKKyAgICAgICAgICAgIHN0cnVjdCBmcmFtZSAqZnIsIGludCB4MSkKK3sKKyAgICBpbnQgICAgIGksIGosIGssIGJhOworICAgIGludCAgICAgc3RlcmVvID0gZnItPnN0ZXJlbzsKKyAgICBpbnQgICAgIHNibGltaXQgPSBmci0+SUlfc2JsaW1pdDsKKyAgICBpbnQgICAgIGpzYm91bmQgPSBmci0+anNib3VuZDsKKyAgICBzdHJ1Y3QgYWxfdGFibGUyIGNvbnN0ICphbGxvYzIsICphbGxvYzEgPSBmci0+YWxsb2M7CisgICAgdW5zaWduZWQgaW50ICpiaXRhID0gYml0X2FsbG9jOworICAgIGludCAgICAgZDEsIHN0ZXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwganNib3VuZDsgaSsrLCBhbGxvYzEgKz0gKDEgPDwgc3RlcCkpIHsKKyAgICAgICAgc3RlcCA9IGFsbG9jMS0+Yml0czsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0ZXJlbzsgaisrKSB7CisgICAgICAgICAgICBiYSA9ICpiaXRhKys7CisgICAgICAgICAgICBpZiAoYmEpIHsKKyAgICAgICAgICAgICAgICBrID0gKGFsbG9jMiA9IGFsbG9jMSArIGJhKS0+Yml0czsKKyAgICAgICAgICAgICAgICBpZiAoKGQxID0gYWxsb2MyLT5kKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhbCAgICBjbSA9IG11bHNba11bc2NhbGVbeDFdXTsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25bal1bMF1baV0gPSAoKHJlYWwpICgoaW50KSBnZXRiaXRzKG1wLCBrKSArIGQxKSkgKiBjbTsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25bal1bMV1baV0gPSAoKHJlYWwpICgoaW50KSBnZXRiaXRzKG1wLCBrKSArIGQxKSkgKiBjbTsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25bal1bMl1baV0gPSAoKHJlYWwpICgoaW50KSBnZXRiaXRzKG1wLCBrKSArIGQxKSkgKiBjbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgKnRhYmxlW10gPSB7IDAsIDAsIDAsIGdycF8zdGFiLCAwLCBncnBfNXRhYiwgMCwgMCwgMCwgZ3JwXzl0YWIgfTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkeCwgKnRhYiwgbSA9IHNjYWxlW3gxXTsKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gKHVuc2lnbmVkIGludCkgZ2V0Yml0cyhtcCwgayk7CisgICAgICAgICAgICAgICAgICAgIHRhYiA9ICh1bnNpZ25lZCBpbnQgKikgKHRhYmxlW2QxXSArIGlkeCArIGlkeCArIGlkeCk7CisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uW2pdWzBdW2ldID0gbXVsc1sqdGFiKytdW21dOworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbltqXVsxXVtpXSA9IG11bHNbKnRhYisrXVttXTsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25bal1bMl1baV0gPSBtdWxzWyp0YWJdW21dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY2FsZSArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYWN0aW9uW2pdWzBdW2ldID0gZnJhY3Rpb25bal1bMV1baV0gPSBmcmFjdGlvbltqXVsyXVtpXSA9IDAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IGpzYm91bmQ7IGkgPCBzYmxpbWl0OyBpKyssIGFsbG9jMSArPSAoMSA8PCBzdGVwKSkgeworICAgICAgICBzdGVwID0gYWxsb2MxLT5iaXRzOworICAgICAgICBiaXRhKys7ICAgICAgICAgLyogY2hhbm5lbCAxIGFuZCBjaGFubmVsIDIgYml0YWxsb2MgYXJlIHRoZSBzYW1lICovCisgICAgICAgIGJhID0gKmJpdGErKzsKKyAgICAgICAgaWYgKGJhKSB7CisgICAgICAgICAgICBrID0gKGFsbG9jMiA9IGFsbG9jMSArIGJhKS0+Yml0czsKKyAgICAgICAgICAgIGlmICgoZDEgPSBhbGxvYzItPmQpIDwgMCkgeworICAgICAgICAgICAgICAgIHJlYWwgICAgY207CisgICAgICAgICAgICAgICAgY20gPSBtdWxzW2tdW3NjYWxlW3gxICsgM11dOworICAgICAgICAgICAgICAgIGZyYWN0aW9uWzFdWzBdW2ldID0gKGZyYWN0aW9uWzBdWzBdW2ldID0gKHJlYWwpICgoaW50KSBnZXRiaXRzKG1wLCBrKSArIGQxKSkgKiBjbTsKKyAgICAgICAgICAgICAgICBmcmFjdGlvblsxXVsxXVtpXSA9IChmcmFjdGlvblswXVsxXVtpXSA9IChyZWFsKSAoKGludCkgZ2V0Yml0cyhtcCwgaykgKyBkMSkpICogY207CisgICAgICAgICAgICAgICAgZnJhY3Rpb25bMV1bMl1baV0gPSAoZnJhY3Rpb25bMF1bMl1baV0gPSAocmVhbCkgKChpbnQpIGdldGJpdHMobXAsIGspICsgZDEpKSAqIGNtOworICAgICAgICAgICAgICAgIGNtID0gbXVsc1trXVtzY2FsZVt4MV1dOworICAgICAgICAgICAgICAgIGZyYWN0aW9uWzBdWzBdW2ldICo9IGNtOworICAgICAgICAgICAgICAgIGZyYWN0aW9uWzBdWzFdW2ldICo9IGNtOworICAgICAgICAgICAgICAgIGZyYWN0aW9uWzBdWzJdW2ldICo9IGNtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGludCAqdGFibGVbXSA9IHsgMCwgMCwgMCwgZ3JwXzN0YWIsIDAsIGdycF81dGFiLCAwLCAwLCAwLCBncnBfOXRhYiB9OworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZHgsICp0YWIsIG0xLCBtMjsKKyAgICAgICAgICAgICAgICBtMSA9IHNjYWxlW3gxXTsKKyAgICAgICAgICAgICAgICBtMiA9IHNjYWxlW3gxICsgM107CisgICAgICAgICAgICAgICAgaWR4ID0gKHVuc2lnbmVkIGludCkgZ2V0Yml0cyhtcCwgayk7CisgICAgICAgICAgICAgICAgdGFiID0gKHVuc2lnbmVkIGludCAqKSAodGFibGVbZDFdICsgaWR4ICsgaWR4ICsgaWR4KTsKKyAgICAgICAgICAgICAgICBmcmFjdGlvblswXVswXVtpXSA9IG11bHNbKnRhYl1bbTFdOworICAgICAgICAgICAgICAgIGZyYWN0aW9uWzFdWzBdW2ldID0gbXVsc1sqdGFiKytdW20yXTsKKyAgICAgICAgICAgICAgICBmcmFjdGlvblswXVsxXVtpXSA9IG11bHNbKnRhYl1bbTFdOworICAgICAgICAgICAgICAgIGZyYWN0aW9uWzFdWzFdW2ldID0gbXVsc1sqdGFiKytdW20yXTsKKyAgICAgICAgICAgICAgICBmcmFjdGlvblswXVsyXVtpXSA9IG11bHNbKnRhYl1bbTFdOworICAgICAgICAgICAgICAgIGZyYWN0aW9uWzFdWzJdW2ldID0gbXVsc1sqdGFiXVttMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FsZSArPSA2OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnJhY3Rpb25bMF1bMF1baV0gPSBmcmFjdGlvblswXVsxXVtpXSA9IGZyYWN0aW9uWzBdWzJdW2ldID0KKyAgICAgICAgICAgICAgICBmcmFjdGlvblsxXVswXVtpXSA9IGZyYWN0aW9uWzFdWzFdW2ldID0gZnJhY3Rpb25bMV1bMl1baV0gPSAwLjA7CisgICAgICAgIH0KKy8qIAorICAgc2hvdWxkIHdlIHVzZSBpbmRpdmlkdWFsIHNjYWxlZmFjIGZvciBjaGFubmVsIDIgb3IKKyAgIGlzIHRoZSBjdXJyZW50IHdheSB0aGUgcmlnaHQgb25lICwgd2hlcmUgd2UganVzdCBjb3B5IGNoYW5uZWwgMSB0bworICAgY2hhbm5lbCAyID8/IAorICAgVGhlIGN1cnJlbnQgJ3N0cmFuZ2UnIHRoaW5nIGlzLCB0aGF0IHdlIHRocm93IGF3YXkgdGhlIHNjYWxlZmFjCisgICB2YWx1ZXMgZm9yIHRoZSBzZWNvbmQgY2hhbm5lbCAuLi4hIQorLT4gY2hhbmdlZCAuLiBub3cgd2UgdXNlIHRoZSBzY2FsZWZhYyB2YWx1ZXMgb2YgY2hhbm5lbCBvbmUgISEgCisqLworICAgIH0KKworLyogIGlmKHNibGltaXQgPiAoZnItPmRvd25fc2FtcGxlX3NibGltaXQpICkgKi8KKy8qICAgIHNibGltaXQgPSBmci0+ZG93bl9zYW1wbGVfc2JsaW1pdDsgKi8KKworICAgIGZvciAoaSA9IHNibGltaXQ7IGkgPCBTQkxJTUlUOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdGVyZW87IGorKykKKyAgICAgICAgICAgIGZyYWN0aW9uW2pdWzBdW2ldID0gZnJhY3Rpb25bal1bMV1baV0gPSBmcmFjdGlvbltqXVsyXVtpXSA9IDAuMDsKKworfQorCitzdGF0aWMgdm9pZAorSUlfc2VsZWN0X3RhYmxlKHN0cnVjdCBmcmFtZSAqZnIpCit7CisgICAgLyogKklOREVOVC1PRkYqICovCisgIHN0YXRpYyBjb25zdCBpbnQgdHJhbnNsYXRlWzNdWzJdWzE2XSA9CisgICB7IHsgeyAwLDIsMiwyLDIsMiwyLDAsMCwwLDEsMSwxLDEsMSwwIH0gLAorICAgICAgIHsgMCwyLDIsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMCB9IH0gLAorICAgICB7IHsgMCwyLDIsMiwyLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCB9ICwKKyAgICAgICB7IDAsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfSB9ICwKKyAgICAgeyB7IDAsMywzLDMsMywzLDMsMCwwLDAsMSwxLDEsMSwxLDAgfSAsCisgICAgICAgeyAwLDMsMywwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwwIH0gfSB9OworICAgIC8qICpJTkRFTlQtT04qICovCisKKyAgICBpbnQgICAgIHRhYmxlLCBzYmxpbTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGFsX3RhYmxlMiAqdGFibGVzWzVdID0geyBhbGxvY18wLCBhbGxvY18xLCBhbGxvY18yLCBhbGxvY18zLCBhbGxvY180IH07CisgICAgc3RhdGljIGNvbnN0IGludCBzYmxpbXNbNV0gPSB7IDI3LCAzMCwgOCwgMTIsIDMwIH07CisKKyAgICBpZiAoZnItPmxzZikKKyAgICAgICAgdGFibGUgPSA0OworICAgIGVsc2UKKyAgICAgICAgdGFibGUgPSB0cmFuc2xhdGVbZnItPnNhbXBsaW5nX2ZyZXF1ZW5jeV1bMiAtIGZyLT5zdGVyZW9dW2ZyLT5iaXRyYXRlX2luZGV4XTsKKyAgICBzYmxpbSA9IHNibGltc1t0YWJsZV07CisKKyAgICBmci0+YWxsb2MgPSAoc3RydWN0IGFsX3RhYmxlMiBjb25zdCAqKSB0YWJsZXNbdGFibGVdOworICAgIGZyLT5JSV9zYmxpbWl0ID0gc2JsaW07Cit9CisKKworaW50Citkb19sYXllcjIoUE1QU1RSIG1wLCB1bnNpZ25lZCBjaGFyICpwY21fc2FtcGxlLCBpbnQgKnBjbV9wb2ludCkKKy8qaW50IGRvX2xheWVyMihzdHJ1Y3QgZnJhbWUgKmZyLGludCBvdXRtb2RlLHN0cnVjdCBhdWRpb19pbmZvX3N0cnVjdCAqYWkpICovCit7CisgICAgaW50ICAgICBjbGlwID0gMDsKKyAgICBpbnQgICAgIGksIGo7CisgICAgcmVhbCAgICBmcmFjdGlvblsyXVs0XVtTQkxJTUlUXTsgLyogcGlja190YWJsZSBjbGVhcnMgdW51c2VkIHN1YmJhbmRzICovCisgICAgdW5zaWduZWQgaW50IGJpdF9hbGxvY1s2NF07CisgICAgaW50ICAgICBzY2FsZVsxOTJdOworICAgIHN0cnVjdCBmcmFtZSAqZnIgPSAmKG1wLT5mcik7CisgICAgaW50ICAgICBzdGVyZW8gPSBmci0+c3RlcmVvOworICAgIGludCAgICAgc2luZ2xlID0gZnItPnNpbmdsZTsKKworICAgIElJX3NlbGVjdF90YWJsZShmcik7CisgICAgZnItPmpzYm91bmQgPSAoZnItPm1vZGUgPT0gTVBHX01EX0pPSU5UX1NURVJFTykgPyAoZnItPm1vZGVfZXh0IDw8IDIpICsgNCA6IGZyLT5JSV9zYmxpbWl0OworCisgICAgaWYgKHN0ZXJlbyA9PSAxIHx8IHNpbmdsZSA9PSAzKQorICAgICAgICBzaW5nbGUgPSAwOworCisgICAgSUlfc3RlcF9vbmUobXAsIGJpdF9hbGxvYywgc2NhbGUsIGZyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTQ0FMRV9CTE9DSzsgaSsrKSB7CisgICAgICAgIElJX3N0ZXBfdHdvKG1wLCBiaXRfYWxsb2MsIGZyYWN0aW9uLCBzY2FsZSwgZnIsIGkgPj4gMik7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChzaW5nbGUgPj0gMCkgeworICAgICAgICAgICAgICAgIGNsaXAgKz0gc3ludGhfMXRvMV9tb25vKG1wLCBmcmFjdGlvbltzaW5nbGVdW2pdLCBwY21fc2FtcGxlLCBwY21fcG9pbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50ICAgICBwMSA9ICpwY21fcG9pbnQ7CisgICAgICAgICAgICAgICAgY2xpcCArPSBzeW50aF8xdG8xKG1wLCBmcmFjdGlvblswXVtqXSwgMCwgcGNtX3NhbXBsZSwgJnAxKTsKKyAgICAgICAgICAgICAgICBjbGlwICs9IHN5bnRoXzF0bzEobXAsIGZyYWN0aW9uWzFdW2pdLCAxLCBwY21fc2FtcGxlLCBwY21fcG9pbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNsaXA7Cit9CmRpZmYgLS1naXQgYS9tcGdsaWIvbGF5ZXIyLmggYi9tcGdsaWIvbGF5ZXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3MmI4OQotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi9sYXllcjIuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAgVGhlIEwuQS5NLkUuIHByb2plY3QKKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEhpcHAsIHNlZSBhbHNvIEFVVEhPUlMgYW5kIFJFQURNRS4KKyAqICAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworCisjaWZuZGVmIExBWUVSMl9IX0lOQ0xVREVECisjZGVmaW5lIExBWUVSMl9IX0lOQ0xVREVECisKKworc3RydWN0IGFsX3RhYmxlMiB7CisgICAgc2hvcnQgICBiaXRzOworICAgIHNob3J0ICAgZDsKK307CisKKworCit2b2lkICAgIGluaXRfbGF5ZXIyKHZvaWQpOworaW50ICAgICBkb19sYXllcjIoUE1QU1RSIG1wLCB1bnNpZ25lZCBjaGFyICpwY21fc2FtcGxlLCBpbnQgKnBjbV9wb2ludCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tcGdsaWIvbGF5ZXIzLmMgYi9tcGdsaWIvbGF5ZXIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5M2Y3OAotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi9sYXllcjMuYwpAQCAtMCwwICsxLDE4NDcgQEAKKy8qIAorICogbGF5ZXIzLmM6IE1wZWcgTGF5ZXItMyBhdWRpbyBkZWNvZGVyIAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBwcm9qZWN0CisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBIaXBwLCBzZWUgYWxzbyBBVVRIT1JTIGFuZCBSRUFETUUuCisgKiAgCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisvKiAkSWQ6IGxheWVyMy5jLHYgMS41MS4yLjMgMjAxMC8wMy8yMiAxNDoxNzoxNCByb2JlcnQgRXhwICQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImh1ZmZtYW4uaCIKKyNpbmNsdWRlICJsYW1lLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImVuY29kZXIuaCIKKyNpbmNsdWRlICJsYW1lLWFuYWx5c2lzLmgiCisjaW5jbHVkZSAiZGVjb2RlX2kzODYuaCIKKyNpbmNsdWRlICJsYXllcjMuaCIKKworI2lmZGVmIFdJVEhfRE1BTExPQworI2luY2x1ZGUgPGRtYWxsb2MuaD4KKyNlbmRpZgorCisKKworc3RhdGljIHJlYWwgaXNwb3dbODIwN107CitzdGF0aWMgcmVhbCBhYV9jYVs4XSwgYWFfY3NbOF07CitzdGF0aWMgcmVhbCBDT1MxWzEyXVs2XTsKK3N0YXRpYyByZWFsIHdpbls0XVszNl07CitzdGF0aWMgcmVhbCB3aW4xWzRdWzM2XTsKK3N0YXRpYyByZWFsIGdhaW5wb3cyWzI1NiArIDExOCArIDRdOworc3RhdGljIHJlYWwgQ09TOVs5XTsKK3N0YXRpYyByZWFsIENPUzZfMSwgQ09TNl8yOworc3RhdGljIHJlYWwgdGZjb3MzNls5XTsKK3N0YXRpYyByZWFsIHRmY29zMTJbM107CisKK3N0cnVjdCBiYW5kSW5mb1N0cnVjdCB7CisgICAgc2hvcnQgICBsb25nSWR4WzIzXTsKKyAgICBzaG9ydCAgIGxvbmdEaWZmWzIyXTsKKyAgICBzaG9ydCAgIHNob3J0SWR4WzE0XTsKKyAgICBzaG9ydCAgIHNob3J0RGlmZlsxM107Cit9OworCitzdGF0aWMgaW50IGxvbmdMaW1pdFs5XVsyM107CitzdGF0aWMgaW50IHNob3J0TGltaXRbOV1bMTRdOworCisvKiAqSU5ERU5ULU9GRiogKi8KKworY29uc3Qgc3RydWN0IGJhbmRJbmZvU3RydWN0IGJhbmRJbmZvWzldID0geyAKKworLyogTVBFRyAxLjAgKi8KKyB7IHswLDQsOCwxMiwxNiwyMCwyNCwzMCwzNiw0NCw1Miw2Miw3NCwgOTAsMTEwLDEzNCwxNjIsMTk2LDIzOCwyODgsMzQyLDQxOCw1NzZ9LAorICAgezQsNCw0LDQsNCw0LDYsNiw4LCA4LDEwLDEyLDE2LDIwLDI0LDI4LDM0LDQyLDUwLDU0LCA3NiwxNTh9LAorICAgezAsNCozLDgqMywxMiozLDE2KjMsMjIqMywzMCozLDQwKjMsNTIqMyw2NiozLCA4NCozLDEwNiozLDEzNiozLDE5MiozfSwKKyAgIHs0LDQsNCw0LDYsOCwxMCwxMiwxNCwxOCwyMiwzMCw1Nn0gfSAsCisKKyB7IHswLDQsOCwxMiwxNiwyMCwyNCwzMCwzNiw0Miw1MCw2MCw3MiwgODgsMTA2LDEyOCwxNTYsMTkwLDIzMCwyNzYsMzMwLDM4NCw1NzZ9LAorICAgezQsNCw0LDQsNCw0LDYsNiw2LCA4LDEwLDEyLDE2LDE4LDIyLDI4LDM0LDQwLDQ2LDU0LCA1NCwxOTJ9LAorICAgezAsNCozLDgqMywxMiozLDE2KjMsMjIqMywyOCozLDM4KjMsNTAqMyw2NCozLCA4MCozLDEwMCozLDEyNiozLDE5MiozfSwKKyAgIHs0LDQsNCw0LDYsNiwxMCwxMiwxNCwxNiwyMCwyNiw2Nn0gfSAsCisKKyB7IHswLDQsOCwxMiwxNiwyMCwyNCwzMCwzNiw0NCw1NCw2Niw4MiwxMDIsMTI2LDE1NiwxOTQsMjQwLDI5NiwzNjQsNDQ4LDU1MCw1NzZ9ICwKKyAgIHs0LDQsNCw0LDQsNCw2LDYsOCwxMCwxMiwxNiwyMCwyNCwzMCwzOCw0Niw1Niw2OCw4NCwxMDIsIDI2fSAsCisgICB7MCw0KjMsOCozLDEyKjMsMTYqMywyMiozLDMwKjMsNDIqMyw1OCozLDc4KjMsMTA0KjMsMTM4KjMsMTgwKjMsMTkyKjN9ICwKKyAgIHs0LDQsNCw0LDYsOCwxMiwxNiwyMCwyNiwzNCw0MiwxMn0gfSAgLAorCisvKiBNUEVHIDIuMCAqLworIHsgezAsNiwxMiwxOCwyNCwzMCwzNiw0NCw1NCw2Niw4MCw5NiwxMTYsMTQwLDE2OCwyMDAsMjM4LDI4NCwzMzYsMzk2LDQ2NCw1MjIsNTc2fSwKKyAgIHs2LDYsNiw2LDYsNiw4LDEwLDEyLDE0LDE2LDIwLDI0LDI4LDMyLDM4LDQ2LDUyLDYwLDY4LDU4LDU0IH0gLAorICAgezAsNCozLDgqMywxMiozLDE4KjMsMjQqMywzMiozLDQyKjMsNTYqMyw3NCozLDEwMCozLDEzMiozLDE3NCozLDE5MiozfSAsCisgICB7NCw0LDQsNiw2LDgsMTAsMTQsMTgsMjYsMzIsNDIsMTggfSB9ICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvY3M6IDMzMi4gbXBnMTIzOiAzMzAgKi8KKyB7IHswLDYsMTIsMTgsMjQsMzAsMzYsNDQsNTQsNjYsODAsOTYsMTE0LDEzNiwxNjIsMTk0LDIzMiwyNzgsMzMyLDM5NCw0NjQsNTQwLDU3Nn0sCisgICB7Niw2LDYsNiw2LDYsOCwxMCwxMiwxNCwxNiwxOCwyMiwyNiwzMiwzOCw0Niw1NCw2Miw3MCw3NiwzNiB9ICwKKyAgIHswLDQqMyw4KjMsMTIqMywxOCozLDI2KjMsMzYqMyw0OCozLDYyKjMsODAqMywxMDQqMywxMzYqMywxODAqMywxOTIqM30gLAorICAgezQsNCw0LDYsOCwxMCwxMiwxNCwxOCwyNCwzMiw0NCwxMiB9IH0gLAorCisgeyB7MCw2LDEyLDE4LDI0LDMwLDM2LDQ0LDU0LDY2LDgwLDk2LDExNiwxNDAsMTY4LDIwMCwyMzgsMjg0LDMzNiwzOTYsNDY0LDUyMiw1NzZ9LAorICAgezYsNiw2LDYsNiw2LDgsMTAsMTIsMTQsMTYsMjAsMjQsMjgsMzIsMzgsNDYsNTIsNjAsNjgsNTgsNTQgfSwKKyAgIHswLDQqMyw4KjMsMTIqMywxOCozLDI2KjMsMzYqMyw0OCozLDYyKjMsODAqMywxMDQqMywxMzQqMywxNzQqMywxOTIqM30sCisgICB7NCw0LDQsNiw4LDEwLDEyLDE0LDE4LDI0LDMwLDQwLDE4IH0gfSAsCisvKiBNUEVHIDIuNSAqLworIHsgezAsNiwxMiwxOCwyNCwzMCwzNiw0NCw1NCw2Niw4MCw5NiwxMTYsMTQwLDE2OCwyMDAsMjM4LDI4NCwzMzYsMzk2LDQ2NCw1MjIsNTc2fSAsCisgICB7Niw2LDYsNiw2LDYsOCwxMCwxMiwxNCwxNiwyMCwyNCwyOCwzMiwzOCw0Niw1Miw2MCw2OCw1OCw1NH0sCisgICB7MCwxMiwyNCwzNiw1NCw3OCwxMDgsMTQ0LDE4NiwyNDAsMzEyLDQwMiw1MjIsNTc2fSwKKyAgIHs0LDQsNCw2LDgsMTAsMTIsMTQsMTgsMjQsMzAsNDAsMTh9IH0sCisgeyB7MCw2LDEyLDE4LDI0LDMwLDM2LDQ0LDU0LDY2LDgwLDk2LDExNiwxNDAsMTY4LDIwMCwyMzgsMjg0LDMzNiwzOTYsNDY0LDUyMiw1NzZ9ICwKKyAgIHs2LDYsNiw2LDYsNiw4LDEwLDEyLDE0LDE2LDIwLDI0LDI4LDMyLDM4LDQ2LDUyLDYwLDY4LDU4LDU0fSwKKyAgIHswLDEyLDI0LDM2LDU0LDc4LDEwOCwxNDQsMTg2LDI0MCwzMTIsNDAyLDUyMiw1NzZ9LAorICAgezQsNCw0LDYsOCwxMCwxMiwxNCwxOCwyNCwzMCw0MCwxOH0gfSwKKyB7IHswLDEyLDI0LDM2LDQ4LDYwLDcyLDg4LDEwOCwxMzIsMTYwLDE5MiwyMzIsMjgwLDMzNiw0MDAsNDc2LDU2Niw1NjgsNTcwLDU3Miw1NzQsNTc2fSwKKyAgIHsxMiwxMiwxMiwxMiwxMiwxMiwxNiwyMCwyNCwyOCwzMiw0MCw0OCw1Niw2NCw3Niw5MCwyLDIsMiwyLDJ9LAorICAgezAsIDI0LCA0OCwgNzIsMTA4LDE1NiwyMTYsMjg4LDM3Miw0ODAsNDg2LDQ5Miw0OTgsNTc2fSwKKyAgIHs4LDgsOCwxMiwxNiwyMCwyNCwyOCwzNiwyLDIsMiwyNn0gfSAsCit9OworLyogKklOREVOVC1PTiogKi8KKworc3RhdGljIGludCBtYXBidWYwWzldWzE1Ml07CitzdGF0aWMgaW50IG1hcGJ1ZjFbOV1bMTU2XTsKK3N0YXRpYyBpbnQgbWFwYnVmMls5XVs0NF07CitzdGF0aWMgaW50ICptYXBbOV1bM107CitzdGF0aWMgaW50ICptYXBlbmRbOV1bM107CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbl9zbGVuMls1MTJdOyAvKiBNUEVHIDIuMCBzbGVuIGZvciAnbm9ybWFsJyBtb2RlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlfc2xlbjJbMjU2XTsgLyogTVBFRyAyLjAgc2xlbiBmb3IgaW50ZW5zaXR5IHN0ZXJlbyAqLworCitzdGF0aWMgcmVhbCB0YW4xXzFbMTZdLCB0YW4yXzFbMTZdLCB0YW4xXzJbMTZdLCB0YW4yXzJbMTZdOworc3RhdGljIHJlYWwgcG93MV8xWzJdWzE2XSwgcG93Ml8xWzJdWzE2XSwgcG93MV8yWzJdWzE2XSwgcG93Ml8yWzJdWzE2XTsKKworc3RhdGljIHVuc2lnbmVkIGludAorZ2V0MWJpdChQTVBTVFIgbXApCit7CisgICAgdW5zaWduZWQgY2hhciBydmFsOworICAgIHJ2YWwgPSAqbXAtPndvcmRwb2ludGVyIDw8IG1wLT5iaXRpbmRleDsKKworICAgIG1wLT5iaXRpbmRleCsrOworICAgIG1wLT53b3JkcG9pbnRlciArPSAobXAtPmJpdGluZGV4ID4+IDMpOworICAgIG1wLT5iaXRpbmRleCAmPSA3OworCisgICAgcmV0dXJuIHJ2YWwgPj4gNzsKK30KKworCisKKworLyogCisgKiBpbml0IHRhYmxlcyBmb3IgbGF5ZXItMyAKKyAqLwordm9pZAoraW5pdF9sYXllcjMoaW50IGRvd25fc2FtcGxlX3NibGltaXQpCit7CisgICAgaW50ICAgICBpLCBqLCBrOworCisgICAgZm9yIChpID0gLTI1NjsgaSA8IDExOCArIDQ7IGkrKykKKyAgICAgICAgZ2FpbnBvdzJbaSArIDI1Nl0gPSBwb3coKGRvdWJsZSkgMi4wLCAtMC4yNSAqIChkb3VibGUpIChpICsgMjEwKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODIwNzsgaSsrKQorICAgICAgICBpc3Bvd1tpXSA9IHBvdygoZG91YmxlKSBpLCAoZG91YmxlKSA0LjAgLyAzLjApOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBzdGF0aWMgZG91YmxlIENpWzhdID0geyAtMC42LCAtMC41MzUsIC0wLjMzLCAtMC4xODUsIC0wLjA5NSwgLTAuMDQxLCAtMC4wMTQyLCAtMC4wMDM3IH07CisgICAgICAgIGRvdWJsZSAgc3EgPSBzcXJ0KDEuMCArIENpW2ldICogQ2lbaV0pOworICAgICAgICBhYV9jc1tpXSA9IDEuMCAvIHNxOworICAgICAgICBhYV9jYVtpXSA9IENpW2ldIC8gc3E7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE4OyBpKyspIHsKKyAgICAgICAgd2luWzBdW2ldID0gd2luWzFdW2ldID0KKyAgICAgICAgICAgIDAuNSAqIHNpbihNX1BJIC8gNzIuMCAqIChkb3VibGUpICgyICogKGkgKyAwKSArIDEpKSAvIGNvcyhNX1BJICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSAoMiAqIChpICsgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSkgLyA3Mi4wKTsKKyAgICAgICAgd2luWzBdW2kgKyAxOF0gPSB3aW5bM11baSArIDE4XSA9CisgICAgICAgICAgICAwLjUgKiBzaW4oTV9QSSAvIDcyLjAgKiAoZG91YmxlKSAoMiAqIChpICsgMTgpICsgMSkpIC8gY29zKE1fUEkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSAoMiAqIChpICsgMTgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5KSAvIDcyLjApOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIHdpblsxXVtpICsgMThdID0gMC41IC8gY29zKE1fUEkgKiAoZG91YmxlKSAoMiAqIChpICsgMTgpICsgMTkpIC8gNzIuMCk7CisgICAgICAgIHdpblszXVtpICsgMTJdID0gMC41IC8gY29zKE1fUEkgKiAoZG91YmxlKSAoMiAqIChpICsgMTIpICsgMTkpIC8gNzIuMCk7CisgICAgICAgIHdpblsxXVtpICsgMjRdID0KKyAgICAgICAgICAgIDAuNSAqIHNpbihNX1BJIC8gMjQuMCAqIChkb3VibGUpICgyICogaSArIDEzKSkgLyBjb3MoTV9QSSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpICgyICogKGkgKyAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkpIC8gNzIuMCk7CisgICAgICAgIHdpblsxXVtpICsgMzBdID0gd2luWzNdW2ldID0gMC4wOworICAgICAgICB3aW5bM11baSArIDZdID0KKyAgICAgICAgICAgIDAuNSAqIHNpbihNX1BJIC8gMjQuMCAqIChkb3VibGUpICgyICogaSArIDEpKSAvIGNvcyhNX1BJICogKGRvdWJsZSkgKDIgKiAoaSArIDYpICsgMTkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3Mi4wKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgICAgICBDT1M5W2ldID0gY29zKE1fUEkgLyAxOC4wICogKGRvdWJsZSkgaSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgICAgICB0ZmNvczM2W2ldID0gMC41IC8gY29zKE1fUEkgKiAoZG91YmxlKSAoaSAqIDIgKyAxKSAvIDM2LjApOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHRmY29zMTJbaV0gPSAwLjUgLyBjb3MoTV9QSSAqIChkb3VibGUpIChpICogMiArIDEpIC8gMTIuMCk7CisKKyAgICBDT1M2XzEgPSBjb3MoTV9QSSAvIDYuMCAqIChkb3VibGUpIDEpOworICAgIENPUzZfMiA9IGNvcyhNX1BJIC8gNi4wICogKGRvdWJsZSkgMik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICB3aW5bMl1baV0gPQorICAgICAgICAgICAgMC41ICogc2luKE1fUEkgLyAyNC4wICogKGRvdWJsZSkgKDIgKiBpICsgMSkpIC8gY29zKE1fUEkgKiAoZG91YmxlKSAoMiAqIGkgKyA3KSAvIDI0LjApOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgQ09TMVtpXVtqXSA9IGNvcyhNX1BJIC8gMjQuMCAqIChkb3VibGUpICgoMiAqIGkgKyA3KSAqICgyICogaiArIDEpKSk7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICBzdGF0aWMgaW50IGxlbls0XSA9IHsgMzYsIDM2LCAxMiwgMzYgfTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbltqXTsgaSArPSAyKQorICAgICAgICAgICAgd2luMVtqXVtpXSA9ICt3aW5bal1baV07CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW5bal07IGkgKz0gMikKKyAgICAgICAgICAgIHdpbjFbal1baV0gPSAtd2luW2pdW2ldOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGRvdWJsZSAgdCA9IHRhbigoZG91YmxlKSBpICogTV9QSSAvIDEyLjApOworICAgICAgICB0YW4xXzFbaV0gPSB0IC8gKDEuMCArIHQpOworICAgICAgICB0YW4yXzFbaV0gPSAxLjAgLyAoMS4wICsgdCk7CisgICAgICAgIHRhbjFfMltpXSA9IE1fU1FSVDIgKiB0IC8gKDEuMCArIHQpOworICAgICAgICB0YW4yXzJbaV0gPSBNX1NRUlQyIC8gKDEuMCArIHQpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSAgYmFzZSA9IHBvdygyLjAsIC0wLjI1ICogKGogKyAxLjApKTsKKyAgICAgICAgICAgIGRvdWJsZSAgcDEgPSAxLjAsIHAyID0gMS4wOworICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgJiAxKQorICAgICAgICAgICAgICAgICAgICBwMSA9IHBvdyhiYXNlLCAoaSArIDEuMCkgKiAwLjUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcDIgPSBwb3coYmFzZSwgaSAqIDAuNSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3cxXzFbal1baV0gPSBwMTsKKyAgICAgICAgICAgIHBvdzJfMVtqXVtpXSA9IHAyOworICAgICAgICAgICAgcG93MV8yW2pdW2ldID0gTV9TUVJUMiAqIHAxOworICAgICAgICAgICAgcG93Ml8yW2pdW2ldID0gTV9TUVJUMiAqIHAyOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IDk7IGorKykgeworICAgICAgICBzdHJ1Y3QgYmFuZEluZm9TdHJ1Y3QgY29uc3QgKmJpID0gKHN0cnVjdCBiYW5kSW5mb1N0cnVjdCBjb25zdCAqKSAmYmFuZEluZm9bal07CisgICAgICAgIGludCAgICAqbXA7CisgICAgICAgIGludCAgICAgY2IsIGx3aW47CisgICAgICAgIHNob3J0IGNvbnN0ICpiZGY7CisKKyAgICAgICAgbXAgPSBtYXBbal1bMF0gPSBtYXBidWYwW2pdOworICAgICAgICBiZGYgPSBiaS0+bG9uZ0RpZmY7CisgICAgICAgIGZvciAoaSA9IDAsIGNiID0gMDsgY2IgPCA4OyBjYisrLCBpICs9ICpiZGYrKykgeworICAgICAgICAgICAgKm1wKysgPSAoKmJkZikgPj4gMTsKKyAgICAgICAgICAgICptcCsrID0gaTsKKyAgICAgICAgICAgICptcCsrID0gMzsKKyAgICAgICAgICAgICptcCsrID0gY2I7CisgICAgICAgIH0KKyAgICAgICAgYmRmID0gYmktPnNob3J0RGlmZiArIDM7CisgICAgICAgIGZvciAoY2IgPSAzOyBjYiA8IDEzOyBjYisrKSB7CisgICAgICAgICAgICBpbnQgICAgIGwgPSAoKmJkZisrKSA+PiAxOworICAgICAgICAgICAgZm9yIChsd2luID0gMDsgbHdpbiA8IDM7IGx3aW4rKykgeworICAgICAgICAgICAgICAgICptcCsrID0gbDsKKyAgICAgICAgICAgICAgICAqbXArKyA9IGkgKyBsd2luOworICAgICAgICAgICAgICAgICptcCsrID0gbHdpbjsKKyAgICAgICAgICAgICAgICAqbXArKyA9IGNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSArPSA2ICogbDsKKyAgICAgICAgfQorICAgICAgICBtYXBlbmRbal1bMF0gPSBtcDsKKworICAgICAgICBtcCA9IG1hcFtqXVsxXSA9IG1hcGJ1ZjFbal07CisgICAgICAgIGJkZiA9IGJpLT5zaG9ydERpZmYgKyAwOworICAgICAgICBmb3IgKGkgPSAwLCBjYiA9IDA7IGNiIDwgMTM7IGNiKyspIHsKKyAgICAgICAgICAgIGludCAgICAgbCA9ICgqYmRmKyspID4+IDE7CisgICAgICAgICAgICBmb3IgKGx3aW4gPSAwOyBsd2luIDwgMzsgbHdpbisrKSB7CisgICAgICAgICAgICAgICAgKm1wKysgPSBsOworICAgICAgICAgICAgICAgICptcCsrID0gaSArIGx3aW47CisgICAgICAgICAgICAgICAgKm1wKysgPSBsd2luOworICAgICAgICAgICAgICAgICptcCsrID0gY2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpICs9IDYgKiBsOworICAgICAgICB9CisgICAgICAgIG1hcGVuZFtqXVsxXSA9IG1wOworCisgICAgICAgIG1wID0gbWFwW2pdWzJdID0gbWFwYnVmMltqXTsKKyAgICAgICAgYmRmID0gYmktPmxvbmdEaWZmOworICAgICAgICBmb3IgKGNiID0gMDsgY2IgPCAyMjsgY2IrKykgeworICAgICAgICAgICAgKm1wKysgPSAoKmJkZisrKSA+PiAxOworICAgICAgICAgICAgKm1wKysgPSBjYjsKKyAgICAgICAgfQorICAgICAgICBtYXBlbmRbal1bMl0gPSBtcDsKKworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCA5OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIzOyBpKyspIHsKKyAgICAgICAgICAgIGxvbmdMaW1pdFtqXVtpXSA9IChiYW5kSW5mb1tqXS5sb25nSWR4W2ldIC0gMSArIDgpIC8gMTggKyAxOworICAgICAgICAgICAgaWYgKGxvbmdMaW1pdFtqXVtpXSA+IChkb3duX3NhbXBsZV9zYmxpbWl0KSkKKyAgICAgICAgICAgICAgICBsb25nTGltaXRbal1baV0gPSBkb3duX3NhbXBsZV9zYmxpbWl0OworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisgICAgICAgICAgICBzaG9ydExpbWl0W2pdW2ldID0gKGJhbmRJbmZvW2pdLnNob3J0SWR4W2ldIC0gMSkgLyAxOCArIDE7CisgICAgICAgICAgICBpZiAoc2hvcnRMaW1pdFtqXVtpXSA+IChkb3duX3NhbXBsZV9zYmxpbWl0KSkKKyAgICAgICAgICAgICAgICBzaG9ydExpbWl0W2pdW2ldID0gZG93bl9zYW1wbGVfc2JsaW1pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykgeworICAgICAgICAgICAgICAgIGludCAgICAgbiA9IGsgKyBqICogNiArIGkgKiAzNjsKKyAgICAgICAgICAgICAgICBpX3NsZW4yW25dID0gaSB8IChqIDw8IDMpIHwgKGsgPDwgNikgfCAoMyA8PCAxMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICBuID0gayArIGogKiA0ICsgaSAqIDE2OworICAgICAgICAgICAgICAgIGlfc2xlbjJbbiArIDE4MF0gPSBpIHwgKGogPDwgMykgfCAoayA8PCA2KSB8ICg0IDw8IDEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgIGludCAgICAgbiA9IGogKyBpICogMzsKKyAgICAgICAgICAgIGlfc2xlbjJbbiArIDI0NF0gPSBpIHwgKGogPDwgMykgfCAoNSA8PCAxMik7CisgICAgICAgICAgICBuX3NsZW4yW24gKyA1MDBdID0gaSB8IChqIDw8IDMpIHwgKDIgPDwgMTIpIHwgKDEgPDwgMTUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICBsOworICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCA0OyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICBuID0gbCArIGsgKiA0ICsgaiAqIDE2ICsgaSAqIDgwOworICAgICAgICAgICAgICAgICAgICBuX3NsZW4yW25dID0gaSB8IChqIDw8IDMpIHwgKGsgPDwgNikgfCAobCA8PCA5KSB8ICgwIDw8IDEyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICBuID0gayArIGogKiA0ICsgaSAqIDIwOworICAgICAgICAgICAgICAgIG5fc2xlbjJbbiArIDQwMF0gPSBpIHwgKGogPDwgMykgfCAoayA8PCA2KSB8ICgxIDw8IDEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIHJlYWQgYWRkaXRpb25hbCBzaWRlIGluZm9ybWF0aW9uCisgKi8KKworc3RhdGljIHZvaWQKK0lJSV9nZXRfc2lkZV9pbmZvXzEoUE1QU1RSIG1wLCBzdHJ1Y3QgSUlJX3NpZGVpbmZvICpzaSwgaW50IHN0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgaW50IG1zX3N0ZXJlbywgbG9uZyBzZnJlcSwgaW50IHNpbmdsZSkKK3sKKyAgICBpbnQgICAgIGNoLCBncjsKKyAgICBpbnQgICAgIHBvd2RpZmYgPSAoc2luZ2xlID09IDMpID8gNCA6IDA7CisKKyAgICBzaS0+bWFpbl9kYXRhX2JlZ2luID0gZ2V0Yml0cyhtcCwgOSk7CisgICAgaWYgKHN0ZXJlbyA9PSAxKQorICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzID0gZ2V0Yml0c19mYXN0KG1wLCA1KTsKKyAgICBlbHNlCisgICAgICAgIHNpLT5wcml2YXRlX2JpdHMgPSBnZXRiaXRzX2Zhc3QobXAsIDMpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgc3RlcmVvOyBjaCsrKSB7CisgICAgICAgIHNpLT5jaFtjaF0uZ3JbMF0uc2Nmc2kgPSAtMTsKKyAgICAgICAgc2ktPmNoW2NoXS5nclsxXS5zY2ZzaSA9IGdldGJpdHNfZmFzdChtcCwgNCk7CisgICAgfQorCisgICAgZm9yIChnciA9IDA7IGdyIDwgMjsgZ3IrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW87IGNoKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBncl9pbmZvX3MgKmdyX2luZm9zID0gJihzaS0+Y2hbY2hdLmdyW2dyXSk7CisKKyAgICAgICAgICAgIGdyX2luZm9zLT5wYXJ0Ml8zX2xlbmd0aCA9IGdldGJpdHMobXAsIDEyKTsKKyAgICAgICAgICAgIGdyX2luZm9zLT5iaWdfdmFsdWVzID0gZ2V0Yml0c19mYXN0KG1wLCA5KTsKKyAgICAgICAgICAgIGlmIChncl9pbmZvcy0+YmlnX3ZhbHVlcyA+IDI4OCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmlnX3ZhbHVlcyB0b28gbGFyZ2UhICVpXG4iLCBncl9pbmZvcy0+YmlnX3ZhbHVlcyk7CisgICAgICAgICAgICAgICAgZ3JfaW5mb3MtPmJpZ192YWx1ZXMgPSAyODg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHFzcyA9IGdldGJpdHNfZmFzdChtcCwgOCk7CisgICAgICAgICAgICAgICAgZ3JfaW5mb3MtPnBvdzJnYWluID0gZ2FpbnBvdzIgKyAyNTYgLSBxc3MgKyBwb3dkaWZmOworICAgICAgICAgICAgICAgIGlmIChtcC0+cGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtcC0+cGluZm8tPnFzc1tncl1bY2hdID0gcXNzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtc19zdGVyZW8pCisgICAgICAgICAgICAgICAgZ3JfaW5mb3MtPnBvdzJnYWluICs9IDI7CisgICAgICAgICAgICBncl9pbmZvcy0+c2NhbGVmYWNfY29tcHJlc3MgPSBnZXRiaXRzX2Zhc3QobXAsIDQpOworLyogd2luZG93LXN3aXRjaGluZyBmbGFnID09IDEgZm9yIGJsb2NrX1R5cGUgIT0gMCAuLiBhbmQgYmxvY2stdHlwZSA9PSAwIC0+IHdpbi1zdy1mbGFnID0gMCAqLworICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICBpOworICAgICAgICAgICAgICAgIGdyX2luZm9zLT5ibG9ja190eXBlID0gZ2V0Yml0c19mYXN0KG1wLCAyKTsKKyAgICAgICAgICAgICAgICBncl9pbmZvcy0+bWl4ZWRfYmxvY2tfZmxhZyA9IGdldDFiaXQobXApOworICAgICAgICAgICAgICAgIGdyX2luZm9zLT50YWJsZV9zZWxlY3RbMF0gPSBnZXRiaXRzX2Zhc3QobXAsIDUpOworICAgICAgICAgICAgICAgIGdyX2luZm9zLT50YWJsZV9zZWxlY3RbMV0gPSBnZXRiaXRzX2Zhc3QobXAsIDUpOworCisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIHRhYmxlX3NlbGVjdFsyXSBub3QgbmVlZGVkLCBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlZ2lvbjIsCisgICAgICAgICAgICAgICAgICogYnV0IHRvIHNhdGlzZnkgc29tZSB2ZXJpZmljYXRpb25zIHRvb2xzIHdlIHNldCBpdCBlaXRoZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZ3JfaW5mb3MtPnRhYmxlX3NlbGVjdFsyXSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2JnID0gKGdldGJpdHNfZmFzdChtcCwgMykgPDwgMyk7CisgICAgICAgICAgICAgICAgICAgIGdyX2luZm9zLT5mdWxsX2dhaW5baV0gPSBncl9pbmZvcy0+cG93MmdhaW4gKyBzYmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChtcC0+cGluZm8gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wLT5waW5mby0+c3ViX2dhaW5bZ3JdW2NoXVtpXSA9IHNiZyAvIDg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGdyX2luZm9zLT5ibG9ja190eXBlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCbG9ja3R5cGUgPT0gMCBhbmQgd2luZG93LXN3aXRjaGluZyA9PSAxIG5vdCBhbGxvd2VkLlxuIik7CisgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIHNlZW1zIHRvIGJlIHZlcnkgZ29vZCByZWNvdmVyYWJsZSwgc28gZG9uJ3QgZXhpdCAqLworICAgICAgICAgICAgICAgICAgICAvKiBleGl0KDEpOyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiByZWdpb25fY291bnQvc3RhcnQgcGFyYW1ldGVycyBhcmUgaW1wbGljaXQgaW4gdGhpcyBjYXNlLiAqLworICAgICAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24xc3RhcnQgPSAzNiA+PiAxOworICAgICAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24yc3RhcnQgPSA1NzYgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCAgICAgaSwgcjBjLCByMWM7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZ3JfaW5mb3MtPnRhYmxlX3NlbGVjdFtpXSA9IGdldGJpdHNfZmFzdChtcCwgNSk7CisgICAgICAgICAgICAgICAgcjBjID0gZ2V0Yml0c19mYXN0KG1wLCA0KTsKKyAgICAgICAgICAgICAgICByMWMgPSBnZXRiaXRzX2Zhc3QobXAsIDMpOworICAgICAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24xc3RhcnQgPSBiYW5kSW5mb1tzZnJlcV0ubG9uZ0lkeFtyMGMgKyAxXSA+PiAxOworICAgICAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24yc3RhcnQgPSBiYW5kSW5mb1tzZnJlcV0ubG9uZ0lkeFtyMGMgKyAxICsgcjFjICsgMV0gPj4gMTsKKyAgICAgICAgICAgICAgICBncl9pbmZvcy0+YmxvY2tfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgZ3JfaW5mb3MtPm1peGVkX2Jsb2NrX2ZsYWcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3JfaW5mb3MtPnByZWZsYWcgPSBnZXQxYml0KG1wKTsKKyAgICAgICAgICAgIGdyX2luZm9zLT5zY2FsZWZhY19zY2FsZSA9IGdldDFiaXQobXApOworICAgICAgICAgICAgZ3JfaW5mb3MtPmNvdW50MXRhYmxlX3NlbGVjdCA9IGdldDFiaXQobXApOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogU2lkZSBJbmZvIGZvciBNUEVHIDIuMCAvIExTRgorICovCitzdGF0aWMgdm9pZAorSUlJX2dldF9zaWRlX2luZm9fMihQTVBTVFIgbXAsIHN0cnVjdCBJSUlfc2lkZWluZm8gKnNpLCBpbnQgc3RlcmVvLAorICAgICAgICAgICAgICAgICAgICBpbnQgbXNfc3RlcmVvLCBsb25nIHNmcmVxLCBpbnQgc2luZ2xlKQoreworICAgIGludCAgICAgY2g7CisgICAgaW50ICAgICBwb3dkaWZmID0gKHNpbmdsZSA9PSAzKSA/IDQgOiAwOworCisgICAgc2ktPm1haW5fZGF0YV9iZWdpbiA9IGdldGJpdHMobXAsIDgpOworCisgICAgaWYgKHN0ZXJlbyA9PSAxKQorICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzID0gZ2V0MWJpdChtcCk7CisgICAgZWxzZQorICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzID0gZ2V0Yml0c19mYXN0KG1wLCAyKTsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHN0ZXJlbzsgY2grKykgeworICAgICAgICBzdHJ1Y3QgZ3JfaW5mb19zICpncl9pbmZvcyA9ICYoc2ktPmNoW2NoXS5nclswXSk7CisgICAgICAgIHVuc2lnbmVkIGludCBxc3M7CisKKyAgICAgICAgZ3JfaW5mb3MtPnBhcnQyXzNfbGVuZ3RoID0gZ2V0Yml0cyhtcCwgMTIpOworICAgICAgICBncl9pbmZvcy0+YmlnX3ZhbHVlcyA9IGdldGJpdHNfZmFzdChtcCwgOSk7CisgICAgICAgIGlmIChncl9pbmZvcy0+YmlnX3ZhbHVlcyA+IDI4OCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiaWdfdmFsdWVzIHRvbyBsYXJnZSEgJWlcbiIsIGdyX2luZm9zLT5iaWdfdmFsdWVzKTsKKyAgICAgICAgICAgIGdyX2luZm9zLT5iaWdfdmFsdWVzID0gMjg4OworICAgICAgICB9CisgICAgICAgIHFzcyA9IGdldGJpdHNfZmFzdChtcCwgOCk7CisgICAgICAgIGdyX2luZm9zLT5wb3cyZ2FpbiA9IGdhaW5wb3cyICsgMjU2IC0gcXNzICsgcG93ZGlmZjsKKyAgICAgICAgaWYgKG1wLT5waW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBtcC0+cGluZm8tPnFzc1swXVtjaF0gPSBxc3M7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChtc19zdGVyZW8pCisgICAgICAgICAgICBncl9pbmZvcy0+cG93MmdhaW4gKz0gMjsKKyAgICAgICAgZ3JfaW5mb3MtPnNjYWxlZmFjX2NvbXByZXNzID0gZ2V0Yml0cyhtcCwgOSk7CisvKiB3aW5kb3ctc3dpdGNoaW5nIGZsYWcgPT0gMSBmb3IgYmxvY2tfVHlwZSAhPSAwIC4uIGFuZCBibG9jay10eXBlID09IDAgLT4gd2luLXN3LWZsYWcgPSAwICovCisgICAgICAgIGlmIChnZXQxYml0KG1wKSkgeworICAgICAgICAgICAgaW50ICAgICBpOworICAgICAgICAgICAgZ3JfaW5mb3MtPmJsb2NrX3R5cGUgPSBnZXRiaXRzX2Zhc3QobXAsIDIpOworICAgICAgICAgICAgZ3JfaW5mb3MtPm1peGVkX2Jsb2NrX2ZsYWcgPSBnZXQxYml0KG1wKTsKKyAgICAgICAgICAgIGdyX2luZm9zLT50YWJsZV9zZWxlY3RbMF0gPSBnZXRiaXRzX2Zhc3QobXAsIDUpOworICAgICAgICAgICAgZ3JfaW5mb3MtPnRhYmxlX3NlbGVjdFsxXSA9IGdldGJpdHNfZmFzdChtcCwgNSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGFibGVfc2VsZWN0WzJdIG5vdCBuZWVkZWQsIGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVnaW9uMiwKKyAgICAgICAgICAgICAqIGJ1dCB0byBzYXRpc2Z5IHNvbWUgdmVyaWZpY2F0aW9ucyB0b29scyB3ZSBzZXQgaXQgZWl0aGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBncl9pbmZvcy0+dGFibGVfc2VsZWN0WzJdID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2JnID0gKGdldGJpdHNfZmFzdChtcCwgMykgPDwgMyk7CisgICAgICAgICAgICAgICAgZ3JfaW5mb3MtPmZ1bGxfZ2FpbltpXSA9IGdyX2luZm9zLT5wb3cyZ2FpbiArIHNiZzsKKyAgICAgICAgICAgICAgICBpZiAobXAtPnBpbmZvICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIG1wLT5waW5mby0+c3ViX2dhaW5bMF1bY2hdW2ldID0gc2JnIC8gODsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZ3JfaW5mb3MtPmJsb2NrX3R5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmxvY2t0eXBlID09IDAgYW5kIHdpbmRvdy1zd2l0Y2hpbmcgPT0gMSBub3QgYWxsb3dlZC5cbiIpOworICAgICAgICAgICAgICAgIC8qIGVycm9yIHNlZW1zIHRvIGJlIHZlcnkgZ29vZCByZWNvdmVyYWJsZSwgc28gZG9uJ3QgZXhpdCAqLworICAgICAgICAgICAgICAgIC8qIGV4aXQoMSk7ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZWdpb25fY291bnQvc3RhcnQgcGFyYW1ldGVycyBhcmUgaW1wbGljaXQgaW4gdGhpcyBjYXNlLiAqLworLyogY2hlY2sgdGhpcyBhZ2FpbiEgKi8KKyAgICAgICAgICAgIGlmIChncl9pbmZvcy0+YmxvY2tfdHlwZSA9PSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKHNmcmVxID09IDgpCisgICAgICAgICAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24xc3RhcnQgPSAzNjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24xc3RhcnQgPSAzNiA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2ZyZXEgPT0gOCkKKy8qIGNoZWNrIHRoaXMgZm9yIDIuNSBhbmQgc2ZyZXE9OCAqLworICAgICAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24xc3RhcnQgPSAxMDggPj4gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBncl9pbmZvcy0+cmVnaW9uMXN0YXJ0ID0gNTQgPj4gMTsKKyAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24yc3RhcnQgPSA1NzYgPj4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCAgICAgaSwgcjBjLCByMWM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIGdyX2luZm9zLT50YWJsZV9zZWxlY3RbaV0gPSBnZXRiaXRzX2Zhc3QobXAsIDUpOworICAgICAgICAgICAgcjBjID0gZ2V0Yml0c19mYXN0KG1wLCA0KTsKKyAgICAgICAgICAgIHIxYyA9IGdldGJpdHNfZmFzdChtcCwgMyk7CisgICAgICAgICAgICBncl9pbmZvcy0+cmVnaW9uMXN0YXJ0ID0gYmFuZEluZm9bc2ZyZXFdLmxvbmdJZHhbcjBjICsgMV0gPj4gMTsKKyAgICAgICAgICAgIGdyX2luZm9zLT5yZWdpb24yc3RhcnQgPSBiYW5kSW5mb1tzZnJlcV0ubG9uZ0lkeFtyMGMgKyAxICsgcjFjICsgMV0gPj4gMTsKKyAgICAgICAgICAgIGdyX2luZm9zLT5ibG9ja190eXBlID0gMDsKKyAgICAgICAgICAgIGdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnID0gMDsKKyAgICAgICAgfQorICAgICAgICBncl9pbmZvcy0+c2NhbGVmYWNfc2NhbGUgPSBnZXQxYml0KG1wKTsKKyAgICAgICAgZ3JfaW5mb3MtPmNvdW50MXRhYmxlX3NlbGVjdCA9IGdldDFiaXQobXApOworICAgIH0KK30KKworLyoKKyAqIHJlYWQgc2NhbGVmYWN0b3JzCisgKi8KKworc3RhdGljIGludAorSUlJX2dldF9zY2FsZV9mYWN0b3JzXzEoUE1QU1RSIG1wLCBpbnQgKnNjZiwgc3RydWN0IGdyX2luZm9fcyAqZ3JfaW5mb3MpCit7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2xlblsyXVsxNl0gPSB7CisgICAgICAgIHswLCAwLCAwLCAwLCAzLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0fSwKKyAgICAgICAgezAsIDEsIDIsIDMsIDAsIDEsIDIsIDMsIDEsIDIsIDMsIDEsIDIsIDMsIDIsIDN9CisgICAgfTsKKyAgICBpbnQgICAgIG51bWJpdHM7CisgICAgaW50ICAgICBudW0wID0gc2xlblswXVtncl9pbmZvcy0+c2NhbGVmYWNfY29tcHJlc3NdOworICAgIGludCAgICAgbnVtMSA9IHNsZW5bMV1bZ3JfaW5mb3MtPnNjYWxlZmFjX2NvbXByZXNzXTsKKworICAgIGlmIChncl9pbmZvcy0+YmxvY2tfdHlwZSA9PSAyKSB7CisgICAgICAgIGludCAgICAgaSA9IDE4OworICAgICAgICBudW1iaXRzID0gKG51bTAgKyBudW0xKSAqIDE4OworCisgICAgICAgIGlmIChncl9pbmZvcy0+bWl4ZWRfYmxvY2tfZmxhZykgeworICAgICAgICAgICAgZm9yIChpID0gODsgaTsgaS0tKQorICAgICAgICAgICAgICAgICpzY2YrKyA9IGdldGJpdHNfZmFzdChtcCwgbnVtMCk7CisgICAgICAgICAgICBpID0gOTsKKyAgICAgICAgICAgIG51bWJpdHMgLT0gbnVtMDsgLyogbnVtMCAqIDE3ICsgbnVtMSAqIDE4ICovCisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgaTsgaS0tKQorICAgICAgICAgICAgKnNjZisrID0gZ2V0Yml0c19mYXN0KG1wLCBudW0wKTsKKyAgICAgICAgZm9yIChpID0gMTg7IGk7IGktLSkKKyAgICAgICAgICAgICpzY2YrKyA9IGdldGJpdHNfZmFzdChtcCwgbnVtMSk7CisgICAgICAgICpzY2YrKyA9IDA7CisgICAgICAgICpzY2YrKyA9IDA7CisgICAgICAgICpzY2YrKyA9IDA7ICAgICAvKiBzaG9ydFsxM11bMC4uMl0gPSAwICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgICAgIGk7CisgICAgICAgIGludCAgICAgc2Nmc2kgPSBncl9pbmZvcy0+c2Nmc2k7CisKKyAgICAgICAgaWYgKHNjZnNpIDwgMCkgeyAvKiBzY2ZzaSA8IDAgPT4gZ3JhbnVsZSA9PSAwICovCisgICAgICAgICAgICBmb3IgKGkgPSAxMTsgaTsgaS0tKQorICAgICAgICAgICAgICAgICpzY2YrKyA9IGdldGJpdHNfZmFzdChtcCwgbnVtMCk7CisgICAgICAgICAgICBmb3IgKGkgPSAxMDsgaTsgaS0tKQorICAgICAgICAgICAgICAgICpzY2YrKyA9IGdldGJpdHNfZmFzdChtcCwgbnVtMSk7CisgICAgICAgICAgICBudW1iaXRzID0gKG51bTAgKyBudW0xKSAqIDEwICsgbnVtMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG51bWJpdHMgPSAwOworICAgICAgICAgICAgaWYgKCEoc2Nmc2kgJiAweDgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gNjsgaTsgaS0tKQorICAgICAgICAgICAgICAgICAgICAqc2NmKysgPSBnZXRiaXRzX2Zhc3QobXAsIG51bTApOworICAgICAgICAgICAgICAgIG51bWJpdHMgKz0gbnVtMCAqIDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2YgKz0gNjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoc2Nmc2kgJiAweDQpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gNTsgaTsgaS0tKQorICAgICAgICAgICAgICAgICAgICAqc2NmKysgPSBnZXRiaXRzX2Zhc3QobXAsIG51bTApOworICAgICAgICAgICAgICAgIG51bWJpdHMgKz0gbnVtMCAqIDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2YgKz0gNTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoc2Nmc2kgJiAweDIpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gNTsgaTsgaS0tKQorICAgICAgICAgICAgICAgICAgICAqc2NmKysgPSBnZXRiaXRzX2Zhc3QobXAsIG51bTEpOworICAgICAgICAgICAgICAgIG51bWJpdHMgKz0gbnVtMSAqIDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2YgKz0gNTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoc2Nmc2kgJiAweDEpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gNTsgaTsgaS0tKQorICAgICAgICAgICAgICAgICAgICAqc2NmKysgPSBnZXRiaXRzX2Zhc3QobXAsIG51bTEpOworICAgICAgICAgICAgICAgIG51bWJpdHMgKz0gbnVtMSAqIDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2YgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICpzY2YrKyA9IDA7ICAgICAvKiBubyBsWzIxXSBpbiBvcmlnaW5hbCBzb3VyY2VzICovCisgICAgfQorICAgIHJldHVybiBudW1iaXRzOworfQorCisKK3N0YXRpYyBpbnQKK0lJSV9nZXRfc2NhbGVfZmFjdG9yc18yKFBNUFNUUiBtcCwgaW50ICpzY2YsIHN0cnVjdCBncl9pbmZvX3MgKmdyX2luZm9zLCBpbnQgaV9zdGVyZW8pCit7CisgICAgdW5zaWduZWQgY2hhciBjb25zdCAqcG50OworICAgIGludCAgICAgaSwgajsKKyAgICB1bnNpZ25lZCBpbnQgc2xlbjsKKyAgICBpbnQgICAgIG4gPSAwOworICAgIGludCAgICAgbnVtYml0cyA9IDA7CisKKyAgLyogKklOREVOVC1PRkYqICovCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN0YWJbM11bNl1bNF0gPSB7CisgICB7IHsgNiwgNSwgNSw1IH0gLCB7IDYsIDUsIDcsMyB9ICwgeyAxMSwxMCwwLDB9ICwKKyAgICAgeyA3LCA3LCA3LDAgfSAsIHsgNiwgNiwgNiwzIH0gLCB7ICA4LCA4LDUsMH0gfSAsCisgICB7IHsgOSwgOSwgOSw5IH0gLCB7IDksIDksMTIsNiB9ICwgeyAxOCwxOCwwLDB9ICwKKyAgICAgezEyLDEyLDEyLDAgfSAsIHsxMiwgOSwgOSw2IH0gLCB7IDE1LDEyLDksMH0gfSAsCisgICB7IHsgNiwgOSwgOSw5IH0gLCB7IDYsIDksMTIsNiB9ICwgeyAxNSwxOCwwLDB9ICwKKyAgICAgeyA2LDE1LDEyLDAgfSAsIHsgNiwxMiwgOSw2IH0gLCB7ICA2LDE4LDksMH0gfSB9OyAKKyAgLyogKklOREVOVC1PTiogKi8KKworICAgIGlmIChpX3N0ZXJlbykgICAgICAgLyogaV9zdGVyZW8gQU5EIHNlY29uZCBjaGFubmVsIC0+IGRvX2xheWVyMygpIGNoZWNrcyB0aGlzICovCisgICAgICAgIHNsZW4gPSBpX3NsZW4yW2dyX2luZm9zLT5zY2FsZWZhY19jb21wcmVzcyA+PiAxXTsKKyAgICBlbHNlCisgICAgICAgIHNsZW4gPSBuX3NsZW4yW2dyX2luZm9zLT5zY2FsZWZhY19jb21wcmVzc107CisKKyAgICBncl9pbmZvcy0+cHJlZmxhZyA9IChzbGVuID4+IDE1KSAmIDB4MTsKKworICAgIG4gPSAwOworICAgIGlmIChncl9pbmZvcy0+YmxvY2tfdHlwZSA9PSAyKSB7CisgICAgICAgIG4rKzsKKyAgICAgICAgaWYgKGdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnKQorICAgICAgICAgICAgbisrOworICAgIH0KKworICAgIHBudCA9ICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopIHN0YWJbbl1bKHNsZW4gPj4gMTIpICYgMHg3XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50ICAgICBudW0gPSBzbGVuICYgMHg3OworICAgICAgICBzbGVuID4+PSAzOworICAgICAgICBpZiAobnVtKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKGludCkgKHBudFtpXSk7IGorKykKKyAgICAgICAgICAgICAgICAqc2NmKysgPSBnZXRiaXRzX2Zhc3QobXAsIG51bSk7CisgICAgICAgICAgICBudW1iaXRzICs9IHBudFtpXSAqIG51bTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoaW50KSAocG50W2ldKTsgaisrKQorICAgICAgICAgICAgICAgICpzY2YrKyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuID0gKG4gPDwgMSkgKyAxOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICpzY2YrKyA9IDA7CisKKyAgICByZXR1cm4gbnVtYml0czsKK30KKworLyogKklOREVOVC1PRkYqICovCitzdGF0aWMgY29uc3QgaW50IHByZXRhYjEgWzIyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMywzLDMsMiwwfTsgLyogY2hhciBlbm91Z2ggPyAqLworc3RhdGljIGNvbnN0IGludCBwcmV0YWIyIFsyMl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisvKiAqSU5ERU5ULU9OKiAqLworCisvKgorICogZG9uJ3QgZm9yZ2V0IHRvIGFwcGx5IHRoZSBzYW1lIGNoYW5nZXMgdG8gSUlJX2RlcXVhbnRpemVfc2FtcGxlX21zKCkgISEhCisgKi8KK3N0YXRpYyBpbnQKK0lJSV9kZXF1YW50aXplX3NhbXBsZShQTVBTVFIgbXAsIHJlYWwgeHJbU0JMSU1JVF1bU1NMSU1JVF0sIGludCAqc2NmLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBncl9pbmZvX3MgKmdyX2luZm9zLCBpbnQgc2ZyZXEsIGludCBwYXJ0MmJpdHMpCit7CisgICAgaW50ICAgICBzaGlmdCA9IDEgKyBncl9pbmZvcy0+c2NhbGVmYWNfc2NhbGU7CisgICAgcmVhbCAgICp4cnBudCA9IChyZWFsICopIHhyOworICAgIGludCAgICAgbFszXSwgbDM7CisgICAgaW50ICAgICBwYXJ0MnJlbWFpbiA9IGdyX2luZm9zLT5wYXJ0Ml8zX2xlbmd0aCAtIHBhcnQyYml0czsKKyAgICBpbnQgICAgKm1lOworCisgICAgLyogZnByaW50ZihzdGRlcnIsInBhcnQycmVtYWluID0gJWQsIGdyX2luZm9zLT5wYXJ0Ml8zX2xlbmd0aCA9ICVkLCBwYXJ0MmJpdHMgPSAlZFxuIiwKKyAgICAgICBwYXJ0MnJlbWFpbiwgZ3JfaW5mb3MtPnBhcnQyXzNfbGVuZ3RoLCBwYXJ0MmJpdHMpOyAqLworCisgICAgeworICAgICAgICBpbnQgICAgIGk7CisKKyAgICAgICAgZm9yIChpID0gKCZ4cltTQkxJTUlUXVswXSAtIHhycG50KSA+PiAxOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAqeHJwbnQrKyA9IDAuMDsKKyAgICAgICAgICAgICp4cnBudCsrID0gMC4wOworICAgICAgICB9CisKKyAgICAgICAgeHJwbnQgPSAocmVhbCAqKSB4cjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGludCAgICAgYnYgPSBncl9pbmZvcy0+YmlnX3ZhbHVlczsKKyAgICAgICAgaW50ICAgICByZWdpb24xID0gZ3JfaW5mb3MtPnJlZ2lvbjFzdGFydDsKKyAgICAgICAgaW50ICAgICByZWdpb24yID0gZ3JfaW5mb3MtPnJlZ2lvbjJzdGFydDsKKworICAgICAgICBsMyA9ICgoNTc2ID4+IDEpIC0gYnYpID4+IDE7CisvKgorICogd2UgbWF5IGxvc2UgdGhlICdvZGQnIGJpdCBoZXJlICEhIAorICogY2hlY2sgdGhpcyBsYXRlciBhZ2FpbiAKKyAqLworICAgICAgICBpZiAoYnYgPD0gcmVnaW9uMSkgeworICAgICAgICAgICAgbFswXSA9IGJ2OworICAgICAgICAgICAgbFsxXSA9IDA7CisgICAgICAgICAgICBsWzJdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxbMF0gPSByZWdpb24xOworICAgICAgICAgICAgaWYgKGJ2IDw9IHJlZ2lvbjIpIHsKKyAgICAgICAgICAgICAgICBsWzFdID0gYnYgLSBsWzBdOworICAgICAgICAgICAgICAgIGxbMl0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbFsxXSA9IHJlZ2lvbjIgLSBsWzBdOworICAgICAgICAgICAgICAgIGxbMl0gPSBidiAtIHJlZ2lvbjI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogTURIIGNyYXNoIGZpeCAqLworICAgIHsKKyAgICAgICAgaW50ICAgICBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpZiAobFtpXSA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhpcDogQm9ndXMgcmVnaW9uIGxlbmd0aCAoJWQpXG4iLCBsW2ldKTsKKyAgICAgICAgICAgICAgICBsW2ldID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBlbmQgTURIIGNyYXNoIGZpeCAqLworCisgICAgaWYgKGdyX2luZm9zLT5ibG9ja190eXBlID09IDIpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZGVjb2Rpbmcgd2l0aCBzaG9ydCBvciBtaXhlZCBtb2RlIEJhbmRJbmRleCB0YWJsZSAKKyAgICAgICAgICovCisgICAgICAgIGludCAgICAgaSwgbWF4WzRdOworICAgICAgICBpbnQgICAgIHN0ZXAgPSAwLCBsd2luID0gMCwgY2IgPSAwOworICAgICAgICByZWFsICAgIHYgPSAwLjA7CisgICAgICAgIGludCAgICAqbSwgbWM7CisKKyAgICAgICAgaWYgKGdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnKSB7CisgICAgICAgICAgICBtYXhbM10gPSAtMTsKKyAgICAgICAgICAgIG1heFswXSA9IG1heFsxXSA9IG1heFsyXSA9IDI7CisgICAgICAgICAgICBtID0gbWFwW3NmcmVxXVswXTsKKyAgICAgICAgICAgIG1lID0gbWFwZW5kW3NmcmVxXVswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1heFswXSA9IG1heFsxXSA9IG1heFsyXSA9IG1heFszXSA9IC0xOworICAgICAgICAgICAgLyogbWF4WzNdIG5vdCByZWFsbHkgbmVlZGVkIGluIHRoaXMgY2FzZSAqLworICAgICAgICAgICAgbSA9IG1hcFtzZnJlcV1bMV07CisgICAgICAgICAgICBtZSA9IG1hcGVuZFtzZnJlcV1bMV07CisgICAgICAgIH0KKworICAgICAgICBtYyA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGludCAgICAgbHAgPSBsW2ldOworICAgICAgICAgICAgc3RydWN0IG5ld2h1ZmYgY29uc3QgKmggPSAoc3RydWN0IG5ld2h1ZmYgY29uc3QgKikgKGh0ICsgZ3JfaW5mb3MtPnRhYmxlX3NlbGVjdFtpXSk7CisgICAgICAgICAgICBmb3IgKDsgbHA7IGxwLS0sIG1jLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIHgsIHk7CisgICAgICAgICAgICAgICAgaWYgKCghbWMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1jID0gKm0rKzsKKyAgICAgICAgICAgICAgICAgICAgeHJwbnQgPSAoKHJlYWwgKikgeHIpICsgKCptKyspOworICAgICAgICAgICAgICAgICAgICBsd2luID0gKm0rKzsKKyAgICAgICAgICAgICAgICAgICAgY2IgPSAqbSsrOworICAgICAgICAgICAgICAgICAgICBpZiAobHdpbiA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ3JfaW5mb3MtPnBvdzJnYWluWygqc2NmKyspIDw8IHNoaWZ0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdyX2luZm9zLT5mdWxsX2dhaW5bbHdpbl1bKCpzY2YrKykgPDwgc2hpZnRdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9IDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaG9ydCBjb25zdCAqdmFsID0gKHNob3J0IGNvbnN0ICopIGgtPnRhYmxlOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHkgPSAqdmFsKyspIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCAtPSB5OworICAgICAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4tLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB4ID0geSA+PiA0OworICAgICAgICAgICAgICAgICAgICB5ICY9IDB4ZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHggPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4W2x3aW5dID0gY2I7CisgICAgICAgICAgICAgICAgICAgIHBhcnQycmVtYWluIC09IGgtPmxpbmJpdHMgKyAxOworICAgICAgICAgICAgICAgICAgICB4ICs9IGdldGJpdHMobXAsIChpbnQpIGgtPmxpbmJpdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0MWJpdChtcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAqeHJwbnQgPSAtaXNwb3dbeF0gKiB2OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqeHJwbnQgPSBpc3Bvd1t4XSAqIHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHgpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4W2x3aW5dID0gY2I7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXQxYml0KG1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICp4cnBudCA9IC1pc3Bvd1t4XSAqIHY7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICp4cnBudCA9IGlzcG93W3hdICogdjsKKyAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqeHJwbnQgPSAwLjA7CisgICAgICAgICAgICAgICAgeHJwbnQgKz0gc3RlcDsKKyAgICAgICAgICAgICAgICBpZiAoeSA9PSAxNSkgeworICAgICAgICAgICAgICAgICAgICBtYXhbbHdpbl0gPSBjYjsKKyAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4gLT0gaC0+bGluYml0cyArIDE7CisgICAgICAgICAgICAgICAgICAgIHkgKz0gZ2V0Yml0cyhtcCwgKGludCkgaC0+bGluYml0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXQxYml0KG1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICp4cnBudCA9IC1pc3Bvd1t5XSAqIHY7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICp4cnBudCA9IGlzcG93W3ldICogdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeSkgeworICAgICAgICAgICAgICAgICAgICBtYXhbbHdpbl0gPSBjYjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50ID0gLWlzcG93W3ldICogdjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50ID0gaXNwb3dbeV0gKiB2OworICAgICAgICAgICAgICAgICAgICBwYXJ0MnJlbWFpbi0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICp4cnBudCA9IDAuMDsKKyAgICAgICAgICAgICAgICB4cnBudCArPSBzdGVwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoOyBsMyAmJiAocGFydDJyZW1haW4gPiAwKTsgbDMtLSkgeworICAgICAgICAgICAgc3RydWN0IG5ld2h1ZmYgY29uc3QgKmggPSAoc3RydWN0IG5ld2h1ZmYgY29uc3QgKikgKGh0YyArIGdyX2luZm9zLT5jb3VudDF0YWJsZV9zZWxlY3QpOworICAgICAgICAgICAgc2hvcnQgY29uc3QgKnZhbCA9IChzaG9ydCBjb25zdCAqKSBoLT50YWJsZTsKKyAgICAgICAgICAgIHNob3J0ICAgYTsKKworICAgICAgICAgICAgd2hpbGUgKChhID0gKnZhbCsrKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwYXJ0MnJlbWFpbi0tOworICAgICAgICAgICAgICAgIGlmIChwYXJ0MnJlbWFpbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4rKzsKKyAgICAgICAgICAgICAgICAgICAgYSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZ2V0MWJpdChtcCkpCisgICAgICAgICAgICAgICAgICAgIHZhbCAtPSBhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghKGkgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYyA9ICptKys7CisgICAgICAgICAgICAgICAgICAgICAgICB4cnBudCA9ICgocmVhbCAqKSB4cikgKyAoKm0rKyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsd2luID0gKm0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiID0gKm0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsd2luID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ3JfaW5mb3MtPnBvdzJnYWluWygqc2NmKyspIDw8IHNoaWZ0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBncl9pbmZvcy0+ZnVsbF9nYWluW2x3aW5dWygqc2NmKyspIDw8IHNoaWZ0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYy0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGEgJiAoMHg4ID4+IGkpKSkgeworICAgICAgICAgICAgICAgICAgICBtYXhbbHdpbl0gPSBjYjsKKyAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4tLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQycmVtYWluIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXQxYml0KG1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICp4cnBudCA9IC12OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqeHJwbnQgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICp4cnBudCA9IDAuMDsKKyAgICAgICAgICAgICAgICB4cnBudCArPSBzdGVwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKG0gPCBtZSkgeworICAgICAgICAgICAgaWYgKCFtYykgeworICAgICAgICAgICAgICAgIG1jID0gKm0rKzsKKyAgICAgICAgICAgICAgICB4cnBudCA9ICgocmVhbCAqKSB4cikgKyAqbSsrOworICAgICAgICAgICAgICAgIGlmICgoKm0rKykgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgc3RlcCA9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdGVwID0gMzsKKyAgICAgICAgICAgICAgICBtKys7ICAgIC8qIGNiICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYy0tOworICAgICAgICAgICAgKnhycG50ID0gMC4wOworICAgICAgICAgICAgeHJwbnQgKz0gc3RlcDsKKyAgICAgICAgICAgICp4cnBudCA9IDAuMDsKKyAgICAgICAgICAgIHhycG50ICs9IHN0ZXA7CisvKiB3ZSBjb3VsZCBhZGQgYSBsaXR0bGUgb3B0LiBoZXJlOgorICogaWYgd2UgZmluaXNoZWQgYSBiYW5kIGZvciB3aW5kb3cgMyBvciBhIGxvbmcgYmFuZAorICogZnVydGhlciBiYW5kcyBjb3VsZCBjb3BpZWQgaW4gYSBzaW1wbGUgbG9vcCB3aXRob3V0IGEKKyAqIHNwZWNpYWwgJ21hcCcgZGVjb2RpbmcKKyAqLworICAgICAgICB9CisKKyAgICAgICAgZ3JfaW5mb3MtPm1heGJhbmRbMF0gPSBtYXhbMF0gKyAxOworICAgICAgICBncl9pbmZvcy0+bWF4YmFuZFsxXSA9IG1heFsxXSArIDE7CisgICAgICAgIGdyX2luZm9zLT5tYXhiYW5kWzJdID0gbWF4WzJdICsgMTsKKyAgICAgICAgZ3JfaW5mb3MtPm1heGJhbmRsID0gbWF4WzNdICsgMTsKKworICAgICAgICB7CisgICAgICAgICAgICBpbnQgICAgIHJtYXggPSBtYXhbMF0gPiBtYXhbMV0gPyBtYXhbMF0gOiBtYXhbMV07CisgICAgICAgICAgICBybWF4ID0gKHJtYXggPiBtYXhbMl0gPyBybWF4IDogbWF4WzJdKSArIDE7CisgICAgICAgICAgICBncl9pbmZvcy0+bWF4YiA9IHJtYXggPyBzaG9ydExpbWl0W3NmcmVxXVtybWF4XSA6IGxvbmdMaW1pdFtzZnJlcV1bbWF4WzNdICsgMV07CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZGVjb2Rpbmcgd2l0aCAnbG9uZycgQmFuZEluZGV4IHRhYmxlIChibG9ja190eXBlICE9IDIpCisgICAgICAgICAqLworICAgICAgICBpbnQgY29uc3QgKnByZXRhYiA9IChpbnQgY29uc3QgKikgKGdyX2luZm9zLT5wcmVmbGFnID8gcHJldGFiMSA6IHByZXRhYjIpOworICAgICAgICBpbnQgICAgIGksIG1heCA9IC0xOworICAgICAgICBpbnQgICAgIGNiID0gMDsKKyAgICAgICAgaW50ICAgICptID0gbWFwW3NmcmVxXVsyXTsKKyAgICAgICAgcmVhbCAgICB2ID0gMC4wOworICAgICAgICBpbnQgICAgIG1jID0gMDsKKworICAgICAgICAvKgorICAgICAgICAgKiBsb25nIGhhc2ggdGFibGUgdmFsdWVzCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgICAgIGxwID0gbFtpXTsKKyAgICAgICAgICAgIHN0cnVjdCBuZXdodWZmIGNvbnN0ICpoID0gKHN0cnVjdCBuZXdodWZmIGNvbnN0ICopIChodCArIGdyX2luZm9zLT50YWJsZV9zZWxlY3RbaV0pOworCisgICAgICAgICAgICBmb3IgKDsgbHA7IGxwLS0sIG1jLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIHgsIHk7CisKKyAgICAgICAgICAgICAgICBpZiAoIW1jKSB7CisgICAgICAgICAgICAgICAgICAgIG1jID0gKm0rKzsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGdyX2luZm9zLT5wb3cyZ2FpblsoKCpzY2YrKykgKyAoKnByZXRhYisrKSkgPDwgc2hpZnRdOworICAgICAgICAgICAgICAgICAgICBjYiA9ICptKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgY29uc3QgKnZhbCA9IChzaG9ydCBjb25zdCAqKSBoLT50YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh5ID0gKnZhbCsrKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXQxYml0KG1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgLT0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQycmVtYWluLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeCA9IHkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgeSAmPSAweGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4ID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIG1heCA9IGNiOworICAgICAgICAgICAgICAgICAgICBwYXJ0MnJlbWFpbiAtPSBoLT5saW5iaXRzICsgMTsKKyAgICAgICAgICAgICAgICAgICAgeCArPSBnZXRiaXRzKG1wLCAoaW50KSBoLT5saW5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50KysgPSAtaXNwb3dbeF0gKiB2OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqeHJwbnQrKyA9IGlzcG93W3hdICogdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeCkgeworICAgICAgICAgICAgICAgICAgICBtYXggPSBjYjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50KysgPSAtaXNwb3dbeF0gKiB2OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqeHJwbnQrKyA9IGlzcG93W3hdICogdjsKKyAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqeHJwbnQrKyA9IDAuMDsKKworICAgICAgICAgICAgICAgIGlmICh5ID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIG1heCA9IGNiOworICAgICAgICAgICAgICAgICAgICBwYXJ0MnJlbWFpbiAtPSBoLT5saW5iaXRzICsgMTsKKyAgICAgICAgICAgICAgICAgICAgeSArPSBnZXRiaXRzKG1wLCAoaW50KSBoLT5saW5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50KysgPSAtaXNwb3dbeV0gKiB2OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqeHJwbnQrKyA9IGlzcG93W3ldICogdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeSkgeworICAgICAgICAgICAgICAgICAgICBtYXggPSBjYjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50KysgPSAtaXNwb3dbeV0gKiB2OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqeHJwbnQrKyA9IGlzcG93W3ldICogdjsKKyAgICAgICAgICAgICAgICAgICAgcGFydDJyZW1haW4tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqeHJwbnQrKyA9IDAuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIHNob3J0IChjb3VudDF0YWJsZSkgdmFsdWVzCisgICAgICAgICAqLworICAgICAgICBmb3IgKDsgbDMgJiYgKHBhcnQycmVtYWluID4gMCk7IGwzLS0pIHsKKyAgICAgICAgICAgIHN0cnVjdCBuZXdodWZmIGNvbnN0ICpoID0gKHN0cnVjdCBuZXdodWZmIGNvbnN0ICopIChodGMgKyBncl9pbmZvcy0+Y291bnQxdGFibGVfc2VsZWN0KTsKKyAgICAgICAgICAgIHNob3J0IGNvbnN0ICp2YWwgPSAoc2hvcnQgY29uc3QgKikgaC0+dGFibGU7CisgICAgICAgICAgICBzaG9ydCAgIGE7CisKKyAgICAgICAgICAgIHdoaWxlICgoYSA9ICp2YWwrKykgPCAwKSB7CisgICAgICAgICAgICAgICAgcGFydDJyZW1haW4tLTsKKyAgICAgICAgICAgICAgICBpZiAocGFydDJyZW1haW4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnQycmVtYWluKys7CisgICAgICAgICAgICAgICAgICAgIGEgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICB2YWwgLT0gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIShpICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWMgPSAqbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgY2IgPSAqbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdyX2luZm9zLT5wb3cyZ2FpblsoKCpzY2YrKykgKyAoKnByZXRhYisrKSkgPDwgc2hpZnRdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1jLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYSAmICgweDggPj4gaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1heCA9IGNiOworICAgICAgICAgICAgICAgICAgICBwYXJ0MnJlbWFpbi0tOworICAgICAgICAgICAgICAgICAgICBpZiAocGFydDJyZW1haW4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MnJlbWFpbisrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldDFiaXQobXApKQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50KysgPSAtdjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKnhycG50KysgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICp4cnBudCsrID0gMC4wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogCisgICAgICAgICAqIHplcm8gcGFydAorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gKCZ4cltTQkxJTUlUXVswXSAtIHhycG50KSA+PiAxOyBpOyBpLS0pIHsKKyAgICAgICAgICAgICp4cnBudCsrID0gMC4wOworICAgICAgICAgICAgKnhycG50KysgPSAwLjA7CisgICAgICAgIH0KKworICAgICAgICBncl9pbmZvcy0+bWF4YmFuZGwgPSBtYXggKyAxOworICAgICAgICBncl9pbmZvcy0+bWF4YiA9IGxvbmdMaW1pdFtzZnJlcV1bZ3JfaW5mb3MtPm1heGJhbmRsXTsKKyAgICB9CisKKyAgICB3aGlsZSAocGFydDJyZW1haW4gPiAxNikgeworICAgICAgICBnZXRiaXRzKG1wLCAxNik7IC8qIERpc21pc3Mgc3R1ZmZpbmcgQml0cyAqLworICAgICAgICBwYXJ0MnJlbWFpbiAtPSAxNjsKKyAgICB9CisgICAgaWYgKHBhcnQycmVtYWluID4gMCkKKyAgICAgICAgZ2V0Yml0cyhtcCwgcGFydDJyZW1haW4pOworICAgIGVsc2UgaWYgKHBhcnQycmVtYWluIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhpcDogQ2FuJ3QgcmV3aW5kIHN0cmVhbSBieSAlZCBiaXRzIVxuIiwgLXBhcnQycmVtYWluKTsKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgIC8qIC0+IGVycm9yICovCisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qIAorICogSUlJX3N0ZXJlbzogY2FsY3VsYXRlIHJlYWwgY2hhbm5lbCB2YWx1ZXMgZm9yIEpvaW50LUktU3RlcmVvLW1vZGUKKyAqLworc3RhdGljIHZvaWQKK0lJSV9pX3N0ZXJlbyhyZWFsIHhyX2J1ZlsyXVtTQkxJTUlUXVtTU0xJTUlUXSwgaW50ICpzY2FsZWZhYywKKyAgICAgICAgICAgICBzdHJ1Y3QgZ3JfaW5mb19zICpncl9pbmZvcywgaW50IHNmcmVxLCBpbnQgbXNfc3RlcmVvLCBpbnQgbHNmKQoreworICAgIHJlYWwoKnhyKVtTQkxJTUlUICogU1NMSU1JVF0gPSAocmVhbCgqKVtTQkxJTUlUICogU1NMSU1JVF0pIHhyX2J1ZjsKKyAgICBzdHJ1Y3QgYmFuZEluZm9TdHJ1Y3QgY29uc3QgKmJpID0gKHN0cnVjdCBiYW5kSW5mb1N0cnVjdCBjb25zdCAqKSAmYmFuZEluZm9bc2ZyZXFdOworICAgIHJlYWwgICAqdGFibDEsICp0YWJsMjsKKworICAgIGlmIChsc2YpIHsKKyAgICAgICAgaW50ICAgICBwID0gZ3JfaW5mb3MtPnNjYWxlZmFjX2NvbXByZXNzICYgMHgxOworICAgICAgICBpZiAobXNfc3RlcmVvKSB7CisgICAgICAgICAgICB0YWJsMSA9IHBvdzFfMltwXTsKKyAgICAgICAgICAgIHRhYmwyID0gcG93Ml8yW3BdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGFibDEgPSBwb3cxXzFbcF07CisgICAgICAgICAgICB0YWJsMiA9IHBvdzJfMVtwXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1zX3N0ZXJlbykgeworICAgICAgICAgICAgdGFibDEgPSB0YW4xXzI7CisgICAgICAgICAgICB0YWJsMiA9IHRhbjJfMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRhYmwxID0gdGFuMV8xOworICAgICAgICAgICAgdGFibDIgPSB0YW4yXzE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ3JfaW5mb3MtPmJsb2NrX3R5cGUgPT0gMikgeworICAgICAgICBpbnQgICAgIGx3aW4sIGRvX2wgPSAwOworICAgICAgICBpZiAoZ3JfaW5mb3MtPm1peGVkX2Jsb2NrX2ZsYWcpCisgICAgICAgICAgICBkb19sID0gMTsKKworICAgICAgICBmb3IgKGx3aW4gPSAwOyBsd2luIDwgMzsgbHdpbisrKSB7IC8qIHByb2Nlc3MgZWFjaCB3aW5kb3cgKi8KKyAgICAgICAgICAgIC8qIGdldCBmaXJzdCBiYW5kIHdpdGggemVybyB2YWx1ZXMgKi8KKyAgICAgICAgICAgIGludCAgICAgaXNfcCwgc2IsIGlkeCwgc2ZiID0gZ3JfaW5mb3MtPm1heGJhbmRbbHdpbl07IC8qIHNmYiBpcyBtaW5pbWFsIDMgZm9yIG1peGVkIG1vZGUgKi8KKyAgICAgICAgICAgIGlmIChzZmIgPiAzKQorICAgICAgICAgICAgICAgIGRvX2wgPSAwOworCisgICAgICAgICAgICBmb3IgKDsgc2ZiIDwgMTI7IHNmYisrKSB7CisgICAgICAgICAgICAgICAgaXNfcCA9IHNjYWxlZmFjW3NmYiAqIDMgKyBsd2luIC0gZ3JfaW5mb3MtPm1peGVkX2Jsb2NrX2ZsYWddOyAvKiBzY2FsZTogMC0xNSAqLworICAgICAgICAgICAgICAgIGlmIChpc19wICE9IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhbCAgICB0MSwgdDI7CisgICAgICAgICAgICAgICAgICAgIHNiID0gYmktPnNob3J0RGlmZltzZmJdOworICAgICAgICAgICAgICAgICAgICBpZHggPSBiaS0+c2hvcnRJZHhbc2ZiXSArIGx3aW47CisgICAgICAgICAgICAgICAgICAgIHQxID0gdGFibDFbaXNfcF07CisgICAgICAgICAgICAgICAgICAgIHQyID0gdGFibDJbaXNfcF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBzYiA+IDA7IHNiLS0sIGlkeCArPSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFsICAgIHYgPSB4clswXVtpZHhdOworICAgICAgICAgICAgICAgICAgICAgICAgeHJbMF1baWR4XSA9IHYgKiB0MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhyWzFdW2lkeF0gPSB2ICogdDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiAxCisvKiBpbiB0aGUgb3JpZ2luYWw6IGNvcHkgMTAgdG8gMTEgLCBoZXJlOiBjb3B5IDExIHRvIDEyIAorbWF5YmUgc3RpbGwgd3Jvbmc/Pz8gKGNvcHkgMTIgdG8gMTM/KSAqLworICAgICAgICAgICAgaXNfcCA9IHNjYWxlZmFjWzExICogMyArIGx3aW4gLSBncl9pbmZvcy0+bWl4ZWRfYmxvY2tfZmxhZ107IC8qIHNjYWxlOiAwLTE1ICovCisgICAgICAgICAgICBzYiA9IGJpLT5zaG9ydERpZmZbMTJdOworICAgICAgICAgICAgaWR4ID0gYmktPnNob3J0SWR4WzEyXSArIGx3aW47CisjZWxzZQorICAgICAgICAgICAgaXNfcCA9IHNjYWxlZmFjWzEwICogMyArIGx3aW4gLSBncl9pbmZvcy0+bWl4ZWRfYmxvY2tfZmxhZ107IC8qIHNjYWxlOiAwLTE1ICovCisgICAgICAgICAgICBzYiA9IGJpLT5zaG9ydERpZmZbMTFdOworICAgICAgICAgICAgaWR4ID0gYmktPnNob3J0SWR4WzExXSArIGx3aW47CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChpc19wICE9IDcpIHsKKyAgICAgICAgICAgICAgICByZWFsICAgIHQxLCB0MjsKKyAgICAgICAgICAgICAgICB0MSA9IHRhYmwxW2lzX3BdOworICAgICAgICAgICAgICAgIHQyID0gdGFibDJbaXNfcF07CisgICAgICAgICAgICAgICAgZm9yICg7IHNiID4gMDsgc2ItLSwgaWR4ICs9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhbCAgICB2ID0geHJbMF1baWR4XTsKKyAgICAgICAgICAgICAgICAgICAgeHJbMF1baWR4XSA9IHYgKiB0MTsKKyAgICAgICAgICAgICAgICAgICAgeHJbMV1baWR4XSA9IHYgKiB0MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAvKiBlbmQgZm9yKGx3aW47IC4uIDsgLiApICovCisKKyAgICAgICAgaWYgKGRvX2wpIHsKKy8qIGFsc28gY2hlY2sgbC1wYXJ0LCBpZiBBTEwgYmFuZHMgaW4gdGhlIHRocmVlIHdpbmRvd3MgYXJlICdlbXB0eScKKyAqIGFuZCBtb2RlID0gbWl4ZWRfbW9kZSAKKyAqLworICAgICAgICAgICAgaW50ICAgICBzZmIgPSBncl9pbmZvcy0+bWF4YmFuZGw7CisgICAgICAgICAgICBpbnQgICAgIGlkeCA9IGJpLT5sb25nSWR4W3NmYl07CisKKyAgICAgICAgICAgIGZvciAoOyBzZmIgPCA4OyBzZmIrKykgeworICAgICAgICAgICAgICAgIGludCAgICAgc2IgPSBiaS0+bG9uZ0RpZmZbc2ZiXTsKKyAgICAgICAgICAgICAgICBpbnQgICAgIGlzX3AgPSBzY2FsZWZhY1tzZmJdOyAvKiBzY2FsZTogMC0xNSAqLworICAgICAgICAgICAgICAgIGlmIChpc19wICE9IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhbCAgICB0MSwgdDI7CisgICAgICAgICAgICAgICAgICAgIHQxID0gdGFibDFbaXNfcF07CisgICAgICAgICAgICAgICAgICAgIHQyID0gdGFibDJbaXNfcF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBzYiA+IDA7IHNiLS0sIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFsICAgIHYgPSB4clswXVtpZHhdOworICAgICAgICAgICAgICAgICAgICAgICAgeHJbMF1baWR4XSA9IHYgKiB0MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhyWzFdW2lkeF0gPSB2ICogdDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZHggKz0gc2I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAvKiAoKGdyX2luZm9zLT5ibG9ja190eXBlICE9IDIpKSAqLworCisgICAgICAgIGludCAgICAgc2ZiID0gZ3JfaW5mb3MtPm1heGJhbmRsOworICAgICAgICBpbnQgICAgIGlzX3AsIGlkeCA9IGJpLT5sb25nSWR4W3NmYl07CisgICAgICAgIGZvciAoOyBzZmIgPCAyMTsgc2ZiKyspIHsKKyAgICAgICAgICAgIGludCAgICAgc2IgPSBiaS0+bG9uZ0RpZmZbc2ZiXTsKKyAgICAgICAgICAgIGlzX3AgPSBzY2FsZWZhY1tzZmJdOyAvKiBzY2FsZTogMC0xNSAqLworICAgICAgICAgICAgaWYgKGlzX3AgIT0gNykgeworICAgICAgICAgICAgICAgIHJlYWwgICAgdDEsIHQyOworICAgICAgICAgICAgICAgIHQxID0gdGFibDFbaXNfcF07CisgICAgICAgICAgICAgICAgdDIgPSB0YWJsMltpc19wXTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgc2IgPiAwOyBzYi0tLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICByZWFsICAgIHYgPSB4clswXVtpZHhdOworICAgICAgICAgICAgICAgICAgICB4clswXVtpZHhdID0gdiAqIHQxOworICAgICAgICAgICAgICAgICAgICB4clsxXVtpZHhdID0gdiAqIHQyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZHggKz0gc2I7CisgICAgICAgIH0KKworICAgICAgICBpc19wID0gc2NhbGVmYWNbMjBdOyAvKiBjb3B5IGwtYmFuZCAyMCB0byBsLWJhbmQgMjEgKi8KKyAgICAgICAgaWYgKGlzX3AgIT0gNykgeworICAgICAgICAgICAgaW50ICAgICBzYjsKKyAgICAgICAgICAgIHJlYWwgICAgdDEgPSB0YWJsMVtpc19wXSwgdDIgPSB0YWJsMltpc19wXTsKKworICAgICAgICAgICAgZm9yIChzYiA9IGJpLT5sb25nRGlmZlsyMV07IHNiID4gMDsgc2ItLSwgaWR4KyspIHsKKyAgICAgICAgICAgICAgICByZWFsICAgIHYgPSB4clswXVtpZHhdOworICAgICAgICAgICAgICAgIHhyWzBdW2lkeF0gPSB2ICogdDE7CisgICAgICAgICAgICAgICAgeHJbMV1baWR4XSA9IHYgKiB0MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgLyogLi4uICovCit9CisKK3N0YXRpYyB2b2lkCitJSUlfYW50aWFsaWFzKHJlYWwgeHJbU0JMSU1JVF1bU1NMSU1JVF0sIHN0cnVjdCBncl9pbmZvX3MgKmdyX2luZm9zKQoreworICAgIGludCAgICAgc2JsaW07CisKKyAgICBpZiAoZ3JfaW5mb3MtPmJsb2NrX3R5cGUgPT0gMikgeworICAgICAgICBpZiAoIWdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzYmxpbSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzYmxpbSA9IGdyX2luZm9zLT5tYXhiIC0gMTsKKyAgICB9CisKKyAgICAvKiAzMSBhbGlhcy1yZWR1Y3Rpb24gb3BlcmF0aW9ucyBiZXR3ZWVuIGVhY2ggcGFpciBvZiBzdWItYmFuZHMgKi8KKyAgICAvKiB3aXRoIDggYnV0dGVyZmxpZXMgYmV0d2VlbiBlYWNoIHBhaXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIHsKKyAgICAgICAgaW50ICAgICBzYjsKKyAgICAgICAgcmVhbCAgICp4cjEgPSAocmVhbCAqKSB4clsxXTsKKworICAgICAgICBmb3IgKHNiID0gc2JsaW07IHNiOyBzYi0tLCB4cjEgKz0gMTApIHsKKyAgICAgICAgICAgIGludCAgICAgc3M7CisgICAgICAgICAgICByZWFsICAgKmNzID0gYWFfY3MsICpjYSA9IGFhX2NhOworICAgICAgICAgICAgcmVhbCAgICp4cjIgPSB4cjE7CisKKyAgICAgICAgICAgIGZvciAoc3MgPSA3OyBzcyA+PSAwOyBzcy0tKSB7IC8qIHVwcGVyIGFuZCBsb3dlciBidXR0ZXJmbHkgaW5wdXRzICovCisgICAgICAgICAgICAgICAgcmVhbCAgICBidSA9ICotLXhyMiwgYmQgPSAqeHIxOworICAgICAgICAgICAgICAgICp4cjIgPSAoYnUgKiAoKmNzKSkgLSAoYmQgKiAoKmNhKSk7CisgICAgICAgICAgICAgICAgKnhyMSsrID0gKGJkICogKCpjcysrKSkgKyAoYnUgKiAoKmNhKyspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisvKiAqSU5ERU5ULU9GRiogKi8KKworLyoKKyBEQ1QgaW5zaXBpcmVkIGJ5IEplZmYgVHNheSdzIERDVCBmcm9tIHRoZSBtYXBsYXkgcGFja2FnZQorIHRoaXMgaXMgYW4gb3B0aW1pemVkIHZlcnNpb24gd2l0aCBtYW51YWwgdW5yb2xsLgorCisgUmVmZXJlbmNlczoKKyBbMV0gUy4gV2lub2dyYWQ6ICJPbiBDb21wdXRpbmcgdGhlIERpc2NyZXRlIEZvdXJpZXIgVHJhbnNmb3JtIiwKKyAgICAgTWF0aGVtYXRpY3Mgb2YgQ29tcHV0YXRpb24sIFZvbHVtZSAzMiwgTnVtYmVyIDE0MSwgSmFudWFyeSAxOTc4LAorICAgICBQYWdlcyAxNzUtMTk5CisqLworCitzdGF0aWMgdm9pZCBkY3QzNihyZWFsICppbmJ1ZixyZWFsICpvMSxyZWFsICpvMixyZWFsICp3aW50YWIscmVhbCAqdHNidWYpCit7CisgIHsKKyAgICByZWFsICppbiA9IGluYnVmOworCisgICAgaW5bMTddKz1pblsxNl07IGluWzE2XSs9aW5bMTVdOyBpblsxNV0rPWluWzE0XTsKKyAgICBpblsxNF0rPWluWzEzXTsgaW5bMTNdKz1pblsxMl07IGluWzEyXSs9aW5bMTFdOworICAgIGluWzExXSs9aW5bMTBdOyBpblsxMF0rPWluWzldOyAgaW5bOV0gKz1pbls4XTsKKyAgICBpbls4XSArPWluWzddOyAgaW5bN10gKz1pbls2XTsgIGluWzZdICs9aW5bNV07CisgICAgaW5bNV0gKz1pbls0XTsgIGluWzRdICs9aW5bM107ICBpblszXSArPWluWzJdOworICAgIGluWzJdICs9aW5bMV07ICBpblsxXSArPWluWzBdOworCisgICAgaW5bMTddKz1pblsxNV07IGluWzE1XSs9aW5bMTNdOyBpblsxM10rPWluWzExXTsgaW5bMTFdKz1pbls5XTsKKyAgICBpbls5XSArPWluWzddOyAgaW5bN10gKz1pbls1XTsgIGluWzVdICs9aW5bM107ICBpblszXSArPWluWzFdOworCisgIHsKKworI2RlZmluZSBNQUNSTzAodikgeyBcCisgICAgcmVhbCB0bXA7IFwKKyAgICBvdXQyWzkrKHYpXSA9ICh0bXAgPSBzdW0wICsgc3VtMSkgKiB3WzI3Kyh2KV07IFwKKyAgICBvdXQyWzgtKHYpXSA9IHRtcCAqIHdbMjYtKHYpXTsgIH0gXAorICAgIHN1bTAgLT0gc3VtMTsgXAorICAgIHRzW1NCTElNSVQqKDgtKHYpKV0gPSBvdXQxWzgtKHYpXSArIHN1bTAgKiB3WzgtKHYpXTsgXAorICAgIHRzW1NCTElNSVQqKDkrKHYpKV0gPSBvdXQxWzkrKHYpXSArIHN1bTAgKiB3WzkrKHYpXTsgCisjZGVmaW5lIE1BQ1JPMSh2KSB7IFwKKyAgICByZWFsIHN1bTAsc3VtMTsgXAorICAgIHN1bTAgPSB0bXAxYSArIHRtcDJhOyBcCisgICAgc3VtMSA9ICh0bXAxYiArIHRtcDJiKSAqIHRmY29zMzZbKHYpXTsgXAorICAgIE1BQ1JPMCh2KTsgfQorI2RlZmluZSBNQUNSTzIodikgeyBcCisgICAgcmVhbCBzdW0wLHN1bTE7IFwKKyAgICBzdW0wID0gdG1wMmEgLSB0bXAxYTsgXAorICAgIHN1bTEgPSAodG1wMmIgLSB0bXAxYikgKiB0ZmNvczM2Wyh2KV07IFwKKyAgICBNQUNSTzAodik7IH0KKworICAgIGNvbnN0IHJlYWwgKmMgPSBDT1M5OworICAgIHJlYWwgKm91dDIgPSBvMjsKKyAgICByZWFsICp3ID0gd2ludGFiOworICAgIHJlYWwgKm91dDEgPSBvMTsKKyAgICByZWFsICp0cyA9IHRzYnVmOworCisgICAgcmVhbCB0YTMzLHRhNjYsdGIzMyx0YjY2OworCisgICAgdGEzMyA9IGluWzIqMyswXSAqIGNbM107CisgICAgdGE2NiA9IGluWzIqNiswXSAqIGNbNl07CisgICAgdGIzMyA9IGluWzIqMysxXSAqIGNbM107CisgICAgdGI2NiA9IGluWzIqNisxXSAqIGNbNl07CisKKyAgICB7IAorICAgICAgcmVhbCB0bXAxYSx0bXAyYSx0bXAxYix0bXAyYjsKKyAgICAgIHRtcDFhID0gICAgICAgICAgICAgaW5bMioxKzBdICogY1sxXSArIHRhMzMgKyBpblsyKjUrMF0gKiBjWzVdICsgaW5bMio3KzBdICogY1s3XTsKKyAgICAgIHRtcDFiID0gICAgICAgICAgICAgaW5bMioxKzFdICogY1sxXSArIHRiMzMgKyBpblsyKjUrMV0gKiBjWzVdICsgaW5bMio3KzFdICogY1s3XTsKKyAgICAgIHRtcDJhID0gaW5bMiowKzBdICsgaW5bMioyKzBdICogY1syXSArIGluWzIqNCswXSAqIGNbNF0gKyB0YTY2ICsgaW5bMio4KzBdICogY1s4XTsKKyAgICAgIHRtcDJiID0gaW5bMiowKzFdICsgaW5bMioyKzFdICogY1syXSArIGluWzIqNCsxXSAqIGNbNF0gKyB0YjY2ICsgaW5bMio4KzFdICogY1s4XTsKKworICAgICAgTUFDUk8xKDApOworICAgICAgTUFDUk8yKDgpOworICAgIH0KKworICAgIHsKKyAgICAgIHJlYWwgdG1wMWEsdG1wMmEsdG1wMWIsdG1wMmI7CisgICAgICB0bXAxYSA9ICggaW5bMioxKzBdIC0gaW5bMio1KzBdIC0gaW5bMio3KzBdICkgKiBjWzNdOworICAgICAgdG1wMWIgPSAoIGluWzIqMSsxXSAtIGluWzIqNSsxXSAtIGluWzIqNysxXSApICogY1szXTsKKyAgICAgIHRtcDJhID0gKCBpblsyKjIrMF0gLSBpblsyKjQrMF0gLSBpblsyKjgrMF0gKSAqIGNbNl0gLSBpblsyKjYrMF0gKyBpblsyKjArMF07CisgICAgICB0bXAyYiA9ICggaW5bMioyKzFdIC0gaW5bMio0KzFdIC0gaW5bMio4KzFdICkgKiBjWzZdIC0gaW5bMio2KzFdICsgaW5bMiowKzFdOworCisgICAgICBNQUNSTzEoMSk7CisgICAgICBNQUNSTzIoNyk7CisgICAgfQorCisgICAgeworICAgICAgcmVhbCB0bXAxYSx0bXAyYSx0bXAxYix0bXAyYjsKKyAgICAgIHRtcDFhID0gICAgICAgICAgICAgaW5bMioxKzBdICogY1s1XSAtIHRhMzMgLSBpblsyKjUrMF0gKiBjWzddICsgaW5bMio3KzBdICogY1sxXTsKKyAgICAgIHRtcDFiID0gICAgICAgICAgICAgaW5bMioxKzFdICogY1s1XSAtIHRiMzMgLSBpblsyKjUrMV0gKiBjWzddICsgaW5bMio3KzFdICogY1sxXTsKKyAgICAgIHRtcDJhID0gaW5bMiowKzBdIC0gaW5bMioyKzBdICogY1s4XSAtIGluWzIqNCswXSAqIGNbMl0gKyB0YTY2ICsgaW5bMio4KzBdICogY1s0XTsKKyAgICAgIHRtcDJiID0gaW5bMiowKzFdIC0gaW5bMioyKzFdICogY1s4XSAtIGluWzIqNCsxXSAqIGNbMl0gKyB0YjY2ICsgaW5bMio4KzFdICogY1s0XTsKKworICAgICAgTUFDUk8xKDIpOworICAgICAgTUFDUk8yKDYpOworICAgIH0KKworICAgIHsKKyAgICAgIHJlYWwgdG1wMWEsdG1wMmEsdG1wMWIsdG1wMmI7CisgICAgICB0bXAxYSA9ICAgICAgICAgICAgIGluWzIqMSswXSAqIGNbN10gLSB0YTMzICsgaW5bMio1KzBdICogY1sxXSAtIGluWzIqNyswXSAqIGNbNV07CisgICAgICB0bXAxYiA9ICAgICAgICAgICAgIGluWzIqMSsxXSAqIGNbN10gLSB0YjMzICsgaW5bMio1KzFdICogY1sxXSAtIGluWzIqNysxXSAqIGNbNV07CisgICAgICB0bXAyYSA9IGluWzIqMCswXSAtIGluWzIqMiswXSAqIGNbNF0gKyBpblsyKjQrMF0gKiBjWzhdICsgdGE2NiAtIGluWzIqOCswXSAqIGNbMl07CisgICAgICB0bXAyYiA9IGluWzIqMCsxXSAtIGluWzIqMisxXSAqIGNbNF0gKyBpblsyKjQrMV0gKiBjWzhdICsgdGI2NiAtIGluWzIqOCsxXSAqIGNbMl07CisKKyAgICAgIE1BQ1JPMSgzKTsKKyAgICAgIE1BQ1JPMig1KTsKKyAgICB9CisKKyAgICB7CisgICAgICByZWFsIHN1bTAsc3VtMTsKKyAgICAgIHN1bTAgPSAgaW5bMiowKzBdIC0gaW5bMioyKzBdICsgaW5bMio0KzBdIC0gaW5bMio2KzBdICsgaW5bMio4KzBdOworICAgICAgc3VtMSA9IChpblsyKjArMV0gLSBpblsyKjIrMV0gKyBpblsyKjQrMV0gLSBpblsyKjYrMV0gKyBpblsyKjgrMV0gKSAqIHRmY29zMzZbNF07CisgICAgICBNQUNSTzAoNCk7CisgICAgfQorICB9CisKKyAgfQorfQorCisKKy8qCisgKiBuZXcgRENUMTIKKyAqLworc3RhdGljIHZvaWQgZGN0MTIocmVhbCAqaW4scmVhbCAqcmF3b3V0MSxyZWFsICpyYXdvdXQyLHJlYWwgKndpLHJlYWwgKnRzKQoreworI2RlZmluZSBEQ1QxMl9QQVJUMSBcCisgICAgICAgICAgICAgaW41ID0gaW5bNSozXTsgIFwKKyAgICAgaW41ICs9IChpbjQgPSBpbls0KjNdKTsgXAorICAgICBpbjQgKz0gKGluMyA9IGluWzMqM10pOyBcCisgICAgIGluMyArPSAoaW4yID0gaW5bMiozXSk7IFwKKyAgICAgaW4yICs9IChpbjEgPSBpblsxKjNdKTsgXAorICAgICBpbjEgKz0gKGluMCA9IGluWzAqM10pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaW41ICs9IGluMzsgaW4zICs9IGluMTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGluMiAqPSBDT1M2XzE7IFwKKyAgICAgaW4zICo9IENPUzZfMTsgXAorCisjZGVmaW5lIERDVDEyX1BBUlQyIFwKKyAgICAgaW4wICs9IGluNCAqIENPUzZfMjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGluNCA9IGluMCArIGluMjsgICAgIFwKKyAgICAgaW4wIC09IGluMjsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGluMSArPSBpbjUgKiBDT1M2XzI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpbjUgPSAoaW4xICsgaW4zKSAqIHRmY29zMTJbMF07IFwKKyAgICAgaW4xID0gKGluMSAtIGluMykgKiB0ZmNvczEyWzJdOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpbjMgPSBpbjQgKyBpbjU7ICAgIFwKKyAgICAgaW40IC09IGluNTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpbjIgPSBpbjAgKyBpbjE7ICAgIFwKKyAgICAgaW4wIC09IGluMTsKKworCisgICB7CisgICAgIHJlYWwgaW4wLGluMSxpbjIsaW4zLGluNCxpbjU7CisgICAgIHJlYWwgKm91dDEgPSByYXdvdXQxOworICAgICB0c1tTQkxJTUlUKjBdID0gb3V0MVswXTsgdHNbU0JMSU1JVCoxXSA9IG91dDFbMV07IHRzW1NCTElNSVQqMl0gPSBvdXQxWzJdOworICAgICB0c1tTQkxJTUlUKjNdID0gb3V0MVszXTsgdHNbU0JMSU1JVCo0XSA9IG91dDFbNF07IHRzW1NCTElNSVQqNV0gPSBvdXQxWzVdOworIAorICAgICBEQ1QxMl9QQVJUMQorCisgICAgIHsKKyAgICAgICByZWFsIHRtcDAsdG1wMSA9IChpbjAgLSBpbjQpOworICAgICAgIHsKKyAgICAgICAgIHJlYWwgdG1wMiA9IChpbjEgLSBpbjUpICogdGZjb3MxMlsxXTsKKyAgICAgICAgIHRtcDAgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgIHRtcDEgLT0gdG1wMjsKKyAgICAgICB9CisgICAgICAgdHNbKDE3LTEpKlNCTElNSVRdID0gb3V0MVsxNy0xXSArIHRtcDAgKiB3aVsxMS0xXTsKKyAgICAgICB0c1soMTIrMSkqU0JMSU1JVF0gPSBvdXQxWzEyKzFdICsgdG1wMCAqIHdpWzYrMV07CisgICAgICAgdHNbKDYgKzEpKlNCTElNSVRdID0gb3V0MVs2ICsxXSArIHRtcDEgKiB3aVsxXTsKKyAgICAgICB0c1soMTEtMSkqU0JMSU1JVF0gPSBvdXQxWzExLTFdICsgdG1wMSAqIHdpWzUtMV07CisgICAgIH0KKworICAgICBEQ1QxMl9QQVJUMgorCisgICAgIHRzWygxNy0wKSpTQkxJTUlUXSA9IG91dDFbMTctMF0gKyBpbjIgKiB3aVsxMS0wXTsKKyAgICAgdHNbKDEyKzApKlNCTElNSVRdID0gb3V0MVsxMiswXSArIGluMiAqIHdpWzYrMF07CisgICAgIHRzWygxMisyKSpTQkxJTUlUXSA9IG91dDFbMTIrMl0gKyBpbjMgKiB3aVs2KzJdOworICAgICB0c1soMTctMikqU0JMSU1JVF0gPSBvdXQxWzE3LTJdICsgaW4zICogd2lbMTEtMl07CisKKyAgICAgdHNbKDYrMCkqU0JMSU1JVF0gID0gb3V0MVs2KzBdICsgaW4wICogd2lbMF07CisgICAgIHRzWygxMS0wKSpTQkxJTUlUXSA9IG91dDFbMTEtMF0gKyBpbjAgKiB3aVs1LTBdOworICAgICB0c1soNisyKSpTQkxJTUlUXSAgPSBvdXQxWzYrMl0gKyBpbjQgKiB3aVsyXTsKKyAgICAgdHNbKDExLTIpKlNCTElNSVRdID0gb3V0MVsxMS0yXSArIGluNCAqIHdpWzUtMl07CisgIH0KKworICBpbisrOworCisgIHsKKyAgICAgcmVhbCBpbjAsaW4xLGluMixpbjMsaW40LGluNTsKKyAgICAgcmVhbCAqb3V0MiA9IHJhd291dDI7CisgCisgICAgIERDVDEyX1BBUlQxCisKKyAgICAgeworICAgICAgIHJlYWwgdG1wMCx0bXAxID0gKGluMCAtIGluNCk7CisgICAgICAgeworICAgICAgICAgcmVhbCB0bXAyID0gKGluMSAtIGluNSkgKiB0ZmNvczEyWzFdOworICAgICAgICAgdG1wMCA9IHRtcDEgKyB0bXAyOworICAgICAgICAgdG1wMSAtPSB0bXAyOworICAgICAgIH0KKyAgICAgICBvdXQyWzUtMV0gPSB0bXAwICogd2lbMTEtMV07CisgICAgICAgb3V0MlswKzFdID0gdG1wMCAqIHdpWzYrMV07CisgICAgICAgdHNbKDEyKzEpKlNCTElNSVRdICs9IHRtcDEgKiB3aVsxXTsKKyAgICAgICB0c1soMTctMSkqU0JMSU1JVF0gKz0gdG1wMSAqIHdpWzUtMV07CisgICAgIH0KKworICAgICBEQ1QxMl9QQVJUMgorCisgICAgIG91dDJbNS0wXSA9IGluMiAqIHdpWzExLTBdOworICAgICBvdXQyWzArMF0gPSBpbjIgKiB3aVs2KzBdOworICAgICBvdXQyWzArMl0gPSBpbjMgKiB3aVs2KzJdOworICAgICBvdXQyWzUtMl0gPSBpbjMgKiB3aVsxMS0yXTsKKworICAgICB0c1soMTIrMCkqU0JMSU1JVF0gKz0gaW4wICogd2lbMF07CisgICAgIHRzWygxNy0wKSpTQkxJTUlUXSArPSBpbjAgKiB3aVs1LTBdOworICAgICB0c1soMTIrMikqU0JMSU1JVF0gKz0gaW40ICogd2lbMl07CisgICAgIHRzWygxNy0yKSpTQkxJTUlUXSArPSBpbjQgKiB3aVs1LTJdOworICB9CisKKyAgaW4rKzsgCisKKyAgeworICAgICByZWFsIGluMCxpbjEsaW4yLGluMyxpbjQsaW41OworICAgICByZWFsICpvdXQyID0gcmF3b3V0MjsKKyAgICAgb3V0MlsxMl09b3V0MlsxM109b3V0MlsxNF09b3V0MlsxNV09b3V0MlsxNl09b3V0MlsxN109MC4wOworCisgICAgIERDVDEyX1BBUlQxCisKKyAgICAgeworICAgICAgIHJlYWwgdG1wMCx0bXAxID0gKGluMCAtIGluNCk7CisgICAgICAgeworICAgICAgICAgcmVhbCB0bXAyID0gKGluMSAtIGluNSkgKiB0ZmNvczEyWzFdOworICAgICAgICAgdG1wMCA9IHRtcDEgKyB0bXAyOworICAgICAgICAgdG1wMSAtPSB0bXAyOworICAgICAgIH0KKyAgICAgICBvdXQyWzExLTFdID0gdG1wMCAqIHdpWzExLTFdOworICAgICAgIG91dDJbNiArMV0gPSB0bXAwICogd2lbNisxXTsKKyAgICAgICBvdXQyWzArMV0gKz0gdG1wMSAqIHdpWzFdOworICAgICAgIG91dDJbNS0xXSArPSB0bXAxICogd2lbNS0xXTsKKyAgICAgfQorCisgICAgIERDVDEyX1BBUlQyCisKKyAgICAgb3V0MlsxMS0wXSA9IGluMiAqIHdpWzExLTBdOworICAgICBvdXQyWzYgKzBdID0gaW4yICogd2lbNiswXTsKKyAgICAgb3V0Mls2ICsyXSA9IGluMyAqIHdpWzYrMl07CisgICAgIG91dDJbMTEtMl0gPSBpbjMgKiB3aVsxMS0yXTsKKworICAgICBvdXQyWzArMF0gKz0gaW4wICogd2lbMF07CisgICAgIG91dDJbNS0wXSArPSBpbjAgKiB3aVs1LTBdOworICAgICBvdXQyWzArMl0gKz0gaW40ICogd2lbMl07CisgICAgIG91dDJbNS0yXSArPSBpbjQgKiB3aVs1LTJdOworICB9Cit9CisvKiAqSU5ERU5ULU9OKiAqLworCisvKgorICogSUlJX2h5YnJpZAorICovCitzdGF0aWMgdm9pZAorSUlJX2h5YnJpZChQTVBTVFIgbXAsIHJlYWwgZnNJbltTQkxJTUlUXVtTU0xJTUlUXSwgcmVhbCB0c091dFtTU0xJTUlUXVtTQkxJTUlUXSwKKyAgICAgICAgICAgaW50IGNoLCBzdHJ1Y3QgZ3JfaW5mb19zICpncl9pbmZvcykKK3sKKyAgICByZWFsICAgKnRzcG50ID0gKHJlYWwgKikgdHNPdXQ7CisgICAgcmVhbCgqYmxvY2spWzJdW1NCTElNSVQgKiBTU0xJTUlUXSA9IG1wLT5oeWJyaWRfYmxvY2s7CisgICAgaW50ICAgICpibGMgPSBtcC0+aHlicmlkX2JsYzsKKyAgICByZWFsICAgKnJhd291dDEsICpyYXdvdXQyOworICAgIGludCAgICAgYnQ7CisgICAgaW50ICAgICBzYiA9IDA7CisKKyAgICB7CisgICAgICAgIGludCAgICAgYiA9IGJsY1tjaF07CisgICAgICAgIHJhd291dDEgPSBibG9ja1tiXVtjaF07CisgICAgICAgIGIgPSAtYiArIDE7CisgICAgICAgIHJhd291dDIgPSBibG9ja1tiXVtjaF07CisgICAgICAgIGJsY1tjaF0gPSBiOworICAgIH0KKworCisgICAgaWYgKGdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnKSB7CisgICAgICAgIHNiID0gMjsKKyAgICAgICAgZGN0MzYoZnNJblswXSwgcmF3b3V0MSwgcmF3b3V0Miwgd2luWzBdLCB0c3BudCk7CisgICAgICAgIGRjdDM2KGZzSW5bMV0sIHJhd291dDEgKyAxOCwgcmF3b3V0MiArIDE4LCB3aW4xWzBdLCB0c3BudCArIDEpOworICAgICAgICByYXdvdXQxICs9IDM2OworICAgICAgICByYXdvdXQyICs9IDM2OworICAgICAgICB0c3BudCArPSAyOworICAgIH0KKworICAgIGJ0ID0gZ3JfaW5mb3MtPmJsb2NrX3R5cGU7CisgICAgaWYgKGJ0ID09IDIpIHsKKyAgICAgICAgZm9yICg7IHNiIDwgKGludCkgZ3JfaW5mb3MtPm1heGI7IHNiICs9IDIsIHRzcG50ICs9IDIsIHJhd291dDEgKz0gMzYsIHJhd291dDIgKz0gMzYpIHsKKyAgICAgICAgICAgIGRjdDEyKGZzSW5bc2JdLCByYXdvdXQxLCByYXdvdXQyLCB3aW5bMl0sIHRzcG50KTsKKyAgICAgICAgICAgIGRjdDEyKGZzSW5bc2IgKyAxXSwgcmF3b3V0MSArIDE4LCByYXdvdXQyICsgMTgsIHdpbjFbMl0sIHRzcG50ICsgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoOyBzYiA8IChpbnQpIGdyX2luZm9zLT5tYXhiOyBzYiArPSAyLCB0c3BudCArPSAyLCByYXdvdXQxICs9IDM2LCByYXdvdXQyICs9IDM2KSB7CisgICAgICAgICAgICBkY3QzNihmc0luW3NiXSwgcmF3b3V0MSwgcmF3b3V0Miwgd2luW2J0XSwgdHNwbnQpOworICAgICAgICAgICAgZGN0MzYoZnNJbltzYiArIDFdLCByYXdvdXQxICsgMTgsIHJhd291dDIgKyAxOCwgd2luMVtidF0sIHRzcG50ICsgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKDsgc2IgPCBTQkxJTUlUOyBzYisrLCB0c3BudCsrKSB7CisgICAgICAgIGludCAgICAgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNTTElNSVQ7IGkrKykgeworICAgICAgICAgICAgdHNwbnRbaSAqIFNCTElNSVRdID0gKnJhd291dDErKzsKKyAgICAgICAgICAgICpyYXdvdXQyKysgPSAwLjA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBtYWluIGxheWVyMyBoYW5kbGVyCisgKi8KK3N0cnVjdCBJSUlfc2lkZWluZm8gc2lkZWluZm87CisKK2ludAorbGF5ZXIzX2F1ZGlvZGF0YV9wcmVjZWRlc2ZyYW1lcyhQTVBTVFIgbXApCit7CisgICAgaW50ICAgICBhdWRpb0RhdGFJbkZyYW1lOworICAgIGludCAgICAgZnJhbWVzVG9CYWNrdHJhY2s7CisKKyAgICAvKiBzcGVjaWZpYyB0byBMYXllciAzLCBzaW5jZSBMYXllciAxICYgMiB0aGUgYXVkaW8gZGF0YSBzdGFydHMgYXQgdGhlIGZyYW1lIHRoYXQgZGVzY3JpYmVzIGl0LiAqLworICAgIC8qIGRldGVybWluZSBob3cgbWFueSBieXRlcyBhbmQgdGhlcmVmb3JlIGJpdHN0cmVhbSBmcmFtZXMgdGhlIGF1ZGlvIGRhdGEgcHJlY2VkZXMgaXQncyBtYXRjaGluZyBmcmFtZSAqLworICAgIC8qIGZwcmludGYoc3RkZXJyLCAiaGlwOiBtYWluX2RhdGFfYmVnaW4gPSAlZCwgbXAtPmJzaXplICVkLCBtcC0+ZnNpemVvbGQgJWQsIG1wLT5zc2l6ZSAlZFxuIiwKKyAgICAgICBzaWRlaW5mby5tYWluX2RhdGFfYmVnaW4sIG1wLT5ic2l6ZSwgbXAtPmZzaXplb2xkLCBtcC0+c3NpemUpOyAqLworICAgIC8qIGNvbXB1dGUgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmFja3RyYWNrLCA0IGZvciB0aGUgaGVhZGVyLCBzc2l6ZSBhbHJlYWR5IGhvbGRzIHRoZSBDUkMgKi8KKyAgICAvKiBUT0RPIEVycm9uZW91c2x5IGFzc3VtZXMgY3VycmVudCBmcmFtZSBpcyBzYW1lIGFzIHByZXZpb3VzIGZyYW1lLiAqLworICAgIGF1ZGlvRGF0YUluRnJhbWUgPSBtcC0+YnNpemUgLSA0IC0gbXAtPnNzaXplOworICAgIGZyYW1lc1RvQmFja3RyYWNrID0gKHNpZGVpbmZvLm1haW5fZGF0YV9iZWdpbiArIGF1ZGlvRGF0YUluRnJhbWUgLSAxKSAvIGF1ZGlvRGF0YUluRnJhbWU7CisgICAgLyogZnByaW50ZihzdGRlcnIsICJoaXA6IGF1ZGlvRGF0YUluRnJhbWUgJWQgZnJhbWVzVG9CYWNrdHJhY2sgJWRcbiIsIGF1ZGlvRGF0YUluRnJhbWUsIGZyYW1lc1RvQmFja3RyYWNrKTsgKi8KKyAgICByZXR1cm4gZnJhbWVzVG9CYWNrdHJhY2s7Cit9CisKK2ludAorZG9fbGF5ZXIzX3NpZGVpbmZvKFBNUFNUUiBtcCkKK3sKKyAgICBzdHJ1Y3QgZnJhbWUgKmZyID0gJm1wLT5mcjsKKyAgICBpbnQgICAgIHN0ZXJlbyA9IGZyLT5zdGVyZW87CisgICAgaW50ICAgICBzaW5nbGUgPSBmci0+c2luZ2xlOworICAgIGludCAgICAgbXNfc3RlcmVvOworICAgIGludCAgICAgc2ZyZXEgPSBmci0+c2FtcGxpbmdfZnJlcXVlbmN5OworICAgIGludCAgICAgZ3JhbnVsZXM7CisgICAgaW50ICAgICBjaCwgZ3IsIGRhdGFiaXRzOworCisgICAgaWYgKHN0ZXJlbyA9PSAxKSB7ICAvKiBzdHJlYW0gaXMgbW9ubyAqLworICAgICAgICBzaW5nbGUgPSAwOworICAgIH0KKworICAgIGlmIChmci0+bW9kZSA9PSBNUEdfTURfSk9JTlRfU1RFUkVPKSB7CisgICAgICAgIG1zX3N0ZXJlbyA9IGZyLT5tb2RlX2V4dCAmIDB4MjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBtc19zdGVyZW8gPSAwOworCisKKyAgICBpZiAoZnItPmxzZikgeworICAgICAgICBncmFudWxlcyA9IDE7CisgICAgICAgIElJSV9nZXRfc2lkZV9pbmZvXzIobXAsICZzaWRlaW5mbywgc3RlcmVvLCBtc19zdGVyZW8sIHNmcmVxLCBzaW5nbGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ3JhbnVsZXMgPSAyOworICAgICAgICBJSUlfZ2V0X3NpZGVfaW5mb18xKG1wLCAmc2lkZWluZm8sIHN0ZXJlbywgbXNfc3RlcmVvLCBzZnJlcSwgc2luZ2xlKTsKKyAgICB9CisKKyAgICBkYXRhYml0cyA9IDA7CisgICAgZm9yIChnciA9IDA7IGdyIDwgZ3JhbnVsZXM7ICsrZ3IpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3RlcmVvOyArK2NoKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZ3JfaW5mb19zICpncl9pbmZvcyA9ICYoc2lkZWluZm8uY2hbY2hdLmdyW2dyXSk7CisgICAgICAgICAgICBkYXRhYml0cyArPSBncl9pbmZvcy0+cGFydDJfM19sZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRhdGFiaXRzIC0gOCAqIHNpZGVpbmZvLm1haW5fZGF0YV9iZWdpbjsKK30KKworCisKK2ludAorZG9fbGF5ZXIzKFBNUFNUUiBtcCwgdW5zaWduZWQgY2hhciAqcGNtX3NhbXBsZSwgaW50ICpwY21fcG9pbnQsCisgICAgICAgICAgaW50ICgqc3ludGhfMXRvMV9tb25vX3B0cikgKFBNUFNUUiwgcmVhbCAqLCB1bnNpZ25lZCBjaGFyICosIGludCAqKSwKKyAgICAgICAgICBpbnQgKCpzeW50aF8xdG8xX3B0cikgKFBNUFNUUiwgcmVhbCAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50ICopKQoreworICAgIGludCAgICAgZ3IsIGNoLCBzcywgY2xpcCA9IDA7CisgICAgaW50ICAgICBzY2FsZWZhY3NbMl1bMzldOyAvKiBtYXggMzkgZm9yIHNob3J0WzEzXVszXSBtb2RlLCBtaXhlZDogMzgsIGxvbmc6IDIyICovCisgICAgLyogIHN0cnVjdCBJSUlfc2lkZWluZm8gc2lkZWluZm87ICovCisgICAgc3RydWN0IGZyYW1lICpmciA9ICYobXAtPmZyKTsKKyAgICBpbnQgICAgIHN0ZXJlbyA9IGZyLT5zdGVyZW87CisgICAgaW50ICAgICBzaW5nbGUgPSBmci0+c2luZ2xlOworICAgIGludCAgICAgbXNfc3RlcmVvLCBpX3N0ZXJlbzsKKyAgICBpbnQgICAgIHNmcmVxID0gZnItPnNhbXBsaW5nX2ZyZXF1ZW5jeTsKKyAgICBpbnQgICAgIHN0ZXJlbzEsIGdyYW51bGVzOworCisgICAgaWYgKHNldF9wb2ludGVyKG1wLCAoaW50KSBzaWRlaW5mby5tYWluX2RhdGFfYmVnaW4pID09IE1QM19FUlIpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHN0ZXJlbyA9PSAxKSB7ICAvKiBzdHJlYW0gaXMgbW9ubyAqLworICAgICAgICBzdGVyZW8xID0gMTsKKyAgICAgICAgc2luZ2xlID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoc2luZ2xlID49IDApIC8qIHN0cmVhbSBpcyBzdGVyZW8sIGJ1dCBmb3JjZSB0byBtb25vICovCisgICAgICAgIHN0ZXJlbzEgPSAxOworICAgIGVsc2UKKyAgICAgICAgc3RlcmVvMSA9IDI7CisKKyAgICBpZiAoZnItPm1vZGUgPT0gTVBHX01EX0pPSU5UX1NURVJFTykgeworICAgICAgICBtc19zdGVyZW8gPSBmci0+bW9kZV9leHQgJiAweDI7CisgICAgICAgIGlfc3RlcmVvID0gZnItPm1vZGVfZXh0ICYgMHgxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG1zX3N0ZXJlbyA9IGlfc3RlcmVvID0gMDsKKworCisgICAgaWYgKGZyLT5sc2YpIHsKKyAgICAgICAgZ3JhbnVsZXMgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ3JhbnVsZXMgPSAyOworICAgIH0KKworICAgIGZvciAoZ3IgPSAwOyBnciA8IGdyYW51bGVzOyBncisrKSB7CisgICAgICAgIHN0YXRpYyByZWFsIGh5YnJpZEluWzJdW1NCTElNSVRdW1NTTElNSVRdOworICAgICAgICBzdGF0aWMgcmVhbCBoeWJyaWRPdXRbMl1bU1NMSU1JVF1bU0JMSU1JVF07CisKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGdyX2luZm9fcyAqZ3JfaW5mb3MgPSAmKHNpZGVpbmZvLmNoWzBdLmdyW2dyXSk7CisgICAgICAgICAgICBsb25nICAgIHBhcnQyYml0czsKKworICAgICAgICAgICAgaWYgKGZyLT5sc2YpCisgICAgICAgICAgICAgICAgcGFydDJiaXRzID0gSUlJX2dldF9zY2FsZV9mYWN0b3JzXzIobXAsIHNjYWxlZmFjc1swXSwgZ3JfaW5mb3MsIDApOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGFydDJiaXRzID0gSUlJX2dldF9zY2FsZV9mYWN0b3JzXzEobXAsIHNjYWxlZmFjc1swXSwgZ3JfaW5mb3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXAtPnBpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIGk7CisgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zZmJpdHNbZ3JdWzBdID0gcGFydDJiaXRzOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBtcC0+cGluZm8tPnNmYl9zW2dyXVswXVtpXSA9IHNjYWxlZmFjc1swXVtpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZnByaW50ZihzdGRlcnIsICJjYWxsaW5nIElJSSBkZXF1YW50aXplIHNhbXBsZSAxIGdyX2luZm9zLT5wYXJ0Ml8zX2xlbmd0aCAlZFxuIiwgZ3JfaW5mb3MtPnBhcnQyXzNfbGVuZ3RoKTsgKi8KKyAgICAgICAgICAgIGlmIChJSUlfZGVxdWFudGl6ZV9zYW1wbGUobXAsIGh5YnJpZEluWzBdLCBzY2FsZWZhY3NbMF0sIGdyX2luZm9zLCBzZnJlcSwgcGFydDJiaXRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpcDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RlcmVvID09IDIpIHsKKyAgICAgICAgICAgIHN0cnVjdCBncl9pbmZvX3MgKmdyX2luZm9zID0gJihzaWRlaW5mby5jaFsxXS5ncltncl0pOworICAgICAgICAgICAgbG9uZyAgICBwYXJ0MmJpdHM7CisgICAgICAgICAgICBpZiAoZnItPmxzZikKKyAgICAgICAgICAgICAgICBwYXJ0MmJpdHMgPSBJSUlfZ2V0X3NjYWxlX2ZhY3RvcnNfMihtcCwgc2NhbGVmYWNzWzFdLCBncl9pbmZvcywgaV9zdGVyZW8pOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGFydDJiaXRzID0gSUlJX2dldF9zY2FsZV9mYWN0b3JzXzEobXAsIHNjYWxlZmFjc1sxXSwgZ3JfaW5mb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1wLT5waW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICBpOworICAgICAgICAgICAgICAgIG1wLT5waW5mby0+c2ZiaXRzW2dyXVsxXSA9IHBhcnQyYml0czsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zZmJfc1tncl1bMV1baV0gPSBzY2FsZWZhY3NbMV1baV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGZwcmludGYoc3RkZXJyLCAiY2FsbGluZyBJSUkgZGVxdWFudGl6ZSBzYW1wbGUgMiAgZ3JfaW5mb3MtPnBhcnQyXzNfbGVuZ3RoICVkXG4iLCBncl9pbmZvcy0+cGFydDJfM19sZW5ndGgpOyAqLworICAgICAgICAgICAgaWYgKElJSV9kZXF1YW50aXplX3NhbXBsZShtcCwgaHlicmlkSW5bMV0sIHNjYWxlZmFjc1sxXSwgZ3JfaW5mb3MsIHNmcmVxLCBwYXJ0MmJpdHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBjbGlwOworCisgICAgICAgICAgICBpZiAobXNfc3RlcmVvKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQkxJTUlUICogU1NMSU1JVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWwgICAgdG1wMCwgdG1wMTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9ICgocmVhbCAqKSBoeWJyaWRJblswXSlbaV07CisgICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoKHJlYWwgKikgaHlicmlkSW5bMV0pW2ldOworICAgICAgICAgICAgICAgICAgICAoKHJlYWwgKikgaHlicmlkSW5bMV0pW2ldID0gdG1wMCAtIHRtcDE7CisgICAgICAgICAgICAgICAgICAgICgocmVhbCAqKSBoeWJyaWRJblswXSlbaV0gPSB0bXAwICsgdG1wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpX3N0ZXJlbykKKyAgICAgICAgICAgICAgICBJSUlfaV9zdGVyZW8oaHlicmlkSW4sIHNjYWxlZmFjc1sxXSwgZ3JfaW5mb3MsIHNmcmVxLCBtc19zdGVyZW8sIGZyLT5sc2YpOworCisgICAgICAgICAgICBpZiAobXNfc3RlcmVvIHx8IGlfc3RlcmVvIHx8IChzaW5nbGUgPT0gMykpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ3JfaW5mb3MtPm1heGIgPiBzaWRlaW5mby5jaFswXS5ncltncl0ubWF4YikKKyAgICAgICAgICAgICAgICAgICAgc2lkZWluZm8uY2hbMF0uZ3JbZ3JdLm1heGIgPSBncl9pbmZvcy0+bWF4YjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdyX2luZm9zLT5tYXhiID0gc2lkZWluZm8uY2hbMF0uZ3JbZ3JdLm1heGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoc2luZ2xlKSB7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGk7CisgICAgICAgICAgICAgICAgICAgIHJlYWwgICAqaW4wID0gKHJlYWwgKikgaHlicmlkSW5bMF0sICppbjEgPSAocmVhbCAqKSBoeWJyaWRJblsxXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIChTU0xJTUlUICogZ3JfaW5mb3MtPm1heGIpOyBpKyssIGluMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgKmluMCA9ICgqaW4wICsgKmluMSsrKTsgLyogKjAuNSBkb25lIGJ5IHBvdy1zY2FsZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCAgICAgaTsKKyAgICAgICAgICAgICAgICAgICAgcmVhbCAgICppbjAgPSAocmVhbCAqKSBoeWJyaWRJblswXSwgKmluMSA9IChyZWFsICopIGh5YnJpZEluWzFdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgKFNTTElNSVQgKiBncl9pbmZvcy0+bWF4Yik7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICppbjArKyA9ICppbjErKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobXAtPnBpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludCAgICAgaSwgc2I7CisgICAgICAgICAgICBmbG9hdCAgIGlmcXN0ZXA7CisKKyAgICAgICAgICAgIG1wLT5waW5mby0+Yml0cmF0ZSA9IHRhYnNlbF8xMjNbZnItPmxzZl1bZnItPmxheSAtIDFdW2ZyLT5iaXRyYXRlX2luZGV4XTsKKyAgICAgICAgICAgIG1wLT5waW5mby0+c2FtcGZyZXEgPSBmcmVxc1tzZnJlcV07CisgICAgICAgICAgICBtcC0+cGluZm8tPmVtcGggPSBmci0+ZW1waGFzaXM7CisgICAgICAgICAgICBtcC0+cGluZm8tPmNyYyA9IGZyLT5lcnJvcl9wcm90ZWN0aW9uOworICAgICAgICAgICAgbXAtPnBpbmZvLT5wYWRkaW5nID0gZnItPnBhZGRpbmc7CisgICAgICAgICAgICBtcC0+cGluZm8tPnN0ZXJlbyA9IGZyLT5zdGVyZW87CisgICAgICAgICAgICBtcC0+cGluZm8tPmpzID0gKGZyLT5tb2RlID09IE1QR19NRF9KT0lOVF9TVEVSRU8pOworICAgICAgICAgICAgbXAtPnBpbmZvLT5tc19zdGVyZW8gPSBtc19zdGVyZW87CisgICAgICAgICAgICBtcC0+cGluZm8tPmlfc3RlcmVvID0gaV9zdGVyZW87CisgICAgICAgICAgICBtcC0+cGluZm8tPm1haW5kYXRhID0gc2lkZWluZm8ubWFpbl9kYXRhX2JlZ2luOworCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW8xOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGdyX2luZm9fcyAqZ3JfaW5mb3MgPSAmKHNpZGVpbmZvLmNoW2NoXS5ncltncl0pOworICAgICAgICAgICAgICAgIG1wLT5waW5mby0+YmlnX3ZhbHVlc1tncl1bY2hdID0gZ3JfaW5mb3MtPmJpZ192YWx1ZXM7CisgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zY2FsZWZhY19zY2FsZVtncl1bY2hdID0gZ3JfaW5mb3MtPnNjYWxlZmFjX3NjYWxlOworICAgICAgICAgICAgICAgIG1wLT5waW5mby0+bWl4ZWRbZ3JdW2NoXSA9IGdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnOworICAgICAgICAgICAgICAgIG1wLT5waW5mby0+bXBnMTIzYmxvY2t0eXBlW2dyXVtjaF0gPSBncl9pbmZvcy0+YmxvY2tfdHlwZTsKKyAgICAgICAgICAgICAgICBtcC0+cGluZm8tPm1haW5iaXRzW2dyXVtjaF0gPSBncl9pbmZvcy0+cGFydDJfM19sZW5ndGg7CisgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5wcmVmbGFnW2dyXVtjaF0gPSBncl9pbmZvcy0+cHJlZmxhZzsKKyAgICAgICAgICAgICAgICBpZiAoZ3IgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zY2ZzaVtjaF0gPSBncl9pbmZvcy0+c2Nmc2k7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3RlcmVvMTsgY2grKykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBncl9pbmZvX3MgKmdyX2luZm9zID0gJihzaWRlaW5mby5jaFtjaF0uZ3JbZ3JdKTsKKyAgICAgICAgICAgICAgICBpZnFzdGVwID0gKG1wLT5waW5mby0+c2NhbGVmYWNfc2NhbGVbZ3JdW2NoXSA9PSAwKSA/IC41IDogMS4wOworICAgICAgICAgICAgICAgIGlmICgyID09IGdyX2luZm9zLT5ibG9ja190eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDEyOyBzYisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICBqID0gMyAqIHNiICsgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3AgPSBzY2FsZWZhY1tzZmIqMytsd2luLWdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnXTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGVmYWMgd2FzIGNvcGllZCBpbnRvIHBpbmZvLT5zZmJfc1tdIGFib3ZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zZmJfc1tncl1bY2hdW2pdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWlmcXN0ZXAgKiBtcC0+cGluZm8tPnNmYl9zW2dyXVtjaF1baiAtIGdyX2luZm9zLT5taXhlZF9ibG9ja19mbGFnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC0+cGluZm8tPnNmYl9zW2dyXVtjaF1bal0gLT0gMiAqIChtcC0+cGluZm8tPnN1Yl9nYWluW2dyXVtjaF1baV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zZmJfc1tncl1bY2hdWzMgKiBzYiArIGldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMiAqIChtcC0+cGluZm8tPnN1Yl9nYWluW2dyXVtjaF1baV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCAyMTsgc2IrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGVmYWMgd2FzIGNvcGllZCBpbnRvIHBpbmZvLT5zZmJbXSBhYm92ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zZmJbZ3JdW2NoXVtzYl0gPSBtcC0+cGluZm8tPnNmYl9zW2dyXVtjaF1bc2JdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyX2luZm9zLT5wcmVmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wLT5waW5mby0+c2ZiW2dyXVtjaF1bc2JdICs9IHByZXRhYjFbc2JdOworICAgICAgICAgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zZmJbZ3JdW2NoXVtzYl0gKj0gLWlmcXN0ZXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbXAtPnBpbmZvLT5zZmJbZ3JdW2NoXVsyMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHN0ZXJlbzE7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIGogPSAwOworICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IFNCTElNSVQ7IHNiKyspCisgICAgICAgICAgICAgICAgICAgIGZvciAoc3MgPSAwOyBzcyA8IFNTTElNSVQ7IHNzKyssIGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wLT5waW5mby0+bXBnMTIzeHJbZ3JdW2NoXVtqXSA9IGh5YnJpZEluW2NoXVtzYl1bc3NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW8xOyBjaCsrKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZ3JfaW5mb19zICpncl9pbmZvcyA9ICYoc2lkZWluZm8uY2hbY2hdLmdyW2dyXSk7CisgICAgICAgICAgICBJSUlfYW50aWFsaWFzKGh5YnJpZEluW2NoXSwgZ3JfaW5mb3MpOworICAgICAgICAgICAgSUlJX2h5YnJpZChtcCwgaHlicmlkSW5bY2hdLCBoeWJyaWRPdXRbY2hdLCBjaCwgZ3JfaW5mb3MpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzcyA9IDA7IHNzIDwgU1NMSU1JVDsgc3MrKykgeworICAgICAgICAgICAgaWYgKHNpbmdsZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgY2xpcCArPSAoKnN5bnRoXzF0bzFfbW9ub19wdHIpIChtcCwgaHlicmlkT3V0WzBdW3NzXSwgcGNtX3NhbXBsZSwgcGNtX3BvaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCAgICAgcDEgPSAqcGNtX3BvaW50OworICAgICAgICAgICAgICAgIGNsaXAgKz0gKCpzeW50aF8xdG8xX3B0cikgKG1wLCBoeWJyaWRPdXRbMF1bc3NdLCAwLCBwY21fc2FtcGxlLCAmcDEpOworICAgICAgICAgICAgICAgIGNsaXAgKz0gKCpzeW50aF8xdG8xX3B0cikgKG1wLCBoeWJyaWRPdXRbMV1bc3NdLCAxLCBwY21fc2FtcGxlLCBwY21fcG9pbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNsaXA7Cit9CmRpZmYgLS1naXQgYS9tcGdsaWIvbGF5ZXIzLmggYi9tcGdsaWIvbGF5ZXIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzY2IwZQotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi9sYXllcjMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAgVGhlIEwuQS5NLkUuIHByb2plY3QKKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEhpcHAsIHNlZSBhbHNvIEFVVEhPUlMgYW5kIFJFQURNRS4KKyAqICAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBMQVlFUjNfSF9JTkNMVURFRAorI2RlZmluZSBMQVlFUjNfSF9JTkNMVURFRAorCit2b2lkICAgIGluaXRfbGF5ZXIzKGludCk7CitpbnQgICAgIGRvX2xheWVyM19zaWRlaW5mbyhQTVBTVFIgbXApOworaW50ICAgICBkb19sYXllcjMoUE1QU1RSIG1wLCB1bnNpZ25lZCBjaGFyICpwY21fc2FtcGxlLCBpbnQgKnBjbV9wb2ludCwKKyAgICAgICAgICAgICAgICAgIGludCAoKnN5bnRoXzF0bzFfbW9ub19wdHIpIChQTVBTVFIsIHJlYWwgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQgKiksCisgICAgICAgICAgICAgICAgICBpbnQgKCpzeW50aF8xdG8xX3B0cikgKFBNUFNUUiwgcmVhbCAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50ICopKTsKK2ludCAgICAgbGF5ZXIzX2F1ZGlvZGF0YV9wcmVjZWRlc2ZyYW1lcyhQTVBTVFIgbXApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21wZ2xpYi9tcGcxMjMuaCBiL21wZ2xpYi9tcGcxMjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ4Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL21wZzEyMy5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAgVGhlIEwuQS5NLkUuIHByb2plY3QKKyAqCisgKiBJbml0aWFsbHkgd3JpdHRlbiBieSBNaWNoYWVsIEhpcHAsIHNlZSBhbHNvIEFVVEhPUlMgYW5kIFJFQURNRS4KKyAqICAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgTVBHMTIzX0hfSU5DTFVERUQKKyNkZWZpbmUgTVBHMTIzX0hfSU5DTFVERUQKKworI2luY2x1ZGUgICAgICAgIDxzdGRpby5oPgorCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyMgaWZuZGVmIEhBVkVfU1RSQ0hSCisjICBkZWZpbmUgc3RyY2hyIGluZGV4CisjICBkZWZpbmUgc3RycmNociByaW5kZXgKKyMgZW5kaWYKK2NoYXIgICAqc3RyY2hyKCksICpzdHJyY2hyKCk7CisjIGlmbmRlZiBIQVZFX01FTUNQWQorIyAgZGVmaW5lIG1lbWNweShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKKyMgIGRlZmluZSBtZW1tb3ZlKGQsIHMsIG4pIGJjb3B5ICgocyksIChkKSwgKG4pKQorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICAgICAgICA8c2lnbmFsLmg+CisKKworI2lmIGRlZmluZWQoX19yaXNjb3NfXykgJiYgZGVmaW5lZChGUEExMCkKKyNpbmNsdWRlICJ5bWF0aC5oIgorI2Vsc2UKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisjaWZuZGVmIE1fU1FSVDIKKyNkZWZpbmUgTV9TUVJUMiAgICAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSAgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorI2lmbmRlZiBUUlVFCisjZGVmaW5lICAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKyN1bmRlZiBSRUFMX0lTX0ZMT0FUCisjZGVmaW5lIFJFQUxfSVNfRkxPQVQKKworI2lmZGVmIFJFQUxfSVNfRkxPQVQKKyMgIGRlZmluZSByZWFsIGZsb2F0CisjZWxpZiBkZWZpbmVkKFJFQUxfSVNfTE9OR19ET1VCTEUpCisjICBkZWZpbmUgcmVhbCBsb25nIGRvdWJsZQorI2Vsc2UKKyMgIGRlZmluZSByZWFsIGRvdWJsZQorI2VuZGlmCisKKyNkZWZpbmUgICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lICAgICAgICAgU0JMSU1JVCAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgICAgICAgICBTU0xJTUlUICAgICAgICAgICAgICAgICAxOAorCisjZGVmaW5lICAgICAgICAgTVBHX01EX1NURVJFTyAgICAgICAgICAgMAorI2RlZmluZSAgICAgICAgIE1QR19NRF9KT0lOVF9TVEVSRU8gICAgIDEKKyNkZWZpbmUgICAgICAgICBNUEdfTURfRFVBTF9DSEFOTkVMICAgICAyCisjZGVmaW5lICAgICAgICAgTVBHX01EX01PTk8gICAgICAgICAgICAgMworCisjZGVmaW5lIE1BWEZSQU1FU0laRSAyODgwCisKKy8qIEFGOiBBRERFRCBGT1IgTEFZRVIxL0xBWUVSMiAqLworI2RlZmluZSAgICAgICAgIFNDQUxFX0JMT0NLICAgICAgICAgICAgIDEyCisKKworLyogUHJlIFNoaWZ0IGZvIDE2IHRvIDggYml0IGNvbnZlcnRlciB0YWJsZSAqLworI2RlZmluZSBBVVNISUZUICgzKQorCitzdHJ1Y3QgZnJhbWUgeworICAgIGludCAgICAgc3RlcmVvOworICAgIGludCAgICAganNib3VuZDsKKyAgICBpbnQgICAgIHNpbmdsZTsgICAgICAgICAgLyogc2luZ2xlIGNoYW5uZWwgKG1vbm9waG9uaWMpICovCisgICAgaW50ICAgICBsc2Y7ICAgICAgICAgICAgIC8qIDAgPSBNUEVHLTEsIDEgPSBNUEVHLTIvMi41ICovCisgICAgaW50ICAgICBtcGVnMjU7ICAgICAgICAgIC8qIDEgPSBNUEVHLTIuNSwgMCA9IE1QRUctMS8yICovCisgICAgaW50ICAgICBoZWFkZXJfY2hhbmdlOworICAgIGludCAgICAgbGF5OyAgICAgICAgICAgICAvKiBMYXllciAqLworICAgIGludCAgICAgZXJyb3JfcHJvdGVjdGlvbjsgLyogMSA9IENSQy0xNiBjb2RlIGZvbGxvd2luZyBoZWFkZXIgKi8KKyAgICBpbnQgICAgIGJpdHJhdGVfaW5kZXg7CisgICAgaW50ICAgICBzYW1wbGluZ19mcmVxdWVuY3k7IC8qIHNhbXBsZSByYXRlIG9mIGRlY29tcHJlc3NlZCBhdWRpbyBpbiBIeiAqLworICAgIGludCAgICAgcGFkZGluZzsKKyAgICBpbnQgICAgIGV4dGVuc2lvbjsKKyAgICBpbnQgICAgIG1vZGU7CisgICAgaW50ICAgICBtb2RlX2V4dDsKKyAgICBpbnQgICAgIGNvcHlyaWdodDsKKyAgICBpbnQgICAgIG9yaWdpbmFsOworICAgIGludCAgICAgZW1waGFzaXM7CisgICAgaW50ICAgICBmcmFtZXNpemU7ICAgICAgIC8qIGNvbXB1dGVkIGZyYW1lc2l6ZSAqLworCisgICAgLyogQUY6IEFEREVEIEZPUiBMQVlFUjEvTEFZRVIyICovCisgICAgaW50ICAgICBJSV9zYmxpbWl0OworICAgIHN0cnVjdCBhbF90YWJsZTIgY29uc3QgKmFsbG9jOworICAgIGludCAgICAgZG93bl9zYW1wbGVfc2JsaW1pdDsKKyAgICBpbnQgICAgIGRvd25fc2FtcGxlOworCisKK307CisKK3N0cnVjdCBncl9pbmZvX3MgeworICAgIGludCAgICAgc2Nmc2k7CisgICAgdW5zaWduZWQgcGFydDJfM19sZW5ndGg7CisgICAgdW5zaWduZWQgYmlnX3ZhbHVlczsKKyAgICB1bnNpZ25lZCBzY2FsZWZhY19jb21wcmVzczsKKyAgICB1bnNpZ25lZCBibG9ja190eXBlOworICAgIHVuc2lnbmVkIG1peGVkX2Jsb2NrX2ZsYWc7CisgICAgdW5zaWduZWQgdGFibGVfc2VsZWN0WzNdOworICAgIHVuc2lnbmVkIHN1YmJsb2NrX2dhaW5bM107CisgICAgdW5zaWduZWQgbWF4YmFuZFszXTsKKyAgICB1bnNpZ25lZCBtYXhiYW5kbDsKKyAgICB1bnNpZ25lZCBtYXhiOworICAgIHVuc2lnbmVkIHJlZ2lvbjFzdGFydDsKKyAgICB1bnNpZ25lZCByZWdpb24yc3RhcnQ7CisgICAgdW5zaWduZWQgcHJlZmxhZzsKKyAgICB1bnNpZ25lZCBzY2FsZWZhY19zY2FsZTsKKyAgICB1bnNpZ25lZCBjb3VudDF0YWJsZV9zZWxlY3Q7CisgICAgcmVhbCAgICpmdWxsX2dhaW5bM107CisgICAgcmVhbCAgICpwb3cyZ2FpbjsKK307CisKK3N0cnVjdCBJSUlfc2lkZWluZm8geworICAgIHVuc2lnbmVkIG1haW5fZGF0YV9iZWdpbjsKKyAgICB1bnNpZ25lZCBwcml2YXRlX2JpdHM7CisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IGdyX2luZm9fcyBnclsyXTsKKyAgICB9IGNoWzJdOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21wZ2xpYi9tcGdsaWIuaCBiL21wZ2xpYi9tcGdsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZmNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL21wZ2xpYi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCBUaGUgTC5BLk0uRS4gcHJvamVjdAorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgSGlwcCwgc2VlIGFsc28gQVVUSE9SUyBhbmQgUkVBRE1FLgorICogIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgX01QR0xJQl9IXworI2RlZmluZSBfTVBHTElCX0hfCisKKyNpZm5kZWYgcGxvdHRpbmdfZGF0YV9kZWZpbmVkCisjZGVmaW5lIHBsb3R0aW5nX2RhdGFfZGVmaW5lZAorc3RydWN0IHBsb3R0aW5nX2RhdGE7Cit0eXBlZGVmIHN0cnVjdCBwbG90dGluZ19kYXRhIHBsb3R0aW5nX2RhdGE7CisjZW5kaWYKKworCisKKworc3RydWN0IGJ1ZiB7CisgICAgdW5zaWduZWQgY2hhciAqcG50OworICAgIGxvbmcgICAgc2l6ZTsKKyAgICBsb25nICAgIHBvczsKKyAgICBzdHJ1Y3QgYnVmICpuZXh0OworICAgIHN0cnVjdCBidWYgKnByZXY7Cit9OworCitzdHJ1Y3QgZnJhbWVidWYgeworICAgIHN0cnVjdCBidWYgKmJ1ZjsKKyAgICBsb25nICAgIHBvczsKKyAgICBzdHJ1Y3QgZnJhbWUgKm5leHQ7CisgICAgc3RydWN0IGZyYW1lICpwcmV2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbXBzdHJfdGFnIHsKKyAgICBzdHJ1Y3QgYnVmICpoZWFkLCAqdGFpbDsgLyogYnVmZmVyIGxpbmtlZCBsaXN0IHBvaW50ZXJzLCB0YWlsIHBvaW50cyB0byBvbGRlc3QgYnVmZmVyICovCisgICAgaW50ICAgICB2YnJfaGVhZGVyOyAgICAgIC8qIDEgaWYgdmFsaWQgWGluZyB2YnIgaGVhZGVyIGRldGVjdGVkICovCisgICAgaW50ICAgICBudW1fZnJhbWVzOyAgICAgIC8qIHNldCBpZiB2YnIgaGVhZGVyIHByZXNlbnQgKi8KKyAgICBpbnQgICAgIGVuY19kZWxheTsgICAgICAgLyogc2V0IGlmIHZiciBoZWFkZXIgcHJlc2VudCAqLworICAgIGludCAgICAgZW5jX3BhZGRpbmc7ICAgICAvKiBzZXQgaWYgdmJyIGhlYWRlciBwcmVzZW50ICovCisgICAgLyogaGVhZGVyX3BhcnNlZCwgc2lkZV9wYXJzZWQgYW5kIGRhdGFfcGFyc2VkIG11c3QgYmUgYWxsIHNldCAxCisgICAgICAgYmVmb3JlIHRoZSBmdWxsIGZyYW1lIGhhcyBiZWVuIHBhcnNlZCAqLworICAgIGludCAgICAgaGVhZGVyX3BhcnNlZDsgICAvKiAxID0gaGVhZGVyIG9mIGN1cnJlbnQgZnJhbWUgaGFzIGJlZW4gcGFyc2VkICovCisgICAgaW50ICAgICBzaWRlX3BhcnNlZDsgICAgIC8qIDEgPSBoZWFkZXIgb2Ygc2lkZWluZm8gb2YgY3VycmVudCBmcmFtZSBoYXMgYmVlbiBwYXJzZWQgKi8KKyAgICBpbnQgICAgIGRhdGFfcGFyc2VkOworICAgIGludCAgICAgZnJlZV9mb3JtYXQ7ICAgICAvKiAxID0gZnJlZSBmb3JtYXQgZnJhbWUgKi8KKyAgICBpbnQgICAgIG9sZF9mcmVlX2Zvcm1hdDsgLyogMSA9IGxhc3QgZnJhbWUgd2FzIGZyZWUgZm9ybWF0ICovCisgICAgaW50ICAgICBic2l6ZTsKKyAgICBpbnQgICAgIGZyYW1lc2l6ZTsKKyAgICBpbnQgICAgIHNzaXplOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIHNpZGUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyAyIGJ5dGVzIGZvciBDUkMtMTYgaWYgcHJlc2VudCAqLworICAgIGludCAgICAgZHNpemU7CisgICAgaW50ICAgICBmc2l6ZW9sZDsgICAgICAgIC8qIHNpemUgb2YgcHJldmlvdXMgZnJhbWUsIC0xIGZvciBmaXJzdCAqLworICAgIGludCAgICAgZnNpemVvbGRfbm9wYWRkaW5nOworICAgIHN0cnVjdCBmcmFtZSBmcjsgICAgICAgICAvKiBob2xkcyB0aGUgcGFyYW1ldGVycyBkZWNvZGVkIGZyb20gdGhlIGhlYWRlciAqLworICAgIHVuc2lnbmVkIGNoYXIgYnNzcGFjZVsyXVtNQVhGUkFNRVNJWkUgKyAxMDI0XTsgLyogYml0IHN0cmVhbSBzcGFjZSB1c2VkID8/Pz8gKi8gLyogTUFYRlJBTUVTSVpFICovCisgICAgcmVhbCAgICBoeWJyaWRfYmxvY2tbMl1bMl1bU0JMSU1JVCAqIFNTTElNSVRdOworICAgIGludCAgICAgaHlicmlkX2JsY1syXTsKKyAgICB1bnNpZ25lZCBsb25nIGhlYWRlcjsKKyAgICBpbnQgICAgIGJzbnVtOworICAgIHJlYWwgICAgc3ludGhfYnVmZnNbMl1bMl1bMHgxMTBdOworICAgIGludCAgICAgc3ludGhfYm87CisgICAgaW50ICAgICBzeW5jX2JpdHN0cmVhbTsgIC8qIDEgPSBiaXRzdHJlYW0gaXMgeWV0IHRvIGJlIHN5bmNocm9uaXplZCAqLworCisgICAgaW50ICAgICBiaXRpbmRleDsKKyAgICB1bnNpZ25lZCBjaGFyICp3b3JkcG9pbnRlcjsKKyAgICBwbG90dGluZ19kYXRhICpwaW5mbzsKK30gTVBTVFIsICpQTVBTVFI7CisKKworI2RlZmluZSBNUDNfRVJSIC0xCisjZGVmaW5lIE1QM19PSyAgMAorI2RlZmluZSBNUDNfTkVFRF9NT1JFIDEKKworCisKKyNlbmRpZiAvKiBfTVBHTElCX0hfICovCmRpZmYgLS1naXQgYS9tcGdsaWIvbXBnbGliX3ZjNi5kc3AgYi9tcGdsaWIvbXBnbGliX3ZjNi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlMzE1YgotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi9tcGdsaWJfdmM2LmRzcApAQCAtMCwwICsxLDIyNiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtcGdsaWIiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNA0KKw0KK0NGRz1tcGdsaWIgLSBXaW4zMiBSZWxlYXNlDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJtcGdsaWJfdmM2Lm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgU2llIGv2bm5lbiBiZWltIEF1c2b8aHJlbiB2b24gTk1BS0UgZWluZSBLb25maWd1cmF0aW9uIGFuZ2ViZW4NCishTUVTU0FHRSBkdXJjaCBEZWZpbmllcmVuIGRlcyBNYWtyb3MgQ0ZHIGluIGRlciBCZWZlaGxzemVpbGUuIFp1bSBCZWlzcGllbDoNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibXBnbGliX3ZjNi5tYWsiIENGRz0ibXBnbGliIC0gV2luMzIgUmVsZWFzZSINCishTUVTU0FHRSANCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJtcGdsaWIgLSBXaW4zMiBSZWxlYXNlIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAibXBnbGliIC0gV2luMzIgRGVidWciIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJtcGdsaWIgLSBXaW4zMiBSZWxlYXNlIE5BU00iIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAxDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJtcGdsaWIgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXG91dHB1dFxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcUmVsZWFzZVxtcGdsaWIiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIkhBVkVfQ09ORklHX0giIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvTzIgL09iMiAvSSAiLi4vbGlibXAzbGFtZSIgL0kgIi4uL2luY2x1ZGUiIC9JICIuLiIgL0QgIk5ERUJVRyIgL0QgIkhBVkVfTVBHTElCIiAvRCAiX1dJTkRPV1MiIC9EICJVU0VfTEFZRVJfMiIgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0ZEIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkNCisjIEFERCBSU0MgL2wgMHg0MDkNCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQorIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlxvdXRwdXRcUmVsZWFzZVxtcGdsaWItc3RhdGljLmxpYiINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibXBnbGliIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cb3V0cHV0XERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxvYmpcRGVidWdcbXBnbGliIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9aSSAvT2QgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4iIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIlVTRV9MQVlFUl8yIiAvRCAiSEFWRV9NUEdMSUIiIC9EICJXSU4zMiIgL0QgIkhBVkVfQ09ORklHX0giIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOQ0KKyMgQUREIFJTQyAvbCAweDQwOQ0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXG91dHB1dFxEZWJ1Z1xtcGdsaWItc3RhdGljLmxpYiINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibXBnbGliIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIm1wZ2xpYl9fX1dpbjMyX1JlbGVhc2VfTkFTTSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJtcGdsaWJfX19XaW4zMl9SZWxlYXNlX05BU00iDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXG91dHB1dFxSZWxlYXNlX05BU00iDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXG9ialxSZWxlYXNlX05BU01cbXBnbGliIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL08yIC9PYjIgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4iIC9EICJOREVCVUciIC9EICJIQVZFX01QR0xJQiIgL0QgIl9XSU5ET1dTIiAvRCAiVVNFX0xBWUVSXzIiIC9EICJVU0VfTEFZRVJfMSIgL0QgIldJTjMyIiAvRCAiSEFWRV9DT05GSUdfSCIgL0ZEIC9jDQorIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL08yIC9PYjIgL0kgIi4uL2xpYm1wM2xhbWUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4iIC9EICJOREVCVUciIC9EICJIQVZFX01QR0xJQiIgL0QgIl9XSU5ET1dTIiAvRCAiVVNFX0xBWUVSXzIiIC9EICJXSU4zMiIgL0QgIkhBVkVfQ09ORklHX0giIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWA0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5DQorIyBBREQgUlNDIC9sIDB4NDA5DQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbyAvb3V0OiJSZWxlYXNlXG1wZ2xpYi5saWIiDQorIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlxvdXRwdXRcUmVsZWFzZV9OQVNNXG1wZ2xpYi1zdGF0aWMubGliIg0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAibXBnbGliIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIm1wZ2xpYiAtIFdpbjMyIERlYnVnIg0KKyMgTmFtZSAibXBnbGliIC0gV2luMzIgUmVsZWFzZSBOQVNNIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImMiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGNvbW1vbi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZGN0NjRfaTM4Ni5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZGVjb2RlX2kzODYuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGludGVyZmFjZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGF5ZXIxLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxsYXllcjIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxheWVyMy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdGFiaW5pdC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkluY2x1ZGUiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxjb21tb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxjb25maWdNUy5oDQorDQorIUlGICAiJChDRkcpIiA9PSAibXBnbGliIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIFBlcmZvcm1pbmcgQ3VzdG9tIEJ1aWxkIFN0ZXAgb24gJChJbnB1dE5hbWUpDQorSW5wdXRQYXRoPS4uXGNvbmZpZ01TLmgNCisNCisiLi5cY29uZmlnLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorCWNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaA0KKw0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJtcGdsaWIgLSBXaW4zMiBEZWJ1ZyINCisNCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIFBlcmZvcm1pbmcgQ3VzdG9tIEJ1aWxkIFN0ZXAgb24gJChJbnB1dE5hbWUpDQorSW5wdXRQYXRoPS4uXGNvbmZpZ01TLmgNCisNCisiLi5cY29uZmlnLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorCWNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaA0KKw0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJtcGdsaWIgLSBXaW4zMiBSZWxlYXNlIE5BU00iDQorDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBQZXJmb3JtaW5nIEN1c3RvbSBCdWlsZCBTdGVwIG9uICQoSW5wdXROYW1lKQ0KK0lucHV0UGF0aD0uLlxjb25maWdNUy5oDQorDQorIi4uXGNvbmZpZy5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKwljb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgNCisNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZGN0NjRfaTM4Ni5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZGVjb2RlX2kzODYuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGh1ZmZtYW4uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGludGVyZmFjZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGF5ZXIxLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxsYXllcjIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxheWVyMy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbXBnMTIzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxtcGdsaWIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHRhYmluaXQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvbXBnbGliL21wZ2xpYl92YzgudmNwcm9qIGIvbXBnbGliL21wZ2xpYl92YzgudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmJlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tcGdsaWIvbXBnbGliX3ZjOC52Y3Byb2oKQEAgLTAsMCArMSw1NjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LjAwIg0KKwlOYW1lPSJtcGdsaWJfdmM4Ig0KKwlQcm9qZWN0R1VJRD0iezBBQjQ4RTVELUZBQTUtNDAyQi04NEQ2LTJGNTE2NkQ5MERENH0iDQorCVJvb3ROYW1lc3BhY2U9Im1wZ2xpYl92YzgiDQorCUtleXdvcmQ9IldpbjMyUHJvaiINCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJ4NjQiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFByb2plY3REaXIpJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi87Li4vbGlibXAzbGFtZTsuLi9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHLEhBVkVfTVBHTElCLF9XSU5ET1dTLFVTRV9MQVlFUl8yLFdJTjMyLEhBVkVfQ09ORklHX0giDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChQcm9qZWN0RGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi87Li4vbGlibXAzbGFtZTsuLi9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHLEhBVkVfTVBHTElCLF9XSU5ET1dTLFVTRV9MQVlFUl8yLFdJTjMyLEhBVkVfQ09ORklHX0giDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1ZyBHVEt8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2xpYm1wM2xhbWU7Li4vaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyxIQVZFX01QR0xJQixfV0lORE9XUyxVU0VfTEFZRVJfMixXSU4zMixIQVZFX0NPTkZJR19ILEhBVkVfR1RLIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLzsuLi9saWJtcDNsYW1lOy4uL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUcsSEFWRV9NUEdMSUIsX1dJTkRPV1MsVVNFX0xBWUVSXzIsV0lOMzIsSEFWRV9DT05GSUdfSCINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vOy4uL2xpYm1wM2xhbWU7Li4vaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyxIQVZFX01QR0xJQixfV0lORE9XUyxVU0VfTEFZRVJfMixXSU4zMixIQVZFX0NPTkZJR19IIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWcgR1RLfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi87Li4vbGlibXAzbGFtZTsuLi9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHLEhBVkVfTVBHTElCLF9XSU5ET1dTLFVTRV9MQVlFUl8yLFdJTjMyLEhBVkVfQ09ORklHX0giDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxjb21tb24uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZGN0NjRfaTM4Ni5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkZWNvZGVfaTM4Ni5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbnRlcmZhY2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbGF5ZXIxLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGxheWVyMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsYXllcjMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdGFiaW5pdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY29tbW9uLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxjb25maWdNUy5oIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJjb3B5IGNvbmZpZ01TLmggLSZndDsgY29uZmlnLmgiDQorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImNvcHkgY29uZmlnTVMuaCAtJmd0OyBjb25maWcuaCINCisJCQkJCQlDb21tYW5kTGluZT0iY29weSAuLlxjb25maWdNUy5oIC4uXGNvbmZpZy5oJiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBHVEt8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJjb3B5IGNvbmZpZ01TLmggLSZndDsgY29uZmlnLmgiDQorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iY29weSBjb25maWdNUy5oIC0mZ3Q7IGNvbmZpZy5oIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iLi5cY29uZmlnLmgiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iY29weSBjb25maWdNUy5oIC0mZ3Q7IGNvbmZpZy5oIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0iLi5cY29uZmlnLmgiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnIEdUS3x4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJjb3B5IGNvbmZpZ01TLmggLSZndDsgY29uZmlnLmgiDQorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkY3Q2NF9pMzg2LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRlY29kZV9pMzg2LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGh1ZmZtYW4uaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW50ZXJmYWNlLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGwydGFibGVzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGxheWVyMS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxsYXllcjIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbGF5ZXIzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXG1wZzEyMy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0YWJpbml0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJJbnRlcmZhY2UiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxtcGdsaWIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9tcGdsaWIvdGFiaW5pdC5jIGIvbXBnbGliL3RhYmluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzA3ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvbXBnbGliL3RhYmluaXQuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIHRhYmluaXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBwcm9qZWN0CisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBIaXBwLCBzZWUgYWxzbyBBVVRIT1JTIGFuZCBSRUFETUUuCisgKiAgCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisvKiAkSWQ6IHRhYmluaXQuYyx2IDEuMTIuMTAuMiAyMDEwLzAzLzIyIDE0OjE3OjE0IHJvYmVydCBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidGFiaW5pdC5oIgorI2luY2x1ZGUgIm1wZzEyMy5oIgorCisjaWZkZWYgV0lUSF9ETUFMTE9DCisjaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisKK3JlYWwgICAgZGVjd2luWzUxMiArIDMyXTsKK3N0YXRpYyByZWFsIGNvczY0WzE2XSwgY29zMzJbOF0sIGNvczE2WzRdLCBjb3M4WzJdLCBjb3M0WzFdOworcmVhbCAgICpwbnRzW10gPSB7IGNvczY0LCBjb3MzMiwgY29zMTYsIGNvczgsIGNvczQgfTsKKworLyogKklOREVOVC1PRkYqICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgZGV3aW5bNTEyXSA9IHsKKyAgIDAuMDAwMDAwMDAwLC0wLjAwMDAxNTI1OSwtMC4wMDAwMTUyNTksLTAuMDAwMDE1MjU5LAorICAtMC4wMDAwMTUyNTksLTAuMDAwMDE1MjU5LC0wLjAwMDAxNTI1OSwtMC4wMDAwMzA1MTgsCisgIC0wLjAwMDAzMDUxOCwtMC4wMDAwMzA1MTgsLTAuMDAwMDMwNTE4LC0wLjAwMDA0NTc3NiwKKyAgLTAuMDAwMDQ1Nzc2LC0wLjAwMDA2MTAzNSwtMC4wMDAwNjEwMzUsLTAuMDAwMDc2Mjk0LAorICAtMC4wMDAwNzYyOTQsLTAuMDAwMDkxNTUzLC0wLjAwMDEwNjgxMiwtMC4wMDAxMDY4MTIsCisgIC0wLjAwMDEyMjA3MCwtMC4wMDAxMzczMjksLTAuMDAwMTUyNTg4LC0wLjAwMDE2Nzg0NywKKyAgLTAuMDAwMTk4MzY0LC0wLjAwMDIxMzYyMywtMC4wMDAyNDQxNDEsLTAuMDAwMjU5Mzk5LAorICAtMC4wMDAyODk5MTcsLTAuMDAwMzIwNDM1LC0wLjAwMDM2NjIxMSwtMC4wMDAzOTY3MjksCisgIC0wLjAwMDQ0MjUwNSwtMC4wMDA0NzMwMjIsLTAuMDAwNTM0MDU4LC0wLjAwMDU3OTgzNCwKKyAgLTAuMDAwNjI1NjEwLC0wLjAwMDY4NjY0NiwtMC4wMDA3NDc2ODEsLTAuMDAwODA4NzE2LAorICAtMC4wMDA4ODUwMTAsLTAuMDAwOTYxMzA0LC0wLjAwMTAzNzU5OCwtMC4wMDExMTM4OTIsCisgIC0wLjAwMTIwNTQ0NCwtMC4wMDEyOTY5OTcsLTAuMDAxMzg4NTUwLC0wLjAwMTQ4MDEwMywKKyAgLTAuMDAxNTg2OTE0LC0wLjAwMTY5MzcyNiwtMC4wMDE3ODUyNzgsLTAuMDAxOTA3MzQ5LAorICAtMC4wMDIwMTQxNjAsLTAuMDAyMTIwOTcyLC0wLjAwMjI0MzA0MiwtMC4wMDIzNDk4NTQsCisgIC0wLjAwMjQ1NjY2NSwtMC4wMDI1Nzg3MzUsLTAuMDAyNjg1NTQ3LC0wLjAwMjc5MjM1OCwKKyAgLTAuMDAyODk5MTcwLC0wLjAwMjk5MDcyMywtMC4wMDMwODIyNzUsLTAuMDAzMTczODI4LAorICAtMC4wMDMyNTAxMjIsLTAuMDAzMzI2NDE2LC0wLjAwMzM4NzQ1MSwtMC4wMDM0MzMyMjgsCisgIC0wLjAwMzQ2Mzc0NSwtMC4wMDM0NzkwMDQsLTAuMDAzNDc5MDA0LC0wLjAwMzQ2Mzc0NSwKKyAgLTAuMDAzNDE3OTY5LC0wLjAwMzM3MjE5MiwtMC4wMDMyODA2NDAsLTAuMDAzMTczODI4LAorICAtMC4wMDMwNTE3NTgsLTAuMDAyODgzOTExLC0wLjAwMjcwMDgwNiwtMC4wMDI0ODcxODMsCisgIC0wLjAwMjIyNzc4MywtMC4wMDE5Mzc4NjYsLTAuMDAxNjE3NDMyLC0wLjAwMTI2NjQ3OSwKKyAgLTAuMDAwODY5NzUxLC0wLjAwMDQ0MjUwNSwgMC4wMDAwMzA1MTgsIDAuMDAwNTQ5MzE2LAorICAgMC4wMDEwOTg2MzMsIDAuMDAxNjkzNzI2LCAwLjAwMjMzNDU5NSwgMC4wMDMwMDU5ODEsCisgICAwLjAwMzcyMzE0NSwgMC4wMDQ0ODYwODQsIDAuMDA1Mjk0ODAwLCAwLjAwNjExODc3NCwKKyAgIDAuMDA3MDAzNzg0LCAwLjAwNzkxOTMxMiwgMC4wMDg4NjUzNTYsIDAuMDA5ODQxOTE5LAorICAgMC4wMTA4NDg5OTksIDAuMDExODg2NTk3LCAwLjAxMjkzOTQ1MywgMC4wMTQwMjI4MjcsCisgICAwLjAxNTEyMTQ2MCwgMC4wMTYyMzUzNTIsIDAuMDE3MzQ5MjQzLCAwLjAxODQ2MzEzNSwKKyAgIDAuMDE5NTc3MDI2LCAwLjAyMDY5MDkxOCwgMC4wMjE3ODk1NTEsIDAuMDIyODU3NjY2LAorICAgMC4wMjM5MTA1MjIsIDAuMDI0OTMyODYxLCAwLjAyNTkwOTQyNCwgMC4wMjY4NDAyMTAsCisgICAwLjAyNzcyNTIyMCwgMC4wMjg1MzM5MzYsIDAuMDI5MjgxNjE2LCAwLjAyOTkzNzc0NCwKKyAgIDAuMDMwNTMyODM3LCAwLjAzMTAwNTg1OSwgMC4wMzEzODczMjksIDAuMDMxNjYxOTg3LAorICAgMC4wMzE4MTQ1NzUsIDAuMDMxODQ1MDkzLCAwLjAzMTczODI4MSwgMC4wMzE0Nzg4ODIsCisgICAwLjAzMTA4MjE1MywgMC4wMzA1MTc1NzgsIDAuMDI5Nzg1MTU2LCAwLjAyODg4NDg4OCwKKyAgIDAuMDI3ODAxNTE0LCAwLjAyNjUzNTAzNCwgMC4wMjUwODU0NDksIDAuMDIzNDIyMjQxLAorICAgMC4wMjE1NzU5MjgsIDAuMDE5NTMxMjUwLCAwLjAxNzI1NzY5MCwgMC4wMTQ4MDEwMjUsCisgICAwLjAxMjExNTQ3OSwgMC4wMDkyMzE1NjcsIDAuMDA2MTM0MDMzLCAwLjAwMjgyMjg3NiwKKyAgLTAuMDAwNjg2NjQ2LC0wLjAwNDM5NDUzMSwtMC4wMDgzMTYwNDAsLTAuMDEyNDIwNjU0LAorICAtMC4wMTY3MDgzNzQsLTAuMDIxMTc5MTk5LC0wLjAyNTgxNzg3MSwtMC4wMzA2MDkxMzEsCisgIC0wLjAzNTU1Mjk3OSwtMC4wNDA2MzQxNTUsLTAuMDQ1ODM3NDAyLC0wLjA1MTEzMjIwMiwKKyAgLTAuMDU2NTMzODEzLC0wLjA2MTk5NjQ2MCwtMC4wNjc1MjAxNDIsLTAuMDczMDU5MDgyLAorICAtMC4wNzg2Mjg1NDAsLTAuMDg0MTgyNzM5LC0wLjA4OTcwNjQyMSwtMC4wOTUxNjkwNjcsCisgIC0wLjEwMDU0MDE2MSwtMC4xMDU4MTk3MDIsLTAuMTEwOTQ2NjU1LC0wLjExNTkyMTAyMSwKKyAgLTAuMTIwNjk3MDIxLC0wLjEyNTI1OTM5OSwtMC4xMjk1NjIzNzgsLTAuMTMzNTkwNjk4LAorICAtMC4xMzcyOTg1ODQsLTAuMTQwNjcwNzc2LC0wLjE0MzY3Njc1OCwtMC4xNDYyNTU0OTMsCisgIC0wLjE0ODQyMjI0MSwtMC4xNTAxMTU5NjcsLTAuMTUxMzA2MTUyLC0wLjE1MTk2MjI4MCwKKyAgLTAuMTUyMDY5MDkyLC0wLjE1MTU5NjA2OSwtMC4xNTA0OTc0MzcsLTAuMTQ4NzczMTkzLAorICAtMC4xNDYzNjIzMDUsLTAuMTQzMjY0NzcxLC0wLjEzOTQ1MDA3MywtMC4xMzQ4ODc2OTUsCisgIC0wLjEyOTU3NzYzNywtMC4xMjM0NzQxMjEsLTAuMTE2NTc3MTQ4LC0wLjEwODg1NjIwMSwKKyAgLTAuMTAwMzExMjc5LC0wLjA5MDkyNzEyNCwtMC4wODA2ODg0NzcsLTAuMDY5NTk1MzM3LAorICAtMC4wNTc2MTcxODcsLTAuMDQ0Nzg0NTQ2LC0wLjAzMTA4MjE1MywtMC4wMTY1MTAwMTAsCisgIC0wLjAwMTA2ODExNSwgMC4wMTUyMjgyNzEsIDAuMDMyMzc5MTUwLCAwLjA1MDM1NDAwNCwKKyAgIDAuMDY5MTY4MDkxLCAwLjA4ODc3NTYzNSwgMC4xMDkxNjEzNzcsIDAuMTMwMzEwMDU5LAorICAgMC4xNTIyMDY0MjEsIDAuMTc0Nzg5NDI5LCAwLjE5ODA1OTA4MiwgMC4yMjE5ODQ4NjMsCisgICAwLjI0NjUwNTczNywgMC4yNzE1OTExODcsIDAuMjk3MjEwNjkzLCAwLjMyMzMxODQ4MSwKKyAgIDAuMzQ5ODY4Nzc0LCAwLjM3NjgwMDUzNywgMC40MDQwODMyNTIsIDAuNDMxNjU1ODg0LAorICAgMC40NTk0NzI2NTYsIDAuNDg3NDcyNTM0LCAwLjUxNTYwOTc0MSwgMC41NDM4MjMyNDIsCisgICAwLjU3MjAzNjc0MywgMC42MDAyMTk3MjcsIDAuNjI4Mjk1ODk4LCAwLjY1NjIxOTQ4MiwKKyAgIDAuNjgzOTE0MTg1LCAwLjcxMTMxODk3MCwgMC43MzgzNzI4MDMsIDAuNzY1MDI5OTA3LAorICAgMC43OTEyMTM5ODksIDAuODE2ODY0MDE0LCAwLjg0MTk0OTQ2MywgMC44NjYzNjM1MjUsCisgICAwLjg5MDA5MDk0MiwgMC45MTMwNTU0MjAsIDAuOTM1MTk1OTIzLCAwLjk1NjQ4MTkzNCwKKyAgIDAuOTc2ODUyNDE3LCAwLjk5NjI0NjMzOCwgMS4wMTQ2MTc5MjAsIDEuMDMxOTM2NjQ2LAorICAgMS4wNDgxNTY3MzgsIDEuMDYzMjE3MTYzLCAxLjA3NzExNzkyMCwgMS4wODk3ODI3MTUsCisgICAxLjEwMTIxMTU0OCwgMS4xMTEzNzM5MDEsIDEuMTIwMjIzOTk5LCAxLjEyNzc0NjU4MiwKKyAgIDEuMTMzOTI2MzkyLCAxLjEzODc2MzQyOCwgMS4xNDIyMTE5MTQsIDEuMTQ0Mjg3MTA5LAorICAgMS4xNDQ5ODkwMTQKK307CisvKiAqSU5ERU5ULU9OKiAqLworCit2b2lkCittYWtlX2RlY29kZV90YWJsZXMobG9uZyBzY2FsZXZhbCkKK3sKKyAgICBpbnQgICAgIGksIGosIGssIGtyLCBkaXZ2OworICAgIHJlYWwgICAqdGFibGUsICpjb3N0YWI7CisKKworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAga3IgPSAweDEwID4+IGk7CisgICAgICAgIGRpdnYgPSAweDQwID4+IGk7CisgICAgICAgIGNvc3RhYiA9IHBudHNbaV07CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBrcjsgaysrKQorICAgICAgICAgICAgY29zdGFiW2tdID0gKHJlYWwpICgxLjAgLyAoMi4wICogY29zKE1fUEkgKiAoKGRvdWJsZSkgayAqIDIuMCArIDEuMCkgLyAoZG91YmxlKSBkaXZ2KSkpOworICAgIH0KKworICAgIHRhYmxlID0gZGVjd2luOworICAgIHNjYWxldmFsID0gLXNjYWxldmFsOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMjU2OyBpKyssIGorKywgdGFibGUgKz0gMzIpIHsKKyAgICAgICAgaWYgKHRhYmxlIDwgZGVjd2luICsgNTEyICsgMTYpCisgICAgICAgICAgICB0YWJsZVsxNl0gPSB0YWJsZVswXSA9IChyZWFsKSAoZGV3aW5bal0gKiBzY2FsZXZhbCk7CisgICAgICAgIGlmIChpICUgMzIgPT0gMzEpCisgICAgICAgICAgICB0YWJsZSAtPSAxMDIzOworICAgICAgICBpZiAoaSAlIDY0ID09IDYzKQorICAgICAgICAgICAgc2NhbGV2YWwgPSAtc2NhbGV2YWw7CisgICAgfQorCisgICAgZm9yICggLyogaT0yNTYgKi8gOyBpIDwgNTEyOyBpKyssIGotLSwgdGFibGUgKz0gMzIpIHsKKyAgICAgICAgaWYgKHRhYmxlIDwgZGVjd2luICsgNTEyICsgMTYpCisgICAgICAgICAgICB0YWJsZVsxNl0gPSB0YWJsZVswXSA9IChyZWFsKSAoZGV3aW5bal0gKiBzY2FsZXZhbCk7CisgICAgICAgIGlmIChpICUgMzIgPT0gMzEpCisgICAgICAgICAgICB0YWJsZSAtPSAxMDIzOworICAgICAgICBpZiAoaSAlIDY0ID09IDYzKQorICAgICAgICAgICAgc2NhbGV2YWwgPSAtc2NhbGV2YWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXBnbGliL3RhYmluaXQuaCBiL21wZ2xpYi90YWJpbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmNGM0MgotLS0gL2Rldi9udWxsCisrKyBiL21wZ2xpYi90YWJpbml0LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDEwIFRoZSBMLkEuTS5FLiBwcm9qZWN0CisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBIaXBwLCBzZWUgYWxzbyBBVVRIT1JTIGFuZCBSRUFETUUuCisgKiAgCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgTVBHTElCX1RBQklOSVRfSF9JTkNMVURFRAorI2RlZmluZSBNUEdMSUJfVEFCSU5JVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJtcGcxMjMuaCIKKworZXh0ZXJuIHJlYWwgZGVjd2luWzUxMiArIDMyXTsKK2V4dGVybiByZWFsICpwbnRzWzVdOworCit2b2lkICAgIG1ha2VfZGVjb2RlX3RhYmxlcyhsb25nIHNjYWxlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L0NCUkFCUi5vcCBiL3Rlc3QvQ0JSQUJSLm9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWM1MTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NCUkFCUi5vcApAQCAtMCwwICsxLDExOCBAQAorLWIgOCAtcSAwCistYiA4IC1xIDEKKy1iIDggLXEgMgorLWIgOCAtcSAzCistYiA4IC1xIDQKKy1iIDggLXEgNQorLWIgOCAtcSA2CistYiA4IC1xIDcKKy1iIDggLXEgOAorLWIgOCAtcSA5CistYiA4IC1tIG0gLXEgMAorLWIgOCAtbSBtIC1xIDEKKy1iIDggLW0gbSAtcSAyCistYiA4IC1tIG0gLXEgMworLWIgOCAtbSBtIC1xIDQKKy1iIDggLW0gbSAtcSA1CistYiA4IC1tIG0gLXEgNgorLWIgOCAtbSBtIC1xIDcKKy1iIDggLW0gbSAtcSA4CistYiA4IC1tIG0gLXEgOQorLWIgOCAtbSBzIC1xIDAKKy1iIDggLW0gcyAtcSAxCistYiA4IC1tIHMgLXEgMgorLWIgOCAtbSBzIC1xIDMKKy1iIDggLW0gcyAtcSA0CistYiA4IC1tIHMgLXEgNQorLWIgOCAtbSBzIC1xIDYKKy1iIDggLW0gcyAtcSA3CistYiA4IC1tIHMgLXEgOAorLWIgOCAtbSBzIC1xIDkKKy0tYWJyIDkKKy1iIDE2CistLWFiciAyMAorLWIgMjQKKy0tYWJyIDI4CistYiAzMgorLS1hYnIgMzYKKy1iIDQwCistLWFiciA0OAorLWIgNTYKKy0tYWJyIDYwCistYiA2NAorLS1hYnIgNzIKKy1iIDgwCistLWFiciA4OAorLWIgOTYKKy0tYWJyIDEwOCAtcSAwCistLWFiciAxMDggLXEgMQorLS1hYnIgMTA4IC1xIDIKKy0tYWJyIDEwOCAtcSAzCistLWFiciAxMDggLXEgNAorLS1hYnIgMTA4IC1xIDUKKy0tYWJyIDEwOCAtcSA2CistLWFiciAxMDggLXEgNworLS1hYnIgMTA4IC1xIDgKKy0tYWJyIDEwOCAtcSA5CistLWFiciAxMDggLW0gbSAtcSAwCistLWFiciAxMDggLW0gbSAtcSAxCistLWFiciAxMDggLW0gbSAtcSAyCistLWFiciAxMDggLW0gbSAtcSAzCistLWFiciAxMDggLW0gbSAtcSA0CistLWFiciAxMDggLW0gbSAtcSA1CistLWFiciAxMDggLW0gbSAtcSA2CistLWFiciAxMDggLW0gbSAtcSA3CistLWFiciAxMDggLW0gbSAtcSA4CistLWFiciAxMDggLW0gbSAtcSA5CistLWFiciAxMDggLW0gcyAtcSAwCistLWFiciAxMDggLW0gcyAtcSAxCistLWFiciAxMDggLW0gcyAtcSAyCistLWFiciAxMDggLW0gcyAtcSAzCistLWFiciAxMDggLW0gcyAtcSA0CistLWFiciAxMDggLW0gcyAtcSA1CistLWFiciAxMDggLW0gcyAtcSA2CistLWFiciAxMDggLW0gcyAtcSA3CistLWFiciAxMDggLW0gcyAtcSA4CistLWFiciAxMDggLW0gcyAtcSA5CistYiAxMTIKKy0tYWJyIDEyMAorLWIgMTI4CistLWFiciAxNDAKKy1iIDE2MAorLS1hYnIgMTgwCistYiAxOTIKKy0tYWJyIDIxMAorLWIgMjI0CistLWFiciAyMzUKKy1iIDI1NgorLS1hYnIgMzE5CistYiAzMjAgLXEgMAorLWIgMzIwIC1xIDEKKy1iIDMyMCAtcSAyCistYiAzMjAgLXEgMworLWIgMzIwIC1xIDQKKy1iIDMyMCAtcSA1CistYiAzMjAgLXEgNgorLWIgMzIwIC1xIDcKKy1iIDMyMCAtcSA4CistYiAzMjAgLXEgOQorLWIgMzIwIC1tIG0gLXEgMAorLWIgMzIwIC1tIG0gLXEgMQorLWIgMzIwIC1tIG0gLXEgMgorLWIgMzIwIC1tIG0gLXEgMworLWIgMzIwIC1tIG0gLXEgNAorLWIgMzIwIC1tIG0gLXEgNQorLWIgMzIwIC1tIG0gLXEgNgorLWIgMzIwIC1tIG0gLXEgNworLWIgMzIwIC1tIG0gLXEgOAorLWIgMzIwIC1tIG0gLXEgOQorLWIgMzIwIC1tIHMgLXEgMAorLWIgMzIwIC1tIHMgLXEgMQorLWIgMzIwIC1tIHMgLXEgMgorLWIgMzIwIC1tIHMgLXEgMworLWIgMzIwIC1tIHMgLXEgNAorLWIgMzIwIC1tIHMgLXEgNQorLWIgMzIwIC1tIHMgLXEgNgorLWIgMzIwIC1tIHMgLXEgNworLWIgMzIwIC1tIHMgLXEgOAorLWIgMzIwIC1tIHMgLXEgOQpkaWZmIC0tZ2l0IGEvdGVzdC9WQlIub3AgYi90ZXN0L1ZCUi5vcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZjOWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WQlIub3AKQEAgLTAsMCArMSwxOTYgQEAKKy1WOSAtcTAKKy1WOSAtcTEKKy1WOSAtcTIKKy1WOSAtcTMKKy1WOSAtcTQKKy1WOSAtcTUKKy1WOSAtcTYKKy1WOSAtcTcKKy1WOSAtcTgKKy1WOSAtcTkKKy1WOSAtbSBtIC1xMAorLVY5IC1tIG0gLXExCistVjkgLW0gbSAtcTIKKy1WOSAtbSBtIC1xMworLVY5IC1tIG0gLXE0CistVjkgLW0gbSAtcTUKKy1WOSAtbSBtIC1xNgorLVY5IC1tIG0gLXE3CistVjkgLW0gbSAtcTgKKy1WOSAtbSBtIC1xOQorLVY5IC1tIHMgLXEwCistVjkgLW0gcyAtcTEKKy1WOSAtbSBzIC1xMgorLVY5IC1tIHMgLXEzCistVjkgLW0gcyAtcTQKKy1WOSAtbSBzIC1xNQorLVY5IC1tIHMgLXE2CistVjkgLW0gcyAtcTcKKy1WOSAtbSBzIC1xOAorLVY5IC1tIHMgLXE5CistVjgKKy1WNworLVY2CistVjUKKy1WNCAtcTAKKy1WNCAtcTEKKy1WNCAtcTIKKy1WNCAtcTMKKy1WNCAtcTQKKy1WNCAtcTUKKy1WNCAtcTYKKy1WNCAtcTcKKy1WNCAtcTgKKy1WNCAtcTkKKy1WNCAtbSBtIC1xMAorLVY0IC1tIG0gLXExCistVjQgLW0gbSAtcTIKKy1WNCAtbSBtIC1xMworLVY0IC1tIG0gLXE0CistVjQgLW0gbSAtcTUKKy1WNCAtbSBtIC1xNgorLVY0IC1tIG0gLXE3CistVjQgLW0gbSAtcTgKKy1WNCAtbSBtIC1xOQorLVY0IC1tIHMgLXEwCistVjQgLW0gcyAtcTEKKy1WNCAtbSBzIC1xMgorLVY0IC1tIHMgLXEzCistVjQgLW0gcyAtcTQKKy1WNCAtbSBzIC1xNQorLVY0IC1tIHMgLXE2CistVjQgLW0gcyAtcTcKKy1WNCAtbSBzIC1xOAorLVY0IC1tIHMgLXE5CistVjMKKy1WMgorLVYxCistVjAgLXEwCistVjAgLXExCistVjAgLXEyCistVjAgLXEzCistVjAgLXE0CistVjAgLXE1CistVjAgLXE2CistVjAgLXE3CistVjAgLXE4CistVjAgLXE5CistVjAgLW0gbSAtcTAKKy1WMCAtbSBtIC1xMQorLVYwIC1tIG0gLXEyCistVjAgLW0gbSAtcTMKKy1WMCAtbSBtIC1xNAorLVYwIC1tIG0gLXE1CistVjAgLW0gbSAtcTYKKy1WMCAtbSBtIC1xNworLVYwIC1tIG0gLXE4CistVjAgLW0gbSAtcTkKKy1WMCAtbSBzIC1xMAorLVYwIC1tIHMgLXExCistVjAgLW0gcyAtcTIKKy1WMCAtbSBzIC1xMworLVYwIC1tIHMgLXE0CistVjAgLW0gcyAtcTUKKy1WMCAtbSBzIC1xNgorLVYwIC1tIHMgLXE3CistVjAgLW0gcyAtcTgKKy1WMCAtbSBzIC1xOQorLS12YnItbmV3IC1WOSAtcTAKKy0tdmJyLW5ldyAtVjkgLXExCistLXZici1uZXcgLVY5IC1xMgorLS12YnItbmV3IC1WOSAtcTMKKy0tdmJyLW5ldyAtVjkgLXE0CistLXZici1uZXcgLVY5IC1xNQorLS12YnItbmV3IC1WOSAtcTYKKy0tdmJyLW5ldyAtVjkgLXE3CistLXZici1uZXcgLVY5IC1xOAorLS12YnItbmV3IC1WOSAtcTkKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTAKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTEKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTIKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTMKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTQKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTUKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTYKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTcKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTgKKy0tdmJyLW5ldyAtVjkgLW0gbSAtcTkKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTAKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTEKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTIKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTMKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTQKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTUKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTYKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTcKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTgKKy0tdmJyLW5ldyAtVjkgLW0gcyAtcTkKKy0tdmJyLW5ldyAtVjgKKy0tdmJyLW5ldyAtVjcKKy0tdmJyLW5ldyAtVjYKKy0tdmJyLW5ldyAtVjUKKy0tdmJyLW5ldyAtVjQgLXEwCistLXZici1uZXcgLVY0IC1xMQorLS12YnItbmV3IC1WNCAtcTIKKy0tdmJyLW5ldyAtVjQgLXEzCistLXZici1uZXcgLVY0IC1xNAorLS12YnItbmV3IC1WNCAtcTUKKy0tdmJyLW5ldyAtVjQgLXE2CistLXZici1uZXcgLVY0IC1xNworLS12YnItbmV3IC1WNCAtcTgKKy0tdmJyLW5ldyAtVjQgLXE5CistLXZici1uZXcgLVY0IC1tIG0gLXEwCistLXZici1uZXcgLVY0IC1tIG0gLXExCistLXZici1uZXcgLVY0IC1tIG0gLXEyCistLXZici1uZXcgLVY0IC1tIG0gLXEzCistLXZici1uZXcgLVY0IC1tIG0gLXE0CistLXZici1uZXcgLVY0IC1tIG0gLXE1CistLXZici1uZXcgLVY0IC1tIG0gLXE2CistLXZici1uZXcgLVY0IC1tIG0gLXE3CistLXZici1uZXcgLVY0IC1tIG0gLXE4CistLXZici1uZXcgLVY0IC1tIG0gLXE5CistLXZici1uZXcgLVY0IC1tIHMgLXEwCistLXZici1uZXcgLVY0IC1tIHMgLXExCistLXZici1uZXcgLVY0IC1tIHMgLXEyCistLXZici1uZXcgLVY0IC1tIHMgLXEzCistLXZici1uZXcgLVY0IC1tIHMgLXE0CistLXZici1uZXcgLVY0IC1tIHMgLXE1CistLXZici1uZXcgLVY0IC1tIHMgLXE2CistLXZici1uZXcgLVY0IC1tIHMgLXE3CistLXZici1uZXcgLVY0IC1tIHMgLXE4CistLXZici1uZXcgLVY0IC1tIHMgLXE5CistLXZici1uZXcgLVYzCistLXZici1uZXcgLVYyCistLXZici1uZXcgLVYxCistLXZici1uZXcgLVYwIC1xMAorLS12YnItbmV3IC1WMCAtcTEKKy0tdmJyLW5ldyAtVjAgLXEyCistLXZici1uZXcgLVYwIC1xMworLS12YnItbmV3IC1WMCAtcTQKKy0tdmJyLW5ldyAtVjAgLXE1CistLXZici1uZXcgLVYwIC1xNgorLS12YnItbmV3IC1WMCAtcTcKKy0tdmJyLW5ldyAtVjAgLXE4CistLXZici1uZXcgLVYwIC1xOQorLS12YnItbmV3IC1WMCAtbSBtIC1xMAorLS12YnItbmV3IC1WMCAtbSBtIC1xMQorLS12YnItbmV3IC1WMCAtbSBtIC1xMgorLS12YnItbmV3IC1WMCAtbSBtIC1xMworLS12YnItbmV3IC1WMCAtbSBtIC1xNAorLS12YnItbmV3IC1WMCAtbSBtIC1xNQorLS12YnItbmV3IC1WMCAtbSBtIC1xNgorLS12YnItbmV3IC1WMCAtbSBtIC1xNworLS12YnItbmV3IC1WMCAtbSBtIC1xOAorLS12YnItbmV3IC1WMCAtbSBtIC1xOQorLS12YnItbmV3IC1WMCAtbSBzIC1xMAorLS12YnItbmV3IC1WMCAtbSBzIC1xMQorLS12YnItbmV3IC1WMCAtbSBzIC1xMgorLS12YnItbmV3IC1WMCAtbSBzIC1xMworLS12YnItbmV3IC1WMCAtbSBzIC1xNAorLS12YnItbmV3IC1WMCAtbSBzIC1xNQorLS12YnItbmV3IC1WMCAtbSBzIC1xNgorLS12YnItbmV3IC1WMCAtbSBzIC1xNworLS12YnItbmV3IC1WMCAtbSBzIC1xOAorLS12YnItbmV3IC1WMCAtbSBzIC1xOQorCisKZGlmZiAtLWdpdCBhL3Rlc3QvY3ZzY2hlY2suc2ggYi90ZXN0L2N2c2NoZWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzIwM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2N2c2NoZWNrLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9zaAorCisjCisjIGNoZWNrb3V0IGxhbWUKKyMgcnVuIHB5dGhvbiBzY3JpcHRzCisjIG1haWwgb3V0cHV0CisjCisKK0NWU19SU0g9L2hvbWUvbXQvYmluL3NzaGN2cworTEFNRV9ESVI9L2hvbWUvbXQvbXAzL2xhbWVfY3ZzY2hlY2sKK1RFU1RDQVNFPS9ob21lL210L21wMy90ZXN0L2Nhc3RhbmV0cy53YXYKK2V4cG9ydCBPVVRQVVQ9L3RtcC9jdnNjaGVjay5vdXQKK2V4cG9ydCBUTz0ibGFtZS1jdnNAbGlzdHMuc291cmNlZm9yZ2UubmV0IgorCitjZCAke0xBTUVfRElSfQorI2N2cyAtejMgLWRtYXJrdEBjdnMubGFtZS5zb3VyY2Vmb3JnZS5uZXQ6L2N2c3Jvb3QvbGFtZSBjbyAtZCBsYW1lX2N2c2NoZWNrIGxhbWUKK2N2cyB1cGRhdGUgLVAgLWQKK2lmIFsgJD8gIT0gMCBdOyB0aGVuCisgICAgZWNobyAiRXJyb3IgcnVubmluZyBDVlMgdXBkYXRlLiBjdnNjaGVjayBzY3JpcHQgZXhpdGluZy4iCisgICAgZXhpdCAxCitmaQorCitpZiBbIC1mICR7T1VUUFVUfSBdOyB0aGVuCisgICAgbXYgLWYgJHtPVVRQVVR9ICR7T1VUUFVUfS5vbGQKK2ZpCitybSAtZiBmcm9udGVuZC9sYW1lCitybSAtZiBjb25maWcuY2FjaGUKKy4vY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnCittYWtlIGNsZWFuCittYWtlCisKK2lmIFsgJD8gIT0gMCBdOyB0aGVuCisgICAgZWNobyAiRXJyb3IgY29tcGlsaW5nIGNvZGUuLi4iID4gJHtPVVRQVVR9CitlbHNlCisgICAgdGVzdC9sYW1ldGVzdC5weSB0ZXN0L0NCUkFCUi5vcCAke1RFU1RDQVNFfSBmcm9udGVuZC9sYW1lID4gJHtPVVRQVVR9CitmaQorCisjIGNoZWNrIGlmIHRoZXJlIGFyZSBmYWlsZWQgdGVzdHMKK2lmIGdyZXAgPi9kZXYvbnVsbCAyPiYxICJOdW1iZXIgb2YgdGVzdHMgd2hpY2ggZmFpbGVkOiAgMCIgJHtPVVRQVVR9IDsgdGhlbgorICAgIGVjaG8gIk5vIGZhaWxlZCB0ZXN0cy4iCitlbHNlCisgICAgIyB5ZXMsIGZhaWxlZCB0ZXN0cywgc2VuZCBvdXRwdXQKKworICAgIGlmIGRpZmYgPi9kZXYvbnVsbCAyPiYxIC1iQmlxICR7T1VUUFVUfS5vbGQgJHtPVVRQVVR9IDsgdGhlbgorICAgICAgICBleHBvcnQgTVNHPSdObyBjaGFuZ2Ugc2luY2UgbGFzdCBmYWlsZWQgdGVzdChzKS4nCisgICAgZWxzZQorICAgICAgICBleHBvcnQgTVNHPSdBbm90aGVyIGNoYW5nZSBzaW5jZSBsYXN0IGZhaWxlZCB0ZXN0KHMpIScKKyAgICAgICAgY2F0ICR7T1VUUFVUfTsgZWNobyAiJHtNU0d9IgorICAgIGZpCisKKyAgICAoIGNhdCAke09VVFBVVH07IGVjaG8gIiR7TVNHfSIgKSB8IG1haWwgLXMgIkF1dG9tYXRlZCBsYW1lIHRlc3QiICR7VE99CitmaQorCmRpZmYgLS1naXQgYS90ZXN0L2xhbWV0ZXN0LnB5IGIvdGVzdC9sYW1ldGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMTE1MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9sYW1ldGVzdC5weQpAQCAtMCwwICsxLDIyNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCitmcm9tIHN0cmluZyBpbXBvcnQgKgoraW1wb3J0IG9zLCBjb21tYW5kcywgZ2V0b3B0LCBzeXMKKworCitkZWYgVXNhZ2UobWVzZyk6CisgICAgcHJpbnQgbWVzZyArIG9zLmxpbmVzZXAKKworICAgIHByaW50ICJVc2FnZTogIiArIG9zLmxpbmVzZXAKKworICAgIHByaW50ICJNb2RlIDEuIENvbXBhcmUgb3V0cHV0IG9mICdsYW1lMScgYW5kICdsYW1lMic6IgorICAgIHByaW50ICIuL2xhbWV0ZXN0LnB5ICBbb3B0aW9uc10gb3B0aW9uc19maWxlICBpbnB1dC53YXYgbGFtZTEgbGFtZTIiICsgb3MubGluZXNlcAorCisgICAgcHJpbnQgIk1vZGUgMi4gQ29tcGFyZSBvdXRwdXQgb2YgbGFtZTEgd2l0aCByZWZlcmVuY2Ugc29sdXRpb25zOiIKKyAgICBwcmludCAiLi9sYW1ldGVzdC5weSBbb3B0aW9uc10gb3B0aW9uc19maWxlIGlucHV0LndhdiBsYW1lMSIgKyBvcy5saW5lc2VwCisKKyAgICBwcmludCAiTW9kZSAzLiBHZW5lcmF0ZSByZWZlcmVuY2Ugc29sdXRpb25zIHVzaW5nIGxhbWUxOiIKKyAgICBwcmludCAiLi9sYW1ldGVzdC5weSAtbSBvcHRpb25zX2ZpbGUgaW5wdXQud2F2IGxhbWUxIiArIG9zLmxpbmVzZXAKKworICAgIHByaW50ICJvcHRpb25zOiAiCQorICAgIHByaW50ICIgICAtdyAgIGNvbnZlcnQgbXAzJ3MgdG8gd2F2J3MgYmVmb3JlIGNvbXBhcmlzb24iCisKKyAgICBzeXMuZXhpdCgwKQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNvbXBhcmUgdHdvIGZpbGVzLCByZXR1cm4gIyBieXRlcyB3aGljaCBkaWZmZXIgYW5kIHRoZQorIyBudW1iZXIgb2YgYnl0ZXMgaW4gbGFyZ2VyIGZpbGUgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RlZiBmZGlmZihuYW1lMSxuYW1lMik6CisgICAgY21kID0gImNtcCAtbCAiK25hbWUxICsgIiAiICsgbmFtZTIgKyAiIHwgd2MgLWwiCisgICAgIyBYWFggZWl0aGVyCisgICAgIyAgICB1c2UgYSBjb21iaW5hdGlvbiBvZiBvcy5wb3BlbiArIHJlYWQKKyAgICAjIG9yCisgICAgIyAgICB3cml0ZSBvd2VuIGNtcCt3YyBmdW5jdGlvbgorICAgICMgdG8gcmVwbGFjZSBjb21tYW5kcy5nZXRvdXRwdXQKKyAgICBvdXQgPSBjb21tYW5kcy5nZXRvdXRwdXQoY21kKQorICAgIG91dCA9IHNwbGl0KG91dCwiXG4iKQorICAgIG91dD1vdXRbLTFdCisgICAgaWYgKC0xPT1maW5kKG91dCwiTm8iKSk6CisgICAgICAgIGRpZmYgPSBhdG9mKG91dCkKKworCXN0YXR1cyA9IG9zLmFjY2VzcyhuYW1lMSwgb3MuUl9PSykKKwlpZiAxICE9IHN0YXR1czoKKwkgICAgc2l6ZTE9MAorCWVsc2U6CisgICAgICAgICAgICBzaXplMSA9IG9zLnBhdGguZ2V0c2l6ZShuYW1lMSkKKyAgICAgICAgc2l6ZTIgPSBvcy5wYXRoLmdldHNpemUobmFtZTIpCisgICAgICAgIGRpZmYgPSBkaWZmICsgYWJzKHNpemUxLXNpemUyKQorICAgICAgICBzaXplID0gbWF4KHNpemUxLHNpemUyKSAKKyAgICBlbHNlOgorICAgICAgICBkaWZmID0gLTEKKyAgICAgICAgc2l6ZSA9IDAKKyAgICByZXR1cm4gKGRpZmYsc2l6ZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorIyBjb21wYXJlIHR3byBmaWxlcywgcmV0dXJuICMgYnl0ZXMgd2hpY2ggZGlmZmVyIGFuZCB0aGUKKyMgbnVtYmVyIG9mIGJ5dGVzIGluIGxhcmdlciBmaWxlIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkZWYgY29tcGFyZShuYW1lMSxuYW1lMixkZWNvZGUpOgorICAgIGlmIChkZWNvZGUpOgorICAgICAgICBwcmludCAiY29udmVydGluZyBtcDMgdG8gd2F2IGZvciBjb21wYXJpc29uLi4uIgorICAgICAgICAjIFhYWCBzaG91bGRuJ3Qgd2UgdXNlIGxhbWUxIGluc3RlYWQgb2YgYSBoYXJkY29kZWQgbGFtZT8KKyAgICAgICAgb3Muc3lzdGVtKCJsYW1lIC0tcXVpZXQgLS1tcDNpbnB1dCAtLWRlY29kZSAiICsgbmFtZTEpCisgICAgICAgIG9zLnN5c3RlbSgibGFtZSAtLXF1aWV0IC0tbXAzaW5wdXQgLS1kZWNvZGUgIiArIG5hbWUyKQorICAgICAgICBuYW1lMSA9IG5hbWUxICsgIi53YXYiCisgICAgICAgIG5hbWUyID0gbmFtZTIgKyAiLndhdiIKKworICAgIHJjb2RlID0gMAorICAgIGRpZmYsc2l6ZT1mZGlmZihuYW1lMSxuYW1lMikKKyAgICBpZiAoZGlmZj09MCk6CisgICAgICAgIHByaW50ICJvdXRwdXQgaWRlbnRpY2FsOiAgZGlmZj0laSAgdG90YWw9JWkiICUgKGRpZmYsc2l6ZSkKKyAgICAgICAgcmNvZGUgPSAxCisgICAgZWxpZiAoZGlmZj4wKToKKwlwcmludCAib3V0cHV0IGRpZmZlcmVudDogZGlmZj0laSAgdG90YWw9JWkgICUyLjBmJSUiICUgXAorICAgICAgICAoZGlmZixzaXplLDEwMCpmbG9hdChkaWZmKS9zaXplKQorICAgIGVsc2U6CisJcHJpbnQgIkVycm9yIGNvbXBhcmluZyBmaWxlczoiCisgICAgICAgIHByaW50ICJGaWxlIDE6ICIgKyBuYW1lMQorICAgICAgICBwcmludCAiRmlsZSAyOiAiICsgbmFtZTIKKworICAgIHJldHVybiByY29kZQorCisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorIyBtYWluIHByb2dyYW0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordHJ5OgorICAgIG9wdGxpc3QsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ3dtJykKK2V4Y2VwdCBnZXRvcHQuZXJyb3IsIHZhbDoKKyAgICBVc2FnZSgnRVJST1I6ICcgKyB2YWwpCisKK2RlY29kZT0wCitsYW1lMj0ibm9uZSIKK2ZvciBvcHQgaW4gb3B0bGlzdDoKKyAgICBpZiBvcHRbMF0gPT0gJy13JzoKKyAgICAgICAgZGVjb2RlPTEKKyAgICBlbGlmIG9wdFswXSA9PSAnLW0nOgorICAgICAgICBsYW1lMj0ibWFrZXJlZiIKKyAgICAgICAgcHJpbnQgb3MubGluZXNlcCArICJHZW5lcmF0aW5nIHJlZmVyZW5jZSBvdXRwdXQiCisKKworaWYgbGVuKGFyZ3MpIDwgMzoKKyAgICBVc2FnZSgiTm90IGVub3VnaCBhcmd1bWVudHMuIikKK2lmIGxlbihhcmdzKSA+IDQ6CisgICAgVXNhZ2UoIlRvbyBtYW55IGFyZ3VtZW50cy4iKQorCitpZiAobGFtZTI9PSJtYWtlcmVmIik6CisgICAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgCVVzYWdlKCJUb28gbWFueSBhcmd1bWVudHMgZm9yIC1yLy1tIG1vZGUuIikKK2Vsc2U6CisgICAgaWYgbGVuKGFyZ3MpID09MzoJCisgICAgICAgIGxhbWUyPSJyZWYiCisKKyMgcG9wdWxhdGUgdmFyaWFibGVzIGZyb20gYXJncyBhbmQgbm9ybWFsaXplICYgZXhwYW5kIHBhdGgKK2lmIGxlbihhcmdzKSA+PTM6CisgICAgb3B0aW9uc19maWxlID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIoYXJnc1swXSkpCisgICAgaW5wdXRfZmlsZSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5leHBhbmR1c2VyKGFyZ3NbMV0pKQorICAgIGxhbWUxID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIoYXJnc1syXSkpCitpZiBsZW4oYXJncykgPj00OgorICAgIGxhbWUyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIoYXJnc1szXSkpCisKKyMgY2hlY2sgcmVhZGFiaWxpdHkgb2Ygb3B0aW9uc19maWxlCitzdGF0dXMgPSBvcy5hY2Nlc3Mob3B0aW9uc19maWxlLCBvcy5SX09LKQoraWYgMSAhPSBzdGF0dXM6CisgICAgVXNhZ2Uob3B0aW9uc19maWxlICsgIiBub3QgcmVhZGFibGUiKQorCisjIGNoZWNrIHJlYWRhYmlsaXR5IG9mIGlucHV0X2ZpbGUKK3N0YXR1cyA9IG9zLmFjY2VzcyhpbnB1dF9maWxlLCBvcy5SX09LKQoraWYgMSAhPSBzdGF0dXM6CisgICAgVXNhZ2UoaW5wdXRfZmlsZSArICIgbm90IHJlYWRhYmxlIikKKworCisjIGdlbmVyYXRlIHNlYXJjaGxpc3Qgb2YgZGlyZWN0b3JpZXMKK3BhdGggPSBzcGxpdChvcy5lbnZpcm9uWydQQVRIJ10sIG9zLnBhdGhzZXApCitwYXRoLmFwcGVuZChvcy5jdXJkaXIpCisKKyMgaW5pdCBpbmRpY2F0b3IgdmFycworbGFtZTFfb2sgPSAwCitsYW1lMl9vayA9IDAKKworIyBjaGVjayBmb3IgZXhlY3V0YWJsZSBsYW1lMQorZm9yIHggaW4gcGF0aDoKKyAgICBzdGF0dXMgPSBvcy5hY2Nlc3Mob3MucGF0aC5qb2luKHgsIGxhbWUxKSwgb3MuWF9PSykKKyAgICBpZiAxID09IHN0YXR1czoKKyAgICAgICAgbGFtZTFfb2sgPSAxCisgICAgICAgIGJyZWFrCitpZiAxICE9IGxhbWUxX29rOgorICAgIFVzYWdlKGxhbWUxICsgIiBpcyBub3QgZXhlY3V0YWJsZSIpCisKK2lmIG5vdCAobGFtZTI9PSJyZWYiIG9yIGxhbWUyPT0ibWFrZXJlZiIpOgorICAgICMgY2hlY2sgZm9yIGV4ZWN1dGFibGUgbGFtZTIKKyAgICBmb3IgeCBpbiBwYXRoOgorICAgICAgICBzdGF0dXMgPSBvcy5hY2Nlc3Mob3MucGF0aC5qb2luKHgsIGxhbWUyKSwgb3MuWF9PSykKKyAgICAgICAgaWYgMSA9PSBzdGF0dXM6CisgICAgICAgICAgICBsYW1lMl9vayA9IDEgCisgICAgICAgICAgICBicmVhaworICAgIGlmIDEgIT0gbGFtZTJfb2s6CisgICAgICAgIFVzYWdlKGxhbWUyICsgIiBpcyBub3QgZXhlY3V0YWJsZSIpCisKKwordG1wID0gc3BsaXQob3B0aW9uc19maWxlLCBvcy5zZXApCit0bXAgPSB0bXBbLTFdCitiYXNlbmFtZSA9IHJlcGxhY2UoaW5wdXRfZmlsZSwiLndhdiIsIiIpCitiYXNlbmFtZSA9IGJhc2VuYW1lICsgIi4iICsgdG1wCisKKworbnVtX29rPTAKK249MAorZm9wdGlvbnM9b3BlbihvcHRpb25zX2ZpbGUpCitsaW5lID0gcnN0cmlwKGZvcHRpb25zLnJlYWRsaW5lKCkpCit3aGlsZSBsaW5lOgorICAgIG4gPSBuKzEKKyAgICBuYW1lMSA9IGJhc2VuYW1lICsgIi4iICsgc3RyKG4pICsgIi5tcDMiCisgICAgbmFtZTIgPSBiYXNlbmFtZSArICIuIiArIHN0cihuKSArICJyZWYubXAzIgorCisgICAgcHJpbnQgICAgICAjIGVtcHR5IGxpbmUKKworICAgIGlmIChsYW1lMj09J3JlZicpOgorICAgICAgICBjbWQgPSAicm0gLWYgIituYW1lMQorICAgICAgICBvcy5zeXN0ZW0oY21kKQorICAgICAgICBjbWQgPSBsYW1lMSArICIgLS1xdWlldCAiICsgbGluZSArICIgIiArIGlucHV0X2ZpbGUgKyAiICIgKyBuYW1lMQorICAgICAgICBwcmludCAiZXhlY3V0YWJsZTogICAgICAiLGxhbWUxCisgICAgICAgIHByaW50ICJvcHRpb25zOiAgICAgICAgICIsbGluZQorICAgICAgICBwcmludCAiaW5wdXQ6ICAgICAgICAgICAiLGlucHV0X2ZpbGUgCisgICAgICAgIHByaW50ICJyZWZlcmVuY2Ugb3V0cHV0OiIsbmFtZTIKKyAgICAgICAgcHJpbnQgY21kCisgICAgICAgIG9zLnN5c3RlbShjbWQpCisgICAgICAgIG51bV9vayA9IG51bV9vaytjb21wYXJlKG5hbWUxLG5hbWUyLGRlY29kZSkKKyAgICBlbGlmIChsYW1lMj09J21ha2VyZWYnKToKKyAgICAgICAgY21kID0gInJtIC1mICIrbmFtZTIKKyAgICAgICAgb3Muc3lzdGVtKGNtZCkKKyAgICAgICAgcHJpbnQgImV4ZWN1dGFibGU6ICIsbGFtZTEKKyAgICAgICAgcHJpbnQgIm9wdGlvbnM6ICAgICIsbGluZQorICAgICAgICBwcmludCAiaW5wdXQ6ICAgICAgIixpbnB1dF9maWxlIAorICAgICAgICBwcmludCAib3V0cHV0OiAgICAgIixuYW1lMgorICAgICAgICBjbWQgPSBsYW1lMSArICIgLS1xdWlldCAiICsgbGluZSArICIgIiArIGlucHV0X2ZpbGUgKyAiICIgKyBuYW1lMgorICAgICAgICBvcy5zeXN0ZW0oY21kKQorICAgIGVsc2U6CisgICAgICAgIGNtZCA9ICJybSAtZiAiK25hbWUxCisgICAgICAgIG9zLnN5c3RlbShjbWQpCisgICAgICAgIGNtZCA9ICJybSAtZiAiK25hbWUyCisgICAgICAgIG9zLnN5c3RlbShjbWQpCisgICAgICAgIHByaW50ICJleGVjdXRhYmxlOiAgIixsYW1lMQorICAgICAgICBwcmludCAiZXhlY3V0YWJsZTI6ICIsbGFtZTIKKyAgICAgICAgcHJpbnQgIm9wdGlvbnM6ICAgICAiLGxpbmUKKyAgICAgICAgcHJpbnQgImlucHV0OiAgICAgICAiLGlucHV0X2ZpbGUKKyAgICAgICAgY21kMSA9IGxhbWUxICsgIiAtLXF1aWV0ICIgKyBsaW5lICsgIiAiICsgaW5wdXRfZmlsZSArICIgIiArIG5hbWUxCisgICAgICAgIGNtZDIgPSBsYW1lMiArICIgLS1xdWlldCAiICsgbGluZSArICIgIiArIGlucHV0X2ZpbGUgKyAiICIgKyBuYW1lMgorICAgICAgICBvcy5zeXN0ZW0oY21kMSkKKyAgICAgICAgb3Muc3lzdGVtKGNtZDIpCisJbnVtX29rID0gbnVtX29rICsgY29tcGFyZShuYW1lMSxuYW1lMixkZWNvZGUpCisKKyAgICBsaW5lID0gcnN0cmlwKGZvcHRpb25zLnJlYWRsaW5lKCkpCisKK2ZvcHRpb25zLmNsb3NlKCkKKworaWYgbGFtZTIgIT0gJ21ha2VyZWYnOgorICAgIHByaW50IG9zLmxpbmVzZXAgKyAiTnVtYmVyIG9mIHRlc3RzIHdoaWNoIHBhc3NlZDogIixudW1fb2sKKyAgICBwcmludCAiTnVtYmVyIG9mIHRlc3RzIHdoaWNoIGZhaWxlZDogIixuLW51bV9vawpkaWZmIC0tZ2l0IGEvdGVzdC9taXNjLm9wIGIvdGVzdC9taXNjLm9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDhhYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21pc2Mub3AKQEAgLTAsMCArMSwxNiBAQAorLS1hdGhsb3dlciAxMAorLS1hYnIgMTYwIC1iIDEyOCAtQiAxOTIgLUYKKy1WMyAtYiAxMjggLUIgMTkyIC1GCistLWZyZWVmb3JtYXQgLWIgMzMKKy0tZnJlZWZvcm1hdCAtYiAzMzAKKy1rCistLWxvd3Bhc3MgMTIKKy0tbm9hdGgKKy0tbm9hc20gbW14IC0tbm9hc20gM2Rub3cgLS1ub2FzbSBzc2UKKy0tbm9zaG9ydAorLS1ub3RlbXAKKy0tbm9yZXMKKy1wCistLXJlc2FtcGxlIDQ4MDAwCistLXNjYWxlIDAuOAorLXQKZGlmZiAtLWdpdCBhL3Rlc3Qvbm9yZXMub3AgYi90ZXN0L25vcmVzLm9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDQxOGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25vcmVzLm9wCkBAIC0wLDAgKzEsNCBAQAorLWggLS1ub3JlcworLS1ub3JlcworCisKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hvcnRDQlJBQlIub3AgYi90ZXN0L3Nob3J0Q0JSQUJSLm9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzU3N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Nob3J0Q0JSQUJSLm9wCkBAIC0wLDAgKzEsMTggQEAKKy1iIDgKKy1iIDggLWYKKy1iIDggLWgKKy1iIDggLWggLW0gbQorLS1hYnIgOQorLWIgNTYKKy0tYWJyIDYwCistLWFiciAxMjggCistLWFiciAxMjggLWYKKy0tYWJyIDEyOCAtaAorLS1hYnIgMTI4IC1oIC1tIG0KKy1iIDEyOAorLS1hYnIgMzE5CistYiAzMjAgCistYiAzMjAgLWYKKy1iIDMyMCAtaAorLWIgMzIwIC1oIC1tIG0gCistYiAzMjAgLWggLW0gcwpkaWZmIC0tZ2l0IGEvdGVzdC9zaG9ydFZCUi5vcCBiL3Rlc3Qvc2hvcnRWQlIub3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjZWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hvcnRWQlIub3AKQEAgLTAsMCArMSwyNiBAQAorLVY5CistVjkgLWYKKy1WOSAtaAorLVY5IC1oIC1tIG0KKy1WNAorLVY0IC1mCistVjQgLWgKKy1WNCAtaCAtbSBtCistVjAKKy1WMCAtZgorLVYwIC1oCistVjAgLWggLW0gbQorLVYwIC1oIC1tIHMKKy0tdmJyLW5ldyAtVjkKKy0tdmJyLW5ldyAtVjkgLWYKKy0tdmJyLW5ldyAtVjkgLWgKKy0tdmJyLW5ldyAtVjkgLWggLW0gbQorLS12YnItbmV3IC1WNAorLS12YnItbmV3IC1WNCAtZgorLS12YnItbmV3IC1WNCAtaAorLS12YnItbmV3IC1WNCAtaCAtbSBtCistLXZici1uZXcgLVYwCistLXZici1uZXcgLVYwIC1mCistLXZici1uZXcgLVYwIC1oCistLXZici1uZXcgLVYwIC1oIC1tIG0KKy0tdmJyLW5ldyAtVjAgLWggLW0gcwpkaWZmIC0tZ2l0IGEvdGVzdGNhc2UubXAzIGIvdGVzdGNhc2UubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODIxMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0Y2FzZS5tcDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGNhc2Uud2F2IGIvdGVzdGNhc2Uud2F2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODM1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0Y2FzZS53YXYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmNfc29sdXRpb24vTWFrZWZpbGUuYW0gYi92Y19zb2x1dGlvbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzYzZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdmNfc29sdXRpb24vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACisjIyAkSWQ6IE1ha2VmaWxlLmFtLHYgMS4xLjIuMiAyMDEwLzAyLzI2IDAxOjU2OjUyIHJvYmVydCBFeHAgJAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUuYW0uZ2xvYmFsCisKK0VYVFJBX0RJU1QgPSAqLnNsbiBcCisJKi52Y3Byb2ogXAorCSoudnNwcm9wcyBcCisJKi5ydWxlcwpkaWZmIC0tZ2l0IGEvdmNfc29sdXRpb24vTWFrZWZpbGUuaW4gYi92Y19zb2x1dGlvbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjY5ZDcwCi0tLSAvZGV2L251bGwKKysrIGIvdmNfc29sdXRpb24vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNjYgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuOS42IGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyBnbG9iYWwgc2VjdGlvbiBmb3IgZXZlcnkgTWFrZWZpbGUuYW0KK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAordG9wX2J1aWxkZGlyID0gLi4KK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK0lOU1RBTEwgPSBASU5TVEFMTEAKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5hbS5nbG9iYWwKK3N1YmRpciA9IHZjX3NvbHV0aW9uCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmluCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTURFUF9GQUxTRSA9IEBBTURFUF9GQUxTRUAKK0FNREVQX1RSVUUgPSBAQU1ERVBfVFJVRUAKK0FNVEFSID0gQEFNVEFSQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDT05GSUdfREVGUyA9IEBDT05GSUdfREVGU0AKK0NPTkZJR19NQVRIX0xJQiA9IEBDT05GSUdfTUFUSF9MSUJACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFVDQ09ERSA9IEBDUFVDQ09ERUAKK0NQVVRZUEUgPSBAQ1BVVFlQRUAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE8gPSBARUNIT0AKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0Y3NyA9IEBGNzdACitGRkxBR1MgPSBARkZMQUdTQAorRlJPTlRFTkRfQ0ZMQUdTID0gQEZST05URU5EX0NGTEFHU0AKK0ZST05URU5EX0xEQUREID0gQEZST05URU5EX0xEQUREQAorRlJPTlRFTkRfTERGTEFHUyA9IEBGUk9OVEVORF9MREZMQUdTQAorR1JFUCA9IEBHUkVQQAorR1RLX0NGTEFHUyA9IEBHVEtfQ0ZMQUdTQAorR1RLX0NPTkZJRyA9IEBHVEtfQ09ORklHQAorR1RLX0xJQlMgPSBAR1RLX0xJQlNACitIQVZFX05BU01fRkFMU0UgPSBASEFWRV9OQVNNX0ZBTFNFQAorSEFWRV9OQVNNX1RSVUUgPSBASEFWRV9OQVNNX1RSVUVACitJTkNMVURFUyA9IEBJTkNMVURFU0AKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERBREQgPSBATERBRERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTElCX01BSk9SX1ZFUlNJT04gPSBATElCX01BSk9SX1ZFUlNJT05ACitMSUJfTUlOT1JfVkVSU0lPTiA9IEBMSUJfTUlOT1JfVkVSU0lPTkAKK0xJQl9XSVRIX0RFQ09ERVJfRkFMU0UgPSBATElCX1dJVEhfREVDT0RFUl9GQUxTRUAKK0xJQl9XSVRIX0RFQ09ERVJfVFJVRSA9IEBMSUJfV0lUSF9ERUNPREVSX1RSVUVACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUlOVEFJTkVSX01PREVfRkFMU0UgPSBATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQAorTUFJTlRBSU5FUl9NT0RFX1RSVUUgPSBATUFJTlRBSU5FUl9NT0RFX1RSVUVACitNQUtFREVQID0gQE1BS0VERVBACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK05BU00gPSBATkFTTUAKK05BU01fRk9STUFUID0gQE5BU01fRk9STUFUQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSTV9GID0gQFJNX0ZACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU05ERklMRV9DRkxBR1MgPSBAU05ERklMRV9DRkxBR1NACitTTkRGSUxFX0xJQlMgPSBAU05ERklMRV9MSUJTQAorU1RSSVAgPSBAU1RSSVBACitVID0gQFVACitWRVJTSU9OID0gQFZFUlNJT05ACitXSVRIX0JSSElTVF9GQUxTRSA9IEBXSVRIX0JSSElTVF9GQUxTRUAKK1dJVEhfQlJISVNUX1RSVUUgPSBAV0lUSF9CUkhJU1RfVFJVRUAKK1dJVEhfRlJPTlRFTkQgPSBAV0lUSF9GUk9OVEVOREAKK1dJVEhfTVAzUlRQID0gQFdJVEhfTVAzUlRQQAorV0lUSF9NUDNYID0gQFdJVEhfTVAzWEAKK1dJVEhfVkVDVE9SX0ZBTFNFID0gQFdJVEhfVkVDVE9SX0ZBTFNFQAorV0lUSF9WRUNUT1JfVFJVRSA9IEBXSVRIX1ZFQ1RPUl9UUlVFQAorV0lUSF9YTU1fRkFMU0UgPSBAV0lUSF9YTU1fRkFMU0VACitXSVRIX1hNTV9UUlVFID0gQFdJVEhfWE1NX1RSVUVACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9GNzcgPSBAYWNfY3RfRjc3QAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAorYW1fX2Zhc3RkZXBDWFhfVFJVRSA9IEBhbV9fZmFzdGRlcENYWF9UUlVFQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK0FVVE9NQUtFX09QVElPTlMgPSAxLjkgZm9yZWlnbiAkKHRvcF9zcmNkaXIpL2Fuc2kya25yCitFWFRSQV9ESVNUID0gKi5zbG4gXAorCSoudmNwcm9qIFwKKwkqLnZzcHJvcHMgXAorCSoucnVsZXMKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmFtLmdsb2JhbCAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgdmNfc29sdXRpb24vTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIHZjX3NvbHV0aW9uL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sCit1bmluc3RhbGwtaW5mby1hbToKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJJChta2Rpcl9wKSAkKGRpc3RkaXIpLy4uCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgIGRpcj0iLyQkZGlyIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCisJICBlbHNlIFwKKwkgICAgZGlyPScnOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbAorCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAorCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCisJaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIFwKKwlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtc3RyaXAgXAorCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIFwKKwl1bmluc3RhbGwtaW5mby1hbQorCisKKyMgZW5kIGdsb2JhbCBzZWN0aW9uCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS92Y19zb2x1dGlvbi92YzlfbGFtZS5zbG4gYi92Y19zb2x1dGlvbi92YzlfbGFtZS5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2ZGU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lLnNsbgpAQCAtMCwwICsxLDY3IEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwCisjIFZpc3VhbCBDKysgRXhwcmVzcyAyMDA4CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIk1QM3giLCAidmM5X2xhbWVfbXAzeC52Y3Byb2oiLCAie0U3NDVFQjFBLTA3MEEtNDVFRC1COEJELUQ5Rjc5NEUyM0NGQX0iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7MjA1MzYxMDEtM0IwRS00M0VGLTk0RjktMDgwRDU5NURBQzU3fSA9IHsyMDUzNjEwMS0zQjBFLTQzRUYtOTRGOS0wODBENTk1REFDNTd9CisJCXtFMkRBQjkxQS04MjQ4LTQ2MjUtOEE4NS0yQzJDMkEzOTBERDh9ID0ge0UyREFCOTFBLTgyNDgtNDYyNS04QTg1LTJDMkMyQTM5MEREOH0KKwkJe0VFRjVCNDlFLURCRDEtNEUxQi04Qjg2LUM1RDY0RkNCQUQzOH0gPSB7RUVGNUI0OUUtREJEMS00RTFCLThCODYtQzVENjRGQ0JBRDM4fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxhbWUiLCAidmM5X2xhbWVfbGFtZS52Y3Byb2oiLCAie0VFRjVCNDlFLURCRDEtNEUxQi04Qjg2LUM1RDY0RkNCQUQzOH0iCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorCQl7MjA1MzYxMDEtM0IwRS00M0VGLTk0RjktMDgwRDU5NURBQzU3fSA9IHsyMDUzNjEwMS0zQjBFLTQzRUYtOTRGOS0wODBENTk1REFDNTd9CisJCXtFMkRBQjkxQS04MjQ4LTQ2MjUtOEE4NS0yQzJDMkEzOTBERDh9ID0ge0UyREFCOTFBLTgyNDgtNDYyNS04QTg1LTJDMkMyQTM5MEREOH0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJtcDNsYW1lIiwgInZjOV9saWJtcDNsYW1lLnZjcHJvaiIsICJ7MjA1MzYxMDEtM0IwRS00M0VGLTk0RjktMDgwRDU5NURBQzU3fSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtFMkRBQjkxQS04MjQ4LTQ2MjUtOEE4NS0yQzJDMkEzOTBERDh9ID0ge0UyREFCOTFBLTgyNDgtNDYyNS04QTg1LTJDMkMyQTM5MEREOH0KKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJtcDNsYW1lRExMIiwgInZjOV9saWJtcDNsYW1lX2RsbC52Y3Byb2oiLCAiezkyQkQ1MEFBLTA0RDYtNEZCRi1BQ0UxLTQ2OEZBRjY3NzhGMn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm1wZ2xpYiIsICJ2YzlfbXBnbGliLnZjcHJvaiIsICJ7RTJEQUI5MUEtODI0OC00NjI1LThBODUtMkMyQzJBMzkwREQ4fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzIKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwkJUmVsZWFzZU5BU018V2luMzIgPSBSZWxlYXNlTkFTTXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7RTc0NUVCMUEtMDcwQS00NUVELUI4QkQtRDlGNzk0RTIzQ0ZBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7RTc0NUVCMUEtMDcwQS00NUVELUI4QkQtRDlGNzk0RTIzQ0ZBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0U3NDVFQjFBLTA3MEEtNDVFRC1COEJELUQ5Rjc5NEUyM0NGQX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtFNzQ1RUIxQS0wNzBBLTQ1RUQtQjhCRC1EOUY3OTRFMjNDRkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0U3NDVFQjFBLTA3MEEtNDVFRC1COEJELUQ5Rjc5NEUyM0NGQX0uUmVsZWFzZU5BU018V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7RTc0NUVCMUEtMDcwQS00NUVELUI4QkQtRDlGNzk0RTIzQ0ZBfS5SZWxlYXNlTkFTTXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7RUVGNUI0OUUtREJEMS00RTFCLThCODYtQzVENjRGQ0JBRDM4fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7RUVGNUI0OUUtREJEMS00RTFCLThCODYtQzVENjRGQ0JBRDM4fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0VFRjVCNDlFLURCRDEtNEUxQi04Qjg2LUM1RDY0RkNCQUQzOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtFRUY1QjQ5RS1EQkQxLTRFMUItOEI4Ni1DNUQ2NEZDQkFEMzh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0VFRjVCNDlFLURCRDEtNEUxQi04Qjg2LUM1RDY0RkNCQUQzOH0uUmVsZWFzZU5BU018V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZU5BU018V2luMzIKKwkJe0VFRjVCNDlFLURCRDEtNEUxQi04Qjg2LUM1RDY0RkNCQUQzOH0uUmVsZWFzZU5BU018V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VOQVNNfFdpbjMyCisJCXsyMDUzNjEwMS0zQjBFLTQzRUYtOTRGOS0wODBENTk1REFDNTd9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXsyMDUzNjEwMS0zQjBFLTQzRUYtOTRGOS0wODBENTk1REFDNTd9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7MjA1MzYxMDEtM0IwRS00M0VGLTk0RjktMDgwRDU5NURBQzU3fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezIwNTM2MTAxLTNCMEUtNDNFRi05NEY5LTA4MEQ1OTVEQUM1N30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7MjA1MzYxMDEtM0IwRS00M0VGLTk0RjktMDgwRDU5NURBQzU3fS5SZWxlYXNlTkFTTXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlTkFTTXxXaW4zMgorCQl7MjA1MzYxMDEtM0IwRS00M0VGLTk0RjktMDgwRDU5NURBQzU3fS5SZWxlYXNlTkFTTXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZU5BU018V2luMzIKKwkJezkyQkQ1MEFBLTA0RDYtNEZCRi1BQ0UxLTQ2OEZBRjY3NzhGMn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezkyQkQ1MEFBLTA0RDYtNEZCRi1BQ0UxLTQ2OEZBRjY3NzhGMn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs5MkJENTBBQS0wNEQ2LTRGQkYtQUNFMS00NjhGQUY2Nzc4RjJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7OTJCRDUwQUEtMDRENi00RkJGLUFDRTEtNDY4RkFGNjc3OEYyfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXs5MkJENTBBQS0wNEQ2LTRGQkYtQUNFMS00NjhGQUY2Nzc4RjJ9LlJlbGVhc2VOQVNNfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VOQVNNfFdpbjMyCisJCXs5MkJENTBBQS0wNEQ2LTRGQkYtQUNFMS00NjhGQUY2Nzc4RjJ9LlJlbGVhc2VOQVNNfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlTkFTTXxXaW4zMgorCQl7RTJEQUI5MUEtODI0OC00NjI1LThBODUtMkMyQzJBMzkwREQ4fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7RTJEQUI5MUEtODI0OC00NjI1LThBODUtMkMyQzJBMzkwREQ4fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0UyREFCOTFBLTgyNDgtNDYyNS04QTg1LTJDMkMyQTM5MEREOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtFMkRBQjkxQS04MjQ4LTQ2MjUtOEE4NS0yQzJDMkEzOTBERDh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0UyREFCOTFBLTgyNDgtNDYyNS04QTg1LTJDMkMyQTM5MEREOH0uUmVsZWFzZU5BU018V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZU5BU018V2luMzIKKwkJe0UyREFCOTFBLTgyNDgtNDYyNS04QTg1LTJDMkMyQTM5MEREOH0uUmVsZWFzZU5BU018V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VOQVNNfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdmNfc29sdXRpb24vdmM5X2xhbWVfYWNtLnZjcHJvaiBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2FjbS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0NjA4YgotLS0gL2Rldi9udWxsCisrKyBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2FjbS52Y3Byb2oKQEAgLTAsMCArMSw0MzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LDAwIgorCU5hbWU9IkFDTSIKKwlQcm9qZWN0R1VJRD0ie0ZDM0Q2NUU3LUI3Q0ItNDA2RS1CNkM5LTBCMjZFMzBGRTdGNH0iCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMCIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cLi5cb3V0cHV0XFJlbGVhc2UvbGFtZUFDTS50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vaW5jbHVkZSwuLi9tcGdsaWIsLi4vQUNNLC4uL0FDTS9kZGsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQkxBREVETEw7X1dJTkRPV1M7V0lOMzI7TEFNRV9BQ00iCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlTdHJ1Y3RNZW1iZXJBbGlnbm1lbnQ9IjIiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0iZmFsc2UiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUlnbm9yZUltcG9ydExpYnJhcnk9InRydWUiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ibGlibXAzbGFtZS5saWIgdXJsLmxpYiB3aW5tbS5saWIiCisJCQkJT3V0cHV0RmlsZT0iLi5cb3V0cHV0XFJlbGVhc2VcbGFtZUFDTS5hY20iCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IiIKKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJmYWxzZSIKKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5cQUNNXGxhbWVBQ00uZGVmIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKEludERpcikvJChUYXJnZXROYW1lKS5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkJRGVzY3JpcHRpb249IkFDTSBjb25maWcgZmlsZXMiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cQUNNXGxhbWVhY20uaW5mICQoVGFyZ2V0RGlyKSouKiYjeDBEOyYjeDBBO2NvcHkgLi5cQUNNXGxhbWVfYWNtLnhtbCAkKFRhcmdldERpcikqLiomI3gwRDsmI3gwQTsiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XERlYnVnXGxhbWVBQ00udGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9pbmNsdWRlLC4uL21wZ2xpYiwuLi9BQ00sLi4vQUNNL2RkayIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO19CTEFERURMTDtfV0lORE9XUztXSU4zMjtMQU1FX0FDTSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVN0cnVjdE1lbWJlckFsaWdubWVudD0iMiIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlJZ25vcmVJbXBvcnRMaWJyYXJ5PSJ0cnVlIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImxpYm1wM2xhbWUubGliIHVybC5saWIgd2lubW0ubGliIgorCQkJCU91dHB1dEZpbGU9Ii4uXG91dHB1dFxEZWJ1Z1xsYW1lQUNNLmFjbSIKKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIiCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXEFDTVxsYW1lQUNNLmRlZiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJCUltcG9ydExpYnJhcnk9IiQoSW50RGlyKS8kKFRhcmdldE5hbWUpLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCQlEZXNjcmlwdGlvbj0iQUNNIGNvbmZpZyBmaWxlcyIKKwkJCQlDb21tYW5kTGluZT0iY29weSAuLlxBQ01cbGFtZWFjbS5pbmYgJChUYXJnZXREaXIpKi4qJiN4MEQ7JiN4MEE7Y29weSAuLlxBQ01cbGFtZV9hY20ueG1sICQoVGFyZ2V0RGlyKSouKiYjeDBEOyYjeDBBOyIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSIKKwkJCUZpbHRlcj0iYztjcHAiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cQUNNXEFDTS5jcHAiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cQUNNU3RyZWFtLmNwcCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVxBRW5jb2RlUHJvcGVydGllcy5jcHAiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cRGVjb2RlU3RyZWFtLmNwcCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVxsYW1lQUNNLmRlZiIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cQUNNXG1haW4uY3BwIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJJbmNsdWRlIgorCQkJRmlsdGVyPSJoIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVxBQ00uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cQUNNXEFDTVN0cmVhbS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cYWRlYnVnLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVxBRW5jb2RlUHJvcGVydGllcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cRGVjb2RlU3RyZWFtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUmVzb3VyY2UiCisJCQlGaWx0ZXI9InJjIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVxhY20ucmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cbGFtZS5pY28iCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSW5zdGFsbCIKKwkJCUZpbHRlcj0iaW5mO2FjbSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cTGFtZUFDTS5pbmYiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cQUNNXHJlYWRtZS50eHQiCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cVE9ETyIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS92Y19zb2x1dGlvbi92YzlfbGFtZV9hY21fYWRiZy52Y3Byb2ogYi92Y19zb2x1dGlvbi92YzlfbGFtZV9hY21fYWRiZy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2Yjc1YwotLS0gL2Rldi9udWxsCisrKyBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2FjbV9hZGJnLnZjcHJvagpAQCAtMCwwICsxLDE3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjksMDAiCisJTmFtZT0iQUNNIEFEYmciCisJUHJvamVjdEdVSUQ9InswRDdDQUIxQi1BRTU3LTRCQTEtQkRCRi1ENzM5MUFBQTgxQUF9IgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjAiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlDdWx0dXJlPSIxMDM2IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoSW50RGlyKVwkKFByb2plY3ROYW1lKS5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUN1bHR1cmU9IjEwMzYiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChJbnREaXIpXCQoUHJvamVjdE5hbWUpLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlcyIKKwkJCUZpbHRlcj0iY3BwIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVxBRGJnXEFEYmcuY3BwIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXJzIgorCQkJRmlsdGVyPSJoIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVxBRGJnXEFEYmcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdmNfc29sdXRpb24vdmM5X2xhbWVfYWNtX3Rpbnl4bWwudmNwcm9qIGIvdmNfc29sdXRpb24vdmM5X2xhbWVfYWNtX3Rpbnl4bWwudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzJkZGQKLS0tIC9kZXYvbnVsbAorKysgYi92Y19zb2x1dGlvbi92YzlfbGFtZV9hY21fdGlueXhtbC52Y3Byb2oKQEAgLTAsMCArMSwyNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LDAwIgorCU5hbWU9IkFDTSB0aW55eG1sIgorCVByb2plY3RHVUlEPSJ7MzAyMTkyODktM0I3Ri00RTAyLUJDMzQtQzFEQkQwOENEODQ4fSIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDM2IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoSW50RGlyKVwkKFByb2plY3ROYW1lKS5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlx2YzlfbGFtZV9jb25maWcudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1MiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzNiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIkKEludERpcilcJChQcm9qZWN0TmFtZSkubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cdGlueXhtbFxjaGFuZ2VzLnR4dCIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXEFDTVx0aW55eG1sXHJlYWRtZS50eHQiCisJCQk+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cdGlueXhtbFx0aW55eG1sLmNwcCIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cdGlueXhtbFx0aW55eG1sLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cQUNNXHRpbnl4bWxcdGlueXhtbGVycm9yLmNwcCIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxBQ01cdGlueXhtbFx0aW55eG1scGFyc2VyLmNwcCIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdmNfc29sdXRpb24vdmM5X2xhbWVfY2xpZW50cy5zbG4gYi92Y19zb2x1dGlvbi92YzlfbGFtZV9jbGllbnRzLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYzYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdmNfc29sdXRpb24vdmM5X2xhbWVfY2xpZW50cy5zbG4KQEAgLTAsMCArMSw1NCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMAorIyBWaXN1YWwgQysrIEV4cHJlc3MgMjAwOAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJBRGJnIiwgInZjOV9sYW1lX2FjbV9hZGJnLnZjcHJvaiIsICJ7MEQ3Q0FCMUItQUU1Ny00QkExLUJEQkYtRDczOTFBQUE4MUFBfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGlueXhtbCIsICJ2YzlfbGFtZV9hY21fdGlueXhtbC52Y3Byb2oiLCAiezMwMjE5Mjg5LTNCN0YtNEUwMi1CQzM0LUMxREJEMDhDRDg0OH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxhbWVBQ00iLCAidmM5X2xhbWVfYWNtLnZjcHJvaiIsICJ7RkMzRDY1RTctQjdDQi00MDZFLUI2QzktMEIyNkUzMEZFN0Y0fSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXswRDdDQUIxQi1BRTU3LTRCQTEtQkRCRi1ENzM5MUFBQTgxQUF9ID0gezBEN0NBQjFCLUFFNTctNEJBMS1CREJGLUQ3MzkxQUFBODFBQX0KKwkJezMwMjE5Mjg5LTNCN0YtNEUwMi1CQzM0LUMxREJEMDhDRDg0OH0gPSB7MzAyMTkyODktM0I3Ri00RTAyLUJDMzQtQzFEQkQwOENEODQ4fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIkxBTUUgRFNob3ciLCAidmM5X2xhbWVfZHNob3cudmNwcm9qIiwgIns2RDM0OEE0RS04QjQwLTRGQjAtQkI1Ny1DOTgyRDUxRkZBMDF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJMYW1lTXAzRW5jRGxsIiwgInZjOV9sYW1lX2RsbC52Y3Byb2oiLCAiezBFNDgyMEQzLURCRTMtNDc3QS05MTBCLTdDMDIwRDYwNjZEMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIkV4YW1wbGUiLCAidmM5X2xhbWVfZGxsX2V4YW1wbGUudmNwcm9qIiwgIntEMTY5RjA2RS02NjA3LTRBOUYtQTA3NS0yMzM1NzE3QjlBQjV9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MEQ3Q0FCMUItQUU1Ny00QkExLUJEQkYtRDczOTFBQUE4MUFBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7MEQ3Q0FCMUItQUU1Ny00QkExLUJEQkYtRDczOTFBQUE4MUFBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezBEN0NBQjFCLUFFNTctNEJBMS1CREJGLUQ3MzkxQUFBODFBQX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXswRDdDQUIxQi1BRTU3LTRCQTEtQkRCRi1ENzM5MUFBQTgxQUF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezZEMzQ4QTRFLThCNDAtNEZCMC1CQjU3LUM5ODJENTFGRkEwMX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezZEMzQ4QTRFLThCNDAtNEZCMC1CQjU3LUM5ODJENTFGRkEwMX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs2RDM0OEE0RS04QjQwLTRGQjAtQkI1Ny1DOTgyRDUxRkZBMDF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7NkQzNDhBNEUtOEI0MC00RkIwLUJCNTctQzk4MkQ1MUZGQTAxfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXswRTQ4MjBEMy1EQkUzLTQ3N0EtOTEwQi03QzAyMEQ2MDY2RDF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXswRTQ4MjBEMy1EQkUzLTQ3N0EtOTEwQi03QzAyMEQ2MDY2RDF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7MEU0ODIwRDMtREJFMy00NzdBLTkxMEItN0MwMjBENjA2NkQxfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezBFNDgyMEQzLURCRTMtNDc3QS05MTBCLTdDMDIwRDYwNjZEMX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7RkMzRDY1RTctQjdDQi00MDZFLUI2QzktMEIyNkUzMEZFN0Y0fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7RkMzRDY1RTctQjdDQi00MDZFLUI2QzktMEIyNkUzMEZFN0Y0fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0ZDM0Q2NUU3LUI3Q0ItNDA2RS1CNkM5LTBCMjZFMzBGRTdGNH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtGQzNENjVFNy1CN0NCLTQwNkUtQjZDOS0wQjI2RTMwRkU3RjR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezMwMjE5Mjg5LTNCN0YtNEUwMi1CQzM0LUMxREJEMDhDRDg0OH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezMwMjE5Mjg5LTNCN0YtNEUwMi1CQzM0LUMxREJEMDhDRDg0OH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXszMDIxOTI4OS0zQjdGLTRFMDItQkMzNC1DMURCRDA4Q0Q4NDh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MzAyMTkyODktM0I3Ri00RTAyLUJDMzQtQzFEQkQwOENEODQ4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtEMTY5RjA2RS02NjA3LTRBOUYtQTA3NS0yMzM1NzE3QjlBQjV9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtEMTY5RjA2RS02NjA3LTRBOUYtQTA3NS0yMzM1NzE3QjlBQjV9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7RDE2OUYwNkUtNjYwNy00QTlGLUEwNzUtMjMzNTcxN0I5QUI1fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0QxNjlGMDZFLTY2MDctNEE5Ri1BMDc1LTIzMzU3MTdCOUFCNX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIGIvdmNfc29sdXRpb24vdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0OWI5MgotLS0gL2Rldi9udWxsCisrKyBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2NvbmZpZy52c3Byb3BzCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb3BlcnR5U2hlZXQKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9InZjOV9sYW1lX2NvbmZpZyIKKwlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpLi5cb3V0cHV0XCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikuLlxvYmpcJChDb25maWd1cmF0aW9uTmFtZSlcJChQcm9qZWN0TmFtZSkiCisJPgorCTxUb29sCisJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCU91dHB1dEZpbGU9IiQoSW50RGlyKS8kKFByb2plY3ROYW1lKS5ic2MiCisJLz4KKwk8VG9vbAorCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFRCIKKwkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCIKKwkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCVdhcm5pbmdMZXZlbD0iMyIKKwkJRGlzYWJsZVNwZWNpZmljV2FybmluZ3M9IjQ5OTU7NDk5NiIKKwkvPgorCTxUb29sCisJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJTGlua0luY3JlbWVudGFsPSIxIgorCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIkKE91dERpcikiCisJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS8kKFRhcmdldE5hbWUpLnBkYiIKKwkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIgorCS8+Cis8L1Zpc3VhbFN0dWRpb1Byb3BlcnR5U2hlZXQ+CmRpZmYgLS1naXQgYS92Y19zb2x1dGlvbi92YzlfbGFtZV9kbGwudmNwcm9qIGIvdmNfc29sdXRpb24vdmM5X2xhbWVfZGxsLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2NhNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdmNfc29sdXRpb24vdmM5X2xhbWVfZGxsLnZjcHJvagpAQCAtMCwwICsxLDI0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjksMDAiCisJTmFtZT0ibGFtZV9lbmNfZGxsIgorCVByb2plY3RHVUlEPSJ7MEU0ODIwRDMtREJFMy00NzdBLTkxMEItN0MwMjBENjA2NkQxfSIKKwlSb290TmFtZXNwYWNlPSJsYW1lX2VuY19kbGwiCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMCIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlx2YzlfbGFtZV9jb25maWcudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuLlxvdXRwdXRcRGVidWcvTGFtZURsbC50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO0xBTUVNUDNFTkNETExfRVhQT1JUUyIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDM2IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImxpYm1wM2xhbWUubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIgorCQkJCU91dHB1dEZpbGU9Ii4uXG91dHB1dFxEZWJ1Z1xsYW1lX2VuYy5kbGwiCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvbGFtZV9lbmMubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XFJlbGVhc2UvTGFtZURsbC50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vaW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TEFNRU1QM0VOQ0RMTF9FWFBPUlRTIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDM2IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImxpYm1wM2xhbWUubGliIgorCQkJCU91dHB1dEZpbGU9Ii4uXG91dHB1dFxSZWxlYXNlXGxhbWVfZW5jLmRsbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iIgorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS9sYW1lX2VuYy5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRGxsXEJsYWRlTVAzRW5jRExMLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxEbGxcQmxhZGVNUDNFbmNETEwuZGVmIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxEbGxcQmxhZGVNUDNFbmNETEwuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2RsbF9leGFtcGxlLnZjcHJvaiBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2RsbF9leGFtcGxlLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU1YzRhCi0tLSAvZGV2L251bGwKKysrIGIvdmNfc29sdXRpb24vdmM5X2xhbWVfZGxsX2V4YW1wbGUudmNwcm9qCkBAIC0wLDAgKzEsMTg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOSwwMCIKKwlOYW1lPSJsYW1lX2VuY19kbGxfZXhhbXBsZSIKKwlQcm9qZWN0R1VJRD0ie0QxNjlGMDZFLTY2MDctNEE5Ri1BMDc1LTIzMzU3MTdCOUFCNX0iCisJUm9vdE5hbWVzcGFjZT0ibGFtZV9lbmNfZGxsX2V4YW1wbGUiCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMCIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb2JqXFJlbGVhc2VcTGFtZU1wM0VuY0RsbC9FeGFtcGxlLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuLlxvYmpcRGVidWdcTGFtZU1wM0VuY0RsbC9FeGFtcGxlLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cRGxsXEV4YW1wbGUuY3BwIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS92Y19zb2x1dGlvbi92YzlfbGFtZV9kc2hvdy52Y3Byb2ogYi92Y19zb2x1dGlvbi92YzlfbGFtZV9kc2hvdy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4MDQxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2RzaG93LnZjcHJvagpAQCAtMCwwICsxLDQ4NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjksMDAiCisJTmFtZT0iRFNob3ciCisJUHJvamVjdEdVSUQ9Ins2RDM0OEE0RS04QjQwLTRGQjAtQkI1Ny1DOTgyRDUxRkZBMDF9IgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjAiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb2JqXERlYnVnL2RzaG93LnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5caW5jbHVkZSwuLlxEU2hvdyIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iREVCVUc7SU5DX09MRTI7V0lOVkVSPTB4MDQwMDtfWDg2Xz0xO1NUUklDVDtfV0lORE9XUztXSU4zMjtTVERDX0hFQURFUlMiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlJZ25vcmVJbXBvcnRMaWJyYXJ5PSJ0cnVlIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImxpYm1wM2xhbWUubGliIC4uXERTaG93XHN0cm1iYXNELmxpYiB2ZnczMi5saWIgd2lubW0ubGliIHZlcnNpb24ubGliIENvbWRsZzMyLmxpYiBjb21jdGwzMi5saWIgcXVhcnR6LmxpYiBtc3ZjcnRkLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuLlxvdXRwdXRcRGVidWdcbGFtZS5heCIKKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIiCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0idHJ1ZSIKKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5cRFNob3dcTXBlZ2FjLmRlZiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJCUVudHJ5UG9pbnRTeW1ib2w9IkRsbEVudHJ5UG9pbnRAMTIiCisJCQkJQmFzZUFkZHJlc3M9IjB4MWM0MDAwMDAiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCUltcG9ydExpYnJhcnk9IiQoSW50RGlyKS8kKFRhcmdldE5hbWUpLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb2JqXFJlbGVhc2UvZHNob3cudGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9pbmNsdWRlLC4uL0RTaG93IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7SU5DX09MRTI7U1RSSUNUO1dJTlZFUj0weDA0MDA7X1g4Nl89MTtfV0lORE9XUztXSU4zMjtTVERDX0hFQURFUlMiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlDYWxsaW5nQ29udmVudGlvbj0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJSWdub3JlSW1wb3J0TGlicmFyeT0idHJ1ZSIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJsaWJtcDNsYW1lLmxpYiAuLlxEU2hvd1xzdHJtYmFzZS5saWIgdmZ3MzIubGliIHdpbm1tLmxpYiB2ZXJzaW9uLmxpYiBDb21kbGczMi5saWIgY29tY3RsMzIubGliIHF1YXJ0ei5saWIgbXN2Y3J0LmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuLlxvdXRwdXRcUmVsZWFzZVxsYW1lLmF4IgorCQkJCVZlcnNpb249IjAuMyIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iIgorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9InRydWUiCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXERTaG93XE1wZWdhYy5kZWYiCisJCQkJU3ViU3lzdGVtPSIyIgorCQkJCUVudHJ5UG9pbnRTeW1ib2w9IkRsbEVudHJ5UG9pbnRAMTIiCisJCQkJQmFzZUFkZHJlc3M9IjB4MWM0MDAwMDAiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCUltcG9ydExpYnJhcnk9IiQoSW50RGlyKS8kKFRhcmdldE5hbWUpLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcYWJvdXRwcnAuY3BwIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcRW5jb2Rlci5jcHAiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxEU2hvd1xNcGVnYWMuY3BwIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcTXBlZ2FjLmRlZiIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcUHJvcGVydHkucmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxEU2hvd1xQcm9wUGFnZS5jcHAiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxEU2hvd1xQcm9wUGFnZV9hZHYuY3BwIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcUkVHLkNQUCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIgorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXERTaG93XGFib3V0cHJwLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXERTaG93XEVuY29kZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcaWF1ZGlvcHJvcHMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcTXBlZ2FjLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXERTaG93XFByb3BQYWdlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXERTaG93XFByb3BQYWdlX2Fkdi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxEU2hvd1xyZWcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dccmVzb3VyY2UuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcdWlkcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXERTaG93XGVsb2dvLmljbyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxpbmNsdWRlXGxhbWUuaCIKKwkJCT4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCT4KKwkJCQk8VG9vbAorCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkvPgorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXG91dHB1dFxsaWJtcDNsYW1lLWR5bmFtaWMubGliIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcUkVBRE1FIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cRFNob3dcU1RSTUJBU0UubGliIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJPgorCQkJCTxUb29sCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCS8+CisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2xhbWUudmNwcm9qIGIvdmNfc29sdXRpb24vdmM5X2xhbWVfbGFtZS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0ZTYxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX2xhbWUudmNwcm9qCkBAIC0wLDAgKzEsNTA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOSwwMCIKKwlOYW1lPSJsYW1lIgorCVByb2plY3RHVUlEPSJ7RUVGNUI0OUUtREJEMS00RTFCLThCODYtQzVENjRGQ0JBRDM4fSIKKwlSb290TmFtZXNwYWNlPSJsYW1lIgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjAiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuLlxvdXRwdXRcUmVsZWFzZU5BU00vbGFtZS50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLC4uL21wZ2xpYiwuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4vIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTjMyO19DT05TT0xFO19XSU5ET1dTO0hBVkVfTVBHTElCO0hBVkVfQ09ORklHX0g7SEFWRV9OQVNNO01NWF9jaG9vc2VfdGFibGUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQVBQPSQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XERlYnVnL2xhbWUudGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8sLi4vbXBnbGliLC4uL2xpYm1wM2xhbWUsLi4vaW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19XSU4zMjtfQ09OU09MRTtfV0lORE9XUztIQVZFX01QR0xJQjtIQVZFX0NPTkZJR19IIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfQVBQPSQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XFJlbGVhc2UvbGFtZS50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLC4uL21wZ2xpYiwuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4vIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTjMyO19DT05TT0xFO19XSU5ET1dTO0hBVkVfTVBHTElCO0hBVkVfQ09ORklHX0giCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfQVBQPSQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLi5cb3V0cHV0XFJlbGVhc2UvbGFtZS5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZyb250ZW5kXGJyaGlzdC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZyb250ZW5kXGNvbnNvbGUuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxnZXRfYXVkaW8uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxsYW1ldGltZS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZyb250ZW5kXG1haW4uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxwYXJzZS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZyb250ZW5kXHBvcnRhYmxlaW8uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFx0aW1lc3RhdHVzLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcYnJoaXN0LmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZyb250ZW5kXGNvbnNvbGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcZ2V0X2F1ZGlvLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZyb250ZW5kXGxhbWV0aW1lLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZyb250ZW5kXG1haW4uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRccGFyc2UuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRccG9ydGFibGVpby5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFx0aW1lc3RhdHVzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxsYW1lLnJjIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS92Y19zb2x1dGlvbi92YzlfbGFtZV9tcDN4LnZjcHJvaiBiL3ZjX3NvbHV0aW9uL3ZjOV9sYW1lX21wM3gudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjhmNzcKLS0tIC9kZXYvbnVsbAorKysgYi92Y19zb2x1dGlvbi92YzlfbGFtZV9tcDN4LnZjcHJvagpAQCAtMCwwICsxLDQyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjksMDAiCisJTmFtZT0iTVAzeCIKKwlQcm9qZWN0R1VJRD0ie0U3NDVFQjFBLTA3MEEtNDVFRC1COEJELUQ5Rjc5NEUyM0NGQX0iCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMCIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XFJlbGVhc2UvbXAzeC50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4vV2luR1RLL2d0ay1wbHVzLC4vV2luR1RLL2dsaWItMS4yLC4vV2luR3RrL3NyYy9ndGsrLC4vV2luR3RrL3NyYy9nbGliLC4vV2luR3RrL3NyYy9ndGsrL2dkaywuLi9pbmNsdWRlLC4uL2xpYm1wM2xhbWUsLi4vbXAzeCwuLi9mcm9udGVuZCwuLiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO0xBTUVQQVJTRTtXSU4zMjtfQ09OU09MRTtIQVZFX01QR0xJQjtMQU1FU05ERklMRTtCUkhJU1Q7SEFWRV9DT05GSUdfSCIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZ2xpYi0yLjAubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGdkay5saWIgZ3RrLmxpYiIKKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuL1dpbkd0ay9zcmMvZ3RrKy9ndGssLi9XaW5HdGsvc3JjL2d0aysvZ2RrLC4vV2luR3RrL3NyYy9nbGliIgorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSIKKwkJCQlNYXBGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VcZnJvbnRlbmQvbXAzeC5tYXAiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XERlYnVnL21wM3gudGxiIgorCQkJCUhlYWRlckZpbGVOYW1lPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuL1dpbkd0ay9zcmMvZ3RrKywuL1dpbkd0ay9zcmMvZ2xpYiwuL1dpbkd0ay9zcmMvZ3RrKy9nZGssLi4vaW5jbHVkZSwuLi9saWJtcDNsYW1lLC4uL21wM3gsLi4vZnJvbnRlbmQsLi4iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkxBTUVTTkRGSUxFO0JSSElTVDtfREVCVUc7V0lOMzI7X0NPTlNPTEU7SEFWRV9NUEdMSUI7SEFWRV9DT05GSUdfSCIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJnbGliLTIuMC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgZ2RrLmxpYiBndGsubGliIgorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4vV2luR3RrL3NyYy9ndGsrL2d0aywuL1dpbkd0ay9zcmMvZ3RrKy9nZGssLi9XaW5HdGsvc3JjL2dsaWIiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSIKKwkJCUZpbHRlcj0iYyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxicmhpc3QuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxjb25zb2xlLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcZ2V0X2F1ZGlvLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcZ3BrcGxvdHRpbmcuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxndGthbmFsLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcbGFtZXRpbWUuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxtcDN4LmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRccGFyc2UuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxwb3J0YWJsZWlvLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcdGltZXN0YXR1cy5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSW5jbHVkZSIKKwkJCUZpbHRlcj0iaCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxicmhpc3QuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcLi5cY29uZmlnTVMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcY29uc29sZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFxnZXRfYXVkaW8uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcZ3BrcGxvdHRpbmcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcbGFtZXRpbWUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRccGFyc2UuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRccG9ydGFibGVpby5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmcm9udGVuZFx0aW1lc3RhdHVzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cZnJvbnRlbmRcLi5cUkVBRE1FLldJTkdUSyIKKwkJCT4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdmNfc29sdXRpb24vdmM5X2xpYm1wM2xhbWUudmNwcm9qIGIvdmNfc29sdXRpb24vdmM5X2xpYm1wM2xhbWUudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2Y3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi92Y19zb2x1dGlvbi92YzlfbGlibXAzbGFtZS52Y3Byb2oKQEAgLTAsMCArMSwxMTQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOSwwMCIKKwlOYW1lPSJsaWJtcDNsYW1lIgorCVByb2plY3RHVUlEPSJ7MjA1MzYxMDEtM0IwRS00M0VGLTk0RjktMDgwRDU5NURBQzU3fSIKKwlSb290TmFtZXNwYWNlPSJsaWJtcDNsYW1lIgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjAiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwkJPFRvb2xGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii5cdmM5X25hc20ucnVsZXMiCisJCS8+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9Ik5BU00iCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL21wZ2xpYiwuLi9pbmNsdWRlLC4uIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X1dJTkRPV1M7SEFWRV9NUEdMSUI7V0lOMzI7SEFWRV9DT05GSUdfSDtIQVZFX05BU007TU1YX2Nob29zZV90YWJsZTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbGlibXAzbGFtZS1zdGF0aWMubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlx2YzlfbGFtZV9jb25maWcudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJOQVNNIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMyIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9InRydWUiCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9tcGdsaWIsLi4vaW5jbHVkZSwuLiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19XSU5ET1dTO0hBVkVfTVBHTElCO1dJTjMyO0hBVkVfQ09ORklHX0giCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbGlibXAzbGFtZS1zdGF0aWMubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iTkFTTSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbXBnbGliLC4uL2luY2x1ZGUsLi4iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lORE9XUztIQVZFX01QR0xJQjtXSU4zMjtIQVZFX0NPTkZJR19IIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcJChUYXJnZXROYW1lKS5wZGIiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9saWJtcDNsYW1lLXN0YXRpYy5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSIKKwkJCUZpbHRlcj0iYyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGJpdHN0cmVhbS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcZW5jb2Rlci5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcZmZ0LmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxnYWluX2FuYWx5c2lzLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpZDN0YWcuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGxhbWUuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXG1wZ2xpYl9pbnRlcmZhY2UuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXG5ld21kY3QuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHByZXNldHMuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHBzeW1vZGVsLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxxdWFudGl6ZS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVccXVhbnRpemVfcHZ0LmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxyZXNlcnZvaXIuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHNldF9nZXQuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHRhYmxlcy5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlXYXJuaW5nTGV2ZWw9IjEiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVdhcm5pbmdMZXZlbD0iMSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVdhcm5pbmdMZXZlbD0iMSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcdGFrZWhpcm8uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHV0aWwuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHZicnF1YW50aXplLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxWYnJUYWcuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHZlcnNpb24uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC5cdmVjdG9yXHhtbV9xdWFudGl6ZV9zdWIuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2xpYm1wM2xhbWUiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkluY2x1ZGUiCisJCQlGaWx0ZXI9ImgiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxiaXRzdHJlYW0uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxjb25maWdNUy5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkJRGVzY3JpcHRpb249IlBlcmZvcm1pbmcgQ3VzdG9tIEJ1aWxkIFN0ZXAgb24gJChJbnB1dE5hbWUpIgorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyIKKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkJRGVzY3JpcHRpb249IlBlcmZvcm1pbmcgQ3VzdG9tIEJ1aWxkIFN0ZXAgb24gJChJbnB1dE5hbWUpIgorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyIKKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJCURlc2NyaXB0aW9uPSJQZXJmb3JtaW5nIEN1c3RvbSBCdWlsZCBTdGVwIG9uICQoSW5wdXROYW1lKSIKKwkJCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgmI3gwRDsmI3gwQTsiCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcZW5jb2Rlci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGZmdC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGdhaW5fYW5hbHlzaXMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpZDN0YWcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxsM3NpZGUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxsYW1lLWFuYWx5c2lzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcbGFtZV9nbG9iYWxfZmxhZ3MuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuXHZlY3RvclxsYW1lX2ludHJpbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGxhbWVlcnJvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXG1hY2hpbmUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxuZXdtZGN0LmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVccHN5bW9kZWwuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxxdWFudGl6ZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHF1YW50aXplX3B2dC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHJlc2Vydm9pci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHNldF9nZXQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx0YWJsZXMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx1dGlsLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcdmJycXVhbnRpemUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxWYnJUYWcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx2ZXJzaW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iQXNtIgorCQkJRmlsdGVyPSIubmFzIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcaTM4NlxjaG9vc2VfdGFibGUubmFzIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpMzg2XGNwdV9mZWF0Lm5hcyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcaTM4NlxmZnQubmFzIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcaTM4NlxmZnQzZG4ubmFzIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpMzg2XGZmdGZwdS5uYXMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpMzg2XGZmdHNzZS5uYXMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGkzODZcZmZ0dGJsLm5hcyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGkzODZcc2NhbGFyLm5hcyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluY2x1ZGVcbGFtZS5oIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS92Y19zb2x1dGlvbi92YzlfbGlibXAzbGFtZV9kbGwudmNwcm9qIGIvdmNfc29sdXRpb24vdmM5X2xpYm1wM2xhbWVfZGxsLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQxZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdmNfc29sdXRpb24vdmM5X2xpYm1wM2xhbWVfZGxsLnZjcHJvagpAQCAtMCwwICsxLDE4MDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LDAwIgorCU5hbWU9ImxpYm1wM2xhbWVETEwiCisJUHJvamVjdEdVSUQ9Ins5MkJENTBBQS0wNEQ2LTRGQkYtQUNFMS00NjhGQUY2Nzc4RjJ9IgorCVJvb3ROYW1lc3BhY2U9ImxpYm1wM2xhbWVETEwiCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMCIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCQk8VG9vbEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLlx2YzlfbmFzbS5ydWxlcyIKKwkJLz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlx2YzlfbGFtZV9jb25maWcudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJOQVNNIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuLlxvdXRwdXRcUmVsZWFzZS9saWJtcDNsYW1lX2RsbC50bGIiCisJCQkJSGVhZGVyRmlsZU5hbWU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2xpYm1wM2xhbWUsLi4vLC4uL21wZ2xpYiwuLi9pbmNsdWRlLC4uIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7X1dJTkRPV1M7SEFWRV9NUEdMSUI7V0lOMzI7SEFWRV9DT05GSUdfSCIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZDODBfVVBHUkFERT0weDA2MDA7X0RMTD0kKFRhcmdldEZpbGVOYW1lKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9saWJtcDNsYW1lLmRsbCIKKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5caW5jbHVkZVxsYW1lLmRlZiIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvbGlibXAzbGFtZS5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iTkFTTSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XFJlbGVhc2VOQVNNL2xpYm1wM2xhbWVfZGxsLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjMiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJ0cnVlIgorCQkJCUZhdm9yU2l6ZU9yU3BlZWQ9IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSwuLi8sLi4vbXBnbGliLC4uL2luY2x1ZGUsLi4iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztfV0lORE9XUztIQVZFX01QR0xJQjtIQVZFX0NPTkZJR19IO0hBVkVfTkFTTTtNTVhfY2hvb3NlX3RhYmxlO1dJTjMyO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1ZDODBfVVBHUkFERT0weDA2MDA7X0RMTD0kKFRhcmdldEZpbGVOYW1lKSIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9saWJtcDNsYW1lLmRsbCIKKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLi5caW5jbHVkZVxsYW1lLmRlZiIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvbGlibXAzbGFtZS5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iTkFTTSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLi5cb3V0cHV0XERlYnVnL2xpYm1wM2xhbWVfZGxsLnRsYiIKKwkJCQlIZWFkZXJGaWxlTmFtZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSwuLi8sLi4vbXBnbGliLC4uL2luY2x1ZGUsLi4iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lORE9XUztIQVZFX01QR0xJQjtXSU4zMjtIQVZFX0NPTkZJR19IIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9WQzgwX1VQR1JBREU9MHgwNjAwO19ETEw9JChUYXJnZXRGaWxlTmFtZSk7X0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2xpYm1wM2xhbWUuZGxsIgorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuLlxpbmNsdWRlXGxhbWUuZGVmIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvbGlibXAzbGFtZS5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJlbmNvZGVyIHNvdXJjZXMiCisJCQlGaWx0ZXI9IiouYyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGJpdHN0cmVhbS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCU9iamVjdEZpbGU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGVuY29kZXIuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxmZnQuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxnYWluX2FuYWx5c2lzLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcaWQzdGFnLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcbGFtZS5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCU9iamVjdEZpbGU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXG1wZ2xpYl9pbnRlcmZhY2UuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxuZXdtZGN0LmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVccHJlc2V0cy5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCU9iamVjdEZpbGU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHBzeW1vZGVsLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVccXVhbnRpemUuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxxdWFudGl6ZV9wdnQuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxyZXNlcnZvaXIuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxzZXRfZ2V0LmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcdGFibGVzLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcdGFrZWhpcm8uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx1dGlsLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcdmJycXVhbnRpemUuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxWYnJUYWcuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx2ZXJzaW9uLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcLlx2ZWN0b3JceG1tX3F1YW50aXplX3N1Yi5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uL2xpYm1wM2xhbWUiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iZW5jb2RlciBoZWFkZXIiCisJCQlGaWx0ZXI9Ii5oIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcYml0c3RyZWFtLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxlbmNvZGVyLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxmZnQuaCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGdhaW5fYW5hbHlzaXMuaCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGlkM3RhZy5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcbDNzaWRlLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxsYW1lLWFuYWx5c2lzLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxsYW1lX2dsb2JhbF9mbGFncy5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcLlx2ZWN0b3JcbGFtZV9pbnRyaW4uaCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGxhbWVlcnJvci5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcbWFjaGluZS5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcbmV3bWRjdC5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVccHN5bW9kZWwuaCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHF1YW50aXplLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxxdWFudGl6ZV9wdnQuaCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXHJlc2Vydm9pci5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcc2V0X2dldC5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcdGFibGVzLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx1dGlsLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx2YnJxdWFudGl6ZS5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcVmJyVGFnLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVx2ZXJzaW9uLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJBc20iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpMzg2XGNob29zZV90YWJsZS5uYXMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGkzODZcY3B1X2ZlYXQubmFzIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpMzg2XGZmdC5uYXMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxpMzg2XGZmdDNkbi5uYXMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGkzODZcZmZ0ZnB1Lm5hcyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXGkzODZcZmZ0c3NlLm5hcyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcaTM4NlxmZnR0YmwubmFzIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcaTM4NlxzY2FsYXIubmFzIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9Ik5BU00iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJOQVNNIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iTkFTTSIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iZGVjb2RlciBzb3VyY2VzIgorCQkJRmlsdGVyPSIuYyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC4uXG1wZ2xpYlxjb21tb24uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcZGN0NjRfaTM4Ni5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCU9iamVjdEZpbGU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC4uXG1wZ2xpYlxkZWNvZGVfaTM4Ni5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCU9iamVjdEZpbGU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC4uXG1wZ2xpYlxpbnRlcmZhY2UuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcbGF5ZXIxLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJT2JqZWN0RmlsZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGxpYm1wM2xhbWVcLi5cbXBnbGliXGxheWVyMi5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCU9iamVjdEZpbGU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC4uXG1wZ2xpYlxsYXllcjMuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlPYmplY3RGaWxlPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLi5cb2JqXFJlbGVhc2VOQVNNXGxpYm1wM2xhbWVETEwvIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcdGFiaW5pdC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCU9iamVjdEZpbGU9Ii4uXG9ialxSZWxlYXNlTkFTTVxsaWJtcDNsYW1lRExMLyIKKwkJCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuLlxvYmpcUmVsZWFzZU5BU01cbGlibXAzbGFtZURMTC8iCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9ImRlY29kZXIgaGVhZGVyIgorCQkJRmlsdGVyPSIuaCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC4uXG1wZ2xpYlxjb21tb24uaCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC4uXG1wZ2xpYlxkY3Q2NF9pMzg2LmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcZGVjb2RlX2kzODYuaCIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxsaWJtcDNsYW1lXC4uXG1wZ2xpYlxodWZmbWFuLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcaW50ZXJmYWNlLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcbGF5ZXIxLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcbGF5ZXIyLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcbGF5ZXIzLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcbXBnMTIzLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcbXBnbGliLmgiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxtcGdsaWJcdGFiaW5pdC5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxjb25maWdNUy5oIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJQZXJmb3JtaW5nIEN1c3RvbSBCdWlsZCBTdGVwIG9uICQoSW5wdXROYW1lKSIKKwkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iLi5cY29uZmlnLmgiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCURlc2NyaXB0aW9uPSJQZXJmb3JtaW5nIEN1c3RvbSBCdWlsZCBTdGVwIG9uICQoSW5wdXROYW1lKSIKKwkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyIKKwkJCQkJT3V0cHV0cz0iLi5cY29uZmlnLmgiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVwuLlxpbmNsdWRlXGxhbWUuZGVmIgorCQkJPgorCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQk+CisJCQkJPFRvb2wKKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJLz4KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5caW5jbHVkZVxsYW1lLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cbGlibXAzbGFtZVxsYW1lLnJjIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS92Y19zb2x1dGlvbi92YzlfbXBnbGliLnZjcHJvaiBiL3ZjX3NvbHV0aW9uL3ZjOV9tcGdsaWIudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzhkNmEKLS0tIC9kZXYvbnVsbAorKysgYi92Y19zb2x1dGlvbi92YzlfbXBnbGliLnZjcHJvagpAQCAtMCwwICsxLDUyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjksMDAiCisJTmFtZT0ibXBnbGliIgorCVByb2plY3RHVUlEPSJ7RTJEQUI5MUEtODI0OC00NjI1LThBODUtMkMyQzJBMzkwREQ4fSIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIwIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXHZjOV9sYW1lX2NvbmZpZy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjMiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJ0cnVlIgorCQkJCUZhdm9yU2l6ZU9yU3BlZWQ9IjEiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vbGlibXAzbGFtZSwuLi9pbmNsdWRlLC4uIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7SEFWRV9NUEdMSUI7X1dJTkRPV1M7VVNFX0xBWUVSXzI7V0lOMzI7SEFWRV9DT05GSUdfSCIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9tcGdsaWItc3RhdGljLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMyIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9InRydWUiCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztIQVZFX01QR0xJQjtfV0lORE9XUztVU0VfTEFZRVJfMjtXSU4zMjtIQVZFX0NPTkZJR19IIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21wZ2xpYi1zdGF0aWMubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cdmM5X2xhbWVfY29uZmlnLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi9saWJtcDNsYW1lLC4uL2luY2x1ZGUsLi4iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztfV0lORE9XUztVU0VfTEFZRVJfMjtIQVZFX01QR0xJQjtXSU4zMjtIQVZFX0NPTkZJR19IIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcJChUYXJnZXROYW1lKS5wZGIiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9tcGdsaWItc3RhdGljLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIgorCQkJRmlsdGVyPSJjIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxjb21tb24uYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcZGN0NjRfaTM4Ni5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxkZWNvZGVfaTM4Ni5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxpbnRlcmZhY2UuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcbGF5ZXIxLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlTkFTTXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbXBnbGliXGxheWVyMi5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxsYXllcjMuYyIKKwkJCQk+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2VOQVNNfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcdGFiaW5pdC5jIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSW5jbHVkZSIKKwkJCUZpbHRlcj0iaCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcY29tbW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlwuLlxjb25maWdNUy5oIgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZU5BU018V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkJRGVzY3JpcHRpb249IlBlcmZvcm1pbmcgQ3VzdG9tIEJ1aWxkIFN0ZXAgb24gJChJbnB1dE5hbWUpIgorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyIKKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkJRGVzY3JpcHRpb249IlBlcmZvcm1pbmcgQ3VzdG9tIEJ1aWxkIFN0ZXAgb24gJChJbnB1dE5hbWUpIgorCQkJCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cY29uZmlnTVMuaCAuLlxjb25maWcuaCYjeDBEOyYjeDBBOyIKKwkJCQkJCU91dHB1dHM9Ii4uXGNvbmZpZy5oIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJCURlc2NyaXB0aW9uPSJQZXJmb3JtaW5nIEN1c3RvbSBCdWlsZCBTdGVwIG9uICQoSW5wdXROYW1lKSIKKwkJCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXGNvbmZpZ01TLmggLi5cY29uZmlnLmgmI3gwRDsmI3gwQTsiCisJCQkJCQlPdXRwdXRzPSIuLlxjb25maWcuaCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxkY3Q2NF9pMzg2LmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxkZWNvZGVfaTM4Ni5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcaHVmZm1hbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcaW50ZXJmYWNlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxsMnRhYmxlcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcbGF5ZXIxLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxsYXllcjIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbXBnbGliXGxheWVyMy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxtcGdsaWJcbXBnMTIzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXG1wZ2xpYlxtcGdsaWIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cbXBnbGliXHRhYmluaXQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdmNfc29sdXRpb24vdmM5X25hc20ucnVsZXMgYi92Y19zb2x1dGlvbi92YzlfbmFzbS5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdmNjRlCi0tLSAvZGV2L251bGwKKysrIGIvdmNfc29sdXRpb24vdmM5X25hc20ucnVsZXMKQEAgLTAsMCArMSw0NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxWaXN1YWxTdHVkaW9Ub29sRmlsZQorCU5hbWU9Ik5BU00gIgorCVZlcnNpb249IjgsMDAiCisJPgorCTxSdWxlcz4KKwkJPEN1c3RvbUJ1aWxkUnVsZQorCQkJTmFtZT0iTkFTTSIKKwkJCURpc3BsYXlOYW1lPSJOQVNNIgorCQkJQ29tbWFuZExpbmU9Im5hc213IFtCaW5Gb3JtYXRdIFtJbmNsdWRlRGlyXSBbRGVmaW5lc10gLW8gW091dEZpbGVdICQoSW5wdXRQYXRoKSIKKwkJCU91dHB1dHM9IltPdXRGaWxlXSIKKwkJCUZpbGVFeHRlbnNpb25zPSIqLm5hcyIKKwkJCUV4ZWN1dGlvbkRlc2NyaXB0aW9uPSJBc3NlbWJsaW5nICQoSW5wdXROYW1lKS4uLiIKKwkJCVNob3dPbmx5UnVsZVByb3BlcnRpZXM9ImZhbHNlIgorCQkJPgorCQkJPFByb3BlcnRpZXM+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9Ik91dEZpbGUiCisJCQkJCURpc3BsYXlOYW1lPSJvdXRwdXQgZmlsZSBwYXRoIgorCQkJCQlTd2l0Y2g9Ilt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiCisJCQkJLz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iQmluRm9ybWF0IgorCQkJCQlEaXNwbGF5TmFtZT0iQmluYXJ5IGZvcm1hdCIKKwkJCQkJU3dpdGNoPSItZiBbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9IndpbjMyIgorCQkJCS8+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9IkluY2x1ZGVEaXIiCisJCQkJCURpc3BsYXlOYW1lPSJBZGRpdGlvbmFsIGluY2x1ZGUgZGlyZWN0b3JpZXMiCisJCQkJCVN3aXRjaD0iLWkgW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSIkKElucHV0RGlyKSIKKwkJCQkJRGVsaW1pdGVkPSJ0cnVlIgorCQkJCS8+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9IkRlZmluZXMiCisJCQkJCURpc3BsYXlOYW1lPSJEZWZpbmVzIgorCQkJCQlTd2l0Y2g9Ii1EW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSJXSU4zMiIKKwkJCQkJRGVsaW1pdGVkPSJ0cnVlIgorCQkJCQlEZWxpbWl0ZXJzPSIgOywiCisJCQkJLz4KKwkJCTwvUHJvcGVydGllcz4KKwkJPC9DdXN0b21CdWlsZFJ1bGU+CisJPC9SdWxlcz4KKzwvVmlzdWFsU3R1ZGlvVG9vbEZpbGU+Cg==